mirror of
https://github.com/torvalds/linux.git
synced 2026-05-27 00:22:00 +02:00
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:
parent
11d17c2855
commit
29bf98a634
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user