On 27/10/2022 17:32, Ian Abbott wrote:
In `ds1347_set_time()`, the wrong value is being written to the `DS1347_CENTURY_REG` register. It needs to be converted to BCD. Fix it.
Fixes: 147dae76dbb9 ("rtc: ds1347: handle century register") Cc: stable@vger.kernel.org # v5.5+ Signed-off-by: Ian Abbott abbotti@mev.co.uk
drivers/rtc/rtc-ds1347.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/rtc/rtc-ds1347.c b/drivers/rtc/rtc-ds1347.c index 157bf5209ac4..a40c1a52df65 100644 --- a/drivers/rtc/rtc-ds1347.c +++ b/drivers/rtc/rtc-ds1347.c @@ -112,7 +112,7 @@ static int ds1347_set_time(struct device *dev, struct rtc_time *dt) return err; century = (dt->tm_year / 100) + 19;
- err = regmap_write(map, DS1347_CENTURY_REG, century);
- err = regmap_write(map, DS1347_CENTURY_REG, bin2bcd(century)); if (err) return err;
I'm sure this isn't a commonly used driver, but I'd just like to mention that I consider it critically broken without this bug fix. Any dates in the 21st century written to the RTC end up being in the 15th century inside the chip, and the kernel treats it as invalid when it is read back. (The times are out of range of a 32-bit Unix time. I'm not sure if 64-bit Unix times from the RTC before 1970 are supported or not.)