瀏覽代碼

clocksource: sh_tmu: Runtime PM support

Add Runtime PM support to the TMU driver.

The hardware device is enabled as long as the clocksource
or the clockevent portion of the driver is used.

Signed-off-by: Magnus Damm <damm@opensource.se>
Acked-by: John Stultz <johnstul@us.ibm.com>
Signed-off-by: Paul Mundt <lethal@linux-sh.org>
Magnus Damm 14 年之前
父節點
當前提交
1b842e91fe
共有 1 個文件被更改,包括 10 次插入2 次删除
  1. 10 2
      drivers/clocksource/sh_tmu.c

+ 10 - 2
drivers/clocksource/sh_tmu.c

@@ -25,6 +25,7 @@
 #include <linux/delay.h>
 #include <linux/delay.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>
@@ -109,10 +110,12 @@ static int sh_tmu_enable(struct sh_tmu_priv *p)
 {
 {
 	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;
 	}
 	}
 
 
@@ -141,8 +144,9 @@ static void sh_tmu_disable(struct sh_tmu_priv *p)
 	/* disable interrupts in TMU block */
 	/* disable interrupts in TMU block */
 	sh_tmu_write(p, TCR, 0x0000);
 	sh_tmu_write(p, TCR, 0x0000);
 
 
-	/* stop clock */
+	/* stop clock and mark device as idle */
 	clk_disable(p->clk);
 	clk_disable(p->clk);
+	pm_runtime_put_sync(&p->pdev->dev);
 }
 }
 
 
 static void sh_tmu_set_next(struct sh_tmu_priv *p, unsigned long delta,
 static void sh_tmu_set_next(struct sh_tmu_priv *p, unsigned long delta,
@@ -411,6 +415,7 @@ static int __devinit sh_tmu_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;
 	}
 	}
 
 
@@ -425,6 +430,9 @@ static int __devinit sh_tmu_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;
 }
 }