mirror of
https://github.com/torvalds/linux.git
synced 2026-04-18 06:44:00 -04:00
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: 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>
This commit is contained in:
committed by
Alexandre Belloni
parent
8afa0dd83b
commit
57a2f976ac
@@ -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;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user