aboutsummaryrefslogtreecommitdiff
path: root/arch/arm/plat-mxs/utmixc.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/arm/plat-mxs/utmixc.c')
-rw-r--r--arch/arm/plat-mxs/utmixc.c23
1 files changed, 22 insertions, 1 deletions
diff --git a/arch/arm/plat-mxs/utmixc.c b/arch/arm/plat-mxs/utmixc.c
index a3b0175a138..1e9015d6de3 100644
--- a/arch/arm/plat-mxs/utmixc.c
+++ b/arch/arm/plat-mxs/utmixc.c
@@ -36,13 +36,30 @@ extern void fsl_phy_usb_utmi_init(struct fsl_xcvr_ops *this);
extern void fsl_phy_usb_utmi_uninit(struct fsl_xcvr_ops *this);
extern void fsl_phy_set_power(struct fsl_xcvr_ops *this,
struct fsl_usb2_platform_data *pdata, int on);
+#include <mach/regs-power.h>
+#include <asm/io.h>
+
+static void set_vbus_draw(struct fsl_xcvr_ops *this,
+ struct fsl_usb2_platform_data *pdata, unsigned mA)
+{
+#ifdef CONFIG_MXS_VBUS_CURRENT_DRAW
+ if ((__raw_readl(REGS_POWER_BASE + HW_POWER_5VCTRL)
+ & BM_POWER_5VCTRL_CHARGE_4P2_ILIMIT) == 0x8000) {
+ printk(KERN_INFO "USB enumeration done,current limitation release\r\n");
+ __raw_writel(__raw_readl(REGS_POWER_BASE + HW_POWER_5VCTRL) |
+ BM_POWER_5VCTRL_CHARGE_4P2_ILIMIT, REGS_POWER_BASE +
+ HW_POWER_5VCTRL);
+ }
+#endif
+}
static struct fsl_xcvr_ops utmi_ops = {
.name = "utmi",
.xcvr_type = PORTSC_PTS_UTMI,
.init = fsl_phy_usb_utmi_init,
.uninit = fsl_phy_usb_utmi_uninit,
.set_vbus_power = fsl_phy_set_power,
+ .set_vbus_draw = set_vbus_draw,
};
extern void fsl_usb_xcvr_register(struct fsl_xcvr_ops *xcvr_ops);
@@ -60,7 +77,11 @@ static void __exit utmixc_exit(void)
fsl_usb_xcvr_unregister(&utmi_ops);
}
-module_init(utmixc_init);
+#ifdef CONFIG_MXS_VBUS_CURRENT_DRAW
+ fs_initcall(utmixc_init);
+#else
+ module_init(utmixc_init);
+#endif
module_exit(utmixc_exit);
MODULE_AUTHOR("Freescale Semiconductor, Inc.");