Re: [PATCH 3/10] HDQ driver: modify probe fn exit points

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Thu, Sep 25, 2008 at 12:23:22PM +0530, ext Gadiyar, Anand wrote:
> From: Madhusudhan Chikkature <madhu.cr@xxxxxx>
> 
> This patch fix the exit paths in the probe function.
> 
> Signed-off-by: Madhusudhan Chikkature <madhu.cr@xxxxxx>
Acked-by: Felipe Balbi <felipe.balbi@xxxxxxxxx>
> ---
>  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)
-- 
balbi
--
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

[Index of Archives]     [Linux Arm (vger)]     [ARM Kernel]     [ARM MSM]     [Linux Tegra]     [Linux WPAN Networking]     [Linux Wireless Networking]     [Maemo Users]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite Trails]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux