rtc: pcf8523: avoid reading BLF in pcf8523_rtc_read_time
authorAlexandre Belloni <alexandre.belloni@bootlin.com>
Fri, 15 Oct 2021 19:24:00 +0000 (21:24 +0200)
committerAlexandre Belloni <alexandre.belloni@bootlin.com>
Mon, 18 Oct 2021 15:21:05 +0000 (17:21 +0200)
BLF, battery low doesn't mean the time is imprecise or invalid, it simply mean
the backup battery has to be replaced. This information can be read using the
VL_READ ioctl.

Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com>
Link: https://lore.kernel.org/r/20211015192400.818254-1-alexandre.belloni@bootlin.com
drivers/rtc/rtc-pcf8523.c

index 8b6fb20..09110b3 100644 (file)
@@ -24,6 +24,7 @@
 #define PCF8523_CONTROL3_PM_DSM BIT(5) /* direct switching mode */
 #define PCF8523_CONTROL3_PM_MASK 0xe0
 #define PCF8523_CONTROL3_BLF BIT(2) /* battery low bit, read-only */
+#define PCF8523_CONTROL3_BSF BIT(3)
 
 #define PCF8523_REG_SECONDS  0x03
 #define PCF8523_SECONDS_OS BIT(7)
@@ -94,18 +95,6 @@ static int pcf8523_write(struct i2c_client *client, u8 reg, u8 value)
        return 0;
 }
 
-static int pcf8523_voltage_low(struct i2c_client *client)
-{
-       u8 value;
-       int err;
-
-       err = pcf8523_read(client, PCF8523_REG_CONTROL3, &value);
-       if (err < 0)
-               return err;
-
-       return !!(value & PCF8523_CONTROL3_BLF);
-}
-
 static int pcf8523_load_capacitance(struct i2c_client *client)
 {
        u32 load;
@@ -220,14 +209,6 @@ static int pcf8523_rtc_read_time(struct device *dev, struct rtc_time *tm)
        struct i2c_msg msgs[2];
        int err;
 
-       err = pcf8523_voltage_low(client);
-       if (err < 0) {
-               return err;
-       } else if (err > 0) {
-               dev_err(dev, "low voltage detected, time is unreliable\n");
-               return -EINVAL;
-       }
-
        msgs[0].addr = client->addr;
        msgs[0].flags = 0;
        msgs[0].len = 1;
@@ -412,10 +393,11 @@ static int pcf8523_rtc_ioctl(struct device *dev, unsigned int cmd,
 
        switch (cmd) {
        case RTC_VL_READ:
-               ret = pcf8523_voltage_low(client);
+               ret = pcf8523_read(client, PCF8523_REG_CONTROL3, &value);
                if (ret < 0)
                        return ret;
-               if (ret)
+
+               if (value & PCF8523_CONTROL3_BLF)
                        flags |= RTC_VL_BACKUP_LOW;
 
                ret = pcf8523_read(client, PCF8523_REG_SECONDS, &value);