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" }