Commit 57a2f976 authored by Adrian Hunter's avatar Adrian Hunter Committed by Alexandre Belloni
Browse files

i3c: mipi-i3c-hci: Factor out software reset into helper



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: default avatarAdrian Hunter <adrian.hunter@intel.com>
Reviewed-by: default avatarFrank Li <Frank.Li@nxp.com>
Link: https://patch.msgid.link/20260113072702.16268-15-adrian.hunter@intel.com


Signed-off-by: default avatarAlexandre Belloni <alexandre.belloni@bootlin.com>
parent 8afa0dd8
Loading
Loading
Loading
Loading
+29 −12
Original line number Diff line number Diff line
@@ -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;