diff options
author | Jiri Slaby <jirislaby@gmail.com> | 2008-04-29 03:59:14 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2008-04-29 11:06:02 -0400 |
commit | 7d4f9f094b0a01ba199f97cd4a5f5609391a04f9 (patch) | |
tree | a7eaaafa99a7e8b46a80f41afda61221902d1004 /drivers/misc/phantom.c | |
parent | 7e4e8e689fe90dd94bd76f9706d6cce580941ed5 (diff) |
Misc, phantom, fix poll
Return ERR even if there are pending data, but hw is not running. Do not
decrement count in poll, do it in ioctl, where data are actually read.
Signed-off-by: Jiri Slaby <jirislaby@gmail.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'drivers/misc/phantom.c')
-rw-r--r-- | drivers/misc/phantom.c | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/drivers/misc/phantom.c b/drivers/misc/phantom.c index 5447a603686a..71d1c84e2fa8 100644 --- a/drivers/misc/phantom.c +++ b/drivers/misc/phantom.c | |||
@@ -169,6 +169,7 @@ static long phantom_ioctl(struct file *file, unsigned int cmd, | |||
169 | for (i = 0; i < m; i++) | 169 | for (i = 0; i < m; i++) |
170 | if (rs.mask & BIT(i)) | 170 | if (rs.mask & BIT(i)) |
171 | rs.values[i] = ioread32(dev->iaddr + i); | 171 | rs.values[i] = ioread32(dev->iaddr + i); |
172 | atomic_set(&dev->counter, 0); | ||
172 | spin_unlock_irqrestore(&dev->regs_lock, flags); | 173 | spin_unlock_irqrestore(&dev->regs_lock, flags); |
173 | 174 | ||
174 | if (copy_to_user(argp, &rs, sizeof(rs))) | 175 | if (copy_to_user(argp, &rs, sizeof(rs))) |
@@ -254,11 +255,12 @@ static unsigned int phantom_poll(struct file *file, poll_table *wait) | |||
254 | 255 | ||
255 | pr_debug("phantom_poll: %d\n", atomic_read(&dev->counter)); | 256 | pr_debug("phantom_poll: %d\n", atomic_read(&dev->counter)); |
256 | poll_wait(file, &dev->wait, wait); | 257 | poll_wait(file, &dev->wait, wait); |
257 | if (atomic_read(&dev->counter)) { | 258 | |
259 | if (!(dev->status & PHB_RUNNING)) | ||
260 | mask = POLLERR; | ||
261 | else if (atomic_read(&dev->counter)) | ||
258 | mask = POLLIN | POLLRDNORM; | 262 | mask = POLLIN | POLLRDNORM; |
259 | atomic_dec(&dev->counter); | 263 | |
260 | } else if ((dev->status & PHB_RUNNING) == 0) | ||
261 | mask = POLLIN | POLLRDNORM | POLLERR; | ||
262 | pr_debug("phantom_poll end: %x/%d\n", mask, atomic_read(&dev->counter)); | 264 | pr_debug("phantom_poll end: %x/%d\n", mask, atomic_read(&dev->counter)); |
263 | 265 | ||
264 | return mask; | 266 | return mask; |