[media] media: mx2_camera: Fix clock handling for i.MX27
authorJavier Martin <javier.martin@vista-silicon.com>
Wed, 1 Aug 2012 09:16:44 +0000 (06:16 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Wed, 15 Aug 2012 22:24:20 +0000 (19:24 -0300)
On i.MX27 two clocks are required: emma-ipg and emma-ahb. The ahb clock
has to be requested using both a device and a connection ID.

Signed-off-by: Javier Martin <javier.martin@vista-silicon.com>
[g.liakhovetski@gmx.de: rebase to the current media tree]
Signed-off-by: Guennadi Liakhovetski <g.liakhovetski@gmx.de>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
drivers/media/video/mx2_camera.c

index 2c3ec94769a5e0a4523ff1bb7770140682c5aec7..ac175406e582a0c12c2d62fe8de713f89a5353cc 100644 (file)
@@ -272,7 +272,7 @@ struct mx2_camera_dev {
        struct device           *dev;
        struct soc_camera_host  soc_host;
        struct soc_camera_device *icd;
-       struct clk              *clk_csi, *clk_emma;
+       struct clk              *clk_csi, *clk_emma_ahb, *clk_emma_ipg;
 
        unsigned int            irq_csi, irq_emma;
        void __iomem            *base_csi, *base_emma;
@@ -1633,23 +1633,34 @@ static int __devinit mx27_camera_emma_init(struct mx2_camera_dev *pcdev)
                goto exit_iounmap;
        }
 
-       pcdev->clk_emma = clk_get(NULL, "emma");
-       if (IS_ERR(pcdev->clk_emma)) {
-               err = PTR_ERR(pcdev->clk_emma);
+       pcdev->clk_emma_ipg = clk_get(pcdev->dev, "emma-ipg");
+       if (IS_ERR(pcdev->clk_emma_ipg)) {
+               err = PTR_ERR(pcdev->clk_emma_ipg);
                goto exit_free_irq;
        }
 
-       clk_prepare_enable(pcdev->clk_emma);
+       clk_prepare_enable(pcdev->clk_emma_ipg);
+
+       pcdev->clk_emma_ahb = clk_get(pcdev->dev, "emma-ahb");
+       if (IS_ERR(pcdev->clk_emma_ahb)) {
+               err = PTR_ERR(pcdev->clk_emma_ahb);
+               goto exit_clk_emma_ipg_put;
+       }
+
+       clk_prepare_enable(pcdev->clk_emma_ahb);
 
        err = mx27_camera_emma_prp_reset(pcdev);
        if (err)
-               goto exit_clk_emma_put;
+               goto exit_clk_emma_ahb_put;
 
        return err;
 
-exit_clk_emma_put:
-       clk_disable_unprepare(pcdev->clk_emma);
-       clk_put(pcdev->clk_emma);
+exit_clk_emma_ahb_put:
+       clk_disable_unprepare(pcdev->clk_emma_ahb);
+       clk_put(pcdev->clk_emma_ahb);
+exit_clk_emma_ipg_put:
+       clk_disable_unprepare(pcdev->clk_emma_ipg);
+       clk_put(pcdev->clk_emma_ipg);
 exit_free_irq:
        free_irq(pcdev->irq_emma, pcdev);
 exit_iounmap:
@@ -1685,7 +1696,7 @@ static int __devinit mx2_camera_probe(struct platform_device *pdev)
                goto exit;
        }
 
-       pcdev->clk_csi = clk_get(&pdev->dev, NULL);
+       pcdev->clk_csi = clk_get(&pdev->dev, "ahb");
        if (IS_ERR(pcdev->clk_csi)) {
                dev_err(&pdev->dev, "Could not get csi clock\n");
                err = PTR_ERR(pcdev->clk_csi);
@@ -1785,8 +1796,10 @@ exit_free_emma:
 eallocctx:
        if (cpu_is_mx27()) {
                free_irq(pcdev->irq_emma, pcdev);
-               clk_disable_unprepare(pcdev->clk_emma);
-               clk_put(pcdev->clk_emma);
+               clk_disable_unprepare(pcdev->clk_emma_ipg);
+               clk_put(pcdev->clk_emma_ipg);
+               clk_disable_unprepare(pcdev->clk_emma_ahb);
+               clk_put(pcdev->clk_emma_ahb);
                iounmap(pcdev->base_emma);
                release_mem_region(pcdev->res_emma->start, resource_size(pcdev->res_emma));
        }
@@ -1825,8 +1838,10 @@ static int __devexit mx2_camera_remove(struct platform_device *pdev)
        iounmap(pcdev->base_csi);
 
        if (cpu_is_mx27()) {
-               clk_disable_unprepare(pcdev->clk_emma);
-               clk_put(pcdev->clk_emma);
+               clk_disable_unprepare(pcdev->clk_emma_ipg);
+               clk_put(pcdev->clk_emma_ipg);
+               clk_disable_unprepare(pcdev->clk_emma_ahb);
+               clk_put(pcdev->clk_emma_ahb);
                iounmap(pcdev->base_emma);
                res = pcdev->res_emma;
                release_mem_region(res->start, resource_size(res));