[PATCH] mfd: sm501: unwind common init failures

From: Pengpeng Hou

Date: Mon Jun 15 2026 - 20:45:04 EST


sm501_init_dev() creates the debug sysfs file and can register child
devices before the final clock-source sanity check. If that check fails,
the caller tears down the parent mapping but the children and debug file
remain published. The PCI probe path also ignored the return value from
sm501_init_dev().

Unwind the common SM501 registrations before returning the clock-check
failure, and make the PCI probe path propagate sm501_init_dev() errors.

Signed-off-by: Pengpeng Hou <pengpeng@xxxxxxxxxxx>
---
drivers/mfd/sm501.c | 10 +++++++++-
1 file changed, 9 insertions(+), 1 deletion(-)

diff --git a/drivers/mfd/sm501.c b/drivers/mfd/sm501.c
index 0ee6d8940e69..b21b4fc18e87 100644
--- a/drivers/mfd/sm501.c
+++ b/drivers/mfd/sm501.c
@@ -1249,6 +1249,8 @@ static unsigned int sm501_mem_local[] = {
[5] = 2*1024*1024,
};

+static void sm501_dev_remove(struct sm501_devdata *sm);
+
/* sm501_init_dev
*
* Common init code for an SM501
@@ -1321,6 +1323,7 @@ static int sm501_init_dev(struct sm501_devdata *sm)
if (ret) {
dev_err(sm->dev, "M1X and M clocks sourced from different "
"PLLs\n");
+ sm501_dev_remove(sm);
return -EINVAL;
}

@@ -1583,9 +1586,14 @@ static int sm501_pci_probe(struct pci_dev *dev,
goto err4;
}

- sm501_init_dev(sm);
+ err = sm501_init_dev(sm);
+ if (err)
+ goto err5;
+
return 0;

+ err5:
+ iounmap(sm->regs);
err4:
release_mem_region(sm->io_res->start, 0x100);
err3:
--
2.50.1 (Apple Git-155)