[PATCH 5/5] drm/exynos: Use devm_* functions in exynos_drm_g2d.c file

Inki Dae inki.dae at samsung.com
Tue Aug 7 18:18:47 PDT 2012



> -----Original Message-----
> From: Sachin Kamat [mailto:sachin.kamat at linaro.org]
> Sent: Monday, August 06, 2012 3:46 PM
> To: dri-devel at lists.freedesktop.org
> Cc: inki.dae at samsung.com; airlied at linux.ie; sachin.kamat at linaro.org;
> patches at linaro.org
> Subject: [PATCH 5/5] drm/exynos: Use devm_* functions in exynos_drm_g2d.c
> file
> 
> devm_* functions are device managed functions and make error handling
> and cleanup cleaner and simpler.
> 
> Signed-off-by: Sachin Kamat <sachin.kamat at linaro.org>
> ---
>  drivers/gpu/drm/exynos/exynos_drm_g2d.c |   50
++++++---------------------
> ---
>  1 files changed, 10 insertions(+), 40 deletions(-)
> 
> diff --git a/drivers/gpu/drm/exynos/exynos_drm_g2d.c
> b/drivers/gpu/drm/exynos/exynos_drm_g2d.c
> index d2d88f2..6adfa4e 100644
> --- a/drivers/gpu/drm/exynos/exynos_drm_g2d.c
> +++ b/drivers/gpu/drm/exynos/exynos_drm_g2d.c
> @@ -129,7 +129,6 @@ struct g2d_runqueue_node {
>  struct g2d_data {
>  	struct device			*dev;
>  	struct clk			*gate_clk;
> -	struct resource			*regs_res;
>  	void __iomem			*regs;
>  	int				irq;
>  	struct workqueue_struct		*g2d_workq;
> @@ -751,7 +750,7 @@ static int __devinit g2d_probe(struct platform_device
> *pdev)
>  	struct exynos_drm_subdrv *subdrv;
>  	int ret;
> 
> -	g2d = kzalloc(sizeof(*g2d), GFP_KERNEL);
> +	g2d = devm_kzalloc(&pdev->dev, sizeof(*g2d), GFP_KERNEL);
>  	if (!g2d) {
>  		dev_err(dev, "failed to allocate driver data\n");
>  		return -ENOMEM;
> @@ -759,10 +758,8 @@ static int __devinit g2d_probe(struct platform_device
> *pdev)
> 
>  	g2d->runqueue_slab = kmem_cache_create("g2d_runqueue_slab",
>  			sizeof(struct g2d_runqueue_node), 0, 0, NULL);
> -	if (!g2d->runqueue_slab) {
> -		ret = -ENOMEM;
> -		goto err_free_mem;
> -	}
> +	if (!g2d->runqueue_slab)
> +		return -ENOMEM;
> 
>  	g2d->dev = dev;
> 
> @@ -794,38 +791,26 @@ static int __devinit g2d_probe(struct
> platform_device *pdev)
>  	pm_runtime_enable(dev);
> 
>  	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
> -	if (!res) {
> -		dev_err(dev, "failed to get I/O memory\n");
> -		ret = -ENOENT;
> -		goto err_put_clk;
> -	}
> 
> -	g2d->regs_res = request_mem_region(res->start, resource_size(res),
> -					   dev_name(dev));
> -	if (!g2d->regs_res) {
> -		dev_err(dev, "failed to request I/O memory\n");
> -		ret = -ENOENT;
> -		goto err_put_clk;
> -	}
> -
> -	g2d->regs = ioremap(res->start, resource_size(res));
> +	g2d->regs = devm_request_and_ioremap(&pdev->dev, res);
>  	if (!g2d->regs) {
>  		dev_err(dev, "failed to remap I/O memory\n");
>  		ret = -ENXIO;
> -		goto err_release_res;
> +		goto err_put_clk;
>  	}
> 
>  	g2d->irq = platform_get_irq(pdev, 0);
>  	if (g2d->irq < 0) {
>  		dev_err(dev, "failed to get irq\n");
>  		ret = g2d->irq;
> -		goto err_unmap_base;
> +		goto err_put_clk;
>  	}
> 
> -	ret = request_irq(g2d->irq, g2d_irq_handler, 0, "drm_g2d", g2d);
> +	ret = devm_request_irq(&pdev->dev, g2d->irq, g2d_irq_handler, 0,
> +								"drm_g2d",
g2d);
>  	if (ret < 0) {
>  		dev_err(dev, "irq request failed\n");
> -		goto err_unmap_base;
> +		goto err_put_clk;
>  	}
> 
>  	platform_set_drvdata(pdev, g2d);
> @@ -838,7 +823,7 @@ static int __devinit g2d_probe(struct platform_device
> *pdev)
>  	ret = exynos_drm_subdrv_register(subdrv);
>  	if (ret < 0) {
>  		dev_err(dev, "failed to register drm g2d device\n");
> -		goto err_free_irq;
> +		goto err_put_clk;
>  	}
> 
>  	dev_info(dev, "The exynos g2d(ver %d.%d) successfully probed\n",
> @@ -846,13 +831,6 @@ static int __devinit g2d_probe(struct platform_device
> *pdev)
> 
>  	return 0;
> 
> -err_free_irq:
> -	free_irq(g2d->irq, g2d);
> -err_unmap_base:
> -	iounmap(g2d->regs);
> -err_release_res:
> -	release_resource(g2d->regs_res);
> -	kfree(g2d->regs_res);
>  err_put_clk:
>  	pm_runtime_disable(dev);
>  	clk_put(g2d->gate_clk);
> @@ -862,8 +840,6 @@ err_destroy_workqueue:
>  	destroy_workqueue(g2d->g2d_workq);
>  err_destroy_slab:
>  	kmem_cache_destroy(g2d->runqueue_slab);
> -err_free_mem:
> -	kfree(g2d);
>  	return ret;
>  }
> 
> @@ -873,24 +849,18 @@ static int __devexit g2d_remove(struct
> platform_device *pdev)
> 
>  	cancel_work_sync(&g2d->runqueue_work);
>  	exynos_drm_subdrv_unregister(&g2d->subdrv);
> -	free_irq(g2d->irq, g2d);
> 
>  	while (g2d->runqueue_node) {
>  		g2d_free_runqueue_node(g2d, g2d->runqueue_node);
>  		g2d->runqueue_node = g2d_get_runqueue_node(g2d);
>  	}
> 
> -	iounmap(g2d->regs);
> -	release_resource(g2d->regs_res);
> -	kfree(g2d->regs_res);
> -
>  	pm_runtime_disable(&pdev->dev);
>  	clk_put(g2d->gate_clk);
> 
>  	g2d_fini_cmdlist(g2d);
>  	destroy_workqueue(g2d->g2d_workq);
>  	kmem_cache_destroy(g2d->runqueue_slab);
> -	kfree(g2d);
> 
>  	return 0;
>  }
> --
> 1.7.4.1

Applied.

Thanks for your patch.



More information about the dri-devel mailing list