alarm: init power_on_alarm in alarm_dev_init

The power_on alarm might be missed during suspend/resume if
power_on_alarm was not set in some cases like power-off charging
using wall charger. So init power_on_alarm according to RTC alarm
reg during booting to guarantee power_on alarm will not be missed
by accident.

Change-Id: If4e84b5d34fd199897b178081e764f96d2b64194
Signed-off-by: Mao Jinlong <c_jmao@codeaurora.org>
This commit is contained in:
Mao Jinlong 2015-01-30 19:44:48 +08:00
parent d67480719d
commit b93528d4d4
3 changed files with 21 additions and 0 deletions

View File

@ -445,6 +445,8 @@ static int __init alarm_dev_init(void)
}
wakeup_source_init(&alarm_wake_lock, "alarm");
power_on_alarm_init();
return 0;
}

View File

@ -49,6 +49,7 @@ void alarm_restart(struct alarm *alarm);
int alarm_try_to_cancel(struct alarm *alarm);
int alarm_cancel(struct alarm *alarm);
void set_power_on_alarm(long secs, bool enable);
void power_on_alarm_init(void);
u64 alarm_forward(struct alarm *alarm, ktime_t now, ktime_t interval);
u64 alarm_forward_now(struct alarm *alarm, ktime_t interval);

View File

@ -57,6 +57,24 @@ static DEFINE_SPINLOCK(rtcdev_lock);
static unsigned long power_on_alarm;
static struct mutex power_on_alarm_lock;
void power_on_alarm_init(void)
{
struct rtc_wkalrm rtc_alarm;
struct rtc_time rt;
unsigned long alarm_time;
rtc_read_alarm(rtcdev, &rtc_alarm);
rt = rtc_alarm.time;
rtc_tm_to_time(&rt, &alarm_time);
if (alarm_time)
power_on_alarm = alarm_time + ALARM_DELTA;
else
power_on_alarm = 0;
}
void set_power_on_alarm(long secs, bool enable)
{
int rc;