]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
rtc: pcf2127: clear minute/second interrupt
authorJosua Mayer <josua@solid-run.com>
Mon, 25 Aug 2025 17:54:09 +0000 (19:54 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 13 Nov 2025 20:34:33 +0000 (15:34 -0500)
[ Upstream commit a6f1a4f05970664004a9370459c6799c1b2f2dcf ]

PCF2127 can generate interrupt every full second or minute configured
from control and status register 1, bits MI (1) and SI (0).

On interrupt control register 2 bit MSF (7) is set and must be cleared
to continue normal operation.

While the driver never enables this interrupt on its own, users or
firmware may do so - e.g. as an easy way to test the interrupt.

Add preprocessor definition for MSF bit and include it in the irq
bitmask to ensure minute and second interrupts are cleared when fired.

This fixes an issue where the rtc enters a test mode and becomes
unresponsive after a second interrupt has fired and is not cleared in
time. In this state register writes to control registers have no
effect and the interrupt line is kept asserted [1]:

[1] userspace commands to put rtc into unresponsive state:
$ i2cget -f -y 2 0x51 0x00
0x04
$ i2cset -f -y 2 0x51 0x00 0x05 # set bit 0 SI
$ i2cget -f -y 2 0x51 0x00
0x84 # bit 8 EXT_TEST set
$ i2cset -f -y 2 0x51 0x00 0x05 # try overwrite control register
$ i2cget -f -y 2 0x51 0x00
0x84 # no change

Signed-off-by: Josua Mayer <josua@solid-run.com>
Reviewed-by: Bruno Thomsen <bruno.thomsen@gmail.com>
Link: https://lore.kernel.org/r/20250825-rtc-irq-v1-1-0133319406a7@solid-run.com
Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/rtc/rtc-pcf2127.c

index 502571f0c203fa89d7aeacc46e55f23b306a271c..e793c019fb9d7c43538ccba44649db162da4b67b 100644 (file)
@@ -41,6 +41,7 @@
 #define PCF2127_BIT_CTRL2_AF                   BIT(4)
 #define PCF2127_BIT_CTRL2_TSF2                 BIT(5)
 #define PCF2127_BIT_CTRL2_WDTF                 BIT(6)
+#define PCF2127_BIT_CTRL2_MSF                  BIT(7)
 /* Control register 3 */
 #define PCF2127_REG_CTRL3              0x02
 #define PCF2127_BIT_CTRL3_BLIE                 BIT(0)
@@ -94,7 +95,8 @@
 #define PCF2127_CTRL2_IRQ_MASK ( \
                PCF2127_BIT_CTRL2_AF | \
                PCF2127_BIT_CTRL2_WDTF | \
-               PCF2127_BIT_CTRL2_TSF2)
+               PCF2127_BIT_CTRL2_TSF2 | \
+               PCF2127_BIT_CTRL2_MSF)
 
 #define PCF2127_MAX_TS_SUPPORTED       4