Commit 4c24e29e authored by David Fries's avatar David Fries Committed by Linus Torvalds

rtc_sysfs_show_hctosys(): display 0 if resume failed

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: default avatarDavid 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: default avatarStephen Rothwell <sfr@canb.auug.org.au>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent be8b6d51
...@@ -31,8 +31,12 @@ static void rtc_device_release(struct device *dev) ...@@ -31,8 +31,12 @@ static void rtc_device_release(struct device *dev)
kfree(rtc); 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 * On suspend(), measure the delta between one RTC and the
* system's wall clock; restore it on resume(). * system's wall clock; restore it on resume().
...@@ -84,6 +88,7 @@ static int rtc_resume(struct device *dev) ...@@ -84,6 +88,7 @@ static int rtc_resume(struct device *dev)
struct timespec new_system, new_rtc; struct timespec new_system, new_rtc;
struct timespec sleep_time; struct timespec sleep_time;
rtc_hctosys_ret = -ENODEV;
if (strcmp(dev_name(&rtc->dev), CONFIG_RTC_HCTOSYS_DEVICE) != 0) if (strcmp(dev_name(&rtc->dev), CONFIG_RTC_HCTOSYS_DEVICE) != 0)
return 0; return 0;
...@@ -117,6 +122,7 @@ static int rtc_resume(struct device *dev) ...@@ -117,6 +122,7 @@ static int rtc_resume(struct device *dev)
if (sleep_time.tv_sec >= 0) if (sleep_time.tv_sec >= 0)
timekeeping_inject_sleeptime(&sleep_time); timekeeping_inject_sleeptime(&sleep_time);
rtc_hctosys_ret = 0;
return 0; return 0;
} }
......
...@@ -22,8 +22,6 @@ ...@@ -22,8 +22,6 @@
* the best guess is to add 0.5s. * the best guess is to add 0.5s.
*/ */
int rtc_hctosys_ret = -ENODEV;
static int __init rtc_hctosys(void) static int __init rtc_hctosys(void)
{ {
int err = -ENODEV; int err = -ENODEV;
...@@ -56,7 +54,7 @@ static int __init rtc_hctosys(void) ...@@ -56,7 +54,7 @@ static int __init rtc_hctosys(void)
rtc_tm_to_time(&tm, &tv.tv_sec); rtc_tm_to_time(&tm, &tv.tv_sec);
do_settimeofday(&tv); err = do_settimeofday(&tv);
dev_info(rtc->dev.parent, dev_info(rtc->dev.parent,
"setting system clock to " "setting system clock to "
......
...@@ -102,6 +102,12 @@ rtc_sysfs_set_max_user_freq(struct device *dev, struct device_attribute *attr, ...@@ -102,6 +102,12 @@ rtc_sysfs_set_max_user_freq(struct device *dev, struct device_attribute *attr,
return n; 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 static ssize_t
rtc_sysfs_show_hctosys(struct device *dev, struct device_attribute *attr, rtc_sysfs_show_hctosys(struct device *dev, struct device_attribute *attr,
char *buf) char *buf)
......
...@@ -276,7 +276,7 @@ static inline bool is_leap_year(unsigned int year) ...@@ -276,7 +276,7 @@ static inline bool is_leap_year(unsigned int year)
return (!(year % 4) && (year % 100)) || !(year % 400); return (!(year % 4) && (year % 100)) || !(year % 400);
} }
#ifdef CONFIG_RTC_HCTOSYS #ifdef CONFIG_RTC_HCTOSYS_DEVICE
extern int rtc_hctosys_ret; extern int rtc_hctosys_ret;
#else #else
#define rtc_hctosys_ret -ENODEV #define rtc_hctosys_ret -ENODEV
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment