summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFrank Li <Frank.Li@freescale.com>2009-09-03 15:13:25 +0800
committerFrank Li <Frank.Li@freescale.com>2009-09-07 13:02:31 +0800
commitcc0bbb9fe8fb2fd7202289cc375aa659eb9f29d8 (patch)
tree5119b6739085d4fa848012e381a6503b9e1d2984
parent7ef7a69560ea61e26ccf2316ed50aa4c0ff9c72d (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.c6
-rw-r--r--drivers/usb/host/ehci-arc.c6
-rw-r--r--include/linux/fsl_devices.h2
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 */