]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
rtc: ds1307: Fix off-by-one issue with wday for rx8130
authorFredrik M Olsson <fredrik.m.olsson@axis.com>
Wed, 20 May 2026 14:48:54 +0000 (16:48 +0200)
committerAlexandre Belloni <alexandre.belloni@bootlin.com>
Wed, 24 Jun 2026 21:40:10 +0000 (23:40 +0200)
The RTC represent each weekday with a individual bit set in the WDAY
register, where the 0th bit represent the first day of the week and the
6th bit represents the last day of the week. For each passed day the
chip performs a rotary-left-shift by one to advance the weekday by one.

The tm_wday field represent weekdays by a value in the range of 0-6.

The fls() function return the bit index of the last bit set. To handle
when there are no bits set it will return 0, and if the 0th bit is set
it will return 1, and if the 1st bit is set it will return 2, and so on.

In order to make the result of the fls() function fall into the expected
range of 0-6 (instead of 1-7) this patch subtracts one from the result
(which matches how the value is written in ds1307_set_time()).

Fixes: 204756f016726 ("rtc: ds1307: Fix wday settings for rx8130")
Reviewed-by: Nobuhiro Iwamatsu <nobuhiro.iwamatsu.x90@mail.toshiba>
Signed-off-by: Fredrik M Olsson <fredrik.m.olsson@axis.com>
Link: https://patch.msgid.link/20260520-ds1307-rx8901-add-v2-2-e069ea32e1db@axis.com
Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com>
drivers/rtc/rtc-ds1307.c

index 8fc258d5a1f45a89bc2f3dcda1f4c68a63b17b9b..a77580c4eea725c4f9747fee228d6173d8084666 100644 (file)
@@ -311,7 +311,7 @@ static int ds1307_get_time(struct device *dev, struct rtc_time *t)
        t->tm_hour = bcd2bin(tmp);
        /* rx8130 is bit position, not BCD */
        if (ds1307->type == rx_8130)
-               t->tm_wday = fls(regs[DS1307_REG_WDAY] & 0x7f);
+               t->tm_wday = fls(regs[DS1307_REG_WDAY] & 0x7f) - 1;
        else
                t->tm_wday = bcd2bin(regs[DS1307_REG_WDAY] & 0x07) - 1;
        t->tm_mday = bcd2bin(regs[DS1307_REG_MDAY] & 0x3f);