i3c: mipi-i3c-hci: Manage DMA deallocation via devres action

The driver already uses devres for resource management, but the standard
resource-managed DMA allocation helpers cannot be used because they assume
the DMA device matches the managed device.

To address this, factor out the deallocation logic from hci_dma_cleanup()
into a new helper, hci_dma_free(), and register it as a devres action.

Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
Reviewed-by: Frank Li <Frank.Li@nxp.com>
Link: https://patch.msgid.link/20260113072702.16268-8-adrian.hunter@intel.com
Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com>
This commit is contained in:
Adrian Hunter 2026-01-13 09:26:48 +02:00 committed by Alexandre Belloni
parent 11d17c2855
commit 29bf98a634

View File

@ -169,6 +169,22 @@ static void hci_dma_cleanup(struct i3c_hci *hci)
rh_reg_write(CR_SETUP, 0);
rh_reg_write(IBI_SETUP, 0);
}
rhs_reg_write(CONTROL, 0);
}
static void hci_dma_free(void *data)
{
struct i3c_hci *hci = data;
struct hci_rings_data *rings = hci->io_data;
struct hci_rh_data *rh;
if (!rings)
return;
for (int i = 0; i < rings->total; i++) {
rh = &rings->headers[i];
if (rh->xfer)
dma_free_coherent(rings->sysdev,
@ -190,8 +206,6 @@ static void hci_dma_cleanup(struct i3c_hci *hci)
kfree(rh->ibi_data);
}
rhs_reg_write(CONTROL, 0);
kfree(rings);
hci->io_data = NULL;
}
@ -359,10 +373,15 @@ static int hci_dma_init(struct i3c_hci *hci)
RING_CTRL_RUN_STOP);
}
ret = devm_add_action(hci->master.dev.parent, hci_dma_free, hci);
if (ret)
goto err_out;
return 0;
err_out:
hci_dma_cleanup(hci);
hci_dma_free(hci);
return ret;
}