Remove the ehci_reset() call done in the ehci_run() routine of the USB EHCI host controller driver and add an ehci_reset() call to the probe routine of all EHCI platform drivers that do not already call ehci_reset(). The call to ehci_reset() from ehci_run() was problematic for several platform drivers, and unnecessary for others. This change moves the decision to call ehci_reset() at driver startup to the platform driver code. Signed-off-by: Geoff Levand <geoff@xxxxxxxxxxxxx> --- drivers/usb/host/ehci-ath79.c | 2 ++ drivers/usb/host/ehci-au1xxx.c | 1 + drivers/usb/host/ehci-cns3xxx.c | 3 +++ drivers/usb/host/ehci-fsl.c | 2 ++ drivers/usb/host/ehci-grlib.c | 2 ++ drivers/usb/host/ehci-hcd.c | 11 +---------- drivers/usb/host/ehci-ixp4xx.c | 2 ++ drivers/usb/host/ehci-msm.c | 2 ++ drivers/usb/host/ehci-mxc.c | 2 ++ drivers/usb/host/ehci-octeon.c | 2 ++ drivers/usb/host/ehci-omap.c | 2 ++ drivers/usb/host/ehci-orion.c | 2 ++ drivers/usb/host/ehci-pmcmsp.c | 3 +++ drivers/usb/host/ehci-ppc-of.c | 2 ++ drivers/usb/host/ehci-ps3.c | 2 ++ drivers/usb/host/ehci-pxa168.c | 2 ++ drivers/usb/host/ehci-s5p.c | 2 ++ drivers/usb/host/ehci-sh.c | 2 ++ drivers/usb/host/ehci-spear.c | 2 ++ drivers/usb/host/ehci-tegra.c | 2 ++ drivers/usb/host/ehci-vt8500.c | 1 + drivers/usb/host/ehci-w90x900.c | 2 ++ drivers/usb/host/ehci-xilinx-of.c | 3 +++ drivers/usb/host/ehci-xls.c | 3 +++ 24 files changed, 49 insertions(+), 10 deletions(-) diff --git a/drivers/usb/host/ehci-ath79.c b/drivers/usb/host/ehci-ath79.c index afb6743..ca7ffe9 100644 --- a/drivers/usb/host/ehci-ath79.c +++ b/drivers/usb/host/ehci-ath79.c @@ -167,6 +167,8 @@ static int ehci_ath79_probe(struct platform_device *pdev) if (ret) goto err_iounmap; + ehci_reset(hcd_to_ehci(hcd)); + return 0; err_iounmap: diff --git a/drivers/usb/host/ehci-au1xxx.c b/drivers/usb/host/ehci-au1xxx.c index 18bafa9..e30dd43 100644 --- a/drivers/usb/host/ehci-au1xxx.c +++ b/drivers/usb/host/ehci-au1xxx.c @@ -126,6 +126,7 @@ static int ehci_hcd_au1xxx_drv_probe(struct platform_device *pdev) IRQF_SHARED); if (ret == 0) { platform_set_drvdata(pdev, hcd); + ehci_reset(ehci); return ret; } diff --git a/drivers/usb/host/ehci-cns3xxx.c b/drivers/usb/host/ehci-cns3xxx.c index 6536abd..2ec7714 100644 --- a/drivers/usb/host/ehci-cns3xxx.c +++ b/drivers/usb/host/ehci-cns3xxx.c @@ -124,6 +124,9 @@ static int cns3xxx_ehci_probe(struct platform_device *pdev) } retval = usb_add_hcd(hcd, irq, IRQF_SHARED); + + ehci_reset(hcd_to_ehci(hcd)); + if (retval == 0) return retval; diff --git a/drivers/usb/host/ehci-fsl.c b/drivers/usb/host/ehci-fsl.c index e90344a..9a13418 100644 --- a/drivers/usb/host/ehci-fsl.c +++ b/drivers/usb/host/ehci-fsl.c @@ -161,6 +161,8 @@ static int usb_hcd_fsl_probe(const struct hc_driver *driver, } } #endif + ehci_reset(hcd_to_ehci(hcd)); + return retval; err4: diff --git a/drivers/usb/host/ehci-grlib.c b/drivers/usb/host/ehci-grlib.c index fdfd8c5..cd081b0 100644 --- a/drivers/usb/host/ehci-grlib.c +++ b/drivers/usb/host/ehci-grlib.c @@ -174,6 +174,8 @@ static int __devinit ehci_hcd_grlib_probe(struct platform_device *op) if (rv) goto err_ehci; + ehci_reset(ehci); + return 0; err_ehci: diff --git a/drivers/usb/host/ehci-hcd.c b/drivers/usb/host/ehci-hcd.c index 3ff9f82..46dccbf 100644 --- a/drivers/usb/host/ehci-hcd.c +++ b/drivers/usb/host/ehci-hcd.c @@ -677,22 +677,13 @@ static int ehci_init(struct usb_hcd *hcd) static int ehci_run (struct usb_hcd *hcd) { struct ehci_hcd *ehci = hcd_to_ehci (hcd); - int retval; u32 temp; u32 hcc_params; hcd->uses_new_polling = 1; /* EHCI spec section 4.1 */ - /* - * TDI driver does the ehci_reset in their reset callback. - * Don't reset here, because configuration settings will - * vanish. - */ - if (!ehci_is_TDI(ehci) && (retval = ehci_reset(ehci)) != 0) { - ehci_mem_cleanup(ehci); - return retval; - } + ehci_writel(ehci, ehci->periodic_dma, &ehci->regs->frame_list); ehci_writel(ehci, (u32)ehci->async->qh_dma, &ehci->regs->async_next); diff --git a/drivers/usb/host/ehci-ixp4xx.c b/drivers/usb/host/ehci-ixp4xx.c index c4460f3..09912e3 100644 --- a/drivers/usb/host/ehci-ixp4xx.c +++ b/drivers/usb/host/ehci-ixp4xx.c @@ -120,6 +120,8 @@ static int ixp4xx_ehci_probe(struct platform_device *pdev) if (retval) goto fail_add_hcd; + ehci_reset(hcd_to_ehci(hcd)); + return retval; fail_add_hcd: diff --git a/drivers/usb/host/ehci-msm.c b/drivers/usb/host/ehci-msm.c index 592d5f7..ad6e804 100644 --- a/drivers/usb/host/ehci-msm.c +++ b/drivers/usb/host/ehci-msm.c @@ -166,6 +166,8 @@ static int ehci_msm_probe(struct platform_device *pdev) pm_runtime_no_callbacks(&pdev->dev); pm_runtime_enable(&pdev->dev); + ehci_reset(hcd_to_ehci(hcd)); + return 0; put_transceiver: diff --git a/drivers/usb/host/ehci-mxc.c b/drivers/usb/host/ehci-mxc.c index 55978fc..760a8b6 100644 --- a/drivers/usb/host/ehci-mxc.c +++ b/drivers/usb/host/ehci-mxc.c @@ -257,6 +257,8 @@ static int ehci_mxc_drv_probe(struct platform_device *pdev) } } + ehci_reset(ehci); + return 0; err_add: diff --git a/drivers/usb/host/ehci-octeon.c b/drivers/usb/host/ehci-octeon.c index ba1f513..ce6d1ad 100644 --- a/drivers/usb/host/ehci-octeon.c +++ b/drivers/usb/host/ehci-octeon.c @@ -166,6 +166,8 @@ static int ehci_octeon_drv_probe(struct platform_device *pdev) /* root ports should always stay powered */ ehci_port_power(ehci, 1); + ehci_reset(ehci); + return 0; err3: ehci_octeon_stop(); diff --git a/drivers/usb/host/ehci-omap.c b/drivers/usb/host/ehci-omap.c index e39b029..59f4d5c 100644 --- a/drivers/usb/host/ehci-omap.c +++ b/drivers/usb/host/ehci-omap.c @@ -237,6 +237,8 @@ static int ehci_hcd_omap_probe(struct platform_device *pdev) /* root ports should always stay powered */ ehci_port_power(omap_ehci, 1); + ehci_reset(omap_ehci); + return 0; err_add_hcd: diff --git a/drivers/usb/host/ehci-orion.c b/drivers/usb/host/ehci-orion.c index a68a2a5..7edd9e8 100644 --- a/drivers/usb/host/ehci-orion.c +++ b/drivers/usb/host/ehci-orion.c @@ -281,6 +281,8 @@ static int __devinit ehci_orion_drv_probe(struct platform_device *pdev) if (err) goto err4; + ehci_reset(ehci); + return 0; err4: diff --git a/drivers/usb/host/ehci-pmcmsp.c b/drivers/usb/host/ehci-pmcmsp.c index e8d54de..b31e31f 100644 --- a/drivers/usb/host/ehci-pmcmsp.c +++ b/drivers/usb/host/ehci-pmcmsp.c @@ -224,6 +224,9 @@ int usb_hcd_msp_probe(const struct hc_driver *driver, retval = usb_add_hcd(hcd, res->start, IRQF_SHARED); + + ehci_reset(ehci); + if (retval == 0) return 0; diff --git a/drivers/usb/host/ehci-ppc-of.c b/drivers/usb/host/ehci-ppc-of.c index 41d11fe..5372e45 100644 --- a/drivers/usb/host/ehci-ppc-of.c +++ b/drivers/usb/host/ehci-ppc-of.c @@ -194,6 +194,8 @@ static int __devinit ehci_hcd_ppc_of_probe(struct platform_device *op) if (rv) goto err_ehci; + ehci_reset(ehci); + return 0; err_ehci: diff --git a/drivers/usb/host/ehci-ps3.c b/drivers/usb/host/ehci-ps3.c index 2dc32da..0fab1ae 100644 --- a/drivers/usb/host/ehci-ps3.c +++ b/drivers/usb/host/ehci-ps3.c @@ -175,6 +175,8 @@ static int __devinit ps3_ehci_probe(struct ps3_system_bus_device *dev) goto fail_add_hcd; } + ehci_reset(hcd_to_ehci(hcd)); + return result; fail_add_hcd: diff --git a/drivers/usb/host/ehci-pxa168.c b/drivers/usb/host/ehci-pxa168.c index ac0c16e..b4d2bf6 100644 --- a/drivers/usb/host/ehci-pxa168.c +++ b/drivers/usb/host/ehci-pxa168.c @@ -308,6 +308,8 @@ static int __devinit ehci_pxa168_drv_probe(struct platform_device *pdev) if (err) goto err5; + ehci_reset(ehci); + return 0; err5: diff --git a/drivers/usb/host/ehci-s5p.c b/drivers/usb/host/ehci-s5p.c index 024b65c..a8563b5 100644 --- a/drivers/usb/host/ehci-s5p.c +++ b/drivers/usb/host/ehci-s5p.c @@ -144,6 +144,8 @@ static int __devinit s5p_ehci_probe(struct platform_device *pdev) platform_set_drvdata(pdev, s5p_ehci); + ehci_reset(ehci); + return 0; fail: diff --git a/drivers/usb/host/ehci-sh.c b/drivers/usb/host/ehci-sh.c index 9d9cf47..ea8a6ea 100644 --- a/drivers/usb/host/ehci-sh.c +++ b/drivers/usb/host/ehci-sh.c @@ -177,6 +177,8 @@ static int ehci_hcd_sh_probe(struct platform_device *pdev) priv->hcd = hcd; platform_set_drvdata(pdev, priv); + ehci_reset(hcd_to_ehci(hcd)); + return ret; fail_add_hcd: diff --git a/drivers/usb/host/ehci-spear.c b/drivers/usb/host/ehci-spear.c index b115b0b..1aa5217 100644 --- a/drivers/usb/host/ehci-spear.c +++ b/drivers/usb/host/ehci-spear.c @@ -158,6 +158,8 @@ static int spear_ehci_hcd_drv_probe(struct platform_device *pdev) if (retval) goto fail_add_hcd; + ehci_reset(ehci); + return retval; fail_add_hcd: diff --git a/drivers/usb/host/ehci-tegra.c b/drivers/usb/host/ehci-tegra.c index db9d1b4..6e52884 100644 --- a/drivers/usb/host/ehci-tegra.c +++ b/drivers/usb/host/ehci-tegra.c @@ -680,6 +680,8 @@ static int tegra_ehci_probe(struct platform_device *pdev) goto fail; } + ehci_reset(tegra->ehci); + return err; fail: diff --git a/drivers/usb/host/ehci-vt8500.c b/drivers/usb/host/ehci-vt8500.c index 54d1ab8..768fd44 100644 --- a/drivers/usb/host/ehci-vt8500.c +++ b/drivers/usb/host/ehci-vt8500.c @@ -136,6 +136,7 @@ static int vt8500_ehci_drv_probe(struct platform_device *pdev) IRQF_SHARED); if (ret == 0) { platform_set_drvdata(pdev, hcd); + ehci_reset(ehci); return ret; } diff --git a/drivers/usb/host/ehci-w90x900.c b/drivers/usb/host/ehci-w90x900.c index d661cf7..c6ce24c 100644 --- a/drivers/usb/host/ehci-w90x900.c +++ b/drivers/usb/host/ehci-w90x900.c @@ -84,6 +84,8 @@ static int __devinit usb_w90x900_probe(const struct hc_driver *driver, ehci_writel(ehci, 1, &ehci->regs->configured_flag); + ehci_reset(ehci); + return retval; err4: iounmap(hcd->regs); diff --git a/drivers/usb/host/ehci-xilinx-of.c b/drivers/usb/host/ehci-xilinx-of.c index 32793ce..55e0f80 100644 --- a/drivers/usb/host/ehci-xilinx-of.c +++ b/drivers/usb/host/ehci-xilinx-of.c @@ -226,6 +226,9 @@ static int __devinit ehci_hcd_xilinx_of_probe(struct platform_device *op) ehci->hcs_params = ehci_readl(ehci, &ehci->caps->hcs_params); rv = usb_add_hcd(hcd, irq, 0); + + ehci_reset(ehci); + if (rv == 0) return 0; diff --git a/drivers/usb/host/ehci-xls.c b/drivers/usb/host/ehci-xls.c index fe74bd6..ac4b26e 100644 --- a/drivers/usb/host/ehci-xls.c +++ b/drivers/usb/host/ehci-xls.c @@ -88,6 +88,9 @@ int ehci_xls_probe_internal(const struct hc_driver *driver, retval = usb_add_hcd(hcd, irq, IRQF_SHARED); if (retval != 0) goto err4; + + ehci_reset(hcd_to_ehci(hcd)); + return retval; err4: -- 1.7.0.4 -- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html