diff options
author | Suresh Mangipudi <smangipudi@nvidia.com> | 2011-08-04 18:03:20 +0530 |
---|---|---|
committer | Dan Willemsen <dwillemsen@nvidia.com> | 2011-11-30 21:48:03 -0800 |
commit | cb7680dabdb8cbe9eaf33af20560ddf62aa5fc2e (patch) | |
tree | 4baa358fe1fef7318f8b6b82aba14e82e8628046 | |
parent | 75280268e404a13c07457bd68d12f53b18dbf8ce (diff) |
usb: gadget: enable the clocks during resume
Need to enable the clock before checking the vbus status during resume
Bug 858490
Original-Change-Id: Id2ce4894c377b2ce878eed16b822877c3f28ae85
Reviewed-on: http://git-master/r/44996
Reviewed-by: Suresh Mangipudi <smangipudi@nvidia.com>
Tested-by: Suresh Mangipudi <smangipudi@nvidia.com>
Tested-by: Bala Murali Krishna <balam@nvidia.com>
Reviewed-by: Hanumanth Venkateswa Moganty <vmoganty@nvidia.com>
Rebase-Id: Re3853a8dc628ad7349b721b6070df396797a01ac
-rw-r--r-- | drivers/usb/gadget/fsl_tegra_udc.c | 10 | ||||
-rw-r--r-- | drivers/usb/gadget/fsl_udc_core.c | 11 | ||||
-rw-r--r-- | drivers/usb/gadget/fsl_usb2_udc.h | 8 |
3 files changed, 23 insertions, 6 deletions
diff --git a/drivers/usb/gadget/fsl_tegra_udc.c b/drivers/usb/gadget/fsl_tegra_udc.c index c691a1b199d5..01375d3880a1 100644 --- a/drivers/usb/gadget/fsl_tegra_udc.c +++ b/drivers/usb/gadget/fsl_tegra_udc.c @@ -138,3 +138,13 @@ void fsl_udc_clk_resume(bool is_dpd) clk_enable(udc_clk); tegra_usb_phy_power_on(phy, is_dpd); } + +void fsl_udc_clk_enable() +{ + clk_enable(udc_clk); +} + +void fsl_udc_clk_disable() +{ + clk_disable(udc_clk); +} diff --git a/drivers/usb/gadget/fsl_udc_core.c b/drivers/usb/gadget/fsl_udc_core.c index 44a253e99d3b..8830c91e9ee6 100644 --- a/drivers/usb/gadget/fsl_udc_core.c +++ b/drivers/usb/gadget/fsl_udc_core.c @@ -3140,27 +3140,26 @@ static int fsl_udc_suspend(struct platform_device *pdev, pm_message_t state) static int fsl_udc_resume(struct platform_device *pdev) { if (udc_controller->transceiver) { - + fsl_udc_clk_enable(); if (!(fsl_readl(&usb_sys_regs->vbus_wakeup) & USB_SYS_ID_PIN_STATUS)) { /* If ID status is low means host is connected, return */ + fsl_udc_clk_disable(); return 0; } /* check for VBUS */ if (!(fsl_readl(&usb_sys_regs->vbus_wakeup) & USB_SYS_VBUS_STATUS)) { /* if there is no VBUS then power down the clocks and return */ + fsl_udc_clk_disable(); return 0; } else { + fsl_udc_clk_disable(); if (udc_controller->transceiver->state == OTG_STATE_A_HOST) return 0; - fsl_udc_clk_resume(true); /* Detected VBUS set the transceiver state to device mode */ udc_controller->transceiver->state = OTG_STATE_B_PERIPHERAL; } - } else { - /* enable the clocks to the controller */ - fsl_udc_clk_resume(true); } - + fsl_udc_clk_resume(true); #if defined(CONFIG_ARCH_TEGRA) fsl_udc_restart(udc_controller); #else diff --git a/drivers/usb/gadget/fsl_usb2_udc.h b/drivers/usb/gadget/fsl_usb2_udc.h index a605e111e432..b74c8cf395bb 100644 --- a/drivers/usb/gadget/fsl_usb2_udc.h +++ b/drivers/usb/gadget/fsl_usb2_udc.h @@ -719,6 +719,8 @@ void fsl_udc_clk_finalize(struct platform_device *pdev); void fsl_udc_clk_release(void); void fsl_udc_clk_suspend(bool is_dpd); void fsl_udc_clk_resume(bool is_dpd); +void fsl_udc_clk_enable(void); +void fsl_udc_clk_disable(void); #else static inline int fsl_udc_clk_init(struct platform_device *pdev) { @@ -736,6 +738,12 @@ static inline void fsl_udc_clk_suspend(bool is_dpd) static inline void fsl_udc_clk_resume(bool is_dpd) { } +void fsl_udc_clk_enable(void) +{ +} +void fsl_udc_clk_disable(void) +{ +} #endif #endif |