[PATCH] rtc: rtc-stmp3xxx: detect power failure on backup power domain

From: Michael Thalmeier
Date: Thu May 18 2017 - 10:46:10 EST


To detect when the backup power domain has lost power a software defined bit
is set in one of the general purpose persistent registers when writing a new
time into the rtc.
When reading the time this bit is checked to determine if a power fail has
happened since the last time the rtc time was set.

When we detect a power fail we return -ENODATA.

Signed-off-by: Michael Thalmeier <michael.thalmeier@xxxxxxx>
---
drivers/rtc/rtc-stmp3xxx.c | 9 +++++++++
1 file changed, 9 insertions(+)

diff --git a/drivers/rtc/rtc-stmp3xxx.c b/drivers/rtc/rtc-stmp3xxx.c
index d578e40..51330ec 100644
--- a/drivers/rtc/rtc-stmp3xxx.c
+++ b/drivers/rtc/rtc-stmp3xxx.c
@@ -62,6 +62,9 @@
/* missing bitmask in headers */
#define STMP3XXX_RTC_PERSISTENT1_FORCE_UPDATER 0x80000000

+#define STMP3XXX_RTC_PERSISTENT2 0x80
+#define STMP3XXX_RTC_PERSISTENT2_VALID_TIME 0x01
+
struct stmp3xxx_rtc_data {
struct rtc_device *rtc;
void __iomem *io;
@@ -160,6 +163,10 @@ static int stmp3xxx_rtc_gettime(struct device *dev, struct rtc_time *rtc_tm)
if (ret)
return ret;

+ if (!(readl(rtc_data->io + STMP3XXX_RTC_PERSISTENT2) &
+ STMP3XXX_RTC_PERSISTENT2_VALID_TIME))
+ return -ENODATA;
+
rtc_time_to_tm(readl(rtc_data->io + STMP3XXX_RTC_SECONDS), rtc_tm);
return 0;
}
@@ -169,6 +176,8 @@ static int stmp3xxx_rtc_set_mmss(struct device *dev, unsigned long t)
struct stmp3xxx_rtc_data *rtc_data = dev_get_drvdata(dev);

writel(t, rtc_data->io + STMP3XXX_RTC_SECONDS);
+ writel(STMP3XXX_RTC_PERSISTENT2_VALID_TIME,
+ rtc_data->io + STMP3XXX_RTC_PERSISTENT2 + STMP_OFFSET_REG_SET);
return stmp3xxx_wait_time(rtc_data);
}

--
2.9.2