diff options
-rw-r--r-- | drivers/usb/chipidea/usbmisc_imx.c | 21 |
1 files changed, 20 insertions, 1 deletions
diff --git a/drivers/usb/chipidea/usbmisc_imx.c b/drivers/usb/chipidea/usbmisc_imx.c index 1104b49b854c..20be13700edd 100644 --- a/drivers/usb/chipidea/usbmisc_imx.c +++ b/drivers/usb/chipidea/usbmisc_imx.c @@ -15,6 +15,7 @@ #include <linux/io.h> #include <linux/delay.h> #include <linux/regmap.h> +#include <linux/regulator/consumer.h> #include "ci_hdrc_imx.h" @@ -69,6 +70,7 @@ struct imx_usbmisc { }; static struct imx_usbmisc *usbmisc; +static struct regulator *vbus_wakeup_reg; static int usbmisc_imx25_post(struct imx_usbmisc_data *data) { @@ -229,6 +231,7 @@ static int usbmisc_imx6q_set_wakeup { unsigned long flags; u32 reg, val = MX6_BM_WAKEUP_ENABLE; + int ret = 0; if (data->index > 3) return -EINVAL; @@ -238,16 +241,20 @@ static int usbmisc_imx6q_set_wakeup if (enabled) { val |= imx6q_finalize_wakeup_setting(data); writel(reg | val, usbmisc->base + data->index * 4); + if (vbus_wakeup_reg) + ret = regulator_enable(vbus_wakeup_reg); } else { if (reg & MX6_BM_WAKEUP_INTR) pr_debug("wakeup int at ci_hdrc.%d\n", data->index); val = MX6_BM_WAKEUP_ENABLE | MX6_BM_VBUS_WAKEUP | MX6_BM_ID_WAKEUP; writel(reg & ~val, usbmisc->base + data->index * 4); + if (vbus_wakeup_reg && regulator_is_enabled(vbus_wakeup_reg)) + regulator_disable(vbus_wakeup_reg); } spin_unlock_irqrestore(&usbmisc->lock, flags); - return 0; + return ret; } static const struct usbmisc_ops imx25_usbmisc_ops = { @@ -357,6 +364,18 @@ static int usbmisc_imx_probe(struct platform_device *pdev) data->ops = (const struct usbmisc_ops *)tmp_dev->data; usbmisc = data; + vbus_wakeup_reg = devm_regulator_get(&pdev->dev, "vbus-wakeup"); + if (PTR_ERR(vbus_wakeup_reg) == -EPROBE_DEFER) + return -EPROBE_DEFER; + else if (PTR_ERR(vbus_wakeup_reg) == -ENODEV) + /* no vbus regualator is needed */ + vbus_wakeup_reg = NULL; + else if (IS_ERR(vbus_wakeup_reg)) { + dev_err(&pdev->dev, "Getting regulator error: %ld\n", + PTR_ERR(vbus_wakeup_reg)); + return PTR_ERR(vbus_wakeup_reg); + } + return 0; } |