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) {
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);
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)
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;
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)
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)
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;
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)
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)
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;
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)
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)
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;
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)
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)
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);
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;
{
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)
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;
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;
void comedi_free_subdevice_minor(struct comedi_subdevice *s)
{
struct comedi_file_info *info;
+ unsigned int i;
if (s == NULL)
return;
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;