usb: dwc3: host: pass quirk-broken-port-ped property for known broken revisions
authorFelipe Balbi <felipe.balbi@linux.intel.com>
Tue, 4 Apr 2017 19:32:25 +0000 (19:32 +0000)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 12 Apr 2017 10:41:19 +0000 (12:41 +0200)
[ Upstream commit e42a5dbb8a3d14f5a35bffa3bf7dcb87883f767a ]

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: Sasha Levin <alexander.levin@verizon.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/usb/dwc3/host.c

index f6533c6..626d87d 100644 (file)
 
 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");