Commit cb6b79de authored by Ian Abbott's avatar Ian Abbott Committed by Greg Kroah-Hartman

staging: comedi: simplify comedi_board_minor_table[]

`comedi_alloc_board_minor()` allocates and initializes a `struct
comedi_file_info` and a `struct comedi_device`, and assigns a board
minor device number (if there are any available), storing a pointer to
the allocated `struct comedi_file_info` in
`comedi_board_minor_table[minor]` where `minor` is the board minor
device number.

There is no longer anything useful in the `struct comedi_file_info`
apart from the pointer to the `struct comedi_device` that was allocated,
so the `struct comedi_file_info` is superfluous.

Change `comedi_board_minor_table[]` to hold pointers to the actual
`struct comedi_device`'s.  `comedi_alloc_board_minor()` no longer needs
to allocate a `struct comedi_file_info`.  Replace
`comedi_free_board_file_info()` with `comedi_free_board_dev()` with its
parameter pointing to the `struct comedi_device` to be freed (there is
no longer a `struct comedi_file_info` to be freed).

There are consequential changes to `comedi_dev_from_board_minor()`,
`comedi_clear_board_minor()` (which now returns a `struct comedi_device
*`), `comedi_free_board_minor()`, `comedi_release_hardware_device()` and
`comedi_unlocked_ioctl()` (when dealing with detachment of a dynamically
allocated comedi device by the `COMEDI_DEVCONFIG` ioctl).

`comedi_dev_from_file_info()` is no longer used as a result of the above
changes so remove it.
Signed-off-by: default avatarIan Abbott <abbotti@mev.co.uk>
Reviewed-by: default avatarH Hartley Sweeten <hsweeten@visionengravers.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent bd5b4173
...@@ -88,7 +88,7 @@ struct comedi_file_info { ...@@ -88,7 +88,7 @@ struct comedi_file_info {
}; };
static DEFINE_MUTEX(comedi_board_minor_table_lock); static DEFINE_MUTEX(comedi_board_minor_table_lock);
static struct comedi_file_info static struct comedi_device
*comedi_board_minor_table[COMEDI_NUM_BOARD_MINORS]; *comedi_board_minor_table[COMEDI_NUM_BOARD_MINORS];
static DEFINE_MUTEX(comedi_subdevice_minor_table_lock); static DEFINE_MUTEX(comedi_subdevice_minor_table_lock);
...@@ -126,21 +126,19 @@ static void comedi_device_cleanup(struct comedi_device *dev) ...@@ -126,21 +126,19 @@ static void comedi_device_cleanup(struct comedi_device *dev)
mutex_destroy(&dev->mutex); mutex_destroy(&dev->mutex);
} }
static struct comedi_file_info *comedi_clear_board_minor(unsigned minor) static struct comedi_device *comedi_clear_board_minor(unsigned minor)
{ {
struct comedi_file_info *info; struct comedi_device *dev;
mutex_lock(&comedi_board_minor_table_lock); mutex_lock(&comedi_board_minor_table_lock);
info = comedi_board_minor_table[minor]; dev = comedi_board_minor_table[minor];
comedi_board_minor_table[minor] = NULL; comedi_board_minor_table[minor] = NULL;
mutex_unlock(&comedi_board_minor_table_lock); mutex_unlock(&comedi_board_minor_table_lock);
return info; return dev;
} }
static void comedi_free_board_file_info(struct comedi_file_info *info) static void comedi_free_board_dev(struct comedi_device *dev)
{ {
if (info) {
struct comedi_device *dev = info->device;
if (dev) { if (dev) {
if (dev->class_dev) { if (dev->class_dev) {
device_destroy(comedi_class, device_destroy(comedi_class,
...@@ -149,8 +147,6 @@ static void comedi_free_board_file_info(struct comedi_file_info *info) ...@@ -149,8 +147,6 @@ static void comedi_free_board_file_info(struct comedi_file_info *info)
comedi_device_cleanup(dev); comedi_device_cleanup(dev);
kfree(dev); kfree(dev);
} }
kfree(info);
}
} }
static struct comedi_subdevice static struct comedi_subdevice
...@@ -166,21 +162,15 @@ static struct comedi_subdevice ...@@ -166,21 +162,15 @@ static struct comedi_subdevice
return s; return s;
} }
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) static struct comedi_device *comedi_dev_from_board_minor(unsigned minor)
{ {
struct comedi_file_info *info; struct comedi_device *dev;
BUG_ON(minor >= COMEDI_NUM_BOARD_MINORS); BUG_ON(minor >= COMEDI_NUM_BOARD_MINORS);
mutex_lock(&comedi_board_minor_table_lock); mutex_lock(&comedi_board_minor_table_lock);
info = comedi_board_minor_table[minor]; dev = comedi_board_minor_table[minor];
mutex_unlock(&comedi_board_minor_table_lock); mutex_unlock(&comedi_board_minor_table_lock);
return comedi_dev_from_file_info(info); return dev;
} }
static struct comedi_device *comedi_dev_from_subdevice_minor(unsigned minor) static struct comedi_device *comedi_dev_from_subdevice_minor(unsigned minor)
...@@ -1782,11 +1772,11 @@ static long comedi_unlocked_ioctl(struct file *file, unsigned int cmd, ...@@ -1782,11 +1772,11 @@ static long comedi_unlocked_ioctl(struct file *file, unsigned int cmd,
dev->minor >= comedi_num_legacy_minors) { dev->minor >= comedi_num_legacy_minors) {
/* Successfully unconfigured a dynamically /* Successfully unconfigured a dynamically
* allocated device. Try and remove it. */ * allocated device. Try and remove it. */
struct comedi_file_info *info; struct comedi_device *devr;
info = comedi_clear_board_minor(dev->minor); devr = comedi_clear_board_minor(dev->minor);
if (info) { if (dev == devr) {
mutex_unlock(&dev->mutex); mutex_unlock(&dev->mutex);
comedi_free_board_file_info(info); comedi_free_board_dev(dev);
return rc; return rc;
} }
} }
...@@ -2396,20 +2386,13 @@ EXPORT_SYMBOL(comedi_event); ...@@ -2396,20 +2386,13 @@ EXPORT_SYMBOL(comedi_event);
/* Note: the ->mutex is pre-locked on successful return */ /* Note: the ->mutex is pre-locked on successful return */
struct comedi_device *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 comedi_device *dev;
struct device *csdev; struct device *csdev;
unsigned i; unsigned i;
info = kzalloc(sizeof(*info), GFP_KERNEL);
if (info == NULL)
return ERR_PTR(-ENOMEM);
dev = kzalloc(sizeof(struct comedi_device), GFP_KERNEL); dev = kzalloc(sizeof(struct comedi_device), GFP_KERNEL);
if (dev == NULL) { if (dev == NULL)
kfree(info);
return ERR_PTR(-ENOMEM); return ERR_PTR(-ENOMEM);
}
info->device = dev;
comedi_device_init(dev); comedi_device_init(dev);
comedi_set_hw_dev(dev, hardware_device); comedi_set_hw_dev(dev, hardware_device);
mutex_lock(&dev->mutex); mutex_lock(&dev->mutex);
...@@ -2417,7 +2400,7 @@ struct comedi_device *comedi_alloc_board_minor(struct device *hardware_device) ...@@ -2417,7 +2400,7 @@ struct comedi_device *comedi_alloc_board_minor(struct device *hardware_device)
for (i = hardware_device ? comedi_num_legacy_minors : 0; for (i = hardware_device ? comedi_num_legacy_minors : 0;
i < COMEDI_NUM_BOARD_MINORS; ++i) { i < COMEDI_NUM_BOARD_MINORS; ++i) {
if (comedi_board_minor_table[i] == NULL) { if (comedi_board_minor_table[i] == NULL) {
comedi_board_minor_table[i] = info; comedi_board_minor_table[i] = dev;
break; break;
} }
} }
...@@ -2426,7 +2409,6 @@ struct comedi_device *comedi_alloc_board_minor(struct device *hardware_device) ...@@ -2426,7 +2409,6 @@ struct comedi_device *comedi_alloc_board_minor(struct device *hardware_device)
mutex_unlock(&dev->mutex); mutex_unlock(&dev->mutex);
comedi_device_cleanup(dev); comedi_device_cleanup(dev);
kfree(dev); kfree(dev);
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 ERR_PTR(-EBUSY); return ERR_PTR(-EBUSY);
} }
...@@ -2443,22 +2425,22 @@ struct comedi_device *comedi_alloc_board_minor(struct device *hardware_device) ...@@ -2443,22 +2425,22 @@ struct comedi_device *comedi_alloc_board_minor(struct device *hardware_device)
static void comedi_free_board_minor(unsigned minor) static void comedi_free_board_minor(unsigned minor)
{ {
BUG_ON(minor >= COMEDI_NUM_BOARD_MINORS); BUG_ON(minor >= COMEDI_NUM_BOARD_MINORS);
comedi_free_board_file_info(comedi_clear_board_minor(minor)); comedi_free_board_dev(comedi_clear_board_minor(minor));
} }
void comedi_release_hardware_device(struct device *hardware_device) void comedi_release_hardware_device(struct device *hardware_device)
{ {
int minor; int minor;
struct comedi_file_info *info; struct comedi_device *dev;
for (minor = comedi_num_legacy_minors; minor < COMEDI_NUM_BOARD_MINORS; for (minor = comedi_num_legacy_minors; minor < COMEDI_NUM_BOARD_MINORS;
minor++) { minor++) {
mutex_lock(&comedi_board_minor_table_lock); mutex_lock(&comedi_board_minor_table_lock);
info = comedi_board_minor_table[minor]; dev = comedi_board_minor_table[minor];
if (info && info->device->hw_dev == hardware_device) { if (dev && dev->hw_dev == hardware_device) {
comedi_board_minor_table[minor] = NULL; comedi_board_minor_table[minor] = NULL;
mutex_unlock(&comedi_board_minor_table_lock); mutex_unlock(&comedi_board_minor_table_lock);
comedi_free_board_file_info(info); comedi_free_board_dev(dev);
break; break;
} }
mutex_unlock(&comedi_board_minor_table_lock); mutex_unlock(&comedi_board_minor_table_lock);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment