From: Madhusudhan Chikkature <madhu.cr@xxxxxx> This patch fix the exit paths in the probe function. Signed-off-by: Madhusudhan Chikkature <madhu.cr@xxxxxx> --- drivers/w1/masters/omap_hdq.c | 85 ++++++++++++++++++++++-------------------- 1 files changed, 45 insertions(+), 40 deletions(-) Index: linux-omap-2.6/drivers/w1/masters/omap_hdq.c =================================================================== --- linux-omap-2.6.orig/drivers/w1/masters/omap_hdq.c 2008-09-23 17:04:50.000000000 +0530 +++ linux-omap-2.6/drivers/w1/masters/omap_hdq.c 2008-09-24 09:33:39.000000000 +0530 @@ -573,17 +573,20 @@ static int __init omap_hdq_probe(struct 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 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 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 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 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)-- 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