[media] s5p-fimc: Convert to the device managed resources
authorSylwester Nawrocki <s.nawrocki@samsung.com>
Mon, 30 Jan 2012 14:37:59 +0000 (11:37 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Thu, 8 Mar 2012 10:40:40 +0000 (07:40 -0300)
The devm_* functions are used in the platform device probe() for data
that is freed on driver removal. The managed device layer takes care
of undoing actions taken in the probe callback() and freeing resources
on driver detach. This eliminates the need for manually releasing
resources and simplifies error handling.

Signed-off-by: Sylwester Nawrocki <s.nawrocki@samsung.com>
Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
drivers/media/video/s5p-fimc/fimc-core.c
drivers/media/video/s5p-fimc/fimc-core.h
drivers/media/video/s5p-fimc/fimc-mdevice.c

index a6b4580edd775bd2ea184a5d4e486e1d38c0c998..e184e650022a8a6b526b0eb0a254ebf9ed446bc0 100644 (file)
@@ -1678,8 +1678,6 @@ static int fimc_probe(struct platform_device *pdev)
        struct s5p_platform_fimc *pdata;
        int ret = 0;
 
-       dev_dbg(&pdev->dev, "%s():\n", __func__);
-
        drv_data = (struct samsung_fimc_driverdata *)
                platform_get_device_id(pdev)->driver_data;
 
@@ -1689,7 +1687,7 @@ static int fimc_probe(struct platform_device *pdev)
                return -EINVAL;
        }
 
-       fimc = kzalloc(sizeof(struct fimc_dev), GFP_KERNEL);
+       fimc = devm_kzalloc(&pdev->dev, sizeof(*fimc), GFP_KERNEL);
        if (!fimc)
                return -ENOMEM;
 
@@ -1700,51 +1698,35 @@ static int fimc_probe(struct platform_device *pdev)
        pdata = pdev->dev.platform_data;
        fimc->pdata = pdata;
 
