Hi,

On 12/01/2017 at 11:43:37 +0100, Fabien Lahoudere wrote :
> If RTC time have been altered by low voltage, we notify users
> that RTC time is invalid by returning -EINVAL.
> The RTC time needs to be set correctly to clear the invalid flag.
> If the RTC is not set before restarting, the information will be lost.
> 
> Signed-off-by: Fabien Lahoudere <fabien.lahoud...@collabora.co.uk>
> ---
>  drivers/rtc/rtc-s35390a.c | 9 +++++++++
>  1 file changed, 9 insertions(+)
> 
> diff --git a/drivers/rtc/rtc-s35390a.c b/drivers/rtc/rtc-s35390a.c
> index 5dab466..ef4ada9 100644
> --- a/drivers/rtc/rtc-s35390a.c
> +++ b/drivers/rtc/rtc-s35390a.c
> @@ -62,6 +62,7 @@ struct s35390a {
>       struct i2c_client *client[8];
>       struct rtc_device *rtc;
>       int twentyfourhour;
> +     int isinvalid;
>  };
>  
>  static int s35390a_set_reg(struct s35390a *s35390a, int reg, char *buf, int 
> len)
> @@ -135,6 +136,8 @@ static int s35390a_reset(struct s35390a *s35390a, char 
> *status1)
>        * The 24H bit is kept over reset, so set it already here.
>        */
>  initialize:
> +     /* set the RTC time as invalid */
> +     s35390a->isinvalid = 1;
>       *status1 = S35390A_FLAG_24H;
>       buf = S35390A_FLAG_RESET | S35390A_FLAG_24H;
>       ret = s35390a_set_reg(s35390a, S35390A_CMD_STATUS1, &buf, 1);
> @@ -221,6 +224,8 @@ static int s35390a_set_datetime(struct i2c_client 
> *client, struct rtc_time *tm)
>               buf[i] = bitrev8(buf[i]);
>  
>       err = s35390a_set_reg(s35390a, S35390A_CMD_TIME1, buf, sizeof(buf));
> +     if (err >= 0)
> +             s35390a->isinvalid = 0;
>  
>       return err;
>  }
> @@ -231,6 +236,9 @@ static int s35390a_get_datetime(struct i2c_client 
> *client, struct rtc_time *tm)
>       char buf[7];
>       int i, err;
>  
> +     if (s35390a->isinvalid)
> +             return -EINVAL;
> +

That's fine but what happens if it became invalid between probe and
s35390a_get_datetime()? (This is particularly relevant after patch 2/2.

>       err = s35390a_get_reg(s35390a, S35390A_CMD_TIME1, buf, sizeof(buf));
>       if (err < 0)
>               return err;
> @@ -418,6 +426,7 @@ static int s35390a_probe(struct i2c_client *client,
>  
>       s35390a->client[0] = client;
>       i2c_set_clientdata(client, s35390a);
> +     s35390a->isinvalid = 0;
>  
>       /* This chip uses multiple addresses, use dummy devices for them */
>       for (i = 1; i < 8; ++i) {
> -- 
> 1.8.3.1
> 

-- 
Alexandre Belloni, Free Electrons
Embedded Linux and Kernel engineering
http://free-electrons.com

-- 
You received this message because you are subscribed to "rtc-linux".
Membership options at http://groups.google.com/group/rtc-linux .
Please read http://groups.google.com/group/rtc-linux/web/checklist
before submitting a driver.
--- 
You received this message because you are subscribed to the Google Groups 
"rtc-linux" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to rtc-linux+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to