MLK-11831-1 usb: chipidea: imx: Add dummy LDO2p5 regulator for VBUS wakeup
LDO2p5 cannot be disabled in low power idle mode when the USB driver enables VBUS wakeup. To identify when LDO2p5 can be disabled add a dummy regulator that the USB driver will enable when VBUS wakeup is required. Signed-off-by: Ranjani Vaidyanathan <Ranjani.Vaidyanathan@freescale.com> Signed-off-by: Li Jun <jun.li@freescale.com> (cherry picked from commit 1c7540466512fe055f0ea4e37f42fec82bf1956a)5.4-rM2-2.2.x-imx-squashed
parent
797aa78231
commit
76945d371b
|
@ -9,6 +9,7 @@
|
|||
#include <linux/io.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/usb/otg.h>
|
||||
#include <linux/regulator/consumer.h>
|
||||
|
||||
#include "ci_hdrc_imx.h"
|
||||
|
||||
|
@ -122,6 +123,8 @@ struct imx_usbmisc {
|
|||
const struct usbmisc_ops *ops;
|
||||
};
|
||||
|
||||
static struct regulator *vbus_wakeup_reg;
|
||||
|
||||
static inline bool is_imx53_usbmisc(struct imx_usbmisc_data *data);
|
||||
|
||||
static int usbmisc_imx25_init(struct imx_usbmisc_data *data)
|
||||
|
@ -359,6 +362,11 @@ static int usbmisc_imx6q_set_wakeup
|
|||
if (enabled) {
|
||||
wakeup_setting |= imx6q_finalize_wakeup_setting(data);
|
||||
val |= wakeup_setting;
|
||||
if (vbus_wakeup_reg) {
|
||||
spin_unlock_irqrestore(&usbmisc->lock, flags);
|
||||
ret = regulator_enable(vbus_wakeup_reg);
|
||||
spin_lock_irqsave(&usbmisc->lock, flags);
|
||||
}
|
||||
} else {
|
||||
if (val & MX6_BM_WAKEUP_INTR)
|
||||
pr_debug("wakeup int at ci_hdrc.%d\n", data->index);
|
||||
|
@ -367,6 +375,8 @@ static int usbmisc_imx6q_set_wakeup
|
|||
}
|
||||
writel(val, usbmisc->base + data->index * 4);
|
||||
spin_unlock_irqrestore(&usbmisc->lock, flags);
|
||||
if (vbus_wakeup_reg && regulator_is_enabled(vbus_wakeup_reg))
|
||||
regulator_disable(vbus_wakeup_reg);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
@ -861,6 +871,18 @@ static int usbmisc_imx_probe(struct platform_device *pdev)
|
|||
data->ops = (const struct usbmisc_ops *)of_id->data;
|
||||
platform_set_drvdata(pdev, 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;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue