From c83d8445f3b6272f712494e0ab2124c000903811 Mon Sep 17 00:00:00 2001 From: Ovidiu Panait Date: Sat, 27 Dec 2025 23:26:33 +0200 Subject: [PATCH] staging: axis-fifo: Add poll() support 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 Link: https://patch.msgid.link/20251227212640.3321310-2-ovidiu.panait.oss@gmail.com Signed-off-by: Greg Kroah-Hartman --- drivers/staging/axis-fifo/axis-fifo.c | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/drivers/staging/axis-fifo/axis-fifo.c b/drivers/staging/axis-fifo/axis-fifo.c index b2a9f5542fc1..b9b2700410b8 100644 --- a/drivers/staging/axis-fifo/axis-fifo.c +++ b/drivers/staging/axis-fifo/axis-fifo.c @@ -32,6 +32,7 @@ #include #include #include +#include /* ---------------------------- * 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) -- 2.47.3