> 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);
>  }
>  
> 
> 

Reply via email to