From f86b8aa7d82d96e2f1704bd5264f6c3f24ef6f08 Mon Sep 17 00:00:00 2001 From: =?utf8?q?=E9=BB=84=E6=B6=9B?= Date: Tue, 26 Apr 2011 20:49:01 +0800 Subject: [PATCH] alarm: port from 2818, fix shutdown bug try to fix this bug: Unable to handle kernel paging request at virtual address 0fff1004 pgd = ce794000 [0fff1004] *pgd=00000000 Internal error: Oops: 5 [#1] PREEMPT last sysfs file: /sys/power/wake_lock Modules linked in: CPU: 0 Not tainted (2.6.32.27 #1) PC is at rb_erase+0xf4/0x344 LR is at __remove_hrtimer+0xa4/0xb0 pc : [] lr : [] psr: 20000193 sp : ccc1dda8 ip : c0876af8 fp : 00000000 r10: 00000000 r9 : ccc1c000 r8 : c04290c4 r7 : 00000001 r6 : 00000000 r5 : c0876b00 r4 : 0fff0ffc r3 : 00000000 r2 : 00000000 r1 : 00000001 r0 : c124fae8 Flags: nzCv IRQs off FIQs on Mode SVC_32 ISA ARM Segment user Control: 10c5387d Table: 6e794019 DAC: 00000015 [] (rb_erase+0xf4/0x344) from [] (__remove_hrtimer+0xa4/0xb0) [] (__remove_hrtimer+0xa4/0xb0) from [] (hrtimer_try_to_cancel+0x64/0xac) [] (hrtimer_try_to_cancel+0x64/0xac) from [] (hrtimer_cancel+0x10/0x20) [] (hrtimer_cancel+0x10/0x20) from [] (alarm_shutdown+0x7c/0x270) [] (alarm_shutdown+0x7c/0x270) from [] (platform_drv_shutdown+0x18/0x1c) [] (platform_drv_shutdown+0x18/0x1c) from [] (device_shutdown+0x58/0xa0) [] (device_shutdown+0x58/0xa0) from [] (kernel_power_off+0xc/0x3c) [] (kernel_power_off+0xc/0x3c) from [] (sys_reboot+0x14c/0x22c) [] (sys_reboot+0x14c/0x22c) from [] (ret_fast_syscall+0x0/0x2c) --- drivers/rtc/alarm.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/drivers/rtc/alarm.c b/drivers/rtc/alarm.c index 7232a538d399..a6c07075a709 100644 --- a/drivers/rtc/alarm.c +++ b/drivers/rtc/alarm.c @@ -419,6 +419,7 @@ static int alarm_suspend(struct platform_device *pdev, pm_message_t state) if (rtc_current_time + 1 >= rtc_alarm_time) { pr_alarm(SUSPEND, "alarm about to go off\n"); memset(&rtc_alarm, 0, sizeof(rtc_alarm)); + rtc_time_to_tm(0, &rtc_alarm.time); rtc_alarm.enabled = 0; rtc_set_alarm(alarm_rtc_dev, &rtc_alarm); @@ -444,6 +445,7 @@ static int alarm_resume(struct platform_device *pdev) pr_alarm(SUSPEND, "alarm_resume(%p)\n", pdev); memset(&alarm, 0, sizeof(alarm)); + rtc_time_to_tm(0, &alarm.time); alarm.enabled = 0; rtc_set_alarm(alarm_rtc_dev, &alarm); @@ -457,6 +459,18 @@ static int alarm_resume(struct platform_device *pdev) return 0; } +static void alarm_shutdown(struct platform_device *pdev) +{ + struct rtc_wkalrm alarm; + + pr_alarm(FLOW, "alarm_shutdown(%p)\n", pdev); + + memset(&alarm, 0, sizeof(alarm)); + rtc_time_to_tm(0, &alarm.time); + alarm.enabled = 0; + rtc_set_alarm(alarm_rtc_dev, &alarm); +} + static struct rtc_task alarm_rtc_task = { .func = alarm_triggered_func }; @@ -516,6 +530,7 @@ 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" } -- 2.34.1