]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
i3c: mipi-i3c-hci: Factor out software reset into helper
authorAdrian Hunter <adrian.hunter@intel.com>
Tue, 13 Jan 2026 07:26:55 +0000 (09:26 +0200)
committerAlexandre Belloni <alexandre.belloni@bootlin.com>
Wed, 14 Jan 2026 16:21:10 +0000 (17:21 +0100)
Prepare for future reuse of the reset sequence in other contexts, such as
power management.  Move the software reset logic from i3c_hci_init() into a
dedicated helper function, i3c_hci_software_reset().

Software reset should never fail.  Print an error message if it does.

Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
Reviewed-by: Frank Li <Frank.Li@nxp.com>
Link: https://patch.msgid.link/20260113072702.16268-15-adrian.hunter@intel.com
Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com>
drivers/i3c/master/mipi-i3c-hci/core.c

index c4b249fde76479ab05cabe8b202087c1e7447b39..3b0609cb7da7c7a5e241fcb249938c6e15fc59ae 100644 (file)
@@ -585,6 +585,34 @@ static irqreturn_t i3c_hci_irq_handler(int irq, void *dev_id)
        return result;
 }
 
+static int i3c_hci_software_reset(struct i3c_hci *hci)
+{
+       u32 regval;
+       int ret;
+
+       /*
+        * SOFT_RST must be clear before we write to it.
+        * Then we must wait until it clears again.
+        */
+       ret = readx_poll_timeout(reg_read, RESET_CONTROL, regval,
+                                !(regval & SOFT_RST), 0, 10 * USEC_PER_MSEC);
+       if (ret) {
+               dev_err(&hci->master.dev, "%s: Software reset stuck\n", __func__);
+               return ret;
+       }
+
+       reg_write(RESET_CONTROL, SOFT_RST);
+
+       ret = readx_poll_timeout(reg_read, RESET_CONTROL, regval,
+                                !(regval & SOFT_RST), 0, 10 * USEC_PER_MSEC);
+       if (ret) {
+               dev_err(&hci->master.dev, "%s: Software reset failed\n", __func__);
+               return ret;
+       }
+
+       return 0;
+}
+
 static int i3c_hci_init(struct i3c_hci *hci)
 {
        bool size_in_dwords, mode_selector;
@@ -654,18 +682,7 @@ static int i3c_hci_init(struct i3c_hci *hci)
        if (ret)
                return ret;
 
-       /*
-        * Now let's reset the hardware.
-        * SOFT_RST must be clear before we write to it.
-        * Then we must wait until it clears again.
-        */
-       ret = readx_poll_timeout(reg_read, RESET_CONTROL, regval,
-                                !(regval & SOFT_RST), 1, 10000);
-       if (ret)
-               return -ENXIO;
-       reg_write(RESET_CONTROL, SOFT_RST);
-       ret = readx_poll_timeout(reg_read, RESET_CONTROL, regval,
-                                !(regval & SOFT_RST), 1, 10000);
+       ret = i3c_hci_software_reset(hci);
        if (ret)
                return -ENXIO;