From 781ed854b9aa91ebf3180dd5c1a258969f5a556a Mon Sep 17 00:00:00 2001 From: Jinyoung Park Date: Tue, 15 May 2012 16:42:32 +0800 Subject: rtc: max77663: avoid powering on system by RTC alarm. Clean RTC alarm and don't set new alarm during shutdown process. After powering off, we do not want Maxim PMIC automaticly boots caused by RTC alarm. Bug 985193 Signed-off-by: Haley Teng Reviewed-on: http://git-master/r/104773 (cherry picked from commit 0bd7f3163f73ba3cf87dadd6bc6fa35a538ac153) Change-Id: I7209407503b9f51dfb5b8f59d05c6fa8f04c6069 Signed-off-by: Jinyoung Park Reviewed-on: http://git-master/r/110858 Reviewed-by: Automatic_Commit_Validation_User GVS: Gerrit_Virtual_Submit Reviewed-by: Bharat Nihalani --- drivers/rtc/rtc-max77663.c | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/drivers/rtc/rtc-max77663.c b/drivers/rtc/rtc-max77663.c index 874a2df86dc1..13d8062e1def 100644 --- a/drivers/rtc/rtc-max77663.c +++ b/drivers/rtc/rtc-max77663.c @@ -2,8 +2,8 @@ * drivers/rtc/rtc-max77663.c * Max77663 RTC driver * - * Copyright 2011 Maxim Integrated Products, Inc. - * Copyright (C) 2011 NVIDIA Corporation + * Copyright 2011-2012, Maxim Integrated Products, Inc. + * Copyright (c) 2011-2012, NVIDIA CORPORATION. All rights reserved. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as @@ -97,6 +97,7 @@ struct max77663_rtc { struct mutex io_lock; int irq; u8 irq_mask; + bool shutdown_ongoing; }; static inline struct device *_to_parent(struct max77663_rtc *rtc) @@ -443,6 +444,11 @@ static int max77663_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alrm) u8 buf[RTC_NR]; int ret; + if (rtc->shutdown_ongoing) { + dev_warn(rtc->dev, "rtc_set_alarm: " + "Device shutdown on-going, skip alarm setting.\n"); + return -ESHUTDOWN; + } dev_dbg(rtc->dev, "rtc_set_alarm: " "tm: %d-%02d-%02d %02d:%02d:%02d, wday=%d [%s]\n", alrm->time.tm_year, alrm->time.tm_mon, alrm->time.tm_mday, @@ -534,7 +540,7 @@ static int max77663_rtc_probe(struct platform_device *pdev) dev_err(&pdev->dev, "probe: kzalloc() failed\n"); return -ENOMEM; } - + rtc->shutdown_ongoing = false; dev_set_drvdata(&pdev->dev, rtc); rtc->dev = &pdev->dev; mutex_init(&rtc->io_lock); @@ -591,6 +597,17 @@ static int __devexit max77663_rtc_remove(struct platform_device *pdev) return 0; } +static void max77663_rtc_shutdown(struct platform_device *pdev) +{ + struct max77663_rtc *rtc = dev_get_drvdata(&pdev->dev); + u8 buf[RTC_NR] = { 0x0, 0x0, 0x0, 0x1, 0x1, 0x0, 0x1 }; + + rtc->shutdown_ongoing = true; + dev_info(rtc->dev, "rtc_shutdown: clean alarm\n"); + max77663_rtc_write(rtc, MAX77663_RTC_ALARM_SEC1, buf, sizeof(buf), 1); + max77663_rtc_alarm_irq_enable(&pdev->dev, 0); +} + static struct platform_driver max77663_rtc_driver = { .probe = max77663_rtc_probe, .remove = __devexit_p(max77663_rtc_remove), @@ -598,6 +615,7 @@ static struct platform_driver max77663_rtc_driver = { .name = "max77663-rtc", .owner = THIS_MODULE, }, + .shutdown = max77663_rtc_shutdown, }; static int __init max77663_rtc_init(void) -- cgit v1.2.3