forked from rubenslte/android_kernel_samsung_msm8226
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:
committed by
Gerrit - the friendly Code Review server
parent
4f891d2b1b
commit
eeb31ff78d
@@ -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
@@ -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"
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user