Commit 1c2db8f0 authored by Chen-Yu Tsai's avatar Chen-Yu Tsai Committed by Kleber Sacilotto de Souza

rtc: pcf8563: Clear event flags and disable interrupts before requesting irq

BugLink: https://bugs.launchpad.net/bugs/1864773

[ Upstream commit 3572e8ae ]

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: ede3e9d4 ("drivers/rtc/rtc-pcf8563.c: add alarm support")
Fixes: a45d528a ("rtc: pcf8563: clear expired alarm at boot time")
Signed-off-by: default avatarChen-Yu Tsai <wens@csie.org>
Signed-off-by: default avatarAlexandre Belloni <alexandre.belloni@bootlin.com>
Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
Signed-off-by: default avatarKhalid Elmously <khalid.elmously@canonical.com>
Signed-off-by: default avatarKleber Sacilotto de Souza <kleber.souza@canonical.com>
parent 15c04159
...@@ -568,7 +568,6 @@ static int pcf8563_probe(struct i2c_client *client, ...@@ -568,7 +568,6 @@ static int pcf8563_probe(struct i2c_client *client,
struct pcf8563 *pcf8563; struct pcf8563 *pcf8563;
int err; int err;
unsigned char buf; unsigned char buf;
unsigned char alm_pending;
dev_dbg(&client->dev, "%s\n", __func__); dev_dbg(&client->dev, "%s\n", __func__);
...@@ -594,13 +593,13 @@ static int pcf8563_probe(struct i2c_client *client, ...@@ -594,13 +593,13 @@ static int pcf8563_probe(struct i2c_client *client,
return err; return err;
} }
err = pcf8563_get_alarm_mode(client, NULL, &alm_pending); /* Clear flags and disable interrupts */
if (err) { buf = 0;
dev_err(&client->dev, "%s: read error\n", __func__); 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; return err;
} }
if (alm_pending)
pcf8563_set_alarm_mode(client, 0);
pcf8563->rtc = devm_rtc_device_register(&client->dev, pcf8563->rtc = devm_rtc_device_register(&client->dev,
pcf8563_driver.driver.name, pcf8563_driver.driver.name,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment