UPSTREAM: usb: dwc3: pci: add dr-mode for Intel dwc3
authorFelipe Balbi <felipe.balbi@linux.intel.com>
Tue, 7 Jun 2016 09:49:52 +0000 (12:49 +0300)
committerHuang, Tao <huangtao@rock-chips.com>
Tue, 16 Aug 2016 12:48:19 +0000 (20:48 +0800)
It's know that Intel's SoCs' dwc3 integration is
peripheral-only since Intel implements its own
portmux for role-swapping. In order to prevent dwc3
from ever registering and XHCI platform_device,
let's just set dr-mode to peripheral-only on Intel
SoCs.

Change-Id: Ic7a57ae89a4ea2a2f04a1aff581d728add15a034
Signed-off-by: Felipe Balbi <felipe.balbi@linux.intel.com>
Signed-off-by: Wu Liang feng <wulf@rock-chips.com>
(cherry picked from commit e6fe66fe08cdf9c5d0eb6a6e209621f74f7ee60b)

drivers/usb/dwc3/dwc3-pci.c

index 6bc4c2b08ac7999fee2de7a0f17b93846a3cc016..45f5a232d9fb658b76845e19bb3ef4fa0a0aabf6 100644 (file)
@@ -76,33 +76,45 @@ static int dwc3_pci_quirks(struct pci_dev *pdev, struct platform_device *dwc3)
                return platform_device_add_properties(dwc3, properties);
        }
 
-       if (pdev->vendor == PCI_VENDOR_ID_INTEL &&
-           pdev->device == PCI_DEVICE_ID_INTEL_BYT) {
-               struct gpio_desc *gpio;
-
-               acpi_dev_add_driver_gpios(ACPI_COMPANION(&pdev->dev),
-                                         acpi_dwc3_byt_gpios);
-
-               /*
-                * These GPIOs will turn on the USB2 PHY. Note that we have to
-                * put the gpio descriptors again here because the phy driver
-                * might want to grab them, too.
-                */
-               gpio = gpiod_get_optional(&pdev->dev, "cs", GPIOD_OUT_LOW);
-               if (IS_ERR(gpio))
-                       return PTR_ERR(gpio);
-
-               gpiod_set_value_cansleep(gpio, 1);
-               gpiod_put(gpio);
-
-               gpio = gpiod_get_optional(&pdev->dev, "reset", GPIOD_OUT_LOW);
-               if (IS_ERR(gpio))
-                       return PTR_ERR(gpio);
-
-               if (gpio) {
+       if (pdev->vendor == PCI_VENDOR_ID_INTEL) {
+               int ret;
+
+               struct property_entry properties[] = {
+                       PROPERTY_ENTRY_STRING("dr-mode", "peripheral"),
+                       { }
+               };
+
+               ret = platform_device_add_properties(dwc3, properties);
+               if (ret < 0)
+                       return ret;
+
+               if (pdev->device == PCI_DEVICE_ID_INTEL_BYT) {
+                       struct gpio_desc *gpio;
+
+                       acpi_dev_add_driver_gpios(ACPI_COMPANION(&pdev->dev),
+                                       acpi_dwc3_byt_gpios);
+
+                       /*
+                        * These GPIOs will turn on the USB2 PHY. Note that we have to
+                        * put the gpio descriptors again here because the phy driver
+                        * might want to grab them, too.
+                        */
+                       gpio = gpiod_get_optional(&pdev->dev, "cs", GPIOD_OUT_LOW);
+                       if (IS_ERR(gpio))
+                               return PTR_ERR(gpio);
+
                        gpiod_set_value_cansleep(gpio, 1);
                        gpiod_put(gpio);
-                       usleep_range(10000, 11000);
+
+                       gpio = gpiod_get_optional(&pdev->dev, "reset", GPIOD_OUT_LOW);
+                       if (IS_ERR(gpio))
+                               return PTR_ERR(gpio);
+
+                       if (gpio) {
+                               gpiod_set_value_cansleep(gpio, 1);
+                               gpiod_put(gpio);
+                               usleep_range(10000, 11000);
+                       }
                }
        }