diff options
author | Gerhard Sittig <gsi@denx.de> | 2013-07-01 12:54:41 -0400 |
---|---|---|
committer | Anatolij Gustschin <agust@denx.de> | 2013-08-23 17:18:57 -0400 |
commit | a5d7a6dea6ac289669a6e7e8c7e7d66893a5c0f5 (patch) | |
tree | 0f14ad80c12f927a53d3a56887ed4dc6494e20a5 | |
parent | 180890c74da72b5249f370edea426fbe076d37be (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.c | 23 |
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 | ||
1604 | err_irq: | 1609 | err_irq: |
1605 | clk_disable(viu_dev->clk); | 1610 | clk_disable_unprepare(viu_dev->clk); |
1606 | clk_put(viu_dev->clk); | ||
1607 | err_clk: | 1611 | err_clk: |
1608 | video_unregister_device(viu_dev->vdev); | 1612 | video_unregister_device(viu_dev->vdev); |
1609 | err_vdev: | 1613 | err_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); |