rtc: alarm: update power_on alarm setting logic

The previous power_on alarm value should be checked to avoid
cancelling the alarm by mistake.

CRs-fixed: 551966
Change-Id: I4de12265416fab41a9c591d09961c9fef0d25917
Signed-off-by: Xiaocheng Li <lix@codeaurora.org>
This commit is contained in:
Xiaocheng Li
2014-04-01 20:05:28 -07:00
committed by Gerrit - the friendly Code Review server
parent 20da61ed1f
commit aaf95a368d
3 changed files with 17 additions and 5 deletions
+4 -2
View File
@@ -99,7 +99,9 @@ static long alarm_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
}
alarm_enabled &= ~alarm_type_mask;
if (alarm_type == ANDROID_ALARM_RTC_POWEROFF_WAKEUP)
set_power_on_alarm(0);
if (!copy_from_user(&new_alarm_time,
(void __user *)arg, sizeof(new_alarm_time)))
set_power_on_alarm(new_alarm_time.tv_sec, 0);
spin_unlock_irqrestore(&alarm_slock, flags);
break;
@@ -130,7 +132,7 @@ from_old_alarm_set:
if ((alarm_type == ANDROID_ALARM_RTC_POWEROFF_WAKEUP) &&
(ANDROID_ALARM_BASE_CMD(cmd) ==
ANDROID_ALARM_SET(0)))
set_power_on_alarm(new_alarm_time.tv_sec);
set_power_on_alarm(new_alarm_time.tv_sec, 1);
spin_unlock_irqrestore(&alarm_slock, flags);
if (ANDROID_ALARM_BASE_CMD(cmd) != ANDROID_ALARM_SET_AND_WAIT(0)
&& cmd != ANDROID_ALARM_SET_AND_WAIT_OLD)
+12 -2
View File
@@ -72,9 +72,19 @@ static bool suspended;
static long power_on_alarm;
static void alarm_shutdown(struct platform_device *dev);
void set_power_on_alarm(long secs)
void set_power_on_alarm(long secs, bool enable)
{
power_on_alarm = secs;
if (enable) {
power_on_alarm = secs;
} else {
if (power_on_alarm && power_on_alarm != secs) {
pr_alarm(FLOW, "power-off alarm mismatch: \
previous=%ld, now=%ld\n",
power_on_alarm, secs);
}
else
power_on_alarm = 0;
}
alarm_shutdown(NULL);
}
+1 -1
View File
@@ -71,7 +71,7 @@ void alarm_init(struct alarm *alarm,
void alarm_start_range(struct alarm *alarm, ktime_t start, ktime_t end);
int alarm_try_to_cancel(struct alarm *alarm);
int alarm_cancel(struct alarm *alarm);
void set_power_on_alarm(long secs);
void set_power_on_alarm(long secs, bool enable);
ktime_t alarm_get_elapsed_realtime(void);
/* set rtc while preserving elapsed realtime */