Version:  2.0.40 2.2.26 2.4.37 3.13 3.14 3.15 3.16 3.17 3.18 3.19 4.0 4.1 4.2 4.3 4.4 4.5 4.6 4.7 4.8 4.9 4.10

Linux/drivers/rtc/hctosys.c

  1 /*
  2  * RTC subsystem, initialize system time on startup
  3  *
  4  * Copyright (C) 2005 Tower Technologies
  5  * Author: Alessandro Zummo <a.zummo@towertech.it>
  6  *
  7  * This program is free software; you can redistribute it and/or modify
  8  * it under the terms of the GNU General Public License version 2 as
  9  * published by the Free Software Foundation.
 10 */
 11 
 12 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
 13 
 14 #include <linux/rtc.h>
 15 
 16 /* IMPORTANT: the RTC only stores whole seconds. It is arbitrary
 17  * whether it stores the most close value or the value with partial
 18  * seconds truncated. However, it is important that we use it to store
 19  * the truncated value. This is because otherwise it is necessary,
 20  * in an rtc sync function, to read both xtime.tv_sec and
 21  * xtime.tv_nsec. On some processors (i.e. ARM), an atomic read
 22  * of >32bits is not possible. So storing the most close value would
 23  * slow down the sync API. So here we have the truncated value and
 24  * the best guess is to add 0.5s.
 25  */
 26 
 27 static int __init rtc_hctosys(void)
 28 {
 29         int err = -ENODEV;
 30         struct rtc_time tm;
 31         struct timespec64 tv64 = {
 32                 .tv_nsec = NSEC_PER_SEC >> 1,
 33         };
 34         struct rtc_device *rtc = rtc_class_open(CONFIG_RTC_HCTOSYS_DEVICE);
 35 
 36         if (rtc == NULL) {
 37                 pr_info("unable to open rtc device (%s)\n",
 38                         CONFIG_RTC_HCTOSYS_DEVICE);
 39                 goto err_open;
 40         }
 41 
 42         err = rtc_read_time(rtc, &tm);
 43         if (err) {
 44                 dev_err(rtc->dev.parent,
 45                         "hctosys: unable to read the hardware clock\n");
 46                 goto err_read;
 47 
 48         }
 49 
 50         tv64.tv_sec = rtc_tm_to_time64(&tm);
 51 
 52         err = do_settimeofday64(&tv64);
 53 
 54         dev_info(rtc->dev.parent,
 55                 "setting system clock to "
 56                 "%d-%02d-%02d %02d:%02d:%02d UTC (%lld)\n",
 57                 tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday,
 58                 tm.tm_hour, tm.tm_min, tm.tm_sec,
 59                 (long long) tv64.tv_sec);
 60 
 61 err_read:
 62         rtc_class_close(rtc);
 63 
 64 err_open:
 65         rtc_hctosys_ret = err;
 66 
 67         return err;
 68 }
 69 
 70 late_initcall(rtc_hctosys);
 71 

This page was automatically generated by LXR 0.3.1 (source).  •  Linux is a registered trademark of Linus Torvalds  •  Contact us