Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1644621 > unrolled thread

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

Started byMichael Thalmeier <michael.thalmeier@hale.at>
First post2017-05-18 16:50 +0200
Last post2017-05-18 18:00 +0200
Articles 2 — 2 participants

Back to article view | Back to linux.kernel


Contents

  [PATCH] rtc: rtc-stmp3xxx: detect power failure on backup power domain Michael Thalmeier <michael.thalmeier@hale.at> - 2017-05-18 16:50 +0200
    Re: [PATCH] rtc: rtc-stmp3xxx: detect power failure on backup power  domain Alexandre Belloni <alexandre.belloni@free-electrons.com> - 2017-05-18 18:00 +0200

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

FromMichael Thalmeier <michael.thalmeier@hale.at>
Date2017-05-18 16:50 +0200
Subject[PATCH] rtc: rtc-stmp3xxx: detect power failure on backup power domain
Message-ID<tIuUy-44c-25@gated-at.bofh.it>
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@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

[toc] | [next] | [standalone]


#1644710 — Re: [PATCH] rtc: rtc-stmp3xxx: detect power failure on backup power domain

FromAlexandre Belloni <alexandre.belloni@free-electrons.com>
Date2017-05-18 18:00 +0200
SubjectRe: [PATCH] rtc: rtc-stmp3xxx: detect power failure on backup power domain
Message-ID<tIw0i-4M2-17@gated-at.bofh.it>
In reply to#1644621
Hi,

On 18/05/2017 at 16:45:21 +0200, Michael Thalmeier wrote:
> 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.

> When we detect a power fail we return -ENODATA.
> 

All the other drivers return -EINVAL in that case.

> Signed-off-by: Michael Thalmeier <michael.thalmeier@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
> 

-- 
Alexandre Belloni, Free Electrons
Embedded Linux and Kernel engineering
http://free-electrons.com

[toc] | [prev] | [standalone]


Back to top | Article view | linux.kernel


csiph-web