staging: comedi: Add helper macro for comedi usb driver boilerplate
PATCH 1/1 staging: comedi: Add helper macro for comedi usb driver boilerplate
Introduce the module_comedi_usb_driver macro, and the associated register/unregister functions, which is a convenience macro for comedi usb driver modules similar to module_platform_driver. It is intended to be used by drivers where the init/exit section does nothing but register/unregister the comedi driver and associated usb driver. By using this macro it is possible to eliminate a few lines of boilerplate code per comedi usb driver.
Also, when registering the usb driver check for failure and unregister the comedi driver.
Signed-off-by H Hartley Sweeten <[email protected]>
Cc Ian Abbott <[email protected]>
Cc Mori Hess <[email protected]>
Cc Greg Kroah-Hartman <[email protected]>
---
drivers/staging/comedi/comedidev.h | 19 +++++++++++++++++++ drivers/staging/comedi/drivers.c | 27 +++++++++++++++++++++++++++ 2 files changed, 46 insertions(+), 0 deletions(-)
drivers/staging/comedi/comedidev.h +19 -0
@@ -329,6 +329,25 @@ void comedi_pci_driver_unregister(struct comedi_driver *, struct pci_driver *);module_driver (__comedi_driver, comedi_pci_driver_register, \ comedi_pci_driver_unregister, &(__pci_driver)) +struct usb_driver ; + +int comedi_usb_driver_register (struct comedi_driver *,struct usb_driver *); +void comedi_usb_driver_unregister (struct comedi_driver *,struct usb_driver *); + +/** +* module_comedi_usb_driver() - Helper macro for registering a comedi USB driver +* @__comedi_driver: comedi_driver struct +* @__usb_driver: usb_driver struct +* +* Helper macro for comedi USB drivers which do not do anything special +* in module init/exit. This eliminates a lot of boilerplate. Each +* module may only use this macro once, and calling it replaces +* module_init() and module_exit() +*/ +#define module_comedi_usb_driver (__comedi_driver, __usb_driver) \ + module_driver(__comedi_driver, comedi_usb_driver_register, \ + comedi_usb_driver_unregister, &(__usb_driver)) +void init_polling (void );void cleanup_polling (void );void start_polling (struct comedi_device *);
drivers/staging/comedi/drivers.c +27 -0
@@ -1016,3 +1016,30 @@ void comedi_usb_auto_unconfig(struct usb_interface *intf)comedi_auto_unconfig (&intf->dev); }EXPORT_SYMBOL_GPL (comedi_usb_auto_unconfig); + +int comedi_usb_driver_register (struct comedi_driver *comedi_driver, +struct usb_driver *usb_driver) +{ +int ret; + + ret =comedi_driver_register (comedi_driver); +if (ret <0 ) +return ret; + + ret =usb_register (usb_driver); +if (ret <0 ) { +comedi_driver_unregister (comedi_driver); +return ret; + } + +return 0 ; +} +EXPORT_SYMBOL_GPL (comedi_usb_driver_register); + +void comedi_usb_driver_unregister (struct comedi_driver *comedi_driver, +struct usb_driver *usb_driver) +{ +usb_deregister (usb_driver); +comedi_driver_unregister (comedi_driver); +} +EXPORT_SYMBOL_GPL (comedi_usb_driver_unregister);