staging: comedi: change comedi_alloc_board_minor() to return pointer
authorIan Abbott <abbotti@mev.co.uk>
Thu, 4 Apr 2013 13:58:50 +0000 (14:58 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 5 Apr 2013 21:33:17 +0000 (14:33 -0700)
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>
drivers/staging/comedi/comedi_fops.c
drivers/staging/comedi/comedi_internal.h
drivers/staging/comedi/drivers.c

index 38c5f5fb00755e60206d3e39f048f4991a7bfb78..f9d0a72424743baf487283d5846d4a01fca6f322 100644 (file)
@@ -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);
                }
        }
 
index 05e9e6d951d036bfe033171a2320d1a4830735b4..d5e03e558b352b123fb685fc7917a32099fd0839 100644 (file)
@@ -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);
index 5a506a5bab687b9aad70d16c3d7580bf34e3748b..0b72af8c4480b3b722d612c9f62cb694e7bd1547 100644 (file)
@@ -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)