mirror of
https://github.com/torvalds/linux.git
synced 2026-06-02 19:43:40 +02:00
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>
This commit is contained in:
parent
4845865465
commit
523923cfd5
|
|
@ -279,6 +279,13 @@ static int ds1307_get_time(struct device *dev, struct rtc_time *t)
|
|||
if (tmp & DS1340_BIT_OSF)
|
||||
return -EINVAL;
|
||||
break;
|
||||
case ds_1341:
|
||||
ret = regmap_read(ds1307->regmap, DS1337_REG_STATUS, &tmp);
|
||||
if (ret)
|
||||
return ret;
|
||||
if (tmp & DS1337_BIT_OSF)
|
||||
return -EINVAL;
|
||||
break;
|
||||
case ds_1388:
|
||||
ret = regmap_read(ds1307->regmap, DS1388_REG_FLAG, &tmp);
|
||||
if (ret)
|
||||
|
|
@ -377,6 +384,10 @@ static int ds1307_set_time(struct device *dev, struct rtc_time *t)
|
|||
regmap_update_bits(ds1307->regmap, DS1340_REG_FLAG,
|
||||
DS1340_BIT_OSF, 0);
|
||||
break;
|
||||
case ds_1341:
|
||||
regmap_update_bits(ds1307->regmap, DS1337_REG_STATUS,
|
||||
DS1337_BIT_OSF, 0);
|
||||
break;
|
||||
case ds_1388:
|
||||
regmap_update_bits(ds1307->regmap, DS1388_REG_FLAG,
|
||||
DS1388_BIT_OSF, 0);
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user