mirror of
https://github.com/torvalds/linux.git
synced 2025-01-01 15:51:46 +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);
|
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_file_info *info;
|
||||||
|
struct comedi_device *dev;
|
||||||
struct device *csdev;
|
struct device *csdev;
|
||||||
unsigned i;
|
unsigned i;
|
||||||
|
|
||||||
info = kzalloc(sizeof(*info), GFP_KERNEL);
|
info = kzalloc(sizeof(*info), GFP_KERNEL);
|
||||||
if (info == NULL)
|
if (info == NULL)
|
||||||
return -ENOMEM;
|
return ERR_PTR(-ENOMEM);
|
||||||
info->device = kzalloc(sizeof(struct comedi_device), GFP_KERNEL);
|
dev = kzalloc(sizeof(struct comedi_device), GFP_KERNEL);
|
||||||
if (info->device == NULL) {
|
if (dev == NULL) {
|
||||||
kfree(info);
|
kfree(info);
|
||||||
return -ENOMEM;
|
return ERR_PTR(-ENOMEM);
|
||||||
}
|
}
|
||||||
|
info->device = dev;
|
||||||
info->hardware_device = hardware_device;
|
info->hardware_device = hardware_device;
|
||||||
comedi_device_init(info->device);
|
comedi_device_init(dev);
|
||||||
spin_lock(&comedi_file_info_table_lock);
|
spin_lock(&comedi_file_info_table_lock);
|
||||||
for (i = 0; i < COMEDI_NUM_BOARD_MINORS; ++i) {
|
for (i = 0; i < COMEDI_NUM_BOARD_MINORS; ++i) {
|
||||||
if (comedi_file_info_table[i] == NULL) {
|
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);
|
spin_unlock(&comedi_file_info_table_lock);
|
||||||
if (i == COMEDI_NUM_BOARD_MINORS) {
|
if (i == COMEDI_NUM_BOARD_MINORS) {
|
||||||
comedi_device_cleanup(info->device);
|
comedi_device_cleanup(dev);
|
||||||
kfree(info->device);
|
kfree(dev);
|
||||||
kfree(info);
|
kfree(info);
|
||||||
pr_err("comedi: error: ran out of minor numbers for board device files.\n");
|
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,
|
csdev = device_create(comedi_class, hardware_device,
|
||||||
MKDEV(COMEDI_MAJOR, i), NULL, "comedi%i", i);
|
MKDEV(COMEDI_MAJOR, i), NULL, "comedi%i", i);
|
||||||
if (!IS_ERR(csdev))
|
if (!IS_ERR(csdev))
|
||||||
info->device->class_dev = csdev;
|
dev->class_dev = csdev;
|
||||||
dev_set_drvdata(csdev, info);
|
dev_set_drvdata(csdev, info);
|
||||||
|
|
||||||
return i;
|
return dev;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct comedi_file_info *comedi_clear_minor(unsigned minor)
|
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 */
|
/* create devices files for legacy/manual use */
|
||||||
for (i = 0; i < comedi_num_legacy_minors; i++) {
|
for (i = 0; i < comedi_num_legacy_minors; i++) {
|
||||||
int minor;
|
struct comedi_device *dev;
|
||||||
minor = comedi_alloc_board_minor(NULL);
|
dev = comedi_alloc_board_minor(NULL);
|
||||||
if (minor < 0) {
|
if (IS_ERR(dev)) {
|
||||||
comedi_cleanup_board_minors();
|
comedi_cleanup_board_minors();
|
||||||
cdev_del(&comedi_cdev);
|
cdev_del(&comedi_cdev);
|
||||||
unregister_chrdev_region(MKDEV(COMEDI_MAJOR, 0),
|
unregister_chrdev_region(MKDEV(COMEDI_MAJOR, 0),
|
||||||
COMEDI_NUM_MINORS);
|
COMEDI_NUM_MINORS);
|
||||||
return minor;
|
return PTR_ERR(dev);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -8,7 +8,7 @@
|
|||||||
*/
|
*/
|
||||||
int do_rangeinfo_ioctl(struct comedi_device *dev,
|
int do_rangeinfo_ioctl(struct comedi_device *dev,
|
||||||
struct comedi_rangeinfo __user *arg);
|
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);
|
void comedi_release_hardware_device(struct device *hardware_device);
|
||||||
int comedi_alloc_subdevice_minor(struct comedi_subdevice *s);
|
int comedi_alloc_subdevice_minor(struct comedi_subdevice *s);
|
||||||
void comedi_free_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,
|
int comedi_auto_config(struct device *hardware_device,
|
||||||
struct comedi_driver *driver, unsigned long context)
|
struct comedi_driver *driver, unsigned long context)
|
||||||
{
|
{
|
||||||
int minor;
|
|
||||||
struct comedi_device *comedi_dev;
|
struct comedi_device *comedi_dev;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
@ -427,11 +426,9 @@ int comedi_auto_config(struct device *hardware_device,
|
|||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
minor = comedi_alloc_board_minor(hardware_device);
|
comedi_dev = comedi_alloc_board_minor(hardware_device);
|
||||||
if (minor < 0)
|
if (IS_ERR(comedi_dev))
|
||||||
return minor;
|
return PTR_ERR(comedi_dev);
|
||||||
|
|
||||||
comedi_dev = comedi_dev_from_minor(minor);
|
|
||||||
|
|
||||||
mutex_lock(&comedi_dev->mutex);
|
mutex_lock(&comedi_dev->mutex);
|
||||||
if (comedi_dev->attached)
|
if (comedi_dev->attached)
|
||||||
|
Loading…
Reference in New Issue
Block a user