mirror of
https://github.com/torvalds/linux.git
synced 2024-12-28 22:02:28 +00:00
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>
This commit is contained in:
parent
70f30c3771
commit
7638ffcb50
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user