staging: comedi: Add helper macro for comedi pci driver boilerplate
Introduce the module_comedi_pci_driver macro, and the associated register/unregister functions, which is a convenience macro for comedi pci 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 pci driver. By using this macro it is possible to eliminate a few lines of boilerplate code per comedi pci driver. Add a check to make sure that the pci_driver->name is set. Once all the comedi pci drivers have been fixed this will be removed. Also, when registering the pci driver check for failure and unregister the comedi driver. Signed-off-by: H Hartley Sweeten <hsweeten@visionengravers.com> Cc: Ian Abbott <abbotti@mev.co.uk> Cc: Mori Hess <fmhess@users.sourceforge.net> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
5a81b4a0b6
commit
d4899c6ff8
2 changed files with 50 additions and 0 deletions
|
@ -310,6 +310,25 @@ int comedi_driver_unregister(struct comedi_driver *);
|
||||||
module_driver(__comedi_driver, comedi_driver_register, \
|
module_driver(__comedi_driver, comedi_driver_register, \
|
||||||
comedi_driver_unregister)
|
comedi_driver_unregister)
|
||||||
|
|
||||||
|
struct pci_driver;
|
||||||
|
|
||||||
|
int comedi_pci_driver_register(struct comedi_driver *, struct pci_driver *);
|
||||||
|
void comedi_pci_driver_unregister(struct comedi_driver *, struct pci_driver *);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* module_comedi_pci_driver() - Helper macro for registering a comedi PCI driver
|
||||||
|
* @__comedi_driver: comedi_driver struct
|
||||||
|
* @__pci_driver: pci_driver struct
|
||||||
|
*
|
||||||
|
* Helper macro for comedi PCI 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_pci_driver(__comedi_driver, __pci_driver) \
|
||||||
|
module_driver(__comedi_driver, comedi_pci_driver_register, \
|
||||||
|
comedi_pci_driver_unregister, &(__pci_driver))
|
||||||
|
|
||||||
void init_polling(void);
|
void init_polling(void);
|
||||||
void cleanup_polling(void);
|
void cleanup_polling(void);
|
||||||
void start_polling(struct comedi_device *);
|
void start_polling(struct comedi_device *);
|
||||||
|
|
|
@ -950,6 +950,37 @@ void comedi_pci_auto_unconfig(struct pci_dev *pcidev)
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(comedi_pci_auto_unconfig);
|
EXPORT_SYMBOL_GPL(comedi_pci_auto_unconfig);
|
||||||
|
|
||||||
|
int comedi_pci_driver_register(struct comedi_driver *comedi_driver,
|
||||||
|
struct pci_driver *pci_driver)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
ret = comedi_driver_register(comedi_driver);
|
||||||
|
if (ret < 0)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
/* FIXME: Remove this test after auditing all comedi pci drivers */
|
||||||
|
if (!pci_driver->name)
|
||||||
|
pci_driver->name = comedi_driver->driver_name;
|
||||||
|
|
||||||
|
ret = pci_register_driver(pci_driver);
|
||||||
|
if (ret < 0) {
|
||||||
|
comedi_driver_unregister(comedi_driver);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(comedi_pci_driver_register);
|
||||||
|
|
||||||
|
void comedi_pci_driver_unregister(struct comedi_driver *comedi_driver,
|
||||||
|
struct pci_driver *pci_driver)
|
||||||
|
{
|
||||||
|
pci_unregister_driver(pci_driver);
|
||||||
|
comedi_driver_unregister(comedi_driver);
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(comedi_pci_driver_unregister);
|
||||||
|
|
||||||
static int comedi_old_usb_auto_config(struct usb_interface *intf,
|
static int comedi_old_usb_auto_config(struct usb_interface *intf,
|
||||||
struct comedi_driver *driver)
|
struct comedi_driver *driver)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in a new issue