| From 1845089501dc777ff1d3ea392e1216985a31bf43 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Wed, 11 Jun 2025 11:14:15 -0700 |
| Subject: rtc: ds1307: remove clear of oscillator stop flag (OSF) in probe |
| |
| From: Meagan Lloyd <meaganlloyd@linux.microsoft.com> |
| |
| [ Upstream commit 48458654659c9c2e149c211d86637f1592470da5 ] |
| |
| 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. |
| |
| Some chip types in the ds1307 driver already have OSF handling to |
| determine whether .read_time provides valid RTC data or returns -EINVAL. |
| |
| This change removes the clear of the OSF in .probe as the OSF needs to |
| be preserved to expand the OSF handling to the ds1341 chip type (note |
| that DS1341 and DS1342 share a datasheet). |
| |
| 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-2-git-send-email-meaganlloyd@linux.microsoft.com |
| Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/rtc/rtc-ds1307.c | 4 +--- |
| 1 file changed, 1 insertion(+), 3 deletions(-) |
| |
| diff --git a/drivers/rtc/rtc-ds1307.c b/drivers/rtc/rtc-ds1307.c |
| index 530b9340db21..6d82fb45e9a8 100644 |
| --- a/drivers/rtc/rtc-ds1307.c |
| +++ b/drivers/rtc/rtc-ds1307.c |
| @@ -1819,10 +1819,8 @@ static int ds1307_probe(struct i2c_client *client, |
| regmap_write(ds1307->regmap, DS1337_REG_CONTROL, |
| regs[0]); |
| |
| - /* oscillator fault? clear flag, and warn */ |
| + /* oscillator fault? warn */ |
| if (regs[1] & DS1337_BIT_OSF) { |
| - regmap_write(ds1307->regmap, DS1337_REG_STATUS, |
| - regs[1] & ~DS1337_BIT_OSF); |
| dev_warn(ds1307->dev, "SET TIME!\n"); |
| } |
| break; |
| -- |
| 2.39.5 |
| |