aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/rtc
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2012-01-03 20:32:13 -0500
committerGreg Kroah-Hartman <gregkh@suse.de>2012-01-06 17:14:13 -0500
commitb47f3ad598247071dcab661f94655bbe8074467a (patch)
tree75f44109d110486f3fdfa2c27f9bdc9cb9c0f221 /drivers/rtc
parentc61e023d2b6ca9d0aaf766659a81ad5d017e5b53 (diff)
Revert "rtc: Disable the alarm in the hardware"
commit 157e8bf8b4823bfcdefa6c1548002374b61f61df upstream. This reverts commit c0afabd3d553c521e003779c127143ffde55a16f. It causes failures on Toshiba laptops - instead of disabling the alarm, it actually seems to enable it on the affected laptops, resulting in (for example) the laptop powering on automatically five minutes after shutdown. There's a patch for it that appears to work for at least some people, but it's too late to play around with this, so revert for now and try again in the next merge window. See for example http://bugs.debian.org/652869 Reported-and-bisected-by: Andreas Friedrich <afrie@gmx.net> (Toshiba Tecra) Reported-by: Antonio-M. Corbi Bellot <antonio.corbi@ua.es> (Toshiba Portege R500) Reported-by: Marco Santos <marco.santos@waynext.com> (Toshiba Portege Z830) Reported-by: Christophe Vu-Brugier <cvubrugier@yahoo.fr> (Toshiba Portege R830) Cc: Jonathan Nieder <jrnieder@gmail.com> Requested-by: John Stultz <john.stultz@linaro.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/rtc')
-rw-r--r--drivers/rtc/interface.c44
1 files changed, 10 insertions, 34 deletions
diff --git a/drivers/rtc/interface.c b/drivers/rtc/interface.c
index bbb6f852c5a..eb4c88316a1 100644
--- a/drivers/rtc/interface.c
+++ b/drivers/rtc/interface.c
@@ -318,20 +318,6 @@ int rtc_read_alarm(struct rtc_device *rtc, struct rtc_wkalrm *alarm)
318} 318}
319EXPORT_SYMBOL_GPL(rtc_read_alarm); 319EXPORT_SYMBOL_GPL(rtc_read_alarm);
320 320
321static int ___rtc_set_alarm(struct rtc_device *rtc, struct rtc_wkalrm *alarm)
322{
323 int err;
324
325 if (!rtc->ops)
326 err = -ENODEV;
327 else if (!rtc->ops->set_alarm)
328 err = -EINVAL;
329 else
330 err = rtc->ops->set_alarm(rtc->dev.parent, alarm);
331
332 return err;
333}
334
335static int __rtc_set_alarm(struct rtc_device *rtc, struct rtc_wkalrm *alarm) 321static int __rtc_set_alarm(struct rtc_device *rtc, struct rtc_wkalrm *alarm)
336{ 322{
337 struct rtc_time tm; 323 struct rtc_time tm;
@@ -355,7 +341,14 @@ static int __rtc_set_alarm(struct rtc_device *rtc, struct rtc_wkalrm *alarm)
355 * over right here, before we set the alarm. 341 * over right here, before we set the alarm.
356 */ 342 */
357 343
358 return ___rtc_set_alarm(rtc, alarm); 344 if (!rtc->ops)
345 err = -ENODEV;
346 else if (!rtc->ops->set_alarm)
347 err = -EINVAL;
348 else
349 err = rtc->ops->set_alarm(rtc->dev.parent, alarm);
350
351 return err;
359} 352}
360 353
361int rtc_set_alarm(struct rtc_device *rtc, struct rtc_wkalrm *alarm) 354int rtc_set_alarm(struct rtc_device *rtc, struct rtc_wkalrm *alarm)
@@ -769,20 +762,6 @@ static int rtc_timer_enqueue(struct rtc_device *rtc, struct rtc_timer *timer)
769 return 0; 762 return 0;
770} 763}
771 764
772static void rtc_alarm_disable(struct rtc_device *rtc)
773{
774 struct rtc_wkalrm alarm;
775 struct rtc_time tm;
776
777 __rtc_read_time(rtc, &tm);
778
779 alarm.time = rtc_ktime_to_tm(ktime_add(rtc_tm_to_ktime(tm),
780 ktime_set(300, 0)));
781 alarm.enabled = 0;
782
783 ___rtc_set_alarm(rtc, &alarm);
784}
785
786/** 765/**
787 * rtc_timer_remove - Removes a rtc_timer from the rtc_device timerqueue 766 * rtc_timer_remove - Removes a rtc_timer from the rtc_device timerqueue
788 * @rtc rtc device 767 * @rtc rtc device
@@ -804,10 +783,8 @@ static void rtc_timer_remove(struct rtc_device *rtc, struct rtc_timer *timer)
804 struct rtc_wkalrm alarm; 783 struct rtc_wkalrm alarm;
805 int err; 784 int err;
806 next = timerqueue_getnext(&rtc->timerqueue); 785 next = timerqueue_getnext(&rtc->timerqueue);
807 if (!next) { 786 if (!next)
808 rtc_alarm_disable(rtc);
809 return; 787 return;
810 }
811 alarm.time = rtc_ktime_to_tm(next->expires); 788 alarm.time = rtc_ktime_to_tm(next->expires);
812 alarm.enabled = 1; 789 alarm.enabled = 1;
813 err = __rtc_set_alarm(rtc, &alarm); 790 err = __rtc_set_alarm(rtc, &alarm);
@@ -869,8 +846,7 @@ again:
869 err = __rtc_set_alarm(rtc, &alarm); 846 err = __rtc_set_alarm(rtc, &alarm);
870 if (err == -ETIME) 847 if (err == -ETIME)
871 goto again; 848 goto again;
872 } else 849 }
873 rtc_alarm_disable(rtc);
874 850
875 mutex_unlock(&rtc->ops_lock); 851 mutex_unlock(&rtc->ops_lock);
876} 852}