Skip to content

Commit

Permalink
rtc_sysfs_show_hctosys(): display 0 if resume failed
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
David Fries authored and Linus Torvalds committed Oct 5, 2012
1 parent be8b6d5 commit 4c24e29
Show file tree
Hide file tree
Showing 4 changed files with 15 additions and 5 deletions.
8 changes: 7 additions & 1 deletion drivers/rtc/class.c
Original file line number Diff line number Diff line change
Expand Up @@ -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().
Expand Down Expand Up @@ -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;

Expand Down Expand Up @@ -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;
}

Expand Down
4 changes: 1 addition & 3 deletions drivers/rtc/hctosys.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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 "
Expand Down
6 changes: 6 additions & 0 deletions drivers/rtc/rtc-sysfs.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
2 changes: 1 addition & 1 deletion include/linux/rtc.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down

0 comments on commit 4c24e29

Please sign in to comment.