summaryrefslogtreecommitdiff
path: root/drivers/mfd
diff options
context:
space:
mode:
authorAndy Shevchenko <andriy.shevchenko@linux.intel.com>2025-10-30 12:36:33 +0100
committerLee Jones <lee@kernel.org>2026-01-22 14:23:50 +0000
commite11a9ad38095fe7bd1322ed6962c46f51523e885 (patch)
tree68a5b25ddc8d6793ff7f3fa88809bb19d64044e0 /drivers/mfd
parent71ae8abaf100f92b72e99bed4801953b199a7ed4 (diff)
mfd: ls2kbmc: Fully convert to use managed resources
The mixing of managed and non-managed resources may lead to possible use-after-free bugs. In this driver the problematic part is the device functionality that may just have gone behind the functions back, e.g., when interrupt is being served. Fix this by switching to managed resources for PCI. Fixes: 91a3e1f5453a ("mfd: ls2kbmc: Check for devm_mfd_add_devices() failure") Fixes: d952bba3fbb5 ("mfd: ls2kbmc: Add Loongson-2K BMC reset function support") Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com> Reviewed-by: Binbin Zhou <zhoubinbin@loongson.cn> Link: https://patch.msgid.link/20251030113735.3741913-2-andriy.shevchenko@linux.intel.com Signed-off-by: Lee Jones <lee@kernel.org>
Diffstat (limited to 'drivers/mfd')
-rw-r--r--drivers/mfd/ls2k-bmc-core.c36
1 files changed, 9 insertions, 27 deletions
diff --git a/drivers/mfd/ls2k-bmc-core.c b/drivers/mfd/ls2k-bmc-core.c
index e42f1de9e641..7d7c07a367c6 100644
--- a/drivers/mfd/ls2k-bmc-core.c
+++ b/drivers/mfd/ls2k-bmc-core.c
@@ -464,25 +464,23 @@ static int ls2k_bmc_probe(struct pci_dev *dev, const struct pci_device_id *id)
resource_size_t base;
int ret;
- ret = pci_enable_device(dev);
+ ret = pcim_enable_device(dev);
if (ret)
return ret;
ddata = devm_kzalloc(&dev->dev, sizeof(*ddata), GFP_KERNEL);
- if (!ddata) {
- ret = -ENOMEM;
- goto disable_pci;
- }
+ if (!ddata)
+ return -ENOMEM;
ddata->dev = &dev->dev;
ret = ls2k_bmc_init(ddata);
if (ret)
- goto disable_pci;
+ return ret;
ret = ls2k_bmc_parse_mode(dev, &pd);
if (ret)
- goto disable_pci;
+ return ret;
ls2k_bmc_cells[LS2K_BMC_DISPLAY].platform_data = &pd;
ls2k_bmc_cells[LS2K_BMC_DISPLAY].pdata_size = sizeof(pd);
@@ -490,27 +488,12 @@ static int ls2k_bmc_probe(struct pci_dev *dev, const struct pci_device_id *id)
/* Remove conflicting efifb device */
ret = aperture_remove_conflicting_devices(base, SZ_4M, "simple-framebuffer");
- if (ret) {
- dev_err(&dev->dev, "Failed to removed firmware framebuffers: %d\n", ret);
- goto disable_pci;
- }
-
- ret = devm_mfd_add_devices(&dev->dev, PLATFORM_DEVID_AUTO,
- ls2k_bmc_cells, ARRAY_SIZE(ls2k_bmc_cells),
- &dev->resource[0], 0, NULL);
if (ret)
- goto disable_pci;
+ return dev_err_probe(&dev->dev, ret, "Failed to removed firmware framebuffers\n");
- return 0;
-
-disable_pci:
- pci_disable_device(dev);
- return ret;
-}
-
-static void ls2k_bmc_remove(struct pci_dev *dev)
-{
- pci_disable_device(dev);
+ return devm_mfd_add_devices(&dev->dev, PLATFORM_DEVID_AUTO,
+ ls2k_bmc_cells, ARRAY_SIZE(ls2k_bmc_cells),
+ &dev->resource[0], 0, NULL);
}
static struct pci_device_id ls2k_bmc_devices[] = {
@@ -523,7 +506,6 @@ static struct pci_driver ls2k_bmc_driver = {
.name = "ls2k-bmc",
.id_table = ls2k_bmc_devices,
.probe = ls2k_bmc_probe,
- .remove = ls2k_bmc_remove,
};
module_pci_driver(ls2k_bmc_driver);