From mboxrd@z Thu Jan 1 00:00:00 1970 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: base64 Subject: [v4,06/13] usb: typec: tcpm: support get typec and pd config from device properties From: Jun Li Message-Id: <1522253178-32414-7-git-send-email-jun.li@nxp.com> Date: Thu, 29 Mar 2018 00:06:11 +0800 To: robh+dt@kernel.org, gregkh@linuxfoundation.org, heikki.krogerus@linux.intel.com, linux@roeck-us.net Cc: a.hajda@samsung.com, shufan_lee@richtek.com, peter.chen@nxp.com, devicetree@vger.kernel.org, linux-usb@vger.kernel.org, linux-imx@nxp.com, jun.li@nxp.com, devel@driverdev.osuosl.org List-ID: VGhpcyBwYXRjaCBhZGRzIHN1cHBvcnQgb2YgZ2V0IHR5cGVjIGFuZCBwb3dlciBkZWxpdmVyeSBj b25maWcgZnJvbQpmaXJtd2FyZSBkZXNjcmlwdGlvbi4KClNpZ25lZC1vZmYtYnk6IExpIEp1biA8 anVuLmxpQG54cC5jb20+Ci0tLQogZHJpdmVycy91c2IvdHlwZWMvdGNwbS5jIHwgMTQwICsrKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrLS0tLS0tLS0tCiAxIGZpbGUgY2hhbmdl ZCwgMTE1IGluc2VydGlvbnMoKyksIDI1IGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhL2RyaXZl cnMvdXNiL3R5cGVjL3RjcG0uYyBiL2RyaXZlcnMvdXNiL3R5cGVjL3RjcG0uYwppbmRleCBiZTli MDA5Li4xNzQ0MDQxYiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvdHlwZWMvdGNwbS5jCisrKyBi L2RyaXZlcnMvdXNiL3R5cGVjL3RjcG0uYwpAQCAtMTMsNiArMTMsNyBAQAogI2luY2x1ZGUgPGxp bnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgv cHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb3BlcnR5Lmg+CiAjaW5jbHVkZSA8bGludXgv c2NoZWQvY2xvY2suaD4KICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgogI2luY2x1ZGUgPGxp bnV4L3NsYWIuaD4KQEAgLTM1NjksNiArMzU3MCw4MiBAQCBzdGF0aWMgaW50IHRjcG1fY29weV92 ZG9zKHUzMiAqZGVzdF92ZG8sIGNvbnN0IHUzMiAqc3JjX3ZkbywKIAlyZXR1cm4gbnJfdmRvOwog fQogCitzdGF0aWMgaW50IHRjcG1fZndfZ2V0X2NhcHMoc3RydWN0IHRjcG1fcG9ydCAqcG9ydCwK KwkJCSAgICBzdHJ1Y3QgZndub2RlX2hhbmRsZSAqZndub2RlKQoreworCWNvbnN0IGNoYXIgKmNh cF9zdHI7CisJaW50IHJldDsKKwl1MzIgbXc7CisKKwlpZiAoIXBvcnQgfHwgIWZ3bm9kZSkKKwkJ cmV0dXJuIC1FSU5WQUw7CisKKwkvKiBVU0IgZGF0YSBzdXBwb3J0IGlzIG9wdGlvbmFsICovCisJ cmV0ID0gZndub2RlX3Byb3BlcnR5X3JlYWRfc3RyaW5nKGZ3bm9kZSwgImRhdGEtdHlwZSIsICZj YXBfc3RyKTsKKwlpZiAocmV0ID09IDApIHsKKwkJcG9ydC0+dHlwZWNfY2Fwcy5kYXRhID0gdHlw ZWNfZmluZF9kYXRhX3R5cGUoY2FwX3N0cik7CisJCWlmIChwb3J0LT50eXBlY19jYXBzLmRhdGEg PCAwKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0ID0gZndub2RlX3Byb3BlcnR5X3Jl YWRfc3RyaW5nKGZ3bm9kZSwgInBvd2VyLXR5cGUiLCAmY2FwX3N0cik7CisJaWYgKHJldCA8IDAp CisJCXJldHVybiByZXQ7CisKKwlwb3J0LT50eXBlY19jYXBzLnR5cGUgPSB0eXBlY19maW5kX3Bv d2VyX3R5cGUoY2FwX3N0cik7CisJaWYgKHBvcnQtPnR5cGVjX2NhcHMudHlwZSA8IDApCisJCXJl dHVybiAtRUlOVkFMOworCXBvcnQtPnBvcnRfdHlwZSA9IHBvcnQtPnR5cGVjX2NhcHMudHlwZTsK KworCWlmIChwb3J0LT5wb3J0X3R5cGUgPT0gVFlQRUNfUE9SVF9TTkspCisJCWdvdG8gc2luazsK KworCS8qIEdldCBzb3J1Y2UgcGRvcyAqLworCXJldCA9IGZ3bm9kZV9wcm9wZXJ0eV9yZWFkX3Uz Ml9hcnJheShmd25vZGUsICJzb3VyY2UtcGRvcyIsCisJCQkJCSAgICAgTlVMTCwgMCk7CisJaWYg KHJldCA8PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXBvcnQtPm5yX3NyY19wZG8gPSBtaW4o cmV0LCBQRE9fTUFYX09CSkVDVFMpOworCXJldCA9IGZ3bm9kZV9wcm9wZXJ0eV9yZWFkX3UzMl9h cnJheShmd25vZGUsICJzb3VyY2UtcGRvcyIsCisJCQkJCSAgICAgcG9ydC0+c3JjX3BkbywgcG9y dC0+bnJfc3JjX3Bkbyk7CisJaWYgKChyZXQgPCAwKSB8fCB0Y3BtX3ZhbGlkYXRlX2NhcHMocG9y dCwgcG9ydC0+c3JjX3BkbywKKwkJCQkJICAgIHBvcnQtPm5yX3NyY19wZG8pKQorCQlyZXR1cm4g LUVJTlZBTDsKKworCWlmIChwb3J0LT5wb3J0X3R5cGUgPT0gVFlQRUNfUE9SVF9TUkMpCisJCXJl dHVybiAwOworCisJLyogR2V0IHRoZSBwcmVmZXJyZWQgcG93ZXIgcm9sZSBmb3IgRFJQICovCisJ cmV0ID0gZndub2RlX3Byb3BlcnR5X3JlYWRfc3RyaW5nKGZ3bm9kZSwgInRyeS1wb3dlci1yb2xl IiwgJmNhcF9zdHIpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcG9ydC0+dHlw ZWNfY2Fwcy5wcmVmZXJfcm9sZSA9IHR5cGVjX2ZpbmRfcHJlZmVycmVkX3JvbGUoY2FwX3N0cik7 CisJaWYgKHBvcnQtPnR5cGVjX2NhcHMucHJlZmVyX3JvbGUgPCAwKQorCQlyZXR1cm4gLUVJTlZB TDsKK3Npbms6CisJLyogR2V0IHNpbmsgcGRvcyAqLworCXJldCA9IGZ3bm9kZV9wcm9wZXJ0eV9y ZWFkX3UzMl9hcnJheShmd25vZGUsICJzaW5rLXBkb3MiLAorCQkJCQkgICAgIE5VTEwsIDApOwor CWlmIChyZXQgPD0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlwb3J0LT5ucl9zbmtfcGRvID0g bWluKHJldCwgUERPX01BWF9PQkpFQ1RTKTsKKwlyZXQgPSBmd25vZGVfcHJvcGVydHlfcmVhZF91 MzJfYXJyYXkoZndub2RlLCAic2luay1wZG9zIiwKKwkJCQkJICAgICBwb3J0LT5zbmtfcGRvLCBw b3J0LT5ucl9zbmtfcGRvKTsKKwlpZiAoKHJldCA8IDApIHx8IHRjcG1fdmFsaWRhdGVfY2Fwcyhw b3J0LCBwb3J0LT5zbmtfcGRvLAorCQkJCQkgICAgcG9ydC0+bnJfc25rX3BkbykpCisJCXJldHVy biAtRUlOVkFMOworCisJaWYgKGZ3bm9kZV9wcm9wZXJ0eV9yZWFkX3UzMihmd25vZGUsICJvcC1z aW5rLW1pY3Jvd2F0dC1ob3VycyIsCisJCQkJICAgICAmbXcpIDwgMCkKKwkJcmV0dXJuIC1FSU5W QUw7CisJcG9ydC0+b3BlcmF0aW5nX3Nua19tdyA9IG13IC8gMTAwMDsKKworCXJldHVybiAwOwor fQorCiBpbnQgdGNwbV91cGRhdGVfc291cmNlX2NhcGFiaWxpdGllcyhzdHJ1Y3QgdGNwbV9wb3J0 ICpwb3J0LCBjb25zdCB1MzIgKnBkbywKIAkJCQkgICAgdW5zaWduZWQgaW50IG5yX3BkbykKIHsK QEAgLTM2NDMsMTIgKzM3MjAsMzkgQEAgc3RhdGljIGludCBucl90eXBlX3Bkb3MoY29uc3QgdTMy ICpwZG8sIHVuc2lnbmVkIGludCBucl9wZG8sCiAJcmV0dXJuIGNvdW50OwogfQogCitzdGF0aWMg aW50IHRjcG1fY29weV9jYXBzKHN0cnVjdCB0Y3BtX3BvcnQgKnBvcnQsCisJCQkgIGNvbnN0IHN0 cnVjdCB0Y3BjX2NvbmZpZyAqdGNmZykKK3sKKwlpZiAodGNwbV92YWxpZGF0ZV9jYXBzKHBvcnQs IHRjZmctPnNyY19wZG8sIHRjZmctPm5yX3NyY19wZG8pIHx8CisJICAgIHRjcG1fdmFsaWRhdGVf Y2Fwcyhwb3J0LCB0Y2ZnLT5zbmtfcGRvLCB0Y2ZnLT5ucl9zbmtfcGRvKSkKKwkJcmV0dXJuIC1F SU5WQUw7CisKKwlwb3J0LT5ucl9zcmNfcGRvID0gdGNwbV9jb3B5X3Bkb3MocG9ydC0+c3JjX3Bk bywgdGNmZy0+c3JjX3BkbywKKwkJCQkJICB0Y2ZnLT5ucl9zcmNfcGRvKTsKKwlwb3J0LT5ucl9z bmtfcGRvID0gdGNwbV9jb3B5X3Bkb3MocG9ydC0+c25rX3BkbywgdGNmZy0+c25rX3BkbywKKwkJ CQkJICB0Y2ZnLT5ucl9zbmtfcGRvKTsKKworCXBvcnQtPm5yX3Nua192ZG8gPSB0Y3BtX2NvcHlf dmRvcyhwb3J0LT5zbmtfdmRvLCB0Y2ZnLT5zbmtfdmRvLAorCQkJCQkgIHRjZmctPm5yX3Nua192 ZG8pOworCisJcG9ydC0+bWF4X3Nua19tdiA9IHRjZmctPm1heF9zbmtfbXY7CisJcG9ydC0+bWF4 X3Nua19tYSA9IHRjZmctPm1heF9zbmtfbWE7CisJcG9ydC0+bWF4X3Nua19tdyA9IHRjZmctPm1h eF9zbmtfbXc7CisJcG9ydC0+b3BlcmF0aW5nX3Nua19tdyA9IHRjZmctPm9wZXJhdGluZ19zbmtf bXc7CisKKwlwb3J0LT50eXBlY19jYXBzLnByZWZlcl9yb2xlID0gdGNmZy0+ZGVmYXVsdF9yb2xl OworCXBvcnQtPnR5cGVjX2NhcHMudHlwZSA9IHRjZmctPnR5cGU7CisJcG9ydC0+dHlwZWNfY2Fw cy5kYXRhID0gdGNmZy0+ZGF0YTsKKworCXJldHVybiAwOworfQorCiBzdHJ1Y3QgdGNwbV9wb3J0 ICp0Y3BtX3JlZ2lzdGVyX3BvcnQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgdGNwY19kZXYg KnRjcGMpCiB7CiAJc3RydWN0IHRjcG1fcG9ydCAqcG9ydDsKIAlpbnQgaSwgZXJyOwogCi0JaWYg KCFkZXYgfHwgIXRjcGMgfHwgIXRjcGMtPmNvbmZpZyB8fAorCWlmICghZGV2IHx8ICF0Y3BjIHx8 CiAJICAgICF0Y3BjLT5nZXRfdmJ1cyB8fCAhdGNwYy0+c2V0X2NjIHx8ICF0Y3BjLT5nZXRfY2Mg fHwKIAkgICAgIXRjcGMtPnNldF9wb2xhcml0eSB8fCAhdGNwYy0+c2V0X3Zjb25uIHx8ICF0Y3Bj LT5zZXRfdmJ1cyB8fAogCSAgICAhdGNwYy0+c2V0X3BkX3J4IHx8ICF0Y3BjLT5zZXRfcm9sZXMg fHwgIXRjcGMtPnBkX3RyYW5zbWl0KQpAQCAtMzY3NywxNyArMzc4MSwxMyBAQCBzdHJ1Y3QgdGNw bV9wb3J0ICp0Y3BtX3JlZ2lzdGVyX3BvcnQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgdGNw Y19kZXYgKnRjcGMpCiAJaW5pdF9jb21wbGV0aW9uKCZwb3J0LT5zd2FwX2NvbXBsZXRlKTsKIAl0 Y3BtX2RlYnVnZnNfaW5pdChwb3J0KTsKIAotCWlmICh0Y3BtX3ZhbGlkYXRlX2NhcHMocG9ydCwg dGNwYy0+Y29uZmlnLT5zcmNfcGRvLAotCQkJICAgICAgIHRjcGMtPmNvbmZpZy0+bnJfc3JjX3Bk bykgfHwKLQkgICAgdGNwbV92YWxpZGF0ZV9jYXBzKHBvcnQsIHRjcGMtPmNvbmZpZy0+c25rX3Bk bywKLQkJCSAgICAgICB0Y3BjLT5jb25maWctPm5yX3Nua19wZG8pKSB7Ci0JCWVyciA9IC1FSU5W QUw7CisJaWYgKHRjcGMtPmNvbmZpZykKKwkJZXJyID0gdGNwbV9jb3B5X2NhcHMocG9ydCwgdGNw Yy0+Y29uZmlnKTsKKwllbHNlCisJCWVyciA9IHRjcG1fZndfZ2V0X2NhcHMocG9ydCwgdGNwYy0+ Zndub2RlKTsKKwlpZiAoZXJyIDwgMCkKIAkJZ290byBvdXRfZGVzdHJveV93cTsKLQl9Ci0JcG9y dC0+bnJfc3JjX3BkbyA9IHRjcG1fY29weV9wZG9zKHBvcnQtPnNyY19wZG8sIHRjcGMtPmNvbmZp Zy0+c3JjX3BkbywKLQkJCQkJICB0Y3BjLT5jb25maWctPm5yX3NyY19wZG8pOwotCXBvcnQtPm5y X3Nua19wZG8gPSB0Y3BtX2NvcHlfcGRvcyhwb3J0LT5zbmtfcGRvLCB0Y3BjLT5jb25maWctPnNu a19wZG8sCi0JCQkJCSAgdGNwYy0+Y29uZmlnLT5ucl9zbmtfcGRvKTsKKwogCXBvcnQtPm5yX2Zp eGVkID0gIG5yX3R5cGVfcGRvcyhwb3J0LT5zbmtfcGRvLAogCQkJCSAgICAgICBwb3J0LT5ucl9z bmtfcGRvLAogCQkJCSAgICAgICBQRE9fVFlQRV9GSVhFRCk7CkBAIC0zNjk3LDIyICszNzk3LDEy IEBAIHN0cnVjdCB0Y3BtX3BvcnQgKnRjcG1fcmVnaXN0ZXJfcG9ydChzdHJ1Y3QgZGV2aWNlICpk ZXYsIHN0cnVjdCB0Y3BjX2RldiAqdGNwYykKIAlwb3J0LT5ucl9iYXR0ID0gbnJfdHlwZV9wZG9z KHBvcnQtPnNua19wZG8sCiAJCQkJICAgICBwb3J0LT5ucl9zbmtfcGRvLAogCQkJCSAgICAgUERP X1RZUEVfQkFUVCk7Ci0JcG9ydC0+bnJfc25rX3ZkbyA9IHRjcG1fY29weV92ZG9zKHBvcnQtPnNu a192ZG8sIHRjcGMtPmNvbmZpZy0+c25rX3ZkbywKLQkJCQkJICB0Y3BjLT5jb25maWctPm5yX3Nu a192ZG8pOwotCi0JcG9ydC0+bWF4X3Nua19tdiA9IHRjcGMtPmNvbmZpZy0+bWF4X3Nua19tdjsK LQlwb3J0LT5tYXhfc25rX21hID0gdGNwYy0+Y29uZmlnLT5tYXhfc25rX21hOwotCXBvcnQtPm1h eF9zbmtfbXcgPSB0Y3BjLT5jb25maWctPm1heF9zbmtfbXc7Ci0JcG9ydC0+b3BlcmF0aW5nX3Nu a19tdyA9IHRjcGMtPmNvbmZpZy0+b3BlcmF0aW5nX3Nua19tdzsKLQlpZiAoIXRjcGMtPmNvbmZp Zy0+dHJ5X3JvbGVfaHcpCi0JCXBvcnQtPnRyeV9yb2xlID0gdGNwYy0+Y29uZmlnLT5kZWZhdWx0 X3JvbGU7CisJaWYgKCF0Y3BjLT5jb25maWcgfHwgIXRjcGMtPmNvbmZpZy0+dHJ5X3JvbGVfaHcp CisJCXBvcnQtPnRyeV9yb2xlID0gcG9ydC0+dHlwZWNfY2Fwcy5wcmVmZXJfcm9sZTsKIAllbHNl CiAJCXBvcnQtPnRyeV9yb2xlID0gVFlQRUNfTk9fUFJFRkVSUkVEX1JPTEU7CiAKIAlwb3J0LT50 eXBlY19jYXBzLmZ3bm9kZSA9IHRjcGMtPmZ3bm9kZTsKLQlwb3J0LT50eXBlY19jYXBzLnByZWZl cl9yb2xlID0gdGNwYy0+Y29uZmlnLT5kZWZhdWx0X3JvbGU7Ci0JcG9ydC0+dHlwZWNfY2Fwcy50 eXBlID0gdGNwYy0+Y29uZmlnLT50eXBlOwotCXBvcnQtPnR5cGVjX2NhcHMuZGF0YSA9IHRjcGMt PmNvbmZpZy0+ZGF0YTsKIAlwb3J0LT50eXBlY19jYXBzLnJldmlzaW9uID0gMHgwMTIwOwkvKiBU eXBlLUMgc3BlYyByZWxlYXNlIDEuMiAqLwogCXBvcnQtPnR5cGVjX2NhcHMucGRfcmV2aXNpb24g PSAweDAyMDA7CS8qIFVTQi1QRCBzcGVjIHJlbGVhc2UgMi4wICovCiAJcG9ydC0+dHlwZWNfY2Fw cy5kcl9zZXQgPSB0Y3BtX2RyX3NldDsKQEAgLTM3MjIsNyArMzgxMiw3IEBAIHN0cnVjdCB0Y3Bt X3BvcnQgKnRjcG1fcmVnaXN0ZXJfcG9ydChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCB0Y3Bj X2RldiAqdGNwYykKIAlwb3J0LT50eXBlY19jYXBzLnBvcnRfdHlwZV9zZXQgPSB0Y3BtX3BvcnRf dHlwZV9zZXQ7CiAKIAlwb3J0LT5wYXJ0bmVyX2Rlc2MuaWRlbnRpdHkgPSAmcG9ydC0+cGFydG5l cl9pZGVudDsKLQlwb3J0LT5wb3J0X3R5cGUgPSB0Y3BjLT5jb25maWctPnR5cGU7CisJcG9ydC0+ cG9ydF90eXBlID0gcG9ydC0+dHlwZWNfY2Fwcy50eXBlOwogCiAJcG9ydC0+cm9sZV9zdyA9IHVz Yl9yb2xlX3N3aXRjaF9nZXQocG9ydC0+ZGV2KTsKIAlpZiAoSVNfRVJSKHBvcnQtPnJvbGVfc3cp KSB7CkBAIC0zNzM2LDcgKzM4MjYsNyBAQCBzdHJ1Y3QgdGNwbV9wb3J0ICp0Y3BtX3JlZ2lzdGVy X3BvcnQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgdGNwY19kZXYgKnRjcGMpCiAJCWdvdG8g b3V0X2Rlc3Ryb3lfd3E7CiAJfQogCi0JaWYgKHRjcGMtPmNvbmZpZy0+YWx0X21vZGVzKSB7CisJ aWYgKHRjcGMtPmNvbmZpZyAmJiB0Y3BjLT5jb25maWctPmFsdF9tb2RlcykgewogCQljb25zdCBz dHJ1Y3QgdHlwZWNfYWx0bW9kZV9kZXNjICpwYWx0bW9kZSA9IHRjcGMtPmNvbmZpZy0+YWx0X21v ZGVzOwogCiAJCWkgPSAwOwo= From mboxrd@z Thu Jan 1 00:00:00 1970 From: Li Jun Subject: [PATCH v4 06/13] usb: typec: tcpm: support get typec and pd config from device properties Date: Thu, 29 Mar 2018 00:06:11 +0800 Message-ID: <1522253178-32414-7-git-send-email-jun.li@nxp.com> References: <1522253178-32414-1-git-send-email-jun.li@nxp.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: <1522253178-32414-1-git-send-email-jun.li@nxp.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: driverdev-devel-bounces@linuxdriverproject.org Sender: "devel" To: robh+dt@kernel.org, gregkh@linuxfoundation.org, heikki.krogerus@linux.intel.com, linux@roeck-us.net Cc: devel@driverdev.osuosl.org, devicetree@vger.kernel.org, peter.chen@nxp.com, linux-usb@vger.kernel.org, a.hajda@samsung.com, linux-imx@nxp.com, jun.li@nxp.com, shufan_lee@richtek.com List-Id: devicetree@vger.kernel.org This patch adds support of get typec and power delivery config from firmware description. Signed-off-by: Li Jun --- drivers/usb/typec/tcpm.c | 140 ++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 115 insertions(+), 25 deletions(-) diff --git a/drivers/usb/typec/tcpm.c b/drivers/usb/typec/tcpm.c index be9b009..1744041b 100644 --- a/drivers/usb/typec/tcpm.c +++ b/drivers/usb/typec/tcpm.c @@ -13,6 +13,7 @@ #include #include #include +#include #include #include #include @@ -3569,6 +3570,82 @@ static int tcpm_copy_vdos(u32 *dest_vdo, const u32 *src_vdo, return nr_vdo; } +static int tcpm_fw_get_caps(struct tcpm_port *port, + struct fwnode_handle *fwnode) +{ + const char *cap_str; + int ret; + u32 mw; + + if (!port || !fwnode) + return -EINVAL; + + /* USB data support is optional */ + ret = fwnode_property_read_string(fwnode, "data-type", &cap_str); + if (ret == 0) { + port->typec_caps.data = typec_find_data_type(cap_str); + if (port->typec_caps.data < 0) + return -EINVAL; + } + + ret = fwnode_property_read_string(fwnode, "power-type", &cap_str); + if (ret < 0) + return ret; + + port->typec_caps.type = typec_find_power_type(cap_str); + if (port->typec_caps.type < 0) + return -EINVAL; + port->port_type = port->typec_caps.type; + + if (port->port_type == TYPEC_PORT_SNK) + goto sink; + + /* Get soruce pdos */ + ret = fwnode_property_read_u32_array(fwnode, "source-pdos", + NULL, 0); + if (ret <= 0) + return -EINVAL; + + port->nr_src_pdo = min(ret, PDO_MAX_OBJECTS); + ret = fwnode_property_read_u32_array(fwnode, "source-pdos", + port->src_pdo, port->nr_src_pdo); + if ((ret < 0) || tcpm_validate_caps(port, port->src_pdo, + port->nr_src_pdo)) + return -EINVAL; + + if (port->port_type == TYPEC_PORT_SRC) + return 0; + + /* Get the preferred power role for DRP */ + ret = fwnode_property_read_string(fwnode, "try-power-role", &cap_str); + if (ret < 0) + return ret; + + port->typec_caps.prefer_role = typec_find_preferred_role(cap_str); + if (port->typec_caps.prefer_role < 0) + return -EINVAL; +sink: + /* Get sink pdos */ + ret = fwnode_property_read_u32_array(fwnode, "sink-pdos", + NULL, 0); + if (ret <= 0) + return -EINVAL; + + port->nr_snk_pdo = min(ret, PDO_MAX_OBJECTS); + ret = fwnode_property_read_u32_array(fwnode, "sink-pdos", + port->snk_pdo, port->nr_snk_pdo); + if ((ret < 0) || tcpm_validate_caps(port, port->snk_pdo, + port->nr_snk_pdo)) + return -EINVAL; + + if (fwnode_property_read_u32(fwnode, "op-sink-microwatt-hours", + &mw) < 0) + return -EINVAL; + port->operating_snk_mw = mw / 1000; + + return 0; +} + int tcpm_update_source_capabilities(struct tcpm_port *port, const u32 *pdo, unsigned int nr_pdo) { @@ -3643,12 +3720,39 @@ static int nr_type_pdos(const u32 *pdo, unsigned int nr_pdo, return count; } +static int tcpm_copy_caps(struct tcpm_port *port, + const struct tcpc_config *tcfg) +{ + if (tcpm_validate_caps(port, tcfg->src_pdo, tcfg->nr_src_pdo) || + tcpm_validate_caps(port, tcfg->snk_pdo, tcfg->nr_snk_pdo)) + return -EINVAL; + + port->nr_src_pdo = tcpm_copy_pdos(port->src_pdo, tcfg->src_pdo, + tcfg->nr_src_pdo); + port->nr_snk_pdo = tcpm_copy_pdos(port->snk_pdo, tcfg->snk_pdo, + tcfg->nr_snk_pdo); + + port->nr_snk_vdo = tcpm_copy_vdos(port->snk_vdo, tcfg->snk_vdo, + tcfg->nr_snk_vdo); + + port->max_snk_mv = tcfg->max_snk_mv; + port->max_snk_ma = tcfg->max_snk_ma; + port->max_snk_mw = tcfg->max_snk_mw; + port->operating_snk_mw = tcfg->operating_snk_mw; + + port->typec_caps.prefer_role = tcfg->default_role; + port->typec_caps.type = tcfg->type; + port->typec_caps.data = tcfg->data; + + return 0; +} + struct tcpm_port *tcpm_register_port(struct device *dev, struct tcpc_dev *tcpc) { struct tcpm_port *port; int i, err; - if (!dev || !tcpc || !tcpc->config || + if (!dev || !tcpc || !tcpc->get_vbus || !tcpc->set_cc || !tcpc->get_cc || !tcpc->set_polarity || !tcpc->set_vconn || !tcpc->set_vbus || !tcpc->set_pd_rx || !tcpc->set_roles || !tcpc->pd_transmit) @@ -3677,17 +3781,13 @@ struct tcpm_port *tcpm_register_port(struct device *dev, struct tcpc_dev *tcpc) init_completion(&port->swap_complete); tcpm_debugfs_init(port); - if (tcpm_validate_caps(port, tcpc->config->src_pdo, - tcpc->config->nr_src_pdo) || - tcpm_validate_caps(port, tcpc->config->snk_pdo, - tcpc->config->nr_snk_pdo)) { - err = -EINVAL; + if (tcpc->config) + err = tcpm_copy_caps(port, tcpc->config); + else + err = tcpm_fw_get_caps(port, tcpc->fwnode); + if (err < 0) goto out_destroy_wq; - } - port->nr_src_pdo = tcpm_copy_pdos(port->src_pdo, tcpc->config->src_pdo, - tcpc->config->nr_src_pdo); - port->nr_snk_pdo = tcpm_copy_pdos(port->snk_pdo, tcpc->config->snk_pdo, - tcpc->config->nr_snk_pdo); + port->nr_fixed = nr_type_pdos(port->snk_pdo, port->nr_snk_pdo, PDO_TYPE_FIXED); @@ -3697,22 +3797,12 @@ struct tcpm_port *tcpm_register_port(struct device *dev, struct tcpc_dev *tcpc) port->nr_batt = nr_type_pdos(port->snk_pdo, port->nr_snk_pdo, PDO_TYPE_BATT); - port->nr_snk_vdo = tcpm_copy_vdos(port->snk_vdo, tcpc->config->snk_vdo, - tcpc->config->nr_snk_vdo); - - port->max_snk_mv = tcpc->config->max_snk_mv; - port->max_snk_ma = tcpc->config->max_snk_ma; - port->max_snk_mw = tcpc->config->max_snk_mw; - port->operating_snk_mw = tcpc->config->operating_snk_mw; - if (!tcpc->config->try_role_hw) - port->try_role = tcpc->config->default_role; + if (!tcpc->config || !tcpc->config->try_role_hw) + port->try_role = port->typec_caps.prefer_role; else port->try_role = TYPEC_NO_PREFERRED_ROLE; port->typec_caps.fwnode = tcpc->fwnode; - port->typec_caps.prefer_role = tcpc->config->default_role; - port->typec_caps.type = tcpc->config->type; - port->typec_caps.data = tcpc->config->data; port->typec_caps.revision = 0x0120; /* Type-C spec release 1.2 */ port->typec_caps.pd_revision = 0x0200; /* USB-PD spec release 2.0 */ port->typec_caps.dr_set = tcpm_dr_set; @@ -3722,7 +3812,7 @@ struct tcpm_port *tcpm_register_port(struct device *dev, struct tcpc_dev *tcpc) port->typec_caps.port_type_set = tcpm_port_type_set; port->partner_desc.identity = &port->partner_ident; - port->port_type = tcpc->config->type; + port->port_type = port->typec_caps.type; port->role_sw = usb_role_switch_get(port->dev); if (IS_ERR(port->role_sw)) { @@ -3736,7 +3826,7 @@ struct tcpm_port *tcpm_register_port(struct device *dev, struct tcpc_dev *tcpc) goto out_destroy_wq; } - if (tcpc->config->alt_modes) { + if (tcpc->config && tcpc->config->alt_modes) { const struct typec_altmode_desc *paltmode = tcpc->config->alt_modes; i = 0; -- 2.7.4