--- /dev/null
+From f3cd5b3c0d811db627b5018dc9eada0638487f12 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 4 Dec 2019 03:37:13 +0100
+Subject: HID: hidraw: Fix returning EPOLLOUT from hidraw_poll
+
+From: Marcel Holtmann <marcel@holtmann.org>
+
+[ Upstream commit 9f3b61dc1dd7b81e99e7ed23776bb64a35f39e1a ]
+
+When polling a connected /dev/hidrawX device, it is useful to get the
+EPOLLOUT when writing is possible. Since writing is possible as soon as
+the device is connected, always return it.
+
+Right now EPOLLOUT is only returned when there are also input reports
+are available. This works if devices start sending reports when
+connected, but some HID devices might need an output report first before
+sending any input reports. This change will allow using EPOLLOUT here as
+well.
+
+Fixes: 378b80370aa1 ("hidraw: Return EPOLLOUT from hidraw_poll")
+Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
+Cc: stable@vger.kernel.org
+Signed-off-by: Jiri Kosina <jkosina@suse.cz>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/hid/hidraw.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/hid/hidraw.c b/drivers/hid/hidraw.c
+index c75b66d58636..a025b6961896 100644
+--- a/drivers/hid/hidraw.c
++++ b/drivers/hid/hidraw.c
+@@ -260,10 +260,10 @@ static __poll_t hidraw_poll(struct file *file, poll_table *wait)
+
+ poll_wait(file, &list->hidraw->wait, wait);
+ if (list->head != list->tail)
+- return EPOLLIN | EPOLLRDNORM | EPOLLOUT;
++ return EPOLLIN | EPOLLRDNORM;
+ if (!list->hidraw->exist)
+ return EPOLLERR | EPOLLHUP;
+- return 0;
++ return EPOLLOUT | EPOLLWRNORM;
+ }
+
+ static int hidraw_open(struct inode *inode, struct file *file)
+--
+2.20.1
+
--- /dev/null
+From 8463233399307d149345276e9bf61229fd27f976 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 10 Jan 2020 15:32:51 +0100
+Subject: HID: hidraw, uhid: Always report EPOLLOUT
+
+From: Jiri Kosina <jkosina@suse.cz>
+
+[ Upstream commit 9e635c2851df6caee651e589fbf937b637973c91 ]
+
+hidraw and uhid device nodes are always available for writing so we should
+always report EPOLLOUT and EPOLLWRNORM bits, not only in the cases when
+there is nothing to read.
+
+Reported-by: Linus Torvalds <torvalds@linux-foundation.org>
+Fixes: be54e7461ffdc ("HID: uhid: Fix returning EPOLLOUT from uhid_char_poll")
+Fixes: 9f3b61dc1dd7b ("HID: hidraw: Fix returning EPOLLOUT from hidraw_poll")
+Signed-off-by: Jiri Kosina <jkosina@suse.cz>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/hid/hidraw.c | 7 ++++---
+ drivers/hid/uhid.c | 5 +++--
+ 2 files changed, 7 insertions(+), 5 deletions(-)
+
+diff --git a/drivers/hid/hidraw.c b/drivers/hid/hidraw.c
+index a025b6961896..c4ba2d28dd73 100644
+--- a/drivers/hid/hidraw.c
++++ b/drivers/hid/hidraw.c
+@@ -257,13 +257,14 @@ out:
+ static __poll_t hidraw_poll(struct file *file, poll_table *wait)
+ {
+ struct hidraw_list *list = file->private_data;
++ __poll_t mask = EPOLLOUT | EPOLLWRNORM; /* hidraw is always writable */
+
+ poll_wait(file, &list->hidraw->wait, wait);
+ if (list->head != list->tail)
+- return EPOLLIN | EPOLLRDNORM;
++ mask |= EPOLLIN | EPOLLRDNORM;
+ if (!list->hidraw->exist)
+- return EPOLLERR | EPOLLHUP;
+- return EPOLLOUT | EPOLLWRNORM;
++ mask |= EPOLLERR | EPOLLHUP;
++ return mask;
+ }
+
+ static int hidraw_open(struct inode *inode, struct file *file)
+diff --git a/drivers/hid/uhid.c b/drivers/hid/uhid.c
+index 8508dbac2657..29e63330c1b5 100644
+--- a/drivers/hid/uhid.c
++++ b/drivers/hid/uhid.c
+@@ -769,13 +769,14 @@ unlock:
+ static __poll_t uhid_char_poll(struct file *file, poll_table *wait)
+ {
+ struct uhid_device *uhid = file->private_data;
++ __poll_t mask = EPOLLOUT | EPOLLWRNORM; /* uhid is always writable */
+
+ poll_wait(file, &uhid->waitq, wait);
+
+ if (uhid->head != uhid->tail)
+- return EPOLLIN | EPOLLRDNORM;
++ mask |= EPOLLIN | EPOLLRDNORM;
+
+- return EPOLLOUT | EPOLLWRNORM;
++ return mask;
+ }
+
+ static const struct file_operations uhid_fops = {
+--
+2.20.1
+
--- /dev/null
+From 4b0bb801751ef1d2e2464336003bc34fd30678e8 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 9 Jul 2019 13:03:37 +0200
+Subject: hidraw: Return EPOLLOUT from hidraw_poll
+
+From: Fabian Henneke <fabian.henneke@gmail.com>
+
+[ Upstream commit 378b80370aa1fe50f9c48a3ac8af3e416e73b89f ]
+
+Always return EPOLLOUT from hidraw_poll when a device is connected.
+This is safe since writes are always possible (but will always block).
+
+hidraw does not support non-blocking writes and instead always calls
+blocking backend functions on write requests. Hence, so far, a call to
+poll never returned EPOLLOUT, which confuses tools like socat.
+
+Signed-off-by: Fabian Henneke <fabian.henneke@gmail.com>
+In-reply-to: <CA+hv5qkyis03CgYTWeWX9cr0my-d2Oe+aZo+mjmWRXgjrGqyrw@mail.gmail.com>
+Signed-off-by: Jiri Kosina <jkosina@suse.cz>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/hid/hidraw.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/hid/hidraw.c b/drivers/hid/hidraw.c
+index c7cff929b419..c75b66d58636 100644
+--- a/drivers/hid/hidraw.c
++++ b/drivers/hid/hidraw.c
+@@ -260,7 +260,7 @@ static __poll_t hidraw_poll(struct file *file, poll_table *wait)
+
+ poll_wait(file, &list->hidraw->wait, wait);
+ if (list->head != list->tail)
+- return EPOLLIN | EPOLLRDNORM;
++ return EPOLLIN | EPOLLRDNORM | EPOLLOUT;
+ if (!list->hidraw->exist)
+ return EPOLLERR | EPOLLHUP;
+ return 0;
+--
+2.20.1
+
--- /dev/null
+hidraw-return-epollout-from-hidraw_poll.patch
+hid-hidraw-fix-returning-epollout-from-hidraw_poll.patch
+hid-hidraw-uhid-always-report-epollout.patch