-
        init_waitqueue_head(&fimc->irq_queue);
        spin_lock_init(&fimc->slock);
        mutex_init(&fimc->lock);
 
        res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-       if (!res) {
-               dev_err(&pdev->dev, "failed to find the registers\n");
-               ret = -ENOENT;
-               goto err_info;
-       }
-
-       fimc->regs_res = request_mem_region(res->start, resource_size(res),
-                       dev_name(&pdev->dev));
-       if (!fimc->regs_res) {
-               dev_err(&pdev->dev, "failed to obtain register region\n");
-               ret = -ENOENT;
-               goto err_info;
-       }
-
-       fimc->regs = ioremap(res->start, resource_size(res));
-       if (!fimc->regs) {
-               dev_err(&pdev->dev, "failed to map registers\n");
-               ret = -ENXIO;
-               goto err_req_region;
+       fimc->regs = devm_request_and_ioremap(&pdev->dev, res);
+       if (fimc->regs == NULL) {
+               dev_err(&pdev->dev, "Failed to obtain io memory\n");
+               return -ENOENT;
        }
 
        res = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
-       if (!res) {
-               dev_err(&pdev->dev, "failed to get IRQ resource\n");
-               ret = -ENXIO;
-               goto err_regs_unmap;
+       if (res == NULL) {
+               dev_err(&pdev->dev, "Failed to get IRQ resource\n");
+               return -ENXIO;
        }
        fimc->irq = res->start;
 
        fimc->num_clocks = MAX_FIMC_CLOCKS;
        ret = fimc_clk_get(fimc);
        if (ret)
-               goto err_regs_unmap;
+               return ret;
        clk_set_rate(fimc->clock[CLK_BUS], drv_data->lclk_frequency);
        clk_enable(fimc->clock[CLK_BUS]);
 
        platform_set_drvdata(pdev, fimc);
 
-       ret = request_irq(fimc->irq, fimc_irq_handler, 0, pdev->name, fimc);
+       ret = devm_request_irq(&pdev->dev, fimc->irq, fimc_irq_handler,
+                              0, pdev->name, fimc);
        if (ret) {
                dev_err(&pdev->dev, "failed to install irq (%d)\n", ret);
                goto err_clk;
@@ -1753,7 +1735,7 @@ static int fimc_probe(struct platform_device *pdev)
        pm_runtime_enable(&pdev->dev);
        ret = pm_runtime_get_sync(&pdev->dev);
        if (ret < 0)
-               goto err_irq;
+               goto err_clk;
        /* Initialize contiguous memory allocator */
        fimc->alloc_ctx = vb2_dma_contig_init_ctx(&pdev->dev);
        if (IS_ERR(fimc->alloc_ctx)) {
@@ -1768,17 +1750,8 @@ static int fimc_probe(struct platform_device *pdev)
 
 err_pm:
        pm_runtime_put(&pdev->dev);
-err_irq:
-       free_irq(fimc->irq, fimc);
 err_clk:
        fimc_clk_put(fimc);
-err_regs_unmap:
-       iounmap(fimc->regs);
-err_req_region:
-       release_resource(fimc->regs_res);
-       kfree(fimc->regs_res);
-err_info:
-       kfree(fimc);
        return ret;
 }
 
@@ -1865,11 +1838,6 @@ static int __devexit fimc_remove(struct platform_device *pdev)
 
        clk_disable(fimc->clock[CLK_BUS]);
        fimc_clk_put(fimc);
-       free_irq(fimc->irq, fimc);
-       iounmap(fimc->regs);
-       release_resource(fimc->regs_res);
-       kfree(fimc->regs_res);
-       kfree(fimc);
 
        dev_info(&pdev->dev, "driver unloaded\n");
        return 0;
index 4e20560c73d4d5ed6e74e81c324cd5ca7cc062ca..a18291e648e295fcd328f3dfc3c29d4768e3bfb4 100644 (file)
@@ -434,7 +434,6 @@ struct fimc_ctx;
  * @num_clocks: the number of clocks managed by this device instance
  * @clock:     clocks required for FIMC operation
  * @regs:      the mapped hardware registers
- * @regs_res:  the resource claimed for IO registers
  * @irq:       FIMC interrupt number
  * @irq_queue: interrupt handler waitqueue
  * @v4l2_dev:  root v4l2_device
@@ -454,7 +453,6 @@ struct fimc_dev {
        u16                             num_clocks;
        struct clk                      *clock[MAX_FIMC_CLOCKS];
        void __iomem                    *regs;
-       struct resource                 *regs_res;
        int                             irq;
        wait_queue_head_t               irq_queue;
        struct v4l2_device              *v4l2_dev;
index 8ea4ee116e46900224a528fa415d300d2c43196b..087ea098ea293b0f82bffc33a1ba3099c20ab6fa 100644 (file)
@@ -753,7 +753,7 @@ static int __devinit fimc_md_probe(struct platform_device *pdev)
        struct fimc_md *fmd;
        int ret;
 
-       fmd = kzalloc(sizeof(struct fimc_md), GFP_KERNEL);
+       fmd = devm_kzalloc(&pdev->dev, sizeof(*fmd), GFP_KERNEL);
        if (!fmd)
                return -ENOMEM;
 
@@ -774,7 +774,7 @@ static int __devinit fimc_md_probe(struct platform_device *pdev)
        ret = v4l2_device_register(&pdev->dev, &fmd->v4l2_dev);
        if (ret < 0) {
                v4l2_err(v4l2_dev, "Failed to register v4l2_device: %d\n", ret);
-               goto err1;
+               return ret;
        }
        ret = media_device_register(&fmd->media_dev);
        if (ret < 0) {
@@ -816,8 +816,6 @@ err3:
        fimc_md_unregister_entities(fmd);
 err2:
        v4l2_device_unregister(&fmd->v4l2_dev);
-err1:
-       kfree(fmd);
        return ret;
 }
 
@@ -831,7 +829,6 @@ static int __devexit fimc_md_remove(struct platform_device *pdev)
        fimc_md_unregister_entities(fmd);
        media_device_unregister(&fmd->media_dev);
        fimc_md_put_clocks(fmd);
-       kfree(fmd);
        return 0;
 }