Commit 7d7234a4 authored by Alexandre Belloni's avatar Alexandre Belloni

rtc: pcf8523: avoid reading BLF in pcf8523_rtc_read_time

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: default avatarAlexandre Belloni <alexandre.belloni@bootlin.com>
Link: https://lore.kernel.org/r/20211015192400.818254-1-alexandre.belloni@bootlin.com
parent 6084eac3
...@@ -24,6 +24,7 @@ ...@@ -24,6 +24,7 @@
#define PCF8523_CONTROL3_PM_DSM BIT(5) /* direct switching mode */ #define PCF8523_CONTROL3_PM_DSM BIT(5) /* direct switching mode */
#define PCF8523_CONTROL3_PM_MASK 0xe0 #define PCF8523_CONTROL3_PM_MASK 0xe0
#define PCF8523_CONTROL3_BLF BIT(2) /* battery low bit, read-only */ #define PCF8523_CONTROL3_BLF BIT(2) /* battery low bit, read-only */
#define PCF8523_CONTROL3_BSF BIT(3)
#define PCF8523_REG_SECONDS 0x03 #define PCF8523_REG_SECONDS 0x03
#define PCF8523_SECONDS_OS BIT(7) #define PCF8523_SECONDS_OS BIT(7)
...@@ -94,18 +95,6 @@ static int pcf8523_write(struct i2c_client *client, u8 reg, u8 value) ...@@ -94,18 +95,6 @@ static int pcf8523_write(struct i2c_client *client, u8 reg, u8 value)
return 0; 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) static int pcf8523_load_capacitance(struct i2c_client *client)
{ {
u32 load; u32 load;
...@@ -220,14 +209,6 @@ static int pcf8523_rtc_read_time(struct device *dev, struct rtc_time *tm) ...@@ -220,14 +209,6 @@ static int pcf8523_rtc_read_time(struct device *dev, struct rtc_time *tm)
struct i2c_msg msgs[2]; struct i2c_msg msgs[2];
int err; 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].addr = client->addr;
msgs[0].flags = 0; msgs[0].flags = 0;
msgs[0].len = 1; msgs[0].len = 1;
...@@ -412,10 +393,11 @@ static int pcf8523_rtc_ioctl(struct device *dev, unsigned int cmd, ...@@ -412,10 +393,11 @@ static int pcf8523_rtc_ioctl(struct device *dev, unsigned int cmd,
switch (cmd) { switch (cmd) {
case RTC_VL_READ: case RTC_VL_READ:
ret = pcf8523_voltage_low(client); ret = pcf8523_read(client, PCF8523_REG_CONTROL3, &value);
if (ret < 0) if (ret < 0)
return ret; return ret;
if (ret)
if (value & PCF8523_CONTROL3_BLF)
flags |= RTC_VL_BACKUP_LOW; flags |= RTC_VL_BACKUP_LOW;
ret = pcf8523_read(client, PCF8523_REG_SECONDS, &value); ret = pcf8523_read(client, PCF8523_REG_SECONDS, &value);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment