Commit 8f25ba9c authored by make shi's avatar make shi

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: default avatarmake shi <b15407@freescale.com>
parent bc1c5b27
...@@ -442,18 +442,18 @@ static void _host_platform_rh_resume_swfix(struct fsl_usb2_platform_data *pdata) ...@@ -442,18 +442,18 @@ static void _host_platform_rh_resume_swfix(struct fsl_usb2_platform_data *pdata)
{ {
u32 index = 0; u32 index = 0;
if ((UOG_PORTSC1 & (3 << 26)) != (2 << 26)) if ((UOG_PORTSC1 & (PORTSC_PORT_SPEED_MASK)) != PORTSC_PORT_SPEED_HIGH)
return ; return ;
while ((UOG_PORTSC1 & PORTSC_PORT_FORCE_RESUME) while ((UOG_PORTSC1 & PORTSC_PORT_FORCE_RESUME)
&& (index < 1000)) { && (index < 1000)) {
udelay(500); udelay(500);
index++; index++;
} }
if (index >= 1000) 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); udelay(500);
fsl_platform_otg_set_usb_phy_dis(pdata, 1); 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) ...@@ -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) static void _host_platform_rh_resume(struct fsl_usb2_platform_data *pdata)
{ {
u32 index = 0;
/*for mx6sl ,we do not need any sw fix*/ /*for mx6sl ,we do not need any sw fix*/
if (cpu_is_mx6sl()) if (cpu_is_mx6sl())
return ; 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, __raw_writel(BM_USBPHY_CTRL_ENHOSTDISCONDETECT,
MX6_IO_ADDRESS(pdata->phy_regs) MX6_IO_ADDRESS(pdata->phy_regs)
+ HW_USBPHY_CTRL_SET); + HW_USBPHY_CTRL_SET);
......
...@@ -244,18 +244,18 @@ static void usbh1_platform_rh_resume_swfix(struct fsl_usb2_platform_data *pdata) ...@@ -244,18 +244,18 @@ static void usbh1_platform_rh_resume_swfix(struct fsl_usb2_platform_data *pdata)
{ {
u32 index = 0; u32 index = 0;
if ((UH1_PORTSC1 & (3 << 26)) != (2 << 26)) if ((UOG_PORTSC1 & (PORTSC_PORT_SPEED_MASK)) != PORTSC_PORT_SPEED_HIGH)
return ; return ;
while ((UH1_PORTSC1 & PORTSC_PORT_FORCE_RESUME) while ((UH1_PORTSC1 & PORTSC_PORT_FORCE_RESUME)
&& (index < 1000)) { && (index < 1000)) {
udelay(500); udelay(500);
index++; index++;
} }
if (index >= 1000) 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); udelay(500);
fsl_platform_h1_set_usb_phy_dis(pdata, 1); 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) ...@@ -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) static void usbh1_platform_rh_resume(struct fsl_usb2_platform_data *pdata)
{ {
u32 index = 0;
/*for mx6sl ,we do not need any sw fix*/ /*for mx6sl ,we do not need any sw fix*/
if (cpu_is_mx6sl()) if (cpu_is_mx6sl())
return ; 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, __raw_writel(BM_USBPHY_CTRL_ENHOSTDISCONDETECT,
MX6_IO_ADDRESS(pdata->phy_regs) MX6_IO_ADDRESS(pdata->phy_regs)
+ HW_USBPHY_CTRL_SET); + HW_USBPHY_CTRL_SET);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment