summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorJinyoung Park <jinyoungp@nvidia.com>2012-05-15 16:42:32 +0800
committerRohan Somvanshi <rsomvanshi@nvidia.com>2012-06-27 07:09:34 -0700
commit781ed854b9aa91ebf3180dd5c1a258969f5a556a (patch)
tree0e480fe9dc6570ced6adad672f26de658210a7bc /drivers
parent5c3fe8fe007c2cdfc4c0ebfc905af8a2ffda5677 (diff)
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 <hteng@nvidia.com> Reviewed-on: http://git-master/r/104773 (cherry picked from commit 0bd7f3163f73ba3cf87dadd6bc6fa35a538ac153) Change-Id: I7209407503b9f51dfb5b8f59d05c6fa8f04c6069 Signed-off-by: Jinyoung Park <jinyoungp@nvidia.com> Reviewed-on: http://git-master/r/110858 Reviewed-by: Automatic_Commit_Validation_User GVS: Gerrit_Virtual_Submit Reviewed-by: Bharat Nihalani <bnihalani@nvidia.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/rtc/rtc-max77663.c24
1 files 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)