aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/bcm27xx/patches-5.15/950-0529-rtc-pcf85063-Always-clear-EXT_TEST-from-set_time.patch
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/bcm27xx/patches-5.15/950-0529-rtc-pcf85063-Always-clear-EXT_TEST-from-set_time.patch')
-rw-r--r--target/linux/bcm27xx/patches-5.15/950-0529-rtc-pcf85063-Always-clear-EXT_TEST-from-set_time.patch36
1 files changed, 36 insertions, 0 deletions
diff --git a/target/linux/bcm27xx/patches-5.15/950-0529-rtc-pcf85063-Always-clear-EXT_TEST-from-set_time.patch b/target/linux/bcm27xx/patches-5.15/950-0529-rtc-pcf85063-Always-clear-EXT_TEST-from-set_time.patch
new file mode 100644
index 0000000000..e8a6b41821
--- /dev/null
+++ b/target/linux/bcm27xx/patches-5.15/950-0529-rtc-pcf85063-Always-clear-EXT_TEST-from-set_time.patch
@@ -0,0 +1,36 @@
+From c3cfd27eb16d2fc12cfa77e6cd5f9eb352403c16 Mon Sep 17 00:00:00 2001
+From: Phil Elwell <phil@raspberrypi.com>
+Date: Fri, 15 Oct 2021 11:45:36 +0100
+Subject: [PATCH] rtc: pcf85063: Always clear EXT_TEST from set_time
+
+Power-on reset after the insertion of a battery does not always complete
+successfully, leading to corrupted register content. The EXT_TEST bit
+will stop the clock from running, but currently the driver will never
+recover.
+
+Safely handle the erroneous state by clearing EXT_TEST as part of the
+usual set_time method.
+
+Signed-off-by: Phil Elwell <phil@raspberrypi.com>
+---
+ drivers/rtc/rtc-pcf85063.c | 2 ++
+ 1 file changed, 2 insertions(+)
+
+--- a/drivers/rtc/rtc-pcf85063.c
++++ b/drivers/rtc/rtc-pcf85063.c
+@@ -34,6 +34,7 @@
+ #define PCF85063_REG_CTRL1 0x00 /* status */
+ #define PCF85063_REG_CTRL1_CAP_SEL BIT(0)
+ #define PCF85063_REG_CTRL1_STOP BIT(5)
++#define PCF85063_REG_CTRL1_EXT_TEST BIT(7)
+
+ #define PCF85063_REG_CTRL2 0x01
+ #define PCF85063_CTRL2_AF BIT(6)
+@@ -117,6 +118,7 @@ static int pcf85063_rtc_set_time(struct
+ * reset state until all time/date registers are written
+ */
+ rc = regmap_update_bits(pcf85063->regmap, PCF85063_REG_CTRL1,
++ PCF85063_REG_CTRL1_EXT_TEST |
+ PCF85063_REG_CTRL1_STOP,
+ PCF85063_REG_CTRL1_STOP);
+ if (rc)