Skip to content

Commit ad5b987

Browse files
jmartincMauro Carvalho Chehab
authored andcommitted
[media] media: mx2_camera: Fix clock handling for i.MX27
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 <[email protected]> [[email protected]: rebase to the current media tree] Signed-off-by: Guennadi Liakhovetski <[email protected]> Signed-off-by: Mauro Carvalho Chehab <[email protected]>
1 parent f8afbf3 commit ad5b987

File tree

1 file changed

+29
-14
lines changed

1 file changed

+29
-14
lines changed

drivers/media/video/mx2_camera.c

Lines changed: 29 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -272,7 +272,7 @@ struct mx2_camera_dev {
272272
struct device *dev;
273273
struct soc_camera_host soc_host;
274274
struct soc_camera_device *icd;
275-
struct clk *clk_csi, *clk_emma;
275+
struct clk *clk_csi, *clk_emma_ahb, *clk_emma_ipg;
276276

277277
unsigned int irq_csi, irq_emma;
278278
void __iomem *base_csi, *base_emma;
@@ -1633,23 +1633,34 @@ static int __devinit mx27_camera_emma_init(struct mx2_camera_dev *pcdev)
16331633
goto exit_iounmap;
16341634
}
16351635

1636-
pcdev->clk_emma = clk_get(NULL, "emma");
1637-
if (IS_ERR(pcdev->clk_emma)) {
1638-
err = PTR_ERR(pcdev->clk_emma);
1636+
pcdev->clk_emma_ipg = clk_get(pcdev->dev, "emma-ipg");
1637+
if (IS_ERR(pcdev->clk_emma_ipg)) {
1638+
err = PTR_ERR(pcdev->clk_emma_ipg);
16391639
goto exit_free_irq;
16401640
}
16411641

1642-
clk_prepare_enable(pcdev->clk_emma);
1642+
clk_prepare_enable(pcdev->clk_emma_ipg);
1643+
1644+
pcdev->clk_emma_ahb = clk_get(pcdev->dev, "emma-ahb");
1645+
if (IS_ERR(pcdev->clk_emma_ahb)) {
1646+
err = PTR_ERR(pcdev->clk_emma_ahb);
1647+
goto exit_clk_emma_ipg_put;
1648+
}
1649+
1650+
clk_prepare_enable(pcdev->clk_emma_ahb);
16431651

16441652
err = mx27_camera_emma_prp_reset(pcdev);
16451653
if (err)
1646-
goto exit_clk_emma_put;
1654+
goto exit_clk_emma_ahb_put;
16471655

16481656
return err;
16491657

1650-
exit_clk_emma_put:
1651-
clk_disable_unprepare(pcdev->clk_emma);
1652-
clk_put(pcdev->clk_emma);
1658+
exit_clk_emma_ahb_put:
1659+
clk_disable_unprepare(pcdev->clk_emma_ahb);
1660+
clk_put(pcdev->clk_emma_ahb);
1661+
exit_clk_emma_ipg_put:
1662+
clk_disable_unprepare(pcdev->clk_emma_ipg);
1663+
clk_put(pcdev->clk_emma_ipg);
16531664
exit_free_irq:
16541665
free_irq(pcdev->irq_emma, pcdev);
16551666
exit_iounmap:
@@ -1685,7 +1696,7 @@ static int __devinit mx2_camera_probe(struct platform_device *pdev)
16851696
goto exit;
16861697
}
16871698

1688-
pcdev->clk_csi = clk_get(&pdev->dev, NULL);
1699+
pcdev->clk_csi = clk_get(&pdev->dev, "ahb");
16891700
if (IS_ERR(pcdev->clk_csi)) {
16901701
dev_err(&pdev->dev, "Could not get csi clock\n");
16911702
err = PTR_ERR(pcdev->clk_csi);
@@ -1785,8 +1796,10 @@ static int __devinit mx2_camera_probe(struct platform_device *pdev)
17851796
eallocctx:
17861797
if (cpu_is_mx27()) {
17871798
free_irq(pcdev->irq_emma, pcdev);
1788-
clk_disable_unprepare(pcdev->clk_emma);
1789-
clk_put(pcdev->clk_emma);
1799+
clk_disable_unprepare(pcdev->clk_emma_ipg);
1800+
clk_put(pcdev->clk_emma_ipg);
1801+
clk_disable_unprepare(pcdev->clk_emma_ahb);
1802+
clk_put(pcdev->clk_emma_ahb);
17901803
iounmap(pcdev->base_emma);
17911804
release_mem_region(pcdev->res_emma->start, resource_size(pcdev->res_emma));
17921805
}
@@ -1825,8 +1838,10 @@ static int __devexit mx2_camera_remove(struct platform_device *pdev)
18251838
iounmap(pcdev->base_csi);
18261839

18271840
if (cpu_is_mx27()) {
1828-
clk_disable_unprepare(pcdev->clk_emma);
1829-
clk_put(pcdev->clk_emma);
1841+
clk_disable_unprepare(pcdev->clk_emma_ipg);
1842+
clk_put(pcdev->clk_emma_ipg);
1843+
clk_disable_unprepare(pcdev->clk_emma_ahb);
1844+
clk_put(pcdev->clk_emma_ahb);
18301845
iounmap(pcdev->base_emma);
18311846
res = pcdev->res_emma;
18321847
release_mem_region(res->start, resource_size(res));

0 commit comments

Comments
 (0)