File tree 1 file changed +22
-3
lines changed 1 file changed +22
-3
lines changed Original file line number Diff line number Diff line change @@ -178,8 +178,28 @@ static int pcf8523_rtc_read_time(struct device *dev, struct rtc_time *tm)
178
178
if (err < 0 )
179
179
return err ;
180
180
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
+ }
183
203
184
204
tm -> tm_sec = bcd2bin (regs [0 ] & 0x7f );
185
205
tm -> tm_min = bcd2bin (regs [1 ] & 0x7f );
@@ -215,7 +235,6 @@ static int pcf8523_rtc_set_time(struct device *dev, struct rtc_time *tm)
215
235
return err ;
216
236
217
237
regs [0 ] = REG_SECONDS ;
218
- /* This will purposely overwrite REG_SECONDS_OS */
219
238
regs [1 ] = bin2bcd (tm -> tm_sec );
220
239
regs [2 ] = bin2bcd (tm -> tm_min );
221
240
regs [3 ] = bin2bcd (tm -> tm_hour );
You can’t perform that action at this time.
0 commit comments