mutex_destroy(&dev->mutex);
}
-int comedi_alloc_board_minor(struct device *hardware_device)
+struct comedi_device *comedi_alloc_board_minor(struct device *hardware_device)
{
struct comedi_file_info *info;
+ struct comedi_device *dev;
struct device *csdev;
unsigned i;
info = kzalloc(sizeof(*info), GFP_KERNEL);
if (info == NULL)
- return -ENOMEM;
- info->device = kzalloc(sizeof(struct comedi_device), GFP_KERNEL);
- if (info->device == NULL) {
+ return ERR_PTR(-ENOMEM);
+ dev = kzalloc(sizeof(struct comedi_device), GFP_KERNEL);
+ if (dev == NULL) {
kfree(info);
- return -ENOMEM;
+ return ERR_PTR(-ENOMEM);
}
+ info->device = dev;
info->hardware_device = hardware_device;
- comedi_device_init(info->device);
+ comedi_device_init(dev);
spin_lock(&comedi_file_info_table_lock);
for (i = 0; i < COMEDI_NUM_BOARD_MINORS; ++i) {
if (comedi_file_info_table[i] == NULL) {
}
spin_unlock(&comedi_file_info_table_lock);
if (i == COMEDI_NUM_BOARD_MINORS) {
- comedi_device_cleanup(info->device);
- kfree(info->device);
+ comedi_device_cleanup(dev);
+ kfree(dev);
kfree(info);
pr_err("comedi: error: ran out of minor numbers for board device files.\n");
- return -EBUSY;
+ return ERR_PTR(-EBUSY);
}
- info->device->minor = i;
+ dev->minor = i;
csdev = device_create(comedi_class, hardware_device,
MKDEV(COMEDI_MAJOR, i), NULL, "comedi%i", i);
if (!IS_ERR(csdev))
- info->device->class_dev = csdev;
+ dev->class_dev = csdev;
dev_set_drvdata(csdev, info);
- return i;
+ return dev;
}
static struct comedi_file_info *comedi_clear_minor(unsigned minor)
/* create devices files for legacy/manual use */
for (i = 0; i < comedi_num_legacy_minors; i++) {
- int minor;
- minor = comedi_alloc_board_minor(NULL);
- if (minor < 0) {
+ struct comedi_device *dev;
+ dev = comedi_alloc_board_minor(NULL);
+ if (IS_ERR(dev)) {
comedi_cleanup_board_minors();
cdev_del(&comedi_cdev);
unregister_chrdev_region(MKDEV(COMEDI_MAJOR, 0),
COMEDI_NUM_MINORS);
- return minor;
+ return PTR_ERR(dev);
}
}
*/
int do_rangeinfo_ioctl(struct comedi_device *dev,
struct comedi_rangeinfo __user *arg);
-int comedi_alloc_board_minor(struct device *hardware_device);
+struct comedi_device *comedi_alloc_board_minor(struct device *hardware_device);
void comedi_release_hardware_device(struct device *hardware_device);
int comedi_alloc_subdevice_minor(struct comedi_subdevice *s);
void comedi_free_subdevice_minor(struct comedi_subdevice *s);
int comedi_auto_config(struct device *hardware_device,
struct comedi_driver *driver, unsigned long context)
{
- int minor;
struct comedi_device *comedi_dev;
int ret;
return -EINVAL;
}
- minor = comedi_alloc_board_minor(hardware_device);
- if (minor < 0)
- return minor;
-
- comedi_dev = comedi_dev_from_minor(minor);
+ comedi_dev = comedi_alloc_board_minor(hardware_device);
+ if (IS_ERR(comedi_dev))
+ return PTR_ERR(comedi_dev);
mutex_lock(&comedi_dev->mutex);
if (comedi_dev->attached)