ehci-omap: add a vbus regulator
authorGrazvydas Ignotas <notasas@gmail.com>
Sun, 22 May 2016 22:14:32 +0000 (01:14 +0300)
committerGrazvydas Ignotas <notasas@gmail.com>
Sun, 3 Jul 2016 00:23:25 +0000 (03:23 +0300)
the driver already uses one but it's for the PHY

arch/arm/plat-omap/include/plat/usb.h
drivers/usb/host/ehci-omap.c

index 17d3c93..59428b7 100644 (file)
@@ -46,6 +46,7 @@ struct usbhs_omap_board_data {
 struct ehci_hcd_omap_platform_data {
        enum usbhs_omap_port_mode       port_mode[OMAP3_HS_USB_PORTS];
        int                             reset_gpio_port[OMAP3_HS_USB_PORTS];
 struct ehci_hcd_omap_platform_data {
        enum usbhs_omap_port_mode       port_mode[OMAP3_HS_USB_PORTS];
        int                             reset_gpio_port[OMAP3_HS_USB_PORTS];
+       struct regulator                *regulator_vbus[OMAP3_HS_USB_PORTS];
        struct regulator                *regulator[OMAP3_HS_USB_PORTS];
        unsigned                        phy_reset:1;
 };
        struct regulator                *regulator[OMAP3_HS_USB_PORTS];
        unsigned                        phy_reset:1;
 };
index e39b029..8d160ad 100644 (file)
@@ -107,6 +107,12 @@ static void disable_put_regulator(
                if (pdata->regulator[i]) {
                        regulator_disable(pdata->regulator[i]);
                        regulator_put(pdata->regulator[i]);
                if (pdata->regulator[i]) {
                        regulator_disable(pdata->regulator[i]);
                        regulator_put(pdata->regulator[i]);
+                       pdata->regulator[i] = NULL;
+               }
+               if (pdata->regulator_vbus[i]) {
+                       regulator_disable(pdata->regulator_vbus[i]);
+                       regulator_put(pdata->regulator_vbus[i]);
+                       pdata->regulator_vbus[i] = NULL;
                }
        }
 }
                }
        }
 }
@@ -132,7 +138,7 @@ static int ehci_hcd_omap_probe(struct platform_device *pdev)
        int                                     ret = -ENODEV;
        int                                     irq;
        int                                     i;
        int                                     ret = -ENODEV;
        int                                     irq;
        int                                     i;
-       char                                    supply[7];
+       char                                    supply[12];
 
        if (usb_disabled())
                return -ENODEV;
 
        if (usb_disabled())
                return -ENODEV;
@@ -176,9 +182,20 @@ static int ehci_hcd_omap_probe(struct platform_device *pdev)
        /* get ehci regulator and enable */
        for (i = 0 ; i < OMAP3_HS_USB_PORTS ; i++) {
                if (pdata->port_mode[i] != OMAP_EHCI_PORT_MODE_PHY) {
        /* get ehci regulator and enable */
        for (i = 0 ; i < OMAP3_HS_USB_PORTS ; i++) {
                if (pdata->port_mode[i] != OMAP_EHCI_PORT_MODE_PHY) {
+                       pdata->regulator_vbus[i] = NULL;
                        pdata->regulator[i] = NULL;
                        continue;
                }
                        pdata->regulator[i] = NULL;
                        continue;
                }
+               snprintf(supply, sizeof(supply), "hsusb%d_vbus", i);
+               pdata->regulator_vbus[i] = regulator_get(dev, supply);
+               if (IS_ERR(pdata->regulator_vbus[i])) {
+                       pdata->regulator_vbus[i] = NULL;
+                       dev_dbg(dev,
+                       "failed to get ehci port%d vbus regulator\n", i);
+               } else {
+                       regulator_enable(pdata->regulator_vbus[i]);
+               }
+
                snprintf(supply, sizeof(supply), "hsusb%d", i);
                pdata->regulator[i] = regulator_get(dev, supply);
                if (IS_ERR(pdata->regulator[i])) {
                snprintf(supply, sizeof(supply), "hsusb%d", i);
                pdata->regulator[i] = regulator_get(dev, supply);
                if (IS_ERR(pdata->regulator[i])) {