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:
@@ -3755,6 +3755,7 @@ static struct pm8xxx_mpp_platform_data pm8xxx_mpp_pdata __devinitdata = {
|
|||||||
|
|
||||||
static struct pm8xxx_rtc_platform_data pm8xxx_rtc_pdata __devinitdata = {
|
static struct pm8xxx_rtc_platform_data pm8xxx_rtc_pdata __devinitdata = {
|
||||||
.rtc_write_enable = false,
|
.rtc_write_enable = false,
|
||||||
|
.rtc_alarm_powerup = false,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct pm8xxx_pwrkey_platform_data pm8xxx_pwrkey_pdata = {
|
static struct pm8xxx_pwrkey_platform_data pm8xxx_pwrkey_pdata = {
|
||||||
|
|||||||
@@ -30,6 +30,8 @@
|
|||||||
/* RTC_CTRL register bit fields */
|
/* RTC_CTRL register bit fields */
|
||||||
#define PM8xxx_RTC_ENABLE BIT(7)
|
#define PM8xxx_RTC_ENABLE BIT(7)
|
||||||
#define PM8xxx_RTC_ALARM_ENABLE BIT(1)
|
#define PM8xxx_RTC_ALARM_ENABLE BIT(1)
|
||||||
|
#define PM8xxx_RTC_ABORT_ENABLE BIT(0)
|
||||||
|
|
||||||
#define PM8xxx_RTC_ALARM_CLEAR BIT(0)
|
#define PM8xxx_RTC_ALARM_CLEAR BIT(0)
|
||||||
|
|
||||||
#define NUM_8_BIT_RTC_REGS 0x4
|
#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;
|
rtc_dd->ctrl_reg = ctrl_reg;
|
||||||
if (rtc_write_enable == true)
|
if (rtc_write_enable == true)
|
||||||
pm8xxx_rtc_ops.set_time = pm8xxx_rtc_set_time;
|
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;
|
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, ®, 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 = {
|
static struct platform_driver pm8xxx_rtc_driver = {
|
||||||
.probe = pm8xxx_rtc_probe,
|
.probe = pm8xxx_rtc_probe,
|
||||||
.remove = __devexit_p(pm8xxx_rtc_remove),
|
.remove = __devexit_p(pm8xxx_rtc_remove),
|
||||||
|
.shutdown = pm8xxx_rtc_shutdown,
|
||||||
.driver = {
|
.driver = {
|
||||||
.name = PM8XXX_RTC_DEV_NAME,
|
.name = PM8XXX_RTC_DEV_NAME,
|
||||||
.owner = THIS_MODULE,
|
.owner = THIS_MODULE,
|
||||||
|
|||||||
@@ -20,6 +20,7 @@
|
|||||||
*/
|
*/
|
||||||
struct pm8xxx_rtc_platform_data {
|
struct pm8xxx_rtc_platform_data {
|
||||||
bool rtc_write_enable;
|
bool rtc_write_enable;
|
||||||
|
bool rtc_alarm_powerup;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* __RTC_PM8XXX_H__ */
|
#endif /* __RTC_PM8XXX_H__ */
|
||||||
|
|||||||
Reference in New Issue
Block a user