diff mbox series

[U-Boot,V2,09/10] usb: r8a66597: Add optional DM VBUS regulator support

Message ID 20190822162214.19011-9-marek.vasut+renesas@gmail.com
State Accepted
Commit 769a9cd4bbd7ae9b8170b3dd6ba54b84fde59224
Delegated to: Marek Vasut
Headers show
Series [U-Boot,V2,01/10] usb: r8a66597: Remove CONFIG_SUPERH_ON_CHIP_R8A66597 | expand

Commit Message

Marek Vasut Aug. 22, 2019, 4:22 p.m. UTC
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>
---
V2: New patch
---
 drivers/usb/host/r8a66597-hcd.c | 29 +++++++++++++++++++++++++++++
 drivers/usb/host/r8a66597.h     |  1 +
 2 files changed, 30 insertions(+)
diff mbox series

Patch

diff --git a/drivers/usb/host/r8a66597-hcd.c b/drivers/usb/host/r8a66597-hcd.c
index 8b60ab2c6d..2c6c888694 100644
--- a/drivers/usb/host/r8a66597-hcd.c
+++ b/drivers/usb/host/r8a66597-hcd.c
@@ -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;
 }
 
diff --git a/drivers/usb/host/r8a66597.h b/drivers/usb/host/r8a66597.h
index 3077bc7999..b6110d6b3f 100644
--- a/drivers/usb/host/r8a66597.h
+++ b/drivers/usb/host/r8a66597.h
@@ -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)