Commit 01fa68b5 authored by Magnus Damm's avatar Magnus Damm Committed by Paul Mundt

clocksource: sh_cmt: Runtime PM support

Add Runtime PM support to the CMT driver.

The hardware device is enabled as long as the clocksource
or the clockevent portion of the driver is used.
Signed-off-by: default avatarMagnus Damm <damm@opensource.se>
Acked-by: default avatarJohn Stultz <johnstul@us.ibm.com>
Signed-off-by: default avatarPaul Mundt <lethal@linux-sh.org>
parent 3593f5fe
...@@ -24,6 +24,7 @@ ...@@ -24,6 +24,7 @@
#include <linux/ioport.h> #include <linux/ioport.h>
#include <linux/io.h> #include <linux/io.h>
#include <linux/clk.h> #include <linux/clk.h>
#include <linux/pm_runtime.h>
#include <linux/irq.h> #include <linux/irq.h>
#include <linux/err.h> #include <linux/err.h>
#include <linux/clocksource.h> #include <linux/clocksource.h>
...@@ -152,10 +153,12 @@ static int sh_cmt_enable(struct sh_cmt_priv *p, unsigned long *rate) ...@@ -152,10 +153,12 @@ static int sh_cmt_enable(struct sh_cmt_priv *p, unsigned long *rate)
{ {
int ret; int ret;
/* enable clock */ /* wake up device and enable clock */
pm_runtime_get_sync(&p->pdev->dev);
ret = clk_enable(p->clk); ret = clk_enable(p->clk);
if (ret) { if (ret) {
dev_err(&p->pdev->dev, "cannot enable clock\n"); dev_err(&p->pdev->dev, "cannot enable clock\n");
pm_runtime_put_sync(&p->pdev->dev);
return ret; return ret;
} }
...@@ -187,8 +190,9 @@ static void sh_cmt_disable(struct sh_cmt_priv *p) ...@@ -187,8 +190,9 @@ static void sh_cmt_disable(struct sh_cmt_priv *p)
/* disable interrupts in CMT block */ /* disable interrupts in CMT block */
sh_cmt_write(p, CMCSR, 0); sh_cmt_write(p, CMCSR, 0);
/* stop clock */ /* stop clock and mark device as idle */
clk_disable(p->clk); clk_disable(p->clk);
pm_runtime_put_sync(&p->pdev->dev);
} }
/* private flags */ /* private flags */
...@@ -660,6 +664,7 @@ static int __devinit sh_cmt_probe(struct platform_device *pdev) ...@@ -660,6 +664,7 @@ static int __devinit sh_cmt_probe(struct platform_device *pdev)
if (p) { if (p) {
dev_info(&pdev->dev, "kept as earlytimer\n"); dev_info(&pdev->dev, "kept as earlytimer\n");
pm_runtime_enable(&pdev->dev);
return 0; return 0;
} }
...@@ -674,6 +679,9 @@ static int __devinit sh_cmt_probe(struct platform_device *pdev) ...@@ -674,6 +679,9 @@ static int __devinit sh_cmt_probe(struct platform_device *pdev)
kfree(p); kfree(p);
platform_set_drvdata(pdev, NULL); platform_set_drvdata(pdev, NULL);
} }
if (!is_early_platform_device(pdev))
pm_runtime_enable(&pdev->dev);
return ret; return ret;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment