diff options
author | Javier Martin <javier.martin@vista-silicon.com> | 2012-08-01 05:16:44 -0400 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@redhat.com> | 2012-08-15 19:00:02 -0400 |
commit | eb68faaf6685dca904cc92dfbe1028eb5475d662 (patch) | |
tree | 83dcedbff2e70fccd6defb926cea907ccd81d74b /drivers/media/platform | |
parent | c72f429f665c1f8087dddde75f4e99f4d1f886cd (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.c | 43 |
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 | ||
1690 | exit_clk_emma_put: | 1698 | exit_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); |
1701 | exit_clk_emma_ipg_put: | ||
1702 | clk_disable_unprepare(pcdev->clk_emma_ipg); | ||
1703 | clk_put(pcdev->clk_emma_ipg); | ||
1693 | exit_free_irq: | 1704 | exit_free_irq: |
1694 | free_irq(pcdev->irq_emma, pcdev); | 1705 | free_irq(pcdev->irq_emma, pcdev); |
1695 | exit_iounmap: | 1706 | exit_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: | |||
1825 | eallocctx: | 1836 | eallocctx: |
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)); |