clocksource: setup mult_orig in clocksource_enable()
authorMagnus Damm <magnus.damm@gmail.com>
Fri, 1 May 2009 05:45:46 +0000 (14:45 +0900)
committerThomas Gleixner <tglx@linutronix.de>
Sat, 2 May 2009 09:45:15 +0000 (11:45 +0200)
Setup clocksource mult_orig in clocksource_enable().

Clocksource drivers can save power by using keeping the
device clock disabled while the clocksource is unused.

In practice this means that the enable() and disable()
callbacks perform clk_enable() and clk_disable().

The enable() callback may also use clk_get_rate() to get
the clock rate from the clock framework. This information
can then be used to calculate the shift and mult variables.

Currently the mult_orig variable is setup from mult at
registration time only. This is conflicting with the above
case since the clock is disabled and the mult variable is
not yet calculated at the time of registration.

Moving the mult_orig setup code to clocksource_enable()
allows us to both handle the common case with no enable()
callback and the mult-changed-after-enable() case.

[ Impact: allow dynamic clock source usage ]

Signed-off-by: Magnus Damm <damm@igel.co.jp>
LKML-Reference: <20090501054546.8193.10688.sendpatchset@rx1.opensource.se>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
include/linux/clocksource.h
kernel/time/clocksource.c

index 5a40d14daa9fab04bf641c1a11d82a1610ff7753..c56457c8334eea7ece9236c963fec845791909ba 100644 (file)
@@ -288,7 +288,15 @@ static inline cycle_t clocksource_read(struct clocksource *cs)
  */
 static inline int clocksource_enable(struct clocksource *cs)
 {
-       return cs->enable ? cs->enable(cs) : 0;
+       int ret = 0;
+
+       if (cs->enable)
+               ret = cs->enable(cs);
+
+       /* save mult_orig on enable */
+       cs->mult_orig = cs->mult;
+
+       return ret;
 }
 
 /**
index ecfd7b5187e0af0a7e3db8767ddfbf539ff64c23..80189f6f1c5a1f7a326c9490e18f571fc8f49ea7 100644 (file)
@@ -402,9 +402,6 @@ int clocksource_register(struct clocksource *c)
        unsigned long flags;
        int ret;
 
-       /* save mult_orig on registration */
-       c->mult_orig = c->mult;
-
        spin_lock_irqsave(&clocksource_lock, flags);
        ret = clocksource_enqueue(c);
        if (!ret)