[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

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: