Change `comedi_alloc_board_minor()` to return a pointer to the allocated `struct comedi_device` instead of a minor device number. Return an `ERR_PTR()` value on error instead of a negative error number. This saves a call to `comedi_dev_from_minor()` in `comedi_auto_config()`. Also change it to use a local variable `dev` to hold the pointer to the `struct comedi_device` instead of using `info->device` all the time. Signed-off-by: Ian Abbott <abbotti@xxxxxxxxx> --- drivers/staging/comedi/comedi_fops.c | 34 +++++++++++++++++--------------- drivers/staging/comedi/comedi_internal.h | 2 +- drivers/staging/comedi/drivers.c | 9 +++------ 3 files changed, 22 insertions(+), 23 deletions(-) diff --git a/drivers/staging/comedi/comedi_fops.c b/drivers/staging/comedi/comedi_fops.c index 38c5f5f..f9d0a72 100644 --- a/drivers/staging/comedi/comedi_fops.c +++ b/drivers/staging/comedi/comedi_fops.c @@ -2274,22 +2274,24 @@ static void comedi_device_cleanup(struct comedi_device *dev) 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) { @@ -2299,20 +2301,20 @@ int comedi_alloc_board_minor(struct device *hardware_device) } 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) @@ -2475,14 +2477,14 @@ static int __init comedi_init(void) /* 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); } } diff --git a/drivers/staging/comedi/comedi_internal.h b/drivers/staging/comedi/comedi_internal.h index 05e9e6d..d5e03e5 100644 --- a/drivers/staging/comedi/comedi_internal.h +++ b/drivers/staging/comedi/comedi_internal.h @@ -8,7 +8,7 @@ */ 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); diff --git a/drivers/staging/comedi/drivers.c b/drivers/staging/comedi/drivers.c index 5a506a5..0b72af8 100644 --- a/drivers/staging/comedi/drivers.c +++ b/drivers/staging/comedi/drivers.c @@ -406,7 +406,6 @@ int comedi_device_attach(struct comedi_device *dev, struct comedi_devconfig *it) int comedi_auto_config(struct device *hardware_device, struct comedi_driver *driver, unsigned long context) { - int minor; struct comedi_device *comedi_dev; int ret; @@ -427,11 +426,9 @@ int comedi_auto_config(struct device *hardware_device, 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) -- 1.8.1.5 _______________________________________________ devel mailing list devel@xxxxxxxxxxxxxxxxxxxxxx http://driverdev.linuxdriverproject.org/mailman/listinfo/devel