diff options
author | Suresh Mangipudi <smangipudi@nvidia.com> | 2011-08-04 18:03:20 +0530 |
---|---|---|
committer | Varun Colbert <vcolbert@nvidia.com> | 2011-08-05 11:15:59 -0700 |
commit | c579fce0248ce61a05b65eadc9ad8d5c7f18a458 (patch) | |
tree | 9ad88a1df059923ffa97358d97d71df8208f6019 /drivers/usb | |
parent | 4e13de638eb2330bf49468e769b7fa1c35f3ea1d (diff) |
usb: gadget: enable the clocks during resume
Need to enable the clock before checking the vbus status during resume
Bug 858490
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>
Diffstat (limited to 'drivers/usb')
-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 850825a89d01..607a017acb4b 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); +}
\ No newline at end of file diff --git a/drivers/usb/gadget/fsl_udc_core.c b/drivers/usb/gadget/fsl_udc_core.c index 0abecc16e832..5abd12877470 100644 --- a/drivers/usb/gadget/fsl_udc_core.c +++ b/drivers/usb/gadget/fsl_udc_core.c @@ -2920,27 +2920,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 de42fbb978f4..66f5deb201f2 100644 --- a/drivers/usb/gadget/fsl_usb2_udc.h +++ b/drivers/usb/gadget/fsl_usb2_udc.h @@ -713,6 +713,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) { @@ -730,6 +732,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 |