Commit eb6b92ec authored by Dave Penkler's avatar Dave Penkler Committed by Greg Kroah-Hartman

Add support for receiving USBTMC USB488 SRQ notifications via poll/select

Background:
In many situations operations on multiple instruments need to be
synchronized. poll/select provide a convenient way of waiting on a
number of different instruments and other peripherals
simultaneously.
Signed-off-by: default avatarDave Penkler <dpenkler@gmail.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 82ed3381
...@@ -27,6 +27,7 @@ ...@@ -27,6 +27,7 @@
#include <linux/uaccess.h> #include <linux/uaccess.h>
#include <linux/kref.h> #include <linux/kref.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/poll.h>
#include <linux/mutex.h> #include <linux/mutex.h>
#include <linux/usb.h> #include <linux/usb.h>
#include <linux/usb/tmc.h> #include <linux/usb/tmc.h>
...@@ -1184,6 +1185,27 @@ static int usbtmc_fasync(int fd, struct file *file, int on) ...@@ -1184,6 +1185,27 @@ static int usbtmc_fasync(int fd, struct file *file, int on)
return fasync_helper(fd, file, on, &data->fasync); return fasync_helper(fd, file, on, &data->fasync);
} }
static unsigned int usbtmc_poll(struct file *file, poll_table *wait)
{
struct usbtmc_device_data *data = file->private_data;
unsigned int mask;
mutex_lock(&data->io_mutex);
if (data->zombie) {
mask = POLLHUP | POLLERR;
goto no_poll;
}
poll_wait(file, &data->waitq, wait);
mask = (atomic_read(&data->srq_asserted)) ? POLLIN | POLLRDNORM : 0;
no_poll:
mutex_unlock(&data->io_mutex);
return mask;
}
static const struct file_operations fops = { static const struct file_operations fops = {
.owner = THIS_MODULE, .owner = THIS_MODULE,
.read = usbtmc_read, .read = usbtmc_read,
...@@ -1192,6 +1214,7 @@ static const struct file_operations fops = { ...@@ -1192,6 +1214,7 @@ static const struct file_operations fops = {
.release = usbtmc_release, .release = usbtmc_release,
.unlocked_ioctl = usbtmc_ioctl, .unlocked_ioctl = usbtmc_ioctl,
.fasync = usbtmc_fasync, .fasync = usbtmc_fasync,
.poll = usbtmc_poll,
.llseek = default_llseek, .llseek = default_llseek,
}; };
......
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