rtc:alarm: remove alarm_shutdown hook in alarm driver

Putting alarm_shutdown into set_power_on_alarm is to set rtc alarm
time immediately after an alarm being set. It can avoid shutting
down unexpectedly before calling alarm_shutdown hook like removing
battery.Then power_on_alarm will be set to rtc twice when an alarm
is created and the device performs shutdown for a power off alarm.
The set process during shutting down is duplicated to the set
process when an alarm is created. So the alarm_shutdown hook become
unnecessary.

CRs-Fixed: 639119
Change-Id: Ie46bcf6f568f04650d94ba40ad6d4521d31a2f96
Signed-off-by: Xiaocheng Li <lix@codeaurora.org>
This commit is contained in:
Xiaocheng Li
2014-04-28 23:25:55 -07:00
committed by Gerrit - the friendly Code Review server
parent 4f891d2b1b
commit eeb31ff78d
2 changed files with 18 additions and 16 deletions
+2 -2
View File
@@ -98,11 +98,11 @@ static long alarm_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
wake_unlock(&alarm_wake_lock);
}
alarm_enabled &= ~alarm_type_mask;
spin_unlock_irqrestore(&alarm_slock, flags);
if (alarm_type == ANDROID_ALARM_RTC_POWEROFF_WAKEUP)
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;
case ANDROID_ALARM_SET_OLD:
@@ -129,11 +129,11 @@ from_old_alarm_set:
alarm_start_range(&alarms[alarm_type],
timespec_to_ktime(new_alarm_time),
timespec_to_ktime(new_alarm_time));
spin_unlock_irqrestore(&alarm_slock, flags);
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, 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)
break;
+16 -14
View File
@@ -65,15 +65,18 @@ struct alarm_queue {
static struct rtc_device *alarm_rtc_dev;
static DEFINE_SPINLOCK(alarm_slock);
static DEFINE_MUTEX(alarm_setrtc_mutex);
static DEFINE_MUTEX(power_on_alarm_mutex);
static struct wake_lock alarm_rtc_wake_lock;
static struct platform_device *alarm_platform_dev;
struct alarm_queue alarms[ANDROID_ALARM_TYPE_COUNT];
static bool suspended;
static long power_on_alarm;
static void alarm_shutdown(struct platform_device *dev);
static int set_alarm_time_to_rtc(const long);
void set_power_on_alarm(long secs, bool enable)
{
mutex_lock(&power_on_alarm_mutex);
if (enable) {
power_on_alarm = secs;
} else {
@@ -85,7 +88,9 @@ void set_power_on_alarm(long secs, bool enable)
else
power_on_alarm = 0;
}
alarm_shutdown(NULL);
set_alarm_time_to_rtc(power_on_alarm);
mutex_unlock(&power_on_alarm_mutex);
}
@@ -521,28 +526,23 @@ static int alarm_resume(struct platform_device *pdev)
return 0;
}
static void alarm_shutdown(struct platform_device *dev)
static int set_alarm_time_to_rtc(const long power_on_time)
{
struct timespec wall_time;
struct rtc_time rtc_time;
struct rtc_wkalrm alarm;
unsigned long flags;
long rtc_secs, alarm_delta, alarm_time;
int rc;
int rc = -EINVAL;
spin_lock_irqsave(&alarm_slock, flags);
if (!power_on_alarm) {
spin_unlock_irqrestore(&alarm_slock, flags);
if (power_on_time <= 0) {
goto disable_alarm;
}
spin_unlock_irqrestore(&alarm_slock, flags);
rtc_read_time(alarm_rtc_dev, &rtc_time);
getnstimeofday(&wall_time);
rtc_tm_to_time(&rtc_time, &rtc_secs);
alarm_delta = wall_time.tv_sec - rtc_secs;
alarm_time = power_on_alarm - alarm_delta;
alarm_time = power_on_time - alarm_delta;
/*
* Substract ALARM_DELTA from actual alarm time
@@ -558,16 +558,19 @@ static void alarm_shutdown(struct platform_device *dev)
rtc_time_to_tm(alarm_time, &alarm.time);
alarm.enabled = 1;
rc = rtc_set_alarm(alarm_rtc_dev, &alarm);
if (rc)
if (rc){
pr_alarm(ERROR, "Unable to set power-on alarm\n");
goto disable_alarm;
}
else
pr_alarm(FLOW, "Power-on alarm set to %lu\n",
alarm_time);
return;
return 0;
disable_alarm:
rtc_alarm_irq_enable(alarm_rtc_dev, 0);
return rc;
}
static struct rtc_task alarm_rtc_task = {
@@ -629,7 +632,6 @@ static struct class_interface rtc_alarm_interface = {
static struct platform_driver alarm_driver = {
.suspend = alarm_suspend,
.resume = alarm_resume,
.shutdown = alarm_shutdown,
.driver = {
.name = "alarm"
}