From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756628AbdEROqH (ORCPT ); Thu, 18 May 2017 10:46:07 -0400 Received: from gw.hale.at ([89.26.116.210]:46270 "EHLO gw.hale.at" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1756609AbdEROqF (ORCPT ); Thu, 18 May 2017 10:46:05 -0400 X-HALE-Mailborder-Watermark: 1495723561.59341@2J0NUAAOeZNoM3bfG8ByMQ X-HALE-Mailborder-From: michael.thalmeier@hale.at X-HALE-Mailborder-SpamCheck: not spam, SpamAssassin (nicht zwischen gespeichert, Wertung=-2.898, benoetigt 3, autolearn=not spam, ALL_TRUSTED -1.00, BAYES_00 -1.90, SURBL_BLOCKED 0.00, URIBL_BLOCKED 0.00) X-HALE-Mailborder-IP-Protocol: IPv4 X-HALE-Mailborder: Found to be clean X-HALE-Mailborder-ID: 665652C93BC.A893E X-HALE-Mailborder-Information: Please contact your admin for more information From: Michael Thalmeier To: Alessandro Zummo , Alexandre Belloni Cc: linux-rtc@vger.kernel.org, linux-kernel@vger.kernel.org, michael@thalmeier.at Subject: [PATCH] rtc: rtc-stmp3xxx: detect power failure on backup power domain Date: Thu, 18 May 2017 16:45:21 +0200 Message-Id: <20170518144521.9294-1-michael.thalmeier@hale.at> X-Mailer: git-send-email 2.9.2 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 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 --- 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