aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/video/s5p-fimc
diff options
context:
space:
mode:
authorSylwester Nawrocki <s.nawrocki@samsung.com>2012-01-30 09:37:59 -0500
committerMauro Carvalho Chehab <mchehab@redhat.com>2012-03-08 05:40:40 -0500
commit6d91a51ae1cb597100e17a75370bb2ad9c7da6d6 (patch)
tree38c4466f473c3d600850be2b9c9d15631b3daaea /drivers/media/video/s5p-fimc
parent2def9946c3dfb7fd8ff47af7499bb3f6b5a5743f (diff)
[media] s5p-fimc: Convert to the device managed resources
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>
Diffstat (limited to 'drivers/media/video/s5p-fimc')
-rw-r--r--drivers/media/video/s5p-fimc/fimc-core.c56
-rw-r--r--drivers/media/video/s5p-fimc/fimc-core.h2
-rw-r--r--drivers/media/video/s5p-fimc/fimc-mdevice.c7
3 files changed, 14 insertions, 51 deletions
diff --git a/drivers/media/video/s5p-fimc/fimc-core.c b/drivers/media/video/s5p-fimc/fimc-core.c
index a6b4580edd77..e184e650022a 100644
--- a/drivers/media/video/s5p-fimc/fimc-core.c
+++ b/drivers/media/video/s5p-fimc/fimc-core.c
@@ -1678,8 +1678,6 @@ static int fimc_probe(struct platform_device *pdev)
1678 struct s5p_platform_fimc *pdata; 1678 struct s5p_platform_fimc *pdata;
1679 int ret = 0; 1679 int ret = 0;
1680 1680
1681 dev_dbg(&pdev->dev, "%s():\n", __func__);
1682
1683 drv_data = (struct samsung_fimc_driverdata *) 1681 drv_data = (struct samsung_fimc_driverdata *)
1684 platform_get_device_id(pdev)->driver_data; 1682 platform_get_device_id(pdev)->driver_data;
1685 1683
@@ -1689,7 +1687,7 @@ static int fimc_probe(struct platform_device *pdev)
1689 return -EINVAL; 1687 return -EINVAL;
1690 } 1688 }
1691 1689
1692 fimc = kzalloc(sizeof(struct fimc_dev), GFP_KERNEL); 1690 fimc = devm_kzalloc(&pdev->dev, sizeof(*fimc), GFP_KERNEL);
1693 if (!fimc) 1691 if (!fimc)
1694 return -ENOMEM; 1692 return -ENOMEM;
1695 1693
@@ -1700,51 +1698,35 @@ static int fimc_probe(struct platform_device *pdev)
1700 pdata = pdev->dev.platform_data; 1698 pdata = pdev->dev.platform_data;
1701 fimc->pdata = pdata; 1699 fimc->pdata = pdata;
1702 1700
1703
1704 init_waitqueue_head(&fimc->irq_queue); 1701 init_waitqueue_head(&fimc->irq_queue);
1705 spin_lock_init(&fimc->slock); 1702 spin_lock_init(&fimc->slock);
1706 mutex_init(&fimc->lock); 1703 mutex_init(&fimc->lock);
1707 1704
1708 res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 1705 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
1709 if (!res) { 1706 fimc->regs = devm_request_and_ioremap(&pdev->dev, res);
1710 dev_err(&pdev->dev, "failed to find the registers\n"); 1707 if (fimc->regs == NULL) {
1711 ret = -ENOENT; 1708 dev_err(&pdev->dev, "Failed to obtain io memory\n");
1712 goto err_info; 1709 return -ENOENT;
1713 }
1714
1715 fimc->regs_res = request_mem_region(res->start, resource_size(res),
1716 dev_name(&pdev->dev));
1717 if (!fimc->regs_res) {
1718 dev_err(&pdev->dev, "failed to obtain register region\n");
1719 ret = -ENOENT;
1720 goto err_info;
1721 }
1722
1723 fimc->regs = ioremap(res->start, resource_size(res));
1724 if (!fimc->regs) {
1725 dev_err(&pdev->dev, "failed to map registers\n");
1726 ret = -ENXIO;
1727 goto err_req_region;
1728 } 1710 }
1729 1711
1730 res = platform_get_resource(pdev, IORESOURCE_IRQ, 0); 1712 res = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
1731 if (!res) { 1713 if (res == NULL) {
1732 dev_err(&pdev->dev, "failed to get IRQ resource\n"); 1714 dev_err(&pdev->dev, "Failed to get IRQ resource\n");
1733 ret = -ENXIO; 1715 return -ENXIO;
1734 goto err_regs_unmap;
1735 } 1716 }
1736 fimc->irq = res->start; 1717 fimc->irq = res->start;
1737 1718
1738 fimc->num_clocks = MAX_FIMC_CLOCKS; 1719 fimc->num_clocks = MAX_FIMC_CLOCKS;
1739 ret = fimc_clk_get(fimc); 1720 ret = fimc_clk_get(fimc);
1740 if (ret) 1721 if (ret)
1741 goto err_regs_unmap; 1722 return ret;
1742 clk_set_rate(fimc->clock[CLK_BUS], drv_data->lclk_frequency); 1723 clk_set_rate(fimc->clock[CLK_BUS], drv_data->lclk_frequency);
1743 clk_enable(fimc->clock[CLK_BUS]); 1724 clk_enable(fimc->clock[CLK_BUS]);
1744 1725
1745 platform_set_drvdata(pdev, fimc); 1726 platform_set_drvdata(pdev, fimc);
1746 1727
1747 ret = request_irq(fimc->irq, fimc_irq_handler, 0, pdev->name, fimc); 1728 ret = devm_request_irq(&pdev->dev, fimc->irq, fimc_irq_handler,
1729 0, pdev->name, fimc);
1748 if (ret) { 1730 if (ret) {
1749 dev_err(&pdev->dev, "failed to install irq (%d)\n", ret); 1731 dev_err(&pdev->dev, "failed to install irq (%d)\n", ret);
1750 goto err_clk; 1732 goto err_clk;
@@ -1753,7 +1735,7 @@ static int fimc_probe(struct platform_device *pdev)
1753 pm_runtime_enable(&pdev->dev); 1735 pm_runtime_enable(&pdev->dev);
1754 ret = pm_runtime_get_sync(&pdev->dev); 1736 ret = pm_runtime_get_sync(&pdev->dev);
1755 if (ret < 0) 1737 if (ret < 0)
1756 goto err_irq; 1738 goto err_clk;
1757 /* Initialize contiguous memory allocator */ 1739 /* Initialize contiguous memory allocator */
1758 fimc->alloc_ctx = vb2_dma_contig_init_ctx(&pdev->dev); 1740 fimc->alloc_ctx = vb2_dma_contig_init_ctx(&pdev->dev);
1759 if (IS_ERR(fimc->alloc_ctx)) { 1741 if (IS_ERR(fimc->alloc_ctx)) {
@@ -1768,17 +1750,8 @@ static int fimc_probe(struct platform_device *pdev)
1768 1750
1769err_pm: 1751err_pm:
1770 pm_runtime_put(&pdev->dev); 1752 pm_runtime_put(&pdev->dev);
1771err_irq:
1772 free_irq(fimc->irq, fimc);
1773err_clk: 1753err_clk:
1774 fimc_clk_put(fimc); 1754 fimc_clk_put(fimc);
1775err_regs_unmap:
1776 iounmap(fimc->regs);
1777err_req_region:
1778 release_resource(fimc->regs_res);
1779 kfree(fimc->regs_res);
1780err_info:
1781 kfree(fimc);
1782 return ret; 1755 return ret;
1783} 1756}
1784 1757
@@ -1865,11 +1838,6 @@ static int __devexit fimc_remove(struct platform_device *pdev)
1865 1838
1866 clk_disable(fimc->clock[CLK_BUS]); 1839 clk_disable(fimc->clock[CLK_BUS]);
1867 fimc_clk_put(fimc); 1840 fimc_clk_put(fimc);
1868 free_irq(fimc->irq, fimc);
1869 iounmap(fimc->regs);
1870 release_resource(fimc->regs_res);
1871 kfree(fimc->regs_res);
1872 kfree(fimc);
1873 1841
1874 dev_info(&pdev->dev, "driver unloaded\n"); 1842 dev_info(&pdev->dev, "driver unloaded\n");
1875 return 0; 1843 return 0;
diff --git a/drivers/media/video/s5p-fimc/fimc-core.h b/drivers/media/video/s5p-fimc/fimc-core.h
index 4e20560c73d4..a18291e648e2 100644
--- a/drivers/media/video/s5p-fimc/fimc-core.h
+++ b/drivers/media/video/s5p-fimc/fimc-core.h
@@ -434,7 +434,6 @@ struct fimc_ctx;
434 * @num_clocks: the number of clocks managed by this device instance 434 * @num_clocks: the number of clocks managed by this device instance
435 * @clock: clocks required for FIMC operation 435 * @clock: clocks required for FIMC operation
436 * @regs: the mapped hardware registers 436 * @regs: the mapped hardware registers
437 * @regs_res: the resource claimed for IO registers
438 * @irq: FIMC interrupt number 437 * @irq: FIMC interrupt number
439 * @irq_queue: interrupt handler waitqueue 438 * @irq_queue: interrupt handler waitqueue
440 * @v4l2_dev: root v4l2_device 439 * @v4l2_dev: root v4l2_device
@@ -454,7 +453,6 @@ struct fimc_dev {
454 u16 num_clocks; 453 u16 num_clocks;
455 struct clk *clock[MAX_FIMC_CLOCKS]; 454 struct clk *clock[MAX_FIMC_CLOCKS];
456 void __iomem *regs; 455 void __iomem *regs;
457 struct resource *regs_res;
458 int irq; 456 int irq;
459 wait_queue_head_t irq_queue; 457 wait_queue_head_t irq_queue;
460 struct v4l2_device *v4l2_dev; 458 struct v4l2_device *v4l2_dev;
diff --git a/drivers/media/video/s5p-fimc/fimc-mdevice.c b/drivers/media/video/s5p-fimc/fimc-mdevice.c
index 8ea4ee116e46..087ea098ea29 100644
--- a/drivers/media/video/s5p-fimc/fimc-mdevice.c
+++ b/drivers/media/video/s5p-fimc/fimc-mdevice.c
@@ -753,7 +753,7 @@ static int __devinit fimc_md_probe(struct platform_device *pdev)
753 struct fimc_md *fmd; 753 struct fimc_md *fmd;
754 int ret; 754 int ret;
755 755
756 fmd = kzalloc(sizeof(struct fimc_md), GFP_KERNEL); 756 fmd = devm_kzalloc(&pdev->dev, sizeof(*fmd), GFP_KERNEL);
757 if (!fmd) 757 if (!fmd)
758 return -ENOMEM; 758 return -ENOMEM;
759 759
@@ -774,7 +774,7 @@ static int __devinit fimc_md_probe(struct platform_device *pdev)
774 ret = v4l2_device_register(&pdev->dev, &fmd->v4l2_dev); 774 ret = v4l2_device_register(&pdev->dev, &fmd->v4l2_dev);
775 if (ret < 0) { 775 if (ret < 0) {
776 v4l2_err(v4l2_dev, "Failed to register v4l2_device: %d\n", ret); 776 v4l2_err(v4l2_dev, "Failed to register v4l2_device: %d\n", ret);
777 goto err1; 777 return ret;
778 } 778 }
779 ret = media_device_register(&fmd->media_dev); 779 ret = media_device_register(&fmd->media_dev);
780 if (ret < 0) { 780 if (ret < 0) {
@@ -816,8 +816,6 @@ err3:
816 fimc_md_unregister_entities(fmd); 816 fimc_md_unregister_entities(fmd);
817err2: 817err2:
818 v4l2_device_unregister(&fmd->v4l2_dev); 818 v4l2_device_unregister(&fmd->v4l2_dev);
819err1:
820 kfree(fmd);
821 return ret; 819 return ret;
822} 820}
823 821
@@ -831,7 +829,6 @@ static int __devexit fimc_md_remove(struct platform_device *pdev)
831 fimc_md_unregister_entities(fmd); 829 fimc_md_unregister_entities(fmd);
832 media_device_unregister(&fmd->media_dev); 830 media_device_unregister(&fmd->media_dev);
833 fimc_md_put_clocks(fmd); 831 fimc_md_put_clocks(fmd);
834 kfree(fmd);
835 return 0; 832 return 0;
836} 833}
837 834