]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - drivers/staging/comedi/comedidev.h
staging: comedi: Add helper macro for comedi_driver boilerplate
[karo-tx-linux.git] / drivers / staging / comedi / comedidev.h
index 7a0d4bcbc355f944673fa8ac8c9f4738e075126f..8828609f1ed6c316e313ec8982ed32cae4b512e5 100644 (file)
@@ -180,6 +180,9 @@ struct comedi_async {
                        unsigned int x);
 };
 
+struct pci_dev;
+struct usb_interface;
+
 struct comedi_driver {
        struct comedi_driver *next;
 
@@ -187,6 +190,8 @@ struct comedi_driver {
        struct module *module;
        int (*attach) (struct comedi_device *, struct comedi_devconfig *);
        int (*detach) (struct comedi_device *);
+       int (*attach_pci) (struct comedi_device *, struct pci_dev *);
+       int (*attach_usb) (struct comedi_device *, struct usb_interface *);
 
        /* number of elements in board_name and board_id arrays */
        unsigned int num_names;
@@ -230,10 +235,16 @@ struct comedi_device {
        void (*close) (struct comedi_device *dev);
 };
 
+static inline const void *comedi_board(struct comedi_device *dev)
+{
+       return dev->board_ptr;
+}
+
 struct comedi_device_file_info {
        struct comedi_device *device;
        struct comedi_subdevice *read_subdevice;
        struct comedi_subdevice *write_subdevice;
+       struct device *hardware_device;
 };
 
 #ifdef CONFIG_COMEDI_DEBUG
@@ -287,6 +298,18 @@ int comedi_device_attach(struct comedi_device *dev,
 int comedi_driver_register(struct comedi_driver *);
 int comedi_driver_unregister(struct comedi_driver *);
 
+/**
+ * module_comedi_driver() - Helper macro for registering a comedi driver
+ * @__comedi_driver: comedi_driver struct
+ *
+ * Helper macro for comedi 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_driver(__comedi_driver) \
+       module_driver(__comedi_driver, comedi_driver_register, \
+                       comedi_driver_unregister)
+
 void init_polling(void);
 void cleanup_polling(void);
 void start_polling(struct comedi_device *);
@@ -456,11 +479,12 @@ static inline void *comedi_aux_data(int options[], int n)
 int comedi_alloc_subdevice_minor(struct comedi_device *dev,
                                 struct comedi_subdevice *s);
 void comedi_free_subdevice_minor(struct comedi_subdevice *s);
-int comedi_pci_auto_config(struct pci_dev *pcidev, const char *board_name);
+int comedi_pci_auto_config(struct pci_dev *pcidev,
+                          struct comedi_driver *driver);
 void comedi_pci_auto_unconfig(struct pci_dev *pcidev);
-struct usb_device;             /* forward declaration */
-int comedi_usb_auto_config(struct usb_device *usbdev, const char *board_name);
-void comedi_usb_auto_unconfig(struct usb_device *usbdev);
+int comedi_usb_auto_config(struct usb_interface *intf,
+                          struct comedi_driver *driver);
+void comedi_usb_auto_unconfig(struct usb_interface *intf);
 
 #ifdef CONFIG_COMEDI_PCI_DRIVERS
 #define CONFIG_COMEDI_PCI