Skip to content

Commit

Permalink
Add support for receiving USBTMC USB488 SRQ notifications via poll/se…
Browse files Browse the repository at this point in the history
…lect

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: Dave Penkler <dpenkler@gmail.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
  • Loading branch information
Dave Penkler authored and Greg Kroah-Hartman committed Feb 3, 2016
1 parent 82ed338 commit eb6b92e
Showing 1 changed file with 23 additions and 0 deletions.
23 changes: 23 additions & 0 deletions drivers/usb/class/usbtmc.c
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
#include <linux/uaccess.h>
#include <linux/kref.h>
#include <linux/slab.h>
#include <linux/poll.h>
#include <linux/mutex.h>
#include <linux/usb.h>
#include <linux/usb/tmc.h>
Expand Down Expand Up @@ -1184,6 +1185,27 @@ static int usbtmc_fasync(int fd, struct file *file, int on)
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 = {
.owner = THIS_MODULE,
.read = usbtmc_read,
Expand All @@ -1192,6 +1214,7 @@ static const struct file_operations fops = {
.release = usbtmc_release,
.unlocked_ioctl = usbtmc_ioctl,
.fasync = usbtmc_fasync,
.poll = usbtmc_poll,
.llseek = default_llseek,
};

Expand Down

0 comments on commit eb6b92e

Please sign in to comment.