]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
i3c: mipi-i3c-hci: Refactor PIO register initialization
authorAdrian Hunter <adrian.hunter@intel.com>
Tue, 13 Jan 2026 07:26:53 +0000 (09:26 +0200)
committerAlexandre Belloni <alexandre.belloni@bootlin.com>
Wed, 14 Jan 2026 16:21:10 +0000 (17:21 +0100)
Move the PIO register setup logic out of hci_pio_init() into a new
helper, __hci_pio_init().  This refactoring prepares for Runtime PM
support by allowing PIO registers to be reinitialized independently
after resume.

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

index 3d633abf60994189dcb69ab6cc84712562340202..52d9f01d9ca9c24e713e713dd32a0898cf59a260 100644 (file)
@@ -135,27 +135,14 @@ struct hci_pio_data {
        u32 enabled_irqs;
 };
 
-static int hci_pio_init(struct i3c_hci *hci)
+static void __hci_pio_init(struct i3c_hci *hci, u32 *size_val_ptr)
 {
-       struct hci_pio_data *pio;
        u32 val, size_val, rx_thresh, tx_thresh, ibi_val;
-
-       pio = devm_kzalloc(hci->master.dev.parent, sizeof(*pio), GFP_KERNEL);
-       if (!pio)
-               return -ENOMEM;
-
-       hci->io_data = pio;
-       spin_lock_init(&pio->lock);
+       struct hci_pio_data *pio = hci->io_data;
 
        size_val = pio_reg_read(QUEUE_SIZE);
-       dev_dbg(&hci->master.dev, "CMD/RESP FIFO = %ld entries\n",
-               FIELD_GET(CR_QUEUE_SIZE, size_val));
-       dev_dbg(&hci->master.dev, "IBI FIFO = %ld bytes\n",
-               4 * FIELD_GET(IBI_STATUS_SIZE, size_val));
-       dev_dbg(&hci->master.dev, "RX data FIFO = %d bytes\n",
-               4 * (2 << FIELD_GET(RX_DATA_BUFFER_SIZE, size_val)));
-       dev_dbg(&hci->master.dev, "TX data FIFO = %d bytes\n",
-               4 * (2 << FIELD_GET(TX_DATA_BUFFER_SIZE, size_val)));
+       if (size_val_ptr)
+               *size_val_ptr = size_val;
 
        /*
         * Let's initialize data thresholds to half of the actual FIFO size.
@@ -201,6 +188,30 @@ static int hci_pio_init(struct i3c_hci *hci)
 
        /* Always accept error interrupts (will be activated on first xfer) */
        pio->enabled_irqs = STAT_ALL_ERRORS;
+}
+
+static int hci_pio_init(struct i3c_hci *hci)
+{
+       struct hci_pio_data *pio;
+       u32 size_val;
+
+       pio = devm_kzalloc(hci->master.dev.parent, sizeof(*pio), GFP_KERNEL);
+       if (!pio)
+               return -ENOMEM;
+
+       hci->io_data = pio;
+       spin_lock_init(&pio->lock);
+
+       __hci_pio_init(hci, &size_val);
+
+       dev_dbg(&hci->master.dev, "CMD/RESP FIFO = %ld entries\n",
+               FIELD_GET(CR_QUEUE_SIZE, size_val));
+       dev_dbg(&hci->master.dev, "IBI FIFO = %ld bytes\n",
+               4 * FIELD_GET(IBI_STATUS_SIZE, size_val));
+       dev_dbg(&hci->master.dev, "RX data FIFO = %d bytes\n",
+               4 * (2 << FIELD_GET(RX_DATA_BUFFER_SIZE, size_val)));
+       dev_dbg(&hci->master.dev, "TX data FIFO = %d bytes\n",
+               4 * (2 << FIELD_GET(TX_DATA_BUFFER_SIZE, size_val)));
 
        return 0;
 }