aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/platform
diff options
context:
space:
mode:
authorJavier Martin <javier.martin@vista-silicon.com>2012-08-01 05:16:44 -0400
committerMauro Carvalho Chehab <mchehab@redhat.com>2012-08-15 19:00:02 -0400
commiteb68faaf6685dca904cc92dfbe1028eb5475d662 (patch)
tree83dcedbff2e70fccd6defb926cea907ccd81d74b /drivers/media/platform
parentc72f429f665c1f8087dddde75f4e99f4d1f886cd (diff)
[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 <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>
Diffstat (limited to 'drivers/media/platform')
-rw-r--r--drivers/media/platform/mx2_camera.c43
1 files changed, 29 insertions, 14 deletions
diff --git a/drivers/media/platform/mx2_camera.c b/drivers/media/platform/mx2_camera.c
index 83eeaa69d8f7..256187f30a6c 100644
--- a/drivers/media/platform/mx2_camera.c
+++ b/drivers/media/platform/mx2_camera.c
@@ -272,7 +272,7 @@ struct mx2_camera_dev {
272 struct device *dev; 272 struct device *dev;
273 struct soc_camera_host soc_host; 273 struct soc_camera_host soc_host;
274 struct soc_camera_device *icd; 274 struct soc_camera_device *icd;
275 struct clk *clk_csi, *clk_emma; 275 struct clk *clk_csi, *clk_emma_ahb, *clk_emma_ipg;
276 276
277 unsigned int irq_csi, irq_emma; 277 unsigned int irq_csi, irq_emma;
278 void __iomem *base_csi, *base_emma; 278 void __iomem *base_csi, *base_emma;
@@ -1673,23 +1673,34 @@ static int __devinit mx27_camera_emma_init(struct mx2_camera_dev *pcdev)
1673 goto exit_iounmap; 1673 goto exit_iounmap;
1674 } 1674 }
1675 1675
1676 pcdev->clk_emma = clk_get(NULL, "emma"); 1676 pcdev->clk_emma_ipg = clk_get(pcdev->dev, "emma-ipg");
1677 if (IS_ERR(pcdev->clk_emma)) { 1677 if (IS_ERR(pcdev->clk_emma_ipg)) {
1678 err = PTR_ERR(pcdev->clk_emma); 1678 err = PTR_ERR(pcdev->clk_emma_ipg);
1679 goto exit_free_irq; 1679 goto exit_free_irq;
1680 } 1680 }
1681 1681
1682 clk_prepare_enable(pcdev->clk_emma); 1682 clk_prepare_enable(pcdev->clk_emma_ipg);
1683
1684 pcdev->clk_emma_ahb = clk_get(pcdev->dev, "emma-ahb");
1685 if (IS_ERR(pcdev->clk_emma_ahb)) {
1686 err = PTR_ERR(pcdev->clk_emma_ahb);
1687 goto exit_clk_emma_ipg_put;
1688 }
1689
1690 clk_prepare_enable(pcdev->clk_emma_ahb);
1683 1691
1684 err = mx27_camera_emma_prp_reset(pcdev); 1692 err = mx27_camera_emma_prp_reset(pcdev);
1685 if (err) 1693 if (err)
1686 goto exit_clk_emma_put; 1694 goto exit_clk_emma_ahb_put;
1687 1695
1688 return err; 1696 return err;
1689 1697
1690exit_clk_emma_put: 1698exit_clk_emma_ahb_put:
1691 clk_disable_unprepare(pcdev->clk_emma); 1699 clk_disable_unprepare(pcdev->clk_emma_ahb);
1692 clk_put(pcdev->clk_emma); 1700 clk_put(pcdev->clk_emma_ahb);
1701exit_clk_emma_ipg_put:
1702 clk_disable_unprepare(pcdev->clk_emma_ipg);
1703 clk_put(pcdev->clk_emma_ipg);
1693exit_free_irq: 1704exit_free_irq:
1694 free_irq(pcdev->irq_emma, pcdev); 1705 free_irq(pcdev->irq_emma, pcdev);
1695exit_iounmap: 1706exit_iounmap:
@@ -1725,7 +1736,7 @@ static int __devinit mx2_camera_probe(struct platform_device *pdev)
1725 goto exit; 1736 goto exit;
1726 } 1737 }
1727 1738
1728 pcdev->clk_csi = clk_get(&pdev->dev, NULL); 1739 pcdev->clk_csi = clk_get(&pdev->dev, "ahb");
1729 if (IS_ERR(pcdev->clk_csi)) { 1740 if (IS_ERR(pcdev->clk_csi)) {
1730 dev_err(&pdev->dev, "Could not get csi clock\n"); 1741 dev_err(&pdev->dev, "Could not get csi clock\n");
1731 err = PTR_ERR(pcdev->clk_csi); 1742 err = PTR_ERR(pcdev->clk_csi);
@@ -1825,8 +1836,10 @@ exit_free_emma:
1825eallocctx: 1836eallocctx:
1826 if (cpu_is_mx27()) { 1837 if (cpu_is_mx27()) {
1827 free_irq(pcdev->irq_emma, pcdev); 1838 free_irq(pcdev->irq_emma, pcdev);
1828 clk_disable_unprepare(pcdev->clk_emma); 1839 clk_disable_unprepare(pcdev->clk_emma_ipg);
1829 clk_put(pcdev->clk_emma); 1840 clk_put(pcdev->clk_emma_ipg);
1841 clk_disable_unprepare(pcdev->clk_emma_ahb);
1842 clk_put(pcdev->clk_emma_ahb);
1830 iounmap(pcdev->base_emma); 1843 iounmap(pcdev->base_emma);
1831 release_mem_region(pcdev->res_emma->start, resource_size(pcdev->res_emma)); 1844 release_mem_region(pcdev->res_emma->start, resource_size(pcdev->res_emma));
1832 } 1845 }
@@ -1865,8 +1878,10 @@ static int __devexit mx2_camera_remove(struct platform_device *pdev)
1865 iounmap(pcdev->base_csi); 1878 iounmap(pcdev->base_csi);
1866 1879
1867 if (cpu_is_mx27()) { 1880 if (cpu_is_mx27()) {
1868 clk_disable_unprepare(pcdev->clk_emma); 1881 clk_disable_unprepare(pcdev->clk_emma_ipg);
1869 clk_put(pcdev->clk_emma); 1882 clk_put(pcdev->clk_emma_ipg);
1883 clk_disable_unprepare(pcdev->clk_emma_ahb);
1884 clk_put(pcdev->clk_emma_ahb);
1870 iounmap(pcdev->base_emma); 1885 iounmap(pcdev->base_emma);
1871 res = pcdev->res_emma; 1886 res = pcdev->res_emma;
1872 release_mem_region(res->start, resource_size(res)); 1887 release_mem_region(res->start, resource_size(res));