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.thalme...@hale.at> --- 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