On 09/12/2013 02:07 PM, Arun Kumar K wrote:

+static int fimc_is_probe(struct platform_device *pdev)
+{
+       struct device *dev =&pdev->dev;
+       struct resource *res;
+       struct fimc_is *is;
+       void __iomem *regs;
+       struct device_node *node;
+       int irq, ret;
+       int i;
+
+       dev_dbg(dev, "FIMC-IS Probe Enter\n");
+
+       if (!pdev->dev.of_node)

nit: Could be simplified to:

        if (!dev->of_node)

+               return -ENODEV;
+
+       is = devm_kzalloc(&pdev->dev, sizeof(*is), GFP_KERNEL);
+       if (!is)
+               return -ENOMEM;
+
+       is->pdev = pdev;
+
+       is->drvdata = fimc_is_get_drvdata(pdev);
+
+       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+       regs = devm_ioremap_resource(dev, res);
+       if (IS_ERR(regs))
+               return PTR_ERR(regs);
+
+       /* Get the PMU base */
+       node = of_parse_phandle(dev->of_node, "samsung,pmu", 0);
+       if (!node)
+               return -ENODEV;
+       is->pmu_regs = of_iomap(node, 0);
+       if (!is->pmu_regs)
+               return -ENOMEM;
+
+       irq = irq_of_parse_and_map(dev->of_node, 0);
+       if (irq<  0) {
+               dev_err(dev, "Failed to get IRQ\n");
+               return irq;
+       }
+
+       ret = fimc_is_configure_clocks(is);
+       if (ret<  0) {
+               dev_err(dev, "clocks configuration failed\n");
+               goto err_clk;
+       }
+
+       platform_set_drvdata(pdev, is);
+       pm_runtime_enable(dev);
+
+       ret = pm_runtime_get_sync(dev);
+       if (ret<  0)
+               goto err_pm;

Is activating the device at this point really needed ? Perhaps you
could drop the pm_runtime_get/put calls ?

+       is->alloc_ctx = vb2_dma_contig_init_ctx(dev);
+       if (IS_ERR(is->alloc_ctx)) {
+               ret = PTR_ERR(is->alloc_ctx);
+               goto err_vb;
+       }
+
+       /* Get IS-sensor contexts */
+       ret = fimc_is_parse_sensor(is);
+       if (ret<  0)
+               goto err_vb;
+
+       /* Initialize FIMC Pipeline */
+       for (i = 0; i<  is->drvdata->num_instances; i++) {
+               ret = fimc_is_pipeline_init(&is->pipeline[i], i, is);
+               if (ret<  0)
+                       goto err_sd;
+       }
+
+       /* Initialize FIMC Interface */
+       ret = fimc_is_interface_init(&is->interface, regs, irq);
+       if (ret<  0)
+               goto err_sd;
+
+       pm_runtime_put(dev);
+
+       dev_dbg(dev, "FIMC-IS registered successfully\n");
+
+       return 0;
+
+err_sd:
+       fimc_is_pipelines_destroy(is);
+err_vb:
+       vb2_dma_contig_cleanup_ctx(is->alloc_ctx);
+err_pm:
+       pm_runtime_put(dev);
+err_clk:
+       fimc_is_put_clocks(is);
+
+       return ret;
+}
+
+int fimc_is_clk_enable(struct fimc_is *is)
+{
+       int ret;
+
+       ret = clk_enable(is->clock[IS_CLK_ISP]);
+       if (ret)
+               return ret;
+       ret = clk_enable(is->clock[IS_CLK_MCU_ISP]);

Shouldn't you disable the first enabled clock when this call fails ?

+       return ret;
+}
[...]
+static void *fimc_is_get_drvdata(struct platform_device *pdev)
+{
+       struct fimc_is_drvdata *driver_data = NULL;
+
+       if (pdev->dev.of_node) {

pdev->dev.of_node is being tested against NULL before call to this
function, you could make this code slightly simpler with that assumption.

+               const struct of_device_id *match;
+               match = of_match_node(exynos5_fimc_is_match,
+                               pdev->dev.of_node);
+               if (match)
+                       driver_data = (struct fimc_is_drvdata *)match->data;
+       }
+       return driver_data;
+}

--
Thanks,
Sylwester
--
To unsubscribe from this list: send the line "unsubscribe linux-samsung-soc" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to