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: [RFC,v2,05/15] usb:cdns3: Added DRD support From: Roger Quadros Message-Id: <5BFBA9BC.20306@ti.com> Date: Mon, 26 Nov 2018 10:07:24 +0200 To: Pawel Laszczak , "devicetree@vger.kernel.org" Cc: "gregkh@linuxfoundation.org" , "linux-usb@vger.kernel.org" , "linux-kernel@vger.kernel.org" , Alan Douglas , "jbergsagel@ti.com" , "nsekhar@ti.com" , "nm@ti.com" , Suresh Punnoose , "peter.chen@nxp.com" , Pawel Jez , Rahul Kumar List-ID: UGF3ZWwsCgpPbiAyNi8xMS8xOCAwOToyMywgUGF3ZWwgTGFzemN6YWsgd3JvdGU6Cj4gSGkgUm9n ZXIsCj4gCj4+IE9uIDE4LzExLzE4IDEyOjA5LCBQYXdlbCBMYXN6Y3phayB3cm90ZToKPj4+IFBh dGNoIGFkZHMgc3VwcG9ydHMgZm9yIGRldGVjdGluZyBIb3N0L0RldmljZSBtb2RlLgo+Pj4gQ29u dHJvbGxlciBoYXMgYWRkaXRpb25hbCBPVEcgcmVnaXN0ZXIgdGhhdCBhbGxvdwo+Pj4gaW1wbGVt ZW50IGV2ZW4gd2hvbGUgT1RHIGZ1bmN0aW9uYWxpdHkuCj4+PiBBdCB0aGlzIG1vbWVudCBwYXRj aCBhZGRzIHN1cHBvcnQgb25seSBmb3IgZGV0ZWN0aW5nCj4+PiB0aGUgYXBwcm9wcmlhdGUgbW9k ZSBiYXNlZCBvbiBzdHJhcCBwaW5zIGFuZCBJRCBwaW4uCj4+Pgo+Pj4gU2lnbmVkLW9mZi1ieTog UGF3ZWwgTGFzemN6YWsgPHBhd2VsbEBjYWRlbmNlLmNvbT4KPj4+IC0tLQo+Pj4gIGRyaXZlcnMv dXNiL2NkbnMzL01ha2VmaWxlIHwgICAyICstCj4+PiAgZHJpdmVycy91c2IvY2RuczMvY29yZS5j ICAgfCAgMjcgKysrLS0KPj4+ICBkcml2ZXJzL3VzYi9jZG5zMy9kcmQuYyAgICB8IDIyOSArKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrCj4+PiAgZHJpdmVycy91c2IvY2RuczMv ZHJkLmggICAgfCAxMjIgKysrKysrKysrKysrKysrKysrKysKPj4+ICA0IGZpbGVzIGNoYW5nZWQs IDM3MiBpbnNlcnRpb25zKCspLCA4IGRlbGV0aW9ucygtKQo+Pj4gIGNyZWF0ZSBtb2RlIDEwMDY0 NCBkcml2ZXJzL3VzYi9jZG5zMy9kcmQuYwo+Pj4gIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJz L3VzYi9jZG5zMy9kcmQuaAo+Pj4KPj4+IGRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jZG5zMy9N YWtlZmlsZSBiL2RyaXZlcnMvdXNiL2NkbnMzL01ha2VmaWxlCj4+PiBpbmRleCAwMmQyNWIyM2M1 ZDMuLmU3NzliMmEyZjhlYiAxMDA2NDQKPj4+IC0tLSBhL2RyaXZlcnMvdXNiL2NkbnMzL01ha2Vm aWxlCj4+PiArKysgYi9kcml2ZXJzL3VzYi9jZG5zMy9NYWtlZmlsZQo+Pj4gQEAgLTEsNSArMSw1 IEBACj4+PiAgb2JqLSQoQ09ORklHX1VTQl9DRE5TMykJCQkrPSBjZG5zMy5vCj4+PiAgb2JqLSQo Q09ORklHX1VTQl9DRE5TM19QQ0lfV1JBUCkJKz0gY2RuczMtcGNpLm8KPj4+Cj4+PiAtY2RuczMt eQkJCQkJOj0gY29yZS5vCj4+PiArY2RuczMteQkJCQkJOj0gY29yZS5vIGRyZC5vCj4+PiAgY2Ru czMtcGNpLXkJCSAJCTo9IGNkbnMzLXBjaS13cmFwLm8KPj4+IGRpZmYgLS1naXQgYS9kcml2ZXJz L3VzYi9jZG5zMy9jb3JlLmMgYi9kcml2ZXJzL3VzYi9jZG5zMy9jb3JlLmMKPj4+IGluZGV4IGY5 MDU1ZDRkYTY3Zi4uZGJlZTQzMjVkYTdmIDEwMDY0NAo+Pj4gLS0tIGEvZHJpdmVycy91c2IvY2Ru czMvY29yZS5jCj4+PiArKysgYi9kcml2ZXJzL3VzYi9jZG5zMy9jb3JlLmMKPj4+IEBAIC0xNyw2 ICsxNyw3IEBACj4+Pgo+Pj4gICNpbmNsdWRlICJnYWRnZXQuaCIKPj4+ICAjaW5jbHVkZSAiY29y ZS5oIgo+Pj4gKyNpbmNsdWRlICJkcmQuaCIKPj4+Cj4+PiAgc3RhdGljIGlubGluZSBzdHJ1Y3Qg Y2RuczNfcm9sZV9kcml2ZXIgKmNkbnMzX2dldF9jdXJyZW50X3JvbGVfZHJpdmVyKHN0cnVjdCBj ZG5zMyAqY2RucykKPj4+ICB7Cj4+PiBAQCAtNTcsOCArNTgsMTAgQEAgc3RhdGljIGlubGluZSB2 b2lkIGNkbnMzX3JvbGVfc3RvcChzdHJ1Y3QgY2RuczMgKmNkbnMpCj4+PiAgc3RhdGljIGVudW0g Y2RuczNfcm9sZXMgY2RuczNfZ2V0X3JvbGUoc3RydWN0IGNkbnMzICpjZG5zKQo+Pj4gIHsKPj4+ ICAJaWYgKGNkbnMtPnJvbGVzW0NETlMzX1JPTEVfSE9TVF0gJiYgY2Rucy0+cm9sZXNbQ0ROUzNf Uk9MRV9HQURHRVRdKSB7Cj4+PiAtCQkvL1RPRE86IGltcGxlbWVudHMgc2VsZWN0aW5nIGRldmlj ZS9ob3N0IG1vZGUKPj4+IC0JCXJldHVybiBDRE5TM19ST0xFX0hPU1Q7Cj4+PiArCQlpZiAoY2Ru czNfaXNfaG9zdChjZG5zKSkKPj4+ICsJCQlyZXR1cm4gQ0ROUzNfUk9MRV9IT1NUOwo+Pj4gKwkJ aWYgKGNkbnMzX2lzX2RldmljZShjZG5zKSkKPj4+ICsJCQlyZXR1cm4gQ0ROUzNfUk9MRV9HQURH RVQ7Cj4+PiAgCX0KPj4+ICAJcmV0dXJuIGNkbnMtPnJvbGVzW0NETlMzX1JPTEVfSE9TVF0KPj4+ ICAJCT8gQ0ROUzNfUk9MRV9IT1NUCj4+PiBAQCAtMTI0LDYgKzEyNywxMiBAQCBzdGF0aWMgaXJx cmV0dXJuX3QgY2RuczNfaXJxKGludCBpcnEsIHZvaWQgKmRhdGEpCj4+PiAgCXN0cnVjdCBjZG5z MyAqY2RucyA9IGRhdGE7Cj4+PiAgCWlycXJldHVybl90IHJldCA9IElSUV9OT05FOwo+Pj4KPj4+ ICsJaWYgKGNkbnMtPmRyX21vZGUgPT0gVVNCX0RSX01PREVfT1RHKSB7Cj4+PiArCQlyZXQgPSBj ZG5zM19kcmRfaXJxKGNkbnMpOwo+Pj4gKwkJaWYgKHJldCA9PSBJUlFfSEFORExFRCkKPj4+ICsJ CQlyZXR1cm4gcmV0Owo+Pj4gKwl9Cj4+Cj4+IFRoZSBrZXJuZWwncyBzaGFyZWQgSVJRIG1vZGVs IHRha2VzIGNhcmUgb2Ygc2hhcmluZyB0aGUgc2FtZSBpbnRlcnJ1cHQKPj4gYmV0d2VlbiBkaWZm ZXJlbnQgZGV2aWNlcyBhbmQgdGhlaXIgZHJpdmVycy4gWW91IGRvbid0IG5lZWQgdG8gbWFudWFs bHkKPj4gaGFuZGxlIGl0IGhlcmUuIEp1c3QgbGV0IGFsbCAzIGRyaXZlcnMgZG8gYSByZXF1ZXN0 X2lycSgpIGFuZCBoYXZlCj4+IGhhbmRsZXJzIGNoZWNrIGlmIHRoZSBJUlEgd2FzIHRoZWlycyBv ciBub3QgYW5kIHJldHVybiBJUlFfSEFORExFRCBvcgo+PiBJUlFfTk9ORSBhY2NvcmRpbmdseS4K Pj4KPj4gTG9va3MgbGlrZSB5b3UgY2FuIGRvIGF3YXkgd2l0aCBpcnEgbWVtYmVyIG9mIHRoZSBy b2xlIGRyaXZlciBzdHJ1Y3QuCj4gCj4gT2ssIEkgd2lsbCBzcGxpdCBpdCBpbnRvIDMgc2VwYXJh dGUgcGFydCwgYnV0IGluIHRoaXMgY2FzZSwgSSBhZGRpdGlvbmFsbHkgaGF2ZSB0byBjaGVjayB0 aGUgY3VycmVudCAKPiByb2xlIGluIElTUiBmdW5jdGlvbi4gRHJpdmVyIGNhbid0IHJlYWQgaG9z dCBzaWRlIHJlZ2lzdGVycyB3aGVuIGNvbnRyb2xsZXIgd29ya3MgaW4gZGV2aWNlIHJvbGUgCj4g YW5kIHZpY2UgdmVyc2EuIE9uZSBwYXJ0IG9mIGNvbnRyb2xsZXIgaXMga2VwdCBpbiByZXNldC4g T25seSBEUkQgcmVnaXN0ZXJzIGFyZSBjb21tb24gYW5kIGFyZSBhbGwgYWNjZXNzaWJsZS4KPiAK CkluIHdoaWNoIElTUiBkbyB5b3UgbmVlZCB0byBjaGVjayBjdXJyZW50IHJvbGU/CgpJJ20gbm90 IHN1cmUgaWYgd2UgYXJlIG9uIHRoZSBzYW1lIHBhZ2UuCkNvcmUgKGRyZCkgZHJpdmVyIHNob3Vs ZG4ndCByZWFkIGhvc3QvZGV2aWNlIHNpZGUgcmVnaXN0ZXJzLiBBbGwgMyBkcml2ZXJzLAppLmUu IERSRChjb3JlKSwgSG9zdCAoeGhjaSkgYW5kIGRldmljZSAoY2RuczMpIHNob3VsZCBkbyBhIHJl cXVlc3RfaXJxKCkKYW5kIHByb2Nlc3MgdGhlaXIgcmVzcGVjdGl2ZSBJUlEgZXZlbnRzLgoKPj4+ ICsKPj4+ICAJLyogSGFuZGxlIGRldmljZS9ob3N0IGludGVycnVwdCAqLwo+Pj4gIAlpZiAoY2Ru cy0+cm9sZSAhPSBDRE5TM19ST0xFX0VORCkKPj4+ICAJCXJldCA9IGNkbnMzX2dldF9jdXJyZW50 X3JvbGVfZHJpdmVyKGNkbnMpLT5pcnEoY2Rucyk7Cj4+PiBAQCAtMTc2LDExICsxODUsOCBAQCBz dGF0aWMgdm9pZCBjZG5zM19yb2xlX3N3aXRjaChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCj4+ Pgo+Pj4gIAljZG5zID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBjZG5zMywgcm9sZV9zd2l0 Y2hfd3EpOwo+Pj4KPj4+IC0JLy9UT0RPOiBpbXBsZW1lbnRzIHRoaXMgZnVuY3Rpb25zLgo+Pj4g LQkvL2hvc3QgPSBjZG5zM19pc19ob3N0KGNkbnMpOwo+Pj4gLQkvL2RldmljZSA9IGNkbnMzX2lz X2RldmljZShjZG5zKTsKPj4+IC0JaG9zdCA9IDE7Cj4+PiAtCWRldmljZSA9IDA7Cj4+PiArCWhv c3QgPSBjZG5zM19pc19ob3N0KGNkbnMpOwo+Pj4gKwlkZXZpY2UgPSBjZG5zM19pc19kZXZpY2Uo Y2Rucyk7Cj4+Cj4+IFdoYXQgaWYgdGhlcmUgaXMgYSBJRCB0cmFuc2l0aW9uIGJldHdlZW4gdGhl IDIgZnVuY3Rpb25zIHNvIHRoYXQKPj4gYW5kIGJvdGggaG9zdCBhbmQgZGV2aWNlIGJlY29tZSB0 cnVlPwo+PiBTaW5jZSB5b3UgYXJlIGNoZWNraW5nIHRoZSBJRCBsZXZlbCBzZXBhcmF0ZWx5IGlu IGJvdGggdGhlIGZ1bmN0aW9ucy4KPj4KPj4gSG93IGFib3V0IGluc3RlYWQgaGF2aW5nIGNkbnMz X2dldF9pZCgpIGFuZCB1c2luZwo+PiBpdCB0byBzdGFydC9zdG9wIHJlbGV2YW50IHJvbGVzIGlm IHdlIGFyZSBpbiBPVEcgbW9kZS4KPj4KPj4gSXMgdGhpcyBnb2luZyB0byBiZSB1c2VkIGZvciBh IHJvbGUgc3dpdGNoIGV2ZW4gaWYgd2UncmUgbm90IGluIE9URyBtb2RlPwo+PiBJZiBub3QgdGhl biBpdCBpcyBhIEJVRyBpZiB3ZSBnZXQgaGVyZS4KPj4KPiBHb29kIHBvaW50Lgo+IFVzZXIgY2Fu IGNoYW5nZSBjdXJyZW50IG1vZGUgYnkgZGVidWdmcyBhbmQgdGhlbiB0aGlzIGZ1bmN0aW9uIHdp bGwgYWxzbyBpbnZva2VkLgo+IFByb2JhYmx5IEkgdXNlICBjZG5zM19nZXRfaWQgYXMgeW91IHN1 Z2dlc3QuIAo+IAo+Pj4KPj4+ICAJaWYgKGhvc3QpCj4+PiAgCQlyb2xlID0gQ0ROUzNfUk9MRV9I T1NUOwo+Pj4gQEAgLTE5NCw2ICsyMDAsMTIgQEAgc3RhdGljIHZvaWQgY2RuczNfcm9sZV9zd2l0 Y2goc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQo+Pj4gIAlwbV9ydW50aW1lX2dldF9zeW5jKGNk bnMtPmRldik7Cj4+PiAgCWNkbnMzX3JvbGVfc3RvcChjZG5zKTsKPj4+Cj4+PiArCWlmIChjZG5z LT5kZXNpcmVkX2RyX21vZGUgIT0gY2Rucy0+Y3VycmVudF9kcl9tb2RlKSB7Cj4+Cj4+IFRoaXMg aXMgYWJvdXQgcm9sZXMsIHdoeSBhcmUgd2UgY2hlY2tpbmcgZHJfbW9kZSBoZXJlPwo+IAo+IEJl Y2F1c2UgYWZ0ZXIgY2hhbmdpbmcgZHJfbW9kZSBieSBtZWFucyBvZiBkZWJ1Z2ZzIHdlIG5lZWQg dG8gdXBkYXRlIG1vZGUuIAo+IERyaXZlciBzaG91bGQgZG8gdGhpcyBhZnRlciBzdG9wcGluZyB0 aGUgcHJldmlvdXMgcm9sZS4gIEkgd2lsbCBtb3ZlIHRoaXMgY29uZGl0aW9uIAo+IHRvIGNkbnMz X2RyZF91cGRhdGVfbW9kZSBhbmQgYWRkIGNvbW1lbnQgaW4gdGhpcyBwbGFjZS4gCj4gCj4+Cj4+ PiArCQljZG5zM19kcmRfdXBkYXRlX21vZGUoY2Rucyk7Cj4+PiArCQlob3N0ID0gY2RuczNfaXNf aG9zdChjZG5zKTsKPj4+ICsJCWRldmljZSA9IGNkbnMzX2lzX2RldmljZShjZG5zKTsKPj4+ICsJ fQo+Pj4gKwo+Pj4gIAlpZiAoaG9zdCkgewo+Pj4gIAkJaWYgKGNkbnMtPnJvbGVzW0NETlMzX1JP TEVfSE9TVF0pCj4+PiAgCQkJY2RuczNfZG9fcm9sZV9zd2l0Y2goY2RucywgQ0ROUzNfUk9MRV9I T1NUKTsKPj4+IEBAIC0yODcsNiArMjk5LDcgQEAgc3RhdGljIGludCBjZG5zM19wcm9iZShzdHJ1 Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQo+Pj4gIAlpZiAocmV0KQo+Pj4gIAkJZ290byBlcnIy Owo+Pj4KPj4+ICsJcmV0ID0gY2RuczNfZHJkX2luaXQoY2Rucyk7Cj4+PiAgCWlmIChyZXQpCj4+ PiAgCQlnb3RvIGVycjI7Cj4+Pgo+Pj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NkbnMzL2Ry ZC5jIGIvZHJpdmVycy91c2IvY2RuczMvZHJkLmMKPj4+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0Cj4+ PiBpbmRleCAwMDAwMDAwMDAwMDAuLmFjNzQxYzgwZTc3Ngo+Pj4gLS0tIC9kZXYvbnVsbAo+Pj4g KysrIGIvZHJpdmVycy91c2IvY2RuczMvZHJkLmMKPj4+IEBAIC0wLDAgKzEsMjI5IEBACj4+PiAr Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAKPj4+ICsvKgo+Pj4gKyAqIENhZGVu Y2UgVVNCU1MgRFJEIERyaXZlci4KPj4+ICsgKgo+Pj4gKyAqIENvcHlyaWdodCAoQykgMjAxOCBD YWRlbmNlLgo+Pj4gKyAqCj4+PiArICogQXV0aG9yOiBQYXdlbCBMYXN6Y3phayA8cGF3ZWxsQGNh ZGVuY2UuY29tCj4+PiArICoKPj4+ICsgKi8KPj4+ICsjaW5jbHVkZSA8bGludXgva2VybmVsLmg+ Cj4+PiArI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgo+Pj4gKyNpbmNsdWRlIDxsaW51eC9k ZWxheS5oPgo+Pj4gKyNpbmNsdWRlIDxsaW51eC91c2Ivb3RnLmg+Cj4+PiArCj4+PiArI2luY2x1 ZGUgImdhZGdldC5oIgo+Pj4gKyNpbmNsdWRlICJkcmQuaCIKPj4+ICsKPj4+ICsvKioKPj4+ICsg KiBjZG5zM19zZXRfbW9kZSAtIGNoYW5nZSBtb2RlIG9mIE9URyBDb3JlCj4+PiArICogQGNkbnM6 IHBvaW50ZXIgdG8gY29udGV4dCBzdHJ1Y3R1cmUKPj4+ICsgKiBAbW9kZTogc2VsZWN0ZWQgbW9k ZSBmcm9tIGNkbnNfcm9sZQo+Pj4gKyAqLwo+Pj4gK3ZvaWQgY2RuczNfc2V0X21vZGUoc3RydWN0 IGNkbnMzICpjZG5zLCBlbnVtIHVzYl9kcl9tb2RlIG1vZGUpCj4+PiArewo+Pj4gKwl1MzIgcmVn Owo+Pj4gKwo+Pj4gKwljZG5zLT5jdXJyZW50X2RyX21vZGUgPSBtb2RlOwo+Pj4gKwlzd2l0Y2gg KG1vZGUpIHsKPj4+ICsJY2FzZSBVU0JfRFJfTU9ERV9QRVJJUEhFUkFMOgo+Pj4gKwkJZGV2X2lu Zm8oY2Rucy0+ZGV2LCAiU2V0IGNvbnRyb2xsZXIgdG8gR2FkZ2V0IG1vZGVcbiIpOwo+Pj4gKwkJ d3JpdGVsKE9UR0NNRF9ERVZfQlVTX1JFUSB8IE9UR0NNRF9PVEdfRElTLAo+Pj4gKwkJICAgICAg ICZjZG5zLT5vdGdfcmVncy0+Y21kKTsKPj4+ICsJCWJyZWFrOwo+Pj4gKwljYXNlIFVTQl9EUl9N T0RFX0hPU1Q6Cj4+PiArCQlkZXZfaW5mbyhjZG5zLT5kZXYsICJTZXQgY29udHJvbGxlciB0byBI b3N0IG1vZGVcbiIpOwo+Pj4gKwkJd3JpdGVsKE9UR0NNRF9IT1NUX0JVU19SRVEgfCBPVEdDTURf T1RHX0RJUywKPj4+ICsJCSAgICAgICAmY2Rucy0+b3RnX3JlZ3MtPmNtZCk7Cj4+PiArCQlicmVh azsKPj4+ICsJY2FzZSBVU0JfRFJfTU9ERV9PVEc6Cj4+PiArCQlkZXZfaW5mbyhjZG5zLT5kZXYs ICJTZXQgY29udHJvbGxlciB0byBPVEcgbW9kZVxuIik7Cj4+PiArCQlyZWcgPSByZWFkbCgmY2Ru cy0+b3RnX3JlZ3MtPmN0cmwxKTsKPj4+ICsJCXJlZyB8PSBPVEdDVFJMMV9JRFBVTExVUDsKPj4+ ICsJCXdyaXRlbChyZWcsICZjZG5zLT5vdGdfcmVncy0+Y3RybDEpOwo+Pj4gKwo+Pj4gKwkJLyog d2FpdCB1bnRpbCB2YWxpZCBJRCAoSURfVkFMVUUpIGNhbiBiZSBzYW1wbGVkICg1MG1zKS4gKi8K Pj4+ICsJCW1kZWxheSg1MCk7Cj4+PiArCQlicmVhazsKPj4+ICsJZGVmYXVsdDoKPj4+ICsJCWNk bnMtPmN1cnJlbnRfZHJfbW9kZSA9IFVTQl9EUl9NT0RFX1VOS05PV047Cj4+PiArCQlkZXZfZXJy KGNkbnMtPmRldiwgIlVuc3VwcG9ydGVkIG1vZGUgb2Ygb3BlcmF0aW9uICVkXG4iLCBtb2RlKTsK Pj4+ICsJCXJldHVybjsKPj4+ICsJfQo+Pj4gK30KPj4+ICsKPj4+ICtzdGF0aWMgaW50IGNkbnMz X290Z19nZXRfaWQoc3RydWN0IGNkbnMzICpjZG5zKQo+Pj4gK3sKPj4+ICsJaW50IGlkOwo+Pj4g Kwo+Pj4gKwlpZCA9IHJlYWRsKCZjZG5zLT5vdGdfcmVncy0+c3RzKSAmIE9UR1NUU19JRF9WQUxV RTsKPj4+ICsJZGV2X2RiZyhjZG5zLT5kZXYsICJPVEcgSUQ6ICVkIiwgaWQpOwo+Pj4gKwlyZXR1 cm4gaWQ7Cj4+PiArfQo+Pj4gKwo+Pj4gK2ludCBjZG5zM19pc19ob3N0KHN0cnVjdCBjZG5zMyAq Y2RucykKPj4+ICt7Cj4+PiArCWlmIChjZG5zLT5jdXJyZW50X2RyX21vZGUgPT0gVVNCX0RSX01P REVfSE9TVCkKPj4+ICsJCXJldHVybiAxOwo+Pgo+PiBXaHkgZG8geW91IG5lZWQgdGhpcz8KPiAK PiBJIGFzc3VtZWQgdGhhdCBzb21lIFNvQyBjb3VsZCBoYXZlIGN1dCBEUkQgL09URyBhbmQgRGV2 aWNlIG9yIEhvc3QgcGFydC4gCj4gSW4gc3VjaCBjYXNlIHRoZSBkcml2ZXIgY2Fubm90IGJlIGJh c2VkIG9uIElEIHBpbi4gCj4gRm9yIG9ubHkgSE9TVCBpdCdzIG5vdCBhIHByb2JsZW0gYmVjYXVz ZSAKPiB0aGUgc3RhbmRhcmQgWEhDSSBkcml2ZXIgd2lsbCBiZSB1c2VkLiAgUHJvYmFibHkgSSB3 aWxsIHJlbW92ZSB0aGlzIGZyYWdtZW50Lgo+Pgo+Pj4gKwllbHNlIGlmIChjZG5zLT5jdXJyZW50 X2RyX21vZGUgPT0gVVNCX0RSX01PREVfT1RHKQo+Pj4gKwkJaWYgKCFjZG5zM19vdGdfZ2V0X2lk KGNkbnMpKQo+Pj4gKwkJCXJldHVybiAxOwo+Pj4gKwo+Pj4gKwlyZXR1cm4gMDsKPj4+ICt9Cj4+ PiArCj4+PiAraW50IGNkbnMzX2lzX2RldmljZShzdHJ1Y3QgY2RuczMgKmNkbnMpCj4+PiArewo+ Pj4gKwlpZiAoY2Rucy0+Y3VycmVudF9kcl9tb2RlID09IFVTQl9EUl9NT0RFX1BFUklQSEVSQUwp Cj4+PiArCQlyZXR1cm4gMTsKPj4+ICsJZWxzZSBpZiAoY2Rucy0+Y3VycmVudF9kcl9tb2RlID09 IFVTQl9EUl9NT0RFX09URykKPj4+ICsJCWlmIChjZG5zM19vdGdfZ2V0X2lkKGNkbnMpKQo+Pj4g KwkJCXJldHVybiAxOwo+Pj4gKwo+Pj4gKwlyZXR1cm4gMDsKPj4+ICt9Cj4+PiArCj4+PiArLyoq Cj4+PiArICogY2RuczNfb3RnX2Rpc2FibGVfaXJxIC0gRGlzYWJsZSBhbGwgT1RHIGludGVycnVw dHMKPj4+ICsgKiBAY2RuczogUG9pbnRlciB0byBjb250cm9sbGVyIGNvbnRleHQgc3RydWN0dXJl Cj4+PiArICovCj4+PiArc3RhdGljIHZvaWQgY2RuczNfb3RnX2Rpc2FibGVfaXJxKHN0cnVjdCBj ZG5zMyAqY2RucykKPj4+ICt7Cj4+PiArCXdyaXRlbCgwLCAmY2Rucy0+b3RnX3JlZ3MtPmllbik7 Cj4+PiArfQo+Pj4gKwo+Pj4gKy8qKgo+Pj4gKyAqIGNkbnMzX290Z19lbmFibGVfaXJxIC0gZW5h YmxlIGlkIGFuZCBzZXNzX3ZhbGlkIGludGVycnVwdHMKPj4+ICsgKiBAY2RuczogUG9pbnRlciB0 byBjb250cm9sbGVyIGNvbnRleHQgc3RydWN0dXJlCj4+PiArICovCj4+PiArc3RhdGljIHZvaWQg Y2RuczNfb3RnX2VuYWJsZV9pcnEoc3RydWN0IGNkbnMzICpjZG5zKQo+Pj4gK3sKPj4+ICsJd3Jp dGVsKE9UR0lFTl9JRF9DSEFOR0VfSU5UIHwgT1RHSUVOX1ZCVVNWQUxJRF9SSVNFX0lOVCB8Cj4+ PiArCSAgICAgICBPVEdJRU5fVkJVU1ZBTElEX0ZBTExfSU5ULCAmY2Rucy0+b3RnX3JlZ3MtPmll bik7Cj4+PiArfQo+Pj4gKwo+Pj4gKy8qKgo+Pj4gKyAqIGNkbnMzX2luaXRfb3RnX21vZGUgLSBp bml0aWFsaXplIGRyZCBjb250cm9sbGVyCj4+PiArICogQGNkbnM6IFBvaW50ZXIgdG8gY29udHJv bGxlciBjb250ZXh0IHN0cnVjdHVyZQo+Pj4gKyAqCj4+PiArICogUmV0dXJucyAwIG9uIHN1Y2Nl c3Mgb3RoZXJ3aXNlIG5lZ2F0aXZlIGVycm5vCj4+PiArICovCj4+PiArc3RhdGljIHZvaWQgY2Ru czNfaW5pdF9vdGdfbW9kZShzdHJ1Y3QgY2RuczMgKmNkbnMpCj4+PiArewo+Pj4gKwljZG5zM19v dGdfZGlzYWJsZV9pcnEoY2Rucyk7Cj4+PiArCS8qIGNsZWFyIGFsbCBpbnRlcnJ1cHRzICovCj4+ PiArCXdyaXRlbCh+MCwgJmNkbnMtPm90Z19yZWdzLT5pdmVjdCk7Cj4+PiArCj4+PiArCWNkbnMz X3NldF9tb2RlKGNkbnMsIFVTQl9EUl9NT0RFX09URyk7Cj4+PiArCj4+PiArCWNkbnMzX290Z19l bmFibGVfaXJxKGNkbnMpOwo+Pj4gK30KPj4+ICsKPj4+ICsvKioKPj4+ICsgKiBjZG5zM19kcmRf dXBkYXRlX21vZGUgLSBpbml0aWFsaXplIG1vZGUgb2Ygb3BlcmF0aW9uCj4+Cj4+IExvb2tzIGxp a2UgdGhpcyB3aWxsIGJlIGNhbGxlZCBvbmx5IG9uY2UuIEhvdyBhYm91dCBjYWxsaW5nIGl0Cj4+ Cj4+IGNkbnMzX2RyZF9pbml0X21vZGUoKT8KPiAKPiBJdCB3aWxsIGJlIGFsc28gY2FsbGVkIGFm dGVyIGNoYW5naW5nIGRyX21vZGUgZnJvbSBkZWJ1Z2ZzLgo+IAo+Pj4gKyAqIEBjZG5zOiBQb2lu dGVyIHRvIGNvbnRyb2xsZXIgY29udGV4dCBzdHJ1Y3R1cmUKPj4+ICsgKgo+Pj4gKyAqIFJldHVy bnMgMCBvbiBzdWNjZXNzIG90aGVyd2lzZSBuZWdhdGl2ZSBlcnJubwo+Pj4gKyAqLwo+Pj4gK2lu dCBjZG5zM19kcmRfdXBkYXRlX21vZGUoc3RydWN0IGNkbnMzICpjZG5zKQo+Pj4gK3sKPj4+ICsJ aW50IHJldCA9IDA7Cj4+PiArCj4+PiArCXN3aXRjaCAoY2Rucy0+ZGVzaXJlZF9kcl9tb2RlKSB7 Cj4+Cj4+IEkgdGhpbmsgd2UgY2FuIGdldCByaWQgb2YgZGVzaXJlZF9kcl9tb2RlIG1lbWJlciBp biBzdHJ1Y3QgY2Rucy4KPj4gSnVzdCBwYXNzIHRoZSBtb2RlIGFzIGFuIGFyZ3VtZW50IHRvIGNk bnMzX2RyZF9pbml0X21vZGUoKQo+IAo+IFRoaXMgd2lsbCBiZSB1c2VkIGFsc28gaW4gcGF0Y2gg dGhhdCBpbnRyb2R1Y2UgZGVidWdmcy4gVGhpcyBmaWxlZCBpcyBhbHNvIHVzZWQgCj4gZHVyaW5n IGNoYW5naW5nIGRyX21vZGUgZnJvbSB1c2VyIHNwYWNlLgo+IAo+IE15IGludGVudGlvbiB3YXM6 Cj4gZHJfbW9kZSAtIGluZGljYXRlZCB3aGF0IGRyaXZlciBjYW4gc3VwcG9ydCwgdGhpcyBmaWxl ZCBiYXNlZCBvbiBkcl9tb2RlIGZyb20gZGV2aWNlIHRyZWUsIAo+IAkgICAgIHN0cmFwcyBiaXRz IGZyb20gb3RnIHJlZ2lzdGVyIGFuZCBrZXJuZWwgY29uZmlndXJhdGlvbi4gCj4gZGVzaXJlZF8g ZHJfbW9kZSAtIHRoZSBuZXh0IG1vZGUgZGVzaXJlZCBieSB1c2VyLCBjaGFuZ2VkIGJ5IGRlYnVn ZnMgCj4gY3VycmVudF9kcl9tb2RlICAtIGFjdHVhbGx5IHNlbGVjdGVkIG1vZGUgCj4gCgpPSywg bWFrZXMgc2Vuc2UuIEJ1dCBsZXQncyBrZWVwIHRoaXMgcGF0Y2ggc2ltcGxlLiBBZGQgb25seSB0 aGUgbWVtYmVycyB5b3UgbmVlZCByaWdodCBub3cuCkludHJvZHVjZSB0aGUgbmV3IG9uZSAoZGVz aXJlZF9kcl9tb2RlKSBpbiB0aGUgZGVidWdmcyBwYXRjaC4KCj4+Cj4+IEFuZCB3ZSBhbHJlYWR5 IGhhdmUgY2Rucy0+ZHJfbW9kZS4KPj4KPj4+ICsJY2FzZSBVU0JfRFJfTU9ERV9QRVJJUEhFUkFM Ogo+Pj4gKwkJY2RuczNfc2V0X21vZGUoY2RucywgVVNCX0RSX01PREVfUEVSSVBIRVJBTCk7Cj4+ PiArCQlicmVhazsKPj4+ICsJY2FzZSBVU0JfRFJfTU9ERV9IT1NUOgo+Pj4gKwkJY2RuczNfc2V0 X21vZGUoY2RucywgVVNCX0RSX01PREVfSE9TVCk7Cj4+PiArCQlicmVhazsKPj4+ICsJY2FzZSBV U0JfRFJfTU9ERV9PVEc6Cj4+PiArCQljZG5zM19pbml0X290Z19tb2RlKGNkbnMpOwo+Pj4gKwkJ YnJlYWs7Cj4+PiArCWRlZmF1bHQ6Cj4+PiArCQlkZXZfZXJyKGNkbnMtPmRldiwgIlVuc3VwcG9y dGVkIG1vZGUgb2Ygb3BlcmF0aW9uICVkXG4iLAo+Pj4gKwkJCWNkbnMtPmRyX21vZGUpOwo+Pj4g KwkJcmV0dXJuIC1FSU5WQUw7Cj4+PiArCX0KPj4+ICsKPj4+ICsJcmV0dXJuIHJldDsKPj4+ICt9 Cgo8c25pcD4KCmNoZWVycywKLXJvZ2VyCg== From mboxrd@z Thu Jan 1 00:00:00 1970 From: Roger Quadros Subject: Re: [RFC PATCH v2 05/15] usb:cdns3: Added DRD support Date: Mon, 26 Nov 2018 10:07:24 +0200 Message-ID: <5BFBA9BC.20306@ti.com> References: <1542535751-16079-1-git-send-email-pawell@cadence.com> <1542535751-16079-6-git-send-email-pawell@cadence.com> <5BF8140C.7000605@ti.com> Mime-Version: 1.0 Content-Type: text/plain; charset="windows-1252" Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: Sender: linux-kernel-owner@vger.kernel.org To: Pawel Laszczak , "devicetree@vger.kernel.org" Cc: "gregkh@linuxfoundation.org" , "linux-usb@vger.kernel.org" , "linux-kernel@vger.kernel.org" , Alan Douglas , "jbergsagel@ti.com" , "nsekhar@ti.com" , "nm@ti.com" , Suresh Punnoose , "peter.chen@nxp.com" , Pawel Jez , Rahul Kumar List-Id: devicetree@vger.kernel.org Pawel, On 26/11/18 09:23, Pawel Laszczak wrote: > Hi Roger, > >> On 18/11/18 12:09, Pawel Laszczak wrote: >>> Patch adds supports for detecting Host/Device mode. >>> Controller has additional OTG register that allow >>> implement even whole OTG functionality. >>> At this moment patch adds support only for detecting >>> the appropriate mode based on strap pins and ID pin. >>> >>> Signed-off-by: Pawel Laszczak >>> --- >>> drivers/usb/cdns3/Makefile | 2 +- >>> drivers/usb/cdns3/core.c | 27 +++-- >>> drivers/usb/cdns3/drd.c | 229 +++++++++++++++++++++++++++++++++++++ >>> drivers/usb/cdns3/drd.h | 122 ++++++++++++++++++++ >>> 4 files changed, 372 insertions(+), 8 deletions(-) >>> create mode 100644 drivers/usb/cdns3/drd.c >>> create mode 100644 drivers/usb/cdns3/drd.h >>> >>> diff --git a/drivers/usb/cdns3/Makefile b/drivers/usb/cdns3/Makefile >>> index 02d25b23c5d3..e779b2a2f8eb 100644 >>> --- a/drivers/usb/cdns3/Makefile >>> +++ b/drivers/usb/cdns3/Makefile >>> @@ -1,5 +1,5 @@ >>> obj-$(CONFIG_USB_CDNS3) += cdns3.o >>> obj-$(CONFIG_USB_CDNS3_PCI_WRAP) += cdns3-pci.o >>> >>> -cdns3-y := core.o >>> +cdns3-y := core.o drd.o >>> cdns3-pci-y := cdns3-pci-wrap.o >>> diff --git a/drivers/usb/cdns3/core.c b/drivers/usb/cdns3/core.c >>> index f9055d4da67f..dbee4325da7f 100644 >>> --- a/drivers/usb/cdns3/core.c >>> +++ b/drivers/usb/cdns3/core.c >>> @@ -17,6 +17,7 @@ >>> >>> #include "gadget.h" >>> #include "core.h" >>> +#include "drd.h" >>> >>> static inline struct cdns3_role_driver *cdns3_get_current_role_driver(struct cdns3 *cdns) >>> { >>> @@ -57,8 +58,10 @@ static inline void cdns3_role_stop(struct cdns3 *cdns) >>> static enum cdns3_roles cdns3_get_role(struct cdns3 *cdns) >>> { >>> if (cdns->roles[CDNS3_ROLE_HOST] && cdns->roles[CDNS3_ROLE_GADGET]) { >>> - //TODO: implements selecting device/host mode >>> - return CDNS3_ROLE_HOST; >>> + if (cdns3_is_host(cdns)) >>> + return CDNS3_ROLE_HOST; >>> + if (cdns3_is_device(cdns)) >>> + return CDNS3_ROLE_GADGET; >>> } >>> return cdns->roles[CDNS3_ROLE_HOST] >>> ? CDNS3_ROLE_HOST >>> @@ -124,6 +127,12 @@ static irqreturn_t cdns3_irq(int irq, void *data) >>> struct cdns3 *cdns = data; >>> irqreturn_t ret = IRQ_NONE; >>> >>> + if (cdns->dr_mode == USB_DR_MODE_OTG) { >>> + ret = cdns3_drd_irq(cdns); >>> + if (ret == IRQ_HANDLED) >>> + return ret; >>> + } >> >> The kernel's shared IRQ model takes care of sharing the same interrupt >> between different devices and their drivers. You don't need to manually >> handle it here. Just let all 3 drivers do a request_irq() and have >> handlers check if the IRQ was theirs or not and return IRQ_HANDLED or >> IRQ_NONE accordingly. >> >> Looks like you can do away with irq member of the role driver struct. > > Ok, I will split it into 3 separate part, but in this case, I additionally have to check the current > role in ISR function. Driver can't read host side registers when controller works in device role > and vice versa. One part of controller is kept in reset. Only DRD registers are common and are all accessible. > In which ISR do you need to check current role? I'm not sure if we are on the same page. Core (drd) driver shouldn't read host/device side registers. All 3 drivers, i.e. DRD(core), Host (xhci) and device (cdns3) should do a request_irq() and process their respective IRQ events. >>> + >>> /* Handle device/host interrupt */ >>> if (cdns->role != CDNS3_ROLE_END) >>> ret = cdns3_get_current_role_driver(cdns)->irq(cdns); >>> @@ -176,11 +185,8 @@ static void cdns3_role_switch(struct work_struct *work) >>> >>> cdns = container_of(work, struct cdns3, role_switch_wq); >>> >>> - //TODO: implements this functions. >>> - //host = cdns3_is_host(cdns); >>> - //device = cdns3_is_device(cdns); >>> - host = 1; >>> - device = 0; >>> + host = cdns3_is_host(cdns); >>> + device = cdns3_is_device(cdns); >> >> What if there is a ID transition between the 2 functions so that >> and both host and device become true? >> Since you are checking the ID level separately in both the functions. >> >> How about instead having cdns3_get_id() and using >> it to start/stop relevant roles if we are in OTG mode. >> >> Is this going to be used for a role switch even if we're not in OTG mode? >> If not then it is a BUG if we get here. >> > Good point. > User can change current mode by debugfs and then this function will also invoked. > Probably I use cdns3_get_id as you suggest. > >>> >>> if (host) >>> role = CDNS3_ROLE_HOST; >>> @@ -194,6 +200,12 @@ static void cdns3_role_switch(struct work_struct *work) >>> pm_runtime_get_sync(cdns->dev); >>> cdns3_role_stop(cdns); >>> >>> + if (cdns->desired_dr_mode != cdns->current_dr_mode) { >> >> This is about roles, why are we checking dr_mode here? > > Because after changing dr_mode by means of debugfs we need to update mode. > Driver should do this after stopping the previous role. I will move this condition > to cdns3_drd_update_mode and add comment in this place. > >> >>> + cdns3_drd_update_mode(cdns); >>> + host = cdns3_is_host(cdns); >>> + device = cdns3_is_device(cdns); >>> + } >>> + >>> if (host) { >>> if (cdns->roles[CDNS3_ROLE_HOST]) >>> cdns3_do_role_switch(cdns, CDNS3_ROLE_HOST); >>> @@ -287,6 +299,7 @@ static int cdns3_probe(struct platform_device *pdev) >>> if (ret) >>> goto err2; >>> >>> + ret = cdns3_drd_init(cdns); >>> if (ret) >>> goto err2; >>> >>> diff --git a/drivers/usb/cdns3/drd.c b/drivers/usb/cdns3/drd.c >>> new file mode 100644 >>> index 000000000000..ac741c80e776 >>> --- /dev/null >>> +++ b/drivers/usb/cdns3/drd.c >>> @@ -0,0 +1,229 @@ >>> +// SPDX-License-Identifier: GPL-2.0 >>> +/* >>> + * Cadence USBSS DRD Driver. >>> + * >>> + * Copyright (C) 2018 Cadence. >>> + * >>> + * Author: Pawel Laszczak >> + * >>> + */ >>> +#include >>> +#include >>> +#include >>> +#include >>> + >>> +#include "gadget.h" >>> +#include "drd.h" >>> + >>> +/** >>> + * cdns3_set_mode - change mode of OTG Core >>> + * @cdns: pointer to context structure >>> + * @mode: selected mode from cdns_role >>> + */ >>> +void cdns3_set_mode(struct cdns3 *cdns, enum usb_dr_mode mode) >>> +{ >>> + u32 reg; >>> + >>> + cdns->current_dr_mode = mode; >>> + switch (mode) { >>> + case USB_DR_MODE_PERIPHERAL: >>> + dev_info(cdns->dev, "Set controller to Gadget mode\n"); >>> + writel(OTGCMD_DEV_BUS_REQ | OTGCMD_OTG_DIS, >>> + &cdns->otg_regs->cmd); >>> + break; >>> + case USB_DR_MODE_HOST: >>> + dev_info(cdns->dev, "Set controller to Host mode\n"); >>> + writel(OTGCMD_HOST_BUS_REQ | OTGCMD_OTG_DIS, >>> + &cdns->otg_regs->cmd); >>> + break; >>> + case USB_DR_MODE_OTG: >>> + dev_info(cdns->dev, "Set controller to OTG mode\n"); >>> + reg = readl(&cdns->otg_regs->ctrl1); >>> + reg |= OTGCTRL1_IDPULLUP; >>> + writel(reg, &cdns->otg_regs->ctrl1); >>> + >>> + /* wait until valid ID (ID_VALUE) can be sampled (50ms). */ >>> + mdelay(50); >>> + break; >>> + default: >>> + cdns->current_dr_mode = USB_DR_MODE_UNKNOWN; >>> + dev_err(cdns->dev, "Unsupported mode of operation %d\n", mode); >>> + return; >>> + } >>> +} >>> + >>> +static int cdns3_otg_get_id(struct cdns3 *cdns) >>> +{ >>> + int id; >>> + >>> + id = readl(&cdns->otg_regs->sts) & OTGSTS_ID_VALUE; >>> + dev_dbg(cdns->dev, "OTG ID: %d", id); >>> + return id; >>> +} >>> + >>> +int cdns3_is_host(struct cdns3 *cdns) >>> +{ >>> + if (cdns->current_dr_mode == USB_DR_MODE_HOST) >>> + return 1; >> >> Why do you need this? > > I assumed that some SoC could have cut DRD /OTG and Device or Host part. > In such case the driver cannot be based on ID pin. > For only HOST it's not a problem because > the standard XHCI driver will be used. Probably I will remove this fragment. >> >>> + else if (cdns->current_dr_mode == USB_DR_MODE_OTG) >>> + if (!cdns3_otg_get_id(cdns)) >>> + return 1; >>> + >>> + return 0; >>> +} >>> + >>> +int cdns3_is_device(struct cdns3 *cdns) >>> +{ >>> + if (cdns->current_dr_mode == USB_DR_MODE_PERIPHERAL) >>> + return 1; >>> + else if (cdns->current_dr_mode == USB_DR_MODE_OTG) >>> + if (cdns3_otg_get_id(cdns)) >>> + return 1; >>> + >>> + return 0; >>> +} >>> + >>> +/** >>> + * cdns3_otg_disable_irq - Disable all OTG interrupts >>> + * @cdns: Pointer to controller context structure >>> + */ >>> +static void cdns3_otg_disable_irq(struct cdns3 *cdns) >>> +{ >>> + writel(0, &cdns->otg_regs->ien); >>> +} >>> + >>> +/** >>> + * cdns3_otg_enable_irq - enable id and sess_valid interrupts >>> + * @cdns: Pointer to controller context structure >>> + */ >>> +static void cdns3_otg_enable_irq(struct cdns3 *cdns) >>> +{ >>> + writel(OTGIEN_ID_CHANGE_INT | OTGIEN_VBUSVALID_RISE_INT | >>> + OTGIEN_VBUSVALID_FALL_INT, &cdns->otg_regs->ien); >>> +} >>> + >>> +/** >>> + * cdns3_init_otg_mode - initialize drd controller >>> + * @cdns: Pointer to controller context structure >>> + * >>> + * Returns 0 on success otherwise negative errno >>> + */ >>> +static void cdns3_init_otg_mode(struct cdns3 *cdns) >>> +{ >>> + cdns3_otg_disable_irq(cdns); >>> + /* clear all interrupts */ >>> + writel(~0, &cdns->otg_regs->ivect); >>> + >>> + cdns3_set_mode(cdns, USB_DR_MODE_OTG); >>> + >>> + cdns3_otg_enable_irq(cdns); >>> +} >>> + >>> +/** >>> + * cdns3_drd_update_mode - initialize mode of operation >> >> Looks like this will be called only once. How about calling it >> >> cdns3_drd_init_mode()? > > It will be also called after changing dr_mode from debugfs. > >>> + * @cdns: Pointer to controller context structure >>> + * >>> + * Returns 0 on success otherwise negative errno >>> + */ >>> +int cdns3_drd_update_mode(struct cdns3 *cdns) >>> +{ >>> + int ret = 0; >>> + >>> + switch (cdns->desired_dr_mode) { >> >> I think we can get rid of desired_dr_mode member in struct cdns. >> Just pass the mode as an argument to cdns3_drd_init_mode() > > This will be used also in patch that introduce debugfs. This filed is also used > during changing dr_mode from user space. > > My intention was: > dr_mode - indicated what driver can support, this filed based on dr_mode from device tree, > straps bits from otg register and kernel configuration. > desired_ dr_mode - the next mode desired by user, changed by debugfs > current_dr_mode - actually selected mode > OK, makes sense. But let's keep this patch simple. Add only the members you need right now. Introduce the new one (desired_dr_mode) in the debugfs patch. >> >> And we already have cdns->dr_mode. >> >>> + case USB_DR_MODE_PERIPHERAL: >>> + cdns3_set_mode(cdns, USB_DR_MODE_PERIPHERAL); >>> + break; >>> + case USB_DR_MODE_HOST: >>> + cdns3_set_mode(cdns, USB_DR_MODE_HOST); >>> + break; >>> + case USB_DR_MODE_OTG: >>> + cdns3_init_otg_mode(cdns); >>> + break; >>> + default: >>> + dev_err(cdns->dev, "Unsupported mode of operation %d\n", >>> + cdns->dr_mode); >>> + return -EINVAL; >>> + } >>> + >>> + return ret; >>> +} cheers, -roger -- Texas Instruments Finland Oy, Porkkalankatu 22, 00180 Helsinki. Y-tunnus/Business ID: 0615521-4. Kotipaikka/Domicile: Helsinki