• Thomas Gleixner's avatar
    ntp: Make the RTC sync offset less obscure · 69eca258
    Thomas Gleixner authored
    The current RTC set_offset_nsec value is not really intuitive to
    understand. 
    
      tsched       twrite(t2.tv_sec - 1) 	 t2 (seconds increment)
    
    The offset is calculated from twrite based on the assumption that t2 -
    twrite == 1s. That means for the MC146818 RTC the offset needs to be
    negative so that the write happens 500ms before t2.
    
    It's easier to understand when the whole calculation is based on t2. That
    avoids negative offsets and the meaning is obvious:
    
     t2 - twrite:     The time defined by the chip when seconds increment
          		  after the write.
    
     twrite - tsched: The time for the transport to the point where the chip
     	  	  is updated. 
    
    ==> set_offset_nsec =  t2 - tsched
        ttransport      =  twrite - tsched
        tRTCinc         =  t2 - twrite
    ==> set_offset_nsec =  ttransport + tRTCinc
    
    tRTCinc is a chip property and can be obtained from the data sheet.
    
    ttransport depends on how the RTC is connected. It is close to 0 for
    directly accessible RTCs. For RTCs behind a slow bus, e.g. i2c, it's the
    time required to send the update over the bus. This can be estimated or
    even calibrated, but that's a different problem.
    
    Adjust the implementation and update comments accordingly.
    Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
    Acked-by: default avatarAlexandre Belloni <alexandre.belloni@bootlin.com>
    Link: https://lore.kernel.org/r/20201206220542.263204937@linutronix.de
    69eca258
rtc-cmos.c 36.8 KB