staging: comedi: remove comedi_clear_subdevice_minor()
[firefly-linux-kernel-4.4.55.git] / drivers / staging / comedi / comedi_fops.c
index 269284812c6165b0b43d04248b40ffb463d564d9..64721f7f089be06ded2f352d940a802b41fe9c1f 100644 (file)
@@ -137,18 +137,6 @@ static struct comedi_file_info *comedi_clear_board_minor(unsigned minor)
        return info;
 }
 
-static struct comedi_file_info *comedi_clear_subdevice_minor(unsigned minor)
-{
-       struct comedi_file_info *info;
-       unsigned int i = minor - COMEDI_NUM_BOARD_MINORS;
-
-       mutex_lock(&comedi_subdevice_minor_table_lock);
-       info = comedi_subdevice_minor_table[i];
-       comedi_subdevice_minor_table[i] = NULL;
-       mutex_unlock(&comedi_subdevice_minor_table_lock);
-       return info;
-}
-
 static void comedi_free_board_file_info(struct comedi_file_info *info)
 {
        if (info) {
@@ -190,23 +178,34 @@ static struct comedi_file_info
        return info;
 }
 
-static struct comedi_file_info *comedi_file_info_from_minor(unsigned minor)
-{
-       if (minor < COMEDI_NUM_BOARD_MINORS)
-               return comedi_file_info_from_board_minor(minor);
-       else
-               return comedi_file_info_from_subdevice_minor(minor);
-}
-
 static struct comedi_device *
 comedi_dev_from_file_info(struct comedi_file_info *info)
 {
        return info ? info->device : NULL;
 }
 
+static struct comedi_device *comedi_dev_from_board_minor(unsigned minor)
+{
+       struct comedi_file_info *info;
+
+       info = comedi_file_info_from_board_minor(minor);
+       return comedi_dev_from_file_info(info);
+}
+
+static struct comedi_device *comedi_dev_from_subdevice_minor(unsigned minor)
+{
+       struct comedi_file_info *info;
+
+       info = comedi_file_info_from_subdevice_minor(minor);
+       return comedi_dev_from_file_info(info);
+}
+
 struct comedi_device *comedi_dev_from_minor(unsigned minor)
 {
-       return comedi_dev_from_file_info(comedi_file_info_from_minor(minor));
+       if (minor < COMEDI_NUM_BOARD_MINORS)
+               return comedi_dev_from_board_minor(minor);
+       else
+               return comedi_dev_from_subdevice_minor(minor);
 }
 EXPORT_SYMBOL_GPL(comedi_dev_from_minor);
 
@@ -286,16 +285,14 @@ static ssize_t show_max_read_buffer_kb(struct device *csdev,
                                       struct device_attribute *attr, char *buf)
 {
        unsigned int minor = MINOR(csdev->devt);
-       struct comedi_file_info *info;
        struct comedi_device *dev;
        struct comedi_subdevice *s;
        unsigned int size = 0;
 
-       info = comedi_file_info_from_minor(minor);
-       if (!info)
+       dev = comedi_dev_from_minor(minor);
+       if (!dev)
                return -ENODEV;
 
-       dev = info->device;
        mutex_lock(&dev->mutex);
        s = comedi_read_subdevice(dev, minor);
        if (s && (s->subdev_flags & SDF_CMD_READ) && s->async)
@@ -310,7 +307,6 @@ static ssize_t store_max_read_buffer_kb(struct device *csdev,
                                        const char *buf, size_t count)
 {
        unsigned int minor = MINOR(csdev->devt);
-       struct comedi_file_info *info;
        struct comedi_device *dev;
        struct comedi_subdevice *s;
        unsigned int size;
@@ -323,11 +319,10 @@ static ssize_t store_max_read_buffer_kb(struct device *csdev,
                return -EINVAL;
        size *= 1024;
 
-       info = comedi_file_info_from_minor(minor);
-       if (!info)
+       dev = comedi_dev_from_minor(minor);
+       if (!dev)
                return -ENODEV;
 
-       dev = info->device;
        mutex_lock(&dev->mutex);
        s = comedi_read_subdevice(dev, minor);
        if (s && (s->subdev_flags & SDF_CMD_READ) && s->async)
@@ -343,16 +338,14 @@ static ssize_t show_read_buffer_kb(struct device *csdev,
                                   struct device_attribute *attr, char *buf)
 {
        unsigned int minor = MINOR(csdev->devt);
-       struct comedi_file_info *info;
        struct comedi_device *dev;
        struct comedi_subdevice *s;
        unsigned int size = 0;
 
-       info = comedi_file_info_from_minor(minor);
-       if (!info)
+       dev = comedi_dev_from_minor(minor);
+       if (!dev)
                return -ENODEV;
 
-       dev = info->device;
        mutex_lock(&dev->mutex);
        s = comedi_read_subdevice(dev, minor);
        if (s && (s->subdev_flags & SDF_CMD_READ) && s->async)
@@ -367,7 +360,6 @@ static ssize_t store_read_buffer_kb(struct device *csdev,
                                    const char *buf, size_t count)
 {
        unsigned int minor = MINOR(csdev->devt);
-       struct comedi_file_info *info;
        struct comedi_device *dev;
        struct comedi_subdevice *s;
        unsigned int size;
@@ -380,11 +372,10 @@ static ssize_t store_read_buffer_kb(struct device *csdev,
                return -EINVAL;
        size *= 1024;
 
-       info = comedi_file_info_from_minor(minor);
-       if (!info)
+       dev = comedi_dev_from_minor(minor);
+       if (!dev)
                return -ENODEV;
 
-       dev = info->device;
        mutex_lock(&dev->mutex);
        s = comedi_read_subdevice(dev, minor);
        if (s && (s->subdev_flags & SDF_CMD_READ) && s->async)
@@ -401,16 +392,14 @@ static ssize_t show_max_write_buffer_kb(struct device *csdev,
                                        char *buf)
 {
        unsigned int minor = MINOR(csdev->devt);
-       struct comedi_file_info *info;
        struct comedi_device *dev;
        struct comedi_subdevice *s;
        unsigned int size = 0;
 
-       info = comedi_file_info_from_minor(minor);
-       if (!info)
+       dev = comedi_dev_from_minor(minor);
+       if (!dev)
                return -ENODEV;
 
-       dev = info->device;
        mutex_lock(&dev->mutex);
        s = comedi_write_subdevice(dev, minor);
        if (s && (s->subdev_flags & SDF_CMD_WRITE) && s->async)
@@ -425,7 +414,6 @@ static ssize_t store_max_write_buffer_kb(struct device *csdev,
                                         const char *buf, size_t count)
 {
        unsigned int minor = MINOR(csdev->devt);
-       struct comedi_file_info *info;
        struct comedi_device *dev;
        struct comedi_subdevice *s;
        unsigned int size;
@@ -438,11 +426,10 @@ static ssize_t store_max_write_buffer_kb(struct device *csdev,
                return -EINVAL;
        size *= 1024;
 
-       info = comedi_file_info_from_minor(minor);
-       if (!info)
+       dev = comedi_dev_from_minor(minor);
+       if (!dev)
                return -ENODEV;
 
-       dev = info->device;
        mutex_lock(&dev->mutex);
        s = comedi_write_subdevice(dev, minor);
        if (s && (s->subdev_flags & SDF_CMD_WRITE) && s->async)
@@ -458,16 +445,14 @@ static ssize_t show_write_buffer_kb(struct device *csdev,
                                    struct device_attribute *attr, char *buf)
 {
        unsigned int minor = MINOR(csdev->devt);
-       struct comedi_file_info *info;
        struct comedi_device *dev;
        struct comedi_subdevice *s;
        unsigned int size = 0;
 
-       info = comedi_file_info_from_minor(minor);
-       if (!info)
+       dev = comedi_dev_from_minor(minor);
+       if (!dev)
                return -ENODEV;
 
-       dev = info->device;
        mutex_lock(&dev->mutex);
        s = comedi_write_subdevice(dev, minor);
        if (s && (s->subdev_flags & SDF_CMD_WRITE) && s->async)
@@ -482,7 +467,6 @@ static ssize_t store_write_buffer_kb(struct device *csdev,
                                     const char *buf, size_t count)
 {
        unsigned int minor = MINOR(csdev->devt);
-       struct comedi_file_info *info;
        struct comedi_device *dev;
        struct comedi_subdevice *s;
        unsigned int size;
@@ -495,11 +479,10 @@ static ssize_t store_write_buffer_kb(struct device *csdev,
                return -EINVAL;
        size *= 1024;
 
-       info = comedi_file_info_from_minor(minor);
-       if (!info)
+       dev = comedi_dev_from_minor(minor);
+       if (!dev)
                return -ENODEV;
 
-       dev = info->device;
        mutex_lock(&dev->mutex);
        s = comedi_write_subdevice(dev, minor);
        if (s && (s->subdev_flags & SDF_CMD_WRITE) && s->async)
@@ -1785,8 +1768,7 @@ static long comedi_unlocked_ioctl(struct file *file, unsigned int cmd,
                                  unsigned long arg)
 {
        const unsigned minor = iminor(file_inode(file));
-       struct comedi_file_info *info = comedi_file_info_from_minor(minor);
-       struct comedi_device *dev = comedi_dev_from_file_info(info);
+       struct comedi_device *dev = comedi_dev_from_minor(minor);
        int rc;
 
        if (!dev)
@@ -1809,6 +1791,7 @@ static long comedi_unlocked_ioctl(struct file *file, unsigned int cmd,
                            dev->minor >= comedi_num_legacy_minors) {
                                /* Successfully unconfigured a dynamically
                                 * allocated device.  Try and remove it. */
+                               struct comedi_file_info *info;
                                info = comedi_clear_board_minor(dev->minor);
                                if (info) {
                                        mutex_unlock(&dev->mutex);
@@ -1923,8 +1906,7 @@ static struct vm_operations_struct comedi_vm_ops = {
 static int comedi_mmap(struct file *file, struct vm_area_struct *vma)
 {
        const unsigned minor = iminor(file_inode(file));
-       struct comedi_file_info *info = comedi_file_info_from_minor(minor);
-       struct comedi_device *dev = comedi_dev_from_file_info(info);
+       struct comedi_device *dev = comedi_dev_from_minor(minor);
        struct comedi_subdevice *s;
        struct comedi_async *async;
        unsigned long start = vma->vm_start;
@@ -2003,8 +1985,7 @@ static unsigned int comedi_poll(struct file *file, poll_table *wait)
 {
        unsigned int mask = 0;
        const unsigned minor = iminor(file_inode(file));
-       struct comedi_file_info *info = comedi_file_info_from_minor(minor);
-       struct comedi_device *dev = comedi_dev_from_file_info(info);
+       struct comedi_device *dev = comedi_dev_from_minor(minor);
        struct comedi_subdevice *s;
 
        if (!dev)
@@ -2049,8 +2030,7 @@ static ssize_t comedi_write(struct file *file, const char __user *buf,
        int n, m, count = 0, retval = 0;
        DECLARE_WAITQUEUE(wait, current);
        const unsigned minor = iminor(file_inode(file));
-       struct comedi_file_info *info = comedi_file_info_from_minor(minor);
-       struct comedi_device *dev = comedi_dev_from_file_info(info);
+       struct comedi_device *dev = comedi_dev_from_minor(minor);
 
        if (!dev)
                return -ENODEV;
@@ -2144,8 +2124,7 @@ static ssize_t comedi_read(struct file *file, char __user *buf, size_t nbytes,
        int n, m, count = 0, retval = 0;
        DECLARE_WAITQUEUE(wait, current);
        const unsigned minor = iminor(file_inode(file));
-       struct comedi_file_info *info = comedi_file_info_from_minor(minor);
-       struct comedi_device *dev = comedi_dev_from_file_info(info);
+       struct comedi_device *dev = comedi_dev_from_minor(minor);
 
        if (!dev)
                return -ENODEV;
@@ -2537,6 +2516,7 @@ int comedi_alloc_subdevice_minor(struct comedi_subdevice *s)
 void comedi_free_subdevice_minor(struct comedi_subdevice *s)
 {
        struct comedi_file_info *info;
+       unsigned int i;
 
        if (s == NULL)
                return;
@@ -2546,7 +2526,11 @@ void comedi_free_subdevice_minor(struct comedi_subdevice *s)
        BUG_ON(s->minor >= COMEDI_NUM_MINORS);
        BUG_ON(s->minor < COMEDI_NUM_BOARD_MINORS);
 
-       info = comedi_clear_subdevice_minor(s->minor);
+       i = s->minor - COMEDI_NUM_BOARD_MINORS;
+       mutex_lock(&comedi_subdevice_minor_table_lock);
+       info = comedi_subdevice_minor_table[i];
+       comedi_subdevice_minor_table[i] = NULL;
+       mutex_unlock(&comedi_subdevice_minor_table_lock);
        if (s->class_dev) {
                device_destroy(comedi_class, MKDEV(COMEDI_MAJOR, s->minor));
                s->class_dev = NULL;