summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormake shi <b15407@freescale.com>2012-08-28 17:12:07 +0800
committerJason Liu <r64343@freescale.com>2012-08-29 21:00:56 +0800
commit5bf60fa85ed191d7429c2cb3a280ffdaf4e29b7e (patch)
treeaff4dd8c31932556202589aad94b9bdad7c1f636
parent713f891cbfa39559e2f524abe25401bd171f468e (diff)
ENGR00221716-01 Mx6 USB host: set disconnect bit should wait for resume finished
For i.MX6DLTO1.1 and i.MX6DQTO1.2, the disconnection-bit can only be set after the resume finished, otherwise, the remote-wake-up may fail. Because if the device not switch to High-Speed 45ohm termination resistors mode, when the disconnection detection bit is set the disconnection detection circuit will detect a high speed disconnection by mistake. Signed-off-by: make shi <b15407@freescale.com>
-rw-r--r--arch/arm/mach-mx6/usb_dr.c25
-rw-r--r--arch/arm/mach-mx6/usb_h1.c25
2 files changed, 40 insertions, 10 deletions
diff --git a/arch/arm/mach-mx6/usb_dr.c b/arch/arm/mach-mx6/usb_dr.c
index 8cfcb27c7594..8fe9700a658f 100644
--- a/arch/arm/mach-mx6/usb_dr.c
+++ b/arch/arm/mach-mx6/usb_dr.c
@@ -442,18 +442,18 @@ static void _host_platform_rh_resume_swfix(struct fsl_usb2_platform_data *pdata)
{
u32 index = 0;
- if ((UOG_PORTSC1 & (3 << 26)) != (2 << 26))
+ if ((UOG_PORTSC1 & (PORTSC_PORT_SPEED_MASK)) != PORTSC_PORT_SPEED_HIGH)
return ;
-
while ((UOG_PORTSC1 & PORTSC_PORT_FORCE_RESUME)
&& (index < 1000)) {
udelay(500);
index++;
}
-
if (index >= 1000)
- printk(KERN_INFO "%s big error\n", __func__);
-
+ printk(KERN_ERR "failed to wait for the resume finished in %s() line:%d\n",
+ __func__, __LINE__);
+ /* We should add some delay to wait for the device switch to
+ * High-Speed 45ohm termination resistors mode. */
udelay(500);
fsl_platform_otg_set_usb_phy_dis(pdata, 1);
}
@@ -469,9 +469,24 @@ static void _host_platform_rh_suspend(struct fsl_usb2_platform_data *pdata)
static void _host_platform_rh_resume(struct fsl_usb2_platform_data *pdata)
{
+ u32 index = 0;
+
/*for mx6sl ,we do not need any sw fix*/
if (cpu_is_mx6sl())
return ;
+ if ((UOG_PORTSC1 & (PORTSC_PORT_SPEED_MASK)) != PORTSC_PORT_SPEED_HIGH)
+ return ;
+ while ((UOG_PORTSC1 & PORTSC_PORT_FORCE_RESUME)
+ && (index < 1000)) {
+ udelay(500);
+ index++;
+ }
+ if (index >= 1000)
+ printk(KERN_ERR "failed to wait for the resume finished in %s() line:%d\n",
+ __func__, __LINE__);
+ /* We should add some delay to wait for the device switch to
+ * High-Speed 45ohm termination resistors mode. */
+ udelay(500);
__raw_writel(BM_USBPHY_CTRL_ENHOSTDISCONDETECT,
MX6_IO_ADDRESS(pdata->phy_regs)
+ HW_USBPHY_CTRL_SET);
diff --git a/arch/arm/mach-mx6/usb_h1.c b/arch/arm/mach-mx6/usb_h1.c
index 3e2f50ab6b55..bece29f7d44b 100644
--- a/arch/arm/mach-mx6/usb_h1.c
+++ b/arch/arm/mach-mx6/usb_h1.c
@@ -244,18 +244,18 @@ static void usbh1_platform_rh_resume_swfix(struct fsl_usb2_platform_data *pdata)
{
u32 index = 0;
- if ((UH1_PORTSC1 & (3 << 26)) != (2 << 26))
+ if ((UOG_PORTSC1 & (PORTSC_PORT_SPEED_MASK)) != PORTSC_PORT_SPEED_HIGH)
return ;
-
while ((UH1_PORTSC1 & PORTSC_PORT_FORCE_RESUME)
&& (index < 1000)) {
udelay(500);
index++;
}
-
if (index >= 1000)
- printk(KERN_INFO "%s big error\n", __func__);
-
+ printk(KERN_ERR "failed to wait for the resume finished in %s() line:%d\n",
+ __func__, __LINE__);
+ /* We should add some delay to wait for the device switch to
+ * High-Speed 45ohm termination resistors mode. */
udelay(500);
fsl_platform_h1_set_usb_phy_dis(pdata, 1);
}
@@ -272,9 +272,24 @@ static void usbh1_platform_rh_suspend(struct fsl_usb2_platform_data *pdata)
static void usbh1_platform_rh_resume(struct fsl_usb2_platform_data *pdata)
{
+ u32 index = 0;
+
/*for mx6sl ,we do not need any sw fix*/
if (cpu_is_mx6sl())
return ;
+ if ((UOG_PORTSC1 & (PORTSC_PORT_SPEED_MASK)) != PORTSC_PORT_SPEED_HIGH)
+ return ;
+ while ((UH1_PORTSC1 & PORTSC_PORT_FORCE_RESUME)
+ && (index < 1000)) {
+ udelay(500);
+ index++;
+ }
+ if (index >= 1000)
+ printk(KERN_ERR "failed to wait for the resume finished in %s() line:%d\n",
+ __func__, __LINE__);
+ /* We should add some delay to wait for the device switch to
+ * High-Speed 45ohm termination resistors mode. */
+ udelay(500);
__raw_writel(BM_USBPHY_CTRL_ENHOSTDISCONDETECT,
MX6_IO_ADDRESS(pdata->phy_regs)
+ HW_USBPHY_CTRL_SET);