OSDN Git Service

ALSA: line6: Add poll callback for hwdep
authorVasily Khoruzhick <anarsoul@gmail.com>
Sat, 2 May 2020 19:31:20 +0000 (12:31 -0700)
committerTakashi Iwai <tiwai@suse.de>
Sat, 2 May 2020 20:31:32 +0000 (22:31 +0200)
At least POD HD500 uses message-based communication, both sides can
send messages. Add poll callback so application can wait for device
messages without using busy loop.

Signed-off-by: Vasily Khoruzhick <anarsoul@gmail.com>
Link: https://lore.kernel.org/r/20200502193120.79115-3-anarsoul@gmail.com
Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/usb/line6/driver.c

index 86adf87..7629116 100644 (file)
@@ -630,11 +630,27 @@ line6_hwdep_write(struct snd_hwdep *hwdep, const char __user *data, long count,
        return rv;
 }
 
+static __poll_t
+line6_hwdep_poll(struct snd_hwdep *hwdep, struct file *file, poll_table *wait)
+{
+       __poll_t rv;
+       struct usb_line6 *line6 = hwdep->private_data;
+
+       poll_wait(file, &line6->messages.wait_queue, wait);
+
+       mutex_lock(&line6->messages.read_lock);
+       rv = kfifo_len(&line6->messages.fifo) == 0 ? 0 : EPOLLIN | EPOLLRDNORM;
+       mutex_unlock(&line6->messages.read_lock);
+
+       return rv;
+}
+
 static const struct snd_hwdep_ops hwdep_ops = {
        .open    = line6_hwdep_open,
        .release = line6_hwdep_release,
        .read    = line6_hwdep_read,
        .write   = line6_hwdep_write,
+       .poll    = line6_hwdep_poll,
 };
 
 /* Insert into circular buffer */