]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
usb: musb_am335x: make module unload/reload work
authorLothar Waßmann <LW@KARO-electronics.de>
Thu, 17 Jul 2014 09:58:55 +0000 (11:58 +0200)
committerLothar Waßmann <LW@KARO-electronics.de>
Wed, 27 Aug 2014 08:44:14 +0000 (10:44 +0200)
Currently unloading and reloading the usb-am335x module will render
the USB driver non-functional. This is because of_platform_populate()
does nothing upon reload because the OF_POPULATED flag will still be
set on the device nodes from the first module load.

Clearing this flag when unregistering the devices makes this driver
functional also upon repeated unload/load sequences.

Conflicts:
drivers/usb/musb/musb_am335x.c

drivers/usb/musb/musb_am335x.c

index 30b5245007adb30327ef8f2a1a392b153f2b920e..6f1b7bc6a6dc6fda79154011721eefe44b524ba8 100644 (file)
@@ -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,13 @@ MODULE_DEVICE_TABLE(of, am335x_child_of_match);
 
 static struct platform_driver am335x_child_driver = {
        .probe          = am335x_child_probe,
-       .driver         = {
-               .name   = "am335x-usb-childs",
+       .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");