clocksource: Save mult_orig in clocksource_disable()
Magnus Damm [Tue, 28 Jul 2009 21:09:55 +0000 (14:09 -0700)]
To fix the common case where ->enable() does not set up
mult, make sure mult_orig is saved in mult on disable.

Also add comments to explain why we do this.

Signed-off-by: Magnus Damm <damm@igel.co.jp>
Cc: johnstul@us.ibm.com
Cc: lethal@linux-sh.org
Cc: akpm@linux-foundation.org
LKML-Reference: <20090618152432.10136.9932.sendpatchset@rx1.opensource.se>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>

include/linux/clocksource.h

index c56457c..1219be4 100644 (file)
@@ -293,7 +293,12 @@ static inline int clocksource_enable(struct clocksource *cs)
        if (cs->enable)
                ret = cs->enable(cs);
 
-       /* save mult_orig on enable */
+       /*
+        * The frequency may have changed while the clocksource
+        * was disabled. If so the code in ->enable() must update
+        * the mult value to reflect the new frequency. Make sure
+        * mult_orig follows this change.
+        */
        cs->mult_orig = cs->mult;
 
        return ret;
@@ -309,6 +314,13 @@ static inline int clocksource_enable(struct clocksource *cs)
  */
 static inline void clocksource_disable(struct clocksource *cs)
 {
+       /*
+        * Save mult_orig in mult so clocksource_enable() can
+        * restore the value regardless if ->enable() updates
+        * the value of mult or not.
+        */
+       cs->mult = cs->mult_orig;
+
        if (cs->disable)
                cs->disable(cs);
 }