X-Git-Url: http://git.rot13.org/?a=blobdiff_plain;f=kernel%2Ftime%2Ftick-common.c;h=bfda3f7f0716a9ad4915dd2191390f8bbf59ddd8;hb=9415fddd99e12d57640774a3043a809140245c40;hp=0986a2bfab49e6a83a02660fa19c01479808b4d4;hpb=6842ac64ae2ed2714004a25d53d3b20f0d3af524;p=powerpc.git diff --git a/kernel/time/tick-common.c b/kernel/time/tick-common.c index 0986a2bfab..bfda3f7f07 100644 --- a/kernel/time/tick-common.c +++ b/kernel/time/tick-common.c @@ -298,6 +298,29 @@ static void tick_shutdown(unsigned int *cpup) spin_unlock_irqrestore(&tick_device_lock, flags); } +static void tick_suspend(void) +{ + struct tick_device *td = &__get_cpu_var(tick_cpu_device); + unsigned long flags; + + spin_lock_irqsave(&tick_device_lock, flags); + clockevents_set_mode(td->evtdev, CLOCK_EVT_MODE_SHUTDOWN); + spin_unlock_irqrestore(&tick_device_lock, flags); +} + +static void tick_resume(void) +{ + struct tick_device *td = &__get_cpu_var(tick_cpu_device); + unsigned long flags; + + spin_lock_irqsave(&tick_device_lock, flags); + if (td->mode == TICKDEV_MODE_PERIODIC) + tick_setup_periodic(td->evtdev, 0); + else + tick_resume_oneshot(); + spin_unlock_irqrestore(&tick_device_lock, flags); +} + /* * Notification about clock event devices */ @@ -325,6 +348,16 @@ static int tick_notify(struct notifier_block *nb, unsigned long reason, tick_shutdown(dev); break; + case CLOCK_EVT_NOTIFY_SUSPEND: + tick_suspend(); + tick_suspend_broadcast(); + break; + + case CLOCK_EVT_NOTIFY_RESUME: + if (!tick_resume_broadcast()) + tick_resume(); + break; + default: break; }