]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
staging: axis-fifo: Add poll() support
authorOvidiu Panait <ovidiu.panait.oss@gmail.com>
Sat, 27 Dec 2025 21:26:33 +0000 (23:26 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sun, 11 Jan 2026 12:54:11 +0000 (13:54 +0100)
Implement poll() file operation to allow userspace applications to
wait for FIFO readiness using select()/poll()/epoll().

This replaces the module parameter-based timeouts removed in the
previous commit.

Signed-off-by: Ovidiu Panait <ovidiu.panait.oss@gmail.com>
Link: https://patch.msgid.link/20251227212640.3321310-2-ovidiu.panait.oss@gmail.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/staging/axis-fifo/axis-fifo.c

index b2a9f5542fc1cc6d527f6d140bb319c517508e5c..b9b2700410b86c9d5adb233cac11e3f10ccd1534 100644 (file)
@@ -32,6 +32,7 @@
 #include <linux/jiffies.h>
 #include <linux/miscdevice.h>
 #include <linux/debugfs.h>
+#include <linux/poll.h>
 
 /* ----------------------------
  *       driver parameters
@@ -345,6 +346,28 @@ end_unlock:
        return ret;
 }
 
+static __poll_t axis_fifo_poll(struct file *f, poll_table *wait)
+{
+       struct axis_fifo *fifo = f->private_data;
+       __poll_t mask = 0;
+
+       if (fifo->has_rx_fifo) {
+               poll_wait(f, &fifo->read_queue, wait);
+
+               if (ioread32(fifo->base_addr + XLLF_RDFO_OFFSET))
+                       mask |= EPOLLIN | EPOLLRDNORM;
+       }
+
+       if (fifo->has_tx_fifo) {
+               poll_wait(f, &fifo->write_queue, wait);
+
+               if (ioread32(fifo->base_addr + XLLF_TDFV_OFFSET))
+                       mask |= EPOLLOUT | EPOLLWRNORM;
+       }
+
+       return mask;
+}
+
 static irqreturn_t axis_fifo_irq(int irq, void *dw)
 {
        struct axis_fifo *fifo = dw;
@@ -410,7 +433,8 @@ static const struct file_operations fops = {
        .open = axis_fifo_open,
        .release = axis_fifo_close,
        .read = axis_fifo_read,
-       .write = axis_fifo_write
+       .write = axis_fifo_write,
+       .poll = axis_fifo_poll,
 };
 
 static int axis_fifo_debugfs_regs_show(struct seq_file *m, void *p)