Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

[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
Loading
Loading
Loading
Loading
+29 −14
Original line number Diff line number Diff line
@@ -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));