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: [v3,10/12] hikey960: Support usb functionality of Hikey960 From: Chunfeng Yun Message-Id: <1551664069.2210.64.camel@mhfsdcap03> Date: Mon, 4 Mar 2019 09:47:49 +0800 To: Yu Chen Cc: linux-usb@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, john.stultz@linaro.org, suzhuangluan@hisilicon.com, kongfei@hisilicon.com, liuyu712@hisilicon.com, wanghu17@hisilicon.com, butao@hisilicon.com, chenyao11@huawei.com, fangshengzhou@hisilicon.com, lipengcheng8@huawei.com, songxiaowei@hisilicon.com, xuyiping@hisilicon.com, xuyoujun4@huawei.com, yudongbin@hisilicon.com, zangleigang@hisilicon.com, Andy Shevchenko , Arnd Bergmann , Greg Kroah-Hartman , Binghui Wang , Heikki Krogerus List-ID: aGksCk9uIFNhdCwgMjAxOS0wMy0wMiBhdCAxNzowNSArMDgwMCwgWXUgQ2hlbiB3cm90ZToKPiBU aGlzIGRyaXZlciBoYW5kbGVzIHVzYiBodWIgcG93ZXIgb24gYW5kIHR5cGVDIHBvcnQgZXZlbnQg b2YgSGlLZXk5NjAgYm9hcmQ6Cj4gMSlEUCZETSBzd2l0Y2hpbmcgYmV0d2VlbiB1c2IgaHViIGFu ZCB0eXBlQyBwb3J0IGJhc2Ugb24gdHlwZUMgcG9ydAo+IHN0YXRlCj4gMilDb250cm9sIHBvd2Vy IG9mIHVzYiBodWIgb24gSGlrZXk5NjAKPiAzKUNvbnRyb2wgdmJ1cyBvZiB0eXBlQyBwb3J0Cj4g Cj4gQ2M6IENodW5mZW5nIFl1biA8Y2h1bmZlbmcueXVuQG1lZGlhdGVrLmNvbT4KPiBDYzogQW5k eSBTaGV2Y2hlbmtvIDxhbmR5LnNoZXZjaGVua29AZ21haWwuY29tPgo+IENjOiBBcm5kIEJlcmdt YW5uIDxhcm5kQGFybmRiLmRlPgo+IENjOiBHcmVnIEtyb2FoLUhhcnRtYW4gPGdyZWdraEBsaW51 eGZvdW5kYXRpb24ub3JnPgo+IENjOiBKb2huIFN0dWx0eiA8am9obi5zdHVsdHpAbGluYXJvLm9y Zz4KPiBDYzogQmluZ2h1aSBXYW5nIDx3YW5nYmluZ2h1aUBoaXNpbGljb24uY29tPgo+IENjOiBI ZWlra2kgS3JvZ2VydXMgPGhlaWtraS5rcm9nZXJ1c0BsaW51eC5pbnRlbC5jb20+Cj4gU2lnbmVk LW9mZi1ieTogWXUgQ2hlbiA8Y2hlbnl1NTZAaHVhd2VpLmNvbT4KPiAtLS0KPiB2MToKPiAqIFVz aW5nIGdwaW9kIEFQSSB3aXRoIHRoZSBncGlvcy4KPiAqIFJlbW92aW5nIHJlZ2lzdGVyaW5nIHVz YiByb2xlIHN3aXRjaC4KPiAqIFJlZ2lzdGVyaW5nIHVzYiByb2xlIHN3aXRjaCBub3RpZmllci4K PiB2MjoKPiAqIEZpeCBsaWNlbnNlIGRlY2xhcmF0aW9uLgo+ICogQWRkIGNvbmZpZ3VyYXRpb24g b2YgIGdwaW8gZGlyZWN0aW9uLgo+ICogUmVtb3ZlIHNvbWUgbG9nIHByaW50Lgo+IHYzOgo+ICog UmVtb3ZlIHByb3BlcnR5IG9mICJ0eXBlY192YnVzX2VuYWJsZV92YWwiLgo+ICogUmVtb3ZlIGdw aW9kX2RpcmVjdGlvbl9vdXRwdXQgYW5kIHNldCBpbml0aWFsIHZhbHVlIG9mIGdwaW8gYnkgZGV2 bV9ncGlvZF9nZXQuCj4gLS0tCj4gLS0tCj4gIGRyaXZlcnMvbWlzYy9LY29uZmlnICAgICAgICAg IHwgICA2ICsrCj4gIGRyaXZlcnMvbWlzYy9NYWtlZmlsZSAgICAgICAgIHwgICAxICsKPiAgZHJp dmVycy9taXNjL2hpc2lfaGlrZXlfdXNiLmMgfCAxNjcgKysrKysrKysrKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrKysrCj4gIDMgZmlsZXMgY2hhbmdlZCwgMTc0IGluc2VydGlvbnMoKykK PiAgY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvbWlzYy9oaXNpX2hpa2V5X3VzYi5jCj4gCj4g ZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9LY29uZmlnIGIvZHJpdmVycy9taXNjL0tjb25maWcK PiBpbmRleCBmNDE3YjA2ZTExYzUuLjhkOGI3MTc3NTllMiAxMDA2NDQKPiAtLS0gYS9kcml2ZXJz L21pc2MvS2NvbmZpZwo+ICsrKyBiL2RyaXZlcnMvbWlzYy9LY29uZmlnCj4gQEAgLTUyMSw2ICs1 MjEsMTIgQEAgY29uZmlnIFBWUEFOSUMKPiAgCSAgYSBwYXJhdmlydHVhbGl6ZWQgZGV2aWNlIHBy b3ZpZGVkIGJ5IFFFTVU7IGl0IGxldHMgYSB2aXJ0dWFsIG1hY2hpbmUKPiAgCSAgKGd1ZXN0KSBj b21tdW5pY2F0ZSBwYW5pYyBldmVudHMgdG8gdGhlIGhvc3QuCj4gIAo+ICtjb25maWcgSElTSV9I SUtFWV9VU0IKPiArCXRyaXN0YXRlICJVU0IgZnVuY3Rpb25hbGl0eSBvZiBIaVNpbGljb24gSGlr ZXkgUGxhdGZvcm0iCj4gKwlkZXBlbmRzIG9uIE9GICYmIEdQSU9MSUIKPiArCWhlbHAKPiArCSAg SWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIHVzYiBmdW5jdGlvbmFsaXR5 IG9mIEhpU2lsaWNvbiBIaWtleSBQbGF0Zm9ybS4KPiArCj4gIHNvdXJjZSAiZHJpdmVycy9taXNj L2MycG9ydC9LY29uZmlnIgo+ICBzb3VyY2UgImRyaXZlcnMvbWlzYy9lZXByb20vS2NvbmZpZyIK PiAgc291cmNlICJkcml2ZXJzL21pc2MvY2I3MTAvS2NvbmZpZyIKPiBkaWZmIC0tZ2l0IGEvZHJp dmVycy9taXNjL01ha2VmaWxlIGIvZHJpdmVycy9taXNjL01ha2VmaWxlCj4gaW5kZXggZTM5Y2Ni YmMxYjNhLi5kYzg4OTJiMTNhMWEgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9taXNjL01ha2VmaWxl Cj4gKysrIGIvZHJpdmVycy9taXNjL01ha2VmaWxlCj4gQEAgLTU5LDMgKzU5LDQgQEAgb2JqLSQo Q09ORklHX1BDSV9FTkRQT0lOVF9URVNUKQkrPSBwY2lfZW5kcG9pbnRfdGVzdC5vCj4gIG9iai0k KENPTkZJR19PQ1hMKQkJKz0gb2N4bC8KPiAgb2JqLXkJCQkJKz0gY2FyZHJlYWRlci8KPiAgb2Jq LSQoQ09ORklHX1BWUEFOSUMpICAgCSs9IHB2cGFuaWMubwo+ICtvYmotJChDT05GSUdfSElTSV9I SUtFWV9VU0IpCSs9IGhpc2lfaGlrZXlfdXNiLm8KPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNj L2hpc2lfaGlrZXlfdXNiLmMgYi9kcml2ZXJzL21pc2MvaGlzaV9oaWtleV91c2IuYwo+IG5ldyBm aWxlIG1vZGUgMTAwNjQ0Cj4gaW5kZXggMDAwMDAwMDAwMDAwLi44NWQ2ZmVlNDY4YzAKPiAtLS0g L2Rldi9udWxsCj4gKysrIGIvZHJpdmVycy9taXNjL2hpc2lfaGlrZXlfdXNiLmMKPiBAQCAtMCww ICsxLDE2NyBAQAo+ICsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMAo+ICsvKgo+ ICsgKiBTdXBwb3J0IGZvciB1c2IgZnVuY3Rpb25hbGl0eSBvZiBIaWtleSBzZXJpZXMgYm9hcmRz Cj4gKyAqIGJhc2VkIG9uIEhpc2lsaWNvbiBLaXJpbiBTb2MuCj4gKyAqCj4gKyAqIENvcHlyaWdo dCAoQykgMjAxNy0yMDE4IEhpbGlzaWNvbiBFbGVjdHJvbmljcyBDby4sIEx0ZC4KPiArICoJCWh0 dHA6Ly93d3cuaHVhd2VpLmNvbQo+ICsgKgo+ICsgKiBBdXRob3JzOiBZdSBDaGVuIDxjaGVueXU1 NkBodWF3ZWkuY29tPgo+ICsgKi8KPiArCj4gKyNpbmNsdWRlIDxsaW51eC9ncGlvL2NvbnN1bWVy Lmg+Cj4gKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KPiArI2luY2x1ZGUgPGxpbnV4L21vZHVs ZS5oPgo+ICsjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KPiArI2luY2x1ZGUgPGxpbnV4L29m Lmg+Cj4gKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KPiArI2luY2x1ZGUgPGxp bnV4L3NsYWIuaD4KPiArI2luY2x1ZGUgPGxpbnV4L3VzYi9yb2xlLmg+Cj4gKwo+ICsjZGVmaW5l IERFVklDRV9EUklWRVJfTkFNRSAiaGlzaV9oaWtleV91c2IiCj4gKwo+ICsjZGVmaW5lIEhVQl9W QlVTX1BPV0VSX09OIDEKPiArI2RlZmluZSBIVUJfVkJVU19QT1dFUl9PRkYgMAo+ICsjZGVmaW5l IFVTQl9TV0lUQ0hfVE9fSFVCIDEKPiArI2RlZmluZSBVU0JfU1dJVENIX1RPX1RZUEVDIDAKPiAr I2RlZmluZSBUWVBFQ19WQlVTX1BPV0VSX09OIDEKPiArI2RlZmluZSBUWVBFQ19WQlVTX1BPV0VS X09GRiAwCj4gKwo+ICtzdHJ1Y3QgaGlzaV9oaWtleV91c2Igewo+ICsJc3RydWN0IGdwaW9fZGVz YyAqb3RnX3N3aXRjaDsKPiArCXN0cnVjdCBncGlvX2Rlc2MgKnR5cGVjX3ZidXM7Cj4gKwlzdHJ1 Y3QgZ3Bpb19kZXNjICpodWJfdmJ1czsKPiArCj4gKwlzdHJ1Y3QgdXNiX3JvbGVfc3dpdGNoICpy b2xlX3N3Owo+ICsJc3RydWN0IG5vdGlmaWVyX2Jsb2NrIG5iOwo+ICt9Owo+ICsKPiArc3RhdGlj IHZvaWQgaHViX3Bvd2VyX2N0cmwoc3RydWN0IGhpc2lfaGlrZXlfdXNiICpoaXNpX2hpa2V5X3Vz YiwgaW50IHZhbHVlKQo+ICt7Cj4gKwlncGlvZF9zZXRfdmFsdWVfY2Fuc2xlZXAoaGlzaV9oaWtl eV91c2ItPmh1Yl92YnVzLCB2YWx1ZSk7Cj4gK30KPiArCj4gK3N0YXRpYyB2b2lkIHVzYl9zd2l0 Y2hfY3RybChzdHJ1Y3QgaGlzaV9oaWtleV91c2IgKmhpc2lfaGlrZXlfdXNiLAo+ICsJCWludCBz d2l0Y2hfdG8pCj4gK3sKPiArCWdwaW9kX3NldF92YWx1ZV9jYW5zbGVlcChoaXNpX2hpa2V5X3Vz Yi0+b3RnX3N3aXRjaCwgc3dpdGNoX3RvKTsKPiArfQo+ICsKPiArc3RhdGljIHZvaWQgdXNiX3R5 cGVjX3Bvd2VyX2N0cmwoc3RydWN0IGhpc2lfaGlrZXlfdXNiICpoaXNpX2hpa2V5X3VzYiwKPiAr CQlpbnQgdmFsdWUpCj4gK3sKPiArCWdwaW9kX3NldF92YWx1ZV9jYW5zbGVlcChoaXNpX2hpa2V5 X3VzYi0+dHlwZWNfdmJ1cywgdmFsdWUpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IGhpc2lfaGlr ZXlfcm9sZV9zd2l0Y2goc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYiwKPiArCQkJdW5zaWduZWQg bG9uZyBzdGF0ZSwgdm9pZCAqZGF0YSkKPiArewo+ICsJc3RydWN0IGhpc2lfaGlrZXlfdXNiICpo aXNpX2hpa2V5X3VzYjsKPiArCj4gKwloaXNpX2hpa2V5X3VzYiA9IGNvbnRhaW5lcl9vZihuYiwg c3RydWN0IGhpc2lfaGlrZXlfdXNiLCBuYik7Cj4gKwo+ICsJc3dpdGNoIChzdGF0ZSkgewo+ICsJ Y2FzZSBVU0JfUk9MRV9OT05FOgo+ICsJCXVzYl90eXBlY19wb3dlcl9jdHJsKGhpc2lfaGlrZXlf dXNiLCBUWVBFQ19WQlVTX1BPV0VSX09GRik7Cj4gKwkJdXNiX3N3aXRjaF9jdHJsKGhpc2lfaGlr ZXlfdXNiLCBVU0JfU1dJVENIX1RPX0hVQik7Cj4gKwkJaHViX3Bvd2VyX2N0cmwoaGlzaV9oaWtl eV91c2IsIEhVQl9WQlVTX1BPV0VSX09OKTsKPiArCQlicmVhazsKPiArCWNhc2UgVVNCX1JPTEVf SE9TVDoKPiArCQl1c2Jfc3dpdGNoX2N0cmwoaGlzaV9oaWtleV91c2IsIFVTQl9TV0lUQ0hfVE9f VFlQRUMpOwo+ICsJCXVzYl90eXBlY19wb3dlcl9jdHJsKGhpc2lfaGlrZXlfdXNiLCBUWVBFQ19W QlVTX1BPV0VSX09OKTsKPiArCQlicmVhazsKPiArCWNhc2UgVVNCX1JPTEVfREVWSUNFOgo+ICsJ CWh1Yl9wb3dlcl9jdHJsKGhpc2lfaGlrZXlfdXNiLCBIVUJfVkJVU19QT1dFUl9PRkYpOwo+ICsJ CXVzYl90eXBlY19wb3dlcl9jdHJsKGhpc2lfaGlrZXlfdXNiLCBUWVBFQ19WQlVTX1BPV0VSX09G Rik7Cj4gKwkJdXNiX3N3aXRjaF9jdHJsKGhpc2lfaGlrZXlfdXNiLCBVU0JfU1dJVENIX1RPX1RZ UEVDKTsKPiArCQlicmVhazsKPiArCWRlZmF1bHQ6Cj4gKwkJYnJlYWs7Cj4gKwl9Cj4gKwo+ICsJ cmV0dXJuIDA7Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQgaGlzaV9oaWtleV91c2JfcHJvYmUoc3Ry dWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKPiArewo+ICsJc3RydWN0IGRldmljZSAqZGV2ID0g JnBkZXYtPmRldjsKPiArCXN0cnVjdCBkZXZpY2Vfbm9kZSAqcm9vdCA9IGRldi0+b2Zfbm9kZTsK PiArCXN0cnVjdCBoaXNpX2hpa2V5X3VzYiAqaGlzaV9oaWtleV91c2I7Cj4gKwlpbnQgcmV0Owo+ ICsKPiArCWhpc2lfaGlrZXlfdXNiID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCpoaXNpX2hp a2V5X3VzYiksIEdGUF9LRVJORUwpOwo+ICsJaWYgKCFoaXNpX2hpa2V5X3VzYikKPiArCQlyZXR1 cm4gLUVOT01FTTsKPiArCj4gKwloaXNpX2hpa2V5X3VzYi0+bmIubm90aWZpZXJfY2FsbCA9IGhp c2lfaGlrZXlfcm9sZV9zd2l0Y2g7Cj4gKwo+ICsJaGlzaV9oaWtleV91c2ItPnR5cGVjX3ZidXMg PSBkZXZtX2dwaW9kX2dldChkZXYsICJ0eXBlYy12YnVzIiwKPiArCQkJR1BJT0RfT1VUX0xPVyk7 Cj4gKwlpZiAoIWhpc2lfaGlrZXlfdXNiLT50eXBlY192YnVzKQo+ICsJCXJldHVybiAtRU5PRU5U Owo+ICsJZWxzZSBpZiAoSVNfRVJSKGhpc2lfaGlrZXlfdXNiLT50eXBlY192YnVzKSkKPiArCQly ZXR1cm4gUFRSX0VSUihoaXNpX2hpa2V5X3VzYi0+dHlwZWNfdmJ1cyk7Cj4gKwo+ICsJaGlzaV9o aWtleV91c2ItPm90Z19zd2l0Y2ggPSBkZXZtX2dwaW9kX2dldChkZXYsICJvdGctc3dpdGNoIiwK PiArCQkJR1BJT0RfT1VUX0hJR0gpOwo+ICsJaWYgKCFoaXNpX2hpa2V5X3VzYi0+b3RnX3N3aXRj aCkKPiArCQlyZXR1cm4gLUVOT0VOVDsKPiArCWVsc2UgaWYgKElTX0VSUihoaXNpX2hpa2V5X3Vz Yi0+b3RnX3N3aXRjaCkpCj4gKwkJcmV0dXJuIFBUUl9FUlIoaGlzaV9oaWtleV91c2ItPm90Z19z d2l0Y2gpOwo+ICsKPiArCS8qIGh1Yi12ZGQzMy1lbiBpcyBvcHRpb25hbCAqLwo+ICsJaGlzaV9o aWtleV91c2ItPmh1Yl92YnVzID0gZGV2bV9ncGlvZF9nZXQoZGV2LCAiaHViLXZkZDMzLWVuIiwK PiArCQkJR1BJT0RfT1VUX0hJR0gpOwo+ICsJaWYgKElTX0VSUihoaXNpX2hpa2V5X3VzYi0+aHVi X3ZidXMpKQo+ICsJCXJldHVybiBQVFJfRVJSKGhpc2lfaGlrZXlfdXNiLT5odWJfdmJ1cyk7Cj4g Kwo+ICsJaGlzaV9oaWtleV91c2ItPnJvbGVfc3cgPSB1c2Jfcm9sZV9zd2l0Y2hfZ2V0KGRldik7 Cj4gKwlpZiAoIWhpc2lfaGlrZXlfdXNiLT5yb2xlX3N3KQo+ICsJCXJldHVybiAtRVBST0JFX0RF RkVSOwpIZXJlIHJldHVybiBFUFJPQkVfREVGRkVSIG1lYW5zIHRoZSByZWxhdGVkIGRldmljZV9j b25uZWN0aW9uIGlzCnJlZ2lzdGVyZWQgYWZ0ZXIgdGhpcyBwcm9iZSBpcyBjYWxsZWQsIHJpZ2h0 PwppZiBub3QsIHVzZSBJU19FUlJfT1JfTlVMTCB0aGVuIHJldHVybiBQVFJfRVJSIGlzIGVub3Vn aAo+ICsJZWxzZSBpZiAoSVNfRVJSKGhpc2lfaGlrZXlfdXNiLT5yb2xlX3N3KSkKPiArCQlyZXR1 cm4gUFRSX0VSUihoaXNpX2hpa2V5X3VzYi0+cm9sZV9zdyk7Cj4gKwo+ICsJcmV0ID0gdXNiX3Jv bGVfc3dpdGNoX3JlZ2lzdGVyX25vdGlmaWVyKGhpc2lfaGlrZXlfdXNiLT5yb2xlX3N3LAo+ICsJ CQkmaGlzaV9oaWtleV91c2ItPm5iKTsKPiArCWlmIChyZXQpIHsKPiArCQl1c2Jfcm9sZV9zd2l0 Y2hfcHV0KGhpc2lfaGlrZXlfdXNiLT5yb2xlX3N3KTsKPiArCQlyZXR1cm4gcmV0Owo+ICsJfQo+ ICsKPiArCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGhpc2lfaGlrZXlfdXNiKTsKPiArCj4g KwlyZXR1cm4gMDsKPiArfQo+ICsKPiArc3RhdGljIGludCAgaGlzaV9oaWtleV91c2JfcmVtb3Zl KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCj4gK3sKPiArCXN0cnVjdCBoaXNpX2hpa2V5 X3VzYiAqaGlzaV9oaWtleV91c2IgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKPiArCj4g Kwl1c2Jfcm9sZV9zd2l0Y2hfdW5yZWdpc3Rlcl9ub3RpZmllcihoaXNpX2hpa2V5X3VzYi0+cm9s ZV9zdywKPiArCQkJJmhpc2lfaGlrZXlfdXNiLT5uYik7Cj4gKwo+ICsJdXNiX3JvbGVfc3dpdGNo X3B1dChoaXNpX2hpa2V5X3VzYi0+cm9sZV9zdyk7Cj4gKwo+ICsJcmV0dXJuIDA7Cj4gK30KPiAr Cj4gK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGlkX3RhYmxlX2hpc2lfaGlrZXlf dXNiW10gPSB7Cj4gKwl7LmNvbXBhdGlibGUgPSAiaGlzaWxpY29uLGdwaW9faHVidjEifSwKPiAr CXsuY29tcGF0aWJsZSA9ICJoaXNpbGljb24saGlrZXk5NjBfdXNiIn0sCj4gKwl7fQo+ICt9Owo+ ICsKPiArc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgaGlzaV9oaWtleV91c2JfZHJpdmVy ID0gewo+ICsJLnByb2JlID0gaGlzaV9oaWtleV91c2JfcHJvYmUsCj4gKwkucmVtb3ZlID0gaGlz aV9oaWtleV91c2JfcmVtb3ZlLAo+ICsJLmRyaXZlciA9IHsKPiArCQkubmFtZSA9IERFVklDRV9E UklWRVJfTkFNRSwKPiArCQkub2ZfbWF0Y2hfdGFibGUgPSBpZF90YWJsZV9oaXNpX2hpa2V5X3Vz YiwKPiArCX0sCj4gK307Cj4gKwo+ICttb2R1bGVfcGxhdGZvcm1fZHJpdmVyKGhpc2lfaGlrZXlf dXNiX2RyaXZlcik7Cj4gKwo+ICtNT0RVTEVfQVVUSE9SKCJZdSBDaGVuIDxjaGVueXU1NkBodWF3 ZWkuY29tPiIpOwo+ICtNT0RVTEVfREVTQ1JJUFRJT04oIkRyaXZlciBTdXBwb3J0IGZvciBVU0Ig ZnVuY3Rpb25hbGl0eSBvZiBIaWtleSIpOwo+ICtNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7Cg== From mboxrd@z Thu Jan 1 00:00:00 1970 From: Chunfeng Yun Subject: Re: [PATCH v3 10/12] hikey960: Support usb functionality of Hikey960 Date: Mon, 4 Mar 2019 09:47:49 +0800 Message-ID: <1551664069.2210.64.camel@mhfsdcap03> References: <20190302090505.65542-1-chenyu56@huawei.com> <20190302090505.65542-11-chenyu56@huawei.com> Mime-Version: 1.0 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: <20190302090505.65542-11-chenyu56@huawei.com> Sender: linux-kernel-owner@vger.kernel.org To: Yu Chen Cc: linux-usb@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, john.stultz@linaro.org, suzhuangluan@hisilicon.com, kongfei@hisilicon.com, liuyu712@hisilicon.com, wanghu17@hisilicon.com, butao@hisilicon.com, chenyao11@huawei.com, fangshengzhou@hisilicon.com, lipengcheng8@huawei.com, songxiaowei@hisilicon.com, xuyiping@hisilicon.com, xuyoujun4@huawei.com, yudongbin@hisilicon.com, zangleigang@hisilicon.com, Andy Shevchenko , Arnd Bergmann , Greg Kroah-Hartman , Binghui Wang , Heikki Krogerus List-Id: devicetree@vger.kernel.org hi, On Sat, 2019-03-02 at 17:05 +0800, Yu Chen wrote: > This driver handles usb hub power on and typeC port event of HiKey960 board: > 1)DP&DM switching between usb hub and typeC port base on typeC port > state > 2)Control power of usb hub on Hikey960 > 3)Control vbus of typeC port > > Cc: Chunfeng Yun > Cc: Andy Shevchenko > Cc: Arnd Bergmann > Cc: Greg Kroah-Hartman > Cc: John Stultz > Cc: Binghui Wang > Cc: Heikki Krogerus > Signed-off-by: Yu Chen > --- > v1: > * Using gpiod API with the gpios. > * Removing registering usb role switch. > * Registering usb role switch notifier. > v2: > * Fix license declaration. > * Add configuration of gpio direction. > * Remove some log print. > v3: > * Remove property of "typec_vbus_enable_val". > * Remove gpiod_direction_output and set initial value of gpio by devm_gpiod_get. > --- > --- > drivers/misc/Kconfig | 6 ++ > drivers/misc/Makefile | 1 + > drivers/misc/hisi_hikey_usb.c | 167 ++++++++++++++++++++++++++++++++++++++++++ > 3 files changed, 174 insertions(+) > create mode 100644 drivers/misc/hisi_hikey_usb.c > > diff --git a/drivers/misc/Kconfig b/drivers/misc/Kconfig > index f417b06e11c5..8d8b717759e2 100644 > --- a/drivers/misc/Kconfig > +++ b/drivers/misc/Kconfig > @@ -521,6 +521,12 @@ config PVPANIC > a paravirtualized device provided by QEMU; it lets a virtual machine > (guest) communicate panic events to the host. > > +config HISI_HIKEY_USB > + tristate "USB functionality of HiSilicon Hikey Platform" > + depends on OF && GPIOLIB > + help > + If you say yes here you get support for usb functionality of HiSilicon Hikey Platform. > + > source "drivers/misc/c2port/Kconfig" > source "drivers/misc/eeprom/Kconfig" > source "drivers/misc/cb710/Kconfig" > diff --git a/drivers/misc/Makefile b/drivers/misc/Makefile > index e39ccbbc1b3a..dc8892b13a1a 100644 > --- a/drivers/misc/Makefile > +++ b/drivers/misc/Makefile > @@ -59,3 +59,4 @@ obj-$(CONFIG_PCI_ENDPOINT_TEST) += pci_endpoint_test.o > obj-$(CONFIG_OCXL) += ocxl/ > obj-y += cardreader/ > obj-$(CONFIG_PVPANIC) += pvpanic.o > +obj-$(CONFIG_HISI_HIKEY_USB) += hisi_hikey_usb.o > diff --git a/drivers/misc/hisi_hikey_usb.c b/drivers/misc/hisi_hikey_usb.c > new file mode 100644 > index 000000000000..85d6fee468c0 > --- /dev/null > +++ b/drivers/misc/hisi_hikey_usb.c > @@ -0,0 +1,167 @@ > +// SPDX-License-Identifier: GPL-2.0 > +/* > + * Support for usb functionality of Hikey series boards > + * based on Hisilicon Kirin Soc. > + * > + * Copyright (C) 2017-2018 Hilisicon Electronics Co., Ltd. > + * http://www.huawei.com > + * > + * Authors: Yu Chen > + */ > + > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > + > +#define DEVICE_DRIVER_NAME "hisi_hikey_usb" > + > +#define HUB_VBUS_POWER_ON 1 > +#define HUB_VBUS_POWER_OFF 0 > +#define USB_SWITCH_TO_HUB 1 > +#define USB_SWITCH_TO_TYPEC 0 > +#define TYPEC_VBUS_POWER_ON 1 > +#define TYPEC_VBUS_POWER_OFF 0 > + > +struct hisi_hikey_usb { > + struct gpio_desc *otg_switch; > + struct gpio_desc *typec_vbus; > + struct gpio_desc *hub_vbus; > + > + struct usb_role_switch *role_sw; > + struct notifier_block nb; > +}; > + > +static void hub_power_ctrl(struct hisi_hikey_usb *hisi_hikey_usb, int value) > +{ > + gpiod_set_value_cansleep(hisi_hikey_usb->hub_vbus, value); > +} > + > +static void usb_switch_ctrl(struct hisi_hikey_usb *hisi_hikey_usb, > + int switch_to) > +{ > + gpiod_set_value_cansleep(hisi_hikey_usb->otg_switch, switch_to); > +} > + > +static void usb_typec_power_ctrl(struct hisi_hikey_usb *hisi_hikey_usb, > + int value) > +{ > + gpiod_set_value_cansleep(hisi_hikey_usb->typec_vbus, value); > +} > + > +static int hisi_hikey_role_switch(struct notifier_block *nb, > + unsigned long state, void *data) > +{ > + struct hisi_hikey_usb *hisi_hikey_usb; > + > + hisi_hikey_usb = container_of(nb, struct hisi_hikey_usb, nb); > + > + switch (state) { > + case USB_ROLE_NONE: > + usb_typec_power_ctrl(hisi_hikey_usb, TYPEC_VBUS_POWER_OFF); > + usb_switch_ctrl(hisi_hikey_usb, USB_SWITCH_TO_HUB); > + hub_power_ctrl(hisi_hikey_usb, HUB_VBUS_POWER_ON); > + break; > + case USB_ROLE_HOST: > + usb_switch_ctrl(hisi_hikey_usb, USB_SWITCH_TO_TYPEC); > + usb_typec_power_ctrl(hisi_hikey_usb, TYPEC_VBUS_POWER_ON); > + break; > + case USB_ROLE_DEVICE: > + hub_power_ctrl(hisi_hikey_usb, HUB_VBUS_POWER_OFF); > + usb_typec_power_ctrl(hisi_hikey_usb, TYPEC_VBUS_POWER_OFF); > + usb_switch_ctrl(hisi_hikey_usb, USB_SWITCH_TO_TYPEC); > + break; > + default: > + break; > + } > + > + return 0; > +} > + > +static int hisi_hikey_usb_probe(struct platform_device *pdev) > +{ > + struct device *dev = &pdev->dev; > + struct device_node *root = dev->of_node; > + struct hisi_hikey_usb *hisi_hikey_usb; > + int ret; > + > + hisi_hikey_usb = devm_kzalloc(dev, sizeof(*hisi_hikey_usb), GFP_KERNEL); > + if (!hisi_hikey_usb) > + return -ENOMEM; > + > + hisi_hikey_usb->nb.notifier_call = hisi_hikey_role_switch; > + > + hisi_hikey_usb->typec_vbus = devm_gpiod_get(dev, "typec-vbus", > + GPIOD_OUT_LOW); > + if (!hisi_hikey_usb->typec_vbus) > + return -ENOENT; > + else if (IS_ERR(hisi_hikey_usb->typec_vbus)) > + return PTR_ERR(hisi_hikey_usb->typec_vbus); > + > + hisi_hikey_usb->otg_switch = devm_gpiod_get(dev, "otg-switch", > + GPIOD_OUT_HIGH); > + if (!hisi_hikey_usb->otg_switch) > + return -ENOENT; > + else if (IS_ERR(hisi_hikey_usb->otg_switch)) > + return PTR_ERR(hisi_hikey_usb->otg_switch); > + > + /* hub-vdd33-en is optional */ > + hisi_hikey_usb->hub_vbus = devm_gpiod_get(dev, "hub-vdd33-en", > + GPIOD_OUT_HIGH); > + if (IS_ERR(hisi_hikey_usb->hub_vbus)) > + return PTR_ERR(hisi_hikey_usb->hub_vbus); > + > + hisi_hikey_usb->role_sw = usb_role_switch_get(dev); > + if (!hisi_hikey_usb->role_sw) > + return -EPROBE_DEFER; Here return EPROBE_DEFFER means the related device_connection is registered after this probe is called, right? if not, use IS_ERR_OR_NULL then return PTR_ERR is enough > + else if (IS_ERR(hisi_hikey_usb->role_sw)) > + return PTR_ERR(hisi_hikey_usb->role_sw); > + > + ret = usb_role_switch_register_notifier(hisi_hikey_usb->role_sw, > + &hisi_hikey_usb->nb); > + if (ret) { > + usb_role_switch_put(hisi_hikey_usb->role_sw); > + return ret; > + } > + > + platform_set_drvdata(pdev, hisi_hikey_usb); > + > + return 0; > +} > + > +static int hisi_hikey_usb_remove(struct platform_device *pdev) > +{ > + struct hisi_hikey_usb *hisi_hikey_usb = platform_get_drvdata(pdev); > + > + usb_role_switch_unregister_notifier(hisi_hikey_usb->role_sw, > + &hisi_hikey_usb->nb); > + > + usb_role_switch_put(hisi_hikey_usb->role_sw); > + > + return 0; > +} > + > +static const struct of_device_id id_table_hisi_hikey_usb[] = { > + {.compatible = "hisilicon,gpio_hubv1"}, > + {.compatible = "hisilicon,hikey960_usb"}, > + {} > +}; > + > +static struct platform_driver hisi_hikey_usb_driver = { > + .probe = hisi_hikey_usb_probe, > + .remove = hisi_hikey_usb_remove, > + .driver = { > + .name = DEVICE_DRIVER_NAME, > + .of_match_table = id_table_hisi_hikey_usb, > + }, > +}; > + > +module_platform_driver(hisi_hikey_usb_driver); > + > +MODULE_AUTHOR("Yu Chen "); > +MODULE_DESCRIPTION("Driver Support for USB functionality of Hikey"); > +MODULE_LICENSE("GPL v2"); From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-7.0 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_PASS,UNPARSEABLE_RELAY, URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 56C6FC43381 for ; Mon, 4 Mar 2019 01:48:00 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 1CF3A20835 for ; Mon, 4 Mar 2019 01:48:00 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726210AbfCDBr5 (ORCPT ); Sun, 3 Mar 2019 20:47:57 -0500 Received: from Mailgw01.mediatek.com ([1.203.163.78]:33221 "EHLO mailgw01.mediatek.com" rhost-flags-OK-FAIL-OK-FAIL) by vger.kernel.org with ESMTP id S1726012AbfCDBr4 (ORCPT ); Sun, 3 Mar 2019 20:47:56 -0500 X-UUID: 3eff626cd4d04f618078aaf69c398154-20190304 X-UUID: 3eff626cd4d04f618078aaf69c398154-20190304 Received: from mtkcas34.mediatek.inc [(172.27.4.253)] by mailgw01.mediatek.com (envelope-from ) (mailgw01.mediatek.com ESMTP with TLS) with ESMTP id 2053433696; Mon, 04 Mar 2019 09:47:52 +0800 Received: from MTKCAS36.mediatek.inc (172.27.4.186) by MTKMBS31N1.mediatek.inc (172.27.4.69) with Microsoft SMTP Server (TLS) id 15.0.1395.4; Mon, 4 Mar 2019 09:47:50 +0800 Received: from [10.17.3.153] (172.27.4.253) by MTKCAS36.mediatek.inc (172.27.4.170) with Microsoft SMTP Server id 15.0.1395.4 via Frontend Transport; Mon, 4 Mar 2019 09:47:49 +0800 Message-ID: <1551664069.2210.64.camel@mhfsdcap03> Subject: Re: [PATCH v3 10/12] hikey960: Support usb functionality of Hikey960 From: Chunfeng Yun To: Yu Chen CC: , , , , , , , , , , , , , , , , , Andy Shevchenko , Arnd Bergmann , "Greg Kroah-Hartman" , Binghui Wang , Heikki Krogerus Date: Mon, 4 Mar 2019 09:47:49 +0800 In-Reply-To: <20190302090505.65542-11-chenyu56@huawei.com> References: <20190302090505.65542-1-chenyu56@huawei.com> <20190302090505.65542-11-chenyu56@huawei.com> Content-Type: text/plain; charset="UTF-8" X-Mailer: Evolution 3.2.3-0ubuntu6 Content-Transfer-Encoding: 7bit MIME-Version: 1.0 X-MTK: N Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org hi, On Sat, 2019-03-02 at 17:05 +0800, Yu Chen wrote: > This driver handles usb hub power on and typeC port event of HiKey960 board: > 1)DP&DM switching between usb hub and typeC port base on typeC port > state > 2)Control power of usb hub on Hikey960 > 3)Control vbus of typeC port > > Cc: Chunfeng Yun > Cc: Andy Shevchenko > Cc: Arnd Bergmann > Cc: Greg Kroah-Hartman > Cc: John Stultz > Cc: Binghui Wang > Cc: Heikki Krogerus > Signed-off-by: Yu Chen > --- > v1: > * Using gpiod API with the gpios. > * Removing registering usb role switch. > * Registering usb role switch notifier. > v2: > * Fix license declaration. > * Add configuration of gpio direction. > * Remove some log print. > v3: > * Remove property of "typec_vbus_enable_val". > * Remove gpiod_direction_output and set initial value of gpio by devm_gpiod_get. > --- > --- > drivers/misc/Kconfig | 6 ++ > drivers/misc/Makefile | 1 + > drivers/misc/hisi_hikey_usb.c | 167 ++++++++++++++++++++++++++++++++++++++++++ > 3 files changed, 174 insertions(+) > create mode 100644 drivers/misc/hisi_hikey_usb.c > > diff --git a/drivers/misc/Kconfig b/drivers/misc/Kconfig > index f417b06e11c5..8d8b717759e2 100644 > --- a/drivers/misc/Kconfig > +++ b/drivers/misc/Kconfig > @@ -521,6 +521,12 @@ config PVPANIC > a paravirtualized device provided by QEMU; it lets a virtual machine > (guest) communicate panic events to the host. > > +config HISI_HIKEY_USB > + tristate "USB functionality of HiSilicon Hikey Platform" > + depends on OF && GPIOLIB > + help > + If you say yes here you get support for usb functionality of HiSilicon Hikey Platform. > + > source "drivers/misc/c2port/Kconfig" > source "drivers/misc/eeprom/Kconfig" > source "drivers/misc/cb710/Kconfig" > diff --git a/drivers/misc/Makefile b/drivers/misc/Makefile > index e39ccbbc1b3a..dc8892b13a1a 100644 > --- a/drivers/misc/Makefile > +++ b/drivers/misc/Makefile > @@ -59,3 +59,4 @@ obj-$(CONFIG_PCI_ENDPOINT_TEST) += pci_endpoint_test.o > obj-$(CONFIG_OCXL) += ocxl/ > obj-y += cardreader/ > obj-$(CONFIG_PVPANIC) += pvpanic.o > +obj-$(CONFIG_HISI_HIKEY_USB) += hisi_hikey_usb.o > diff --git a/drivers/misc/hisi_hikey_usb.c b/drivers/misc/hisi_hikey_usb.c > new file mode 100644 > index 000000000000..85d6fee468c0 > --- /dev/null > +++ b/drivers/misc/hisi_hikey_usb.c > @@ -0,0 +1,167 @@ > +// SPDX-License-Identifier: GPL-2.0 > +/* > + * Support for usb functionality of Hikey series boards > + * based on Hisilicon Kirin Soc. > + * > + * Copyright (C) 2017-2018 Hilisicon Electronics Co., Ltd. > + * http://www.huawei.com > + * > + * Authors: Yu Chen > + */ > + > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > + > +#define DEVICE_DRIVER_NAME "hisi_hikey_usb" > + > +#define HUB_VBUS_POWER_ON 1 > +#define HUB_VBUS_POWER_OFF 0 > +#define USB_SWITCH_TO_HUB 1 > +#define USB_SWITCH_TO_TYPEC 0 > +#define TYPEC_VBUS_POWER_ON 1 > +#define TYPEC_VBUS_POWER_OFF 0 > + > +struct hisi_hikey_usb { > + struct gpio_desc *otg_switch; > + struct gpio_desc *typec_vbus; > + struct gpio_desc *hub_vbus; > + > + struct usb_role_switch *role_sw; > + struct notifier_block nb; > +}; > + > +static void hub_power_ctrl(struct hisi_hikey_usb *hisi_hikey_usb, int value) > +{ > + gpiod_set_value_cansleep(hisi_hikey_usb->hub_vbus, value); > +} > + > +static void usb_switch_ctrl(struct hisi_hikey_usb *hisi_hikey_usb, > + int switch_to) > +{ > + gpiod_set_value_cansleep(hisi_hikey_usb->otg_switch, switch_to); > +} > + > +static void usb_typec_power_ctrl(struct hisi_hikey_usb *hisi_hikey_usb, > + int value) > +{ > + gpiod_set_value_cansleep(hisi_hikey_usb->typec_vbus, value); > +} > + > +static int hisi_hikey_role_switch(struct notifier_block *nb, > + unsigned long state, void *data) > +{ > + struct hisi_hikey_usb *hisi_hikey_usb; > + > + hisi_hikey_usb = container_of(nb, struct hisi_hikey_usb, nb); > + > + switch (state) { > + case USB_ROLE_NONE: > + usb_typec_power_ctrl(hisi_hikey_usb, TYPEC_VBUS_POWER_OFF); > + usb_switch_ctrl(hisi_hikey_usb, USB_SWITCH_TO_HUB); > + hub_power_ctrl(hisi_hikey_usb, HUB_VBUS_POWER_ON); > + break; > + case USB_ROLE_HOST: > + usb_switch_ctrl(hisi_hikey_usb, USB_SWITCH_TO_TYPEC); > + usb_typec_power_ctrl(hisi_hikey_usb, TYPEC_VBUS_POWER_ON); > + break; > + case USB_ROLE_DEVICE: > + hub_power_ctrl(hisi_hikey_usb, HUB_VBUS_POWER_OFF); > + usb_typec_power_ctrl(hisi_hikey_usb, TYPEC_VBUS_POWER_OFF); > + usb_switch_ctrl(hisi_hikey_usb, USB_SWITCH_TO_TYPEC); > + break; > + default: > + break; > + } > + > + return 0; > +} > + > +static int hisi_hikey_usb_probe(struct platform_device *pdev) > +{ > + struct device *dev = &pdev->dev; > + struct device_node *root = dev->of_node; > + struct hisi_hikey_usb *hisi_hikey_usb; > + int ret; > + > + hisi_hikey_usb = devm_kzalloc(dev, sizeof(*hisi_hikey_usb), GFP_KERNEL); > + if (!hisi_hikey_usb) > + return -ENOMEM; > + > + hisi_hikey_usb->nb.notifier_call = hisi_hikey_role_switch; > + > + hisi_hikey_usb->typec_vbus = devm_gpiod_get(dev, "typec-vbus", > + GPIOD_OUT_LOW); > + if (!hisi_hikey_usb->typec_vbus) > + return -ENOENT; > + else if (IS_ERR(hisi_hikey_usb->typec_vbus)) > + return PTR_ERR(hisi_hikey_usb->typec_vbus); > + > + hisi_hikey_usb->otg_switch = devm_gpiod_get(dev, "otg-switch", > + GPIOD_OUT_HIGH); > + if (!hisi_hikey_usb->otg_switch) > + return -ENOENT; > + else if (IS_ERR(hisi_hikey_usb->otg_switch)) > + return PTR_ERR(hisi_hikey_usb->otg_switch); > + > + /* hub-vdd33-en is optional */ > + hisi_hikey_usb->hub_vbus = devm_gpiod_get(dev, "hub-vdd33-en", > + GPIOD_OUT_HIGH); > + if (IS_ERR(hisi_hikey_usb->hub_vbus)) > + return PTR_ERR(hisi_hikey_usb->hub_vbus); > + > + hisi_hikey_usb->role_sw = usb_role_switch_get(dev); > + if (!hisi_hikey_usb->role_sw) > + return -EPROBE_DEFER; Here return EPROBE_DEFFER means the related device_connection is registered after this probe is called, right? if not, use IS_ERR_OR_NULL then return PTR_ERR is enough > + else if (IS_ERR(hisi_hikey_usb->role_sw)) > + return PTR_ERR(hisi_hikey_usb->role_sw); > + > + ret = usb_role_switch_register_notifier(hisi_hikey_usb->role_sw, > + &hisi_hikey_usb->nb); > + if (ret) { > + usb_role_switch_put(hisi_hikey_usb->role_sw); > + return ret; > + } > + > + platform_set_drvdata(pdev, hisi_hikey_usb); > + > + return 0; > +} > + > +static int hisi_hikey_usb_remove(struct platform_device *pdev) > +{ > + struct hisi_hikey_usb *hisi_hikey_usb = platform_get_drvdata(pdev); > + > + usb_role_switch_unregister_notifier(hisi_hikey_usb->role_sw, > + &hisi_hikey_usb->nb); > + > + usb_role_switch_put(hisi_hikey_usb->role_sw); > + > + return 0; > +} > + > +static const struct of_device_id id_table_hisi_hikey_usb[] = { > + {.compatible = "hisilicon,gpio_hubv1"}, > + {.compatible = "hisilicon,hikey960_usb"}, > + {} > +}; > + > +static struct platform_driver hisi_hikey_usb_driver = { > + .probe = hisi_hikey_usb_probe, > + .remove = hisi_hikey_usb_remove, > + .driver = { > + .name = DEVICE_DRIVER_NAME, > + .of_match_table = id_table_hisi_hikey_usb, > + }, > +}; > + > +module_platform_driver(hisi_hikey_usb_driver); > + > +MODULE_AUTHOR("Yu Chen "); > +MODULE_DESCRIPTION("Driver Support for USB functionality of Hikey"); > +MODULE_LICENSE("GPL v2");