diff options
author | Frank Li <Frank.Li@freescale.com> | 2009-09-03 15:13:25 +0800 |
---|---|---|
committer | Frank Li <Frank.Li@freescale.com> | 2009-09-07 13:02:31 +0800 |
commit | cc0bbb9fe8fb2fd7202289cc375aa659eb9f29d8 (patch) | |
tree | 5119b6739085d4fa848012e381a6503b9e1d2984 | |
parent | 7ef7a69560ea61e26ccf2316ed50aa4c0ff9c72d (diff) |
ENGR00115080 Fix iMX23 usb host resume problem
[MX233_BSP] USB_HOST: hub 1-0:1.0: unable to enumerate USB device
on port 1 after power resume. 100%
BM_USBPHY_CTRL_ENHOSTDISCONDETECT need clear after usb host resume
BM_USBPHY_CTRL_ENHOSTDISCONDETECT should be enable only entry usb2.0 hight speed
Mode
Signed-off-by: Frank Li <Frank.Li@freescale.com>
-rw-r--r-- | arch/arm/mach-stmp3xxx/stmp378x_devb.c | 6 | ||||
-rw-r--r-- | drivers/usb/host/ehci-arc.c | 6 | ||||
-rw-r--r-- | include/linux/fsl_devices.h | 2 |
3 files changed, 14 insertions, 0 deletions
diff --git a/arch/arm/mach-stmp3xxx/stmp378x_devb.c b/arch/arm/mach-stmp3xxx/stmp378x_devb.c index 576f84de20df..c28adc142799 100644 --- a/arch/arm/mach-stmp3xxx/stmp378x_devb.c +++ b/arch/arm/mach-stmp3xxx/stmp378x_devb.c @@ -194,6 +194,11 @@ static struct gpmi_platform_data gpmi_partitions = { }, }; +static void usb_host_phy_resume(struct fsl_usb2_platform_data *pdata) +{ + HW_USBPHY_CTRL_CLR(BM_USBPHY_CTRL_ENHOSTDISCONDETECT); +} + static int usb_phy_enable(struct platform_device *pdev) { /* @@ -392,6 +397,7 @@ static void __init stmp378x_devb_init(void) udata = stmp3xxx_ehci.dev.platform_data; udata->platform_init = usb_phy_enable; + udata->platform_resume = usb_host_phy_resume; udata->pdev = &stmp3xxx_ehci ; spi_register_board_info(spi_board_info, ARRAY_SIZE(spi_board_info)); diff --git a/drivers/usb/host/ehci-arc.c b/drivers/usb/host/ehci-arc.c index c91634d68c0c..c14c8b3b75c1 100644 --- a/drivers/usb/host/ehci-arc.c +++ b/drivers/usb/host/ehci-arc.c @@ -559,6 +559,9 @@ static int ehci_fsl_drv_suspend(struct platform_device *pdev, ehci_writel(ehci, tmp, &ehci->regs->port_status[0]); } + if (pdata->platform_suspend) + pdata->platform_suspend(pdata); + return 0; } @@ -603,6 +606,9 @@ static int ehci_fsl_drv_resume(struct platform_device *pdev) /* set host mode */ fsl_platform_set_host_mode(hcd); + if (pdata->platform_resume) + pdata->platform_resume(pdata); + /* restore EHCI registers */ ehci_writel(ehci, pdata->pm_command, &ehci->regs->command); ehci_writel(ehci, pdata->pm_intr_enable, &ehci->regs->intr_enable); diff --git a/include/linux/fsl_devices.h b/include/linux/fsl_devices.h index de0c37d08b6c..ba1359cc75e5 100644 --- a/include/linux/fsl_devices.h +++ b/include/linux/fsl_devices.h @@ -120,6 +120,8 @@ struct fsl_usb2_platform_data { int (*gpio_usb_active) (void); void (*gpio_usb_inactive) (void); void (*usb_clock_for_pm) (bool); + void (*platform_suspend)(struct fsl_usb2_platform_data *); + void (*platform_resume)(struct fsl_usb2_platform_data *); unsigned big_endian_mmio : 1; unsigned big_endian_desc : 1; unsigned es : 1; /* need USBMODE:ES */ |