[PATCH v2] usb: musb: da8xx: depopulate OF children on teardown

From: Pengpeng Hou

Date: Wed Jul 15 2026 - 10:22:06 EST


da8xx_probe() populates OF child devices before registering the MUSB
platform device. If the later MUSB device registration fails, those
children remain registered. The remove path also leaves the populated
children behind.

Depopulate the children when MUSB device registration fails and after
unregistering the MUSB device during remove.

Signed-off-by: Pengpeng Hou <pengpeng@xxxxxxxxxxx>
---
Changes since v1: https://lore.kernel.org/all/20260616005819.11232-1-pengpeng@xxxxxxxxxxx/
- keep the existing of_platform_populate() error unwind target, so both
labels remain used and the patch does not introduce an unused-label
warning
- limit the commit message to paths where population has succeeded
---
drivers/usb/musb/da8xx.c | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/drivers/usb/musb/da8xx.c b/drivers/usb/musb/da8xx.c
index 4209f43..0c098a4 100644
--- a/drivers/usb/musb/da8xx.c
+++ b/drivers/usb/musb/da8xx.c
@@ -577,11 +577,13 @@ static int da8xx_probe(struct platform_device *pdev)
ret = PTR_ERR_OR_ZERO(glue->musb);
if (ret) {
dev_err(&pdev->dev, "failed to register musb device: %d\n", ret);
- goto err_unregister_phy;
+ goto err_depopulate;
}

return 0;

+err_depopulate:
+ of_platform_depopulate(&pdev->dev);
err_unregister_phy:
usb_phy_generic_unregister(glue->usb_phy);
return ret;
@@ -592,6 +594,7 @@ static void da8xx_remove(struct platform_device *pdev)
struct da8xx_glue *glue = platform_get_drvdata(pdev);

platform_device_unregister(glue->musb);
+ of_platform_depopulate(&pdev->dev);
usb_phy_generic_unregister(glue->usb_phy);
}

--
2.50.1 (Apple Git-155)