rtc_sysfs_show_hctosys(): display 0 if resume failed
authorDavid Fries <david@fries.net>
Fri, 5 Oct 2012 00:14:12 +0000 (17:14 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Fri, 5 Oct 2012 18:05:04 +0000 (03:05 +0900)
Without this patch /sys/class/rtc/$CONFIG_RTC_HCTOSYS_DEVICE/hctosys
contains a 1 (meaning "This rtc was used to initialize the system
clock") even if setting the time by do_settimeofday() at bootup failed.
The RTC can also be used to set the clock on resume, if it did 1,
otherwise 0.  Previously there was no indication if the RTC was used
to set the clock in resume.

This uses only CONFIG_RTC_HCTOSYS_DEVICE for conditional compilation
instead of it and CONFIG_RTC_HCTOSYS to be more consistent.
rtc_hctosys_ret was moved to class.c so class.c no longer depends on
hctosys.c.

[sfr@canb.auug.org.au: fix build]
Signed-off-by: David Fries <David@Fries.net>
Cc: Matthew Garrett <mjg@redhat.com>
Cc: Alessandro Zummo <a.zummo@towertech.it>
Cc: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
Signed-off-by: Stephen Rothwell <sfr@canb.auug.org.au>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
drivers/rtc/class.c
drivers/rtc/hctosys.c
drivers/rtc/rtc-sysfs.c
include/linux/rtc.h

index 37b1d82fda085551b2823b01e984cee03c4d6d24..f8a0aab218cbcd2777ea93b9e74aa96494e729fe 100644 (file)
@@ -31,8 +31,12 @@ static void rtc_device_release(struct device *dev)
        kfree(rtc);
 }
 
-#if defined(CONFIG_PM) && defined(CONFIG_RTC_HCTOSYS_DEVICE)
+#ifdef CONFIG_RTC_HCTOSYS_DEVICE
+/* Result of the last RTC to system clock attempt. */
+int rtc_hctosys_ret = -ENODEV;
+#endif
 
+#if defined(CONFIG_PM) && defined(CONFIG_RTC_HCTOSYS_DEVICE)
 /*
  * On suspend(), measure the delta between one RTC and the
  * system's wall clock; restore it on resume().
@@ -84,6 +88,7 @@ static int rtc_resume(struct device *dev)
        struct timespec         new_system, new_rtc;
        struct timespec         sleep_time;
 
+       rtc_hctosys_ret = -ENODEV;
        if (strcmp(dev_name(&rtc->dev), CONFIG_RTC_HCTOSYS_DEVICE) != 0)
                return 0;
 
@@ -117,6 +122,7 @@ static int rtc_resume(struct device *dev)
 
        if (sleep_time.tv_sec >= 0)
                timekeeping_inject_sleeptime(&sleep_time);
+       rtc_hctosys_ret = 0;
        return 0;
 }
 
index bc90b091f1954faecf087f2094c6094e31606da2..4aa60d74004e41ffdd7be050728f9cf63a7fa48c 100644 (file)
@@ -22,8 +22,6 @@
  * the best guess is to add 0.5s.
  */
 
-int rtc_hctosys_ret = -ENODEV;
-
 static int __init rtc_hctosys(void)
 {
        int err = -ENODEV;
@@ -56,7 +54,7 @@ static int __init rtc_hctosys(void)
 
        rtc_tm_to_time(&tm, &tv.tv_sec);
 
-       do_settimeofday(&tv);
+       err = do_settimeofday(&tv);
 
        dev_info(rtc->dev.parent,
                "setting system clock to "
index 380083ca572fd480ba0f060c2f9ead3925d855a4..b70e2bb6364500fb7d02c2dffb6c01575e1771e4 100644 (file)
@@ -102,6 +102,12 @@ rtc_sysfs_set_max_user_freq(struct device *dev, struct device_attribute *attr,
        return n;
 }
 
+/**
+ * rtc_sysfs_show_hctosys - indicate if the given RTC set the system time
+ *
+ * Returns 1 if the system clock was set by this RTC at the last
+ * boot or resume event.
+ */
 static ssize_t
 rtc_sysfs_show_hctosys(struct device *dev, struct device_attribute *attr,
                char *buf)
index f071b3922c67f7a253c0b5f978b4bec1b7a690df..20ec4d3bed733d3818f4bb7f899b0322b253372e 100644 (file)
@@ -276,7 +276,7 @@ static inline bool is_leap_year(unsigned int year)
        return (!(year % 4) && (year % 100)) || !(year % 400);
 }
 
-#ifdef CONFIG_RTC_HCTOSYS
+#ifdef CONFIG_RTC_HCTOSYS_DEVICE
 extern int rtc_hctosys_ret;
 #else
 #define rtc_hctosys_ret -ENODEV