Commit 7f43020e authored by Bruno Thomsen's avatar Bruno Thomsen Committed by Alexandre Belloni

rtc: pcf2127: bugfix: read rtc disables watchdog

The previous fix listed bulk read of registers as root cause of
accendential disabling of watchdog, since the watchdog counter
register (WD_VAL) was zeroed.

Fixes: 3769a375 rtc: pcf2127: bulk read only date and time registers.

Tested with the same PCF2127 chip as Sean reveled root cause
of WD_VAL register value zeroing was caused by reading CTRL2
register which is one of the watchdog feature control registers.

So the solution is to not read the first two control registers
(CTRL1 and CTRL2) in pcf2127_rtc_read_time as they are not
needed anyway. Size of local buf variable is kept to allow
easy usage of register defines to improve readability of code.

Debug trace line was updated after CTRL1 and CTRL2 are no longer
read from the chip. Also replaced magic numbers in buf access
with register defines.
Signed-off-by: default avatarBruno Thomsen <bruno.thomsen@gmail.com>
Link: https://lore.kernel.org/r/20190822131936.18772-3-bruno.thomsen@gmail.comSigned-off-by: default avatarAlexandre Belloni <alexandre.belloni@bootlin.com>
parent bbfe3a7a
...@@ -60,20 +60,14 @@ static int pcf2127_rtc_read_time(struct device *dev, struct rtc_time *tm) ...@@ -60,20 +60,14 @@ static int pcf2127_rtc_read_time(struct device *dev, struct rtc_time *tm)
struct pcf2127 *pcf2127 = dev_get_drvdata(dev); struct pcf2127 *pcf2127 = dev_get_drvdata(dev);
unsigned char buf[10]; unsigned char buf[10];
int ret; int ret;
int i;
for (i = 0; i <= PCF2127_REG_CTRL3; i++) { /*
ret = regmap_read(pcf2127->regmap, PCF2127_REG_CTRL1 + i, * Avoid reading CTRL2 register as it causes WD_VAL register
(unsigned int *)(buf + i)); * value to reset to 0 which means watchdog is stopped.
if (ret) { */
dev_err(dev, "%s: read error\n", __func__); ret = regmap_bulk_read(pcf2127->regmap, PCF2127_REG_CTRL3,
return ret; (buf + PCF2127_REG_CTRL3),
} ARRAY_SIZE(buf) - PCF2127_REG_CTRL3);
}
ret = regmap_bulk_read(pcf2127->regmap, PCF2127_REG_SC,
(buf + PCF2127_REG_SC),
ARRAY_SIZE(buf) - PCF2127_REG_SC);
if (ret) { if (ret) {
dev_err(dev, "%s: read error\n", __func__); dev_err(dev, "%s: read error\n", __func__);
return ret; return ret;
...@@ -95,14 +89,12 @@ static int pcf2127_rtc_read_time(struct device *dev, struct rtc_time *tm) ...@@ -95,14 +89,12 @@ static int pcf2127_rtc_read_time(struct device *dev, struct rtc_time *tm)
} }
dev_dbg(dev, dev_dbg(dev,
"%s: raw data is cr1=%02x, cr2=%02x, cr3=%02x, " "%s: raw data is cr3=%02x, sec=%02x, min=%02x, hr=%02x, "
"sec=%02x, min=%02x, hr=%02x, "
"mday=%02x, wday=%02x, mon=%02x, year=%02x\n", "mday=%02x, wday=%02x, mon=%02x, year=%02x\n",
__func__, __func__, buf[PCF2127_REG_CTRL3], buf[PCF2127_REG_SC],
buf[0], buf[1], buf[2], buf[PCF2127_REG_MN], buf[PCF2127_REG_HR],
buf[3], buf[4], buf[5], buf[PCF2127_REG_DM], buf[PCF2127_REG_DW],
buf[6], buf[7], buf[8], buf[9]); buf[PCF2127_REG_MO], buf[PCF2127_REG_YR]);
tm->tm_sec = bcd2bin(buf[PCF2127_REG_SC] & 0x7F); tm->tm_sec = bcd2bin(buf[PCF2127_REG_SC] & 0x7F);
tm->tm_min = bcd2bin(buf[PCF2127_REG_MN] & 0x7F); tm->tm_min = bcd2bin(buf[PCF2127_REG_MN] & 0x7F);
......
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