From 8ccc494dbac87c46afd88423783fadebd2a64bc6 Mon Sep 17 00:00:00 2001 From: "Rafael J. Wysocki" Date: Mon, 6 Aug 2012 01:40:41 +0200 Subject: [PATCH] --- yaml --- r: 328655 b: refs/heads/master c: adc78e6b9946a4b22e22403d961f3b03c469e5d3 h: refs/heads/master i: 328653: bbb6aeb0042c1e13e804f104dc03464a2bf6a72a 328651: 07cf78169592810251508603a7f7d2a441c0fd57 328647: bcb7f8b6df87e3c3d3240052c6bba406d4f7deb1 328639: 9c0cee6cb11a86954dd431f78c5bf06b0cc98fa2 v: v3 --- [refs] | 2 +- trunk/include/linux/clockchips.h | 8 ++++++++ trunk/kernel/time/clockevents.c | 24 ++++++++++++++++++++++++ trunk/kernel/time/timekeeping.c | 2 ++ 4 files changed, 35 insertions(+), 1 deletion(-) diff --git a/[refs] b/[refs] index b5ef186b1aea..356ced90ff9e 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 77f827de07432a74821cf0f831d699544b2d474f +refs/heads/master: adc78e6b9946a4b22e22403d961f3b03c469e5d3 diff --git a/trunk/include/linux/clockchips.h b/trunk/include/linux/clockchips.h index acba894374a1..8a7096fcb01e 100644 --- a/trunk/include/linux/clockchips.h +++ b/trunk/include/linux/clockchips.h @@ -97,6 +97,8 @@ struct clock_event_device { void (*broadcast)(const struct cpumask *mask); void (*set_mode)(enum clock_event_mode mode, struct clock_event_device *); + void (*suspend)(struct clock_event_device *); + void (*resume)(struct clock_event_device *); unsigned long min_delta_ticks; unsigned long max_delta_ticks; @@ -156,6 +158,9 @@ clockevents_calc_mult_shift(struct clock_event_device *ce, u32 freq, u32 minsec) freq, minsec); } +extern void clockevents_suspend(void); +extern void clockevents_resume(void); + #ifdef CONFIG_GENERIC_CLOCKEVENTS extern void clockevents_notify(unsigned long reason, void *arg); #else @@ -164,6 +169,9 @@ extern void clockevents_notify(unsigned long reason, void *arg); #else /* CONFIG_GENERIC_CLOCKEVENTS_BUILD */ +static inline void clockevents_suspend(void) {} +static inline void clockevents_resume(void) {} + #define clockevents_notify(reason, arg) do { } while (0) #endif diff --git a/trunk/kernel/time/clockevents.c b/trunk/kernel/time/clockevents.c index 7e1ce012a851..30b6de0d977c 100644 --- a/trunk/kernel/time/clockevents.c +++ b/trunk/kernel/time/clockevents.c @@ -397,6 +397,30 @@ void clockevents_exchange_device(struct clock_event_device *old, local_irq_restore(flags); } +/** + * clockevents_suspend - suspend clock devices + */ +void clockevents_suspend(void) +{ + struct clock_event_device *dev; + + list_for_each_entry_reverse(dev, &clockevent_devices, list) + if (dev->suspend) + dev->suspend(dev); +} + +/** + * clockevents_resume - resume clock devices + */ +void clockevents_resume(void) +{ + struct clock_event_device *dev; + + list_for_each_entry(dev, &clockevent_devices, list) + if (dev->resume) + dev->resume(dev); +} + #ifdef CONFIG_GENERIC_CLOCKEVENTS /** * clockevents_notify - notification about relevant events diff --git a/trunk/kernel/time/timekeeping.c b/trunk/kernel/time/timekeeping.c index 34e5eac81424..312a675cb240 100644 --- a/trunk/kernel/time/timekeeping.c +++ b/trunk/kernel/time/timekeeping.c @@ -773,6 +773,7 @@ static void timekeeping_resume(void) read_persistent_clock(&ts); + clockevents_resume(); clocksource_resume(); write_seqlock_irqsave(&tk->lock, flags); @@ -832,6 +833,7 @@ static int timekeeping_suspend(void) clockevents_notify(CLOCK_EVT_NOTIFY_SUSPEND, NULL); clocksource_suspend(); + clockevents_suspend(); return 0; }