122
143
if (driv->num_names) {
123
144
dev->board_ptr = comedi_recognize(driv, it->board_name);
124
if (dev->board_ptr == NULL) {
125
module_put(driv->module);
129
if (strcmp(driv->driver_name, it->board_name)) {
130
module_put(driv->module);
134
/* initialize dev->driver here so
135
* comedi_error() can be called from attach */
137
ret = driv->attach(dev, it);
139
module_put(dev->driver->module);
140
__comedi_device_detach(dev);
146
/* recognize has failed if we get here */
147
/* report valid board names before returning error */
148
for (driv = comedi_drivers; driv; driv = driv->next) {
149
if (!try_module_get(driv->module)) {
151
"comedi: failed to increment module count\n");
154
comedi_report_boards(driv);
147
} else if (strcmp(driv->driver_name, it->board_name))
155
149
module_put(driv->module);
160
/* do a little post-config cleanup */
161
ret = postconfig(dev);
162
module_put(dev->driver->module);
152
/* recognize has failed if we get here */
153
/* report valid board names before returning error */
154
for (driv = comedi_drivers; driv; driv = driv->next) {
155
if (!try_module_get(driv->module)) {
157
"comedi: failed to increment module count\n");
160
comedi_report_boards(driv);
161
module_put(driv->module);
165
/* initialize dev->driver here so
166
* comedi_error() can be called from attach */
168
ret = driv->attach(dev, it);
170
module_put(dev->driver->module);
164
171
__comedi_device_detach(dev);
168
if (!dev->board_name) {
169
printk(KERN_WARNING "BUG: dev->board_name=<%p>\n",
171
dev->board_name = "BUG";
174
return comedi_device_postconfig(dev);
179
177
int comedi_driver_register(struct comedi_driver *driver)
257
257
async->subdevice = s;
258
258
s->async = async;
260
#define DEFAULT_BUF_MAXSIZE (64*1024)
261
#define DEFAULT_BUF_SIZE (64*1024)
263
async->max_bufsize = DEFAULT_BUF_MAXSIZE;
261
comedi_default_buf_maxsize_kb * 1024;
262
buf_size = comedi_default_buf_size_kb * 1024;
263
if (buf_size > async->max_bufsize)
264
buf_size = async->max_bufsize;
265
266
async->prealloc_buf = NULL;
266
267
async->prealloc_bufsz = 0;
267
if (comedi_buf_alloc(dev, s, DEFAULT_BUF_SIZE) < 0) {
268
if (comedi_buf_alloc(dev, s, buf_size) < 0) {
268
269
printk(KERN_INFO "Buffer allocation failed\n");
271
272
if (s->buf_change) {
272
ret = s->buf_change(dev, s, DEFAULT_BUF_SIZE);
273
ret = s->buf_change(dev, s, buf_size);
814
815
async->events = 0;
817
static int comedi_auto_config(struct device *hardware_device,
818
const char *board_name, const int *options,
819
unsigned num_options)
819
comedi_auto_config_helper(struct device *hardware_device,
820
struct comedi_driver *driver,
821
int (*attach_wrapper) (struct comedi_device *,
822
void *), void *context)
821
struct comedi_devconfig it;
823
825
struct comedi_device_file_info *dev_file_info;
825
unsigned *private_data = NULL;
826
struct comedi_device *comedi_dev;
827
if (!comedi_autoconfig) {
828
dev_set_drvdata(hardware_device, NULL);
829
if (!comedi_autoconfig)
832
832
minor = comedi_alloc_board_minor(hardware_device);
836
private_data = kmalloc(sizeof(unsigned), GFP_KERNEL);
837
if (private_data == NULL) {
841
*private_data = minor;
842
dev_set_drvdata(hardware_device, private_data);
844
836
dev_file_info = comedi_get_device_file_info(minor);
837
comedi_dev = dev_file_info->device;
839
mutex_lock(&comedi_dev->mutex);
840
if (comedi_dev->attached)
842
else if (!try_module_get(driver->module)) {
843
printk(KERN_INFO "comedi: failed to increment module count\n");
846
/* set comedi_dev->driver here for attach wrapper */
847
comedi_dev->driver = driver;
848
ret = (*attach_wrapper)(comedi_dev, context);
850
module_put(driver->module);
851
__comedi_device_detach(comedi_dev);
853
ret = comedi_device_postconfig(comedi_dev);
856
mutex_unlock(&comedi_dev->mutex);
859
comedi_free_board_minor(minor);
863
static int comedi_auto_config_wrapper(struct comedi_device *dev, void *context)
865
struct comedi_devconfig *it = context;
866
struct comedi_driver *driv = dev->driver;
868
if (driv->num_names) {
869
/* look for generic board entry matching driver name, which
870
* has already been copied to it->board_name */
871
dev->board_ptr = comedi_recognize(driv, it->board_name);
872
if (dev->board_ptr == NULL) {
874
"comedi: auto config failed to find board entry"
875
" '%s' for driver '%s'\n", it->board_name,
877
comedi_report_boards(driv);
881
return driv->attach(dev, it);
884
static int comedi_auto_config(struct device *hardware_device,
885
struct comedi_driver *driver, const int *options,
886
unsigned num_options)
888
struct comedi_devconfig it;
846
890
memset(&it, 0, sizeof(it));
847
strncpy(it.board_name, board_name, COMEDI_NAMELEN);
891
strncpy(it.board_name, driver->driver_name, COMEDI_NAMELEN);
848
892
it.board_name[COMEDI_NAMELEN - 1] = '\0';
849
893
BUG_ON(num_options > COMEDI_NDEVCONFOPTS);
850
894
memcpy(it.options, options, num_options * sizeof(int));
852
mutex_lock(&dev_file_info->device->mutex);
853
retval = comedi_device_attach(dev_file_info->device, &it);
854
mutex_unlock(&dev_file_info->device->mutex);
859
comedi_free_board_minor(minor);
895
return comedi_auto_config_helper(hardware_device, driver,
896
comedi_auto_config_wrapper, &it);
864
899
static void comedi_auto_unconfig(struct device *hardware_device)
866
unsigned *minor = (unsigned *)dev_get_drvdata(hardware_device);
870
BUG_ON(*minor >= COMEDI_NUM_BOARD_MINORS);
872
comedi_free_board_minor(*minor);
873
dev_set_drvdata(hardware_device, NULL);
903
if (hardware_device == NULL)
905
minor = comedi_find_board_minor(hardware_device);
908
BUG_ON(minor >= COMEDI_NUM_BOARD_MINORS);
909
comedi_free_board_minor(minor);
877
int comedi_pci_auto_config(struct pci_dev *pcidev, const char *board_name)
912
static int comedi_old_pci_auto_config(struct pci_dev *pcidev,
913
struct comedi_driver *driver)
884
920
options[1] = PCI_SLOT(pcidev->devfn);
886
return comedi_auto_config(&pcidev->dev, board_name,
922
return comedi_auto_config(&pcidev->dev, driver,
887
923
options, ARRAY_SIZE(options));
926
static int comedi_pci_attach_wrapper(struct comedi_device *dev, void *pcidev)
928
return dev->driver->attach_pci(dev, pcidev);
931
static int comedi_new_pci_auto_config(struct pci_dev *pcidev,
932
struct comedi_driver *driver)
934
return comedi_auto_config_helper(&pcidev->dev, driver,
935
comedi_pci_attach_wrapper, pcidev);
938
int comedi_pci_auto_config(struct pci_dev *pcidev, struct comedi_driver *driver)
941
if (driver->attach_pci)
942
return comedi_new_pci_auto_config(pcidev, driver);
944
return comedi_old_pci_auto_config(pcidev, driver);
889
946
EXPORT_SYMBOL_GPL(comedi_pci_auto_config);
891
948
void comedi_pci_auto_unconfig(struct pci_dev *pcidev)
895
952
EXPORT_SYMBOL_GPL(comedi_pci_auto_unconfig);
897
int comedi_usb_auto_config(struct usb_device *usbdev, const char *board_name)
899
BUG_ON(usbdev == NULL);
900
return comedi_auto_config(&usbdev->dev, board_name, NULL, 0);
954
int comedi_pci_driver_register(struct comedi_driver *comedi_driver,
955
struct pci_driver *pci_driver)
959
ret = comedi_driver_register(comedi_driver);
963
/* FIXME: Remove this test after auditing all comedi pci drivers */
964
if (!pci_driver->name)
965
pci_driver->name = comedi_driver->driver_name;
967
ret = pci_register_driver(pci_driver);
969
comedi_driver_unregister(comedi_driver);
975
EXPORT_SYMBOL_GPL(comedi_pci_driver_register);
977
void comedi_pci_driver_unregister(struct comedi_driver *comedi_driver,
978
struct pci_driver *pci_driver)
980
pci_unregister_driver(pci_driver);
981
comedi_driver_unregister(comedi_driver);
983
EXPORT_SYMBOL_GPL(comedi_pci_driver_unregister);
985
#if IS_ENABLED(CONFIG_USB)
987
static int comedi_old_usb_auto_config(struct usb_interface *intf,
988
struct comedi_driver *driver)
990
return comedi_auto_config(&intf->dev, driver, NULL, 0);
993
static int comedi_usb_attach_wrapper(struct comedi_device *dev, void *intf)
995
return dev->driver->attach_usb(dev, intf);
998
static int comedi_new_usb_auto_config(struct usb_interface *intf,
999
struct comedi_driver *driver)
1001
return comedi_auto_config_helper(&intf->dev, driver,
1002
comedi_usb_attach_wrapper, intf);
1005
int comedi_usb_auto_config(struct usb_interface *intf,
1006
struct comedi_driver *driver)
1008
BUG_ON(intf == NULL);
1009
if (driver->attach_usb)
1010
return comedi_new_usb_auto_config(intf, driver);
1012
return comedi_old_usb_auto_config(intf, driver);
902
1014
EXPORT_SYMBOL_GPL(comedi_usb_auto_config);
904
void comedi_usb_auto_unconfig(struct usb_device *usbdev)
1016
void comedi_usb_auto_unconfig(struct usb_interface *intf)
906
BUG_ON(usbdev == NULL);
907
comedi_auto_unconfig(&usbdev->dev);
1018
BUG_ON(intf == NULL);
1019
comedi_auto_unconfig(&intf->dev);
909
1021
EXPORT_SYMBOL_GPL(comedi_usb_auto_unconfig);
1023
int comedi_usb_driver_register(struct comedi_driver *comedi_driver,
1024
struct usb_driver *usb_driver)
1028
ret = comedi_driver_register(comedi_driver);
1032
ret = usb_register(usb_driver);
1034
comedi_driver_unregister(comedi_driver);
1040
EXPORT_SYMBOL_GPL(comedi_usb_driver_register);
1042
void comedi_usb_driver_unregister(struct comedi_driver *comedi_driver,
1043
struct usb_driver *usb_driver)
1045
usb_deregister(usb_driver);
1046
comedi_driver_unregister(comedi_driver);
1048
EXPORT_SYMBOL_GPL(comedi_usb_driver_unregister);