| From 027ec746fcb778f6e672c017af0f5aa51c29bf51 Mon Sep 17 00:00:00 2001 |
| From: Felipe Balbi <felipe.balbi@linux.intel.com> |
| Date: Thu, 26 Jan 2017 11:17:37 +0200 |
| Subject: [PATCH] usb: dwc3: host: pass quirk-broken-port-ped property for |
| known broken revisions |
| |
| commit e42a5dbb8a3d14f5a35bffa3bf7dcb87883f767a upstream. |
| |
| dwc3 revisions <=3.00a have a limitation where Port Disable command |
| doesn't work. Set the quirk-broken-port-ped property for such |
| controllers so XHCI core can do the necessary workaround. |
| |
| [rogerq@ti.com] Updated code from platform data to device property. |
| |
| Signed-off-by: Roger Quadros <rogerq@ti.com> |
| Signed-off-by: Felipe Balbi <felipe.balbi@linux.intel.com> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/drivers/usb/dwc3/host.c b/drivers/usb/dwc3/host.c |
| index f6533c68fed1..626d87d545fc 100644 |
| --- a/drivers/usb/dwc3/host.c |
| +++ b/drivers/usb/dwc3/host.c |
| @@ -21,11 +21,12 @@ |
| |
| int dwc3_host_init(struct dwc3 *dwc) |
| { |
| - struct property_entry props[2]; |
| + struct property_entry props[3]; |
| struct platform_device *xhci; |
| int ret, irq; |
| struct resource *res; |
| struct platform_device *dwc3_pdev = to_platform_device(dwc->dev); |
| + int prop_idx = 0; |
| |
| irq = platform_get_irq_byname(dwc3_pdev, "host"); |
| if (irq == -EPROBE_DEFER) |
| @@ -89,8 +90,22 @@ int dwc3_host_init(struct dwc3 *dwc) |
| |
| memset(props, 0, sizeof(struct property_entry) * ARRAY_SIZE(props)); |
| |
| - if (dwc->usb3_lpm_capable) { |
| - props[0].name = "usb3-lpm-capable"; |
| + if (dwc->usb3_lpm_capable) |
| + props[prop_idx++].name = "usb3-lpm-capable"; |
| + |
| + /** |
| + * WORKAROUND: dwc3 revisions <=3.00a have a limitation |
| + * where Port Disable command doesn't work. |
| + * |
| + * The suggested workaround is that we avoid Port Disable |
| + * completely. |
| + * |
| + * This following flag tells XHCI to do just that. |
| + */ |
| + if (dwc->revision <= DWC3_REVISION_300A) |
| + props[prop_idx++].name = "quirk-broken-port-ped"; |
| + |
| + if (prop_idx) { |
| ret = platform_device_add_properties(xhci, props); |
| if (ret) { |
| dev_err(dwc->dev, "failed to add properties to xHCI\n"); |
| -- |
| 2.12.0 |
| |