|
@@ -776,6 +776,14 @@ static int rtc_timer_enqueue(struct rtc_device *rtc, struct rtc_timer *timer)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+static void rtc_alarm_disable(struct rtc_device *rtc)
|
|
|
+{
|
|
|
+ if (!rtc->ops || !rtc->ops->alarm_irq_enable)
|
|
|
+ return;
|
|
|
+
|
|
|
+ rtc->ops->alarm_irq_enable(rtc->dev.parent, false);
|
|
|
+}
|
|
|
+
|
|
|
/**
|
|
|
* rtc_timer_remove - Removes a rtc_timer from the rtc_device timerqueue
|
|
|
* @rtc rtc device
|
|
@@ -797,8 +805,10 @@ static void rtc_timer_remove(struct rtc_device *rtc, struct rtc_timer *timer)
|
|
|
struct rtc_wkalrm alarm;
|
|
|
int err;
|
|
|
next = timerqueue_getnext(&rtc->timerqueue);
|
|
|
- if (!next)
|
|
|
+ if (!next) {
|
|
|
+ rtc_alarm_disable(rtc);
|
|
|
return;
|
|
|
+ }
|
|
|
alarm.time = rtc_ktime_to_tm(next->expires);
|
|
|
alarm.enabled = 1;
|
|
|
err = __rtc_set_alarm(rtc, &alarm);
|
|
@@ -860,7 +870,8 @@ again:
|
|
|
err = __rtc_set_alarm(rtc, &alarm);
|
|
|
if (err == -ETIME)
|
|
|
goto again;
|
|
|
- }
|
|
|
+ } else
|
|
|
+ rtc_alarm_disable(rtc);
|
|
|
|
|
|
mutex_unlock(&rtc->ops_lock);
|
|
|
}
|