usb: chipidea: only get vbus regulator for non-peripheral mode
authorPeter Chen <peter.chen@freescale.com>
Wed, 30 Oct 2013 01:19:29 +0000 (09:19 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 30 Oct 2013 16:41:49 +0000 (09:41 -0700)
If the user chooses peripheral mode for this controller, the vbus
regulator doesn't need to get, since the host will supply the vbus,
it can save one vbus pin for other usage.

Signed-off-by: Peter Chen <peter.chen@freescale.com>
Tested-by: Frank Li <frank.li@freescale.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/usb/chipidea/core.c

index 06204b77fc4caa29dcd041c65e11fd73dd9ec7e7..5d8981c5235e50e42776cfb9f672977c11a61ef0 100644 (file)
@@ -392,18 +392,6 @@ static irqreturn_t ci_irq(int irq, void *data)
 static int ci_get_platdata(struct device *dev,
                struct ci_hdrc_platform_data *platdata)
 {
-       /* Get the vbus regulator */
-       platdata->reg_vbus = devm_regulator_get(dev, "vbus");
-       if (PTR_ERR(platdata->reg_vbus) == -EPROBE_DEFER) {
-               return -EPROBE_DEFER;
-       } else if (PTR_ERR(platdata->reg_vbus) == -ENODEV) {
-               platdata->reg_vbus = NULL; /* no vbus regualator is needed */
-       } else if (IS_ERR(platdata->reg_vbus)) {
-               dev_err(dev, "Getting regulator error: %ld\n",
-                       PTR_ERR(platdata->reg_vbus));
-               return PTR_ERR(platdata->reg_vbus);
-       }
-
        if (!platdata->phy_mode)
                platdata->phy_mode = of_usb_get_phy_mode(dev->of_node);
 
@@ -413,6 +401,21 @@ static int ci_get_platdata(struct device *dev,
        if (platdata->dr_mode == USB_DR_MODE_UNKNOWN)
                platdata->dr_mode = USB_DR_MODE_OTG;
 
+       if (platdata->dr_mode != USB_DR_MODE_PERIPHERAL) {
+               /* Get the vbus regulator */
+               platdata->reg_vbus = devm_regulator_get(dev, "vbus");
+               if (PTR_ERR(platdata->reg_vbus) == -EPROBE_DEFER) {
+                       return -EPROBE_DEFER;
+               } else if (PTR_ERR(platdata->reg_vbus) == -ENODEV) {
+                       /* no vbus regualator is needed */
+                       platdata->reg_vbus = NULL;
+               } else if (IS_ERR(platdata->reg_vbus)) {
+                       dev_err(dev, "Getting regulator error: %ld\n",
+                               PTR_ERR(platdata->reg_vbus));
+                       return PTR_ERR(platdata->reg_vbus);
+               }
+       }
+
        return 0;
 }