> Date: Sat, 25 Apr 2020 00:41:38 +0200 (CEST) > From: Mark Kettenis <mark.kette...@xs4all.nl> > > 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?
ping? > 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); > } > > >