rtc: davinci: use unlock/lock mechanism
authorDario Binacchi <dariobin@libero.it>
Wed, 2 Jun 2021 20:38:02 +0000 (22:38 +0200)
committerLokesh Vutla <lokeshvutla@ti.com>
Wed, 9 Jun 2021 16:53:44 +0000 (22:23 +0530)
The RTC module contains a kicker mechanism to prevent any spurious
writes from changing the register values. To set the time, you must
first unlock the TC registers, update them and then lock.

Signed-off-by: Dario Binacchi <dariobin@libero.it>
Signed-off-by: Lokesh Vutla <lokeshvutla@ti.com>
Link: https://lore.kernel.org/r/20210602203805.11494-6-dariobin@libero.it
drivers/rtc/davinci.c

index 7b8c729..82e5eb3 100644 (file)
 #define RTC_BASE DAVINCI_RTC_BASE
 #endif
 
+static void davinci_rtc_lock(struct davinci_rtc *rtc)
+{
+       writel(0, &rtc->kick0r);
+       writel(0, &rtc->kick1r);
+}
+
+static void davinci_rtc_unlock(struct davinci_rtc *rtc)
+{
+       writel(RTC_KICK0R_WE, &rtc->kick0r);
+       writel(RTC_KICK1R_WE, &rtc->kick1r);
+}
+
 static int davinci_rtc_wait_not_busy(struct davinci_rtc *rtc)
 {
        int count;
@@ -89,6 +101,7 @@ int rtc_set(struct rtc_time *tmp)
        if (ret)
                return ret;
 
+       davinci_rtc_unlock(rtc);
        writeb(bin2bcd(tmp->tm_year % 100), &rtc->year);
        writeb(bin2bcd(tmp->tm_mon), &rtc->month);
 
@@ -97,6 +110,7 @@ int rtc_set(struct rtc_time *tmp)
        writeb(bin2bcd(tmp->tm_hour), &rtc->hours);
        writeb(bin2bcd(tmp->tm_min), &rtc->minutes);
        writeb(bin2bcd(tmp->tm_sec), &rtc->second);
+       davinci_rtc_lock(rtc);
 
        debug("Set DATE: %4d-%02d-%02d (wday=%d)  TIME: %2d:%02d:%02d\n",
              tmp->tm_year, tmp->tm_mon, tmp->tm_mday, tmp->tm_wday,