rtc alarm: disable alarm by disabling IRQ
authorFrederic Lardeau <fredericx.lardeau@intel.com>
Mon, 19 Mar 2012 13:26:57 +0000 (14:26 +0100)
committerbuildbot <buildbot@intel.com>
Sat, 24 Mar 2012 05:38:47 +0000 (22:38 -0700)
BZ: 27941

The alarm.c disabled the alarm by setting a disabled alarm in the
past. This is a bad, wrong and inappropriate solution with
the new 3.0 kernel. So, we replace it by a more usual
`rtc_alarm_irq_enable' call. This callback was missing in the RTC mrst
driver so we add it too.

Change-Id: I51a01ae4310479b6d928c7d102ea8c5ede392979
Signed-off-by: Frederic Lardeau <fredericx.lardeau@intel.com>
Reviewed-on: http://android.intel.com:8080/39574
Reviewed-by: Romieu, Benoit <benoit.romieu@intel.com>
Tested-by: Romieu, Benoit <benoit.romieu@intel.com>
Reviewed-by: Gross, Mark <mark.gross@intel.com>
Reviewed-by: Kuppuswamy, Sathyanarayanan <sathyanarayanan.kuppuswamy@intel.com>
Reviewed-by: buildbot <buildbot@intel.com>
Tested-by: buildbot <buildbot@intel.com>
drivers/rtc/alarm.c
drivers/rtc/rtc-mrst.c

index 1769050..55cc50f 100644 (file)
@@ -69,7 +69,6 @@ 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 struct rtc_wkalrm disable_alarm;
 
 static int alarm_reboot_callback(struct notifier_block *nfb,
                                 unsigned long event, void *data);
@@ -486,7 +485,7 @@ static int alarm_suspend(struct device *dev)
                        rtc_delta.tv_sec, rtc_delta.tv_nsec);
                if (rtc_current_time + 1 >= rtc_alarm_time) {
                        pr_alarm(SUSPEND, "alarm about to go off\n");
-                       err = rtc_set_alarm(alarm_rtc_dev, &disable_alarm);
+                       err = rtc_alarm_irq_enable(alarm_rtc_dev, false);
                        if (err != 0)
                                pr_alarm(ERROR,
                                   "alarm_suspend: Failed to disable alarm\n");
@@ -515,7 +514,7 @@ static int alarm_resume(struct device *dev)
 
        pr_alarm(SUSPEND, "alarm_resume(%p)\n", dev);
 
-       err = rtc_set_alarm(alarm_rtc_dev, &disable_alarm);
+       err = rtc_alarm_irq_enable(alarm_rtc_dev, false);
        if (err != 0)
                pr_alarm(ERROR, "alarm_resume: Failed to disable alarm\n");
 
@@ -624,9 +623,6 @@ static int __init alarm_late_init(void)
                        timespec_to_ktime(timespec_sub(tmp_time, system_time));
 
        spin_unlock_irqrestore(&alarm_slock, flags);
-       rtc_time_to_tm(0, &disable_alarm.time);
-       disable_alarm.enabled = 0;
-       disable_alarm.pending = 0;
 
        return 0;
 }
index 0ffc169..aed529d 100644 (file)
@@ -375,13 +375,26 @@ static int mrst_procfs(struct device *dev, struct seq_file *seq)
 #define        mrst_procfs     NULL
 #endif
 
+static int mrst_alarm_irq_enable(struct device *dev, unsigned int enabled)
+{
+       struct mrst_rtc *mrst = dev_get_drvdata(dev);
+
+       if (enabled)
+               mrst_irq_enable(mrst, RTC_AIE);
+       else
+               mrst_irq_disable(mrst, RTC_AIE);
+
+       return 0;
+}
+
 static const struct rtc_class_ops mrst_rtc_ops = {
-       .ioctl          = mrst_rtc_ioctl,
-       .read_time      = mrst_read_time,
-       .set_time       = mrst_set_time,
-       .read_alarm     = mrst_read_alarm,
-       .set_alarm      = mrst_set_alarm,
-       .proc           = mrst_procfs,
+       .ioctl            = mrst_rtc_ioctl,
+       .read_time        = mrst_read_time,
+       .set_time         = mrst_set_time,
+       .read_alarm       = mrst_read_alarm,
+       .set_alarm        = mrst_set_alarm,
+       .proc             = mrst_procfs,
+       .alarm_irq_enable = mrst_alarm_irq_enable,
 };
 
 static struct mrst_rtc mrst_rtc;