]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
rtc: mt6359: Use RTC_TC_DOW hardware register for wday
authorAngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
Mon, 23 Sep 2024 10:00:10 +0000 (12:00 +0200)
committerAlexandre Belloni <alexandre.belloni@bootlin.com>
Mon, 11 Nov 2024 21:00:35 +0000 (22:00 +0100)
Instead of calculating the number of full days since Sunday with
(days + 4) % 7, read (and write) that to the RTC Day-of-week Time
Counter register (RTC_TC_DOW).

Some transformation (addition and subtraction for set/get) is
still done, as this register's range is [1..7], while the tm_wday
in struct tm's range is [0..6].

Please note that this was added only to set_time() and read_time()
callbacks because set_alarm() and read_alarm() are setting a bit
in RTC_AL_MASK to ignore DOW for RTC HW alarms for unknown reasons.

Signed-off-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
Link: https://lore.kernel.org/r/20240923100010.97470-4-angelogioacchino.delregno@collabora.com
Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com>
drivers/rtc/rtc-mt6397.c

index 4785af123a7fb68f42acfee51e220a224aedb292..152699219a2b9e0aa1dff98c72133b63207fc468 100644 (file)
@@ -75,6 +75,7 @@ static int __mtk_rtc_read_time(struct mt6397_rtc *rtc,
        tm->tm_min = data[RTC_OFFSET_MIN];
        tm->tm_hour = data[RTC_OFFSET_HOUR];
        tm->tm_mday = data[RTC_OFFSET_DOM];
+       tm->tm_wday = data[RTC_OFFSET_DOW];
        tm->tm_mon = data[RTC_OFFSET_MTH] & RTC_TC_MTH_MASK;
        tm->tm_year = data[RTC_OFFSET_YEAR];
 
@@ -86,9 +87,8 @@ exit:
 
 static int mtk_rtc_read_time(struct device *dev, struct rtc_time *tm)
 {
-       time64_t time;
        struct mt6397_rtc *rtc = dev_get_drvdata(dev);
-       int days, sec, ret;
+       int sec, ret;
 
        do {
                ret = __mtk_rtc_read_time(rtc, tm, &sec);
@@ -96,15 +96,9 @@ static int mtk_rtc_read_time(struct device *dev, struct rtc_time *tm)
                        goto exit;
        } while (sec < tm->tm_sec);
 
-       /* HW register start mon from one, but tm_mon start from zero. */
+       /* HW register start mon/wday from one, but tm_mon/tm_wday start from zero. */
        tm->tm_mon--;
-       time = rtc_tm_to_time64(tm);
-
-       /* rtc_tm_to_time64 covert Gregorian date to seconds since
-        * 01-01-1970 00:00:00, and this date is Thursday.
-        */
-       days = div_s64(time, 86400);
-       tm->tm_wday = (days + 4) % 7;
+       tm->tm_wday--;
 
 exit:
        return ret;
@@ -117,11 +111,13 @@ static int mtk_rtc_set_time(struct device *dev, struct rtc_time *tm)
        u16 data[RTC_OFFSET_COUNT];
 
        tm->tm_mon++;
+       tm->tm_wday++;
 
        data[RTC_OFFSET_SEC] = tm->tm_sec;
        data[RTC_OFFSET_MIN] = tm->tm_min;
        data[RTC_OFFSET_HOUR] = tm->tm_hour;
        data[RTC_OFFSET_DOM] = tm->tm_mday;
+       data[RTC_OFFSET_DOW] = tm->tm_wday;
        data[RTC_OFFSET_MTH] = tm->tm_mon;
        data[RTC_OFFSET_YEAR] = tm->tm_year;