summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--drivers/usb/chipidea/usbmisc_imx.c21
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;
}