From bda8fa890b34c28085d87c5e6c272a968970fe84 Mon Sep 17 00:00:00 2001 From: Madhusudhan Chikkature Date: Thu, 25 Sep 2008 12:23:22 +0530 Subject: [PATCH] HDQ driver: modify probe fn exit points This patch fix the exit paths in the probe function. Signed-off-by: Madhusudhan Chikkature Acked-by: Evgeniy Polyakov Acked-by: Felipe Balbi Signed-off-by: Tony Lindgren --- drivers/w1/masters/omap_hdq.c | 85 ++++++++++++++++++----------------- 1 file changed, 45 insertions(+), 40 deletions(-) diff --git a/drivers/w1/masters/omap_hdq.c b/drivers/w1/masters/omap_hdq.c index 790cb1caf1a..d86793b1686 100644 --- a/drivers/w1/masters/omap_hdq.c +++ b/drivers/w1/masters/omap_hdq.c @@ -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) -- 2.41.1