]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
rtc: pcf85063: do a SW reset if POR failed
authorLukas Stockmann <lukas.stockmann@siemens.com>
Mon, 20 Jan 2025 09:34:49 +0000 (10:34 +0100)
committerAlexandre Belloni <alexandre.belloni@bootlin.com>
Tue, 1 Apr 2025 09:28:48 +0000 (11:28 +0200)
Power-on Reset has a documented issue in PCF85063, refer to its datasheet,
section "Software reset":

"There is a low probability that some devices will have corruption of the
registers after the automatic power-on reset if the device is powered up
with a residual VDD level. It is required that the VDD starts at zero volts
at power up or upon power cycling to ensure that there is no corruption of
the registers. If this is not possible, a reset must be initiated after
power-up (i.e. when power is stable) with the software reset command"

Trigger SW reset if there is an indication that POR has failed.

Link: https://www.nxp.com/docs/en/data-sheet/PCF85063A.pdf
Signed-off-by: Lukas Stockmann <lukas.stockmann@siemens.com>
Signed-off-by: Alexander Sverdlin <alexander.sverdlin@siemens.com>
Link: https://lore.kernel.org/r/20250120093451.30778-1-alexander.sverdlin@siemens.com
Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com>
drivers/rtc/rtc-pcf85063.c

index 905986c616559b87826d1102dbc25614f7dcbcbb..73848f764559b492bf60b72676d7c4c3f0aef6df 100644 (file)
@@ -35,6 +35,7 @@
 #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_CTRL1_SWR         0x58
 
 #define PCF85063_REG_CTRL2             0x01
 #define PCF85063_CTRL2_AF              BIT(6)
@@ -589,7 +590,7 @@ static int pcf85063_probe(struct i2c_client *client)
 
        i2c_set_clientdata(client, pcf85063);
 
-       err = regmap_read(pcf85063->regmap, PCF85063_REG_CTRL1, &tmp);
+       err = regmap_read(pcf85063->regmap, PCF85063_REG_SC, &tmp);
        if (err) {
                dev_err(&client->dev, "RTC chip is not present\n");
                return err;
@@ -599,6 +600,22 @@ static int pcf85063_probe(struct i2c_client *client)
        if (IS_ERR(pcf85063->rtc))
                return PTR_ERR(pcf85063->rtc);
 
+       /*
+        * If a Power loss is detected, SW reset the device.
+        * From PCF85063A datasheet:
+        * There is a low probability that some devices will have corruption
+        * of the registers after the automatic power-on reset...
+        */
+       if (tmp & PCF85063_REG_SC_OS) {
+               dev_warn(&client->dev,
+                        "POR issue detected, sending a SW reset\n");
+               err = regmap_write(pcf85063->regmap, PCF85063_REG_CTRL1,
+                                  PCF85063_REG_CTRL1_SWR);
+               if (err < 0)
+                       dev_warn(&client->dev,
+                                "SW reset failed, trying to continue\n");
+       }
+
        err = pcf85063_load_capacitance(pcf85063, client->dev.of_node,
                                        config->force_cap_7000 ? 7000 : 0);
        if (err < 0)