Skip to content

Commit 8ec2a2d

Browse files
author
Phil Elwell
committed
Revert "rtc: pcf8523: properly handle oscillator stop bit"
This reverts commit ede44c9. See: raspberrypi/firmware#1065 Signed-off-by: Phil Elwell <[email protected]>
1 parent 96cf600 commit 8ec2a2d

File tree

1 file changed

+22
-3
lines changed

1 file changed

+22
-3
lines changed

drivers/rtc/rtc-pcf8523.c

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -178,8 +178,28 @@ static int pcf8523_rtc_read_time(struct device *dev, struct rtc_time *tm)
178178
if (err < 0)
179179
return err;
180180

181-
if (regs[0] & REG_SECONDS_OS)
182-
return -EINVAL;
181+
if (regs[0] & REG_SECONDS_OS) {
182+
/*
183+
* If the oscillator was stopped, try to clear the flag. Upon
184+
* power-up the flag is always set, but if we cannot clear it
185+
* the oscillator isn't running properly for some reason. The
186+
* sensible thing therefore is to return an error, signalling
187+
* that the clock cannot be assumed to be correct.
188+
*/
189+
190+
regs[0] &= ~REG_SECONDS_OS;
191+
192+
err = pcf8523_write(client, REG_SECONDS, regs[0]);
193+
if (err < 0)
194+
return err;
195+
196+
err = pcf8523_read(client, REG_SECONDS, &regs[0]);
197+
if (err < 0)
198+
return err;
199+
200+
if (regs[0] & REG_SECONDS_OS)
201+
return -EAGAIN;
202+
}
183203

184204
tm->tm_sec = bcd2bin(regs[0] & 0x7f);
185205
tm->tm_min = bcd2bin(regs[1] & 0x7f);
@@ -215,7 +235,6 @@ static int pcf8523_rtc_set_time(struct device *dev, struct rtc_time *tm)
215235
return err;
216236

217237
regs[0] = REG_SECONDS;
218-
/* This will purposely overwrite REG_SECONDS_OS */
219238
regs[1] = bin2bcd(tm->tm_sec);
220239
regs[2] = bin2bcd(tm->tm_min);
221240
regs[3] = bin2bcd(tm->tm_hour);

0 commit comments

Comments
 (0)