This patch: - sanitizes error path in ehci_hcd_omap_drv_probe(); - removes two unnecessary debugging messages, we only need debugging in the failing case generally; - fix a memory leak when omap_start_ehc() fails: the recently created hcd was never put in that case; Signed-off-by: Felipe Balbi <me@xxxxxxxxxxxxxxx> --- drivers/usb/host/ehci-omap.c | 53 +++++++++++++++++++++++++---------------- 1 files changed, 32 insertions(+), 21 deletions(-) diff --git a/drivers/usb/host/ehci-omap.c b/drivers/usb/host/ehci-omap.c index d994392..db4576d 100644 --- a/drivers/usb/host/ehci-omap.c +++ b/drivers/usb/host/ehci-omap.c @@ -418,21 +418,24 @@ static int ehci_hcd_omap_drv_probe(struct platform_device *pdev) struct usb_hcd *hcd; int irq = platform_get_irq(pdev, 0); - int retval = 0; - - dev_dbg(&pdev->dev, "ehci_hcd_omap_drv_probe()\n"); + int ret = -ENODEV; if (usb_disabled()) - return -ENODEV; + goto err_disabled; hcd = usb_create_hcd(&ehci_omap_hc_driver, &pdev->dev, dev_name(&pdev->dev)); - if (!hcd) - return -ENOMEM; + if (!hcd) { + dev_dbg(&pdev->dev, "failed to create hcd with err %d\n", ret); + ret = -ENOMEM; + goto err_create_hcd; + } - retval = omap_start_ehc(pdev, hcd); - if (retval) - return retval; + ret = omap_start_ehc(pdev, hcd); + if (ret) { + dev_dbg(&pdev->dev, "failed to start ehci\n"); + goto err_start; + } res = platform_get_resource(pdev, IORESOURCE_MEM, 0); @@ -444,12 +447,12 @@ static int ehci_hcd_omap_drv_probe(struct platform_device *pdev) hcd->regs = ioremap(hcd->rsrc_start, hcd->rsrc_len); if (!hcd->regs) { dev_err(&pdev->dev, "ioremap failed\n"); - return -ENOMEM; + ret = -ENOMEM; + goto err_ioremap; } ehci = hcd_to_ehci(hcd); ehci->caps = hcd->regs; - ehci->sbrn = 0x20; ehci->regs = hcd->regs + HC_LENGTH(readl(&ehci->caps->hc_capbase)); @@ -459,16 +462,26 @@ static int ehci_hcd_omap_drv_probe(struct platform_device *pdev) /* SET 1 micro-frame Interrupt interval */ writel(readl(&ehci->regs->command) | (1 << 16), &ehci->regs->command); - retval = usb_add_hcd(hcd, irq, IRQF_DISABLED | IRQF_SHARED); - if (retval == 0) - return retval; + ret = usb_add_hcd(hcd, irq, IRQF_DISABLED | IRQF_SHARED); + if (ret) { + dev_dbg(&pdev->dev, "failed to add hcd with err %d\n", ret); + goto err_add_hcd; + } - dev_dbg(&pdev->dev, "ERR: add_hcd\n"); - omap_stop_ehc(pdev, hcd); + return 0; + +err_add_hcd: iounmap(hcd->regs); + +err_ioremap: + omap_stop_ehc(pdev, hcd); + +err_start: usb_put_hcd(hcd); - return retval; +err_create_hcd: +err_disabled: + return ret; } /*-------------------------------------------------------------------------*/ @@ -490,12 +503,10 @@ static int ehci_hcd_omap_drv_remove(struct platform_device *pdev) { struct usb_hcd *hcd = platform_get_drvdata(pdev); - dev_dbg(&pdev->dev, "ehci_hcd_omap_drv_remove()\n"); - - iounmap(hcd->regs); usb_remove_hcd(hcd); - usb_put_hcd(hcd); + iounmap(hcd->regs); omap_stop_ehc(pdev, hcd); + usb_put_hcd(hcd); return 0; } -- 1.6.1.3 -- To unsubscribe from this list: send the line "unsubscribe linux-omap" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html