diff options
| author | Adrian Hunter <adrian.hunter@intel.com> | 2026-01-13 10:26:58 +0300 |
|---|---|---|
| committer | Alexandre Belloni <alexandre.belloni@bootlin.com> | 2026-01-14 19:21:10 +0300 |
| commit | f2b5d43c93e0a642f7bba970dbc5a24c9605ecd3 (patch) | |
| tree | 149909d13f8d210a82d6cc215840bc309defcab5 | |
| parent | 7f91e0e6aa3f1e6e461dd5f95b5bcc3567abfa51 (diff) | |
| download | linux-f2b5d43c93e0a642f7bba970dbc5a24c9605ecd3.tar.xz | |
i3c: mipi-i3c-hci: Allow core re-initialization for Runtime PM support
Prepare i3c_hci_reset_and_init() to support runtime resume. Update it to
handle the case where the I/O mode has already been selected.
Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
Reviewed-by: Frank Li <Frank.Li@nxp.com>
Link: https://patch.msgid.link/20260113072702.16268-18-adrian.hunter@intel.com
Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com>
| -rw-r--r-- | drivers/i3c/master/mipi-i3c-hci/core.c | 38 |
1 files changed, 21 insertions, 17 deletions
diff --git a/drivers/i3c/master/mipi-i3c-hci/core.c b/drivers/i3c/master/mipi-i3c-hci/core.c index 8b8e3952d41d..fc0a47a36961 100644 --- a/drivers/i3c/master/mipi-i3c-hci/core.c +++ b/drivers/i3c/master/mipi-i3c-hci/core.c @@ -681,27 +681,31 @@ static int i3c_hci_reset_and_init(struct i3c_hci *hci) } } - /* Try activating DMA operations first */ - if (hci->RHS_regs) { - ret = i3c_hci_set_io_mode(hci, true); - if (!ret) { - hci->io = &mipi_i3c_hci_dma; - dev_dbg(&hci->master.dev, "Using DMA\n"); + if (hci->io) { + ret = i3c_hci_set_io_mode(hci, hci->io == &mipi_i3c_hci_dma); + } else { + /* Try activating DMA operations first */ + if (hci->RHS_regs) { + ret = i3c_hci_set_io_mode(hci, true); + if (!ret) { + hci->io = &mipi_i3c_hci_dma; + dev_dbg(&hci->master.dev, "Using DMA\n"); + } } - } - /* If no DMA, try PIO */ - if (!hci->io && hci->PIO_regs) { - ret = i3c_hci_set_io_mode(hci, false); - if (!ret) { - hci->io = &mipi_i3c_hci_pio; - dev_dbg(&hci->master.dev, "Using PIO\n"); + /* If no DMA, try PIO */ + if (!hci->io && hci->PIO_regs) { + ret = i3c_hci_set_io_mode(hci, false); + if (!ret) { + hci->io = &mipi_i3c_hci_pio; + dev_dbg(&hci->master.dev, "Using PIO\n"); + } } - } - if (!hci->io) { - dev_err(&hci->master.dev, "neither DMA nor PIO can be used\n"); - ret = ret ?: -EINVAL; + if (!hci->io) { + dev_err(&hci->master.dev, "neither DMA nor PIO can be used\n"); + ret = ret ?: -EINVAL; + } } if (ret) return ret; |
