Commit a89a2cd3 authored by Alan Stern's avatar Alan Stern Committed by Greg Kroah-Hartman

USB: dummy-hcd: use dynamic allocation for platform_devices

This patch (as1075) changes dummy-hcd to dynamically allocate its
platform_device structures, using the core platform_device_alloc()
interface.  This is what it should have done all along, because the
dynamically-allocated structures have a release method in the driver
core and are therefore immune to being released after the module has
been unloaded.

Thanks to Richard Purdie for pointing out the need for this change.
Signed-off-by: default avatarAlan Stern <stern@rowland.harvard.edu>
Cc: Richard Purdie <rpurdie@rpsys.net>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent 0e530b45
...@@ -1933,69 +1933,57 @@ static struct platform_driver dummy_hcd_driver = { ...@@ -1933,69 +1933,57 @@ static struct platform_driver dummy_hcd_driver = {
/*-------------------------------------------------------------------------*/ /*-------------------------------------------------------------------------*/
/* These don't need to do anything because the pdev structures are static struct platform_device *the_udc_pdev;
* statically allocated. */ static struct platform_device *the_hcd_pdev;
static void
dummy_udc_release (struct device *dev) {}
static void
dummy_hcd_release (struct device *dev) {}
static struct platform_device the_udc_pdev = {
.name = (char *) gadget_name,
.id = -1,
.dev = {
.release = dummy_udc_release,
},
};
static struct platform_device the_hcd_pdev = {
.name = (char *) driver_name,
.id = -1,
.dev = {
.release = dummy_hcd_release,
},
};
static int __init init (void) static int __init init (void)
{ {
int retval; int retval = -ENOMEM;
if (usb_disabled ()) if (usb_disabled ())
return -ENODEV; return -ENODEV;
retval = platform_driver_register (&dummy_hcd_driver); the_hcd_pdev = platform_device_alloc(driver_name, -1);
if (retval < 0) if (!the_hcd_pdev)
return retval; return retval;
the_udc_pdev = platform_device_alloc(gadget_name, -1);
if (!the_udc_pdev)
goto err_alloc_udc;
retval = platform_driver_register (&dummy_udc_driver); retval = platform_driver_register(&dummy_hcd_driver);
if (retval < 0)
goto err_register_hcd_driver;
retval = platform_driver_register(&dummy_udc_driver);
if (retval < 0) if (retval < 0)
goto err_register_udc_driver; goto err_register_udc_driver;
retval = platform_device_register (&the_hcd_pdev); retval = platform_device_add(the_hcd_pdev);
if (retval < 0) if (retval < 0)
goto err_register_hcd; goto err_add_hcd;
retval = platform_device_add(the_udc_pdev);
retval = platform_device_register (&the_udc_pdev);
if (retval < 0) if (retval < 0)
goto err_register_udc; goto err_add_udc;
return retval; return retval;
err_register_udc: err_add_udc:
platform_device_unregister (&the_hcd_pdev); platform_device_del(the_hcd_pdev);
err_register_hcd: err_add_hcd:
platform_driver_unregister (&dummy_udc_driver); platform_driver_unregister(&dummy_udc_driver);
err_register_udc_driver: err_register_udc_driver:
platform_driver_unregister (&dummy_hcd_driver); platform_driver_unregister(&dummy_hcd_driver);
err_register_hcd_driver:
platform_device_put(the_udc_pdev);
err_alloc_udc:
platform_device_put(the_hcd_pdev);
return retval; return retval;
} }
module_init (init); module_init (init);
static void __exit cleanup (void) static void __exit cleanup (void)
{ {
platform_device_unregister (&the_udc_pdev); platform_device_unregister(the_udc_pdev);
platform_device_unregister (&the_hcd_pdev); platform_device_unregister(the_hcd_pdev);
platform_driver_unregister (&dummy_udc_driver); platform_driver_unregister(&dummy_udc_driver);
platform_driver_unregister (&dummy_hcd_driver); platform_driver_unregister(&dummy_hcd_driver);
} }
module_exit (cleanup); module_exit (cleanup);
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment