diff options
| author | Adrian Hunter <adrian.hunter@intel.com> | 2025-11-28 08:40:36 +0200 |
|---|---|---|
| committer | Alexandre Belloni <alexandre.belloni@bootlin.com> | 2025-11-29 00:06:40 +0100 |
| commit | 040dcd762d60ddc5307e5a9f0cf5d269a0af0814 (patch) | |
| tree | 6fc05cc92ea9d42e0dc11549a348ac09d1ae9619 | |
| parent | 0f9ef14b3fb853815aa88f264f7924e1e0ee80c7 (diff) | |
i3c: mipi-i3c-hci-pci: Add exit callback
Prepare to add device-specific features that require cleanup
upon driver removal. Add ->exit() callback as a counterpart to ->init().
Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
Reviewed-by: Frank Li <Frank.Li@nxp.com>
Link: https://patch.msgid.link/20251128064038.55158-11-adrian.hunter@intel.com
Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com>
| -rw-r--r-- | drivers/i3c/master/mipi-i3c-hci/mipi-i3c-hci-pci.c | 17 |
1 files changed, 12 insertions, 5 deletions
diff --git a/drivers/i3c/master/mipi-i3c-hci/mipi-i3c-hci-pci.c b/drivers/i3c/master/mipi-i3c-hci/mipi-i3c-hci-pci.c index 7bfb9fe337b6..7a91efbd3e54 100644 --- a/drivers/i3c/master/mipi-i3c-hci/mipi-i3c-hci-pci.c +++ b/drivers/i3c/master/mipi-i3c-hci/mipi-i3c-hci-pci.c @@ -17,10 +17,12 @@ struct mipi_i3c_hci_pci { struct pci_dev *pci; struct platform_device *pdev; + const struct mipi_i3c_hci_pci_info *info; }; struct mipi_i3c_hci_pci_info { int (*init)(struct mipi_i3c_hci_pci *hci); + void (*exit)(struct mipi_i3c_hci_pci *hci); }; static DEFINE_IDA(mipi_i3c_hci_pci_ida); @@ -72,7 +74,6 @@ static const struct mipi_i3c_hci_pci_info intel_info = { static int mipi_i3c_hci_pci_probe(struct pci_dev *pci, const struct pci_device_id *id) { - const struct mipi_i3c_hci_pci_info *info; struct mipi_i3c_hci_pci *hci; struct resource res[2]; int dev_id, ret; @@ -114,21 +115,24 @@ static int mipi_i3c_hci_pci_probe(struct pci_dev *pci, if (ret) goto err; - info = (const struct mipi_i3c_hci_pci_info *)id->driver_data; - if (info && info->init) { - ret = info->init(hci); + hci->info = (const struct mipi_i3c_hci_pci_info *)id->driver_data; + if (hci->info && hci->info->init) { + ret = hci->info->init(hci); if (ret) goto err; } ret = platform_device_add(hci->pdev); if (ret) - goto err; + goto err_exit; pci_set_drvdata(pci, hci); return 0; +err_exit: + if (hci->info && hci->info->exit) + hci->info->exit(hci); err: platform_device_put(hci->pdev); ida_free(&mipi_i3c_hci_pci_ida, dev_id); @@ -141,6 +145,9 @@ static void mipi_i3c_hci_pci_remove(struct pci_dev *pci) struct platform_device *pdev = hci->pdev; int dev_id = pdev->id; + if (hci->info && hci->info->exit) + hci->info->exit(hci); + platform_device_unregister(pdev); ida_free(&mipi_i3c_hci_pci_ida, dev_id); } |
