]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - drivers/media/platform/omap3isp/isp.c
Merge tag 'late-omap' of git://git.kernel.org/pub/scm/linux/kernel/git/arm/arm-soc
[karo-tx-linux.git] / drivers / media / platform / omap3isp / isp.c
index e7f5da0296f093b90735e4670a18cd0921fa5786..6e5ad8ec0a220f83cac3965b2da3c0cb6ad47fff 100644 (file)
@@ -1392,28 +1392,15 @@ static const char *isp_clocks[] = {
        "l3_ick",
 };
 
-static void isp_put_clocks(struct isp_device *isp)
-{
-       unsigned int i;
-
-       for (i = 0; i < ARRAY_SIZE(isp_clocks); ++i) {
-               if (isp->clock[i]) {
-                       clk_put(isp->clock[i]);
-                       isp->clock[i] = NULL;
-               }
-       }
-}
-
 static int isp_get_clocks(struct isp_device *isp)
 {
        struct clk *clk;
        unsigned int i;
 
        for (i = 0; i < ARRAY_SIZE(isp_clocks); ++i) {
-               clk = clk_get(isp->dev, isp_clocks[i]);
+               clk = devm_clk_get(isp->dev, isp_clocks[i]);
                if (IS_ERR(clk)) {
                        dev_err(isp->dev, "clk_get %s failed\n", isp_clocks[i]);
-                       isp_put_clocks(isp);
                        return PTR_ERR(clk);
                }
 
@@ -1979,7 +1966,6 @@ error_csiphy:
 static int isp_remove(struct platform_device *pdev)
 {
        struct isp_device *isp = platform_get_drvdata(pdev);
-       int i;
 
        isp_unregister_entities(isp);
        isp_cleanup_modules(isp);
@@ -1990,26 +1976,6 @@ static int isp_remove(struct platform_device *pdev)
        isp->domain = NULL;
        omap3isp_put(isp);
 
-       free_irq(isp->irq_num, isp);
-       isp_put_clocks(isp);
-
-       for (i = 0; i < OMAP3_ISP_IOMEM_LAST; i++) {
-               if (isp->mmio_base[i]) {
-                       iounmap(isp->mmio_base[i]);
-                       isp->mmio_base[i] = NULL;
-               }
-
-               if (isp->mmio_base_phys[i]) {
-                       release_mem_region(isp->mmio_base_phys[i],
-                                          isp->mmio_size[i]);
-                       isp->mmio_base_phys[i] = 0;
-               }
-       }
-
-       regulator_put(isp->isp_csiphy1.vdd);
-       regulator_put(isp->isp_csiphy2.vdd);
-       kfree(isp);
-
        return 0;
 }
 
@@ -2027,7 +1993,8 @@ static int isp_map_mem_resource(struct platform_device *pdev,
                return -ENODEV;
        }
 
-       if (!request_mem_region(mem->start, resource_size(mem), pdev->name)) {
+       if (!devm_request_mem_region(isp->dev, mem->start, resource_size(mem),
+                                    pdev->name)) {
                dev_err(isp->dev,
                        "cannot reserve camera register I/O region\n");
                return -ENODEV;
@@ -2036,8 +2003,9 @@ static int isp_map_mem_resource(struct platform_device *pdev,
        isp->mmio_size[res] = resource_size(mem);
 
        /* map the region */
-       isp->mmio_base[res] = ioremap_nocache(isp->mmio_base_phys[res],
-                                             isp->mmio_size[res]);
+       isp->mmio_base[res] = devm_ioremap_nocache(isp->dev,
+                                                  isp->mmio_base_phys[res],
+                                                  isp->mmio_size[res]);
        if (!isp->mmio_base[res]) {
                dev_err(isp->dev, "cannot map camera register I/O region\n");
                return -ENODEV;
@@ -2067,7 +2035,7 @@ static int isp_probe(struct platform_device *pdev)
        if (pdata == NULL)
                return -EINVAL;
 
-       isp = kzalloc(sizeof(*isp), GFP_KERNEL);
+       isp = devm_kzalloc(&pdev->dev, sizeof(*isp), GFP_KERNEL);
        if (!isp) {
                dev_err(&pdev->dev, "could not allocate memory\n");
                return -ENOMEM;
@@ -2090,8 +2058,8 @@ static int isp_probe(struct platform_device *pdev)
        platform_set_drvdata(pdev, isp);
 
        /* Regulators */
-       isp->isp_csiphy1.vdd = regulator_get(&pdev->dev, "VDD_CSIPHY1");
-       isp->isp_csiphy2.vdd = regulator_get(&pdev->dev, "VDD_CSIPHY2");
+       isp->isp_csiphy1.vdd = devm_regulator_get(&pdev->dev, "VDD_CSIPHY1");
+       isp->isp_csiphy2.vdd = devm_regulator_get(&pdev->dev, "VDD_CSIPHY2");
 
        /* Clocks
         *
@@ -2166,7 +2134,8 @@ static int isp_probe(struct platform_device *pdev)
                goto detach_dev;
        }
 
-       if (request_irq(isp->irq_num, isp_isr, IRQF_SHARED, "OMAP3 ISP", isp)) {
+       if (devm_request_irq(isp->dev, isp->irq_num, isp_isr, IRQF_SHARED,
+                            "OMAP3 ISP", isp)) {
                dev_err(isp->dev, "Unable to request IRQ\n");
                ret = -EINVAL;
                goto detach_dev;
@@ -2175,7 +2144,7 @@ static int isp_probe(struct platform_device *pdev)
        /* Entities */
        ret = isp_initialize_modules(isp);
        if (ret < 0)
-               goto error_irq;
+               goto detach_dev;
 
        ret = isp_register_entities(isp);
        if (ret < 0)
@@ -2188,8 +2157,6 @@ static int isp_probe(struct platform_device *pdev)
 
 error_modules:
        isp_cleanup_modules(isp);
-error_irq:
-       free_irq(isp->irq_num, isp);
 detach_dev:
        iommu_detach_device(isp->domain, &pdev->dev);
 free_domain:
@@ -2197,26 +2164,9 @@ free_domain:
 error_isp:
        omap3isp_put(isp);
 error:
-       isp_put_clocks(isp);
-
-       for (i = 0; i < OMAP3_ISP_IOMEM_LAST; i++) {
-               if (isp->mmio_base[i]) {
-                       iounmap(isp->mmio_base[i]);
-                       isp->mmio_base[i] = NULL;
-               }
-
-               if (isp->mmio_base_phys[i]) {
-                       release_mem_region(isp->mmio_base_phys[i],
-                                          isp->mmio_size[i]);
-                       isp->mmio_base_phys[i] = 0;
-               }
-       }
-       regulator_put(isp->isp_csiphy2.vdd);
-       regulator_put(isp->isp_csiphy1.vdd);
        platform_set_drvdata(pdev, NULL);
 
        mutex_destroy(&isp->isp_mutex);
-       kfree(isp);
 
        return ret;
 }