]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/commitdiff
HDQ driver: modify probe fn exit points
authorMadhusudhan Chikkature <madhu.cr@ti.com>
Thu, 25 Sep 2008 06:53:22 +0000 (12:23 +0530)
committerTony Lindgren <tony@atomide.com>
Mon, 6 Oct 2008 09:14:00 +0000 (12:14 +0300)
This patch fix the exit paths in the probe function.

Signed-off-by: Madhusudhan Chikkature <madhu.cr@ti.com>
Acked-by: Evgeniy Polyakov <johnpol@2ka.mipt.ru>
Acked-by: Felipe Balbi <felipe.balbi@nokia.com>
Signed-off-by: Tony Lindgren <tony@atomide.com>
drivers/w1/masters/omap_hdq.c

index 790cb1caf1aacfb7d4afffd958f300209c60b6e3..d86793b16867ed127b4035255fa01694cfdeee8f 100644 (file)
@@ -573,17 +573,20 @@ static int __init omap_hdq_probe(struct platform_device *pdev)
                return -ENODEV;
 
        hdq_data = kmalloc(sizeof(*hdq_data), GFP_KERNEL);
-       if (!hdq_data)
-               return -ENODEV;
+       if (!hdq_data) {
+               dev_dbg(&pdev->dev, "unable to allocate memory\n");
+               ret = -ENODEV;
+               goto err_kmalloc;
+       }
 
        hdq_data->dev = &pdev->dev;
        platform_set_drvdata(pdev, hdq_data);
 
        res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-       if (res == NULL) {
-               platform_set_drvdata(pdev, NULL);
-               kfree(hdq_data);
-               return -ENXIO;
+       if (!res) {
+               dev_dbg(&pdev->dev, "unable to get resource\n");
+               ret = ENXIO;
+               goto err_resource;
        }
 
        hdq_data->hdq_base = res->start;
@@ -596,15 +599,12 @@ static int __init omap_hdq_probe(struct platform_device *pdev)
                dev_dbg(&pdev->dev, "Can't get HDQ clock objects\n");
                if (IS_ERR(hdq_data->hdq_ick)) {
                        ret = PTR_ERR(hdq_data->hdq_ick);
-                       platform_set_drvdata(pdev, NULL);
-                       kfree(hdq_data);
-                       return ret;
+                       goto err_clk;
                }
                if (IS_ERR(hdq_data->hdq_fck)) {
                        ret = PTR_ERR(hdq_data->hdq_fck);
-                       platform_set_drvdata(pdev, NULL);
-                       kfree(hdq_data);
-                       return ret;
+                       clk_put(hdq_data->hdq_ick);
+                       goto err_clk;
                }
        }
 
@@ -613,21 +613,14 @@ static int __init omap_hdq_probe(struct platform_device *pdev)
 
        if (clk_enable(hdq_data->hdq_ick)) {
                dev_dbg(&pdev->dev, "Can not enable ick\n");
-               clk_put(hdq_data->hdq_ick);
-               clk_put(hdq_data->hdq_fck);
-               platform_set_drvdata(pdev, NULL);
-               kfree(hdq_data);
-               return -ENODEV;
+               ret = -ENODEV;
+               goto err_ick;
        }
 
        if (clk_enable(hdq_data->hdq_fck)) {
                dev_dbg(&pdev->dev, "Can not enable fck\n");
-               clk_disable(hdq_data->hdq_ick);
-               clk_put(hdq_data->hdq_ick);
-               clk_put(hdq_data->hdq_fck);
-               platform_set_drvdata(pdev, NULL);
-               kfree(hdq_data);
-               return -ENODEV;
+               ret = -ENODEV;
+               goto err_fck;
        }
 
        rev = hdq_reg_in(hdq_data, OMAP_HDQ_REVISION);
@@ -639,20 +632,14 @@ static int __init omap_hdq_probe(struct platform_device *pdev)
 
        irq = platform_get_irq(pdev, 0);
        if (irq < 0) {
-               platform_set_drvdata(pdev, NULL);
-               kfree(hdq_data);
-               return -ENXIO;
+               ret = -ENXIO;
+               goto err_irq;
        }
 
-       if (request_irq(irq, hdq_isr, IRQF_DISABLED, "OMAP HDQ",
-               hdq_data)) {
-               dev_dbg(&pdev->dev, "request_irq failed\n");
-               clk_disable(hdq_data->hdq_ick);
-               clk_put(hdq_data->hdq_ick);
-               clk_put(hdq_data->hdq_fck);
-               platform_set_drvdata(pdev, NULL);
-               kfree(hdq_data);
-               return -ENODEV;
+       ret = request_irq(irq, hdq_isr, IRQF_DISABLED, "omap_hdq", hdq_data);
+       if (ret < 0) {
+               dev_dbg(&pdev->dev, "could not request irq\n");
+               goto err_irq;
        }
 
        /* don't clock the HDQ until it is needed */
@@ -664,14 +651,32 @@ static int __init omap_hdq_probe(struct platform_device *pdev)
        ret = w1_add_master_device(&omap_w1_master);
        if (ret) {
                dev_dbg(&pdev->dev, "Failure in registering w1 master\n");
-               clk_put(hdq_data->hdq_ick);
-               clk_put(hdq_data->hdq_fck);
-               platform_set_drvdata(pdev, NULL);
-               kfree(hdq_data);
-               return ret;
+               goto err_w1;
        }
 
        return 0;
+
+err_w1:
+err_irq:
+       clk_disable(hdq_data->hdq_fck);
+
+err_fck:
+       clk_disable(hdq_data->hdq_ick);
+
+err_ick:
+       clk_put(hdq_data->hdq_ick);
+       clk_put(hdq_data->hdq_fck);
+
+err_clk:
+       hdq_data->hdq_base = NULL;
+
+err_resource:
+       platform_set_drvdata(pdev, NULL);
+       kfree(hdq_data);
+
+err_kmalloc:
+       return ret;
+
 }
 
 static int omap_hdq_remove(struct platform_device *pdev)