usb: dwc3: host: Fix broken XHCI host
[cascardo/linux.git] / drivers / usb / dwc3 / host.c
index c679f63..f6533c6 100644 (file)
  */
 
 #include <linux/platform_device.h>
-#include <linux/usb/xhci_pdriver.h>
 
 #include "core.h"
 
 int dwc3_host_init(struct dwc3 *dwc)
 {
+       struct property_entry   props[2];
        struct platform_device  *xhci;
-       struct usb_xhci_pdata   pdata;
-       int                     ret;
+       int                     ret, irq;
+       struct resource         *res;
+       struct platform_device  *dwc3_pdev = to_platform_device(dwc->dev);
+
+       irq = platform_get_irq_byname(dwc3_pdev, "host");
+       if (irq == -EPROBE_DEFER)
+               return irq;
+
+       if (irq <= 0) {
+               irq = platform_get_irq_byname(dwc3_pdev, "dwc_usb3");
+               if (irq == -EPROBE_DEFER)
+                       return irq;
+
+               if (irq <= 0) {
+                       irq = platform_get_irq(dwc3_pdev, 0);
+                       if (irq <= 0) {
+                               if (irq != -EPROBE_DEFER) {
+                                       dev_err(dwc->dev,
+                                               "missing host IRQ\n");
+                               }
+                               if (!irq)
+                                       irq = -EINVAL;
+                               return irq;
+                       } else {
+                               res = platform_get_resource(dwc3_pdev,
+                                                           IORESOURCE_IRQ, 0);
+                       }
+               } else {
+                       res = platform_get_resource_byname(dwc3_pdev,
+                                                          IORESOURCE_IRQ,
+                                                          "dwc_usb3");
+               }
+
+       } else {
+               res = platform_get_resource_byname(dwc3_pdev, IORESOURCE_IRQ,
+                                                  "host");
+       }
+
+       dwc->xhci_resources[1].start = irq;
+       dwc->xhci_resources[1].end = irq;
+       dwc->xhci_resources[1].flags = res->flags;
+       dwc->xhci_resources[1].name = res->name;
 
        xhci = platform_device_alloc("xhci-hcd", PLATFORM_DEVID_AUTO);
        if (!xhci) {
@@ -47,14 +87,15 @@ int dwc3_host_init(struct dwc3 *dwc)
                goto err1;
        }
 
-       memset(&pdata, 0, sizeof(pdata));
-
-       pdata.usb3_lpm_capable = dwc->usb3_lpm_capable;
+       memset(props, 0, sizeof(struct property_entry) * ARRAY_SIZE(props));
 
-       ret = platform_device_add_data(xhci, &pdata, sizeof(pdata));
-       if (ret) {
-               dev_err(dwc->dev, "couldn't add platform data to xHCI device\n");
-               goto err1;
+       if (dwc->usb3_lpm_capable) {
+               props[0].name = "usb3-lpm-capable";
+               ret = platform_device_add_properties(xhci, props);
+               if (ret) {
+                       dev_err(dwc->dev, "failed to add properties to xHCI\n");
+                       goto err1;
+               }
        }
 
        phy_create_lookup(dwc->usb2_generic_phy, "usb2-phy",