aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGerhard Sittig <gsi@denx.de>2013-07-01 12:54:41 -0400
committerAnatolij Gustschin <agust@denx.de>2013-08-23 17:18:57 -0400
commita5d7a6dea6ac289669a6e7e8c7e7d66893a5c0f5 (patch)
tree0f14ad80c12f927a53d3a56887ed4dc6494e20a5
parent180890c74da72b5249f370edea426fbe076d37be (diff)
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: Gerhard Sittig <gsi@denx.de> Signed-off-by: Anatolij Gustschin <agust@denx.de>
-rw-r--r--drivers/media/platform/fsl-viu.c23
1 files changed, 13 insertions, 10 deletions
diff --git a/drivers/media/platform/fsl-viu.c b/drivers/media/platform/fsl-viu.c
index 221ec428a01e..fe9898ca3c84 100644
--- a/drivers/media/platform/fsl-viu.c
+++ b/drivers/media/platform/fsl-viu.c
@@ -1485,6 +1485,7 @@ static int viu_of_probe(struct platform_device *op)
1485 struct viu_reg __iomem *viu_regs; 1485 struct viu_reg __iomem *viu_regs;
1486 struct i2c_adapter *ad; 1486 struct i2c_adapter *ad;
1487 int ret, viu_irq; 1487 int ret, viu_irq;
1488 struct clk *clk;
1488 1489
1489 ret = of_address_to_resource(op->dev.of_node, 0, &r); 1490 ret = of_address_to_resource(op->dev.of_node, 0, &r);
1490 if (ret) { 1491 if (ret) {
@@ -1577,14 +1578,18 @@ static int viu_of_probe(struct platform_device *op)
1577 } 1578 }
1578 1579
1579 /* enable VIU clock */ 1580 /* enable VIU clock */
1580 viu_dev->clk = clk_get(&op->dev, "viu_clk"); 1581 clk = devm_clk_get(&op->dev, "viu_clk");
1581 if (IS_ERR(viu_dev->clk)) { 1582 if (IS_ERR(clk)) {
1582 dev_err(&op->dev, "failed to find the clock module!\n"); 1583 dev_err(&op->dev, "failed to lookup the clock!\n");
1583 ret = -ENODEV; 1584 ret = PTR_ERR(clk);
1585 goto err_clk;
1586 }
1587 ret = clk_prepare_enable(clk);
1588 if (ret) {
1589 dev_err(&op->dev, "failed to enable the clock!\n");
1584 goto err_clk; 1590 goto err_clk;
1585 } else {
1586 clk_enable(viu_dev->clk);
1587 } 1591 }
1592 viu_dev->clk = clk;
1588 1593
1589 /* reset VIU module */ 1594 /* reset VIU module */
1590 viu_reset(viu_dev->vr); 1595 viu_reset(viu_dev->vr);
@@ -1602,8 +1607,7 @@ static int viu_of_probe(struct platform_device *op)
1602 return ret; 1607 return ret;
1603 1608
1604err_irq: 1609err_irq:
1605 clk_disable(viu_dev->clk); 1610 clk_disable_unprepare(viu_dev->clk);
1606 clk_put(viu_dev->clk);
1607err_clk: 1611err_clk:
1608 video_unregister_device(viu_dev->vdev); 1612 video_unregister_device(viu_dev->vdev);
1609err_vdev: 1613err_vdev:
@@ -1626,8 +1630,7 @@ static int viu_of_remove(struct platform_device *op)
1626 free_irq(dev->irq, (void *)dev); 1630 free_irq(dev->irq, (void *)dev);
1627 irq_dispose_mapping(dev->irq); 1631 irq_dispose_mapping(dev->irq);
1628 1632
1629 clk_disable(dev->clk); 1633 clk_disable_unprepare(dev->clk);
1630 clk_put(dev->clk);
1631 1634
1632 video_unregister_device(dev->vdev); 1635 video_unregister_device(dev->vdev);
1633 i2c_put_adapter(client->adapter); 1636 i2c_put_adapter(client->adapter);