drivers: rtc-pm8xxx: Fix automatic wakeup of APPS due to RTC alarm.

Alarm interrupt causes automatic wakeup even when the phone is in
powerdown state.

Change-Id: If3ae30304adba4f07284a3dc496956d67a1ae1b0
Signed-off-by: Ashay Jaiswal <ashayj@codeaurora.org>
This commit is contained in:
Ashay Jaiswal
2011-10-13 17:41:40 +05:30
parent 58522b6c82
commit d66c9d51b2
3 changed files with 51 additions and 0 deletions

View File

@@ -3755,6 +3755,7 @@ static struct pm8xxx_mpp_platform_data pm8xxx_mpp_pdata __devinitdata = {
static struct pm8xxx_rtc_platform_data pm8xxx_rtc_pdata __devinitdata = {
.rtc_write_enable = false,
.rtc_alarm_powerup = false,
};
static struct pm8xxx_pwrkey_platform_data pm8xxx_pwrkey_pdata = {

View File

@@ -30,6 +30,8 @@
/* RTC_CTRL register bit fields */
#define PM8xxx_RTC_ENABLE BIT(7)
#define PM8xxx_RTC_ALARM_ENABLE BIT(1)
#define PM8xxx_RTC_ABORT_ENABLE BIT(0)
#define PM8xxx_RTC_ALARM_CLEAR BIT(0)
#define NUM_8_BIT_RTC_REGS 0x4
@@ -461,6 +463,14 @@ static int __devinit pm8xxx_rtc_probe(struct platform_device *pdev)
}
}
/* Enable abort enable feature */
ctrl_reg |= PM8xxx_RTC_ABORT_ENABLE;
rc = pm8xxx_write_wrapper(rtc_dd, &ctrl_reg, rtc_dd->rtc_base, 1);
if (rc < 0) {
dev_err(&pdev->dev, "PM8xxx write failed!\n");
goto fail_rtc_enable;
}
rtc_dd->ctrl_reg = ctrl_reg;
if (rtc_write_enable == true)
pm8xxx_rtc_ops.set_time = pm8xxx_rtc_set_time;
@@ -539,9 +549,48 @@ static int __devexit pm8xxx_rtc_remove(struct platform_device *pdev)
return 0;
}
static void pm8xxx_rtc_shutdown(struct platform_device *pdev)
{
u8 value[4] = {0, 0, 0, 0};
u8 reg;
int rc;
unsigned long irq_flags;
bool rtc_alarm_powerup = false;
struct pm8xxx_rtc *rtc_dd = platform_get_drvdata(pdev);
struct pm8xxx_rtc_platform_data *pdata = pdev->dev.platform_data;
if (pdata != NULL)
rtc_alarm_powerup = pdata->rtc_alarm_powerup;
if (!rtc_alarm_powerup) {
spin_lock_irqsave(&rtc_dd->ctrl_reg_lock, irq_flags);
dev_dbg(&pdev->dev, "Disabling alarm interrupts\n");
/* Disable RTC alarms */
reg = rtc_dd->ctrl_reg;
reg &= ~PM8xxx_RTC_ALARM_ENABLE;
rc = pm8xxx_write_wrapper(rtc_dd, &reg, rtc_dd->rtc_base, 1);
if (rc < 0) {
dev_err(rtc_dd->rtc_dev, "PM8xxx write failed\n");
goto fail_alarm_disable;
}
/* Clear Alarm register */
rc = pm8xxx_write_wrapper(rtc_dd, value,
rtc_dd->alarm_rw_base, NUM_8_BIT_RTC_REGS);
if (rc < 0)
dev_err(rtc_dd->rtc_dev, "PM8xxx write failed\n");
fail_alarm_disable:
spin_unlock_irqrestore(&rtc_dd->ctrl_reg_lock, irq_flags);
}
}
static struct platform_driver pm8xxx_rtc_driver = {
.probe = pm8xxx_rtc_probe,
.remove = __devexit_p(pm8xxx_rtc_remove),
.shutdown = pm8xxx_rtc_shutdown,
.driver = {
.name = PM8XXX_RTC_DEV_NAME,
.owner = THIS_MODULE,

View File

@@ -20,6 +20,7 @@
*/
struct pm8xxx_rtc_platform_data {
bool rtc_write_enable;
bool rtc_alarm_powerup;
};
#endif /* __RTC_PM8XXX_H__ */