diff options
Diffstat (limited to 'drivers/rtc/hctosys.c')
| -rw-r--r-- | drivers/rtc/hctosys.c | 65 |
1 files changed, 36 insertions, 29 deletions
diff --git a/drivers/rtc/hctosys.c b/drivers/rtc/hctosys.c index d02fe9a0001..4aa60d74004 100644 --- a/drivers/rtc/hctosys.c +++ b/drivers/rtc/hctosys.c @@ -24,46 +24,53 @@ static int __init rtc_hctosys(void) { - int err; + int err = -ENODEV; struct rtc_time tm; - struct class_device *class_dev = rtc_class_open(CONFIG_RTC_HCTOSYS_DEVICE); + struct timespec tv = { + .tv_nsec = NSEC_PER_SEC >> 1, + }; + struct rtc_device *rtc = rtc_class_open(CONFIG_RTC_HCTOSYS_DEVICE); - if (class_dev == NULL) { - printk("%s: unable to open rtc device (%s)\n", + if (rtc == NULL) { + pr_err("%s: unable to open rtc device (%s)\n", __FILE__, CONFIG_RTC_HCTOSYS_DEVICE); - return -ENODEV; + goto err_open; } - err = rtc_read_time(class_dev, &tm); - if (err == 0) { - err = rtc_valid_tm(&tm); - if (err == 0) { - struct timespec tv; + err = rtc_read_time(rtc, &tm); + if (err) { + dev_err(rtc->dev.parent, + "hctosys: unable to read the hardware clock\n"); + goto err_read; - tv.tv_nsec = NSEC_PER_SEC >> 1; + } - rtc_tm_to_time(&tm, &tv.tv_sec); + err = rtc_valid_tm(&tm); + if (err) { + dev_err(rtc->dev.parent, + "hctosys: invalid date/time\n"); + goto err_invalid; + } - do_settimeofday(&tv); + rtc_tm_to_time(&tm, &tv.tv_sec); - dev_info(class_dev->dev, - "setting the system clock to " - "%d-%02d-%02d %02d:%02d:%02d (%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(class_dev->dev, - "hctosys: invalid date/time\n"); - } - else - dev_err(class_dev->dev, - "hctosys: unable to read the hardware clock\n"); + err = 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); - rtc_class_close(class_dev); +err_open: + rtc_hctosys_ret = err; - return 0; + return err; } late_initcall(rtc_hctosys); |
