Re: [PATCH] rtc: rtc-stmp3xxx: detect power failure on backup power domain
From: Michael Thalmeier <hidden>
Date: 2017-06-07 13:06:00
Also in:
lkml
On Thu, May 18, 2017 at 05:56:31PM +0200, Alexandre Belloni wrote:
Hi, On 18/05/2017 at 16:45:21 +0200, Michael Thalmeier wrote:quoted
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.I'm kind of concerned that other people may want to use those register for something else but I don't currently have anything better to suggest. The other concern is that when updating the kernel, this will make amm the rtc report that the time is invalid until the next update. So this should be disabled by default.
How would you think this is best to disable by default? With a config option or with a module parameter? Either way would also allow to make the bit mask in the PERSISTENT2 register configurable, so one can use whichever bit is still unused by some other applications.
quoted
When we detect a power fail we return -ENODATA.All the other drivers return -EINVAL in that case.quoted
Signed-off-by: Michael Thalmeier <redacted> --- 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-- Alexandre Belloni, Free Electrons Embedded Linux and Kernel engineering http://free-electrons.com
-- Michael Thalmeier (Entwicklung) HALE electronic GmbH Eugen-Müller-Straße 18, 5020 Salzburg, Austria Tel: +43 (662) 439011 0 Fax: +43 (662) 439011 9 michael.thalmeier@hale.at Firmenbuchnummer: FN 66801m HG Salzburg