diff options
Diffstat (limited to 'drivers/rtc/rtc-ab8500.c')
-rw-r--r-- | drivers/rtc/rtc-ab8500.c | 42 |
1 files changed, 25 insertions, 17 deletions
diff --git a/drivers/rtc/rtc-ab8500.c b/drivers/rtc/rtc-ab8500.c index 370889d0489b..bf3c2f669c3c 100644 --- a/drivers/rtc/rtc-ab8500.c +++ b/drivers/rtc/rtc-ab8500.c | |||
@@ -89,22 +89,17 @@ static int ab8500_rtc_read_time(struct device *dev, struct rtc_time *tm) | |||
89 | if (retval < 0) | 89 | if (retval < 0) |
90 | return retval; | 90 | return retval; |
91 | 91 | ||
92 | /* Early AB8500 chips will not clear the rtc read request bit */ | 92 | /* Wait for some cycles after enabling the rtc read in ab8500 */ |
93 | if (abx500_get_chip_id(dev) == 0) { | 93 | while (time_before(jiffies, timeout)) { |
94 | usleep_range(1000, 1000); | 94 | retval = abx500_get_register_interruptible(dev, |
95 | } else { | 95 | AB8500_RTC, AB8500_RTC_READ_REQ_REG, &value); |
96 | /* Wait for some cycles after enabling the rtc read in ab8500 */ | 96 | if (retval < 0) |
97 | while (time_before(jiffies, timeout)) { | 97 | return retval; |
98 | retval = abx500_get_register_interruptible(dev, | 98 | |
99 | AB8500_RTC, AB8500_RTC_READ_REQ_REG, &value); | 99 | if (!(value & RTC_READ_REQUEST)) |
100 | if (retval < 0) | 100 | break; |
101 | return retval; | 101 | |
102 | 102 | usleep_range(1000, 5000); | |
103 | if (!(value & RTC_READ_REQUEST)) | ||
104 | break; | ||
105 | |||
106 | usleep_range(1000, 5000); | ||
107 | } | ||
108 | } | 103 | } |
109 | 104 | ||
110 | /* Read the Watchtime registers */ | 105 | /* Read the Watchtime registers */ |
@@ -225,7 +220,8 @@ static int ab8500_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alarm) | |||
225 | { | 220 | { |
226 | int retval, i; | 221 | int retval, i; |
227 | unsigned char buf[ARRAY_SIZE(ab8500_rtc_alarm_regs)]; | 222 | unsigned char buf[ARRAY_SIZE(ab8500_rtc_alarm_regs)]; |
228 | unsigned long mins, secs = 0; | 223 | unsigned long mins, secs = 0, cursec = 0; |
224 | struct rtc_time curtm; | ||
229 | 225 | ||
230 | if (alarm->time.tm_year < (AB8500_RTC_EPOCH - 1900)) { | 226 | if (alarm->time.tm_year < (AB8500_RTC_EPOCH - 1900)) { |
231 | dev_dbg(dev, "year should be equal to or greater than %d\n", | 227 | dev_dbg(dev, "year should be equal to or greater than %d\n", |
@@ -237,6 +233,18 @@ static int ab8500_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alarm) | |||
237 | rtc_tm_to_time(&alarm->time, &secs); | 233 | rtc_tm_to_time(&alarm->time, &secs); |
238 | 234 | ||
239 | /* | 235 | /* |
236 | * Check whether alarm is set less than 1min. | ||
237 | * Since our RTC doesn't support alarm resolution less than 1min, | ||
238 | * return -EINVAL, so UIE EMUL can take it up, incase of UIE_ON | ||
239 | */ | ||
240 | ab8500_rtc_read_time(dev, &curtm); /* Read current time */ | ||
241 | rtc_tm_to_time(&curtm, &cursec); | ||
242 | if ((secs - cursec) < 59) { | ||
243 | dev_dbg(dev, "Alarm less than 1 minute not supported\r\n"); | ||
244 | return -EINVAL; | ||
245 | } | ||
246 | |||
247 | /* | ||
240 | * Convert it to the number of seconds since 01-01-2000 00:00:00, since | 248 | * Convert it to the number of seconds since 01-01-2000 00:00:00, since |
241 | * we only have a small counter in the RTC. | 249 | * we only have a small counter in the RTC. |
242 | */ | 250 | */ |