Commit 29bf98a6 authored by Adrian Hunter's avatar Adrian Hunter Committed by Alexandre Belloni
Browse files

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: default avatarAdrian Hunter <adrian.hunter@intel.com>
Reviewed-by: default avatarFrank Li <Frank.Li@nxp.com>
Link: https://patch.msgid.link/20260113072702.16268-8-adrian.hunter@intel.com


Signed-off-by: default avatarAlexandre Belloni <alexandre.belloni@bootlin.com>
parent 11d17c28
Loading
Loading
Loading
Loading
+21 −2
Original line number Diff line number Diff line
@@ -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;
}