diff options
| author | Todd Kjos <tkjos@google.com> | 2017-03-02 13:53:48 -0800 |
|---|---|---|
| committer | Todd Kjos <tkjos@google.com> | 2017-03-02 13:53:48 -0800 |
| commit | 837de638dc019843efb0f8744e299769af32e004 (patch) | |
| tree | 3f693d421593332edcdf1d877433d31e9f1525de /drivers/rtc | |
| parent | f04805218728192d346291c1a0e78cb184142bad (diff) | |
| parent | dd4534d88b93a911983503851ec9441787a4997d (diff) | |
Merge branch 'upstream-linux-4.4.y' into android-4.4
Diffstat (limited to 'drivers/rtc')
| -rw-r--r-- | drivers/rtc/interface.c | 16 |
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); |
