UPSTREAM: usb: r8a66597: Add optional DM VBUS regulator support
Add DM regulator support for toggling VBUS, this is useful on boards which control the VBUS e.g. through GPIO. Change-Id: I0f6e296d34613ada8d7e96a8ec86a4288614822c Signed-off-by: Marek Vasut <marek.vasut+renesas@gmail.com> Cc: Chris Brandt <chris.brandt@renesas.com> Signed-off-by: Frank Wang <frank.wang@rock-chips.com> (cherry picked from commit 769a9cd4bbd7ae9b8170b3dd6ba54b84fde59224)
This commit is contained in:
parent
22941b48da
commit
d3b04da041
|
|
@ -12,6 +12,7 @@
|
||||||
#include <usb.h>
|
#include <usb.h>
|
||||||
#include <asm/io.h>
|
#include <asm/io.h>
|
||||||
#include <linux/iopoll.h>
|
#include <linux/iopoll.h>
|
||||||
|
#include <power/regulator.h>
|
||||||
|
|
||||||
#include "r8a66597.h"
|
#include "r8a66597.h"
|
||||||
|
|
||||||
|
|
@ -819,9 +820,27 @@ static int r8a66597_usb_probe(struct udevice *dev)
|
||||||
{
|
{
|
||||||
struct r8a66597 *priv = dev_get_priv(dev);
|
struct r8a66597 *priv = dev_get_priv(dev);
|
||||||
struct usb_bus_priv *bus_priv = dev_get_uclass_priv(dev);
|
struct usb_bus_priv *bus_priv = dev_get_uclass_priv(dev);
|
||||||
|
int ret;
|
||||||
|
|
||||||
bus_priv->desc_before_addr = true;
|
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);
|
disable_controller(priv);
|
||||||
mdelay(100);
|
mdelay(100);
|
||||||
|
|
||||||
|
|
@ -839,9 +858,19 @@ static int r8a66597_usb_probe(struct udevice *dev)
|
||||||
static int r8a66597_usb_remove(struct udevice *dev)
|
static int r8a66597_usb_remove(struct udevice *dev)
|
||||||
{
|
{
|
||||||
struct r8a66597 *priv = dev_get_priv(dev);
|
struct r8a66597 *priv = dev_get_priv(dev);
|
||||||
|
int ret;
|
||||||
|
|
||||||
disable_controller(priv);
|
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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -397,6 +397,7 @@ struct r8a66597 {
|
||||||
unsigned short port_change;
|
unsigned short port_change;
|
||||||
u16 speed; /* HSMODE or FSMODE or LSMODE */
|
u16 speed; /* HSMODE or FSMODE or LSMODE */
|
||||||
unsigned char rh_devnum;
|
unsigned char rh_devnum;
|
||||||
|
struct udevice *vbus_supply;
|
||||||
};
|
};
|
||||||
|
|
||||||
static inline u16 r8a66597_read(struct r8a66597 *r8a66597, unsigned long offset)
|
static inline u16 r8a66597_read(struct r8a66597 *r8a66597, unsigned long offset)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue