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: [2/2] drivers: xhci: Add quirk to reset xHCI port PHY From: Mathias Nyman Message-Id: <6392f206-9db2-5506-9e5d-cdf2b784d32e@linux.intel.com> Date: Thu, 7 Feb 2019 17:06:53 +0200 To: Srinath Mannam , Greg Kroah-Hartman , Mathias Nyman , Rob Herring , Mark Rutland Cc: linux-usb@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org List-ID: T24gMDUuMDIuMjAxOSAwODoxOCwgU3JpbmF0aCBNYW5uYW0gd3JvdGU6Cj4gQWRkIGEgcXVpcmsg dG8gcmVzZXQgeEhDSSBwb3J0IFBIWSBvbiBwb3J0IGRpc2Nvbm5lY3QgZXZlbnQuCj4gU3Rpbmdy YXkgVVNCIEhTIFBIWSBoYXMgYW4gaXNzdWUsIHRoYXQgVVNCIEhpZ2ggU3BlZWQgZGV2aWNlIGRl dGVjdGVkCj4gYXQgRnVsbCBTcGVlZCBhZnRlciB0aGUgc2FtZSBwb3J0IGhhcyBjb25uZWN0ZWQg dG8gRnVsbCBzcGVlZCBkZXZpY2UuCj4gVGhpcyBwcm9ibGVtIGNhbiBiZSByZXNvbHZlZCB3aXRo IHRoYXQgcG9ydCBQSFkgcmVzZXQgb24gZGlzY29ubmVjdC4KPiAKPiBTaWduZWQtb2ZmLWJ5OiBT cmluYXRoIE1hbm5hbSA8c3JpbmF0aC5tYW5uYW1AYnJvYWRjb20uY29tPgo+IFJldmlld2VkLWJ5 OiBSYXkgSnVpIDxyYXkuanVpQGJyb2FkY29tLmNvbT4KPiAtLS0KPiAgIGRyaXZlcnMvdXNiL2Nv cmUvaGNkLmMgICAgICAgfCAgNiArKysrKysKPiAgIGRyaXZlcnMvdXNiL2NvcmUvcGh5LmMgICAg ICAgfCAyMSArKysrKysrKysrKysrKysrKysrKysKPiAgIGRyaXZlcnMvdXNiL2NvcmUvcGh5Lmgg ICAgICAgfCAgMSArCj4gICBkcml2ZXJzL3VzYi9ob3N0L3hoY2ktcGxhdC5jIHwgIDMgKysrCj4g ICBkcml2ZXJzL3VzYi9ob3N0L3hoY2ktcmluZy5jIHwgIDkgKysrKysrLS0tCj4gICBkcml2ZXJz L3VzYi9ob3N0L3hoY2kuaCAgICAgIHwgIDEgKwo+ICAgaW5jbHVkZS9saW51eC91c2IvaGNkLmgg ICAgICB8ICAxICsKPiAgIDcgZmlsZXMgY2hhbmdlZCwgMzkgaW5zZXJ0aW9ucygrKSwgMyBkZWxl dGlvbnMoLSkKPiAKPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvY29yZS9oY2QuYyBiL2RyaXZl cnMvdXNiL2NvcmUvaGNkLmMKPiBpbmRleCAwMTViMTI2Li5lMmI4N2E2IDEwMDY0NAo+IC0tLSBh L2RyaXZlcnMvdXNiL2NvcmUvaGNkLmMKPiArKysgYi9kcml2ZXJzL3VzYi9jb3JlL2hjZC5jCj4g QEAgLTI2NjMsNiArMjY2MywxMiBAQCBpbnQgdXNiX2hjZF9maW5kX3Jhd19wb3J0X251bWJlcihz dHJ1Y3QgdXNiX2hjZCAqaGNkLCBpbnQgcG9ydDEpCj4gICAJcmV0dXJuIGhjZC0+ZHJpdmVyLT5m aW5kX3Jhd19wb3J0X251bWJlcihoY2QsIHBvcnQxKTsKPiAgIH0KPiAgIAo+ICtpbnQgdXNiX2hj ZF9waHlfcG9ydF9yZXNldChzdHJ1Y3QgdXNiX2hjZCAqaGNkLCBpbnQgcG9ydCkKPiArewo+ICsJ cmV0dXJuIHVzYl9waHlfcm9vdGh1Yl9wb3J0X3Jlc2V0KGhjZC0+cGh5X3Jvb3RodWIsIHBvcnQp Owo+ICt9Cj4gK0VYUE9SVF9TWU1CT0xfR1BMKHVzYl9oY2RfcGh5X3BvcnRfcmVzZXQpOwo+ICsK PiAgIHN0YXRpYyBpbnQgdXNiX2hjZF9yZXF1ZXN0X2lycXMoc3RydWN0IHVzYl9oY2QgKmhjZCwK PiAgIAkJdW5zaWduZWQgaW50IGlycW51bSwgdW5zaWduZWQgbG9uZyBpcnFmbGFncykKPiAgIHsK PiBkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvY29yZS9waHkuYyBiL2RyaXZlcnMvdXNiL2NvcmUv cGh5LmMKPiBpbmRleCAzOGIyYzc3Li5jNjQ3NjdkIDEwMDY0NAo+IC0tLSBhL2RyaXZlcnMvdXNi L2NvcmUvcGh5LmMKPiArKysgYi9kcml2ZXJzL3VzYi9jb3JlL3BoeS5jCj4gQEAgLTE2Miw2ICsx NjIsMjcgQEAgdm9pZCB1c2JfcGh5X3Jvb3RodWJfcG93ZXJfb2ZmKHN0cnVjdCB1c2JfcGh5X3Jv b3RodWIgKnBoeV9yb290aHViKQo+ICAgfQo+ICAgRVhQT1JUX1NZTUJPTF9HUEwodXNiX3BoeV9y b290aHViX3Bvd2VyX29mZik7Cj4gICAKPiAraW50IHVzYl9waHlfcm9vdGh1Yl9wb3J0X3Jlc2V0 KHN0cnVjdCB1c2JfcGh5X3Jvb3RodWIgKnBoeV9yb290aHViLCBpbnQgcG9ydCkKPiArewo+ICsJ c3RydWN0IHVzYl9waHlfcm9vdGh1YiAqcm9vdGh1Yl9lbnRyeTsKPiArCXN0cnVjdCBsaXN0X2hl YWQgKmhlYWQ7Cj4gKwlpbnQgaSA9IDA7Cj4gKwo+ICsJaWYgKCFwaHlfcm9vdGh1YikKPiArCQly ZXR1cm4gLUVJTlZBTDsKPiArCj4gKwloZWFkID0gJnBoeV9yb290aHViLT5saXN0Owo+ICsKPiAr CWxpc3RfZm9yX2VhY2hfZW50cnkocm9vdGh1Yl9lbnRyeSwgaGVhZCwgbGlzdCkgewo+ICsJCWlm IChpID09IHBvcnQpCj4gKwkJCXJldHVybiBwaHlfcmVzZXQocm9vdGh1Yl9lbnRyeS0+cGh5KTsK PiArCQlpKys7Cj4gKwl9CgpJJ20gbm90IHRoYXQgZmFtaWxpYXIgd2l0aCBTb0MncyB0aGF0IGhh dmUgc2V2ZXJhbCBQSFlzIHBlciBjb250cm9sbGVyLApidXQgdGhpcyBsb29rcyBvZGQuCgpGb3Ig dGhlIGFib3ZlIGNvZGUgdG8gd29yayB3b3VsZG4ndCBpdCByZXF1aXJlIHRoYXQgZWFjaCBwb3J0 IGhhcyB0aGVpciBvd24gUEhZLAphbmQgdGhlIFBIWXMgYXJlIGFkZGVkIHRvIHRoZSBsaXN0IG9m IHVzYl9waHlfcm9vdGh1YiBpcyBpbiB0aGUgc2FtZSBvcmRlciBhcyB1c2IgcG9ydHM/CgpPciBp cyB0aGVyZSBzb21ldGhpbmcgSSBkb24ndCB1bmRlcnN0YW5kIGhlcmU/CgotTWF0aGlhcwo= From mboxrd@z Thu Jan 1 00:00:00 1970 From: Mathias Nyman Subject: Re: [PATCH 2/2] drivers: xhci: Add quirk to reset xHCI port PHY Date: Thu, 7 Feb 2019 17:06:53 +0200 Message-ID: <6392f206-9db2-5506-9e5d-cdf2b784d32e@linux.intel.com> References: <1549347534-11320-1-git-send-email-srinath.mannam@broadcom.com> <1549347534-11320-3-git-send-email-srinath.mannam@broadcom.com> Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: <1549347534-11320-3-git-send-email-srinath.mannam@broadcom.com> Content-Language: en-US Sender: linux-kernel-owner@vger.kernel.org To: Srinath Mannam , Greg Kroah-Hartman , Mathias Nyman , Rob Herring , Mark Rutland Cc: linux-usb@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org List-Id: devicetree@vger.kernel.org On 05.02.2019 08:18, Srinath Mannam wrote: > Add a quirk to reset xHCI port PHY on port disconnect event. > Stingray USB HS PHY has an issue, that USB High Speed device detected > at Full Speed after the same port has connected to Full speed device. > This problem can be resolved with that port PHY reset on disconnect. > > Signed-off-by: Srinath Mannam > Reviewed-by: Ray Jui > --- > drivers/usb/core/hcd.c | 6 ++++++ > drivers/usb/core/phy.c | 21 +++++++++++++++++++++ > drivers/usb/core/phy.h | 1 + > drivers/usb/host/xhci-plat.c | 3 +++ > drivers/usb/host/xhci-ring.c | 9 ++++++--- > drivers/usb/host/xhci.h | 1 + > include/linux/usb/hcd.h | 1 + > 7 files changed, 39 insertions(+), 3 deletions(-) > > diff --git a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c > index 015b126..e2b87a6 100644 > --- a/drivers/usb/core/hcd.c > +++ b/drivers/usb/core/hcd.c > @@ -2663,6 +2663,12 @@ int usb_hcd_find_raw_port_number(struct usb_hcd *hcd, int port1) > return hcd->driver->find_raw_port_number(hcd, port1); > } > > +int usb_hcd_phy_port_reset(struct usb_hcd *hcd, int port) > +{ > + return usb_phy_roothub_port_reset(hcd->phy_roothub, port); > +} > +EXPORT_SYMBOL_GPL(usb_hcd_phy_port_reset); > + > static int usb_hcd_request_irqs(struct usb_hcd *hcd, > unsigned int irqnum, unsigned long irqflags) > { > diff --git a/drivers/usb/core/phy.c b/drivers/usb/core/phy.c > index 38b2c77..c64767d 100644 > --- a/drivers/usb/core/phy.c > +++ b/drivers/usb/core/phy.c > @@ -162,6 +162,27 @@ void usb_phy_roothub_power_off(struct usb_phy_roothub *phy_roothub) > } > EXPORT_SYMBOL_GPL(usb_phy_roothub_power_off); > > +int usb_phy_roothub_port_reset(struct usb_phy_roothub *phy_roothub, int port) > +{ > + struct usb_phy_roothub *roothub_entry; > + struct list_head *head; > + int i = 0; > + > + if (!phy_roothub) > + return -EINVAL; > + > + head = &phy_roothub->list; > + > + list_for_each_entry(roothub_entry, head, list) { > + if (i == port) > + return phy_reset(roothub_entry->phy); > + i++; > + } I'm not that familiar with SoC's that have several PHYs per controller, but this looks odd. For the above code to work wouldn't it require that each port has their own PHY, and the PHYs are added to the list of usb_phy_roothub is in the same order as usb ports? Or is there something I don't understand here? -Mathias