From f2b5d43c93e0a642f7bba970dbc5a24c9605ecd3 Mon Sep 17 00:00:00 2001 From: Adrian Hunter Date: Tue, 13 Jan 2026 09:26:58 +0200 Subject: [PATCH] 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 Reviewed-by: Frank Li Link: https://patch.msgid.link/20260113072702.16268-18-adrian.hunter@intel.com Signed-off-by: Alexandre Belloni --- drivers/i3c/master/mipi-i3c-hci/core.c | 38 ++++++++++++++------------ 1 file 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 8b8e3952d41d1..fc0a47a369610 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; -- 2.47.3