Bug#652869: Laptop auto power-on after correct shutdown and being powered-off
Hi Jonathan,
On Thu, 22 Dec 2011 04:28:12 -0600, Jonathan Nieder wrote :
> Could you try this patch[1]?
>
> [1] http://kernel-handbook.alioth.debian.org/ch-common-tasks.html
I experienced the bug with a Toshiba Portege R830 and Linux 3.1.6. I
followed your instructions and I rebuilt a kernel that reverts "rtc:
Disable the alarm in the hardware". That works: my laptop does not
power on automagically after 5 minutes.
Thank you,
>
> -- >8 --
> Subject: Revert "rtc: Disable the alarm in the hardware"
>
> This reverts commit 0cbc008c56f7b4a11ba6fe80e196d7ab322baabf.
> ---
> Thanks and hope that helps,
> Jonathan
>
> drivers/rtc/interface.c | 44
> ++++++++++---------------------------------- 1 files changed, 10
> insertions(+), 34 deletions(-)
>
> diff --git a/drivers/rtc/interface.c b/drivers/rtc/interface.c
> index 3d9d2b976560..44e91e598f8d 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) }
> EXPORT_SYMBOL_GPL(rtc_read_alarm);
>
> -static int ___rtc_set_alarm(struct rtc_device *rtc, struct
> rtc_wkalrm *alarm) -{
> - int err;
> -
> - if (!rtc->ops)
> - err = -ENODEV;
> - else if (!rtc->ops->set_alarm)
> - err = -EINVAL;
> - else
> - err = rtc->ops->set_alarm(rtc->dev.parent, alarm);
> -
> - return err;
> -}
> -
> static int __rtc_set_alarm(struct rtc_device *rtc, struct rtc_wkalrm
> *alarm) {
> struct rtc_time tm;
> @@ -355,7 +341,14 @@ static int __rtc_set_alarm(struct rtc_device
> *rtc, struct rtc_wkalrm *alarm)
> * over right here, before we set the alarm.
> */
>
> - return ___rtc_set_alarm(rtc, alarm);
> + if (!rtc->ops)
> + err = -ENODEV;
> + else if (!rtc->ops->set_alarm)
> + err = -EINVAL;
> + else
> + err = rtc->ops->set_alarm(rtc->dev.parent, alarm);
> +
> + return err;
> }
>
> int 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) return 0;
> }
>
> -static void rtc_alarm_disable(struct rtc_device *rtc)
> -{
> - struct rtc_wkalrm alarm;
> - struct rtc_time tm;
> -
> - __rtc_read_time(rtc, &tm);
> -
> - alarm.time = rtc_ktime_to_tm(ktime_add(rtc_tm_to_ktime(tm),
> - ktime_set(300, 0)));
> - alarm.enabled = 0;
> -
> - ___rtc_set_alarm(rtc, &alarm);
> -}
> -
> /**
> * rtc_timer_remove - Removes a rtc_timer from the rtc_device
> timerqueue
> * @rtc rtc device
> @@ -804,10 +783,8 @@ 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) {
> - rtc_alarm_disable(rtc);
> + if (!next)
> return;
> - }
> alarm.time = rtc_ktime_to_tm(next->expires);
> alarm.enabled = 1;
> err = __rtc_set_alarm(rtc, &alarm);
> @@ -869,8 +846,7 @@ again:
> err = __rtc_set_alarm(rtc, &alarm);
> if (err == -ETIME)
> goto again;
> - } else
> - rtc_alarm_disable(rtc);
> + }
>
> mutex_unlock(&rtc->ops_lock);
> }
--
Christophe Vu-Brugier
Reply to: