Commit ad5b9870 authored by Javier Martin's avatar Javier Martin Committed by Mauro Carvalho Chehab

[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: default avatarJavier Martin <javier.martin@vista-silicon.com>
[g.liakhovetski@gmx.de: rebase to the current media tree]
Signed-off-by: default avatarGuennadi Liakhovetski <g.liakhovetski@gmx.de>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent f8afbf3c
...@@ -272,7 +272,7 @@ struct mx2_camera_dev { ...@@ -272,7 +272,7 @@ struct mx2_camera_dev {
struct device *dev; struct device *dev;
struct soc_camera_host soc_host; struct soc_camera_host soc_host;
struct soc_camera_device *icd; 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; unsigned int irq_csi, irq_emma;
void __iomem *base_csi, *base_emma; void __iomem *base_csi, *base_emma;
...@@ -1633,23 +1633,34 @@ static int __devinit mx27_camera_emma_init(struct mx2_camera_dev *pcdev) ...@@ -1633,23 +1633,34 @@ static int __devinit mx27_camera_emma_init(struct mx2_camera_dev *pcdev)
goto exit_iounmap; goto exit_iounmap;
} }
pcdev->clk_emma = clk_get(NULL, "emma"); pcdev->clk_emma_ipg = clk_get(pcdev->dev, "emma-ipg");
if (IS_ERR(pcdev->clk_emma)) { if (IS_ERR(pcdev->clk_emma_ipg)) {
err = PTR_ERR(pcdev->clk_emma); err = PTR_ERR(pcdev->clk_emma_ipg);
goto exit_free_irq; 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); err = mx27_camera_emma_prp_reset(pcdev);
if (err) if (err)
goto exit_clk_emma_put; goto exit_clk_emma_ahb_put;
return err; return err;
exit_clk_emma_put: exit_clk_emma_ahb_put:
clk_disable_unprepare(pcdev->clk_emma); clk_disable_unprepare(pcdev->clk_emma_ahb);
clk_put(pcdev->clk_emma); 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: exit_free_irq:
free_irq(pcdev->irq_emma, pcdev); free_irq(pcdev->irq_emma, pcdev);
exit_iounmap: exit_iounmap:
...@@ -1685,7 +1696,7 @@ static int __devinit mx2_camera_probe(struct platform_device *pdev) ...@@ -1685,7 +1696,7 @@ static int __devinit mx2_camera_probe(struct platform_device *pdev)
goto exit; goto exit;
} }
pcdev->clk_csi = clk_get(&pdev->dev, NULL); pcdev->clk_csi = clk_get(&pdev->dev, "ahb");
if (IS_ERR(pcdev->clk_csi)) { if (IS_ERR(pcdev->clk_csi)) {
dev_err(&pdev->dev, "Could not get csi clock\n"); dev_err(&pdev->dev, "Could not get csi clock\n");
err = PTR_ERR(pcdev->clk_csi); err = PTR_ERR(pcdev->clk_csi);
...@@ -1785,8 +1796,10 @@ static int __devinit mx2_camera_probe(struct platform_device *pdev) ...@@ -1785,8 +1796,10 @@ static int __devinit mx2_camera_probe(struct platform_device *pdev)
eallocctx: eallocctx:
if (cpu_is_mx27()) { if (cpu_is_mx27()) {
free_irq(pcdev->irq_emma, pcdev); free_irq(pcdev->irq_emma, pcdev);
clk_disable_unprepare(pcdev->clk_emma); clk_disable_unprepare(pcdev->clk_emma_ipg);
clk_put(pcdev->clk_emma); clk_put(pcdev->clk_emma_ipg);
clk_disable_unprepare(pcdev->clk_emma_ahb);
clk_put(pcdev->clk_emma_ahb);
iounmap(pcdev->base_emma); iounmap(pcdev->base_emma);
release_mem_region(pcdev->res_emma->start, resource_size(pcdev->res_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) ...@@ -1825,8 +1838,10 @@ static int __devexit mx2_camera_remove(struct platform_device *pdev)
iounmap(pcdev->base_csi); iounmap(pcdev->base_csi);
if (cpu_is_mx27()) { if (cpu_is_mx27()) {
clk_disable_unprepare(pcdev->clk_emma); clk_disable_unprepare(pcdev->clk_emma_ipg);
clk_put(pcdev->clk_emma); clk_put(pcdev->clk_emma_ipg);
clk_disable_unprepare(pcdev->clk_emma_ahb);
clk_put(pcdev->clk_emma_ahb);
iounmap(pcdev->base_emma); iounmap(pcdev->base_emma);
res = pcdev->res_emma; res = pcdev->res_emma;
release_mem_region(res->start, resource_size(res)); release_mem_region(res->start, resource_size(res));
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment