Skip to content

Commit

Permalink
usb: gadget: f_fs: add poll for endpoint 0
Browse files Browse the repository at this point in the history
This patch adds poll function for file representing ep0.

Ability of read from or write to ep0 file is related with actual state of ffs:
- When desctiptors or strings are not written yet, POLLOUT flag is set.
- If there is any event to read, POLLIN flag is set.
- If setup request was read, POLLIN and POLLOUT flag is set, to allow
  send response (by performing I/O operation consistent with setup request
  direction) or set stall (by performing I/O operation opposite  setup
  request direction).

Signed-off-by: Robert Baldyga <r.baldyga@samsung.com>
Acked-by: Michal Nazarewicz <mina86@mina86.com>
Signed-off-by: Felipe Balbi <balbi@ti.com>
  • Loading branch information
Robert Baldyga authored and Felipe Balbi committed Feb 18, 2014
1 parent 0a7b1f8 commit 23de91e
Showing 1 changed file with 42 additions and 0 deletions.
42 changes: 42 additions & 0 deletions drivers/usb/gadget/f_fs.c
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,8 @@
#include <linux/usb/composite.h>
#include <linux/usb/functionfs.h>

#include <linux/poll.h>

#include "u_fs.h"
#include "configfs.h"

Expand Down Expand Up @@ -570,6 +572,45 @@ static long ffs_ep0_ioctl(struct file *file, unsigned code, unsigned long value)
return ret;
}

static unsigned int ffs_ep0_poll(struct file *file, poll_table *wait)
{
struct ffs_data *ffs = file->private_data;
unsigned int mask = POLLWRNORM;
int ret;

poll_wait(file, &ffs->ev.waitq, wait);

ret = ffs_mutex_lock(&ffs->mutex, file->f_flags & O_NONBLOCK);
if (unlikely(ret < 0))
return mask;

switch (ffs->state) {
case FFS_READ_DESCRIPTORS:
case FFS_READ_STRINGS:
mask |= POLLOUT;
break;

case FFS_ACTIVE:
switch (ffs->setup_state) {
case FFS_NO_SETUP:
if (ffs->ev.count)
mask |= POLLIN;
break;

case FFS_SETUP_PENDING:
case FFS_SETUP_CANCELLED:
mask |= (POLLIN | POLLOUT);
break;
}
case FFS_CLOSING:
break;
}

mutex_unlock(&ffs->mutex);

return mask;
}

static const struct file_operations ffs_ep0_operations = {
.llseek = no_llseek,

Expand All @@ -578,6 +619,7 @@ static const struct file_operations ffs_ep0_operations = {
.read = ffs_ep0_read,
.release = ffs_ep0_release,
.unlocked_ioctl = ffs_ep0_ioctl,
.poll = ffs_ep0_poll,
};


Expand Down

0 comments on commit 23de91e

Please sign in to comment.