aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/clocksource/sh_mtu2.c
diff options
context:
space:
mode:
authorRafael J. Wysocki <rjw@sisk.pl>2012-08-05 19:43:41 -0400
committerRafael J. Wysocki <rjw@sisk.pl>2012-09-03 19:36:02 -0400
commitcc7ad4564b1097c916834dc919678867631e7676 (patch)
tree6939a8e98b9f4fbe9612b78a75927bb5c3666094 /drivers/clocksource/sh_mtu2.c
parent9bb5ec8872312751f992cdac9968805fe03e81aa (diff)
sh: MTU2: Introduce clock events suspend/resume routines
Introduce suspend/resume routines for SH MTU2 clock event devices such that if those devices belong to a PM domain, the generic PM domains framework will be notified that the given domain may be turned off (during system suspend) or that it has to be turned on (during system resume). Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl> Acked-by: Magnus Damm <damm@opensource.se>
Diffstat (limited to 'drivers/clocksource/sh_mtu2.c')
-rw-r--r--drivers/clocksource/sh_mtu2.c20
1 files changed, 18 insertions, 2 deletions
diff --git a/drivers/clocksource/sh_mtu2.c b/drivers/clocksource/sh_mtu2.c
index d9b76ca64a61..a55bb905812e 100644
--- a/drivers/clocksource/sh_mtu2.c
+++ b/drivers/clocksource/sh_mtu2.c
@@ -208,6 +208,16 @@ static void sh_mtu2_clock_event_mode(enum clock_event_mode mode,
208 } 208 }
209} 209}
210 210
211static void sh_mtu2_clock_event_suspend(struct clock_event_device *ced)
212{
213 pm_genpd_syscore_poweroff(&ced_to_sh_mtu2(ced)->pdev->dev);
214}
215
216static void sh_mtu2_clock_event_resume(struct clock_event_device *ced)
217{
218 pm_genpd_syscore_poweron(&ced_to_sh_mtu2(ced)->pdev->dev);
219}
220
211static void sh_mtu2_register_clockevent(struct sh_mtu2_priv *p, 221static void sh_mtu2_register_clockevent(struct sh_mtu2_priv *p,
212 char *name, unsigned long rating) 222 char *name, unsigned long rating)
213{ 223{
@@ -221,6 +231,8 @@ static void sh_mtu2_register_clockevent(struct sh_mtu2_priv *p,
221 ced->rating = rating; 231 ced->rating = rating;
222 ced->cpumask = cpumask_of(0); 232 ced->cpumask = cpumask_of(0);
223 ced->set_mode = sh_mtu2_clock_event_mode; 233 ced->set_mode = sh_mtu2_clock_event_mode;
234 ced->suspend = sh_mtu2_clock_event_suspend;
235 ced->resume = sh_mtu2_clock_event_resume;
224 236
225 dev_info(&p->pdev->dev, "used for clock events\n"); 237 dev_info(&p->pdev->dev, "used for clock events\n");
226 clockevents_register_device(ced); 238 clockevents_register_device(ced);
@@ -307,8 +319,12 @@ static int __devinit sh_mtu2_probe(struct platform_device *pdev)
307 struct sh_mtu2_priv *p = platform_get_drvdata(pdev); 319 struct sh_mtu2_priv *p = platform_get_drvdata(pdev);
308 int ret; 320 int ret;
309 321
310 if (!is_early_platform_device(pdev)) 322 if (!is_early_platform_device(pdev)) {
311 pm_genpd_dev_always_on(&pdev->dev, true); 323 struct sh_timer_config *cfg = pdev->dev.platform_data;
324
325 if (cfg->clockevent_rating)
326 pm_genpd_dev_always_on(&pdev->dev, true);
327 }
312 328
313 if (p) { 329 if (p) {
314 dev_info(&pdev->dev, "kept as earlytimer\n"); 330 dev_info(&pdev->dev, "kept as earlytimer\n");