diff options
author | Ian Abbott <abbotti@mev.co.uk> | 2013-04-04 14:58:50 +0100 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2013-04-05 14:33:17 -0700 |
commit | 7638ffcb50903d9ddbf605c7e9578d72658a960a (patch) | |
tree | 1c1372fff0a1091330af45e1570e92f08fc88bf1 | |
parent | 70f30c3771f1e7c55d381954d84beff9c257a2b6 (diff) | |
download | op-kernel-dev-7638ffcb50903d9ddbf605c7e9578d72658a960a.zip op-kernel-dev-7638ffcb50903d9ddbf605c7e9578d72658a960a.tar.gz |
staging: comedi: change comedi_alloc_board_minor() to return pointer
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@mev.co.uk>
Reviewed-by: H Hartley Sweeten <hsweeten@visionengravers.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-rw-r--r-- | drivers/staging/comedi/comedi_fops.c | 34 | ||||
-rw-r--r-- | drivers/staging/comedi/comedi_internal.h | 2 | ||||
-rw-r--r-- | 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) |