summaryrefslogtreecommitdiff
path: root/drivers/rtc
diff options
context:
space:
mode:
authorTodd Kjos <tkjos@google.com>2017-03-02 13:53:48 -0800
committerTodd Kjos <tkjos@google.com>2017-03-02 13:53:48 -0800
commit837de638dc019843efb0f8744e299769af32e004 (patch)
tree3f693d421593332edcdf1d877433d31e9f1525de /drivers/rtc
parentf04805218728192d346291c1a0e78cb184142bad (diff)
parentdd4534d88b93a911983503851ec9441787a4997d (diff)
Merge branch 'upstream-linux-4.4.y' into android-4.4
Diffstat (limited to 'drivers/rtc')
-rw-r--r--drivers/rtc/interface.c16
1 files changed, 15 insertions, 1 deletions
diff --git a/drivers/rtc/interface.c b/drivers/rtc/interface.c
index 5836751b8203..9bb934ed2a7a 100644
--- a/drivers/rtc/interface.c
+++ b/drivers/rtc/interface.c
@@ -748,9 +748,23 @@ EXPORT_SYMBOL_GPL(rtc_irq_set_freq);
*/
static int rtc_timer_enqueue(struct rtc_device *rtc, struct rtc_timer *timer)
{
+ struct timerqueue_node *next = timerqueue_getnext(&rtc->timerqueue);
+ struct rtc_time tm;
+ ktime_t now;
+
timer->enabled = 1;
+ __rtc_read_time(rtc, &tm);
+ now = rtc_tm_to_ktime(tm);
+
+ /* Skip over expired timers */
+ while (next) {
+ if (next->expires.tv64 >= now.tv64)
+ break;
+ next = timerqueue_iterate_next(next);
+ }
+
timerqueue_add(&rtc->timerqueue, &timer->node);
- if (&timer->node == timerqueue_getnext(&rtc->timerqueue)) {
+ if (!next) {
struct rtc_wkalrm alarm;
int err;
alarm.time = rtc_ktime_to_tm(timer->node.expires);