mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2025-01-19 12:00:00 +00:00
rtc: mt6359: Use RTC_TC_DOW hardware register for wday
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>
This commit is contained in:
parent
34bbdc12d0
commit
d6f471a747
@ -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;
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user