[PATCH 12/17] i3c: mipi-i3c-hci: Refactor PIO register initialization

Frank Li Frank.li at nxp.com
Fri Dec 19 08:46:10 PST 2025


On Fri, Dec 19, 2025 at 04:45:29PM +0200, Adrian Hunter wrote:
> 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 at intel.com>
> ---

Reviewed-by: Frank Li <Frank.Li at nxp.com>

>  drivers/i3c/master/mipi-i3c-hci/pio.c | 45 +++++++++++++++++----------
>  1 file changed, 28 insertions(+), 17 deletions(-)
>
> diff --git a/drivers/i3c/master/mipi-i3c-hci/pio.c b/drivers/i3c/master/mipi-i3c-hci/pio.c
> index 3d633abf6099..52d9f01d9ca9 100644
> --- a/drivers/i3c/master/mipi-i3c-hci/pio.c
> +++ b/drivers/i3c/master/mipi-i3c-hci/pio.c
> @@ -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;
>  }
> --
> 2.51.0
>
>
> --
> linux-i3c mailing list
> linux-i3c at lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/linux-i3c



More information about the linux-i3c mailing list