From 87dc705762384c03a5d7cef0cae389c6f3c28dfe Mon Sep 17 00:00:00 2001 From: Ken Chang Date: Fri, 27 May 2011 17:13:23 +0800 Subject: rtc: tps6586x: fix error in setting alarm1 Alarm1 expiration time is set based on rtc value. Should not compare the absolute rtc value with the valid range of alarm1 directly, expiration time from now is used instead. Bug 832563 Original-Change-Id: I338e7ee684b5cad6b2fba99b5ac4ec6cff9b75cd Reviewed-on: http://git-master/r/34295 Tested-by: Ken Chang Reviewed-by: Bharat Nihalani Tested-by: Bharat Nihalani Reviewed-by: Varun Wadekar Reviewed-by: Yu-Fong (Foster) Cho Rebase-Id: Rb4f233478ea418ddf5a7ae9e1d782dbc5c97cbde --- drivers/rtc/rtc-tps6586x.c | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) (limited to 'drivers/rtc/rtc-tps6586x.c') diff --git a/drivers/rtc/rtc-tps6586x.c b/drivers/rtc/rtc-tps6586x.c index c74d7db832ef..fccf13845022 100644 --- a/drivers/rtc/rtc-tps6586x.c +++ b/drivers/rtc/rtc-tps6586x.c @@ -134,6 +134,7 @@ static int tps6586x_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alrm) struct device *tps_dev = to_tps6586x_dev(dev); unsigned long seconds; unsigned long ticks; + unsigned long rtc_current_time; unsigned long long rticks = 0; u8 buff[3]; u8 rbuff[6]; @@ -160,21 +161,21 @@ static int tps6586x_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alrm) seconds -= rtc->epoch_start; - if (seconds > ALM1_VALID_RANGE_IN_SEC) { - err = tps6586x_reads(tps_dev, RTC_COUNT4_DUMMYREAD, sizeof(rbuff), rbuff); - if (err < 0) { - dev_err(dev, "failed to read counter\n"); - return err; - } - - for (i = 1; i < sizeof(rbuff); i++) { - rticks <<= 8; - rticks |= rbuff[i]; - } + err = tps6586x_reads(tps_dev, RTC_COUNT4_DUMMYREAD, sizeof(rbuff), rbuff); + if (err < 0) { + dev_err(dev, "failed to read counter\n"); + return err; + } - seconds = (rticks >> 10) - 1; + for (i = 1; i < sizeof(rbuff); i++) { + rticks <<= 8; + rticks |= rbuff[i]; } + rtc_current_time = rticks >> 10; + if ((seconds - rtc_current_time) > ALM1_VALID_RANGE_IN_SEC) + seconds = rtc_current_time - 1; + ticks = (unsigned long long)seconds << 10; buff[0] = (ticks >> 16) & 0xff; -- cgit v1.2.3