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

Commit a5d7a6de authored by Gerhard Sittig's avatar Gerhard Sittig Committed by Anatolij Gustschin
Browse files

fsl-viu: cleanup clock API use



use devm_clk_get() for automatic put after device close, check for and
propagate errors when enabling clocks, need to prepare clocks before
they can get enabled, adjust code paths to correctly balance get/put and
prepare/unprepare and enable/disable calls

Cc: Mauro Carvalho Chehab <m.chehab@samsung.com>
Signed-off-by: default avatarGerhard Sittig <gsi@denx.de>
Signed-off-by: default avatarAnatolij Gustschin <agust@denx.de>
parent 180890c7
Loading
Loading
Loading
Loading
+13 −10
Original line number Original line Diff line number Diff line
@@ -1485,6 +1485,7 @@ static int viu_of_probe(struct platform_device *op)
	struct viu_reg __iomem *viu_regs;
	struct viu_reg __iomem *viu_regs;
	struct i2c_adapter *ad;
	struct i2c_adapter *ad;
	int ret, viu_irq;
	int ret, viu_irq;
	struct clk *clk;


	ret = of_address_to_resource(op->dev.of_node, 0, &r);
	ret = of_address_to_resource(op->dev.of_node, 0, &r);
	if (ret) {
	if (ret) {
@@ -1577,14 +1578,18 @@ static int viu_of_probe(struct platform_device *op)
	}
	}


	/* enable VIU clock */
	/* enable VIU clock */
	viu_dev->clk = clk_get(&op->dev, "viu_clk");
	clk = devm_clk_get(&op->dev, "viu_clk");
	if (IS_ERR(viu_dev->clk)) {
	if (IS_ERR(clk)) {
		dev_err(&op->dev, "failed to find the clock module!\n");
		dev_err(&op->dev, "failed to lookup the clock!\n");
		ret = -ENODEV;
		ret = PTR_ERR(clk);
		goto err_clk;
		goto err_clk;
	} else {
		clk_enable(viu_dev->clk);
	}
	}
	ret = clk_prepare_enable(clk);
	if (ret) {
		dev_err(&op->dev, "failed to enable the clock!\n");
		goto err_clk;
	}
	viu_dev->clk = clk;


	/* reset VIU module */
	/* reset VIU module */
	viu_reset(viu_dev->vr);
	viu_reset(viu_dev->vr);
@@ -1602,8 +1607,7 @@ static int viu_of_probe(struct platform_device *op)
	return ret;
	return ret;


err_irq:
err_irq:
	clk_disable(viu_dev->clk);
	clk_disable_unprepare(viu_dev->clk);
	clk_put(viu_dev->clk);
err_clk:
err_clk:
	video_unregister_device(viu_dev->vdev);
	video_unregister_device(viu_dev->vdev);
err_vdev:
err_vdev:
@@ -1626,8 +1630,7 @@ static int viu_of_remove(struct platform_device *op)
	free_irq(dev->irq, (void *)dev);
	free_irq(dev->irq, (void *)dev);
	irq_dispose_mapping(dev->irq);
	irq_dispose_mapping(dev->irq);


	clk_disable(dev->clk);
	clk_disable_unprepare(dev->clk);
	clk_put(dev->clk);


	video_unregister_device(dev->vdev);
	video_unregister_device(dev->vdev);
	i2c_put_adapter(client->adapter);
	i2c_put_adapter(client->adapter);