There is no need to throw the baby out with the bath due to a bad failure analysis. The commit: 7adb5c876e9c usb: musb: Fix panic upon musb_am335x module removal came to a wrong conclusion about the cause of the crash it was "fixing". The real culprit was the phy-am335x module that was removed from underneath its users that were still referencing data from it. After having fixed this in a previous patch, module unloading can be reinstated. Another bug with module loading/unloading was the fact, that after removing the devices instantiated from DT their 'OF_POPULATED' flag was still set, so that re-loading the module after an unload had no effect. This is also fixed in this patch. Signed-off-by: Lothar Waßmann <LW@xxxxxxxxxxxxxxxxxxx> --- drivers/usb/musb/musb_am335x.c | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/drivers/usb/musb/musb_am335x.c b/drivers/usb/musb/musb_am335x.c index 164c868..152a6f5 100644 --- a/drivers/usb/musb/musb_am335x.c +++ b/drivers/usb/musb/musb_am335x.c @@ -19,6 +19,22 @@ err: return ret; } +static int of_remove_populated_child(struct device *dev, void *d) +{ + struct platform_device *pdev = to_platform_device(dev); + + of_device_unregister(pdev); + of_node_clear_flag(pdev->dev.of_node, OF_POPULATED); + return 0; +} + +static int am335x_child_remove(struct platform_device *pdev) +{ + device_for_each_child(&pdev->dev, NULL, of_remove_populated_child); + pm_runtime_disable(&pdev->dev); + return 0; +} + static const struct of_device_id am335x_child_of_match[] = { { .compatible = "ti,am33xx-usb" }, { } @@ -27,17 +43,14 @@ MODULE_DEVICE_TABLE(of, am335x_child_of_match); static struct platform_driver am335x_child_driver = { .probe = am335x_child_probe, + .remove = am335x_child_remove, .driver = { .name = "am335x-usb-childs", .of_match_table = am335x_child_of_match, }, }; -static int __init am335x_child_init(void) -{ - return platform_driver_register(&am335x_child_driver); -} -module_init(am335x_child_init); +module_platform_driver(am335x_child_driver); MODULE_DESCRIPTION("AM33xx child devices"); MODULE_LICENSE("GPL v2"); -- 1.7.10.4 -- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html