usb: r8a66597: Add optional DM VBUS regulator support
authorMarek Vasut <marek.vasut+renesas@gmail.com>
Thu, 22 Aug 2019 15:53:04 +0000 (17:53 +0200)
committerMarek Vasut <marex@denx.de>
Thu, 22 Aug 2019 16:23:36 +0000 (18:23 +0200)
Add DM regulator support for toggling VBUS, this is useful on boards
which control the VBUS e.g. through GPIO.

Signed-off-by: Marek Vasut <marek.vasut+renesas@gmail.com>
Cc: Chris Brandt <chris.brandt@renesas.com>
drivers/usb/host/r8a66597-hcd.c
drivers/usb/host/r8a66597.h

index 8b60ab2c6d022e0dbd8da6cbacf36b49a255a1ca..a37696d83faf2626dc217f54395c3bbe276af242 100644 (file)
@@ -11,6 +11,7 @@
 #include <usb.h>
 #include <asm/io.h>
 #include <linux/iopoll.h>
+#include <power/regulator.h>
 
 #include "r8a66597.h"
 
@@ -818,9 +819,27 @@ static int r8a66597_usb_probe(struct udevice *dev)
 {
        struct r8a66597 *priv = dev_get_priv(dev);
        struct usb_bus_priv *bus_priv = dev_get_uclass_priv(dev);
+       int ret;
 
        bus_priv->desc_before_addr = true;
 
+       if (CONFIG_IS_ENABLED(DM_REGULATOR)) {
+               ret = device_get_supply_regulator(dev, "vbus-supply",
+                                                 &priv->vbus_supply);
+               if (ret) {
+                       dev_err(dev,
+                               "can't get VBUS supply\n");
+                       return ret;
+               }
+
+               ret = regulator_set_enable(priv->vbus_supply, true);
+               if (ret) {
+                       dev_err(dev,
+                               "can't enable VBUS supply\n");
+                       return ret;
+               }
+       }
+
        disable_controller(priv);
        mdelay(100);
 
@@ -838,9 +857,19 @@ static int r8a66597_usb_probe(struct udevice *dev)
 static int r8a66597_usb_remove(struct udevice *dev)
 {
        struct r8a66597 *priv = dev_get_priv(dev);
+       int ret;
 
        disable_controller(priv);
 
+       if (CONFIG_IS_ENABLED(DM_REGULATOR)) {
+               ret = regulator_set_enable(priv->vbus_supply, false);
+               if (ret) {
+                       dev_err(dev,
+                               "can't disable VBUS supply\n");
+                       return ret;
+               }
+       }
+
        return 0;
 }
 
index 3077bc7999043698c72cfcb861f88d785ef822d2..b6110d6b3f44deff42f1b3707b6da44c788d4faa 100644 (file)
@@ -396,6 +396,7 @@ struct r8a66597 {
        unsigned short port_change;
        u16 speed;      /* HSMODE or FSMODE or LSMODE */
        unsigned char rh_devnum;
+       struct udevice *vbus_supply;
 };
 
 static inline u16 r8a66597_read(struct r8a66597 *r8a66597, unsigned long offset)