rtc: pcf85063: fix time/date reading
authorJuergen Borleis <jbe@pengutronix.de>
Tue, 9 Feb 2016 10:57:26 +0000 (11:57 +0100)
committerAlexandre Belloni <alexandre.belloni@free-electrons.com>
Mon, 14 Mar 2016 16:08:17 +0000 (17:08 +0100)
Check if the RTC signals an invalid time/date (due to a battery power loss
for example). In this case ignore the time/date until it is really set again.

Signed-off-by: Juergen Borleis <jbe@pengutronix.de>
Signed-off-by: Alexandre Belloni <alexandre.belloni@free-electrons.com>
drivers/rtc/rtc-pcf85063.c

index 7f9caee5f4abcb1936c2b7ee15232f75d93063df..e0343e6aeb31618ff3d6e64e0855ecd14de6e6f9 100644 (file)
@@ -22,6 +22,7 @@
 #define PCF85063_REG_CTRL2             0x01
 
 #define PCF85063_REG_SC                        0x04 /* datetime */
+#define PCF85063_REG_SC_OS             0x80
 #define PCF85063_REG_MN                        0x05
 #define PCF85063_REG_HR                        0x06
 #define PCF85063_REG_DM                        0x07
@@ -62,6 +63,12 @@ static int pcf85063_get_datetime(struct i2c_client *client, struct rtc_time *tm)
                return -EIO;
        }
 
+       /* if the clock has lost its power it makes no sense to use its time */
+       if (regs[0] & PCF85063_REG_SC_OS) {
+               dev_warn(&client->dev, "Power loss detected, invalid time\n");
+               return -EINVAL;
+       }
+
        tm->tm_sec = bcd2bin(regs[0] & 0x7F);
        tm->tm_min = bcd2bin(regs[1] & 0x7F);
        tm->tm_hour = bcd2bin(regs[2] & 0x3F); /* rtc hr 0-23 */