The chip will set the OSF flag whenever the internal oscillator stops running. That happens for example wen the battry runs out of juice. The idea as that we can check this flag to decide whether we should trust the time in the chip. The driver tries to implement that but fails because it always clears the flag in the attach function.
Diff below fixes that by leaving the flag alone in the attach function, but clearing it when we set the time. ok? Index: dev/i2c/pcf8523.c =================================================================== RCS file: /cvs/src/sys/dev/i2c/pcf8523.c,v retrieving revision 1.3 diff -u -p -r1.3 pcf8523.c --- dev/i2c/pcf8523.c 20 May 2016 20:33:53 -0000 1.3 +++ dev/i2c/pcf8523.c 24 Apr 2020 22:37:20 -0000 @@ -165,13 +165,6 @@ pcfrtc_attach(struct device *parent, str /* Report battery status. */ reg = pcfrtc_reg_read(sc, PCF8523_CONTROL3); printf(": battery %s\n", (reg & PCF8523_CONTROL3_BLF) ? "low" : "ok"); - - /* Clear OS flag. */ - reg = pcfrtc_reg_read(sc, PCF8523_SECONDS); - if (reg & PCF8523_SECONDS_OS) { - reg &= ~PCF8523_SECONDS_OS; - pcfrtc_reg_write(sc, PCF8523_SECONDS, reg); - } } int @@ -194,11 +187,19 @@ pcfrtc_settime(struct todr_chip_handle * { struct pcfrtc_softc *sc = ch->cookie; struct clock_ymdhms dt; + uint8_t reg; clock_secs_to_ymdhms(tv->tv_sec, &dt); - if (pcfrtc_clock_write(sc, &dt) == 0) return (-1); + + /* Clear OS flag. */ + reg = pcfrtc_reg_read(sc, PCF8523_SECONDS); + if (reg & PCF8523_SECONDS_OS) { + reg &= ~PCF8523_SECONDS_OS; + pcfrtc_reg_write(sc, PCF8523_SECONDS, reg); + } + return (0); }