summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSuresh Mangipudi <smangipudi@nvidia.com>2011-08-04 18:03:20 +0530
committerDan Willemsen <dwillemsen@nvidia.com>2011-11-30 21:48:03 -0800
commitcb7680dabdb8cbe9eaf33af20560ddf62aa5fc2e (patch)
tree4baa358fe1fef7318f8b6b82aba14e82e8628046
parent75280268e404a13c07457bd68d12f53b18dbf8ce (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.c10
-rw-r--r--drivers/usb/gadget/fsl_udc_core.c11
-rw-r--r--drivers/usb/gadget/fsl_usb2_udc.h8
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