Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

rtc: ds1307: handle oscillator stop flag (OSF) for ds1341

In using CONFIG_RTC_HCTOSYS, rtc_hctosys() will sync the RTC time to the
kernel time as long as rtc_read_time() succeeds. In some power loss
situations, our supercapacitor-backed DS1342 RTC comes up with either an
unpredictable future time or the default 01/01/00 from the datasheet.
The oscillator stop flag (OSF) is set in these scenarios due to the
power loss and can be used to determine the validity of the RTC data.

This change expands the oscillator stop flag (OSF) handling that has
already been implemented for some chips to the ds1341 chip (DS1341 and
DS1342 share a datasheet). This handling manages the validity of the RTC
data in .read_time and .set_time based on the OSF.

Signed-off-by: Meagan Lloyd <meaganlloyd@linux.microsoft.com>
Reviewed-by: Tyler Hicks <code@tyhicks.com>
Acked-by: Rodolfo Giometti <giometti@enneenne.com>
Link: https://lore.kernel.org/r/1749665656-30108-3-git-send-email-meaganlloyd@linux.microsoft.com
Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com>

authored by

Meagan Lloyd and committed by
Alexandre Belloni
523923cf 48458654

+11
+11
drivers/rtc/rtc-ds1307.c
··· 279 279 if (tmp & DS1340_BIT_OSF) 280 280 return -EINVAL; 281 281 break; 282 + case ds_1341: 283 + ret = regmap_read(ds1307->regmap, DS1337_REG_STATUS, &tmp); 284 + if (ret) 285 + return ret; 286 + if (tmp & DS1337_BIT_OSF) 287 + return -EINVAL; 288 + break; 282 289 case ds_1388: 283 290 ret = regmap_read(ds1307->regmap, DS1388_REG_FLAG, &tmp); 284 291 if (ret) ··· 383 376 case ds_1340: 384 377 regmap_update_bits(ds1307->regmap, DS1340_REG_FLAG, 385 378 DS1340_BIT_OSF, 0); 379 + break; 380 + case ds_1341: 381 + regmap_update_bits(ds1307->regmap, DS1337_REG_STATUS, 382 + DS1337_BIT_OSF, 0); 386 383 break; 387 384 case ds_1388: 388 385 regmap_update_bits(ds1307->regmap, DS1388_REG_FLAG,