From: Nicolas Dandrimont <nicolas@dandrimont.eu>
Date: Thu, 26 May 2022 22:17:33 +0200
Subject: Add a suffix to the video device name when no capture capability is
 detected

Recent versions of the linux kernel generate multiple device nodes for
each uvcvideo capture card. The HDMI2USB-generated video symlinks end up
stomping on one another until the last one wins.

Recent versions of udev's id_v4l script add a ID_V4L_CAPABILITIES
variable that we can use to distinguish both devices. We give the
metadata device a `-metadata` suffix to distinguish it from the capture
node.

Origin: https://github.com/litex-hub/litex-buildenv-udev/pull/9
Bug-Debian: https://bugs.debian.org/1011938
---
 udev/99-hdmi2usb-aliases.rules | 15 ++++++++++-----
 1 file changed, 10 insertions(+), 5 deletions(-)

diff --git a/udev/99-hdmi2usb-aliases.rules b/udev/99-hdmi2usb-aliases.rules
index 8ae7f48..e0863ca 100644
--- a/udev/99-hdmi2usb-aliases.rules
+++ b/udev/99-hdmi2usb-aliases.rules
@@ -119,17 +119,22 @@ SUBSYSTEM=="tty", ENV{ID_HDMI2USB}=="1", ENV{NUM_HDMI2USB_TTY}!="", ENV{NUM_HDMI
 	SYMLINK+="hdmi2usb/by-num/$env{ID_HDMI2USB_BOARD}$env{NUM_HDMI2USB_BOARD}/tty$env{NUM_HDMI2USB_TTY}"
 
 # Video capture device
+SUBSYSTEM=="video4linux", ENV{ID_HDMI2USB}=="1", ENV{ID_V4L_CAPABILITIES}=="*:capture:*" \
+    ENV{HDMI2USB_VIDEO_SUFFIX}:=""
+SUBSYSTEM=="video4linux", ENV{ID_HDMI2USB}=="1", ENV{ID_V4L_CAPABILITIES}!="*:capture:*" \
+    ENV{HDMI2USB_VIDEO_SUFFIX}:="-metadata"
+
 SUBSYSTEM=="video4linux", ENV{ID_HDMI2USB}=="1", ENV{ID_SERIAL_SHORT}!="" \
-	SYMLINK+="hdmi2usb/by-serial/$env{ID_SERIAL_SHORT}/video"
+	SYMLINK+="hdmi2usb/by-serial/$env{ID_SERIAL_SHORT}/video$env{HDMI2USB_VIDEO_SUFFIX}"
 
 SUBSYSTEM=="video4linux", ENV{ID_HDMI2USB}=="1", ENV{ID_PATH}!="" \
-	SYMLINK+="hdmi2usb/by-path/$env{ID_PATH}/video"
+	SYMLINK+="hdmi2usb/by-path/$env{ID_PATH}/video$env{HDMI2USB_VIDEO_SUFFIX}"
 
 SUBSYSTEM=="video4linux", ENV{ID_HDMI2USB}=="1", ENV{ID_PATH_HUMAN}!="" \
-	SYMLINK+="hdmi2usb/by-path/$env{ID_PATH_HUMAN}/video"
+	SYMLINK+="hdmi2usb/by-path/$env{ID_PATH_HUMAN}/video$env{HDMI2USB_VIDEO_SUFFIX}"
 
 SUBSYSTEM=="video4linux", ENV{ID_HDMI2USB}=="1", ENV{NUM_HDMI2USB}!="" \
-	SYMLINK+="hdmi2usb/by-num/all$env{NUM_HDMI2USB}/video"
+	SYMLINK+="hdmi2usb/by-num/all$env{NUM_HDMI2USB}/video$env{HDMI2USB_VIDEO_SUFFIX}"
 
 SUBSYSTEM=="video4linux", ENV{ID_HDMI2USB}=="1", ENV{ID_HDMI2USB_BOARD}!="", ENV{NUM_HDMI2USB_BOARD}!="" \
-	SYMLINK+="hdmi2usb/by-num/$env{ID_HDMI2USB_BOARD}$env{NUM_HDMI2USB_BOARD}/video"
+	SYMLINK+="hdmi2usb/by-num/$env{ID_HDMI2USB_BOARD}$env{NUM_HDMI2USB_BOARD}/video$env{HDMI2USB_VIDEO_SUFFIX}"
