| From d6e6f2057d9de150de11b8b3c555633db0578e20 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Tue, 4 Jun 2019 12:23:36 +0800 |
| Subject: rtc: pcf8563: Clear event flags and disable interrupts before |
| requesting irq |
| |
| From: Chen-Yu Tsai <wens@csie.org> |
| |
| [ Upstream commit 3572e8aea3bf925dac1dbf86127657c39fe5c254 ] |
| |
| Besides the alarm, the PCF8563 also has a timer triggered interrupt. |
| In cases where the previous system left the timer and interrupts on, |
| or somehow the bits got enabled, the interrupt would keep triggering |
| as the kernel doesn't know about it. |
| |
| Clear both the alarm and timer event flags, and disable the interrupts, |
| before requesting the interrupt line. |
| |
| Fixes: ede3e9d47cca ("drivers/rtc/rtc-pcf8563.c: add alarm support") |
| Fixes: a45d528aab8b ("rtc: pcf8563: clear expired alarm at boot time") |
| Signed-off-by: Chen-Yu Tsai <wens@csie.org> |
| Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/rtc/rtc-pcf8563.c | 11 +++++------ |
| 1 file changed, 5 insertions(+), 6 deletions(-) |
| |
| diff --git a/drivers/rtc/rtc-pcf8563.c b/drivers/rtc/rtc-pcf8563.c |
| index a4b8b603c807d..533fb7027f0cc 100644 |
| --- a/drivers/rtc/rtc-pcf8563.c |
| +++ b/drivers/rtc/rtc-pcf8563.c |
| @@ -563,7 +563,6 @@ static int pcf8563_probe(struct i2c_client *client, |
| struct pcf8563 *pcf8563; |
| int err; |
| unsigned char buf; |
| - unsigned char alm_pending; |
| |
| dev_dbg(&client->dev, "%s\n", __func__); |
| |
| @@ -587,13 +586,13 @@ static int pcf8563_probe(struct i2c_client *client, |
| return err; |
| } |
| |
| - err = pcf8563_get_alarm_mode(client, NULL, &alm_pending); |
| - if (err) { |
| - dev_err(&client->dev, "%s: read error\n", __func__); |
| + /* Clear flags and disable interrupts */ |
| + buf = 0; |
| + err = pcf8563_write_block_data(client, PCF8563_REG_ST2, 1, &buf); |
| + if (err < 0) { |
| + dev_err(&client->dev, "%s: write error\n", __func__); |
| return err; |
| } |
| - if (alm_pending) |
| - pcf8563_set_alarm_mode(client, 0); |
| |
| pcf8563->rtc = devm_rtc_device_register(&client->dev, |
| pcf8563_driver.driver.name, |
| -- |
| 2.20.1 |
| |