diff options
Diffstat (limited to 'arch/arm/plat-mxs/utmixc.c')
-rw-r--r-- | arch/arm/plat-mxs/utmixc.c | 23 |
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."); |