rtc/hctosys: only claim the RTC provided the system time if it did
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 reading the time at bootup failed. Moreover change error handling in rtc_hctosys() to use goto and so reduce the indention level. Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de> Cc: Paul Gortmaker <p_gortmaker@yahoo.com> Acked-by: Alessandro Zummo <a.zummo@towertech.it> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
019b4d123a
commit
d0ab4a4d50
|
@ -22,48 +22,57 @@
|
|||
* the best guess is to add 0.5s.
|
||||
*/
|
||||
|
||||
int rtc_hctosys_ret = -ENODEV;
|
||||
|
||||
static int __init rtc_hctosys(void)
|
||||
{
|
||||
int err;
|
||||
int err = -ENODEV;
|
||||
struct rtc_time tm;
|
||||
struct timespec tv = {
|
||||
.tv_nsec = NSEC_PER_SEC >> 1,
|
||||
};
|
||||
struct rtc_device *rtc = rtc_class_open(CONFIG_RTC_HCTOSYS_DEVICE);
|
||||
|
||||
if (rtc == NULL) {
|
||||
printk("%s: unable to open rtc device (%s)\n",
|
||||
pr_err("%s: unable to open rtc device (%s)\n",
|
||||
__FILE__, CONFIG_RTC_HCTOSYS_DEVICE);
|
||||
return -ENODEV;
|
||||
goto err_open;
|
||||
}
|
||||
|
||||
err = rtc_read_time(rtc, &tm);
|
||||
if (err == 0) {
|
||||
err = rtc_valid_tm(&tm);
|
||||
if (err == 0) {
|
||||
struct timespec tv;
|
||||
|
||||
tv.tv_nsec = NSEC_PER_SEC >> 1;
|
||||
|
||||
rtc_tm_to_time(&tm, &tv.tv_sec);
|
||||
|
||||
do_settimeofday(&tv);
|
||||
|
||||
dev_info(rtc->dev.parent,
|
||||
"setting system clock to "
|
||||
"%d-%02d-%02d %02d:%02d:%02d UTC (%u)\n",
|
||||
tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday,
|
||||
tm.tm_hour, tm.tm_min, tm.tm_sec,
|
||||
(unsigned int) tv.tv_sec);
|
||||
}
|
||||
else
|
||||
dev_err(rtc->dev.parent,
|
||||
"hctosys: invalid date/time\n");
|
||||
}
|
||||
else
|
||||
if (err) {
|
||||
dev_err(rtc->dev.parent,
|
||||
"hctosys: unable to read the hardware clock\n");
|
||||
goto err_read;
|
||||
|
||||
}
|
||||
|
||||
err = rtc_valid_tm(&tm);
|
||||
if (err) {
|
||||
dev_err(rtc->dev.parent,
|
||||
"hctosys: invalid date/time\n");
|
||||
goto err_invalid;
|
||||
}
|
||||
|
||||
rtc_tm_to_time(&tm, &tv.tv_sec);
|
||||
|
||||
do_settimeofday(&tv);
|
||||
|
||||
dev_info(rtc->dev.parent,
|
||||
"setting system clock to "
|
||||
"%d-%02d-%02d %02d:%02d:%02d UTC (%u)\n",
|
||||
tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday,
|
||||
tm.tm_hour, tm.tm_min, tm.tm_sec,
|
||||
(unsigned int) tv.tv_sec);
|
||||
|
||||
err_invalid:
|
||||
err_read:
|
||||
rtc_class_close(rtc);
|
||||
|
||||
return 0;
|
||||
err_open:
|
||||
rtc_hctosys_ret = err;
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
late_initcall(rtc_hctosys);
|
||||
|
|
|
@ -107,8 +107,9 @@ rtc_sysfs_show_hctosys(struct device *dev, struct device_attribute *attr,
|
|||
char *buf)
|
||||
{
|
||||
#ifdef CONFIG_RTC_HCTOSYS_DEVICE
|
||||
if (strcmp(dev_name(&to_rtc_device(dev)->dev),
|
||||
CONFIG_RTC_HCTOSYS_DEVICE) == 0)
|
||||
if (rtc_hctosys_ret == 0 &&
|
||||
strcmp(dev_name(&to_rtc_device(dev)->dev),
|
||||
CONFIG_RTC_HCTOSYS_DEVICE) == 0)
|
||||
return sprintf(buf, "1\n");
|
||||
else
|
||||
#endif
|
||||
|
|
|
@ -238,6 +238,12 @@ static inline bool is_leap_year(unsigned int year)
|
|||
return (!(year % 4) && (year % 100)) || !(year % 400);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_RTC_HCTOSYS
|
||||
extern int rtc_hctosys_ret;
|
||||
#else
|
||||
#define rtc_hctosys_ret -ENODEV
|
||||
#endif
|
||||
|
||||
#endif /* __KERNEL__ */
|
||||
|
||||
#endif /* _LINUX_RTC_H_ */
|
||||
|
|
Loading…
Reference in New Issue