[rft/rfc/patch-v2.6.29-rc5+,06/23] usb: host: ehci: sanitize error path
diff mbox

Message ID 1235415335-17408-7-git-send-email-me@felipebalbi.com
State RFC
Delegated to: Felipe Balbi
Headers show

Commit Message

Felipe Balbi Feb. 23, 2009, 6:55 p.m. UTC
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@felipebalbi.com>
---
 drivers/usb/host/ehci-omap.c |   53 +++++++++++++++++++++++++----------------
 1 files changed, 32 insertions(+), 21 deletions(-)

Patch
diff mbox

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;
 }