mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-11-30 06:16:46 +07:00
[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>
This commit is contained in:
parent
f8afbf3caa
commit
ad5b987031
@ -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 @@ static int __devinit mx2_camera_probe(struct platform_device *pdev)
|
||||
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));
|
||||
|
Loading…
Reference in New Issue
Block a user