--- /dev/null
+From aae7c4a48d7ec0086c5d0b0cd843ca8b039937fa Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 26 May 2025 17:07:48 +0300
+Subject: ALSA: usb-audio: Add mixer quirk for Sony DualSense PS5
+
+From: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+
+[ Upstream commit 79d561c4ec0497669f19a9550cfb74812f60938b ]
+
+The Sony DualSense wireless controller (PS5) features an internal mono
+speaker, but it also provides a 3.5mm jack socket for headphone output
+and headset microphone input.
+
+Since this is a UAC1 device, it doesn't advertise any jack detection
+capability. However, the controller is able to report HP & MIC insert
+events via HID, i.e. through a dedicated input device managed by the
+hid-playstation driver.
+
+Add a quirk to create the jack controls for headphone and headset mic,
+respectively, and setup an input handler for each of them in order to
+intercept the related hotplug events.
+
+Signed-off-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Link: https://patch.msgid.link/20250526-dualsense-alsa-jack-v1-9-1a821463b632@collabora.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/mixer_quirks.c | 263 +++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 263 insertions(+)
+
+diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
+index 29ef56323a7a2..ec338a85f3ec4 100644
+--- a/sound/usb/mixer_quirks.c
++++ b/sound/usb/mixer_quirks.c
+@@ -16,6 +16,7 @@
+
+ #include <linux/hid.h>
+ #include <linux/init.h>
++#include <linux/input.h>
+ #include <linux/math64.h>
+ #include <linux/slab.h>
+ #include <linux/usb.h>
+@@ -527,6 +528,263 @@ static int snd_emu0204_controls_create(struct usb_mixer_interface *mixer)
+ &snd_emu0204_control, NULL);
+ }
+
++/*
++ * Sony DualSense controller (PS5) jack detection
++ *
++ * Since this is an UAC 1 device, it doesn't support jack detection.
++ * However, the controller hid-playstation driver reports HP & MIC
++ * insert events through a dedicated input device.
++ */
++
++#define SND_DUALSENSE_JACK_OUT_TERM_ID 3
++#define SND_DUALSENSE_JACK_IN_TERM_ID 4
++
++struct dualsense_mixer_elem_info {
++ struct usb_mixer_elem_info info;
++ struct input_handler ih;
++ struct input_device_id id_table[2];
++ bool connected;
++};
++
++static void snd_dualsense_ih_event(struct input_handle *handle,
++ unsigned int type, unsigned int code,
++ int value)
++{
++ struct dualsense_mixer_elem_info *mei;
++ struct usb_mixer_elem_list *me;
++
++ if (type != EV_SW)
++ return;
++
++ mei = container_of(handle->handler, struct dualsense_mixer_elem_info, ih);
++ me = &mei->info.head;
++
++ if ((me->id == SND_DUALSENSE_JACK_OUT_TERM_ID && code == SW_HEADPHONE_INSERT) ||
++ (me->id == SND_DUALSENSE_JACK_IN_TERM_ID && code == SW_MICROPHONE_INSERT)) {
++ mei->connected = !!value;
++ snd_ctl_notify(me->mixer->chip->card, SNDRV_CTL_EVENT_MASK_VALUE,
++ &me->kctl->id);
++ }
++}
++
++static bool snd_dualsense_ih_match(struct input_handler *handler,
++ struct input_dev *dev)
++{
++ struct dualsense_mixer_elem_info *mei;
++ struct usb_device *snd_dev;
++ char *input_dev_path, *usb_dev_path;
++ size_t usb_dev_path_len;
++ bool match = false;
++
++ mei = container_of(handler, struct dualsense_mixer_elem_info, ih);
++ snd_dev = mei->info.head.mixer->chip->dev;
++
++ input_dev_path = kobject_get_path(&dev->dev.kobj, GFP_KERNEL);
++ if (!input_dev_path) {
++ dev_warn(&snd_dev->dev, "Failed to get input dev path\n");
++ return false;
++ }
++
++ usb_dev_path = kobject_get_path(&snd_dev->dev.kobj, GFP_KERNEL);
++ if (!usb_dev_path) {
++ dev_warn(&snd_dev->dev, "Failed to get USB dev path\n");
++ goto free_paths;
++ }
++
++ /*
++ * Ensure the VID:PID matched input device supposedly owned by the
++ * hid-playstation driver belongs to the actual hardware handled by
++ * the current USB audio device, which implies input_dev_path being
++ * a subpath of usb_dev_path.
++ *
++ * This verification is necessary when there is more than one identical
++ * controller attached to the host system.
++ */
++ usb_dev_path_len = strlen(usb_dev_path);
++ if (usb_dev_path_len >= strlen(input_dev_path))
++ goto free_paths;
++
++ usb_dev_path[usb_dev_path_len] = '/';
++ match = !memcmp(input_dev_path, usb_dev_path, usb_dev_path_len + 1);
++
++free_paths:
++ kfree(input_dev_path);
++ kfree(usb_dev_path);
++
++ return match;
++}
++
++static int snd_dualsense_ih_connect(struct input_handler *handler,
++ struct input_dev *dev,
++ const struct input_device_id *id)
++{
++ struct input_handle *handle;
++ int err;
++
++ handle = kzalloc(sizeof(*handle), GFP_KERNEL);
++ if (!handle)
++ return -ENOMEM;
++
++ handle->dev = dev;
++ handle->handler = handler;
++ handle->name = handler->name;
++
++ err = input_register_handle(handle);
++ if (err)
++ goto err_free;
++
++ err = input_open_device(handle);
++ if (err)
++ goto err_unregister;
++
++ return 0;
++
++err_unregister:
++ input_unregister_handle(handle);
++err_free:
++ kfree(handle);
++ return err;
++}
++
++static void snd_dualsense_ih_disconnect(struct input_handle *handle)
++{
++ input_close_device(handle);
++ input_unregister_handle(handle);
++ kfree(handle);
++}
++
++static void snd_dualsense_ih_start(struct input_handle *handle)
++{
++ struct dualsense_mixer_elem_info *mei;
++ struct usb_mixer_elem_list *me;
++ int status = -1;
++
++ mei = container_of(handle->handler, struct dualsense_mixer_elem_info, ih);
++ me = &mei->info.head;
++
++ if (me->id == SND_DUALSENSE_JACK_OUT_TERM_ID &&
++ test_bit(SW_HEADPHONE_INSERT, handle->dev->swbit))
++ status = test_bit(SW_HEADPHONE_INSERT, handle->dev->sw);
++ else if (me->id == SND_DUALSENSE_JACK_IN_TERM_ID &&
++ test_bit(SW_MICROPHONE_INSERT, handle->dev->swbit))
++ status = test_bit(SW_MICROPHONE_INSERT, handle->dev->sw);
++
++ if (status >= 0) {
++ mei->connected = !!status;
++ snd_ctl_notify(me->mixer->chip->card, SNDRV_CTL_EVENT_MASK_VALUE,
++ &me->kctl->id);
++ }
++}
++
++static int snd_dualsense_jack_get(struct snd_kcontrol *kctl,
++ struct snd_ctl_elem_value *ucontrol)
++{
++ struct dualsense_mixer_elem_info *mei = snd_kcontrol_chip(kctl);
++
++ ucontrol->value.integer.value[0] = mei->connected;
++
++ return 0;
++}
++
++static const struct snd_kcontrol_new snd_dualsense_jack_control = {
++ .iface = SNDRV_CTL_ELEM_IFACE_CARD,
++ .access = SNDRV_CTL_ELEM_ACCESS_READ,
++ .info = snd_ctl_boolean_mono_info,
++ .get = snd_dualsense_jack_get,
++};
++
++static int snd_dualsense_resume_jack(struct usb_mixer_elem_list *list)
++{
++ snd_ctl_notify(list->mixer->chip->card, SNDRV_CTL_EVENT_MASK_VALUE,
++ &list->kctl->id);
++ return 0;
++}
++
++static void snd_dualsense_mixer_elem_free(struct snd_kcontrol *kctl)
++{
++ struct dualsense_mixer_elem_info *mei = snd_kcontrol_chip(kctl);
++
++ if (mei->ih.event)
++ input_unregister_handler(&mei->ih);
++
++ snd_usb_mixer_elem_free(kctl);
++}
++
++static int snd_dualsense_jack_create(struct usb_mixer_interface *mixer,
++ const char *name, bool is_output)
++{
++ struct dualsense_mixer_elem_info *mei;
++ struct input_device_id *idev_id;
++ struct snd_kcontrol *kctl;
++ int err;
++
++ mei = kzalloc(sizeof(*mei), GFP_KERNEL);
++ if (!mei)
++ return -ENOMEM;
++
++ snd_usb_mixer_elem_init_std(&mei->info.head, mixer,
++ is_output ? SND_DUALSENSE_JACK_OUT_TERM_ID :
++ SND_DUALSENSE_JACK_IN_TERM_ID);
++
++ mei->info.head.resume = snd_dualsense_resume_jack;
++ mei->info.val_type = USB_MIXER_BOOLEAN;
++ mei->info.channels = 1;
++ mei->info.min = 0;
++ mei->info.max = 1;
++
++ kctl = snd_ctl_new1(&snd_dualsense_jack_control, mei);
++ if (!kctl) {
++ kfree(mei);
++ return -ENOMEM;
++ }
++
++ strscpy(kctl->id.name, name, sizeof(kctl->id.name));
++ kctl->private_free = snd_dualsense_mixer_elem_free;
++
++ err = snd_usb_mixer_add_control(&mei->info.head, kctl);
++ if (err)
++ return err;
++
++ idev_id = &mei->id_table[0];
++ idev_id->flags = INPUT_DEVICE_ID_MATCH_VENDOR | INPUT_DEVICE_ID_MATCH_PRODUCT |
++ INPUT_DEVICE_ID_MATCH_EVBIT | INPUT_DEVICE_ID_MATCH_SWBIT;
++ idev_id->vendor = USB_ID_VENDOR(mixer->chip->usb_id);
++ idev_id->product = USB_ID_PRODUCT(mixer->chip->usb_id);
++ idev_id->evbit[BIT_WORD(EV_SW)] = BIT_MASK(EV_SW);
++ if (is_output)
++ idev_id->swbit[BIT_WORD(SW_HEADPHONE_INSERT)] = BIT_MASK(SW_HEADPHONE_INSERT);
++ else
++ idev_id->swbit[BIT_WORD(SW_MICROPHONE_INSERT)] = BIT_MASK(SW_MICROPHONE_INSERT);
++
++ mei->ih.event = snd_dualsense_ih_event;
++ mei->ih.match = snd_dualsense_ih_match;
++ mei->ih.connect = snd_dualsense_ih_connect,
++ mei->ih.disconnect = snd_dualsense_ih_disconnect,
++ mei->ih.start = snd_dualsense_ih_start,
++ mei->ih.name = name;
++ mei->ih.id_table = mei->id_table;
++
++ err = input_register_handler(&mei->ih);
++ if (err) {
++ dev_warn(&mixer->chip->dev->dev,
++ "Could not register input handler: %d\n", err);
++ mei->ih.event = NULL;
++ }
++
++ return 0;
++}
++
++static int snd_dualsense_controls_create(struct usb_mixer_interface *mixer)
++{
++ int err;
++
++ err = snd_dualsense_jack_create(mixer, "Headphone Jack", true);
++ if (err < 0)
++ return err;
++
++ return snd_dualsense_jack_create(mixer, "Headset Mic Jack", false);
++}
++
+ /* ASUS Xonar U1 / U3 controls */
+
+ static int snd_xonar_u1_switch_get(struct snd_kcontrol *kcontrol,
+@@ -3130,6 +3388,11 @@ int snd_usb_mixer_apply_create_quirk(struct usb_mixer_interface *mixer)
+ err = snd_emu0204_controls_create(mixer);
+ break;
+
++ case USB_ID(0x054c, 0x0ce6): /* Sony DualSense controller (PS5) */
++ case USB_ID(0x054c, 0x0df2): /* Sony DualSense Edge controller (PS5) */
++ err = snd_dualsense_controls_create(mixer);
++ break;
++
+ case USB_ID(0x0763, 0x2030): /* M-Audio Fast Track C400 */
+ case USB_ID(0x0763, 0x2031): /* M-Audio Fast Track C400 */
+ err = snd_c400_create_mixer(mixer);
+--
+2.51.0
+
--- /dev/null
+From 2ebef1c6f533eec70e0322bf794d211d4436903d Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 26 May 2025 17:07:45 +0300
+Subject: ALSA: usb-audio: Avoid multiple assignments in mixer_quirks
+
+From: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+
+[ Upstream commit 03ddd3bdb94df3edb1f2408b57cfb00b3d92a208 ]
+
+Handle report from checkpatch.pl:
+
+ CHECK: multiple assignments should be avoided
+
+Signed-off-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Link: https://patch.msgid.link/20250526-dualsense-alsa-jack-v1-6-1a821463b632@collabora.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/mixer_quirks.c | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
+index 8a84e89890772..715b0922243c1 100644
+--- a/sound/usb/mixer_quirks.c
++++ b/sound/usb/mixer_quirks.c
+@@ -1593,7 +1593,8 @@ static int snd_microii_spdif_default_put(struct snd_kcontrol *kcontrol,
+ unsigned int pval, pval_old;
+ int err;
+
+- pval = pval_old = kcontrol->private_value;
++ pval = kcontrol->private_value;
++ pval_old = pval;
+ pval &= 0xfffff0f0;
+ pval |= (ucontrol->value.iec958.status[1] & 0x0f) << 8;
+ pval |= (ucontrol->value.iec958.status[0] & 0x0f);
+--
+2.51.0
+
--- /dev/null
+From 6006635713f5f390520b3cd45d2a08019562c6d6 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 12 Jun 2025 14:02:28 +0800
+Subject: ALSA: usb-audio: Convert comma to semicolon
+
+From: Chen Ni <nichen@iscas.ac.cn>
+
+[ Upstream commit 9ca30a1b007d5fefb5752428f852a2d8d7219c1c ]
+
+Replace comma between expressions with semicolons.
+
+Using a ',' in place of a ';' can have unintended side effects.
+Although that is not the case here, it is seems best to use ';'
+unless ',' is intended.
+
+Found by inspection.
+No functional change intended.
+Compile tested only.
+
+Fixes: 79d561c4ec04 ("ALSA: usb-audio: Add mixer quirk for Sony DualSense PS5")
+Signed-off-by: Chen Ni <nichen@iscas.ac.cn>
+Reviewed-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+Link: https://patch.msgid.link/20250612060228.1518028-1-nichen@iscas.ac.cn
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/mixer_quirks.c | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
+index ec338a85f3ec4..b3afa7b26b9cd 100644
+--- a/sound/usb/mixer_quirks.c
++++ b/sound/usb/mixer_quirks.c
+@@ -758,9 +758,9 @@ static int snd_dualsense_jack_create(struct usb_mixer_interface *mixer,
+
+ mei->ih.event = snd_dualsense_ih_event;
+ mei->ih.match = snd_dualsense_ih_match;
+- mei->ih.connect = snd_dualsense_ih_connect,
+- mei->ih.disconnect = snd_dualsense_ih_disconnect,
+- mei->ih.start = snd_dualsense_ih_start,
++ mei->ih.connect = snd_dualsense_ih_connect;
++ mei->ih.disconnect = snd_dualsense_ih_disconnect;
++ mei->ih.start = snd_dualsense_ih_start;
+ mei->ih.name = name;
+ mei->ih.id_table = mei->id_table;
+
+--
+2.51.0
+
--- /dev/null
+From bb184cf188384db8adb08b80725688e5c20866b2 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 26 May 2025 17:07:44 +0300
+Subject: ALSA: usb-audio: Drop unnecessary parentheses in mixer_quirks
+
+From: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+
+[ Upstream commit c0495cef8b43ad61efbd4019e3573742e0e63c67 ]
+
+Fix multiple 'CHECK: Unnecessary parentheses around ...' reports from
+checkpatch.pl.
+
+Signed-off-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Link: https://patch.msgid.link/20250526-dualsense-alsa-jack-v1-5-1a821463b632@collabora.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/mixer_quirks.c | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
+index 14b0a91c19d34..8a84e89890772 100644
+--- a/sound/usb/mixer_quirks.c
++++ b/sound/usb/mixer_quirks.c
+@@ -376,10 +376,10 @@ static int snd_audigy2nx_controls_create(struct usb_mixer_interface *mixer)
+ struct snd_kcontrol_new knew;
+
+ /* USB X-Fi S51 doesn't have a CMSS LED */
+- if ((mixer->chip->usb_id == USB_ID(0x041e, 0x3042)) && i == 0)
++ if (mixer->chip->usb_id == USB_ID(0x041e, 0x3042) && i == 0)
+ continue;
+ /* USB X-Fi S51 Pro doesn't have one either */
+- if ((mixer->chip->usb_id == USB_ID(0x041e, 0x30df)) && i == 0)
++ if (mixer->chip->usb_id == USB_ID(0x041e, 0x30df) && i == 0)
+ continue;
+ if (i > 1 && /* Live24ext has 2 LEDs only */
+ (mixer->chip->usb_id == USB_ID(0x041e, 0x3040) ||
+@@ -3012,7 +3012,7 @@ static int snd_djm_controls_update(struct usb_mixer_interface *mixer,
+ int err;
+ const struct snd_djm_device *device = &snd_djm_devices[device_idx];
+
+- if ((group >= device->ncontrols) || value >= device->controls[group].noptions)
++ if (group >= device->ncontrols || value >= device->controls[group].noptions)
+ return -EINVAL;
+
+ err = snd_usb_lock_shutdown(mixer->chip);
+--
+2.51.0
+
--- /dev/null
+From 9c97f4c5d9d4f471f95b7e82fb7e15fd73a467c1 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 26 May 2025 17:07:43 +0300
+Subject: ALSA: usb-audio: Fix block comments in mixer_quirks
+
+From: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+
+[ Upstream commit 231225d8a20f8668b4fd6601d54a2fac0e0ab7a5 ]
+
+Address a couple of comment formatting issues indicated by
+checkpatch.pl:
+
+ WARNING: Block comments use a trailing */ on a separate line
+
+Signed-off-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Link: https://patch.msgid.link/20250526-dualsense-alsa-jack-v1-4-1a821463b632@collabora.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/mixer_quirks.c | 6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
+
+diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
+index 866b5470f84bd..14b0a91c19d34 100644
+--- a/sound/usb/mixer_quirks.c
++++ b/sound/usb/mixer_quirks.c
+@@ -76,7 +76,8 @@ static int snd_create_std_mono_ctl_offset(struct usb_mixer_interface *mixer,
+ cval->idx_off = idx_off;
+
+ /* get_min_max() is called only for integer volumes later,
+- * so provide a short-cut for booleans */
++ * so provide a short-cut for booleans
++ */
+ cval->min = 0;
+ cval->max = 1;
+ cval->res = 0;
+@@ -3267,7 +3268,8 @@ static void snd_dragonfly_quirk_db_scale(struct usb_mixer_interface *mixer,
+ struct snd_kcontrol *kctl)
+ {
+ /* Approximation using 10 ranges based on output measurement on hw v1.2.
+- * This seems close to the cubic mapping e.g. alsamixer uses. */
++ * This seems close to the cubic mapping e.g. alsamixer uses.
++ */
+ static const DECLARE_TLV_DB_RANGE(scale,
+ 0, 1, TLV_DB_MINMAX_ITEM(-5300, -4970),
+ 2, 5, TLV_DB_MINMAX_ITEM(-4710, -4160),
+--
+2.51.0
+
--- /dev/null
+From 82ea2e8dbf99058ffb3fbe7176aa07ef135ec718 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 13 Jun 2025 10:15:30 +0200
+Subject: ALSA: usb-audio: Fix build with CONFIG_INPUT=n
+
+From: Takashi Iwai <tiwai@suse.de>
+
+[ Upstream commit d0630a0b80c08530857146e3bf183a7d6b743847 ]
+
+The recent addition of DualSense mixer quirk relies on the input
+device handle, and the build can fail if CONFIG_INPUT isn't set.
+Put (rather ugly) workarounds to wrap with IS_REACHABLE() for avoiding
+the build error.
+
+Fixes: 79d561c4ec04 ("ALSA: usb-audio: Add mixer quirk for Sony DualSense PS5")
+Reported-by: kernel test robot <lkp@intel.com>
+Closes: https://lore.kernel.org/oe-kbuild-all/202506130733.gnPKw2l3-lkp@intel.com/
+Reviewed-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+Link: https://patch.msgid.link/20250613081543.7404-1-tiwai@suse.de
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/mixer_quirks.c | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
+index b3afa7b26b9cd..7a4d449182d65 100644
+--- a/sound/usb/mixer_quirks.c
++++ b/sound/usb/mixer_quirks.c
+@@ -528,6 +528,7 @@ static int snd_emu0204_controls_create(struct usb_mixer_interface *mixer)
+ &snd_emu0204_control, NULL);
+ }
+
++#if IS_REACHABLE(CONFIG_INPUT)
+ /*
+ * Sony DualSense controller (PS5) jack detection
+ *
+@@ -784,6 +785,7 @@ static int snd_dualsense_controls_create(struct usb_mixer_interface *mixer)
+
+ return snd_dualsense_jack_create(mixer, "Headset Mic Jack", false);
+ }
++#endif /* IS_REACHABLE(CONFIG_INPUT) */
+
+ /* ASUS Xonar U1 / U3 controls */
+
+@@ -3388,10 +3390,12 @@ int snd_usb_mixer_apply_create_quirk(struct usb_mixer_interface *mixer)
+ err = snd_emu0204_controls_create(mixer);
+ break;
+
++#if IS_REACHABLE(CONFIG_INPUT)
+ case USB_ID(0x054c, 0x0ce6): /* Sony DualSense controller (PS5) */
+ case USB_ID(0x054c, 0x0df2): /* Sony DualSense Edge controller (PS5) */
+ err = snd_dualsense_controls_create(mixer);
+ break;
++#endif /* IS_REACHABLE(CONFIG_INPUT) */
+
+ case USB_ID(0x0763, 0x2030): /* M-Audio Fast Track C400 */
+ case USB_ID(0x0763, 0x2031): /* M-Audio Fast Track C400 */
+--
+2.51.0
+
--- /dev/null
+From f253476ca1dd3adb48f94816681f306eff7409dc Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 26 May 2025 17:07:47 +0300
+Subject: ALSA: usb-audio: Remove unneeded wmb() in mixer_quirks
+
+From: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+
+[ Upstream commit 9cea7425595697802e8d55a322a251999554b8b1 ]
+
+Adding a memory barrier before wake_up() in
+snd_usb_soundblaster_remote_complete() is supposed to ensure the write
+to mixer->rc_code is visible in wait_event_interruptible() from
+snd_usb_sbrc_hwdep_read().
+
+However, this is not really necessary, since wake_up() is just a wrapper
+over __wake_up() which already executes a full memory barrier before
+accessing the state of the task to be waken up.
+
+Drop the redundant call to wmb() and implicitly fix the checkpatch
+complaint:
+
+ WARNING: memory barrier without comment
+
+Signed-off-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Link: https://patch.msgid.link/20250526-dualsense-alsa-jack-v1-8-1a821463b632@collabora.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/mixer_quirks.c | 1 -
+ 1 file changed, 1 deletion(-)
+
+diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
+index 9243094cc0637..29ef56323a7a2 100644
+--- a/sound/usb/mixer_quirks.c
++++ b/sound/usb/mixer_quirks.c
+@@ -208,7 +208,6 @@ static void snd_usb_soundblaster_remote_complete(struct urb *urb)
+ if (code == rc->mute_code)
+ snd_usb_mixer_notify_id(mixer, rc->mute_mixer_id);
+ mixer->rc_code = code;
+- wmb();
+ wake_up(&mixer->rc_waitq);
+ }
+
+--
+2.51.0
+
--- /dev/null
+From 6ce582331bc9e2977da2c43540a3a3b721c39ea4 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 26 May 2025 17:07:46 +0300
+Subject: ALSA: usb-audio: Simplify NULL comparison in mixer_quirks
+
+From: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+
+[ Upstream commit f2d6d660e8fd5f4467e80743f82119201e67fa9c ]
+
+Handle report from checkpatch.pl:
+
+ CHECK: Comparison to NULL could be written "t->name"
+
+Signed-off-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Link: https://patch.msgid.link/20250526-dualsense-alsa-jack-v1-7-1a821463b632@collabora.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/mixer_quirks.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
+index 715b0922243c1..9243094cc0637 100644
+--- a/sound/usb/mixer_quirks.c
++++ b/sound/usb/mixer_quirks.c
+@@ -126,7 +126,7 @@ static int snd_create_std_mono_table(struct usb_mixer_interface *mixer,
+ {
+ int err;
+
+- while (t->name != NULL) {
++ while (t->name) {
+ err = snd_create_std_mono_ctl(mixer, t->unitid, t->control,
+ t->cmask, t->val_type, t->name, t->tlv_callback);
+ if (err < 0)
+--
+2.51.0
+
--- /dev/null
+From 8c5093e9e68a59ea8a60ff2fc602fad3ec5b50a0 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sat, 20 Sep 2025 11:51:48 +0900
+Subject: firewire: core: fix overlooked update of subsystem ABI version
+
+From: Takashi Sakamoto <o-takashi@sakamocchi.jp>
+
+[ Upstream commit 853a57ba263adfecf4430b936d6862bc475b4bb5 ]
+
+In kernel v6.5, several functions were added to the cdev layer. This
+required updating the default version of subsystem ABI up to 6, but
+this requirement was overlooked.
+
+This commit updates the version accordingly.
+
+Fixes: 6add87e9764d ("firewire: cdev: add new version of ABI to notify time stamp at request/response subaction of transaction#")
+Link: https://lore.kernel.org/r/20250920025148.163402-1-o-takashi@sakamocchi.jp
+Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/firewire/core-cdev.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/firewire/core-cdev.c b/drivers/firewire/core-cdev.c
+index 16ea847ade5fd..3ca9d1c38fef8 100644
+--- a/drivers/firewire/core-cdev.c
++++ b/drivers/firewire/core-cdev.c
+@@ -38,7 +38,7 @@
+ /*
+ * ABI version history is documented in linux/firewire-cdev.h.
+ */
+-#define FW_CDEV_KERNEL_VERSION 5
++#define FW_CDEV_KERNEL_VERSION 6
+ #define FW_CDEV_VERSION_EVENT_REQUEST2 4
+ #define FW_CDEV_VERSION_ALLOCATE_REGION_END 4
+ #define FW_CDEV_VERSION_AUTO_FLUSH_ISO_OVERFLOW 5
+--
+2.51.0
+
--- /dev/null
+From b38fcefa59785767651c8315e4a4096026933874 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 13 Aug 2025 15:43:20 +0300
+Subject: IB/mlx5: Fix obj_type mismatch for SRQ event subscriptions
+
+From: Or Har-Toov <ohartoov@nvidia.com>
+
+[ Upstream commit 85fe9f565d2d5af95ac2bbaa5082b8ce62b039f5 ]
+
+Fix a bug where the driver's event subscription logic for SRQ-related
+events incorrectly sets obj_type for RMP objects.
+
+When subscribing to SRQ events, get_legacy_obj_type() did not handle
+the MLX5_CMD_OP_CREATE_RMP case, which caused obj_type to be 0
+(default).
+This led to a mismatch between the obj_type used during subscription
+(0) and the value used during notification (1, taken from the event's
+type field). As a result, event mapping for SRQ objects could fail and
+event notification would not be delivered correctly.
+
+This fix adds handling for MLX5_CMD_OP_CREATE_RMP in get_legacy_obj_type,
+returning MLX5_EVENT_QUEUE_TYPE_RQ so obj_type is consistent between
+subscription and notification.
+
+Fixes: 759738537142 ("IB/mlx5: Enable subscription for device events over DEVX")
+Link: https://patch.msgid.link/r/8f1048e3fdd1fde6b90607ce0ed251afaf8a148c.1755088962.git.leon@kernel.org
+Signed-off-by: Or Har-Toov <ohartoov@nvidia.com>
+Reviewed-by: Edward Srouji <edwards@nvidia.com>
+Signed-off-by: Leon Romanovsky <leonro@nvidia.com>
+Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/infiniband/hw/mlx5/devx.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/drivers/infiniband/hw/mlx5/devx.c b/drivers/infiniband/hw/mlx5/devx.c
+index 301c061bb3190..679d85db26f4f 100644
+--- a/drivers/infiniband/hw/mlx5/devx.c
++++ b/drivers/infiniband/hw/mlx5/devx.c
+@@ -194,6 +194,7 @@ static u16 get_legacy_obj_type(u16 opcode)
+ {
+ switch (opcode) {
+ case MLX5_CMD_OP_CREATE_RQ:
++ case MLX5_CMD_OP_CREATE_RMP:
+ return MLX5_EVENT_QUEUE_TYPE_RQ;
+ case MLX5_CMD_OP_CREATE_QP:
+ return MLX5_EVENT_QUEUE_TYPE_QP;
+--
+2.51.0
+
net-rfkill-gpio-fix-crash-due-to-dereferencering-uninitialized-pointer.patch
btrfs-tree-checker-fix-the-incorrect-inode-ref-size-check.patch
mptcp-propagate-shutdown-to-subflows-when-possible.patch
+firewire-core-fix-overlooked-update-of-subsystem-abi.patch
+alsa-usb-audio-fix-block-comments-in-mixer_quirks.patch
+alsa-usb-audio-drop-unnecessary-parentheses-in-mixer.patch
+alsa-usb-audio-avoid-multiple-assignments-in-mixer_q.patch
+alsa-usb-audio-simplify-null-comparison-in-mixer_qui.patch
+alsa-usb-audio-remove-unneeded-wmb-in-mixer_quirks.patch
+alsa-usb-audio-add-mixer-quirk-for-sony-dualsense-ps.patch
+alsa-usb-audio-convert-comma-to-semicolon.patch
+alsa-usb-audio-fix-build-with-config_input-n.patch
+usb-core-add-0x-prefix-to-quirks-debug-output.patch
+ib-mlx5-fix-obj_type-mismatch-for-srq-event-subscrip.patch
--- /dev/null
+From d9c9d67082d57f7be3052736a2c04d2cfde2b019 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 3 Jun 2025 15:10:45 +0800
+Subject: usb: core: Add 0x prefix to quirks debug output
+
+From: Jiayi Li <lijiayi@kylinos.cn>
+
+[ Upstream commit 47c428fce0b41b15ab321d8ede871f780ccd038f ]
+
+Use "0x%x" format for quirks debug print to clarify it's a hexadecimal
+value. Improves readability and consistency with other hex outputs.
+
+Signed-off-by: Jiayi Li <lijiayi@kylinos.cn>
+Link: https://lore.kernel.org/r/20250603071045.3243699-1-lijiayi@kylinos.cn
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/usb/core/quirks.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/usb/core/quirks.c b/drivers/usb/core/quirks.c
+index f5894cb166867..55efefc5d702a 100644
+--- a/drivers/usb/core/quirks.c
++++ b/drivers/usb/core/quirks.c
+@@ -728,7 +728,7 @@ void usb_detect_quirks(struct usb_device *udev)
+ udev->quirks ^= usb_detect_dynamic_quirks(udev);
+
+ if (udev->quirks)
+- dev_dbg(&udev->dev, "USB quirks for this device: %x\n",
++ dev_dbg(&udev->dev, "USB quirks for this device: 0x%x\n",
+ udev->quirks);
+
+ #ifdef CONFIG_USB_DEFAULT_PERSIST
+--
+2.51.0
+
--- /dev/null
+From 12fb8832c10c265d2b1dea59ecfeda0eb4cf3d66 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 26 May 2025 17:07:48 +0300
+Subject: ALSA: usb-audio: Add mixer quirk for Sony DualSense PS5
+
+From: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+
+[ Upstream commit 79d561c4ec0497669f19a9550cfb74812f60938b ]
+
+The Sony DualSense wireless controller (PS5) features an internal mono
+speaker, but it also provides a 3.5mm jack socket for headphone output
+and headset microphone input.
+
+Since this is a UAC1 device, it doesn't advertise any jack detection
+capability. However, the controller is able to report HP & MIC insert
+events via HID, i.e. through a dedicated input device managed by the
+hid-playstation driver.
+
+Add a quirk to create the jack controls for headphone and headset mic,
+respectively, and setup an input handler for each of them in order to
+intercept the related hotplug events.
+
+Signed-off-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Link: https://patch.msgid.link/20250526-dualsense-alsa-jack-v1-9-1a821463b632@collabora.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/mixer_quirks.c | 263 +++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 263 insertions(+)
+
+diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
+index d50cd771356f8..fc62ad4c8ef11 100644
+--- a/sound/usb/mixer_quirks.c
++++ b/sound/usb/mixer_quirks.c
+@@ -16,6 +16,7 @@
+
+ #include <linux/hid.h>
+ #include <linux/init.h>
++#include <linux/input.h>
+ #include <linux/math64.h>
+ #include <linux/slab.h>
+ #include <linux/usb.h>
+@@ -527,6 +528,263 @@ static int snd_emu0204_controls_create(struct usb_mixer_interface *mixer)
+ &snd_emu0204_control, NULL);
+ }
+
++/*
++ * Sony DualSense controller (PS5) jack detection
++ *
++ * Since this is an UAC 1 device, it doesn't support jack detection.
++ * However, the controller hid-playstation driver reports HP & MIC
++ * insert events through a dedicated input device.
++ */
++
++#define SND_DUALSENSE_JACK_OUT_TERM_ID 3
++#define SND_DUALSENSE_JACK_IN_TERM_ID 4
++
++struct dualsense_mixer_elem_info {
++ struct usb_mixer_elem_info info;
++ struct input_handler ih;
++ struct input_device_id id_table[2];
++ bool connected;
++};
++
++static void snd_dualsense_ih_event(struct input_handle *handle,
++ unsigned int type, unsigned int code,
++ int value)
++{
++ struct dualsense_mixer_elem_info *mei;
++ struct usb_mixer_elem_list *me;
++
++ if (type != EV_SW)
++ return;
++
++ mei = container_of(handle->handler, struct dualsense_mixer_elem_info, ih);
++ me = &mei->info.head;
++
++ if ((me->id == SND_DUALSENSE_JACK_OUT_TERM_ID && code == SW_HEADPHONE_INSERT) ||
++ (me->id == SND_DUALSENSE_JACK_IN_TERM_ID && code == SW_MICROPHONE_INSERT)) {
++ mei->connected = !!value;
++ snd_ctl_notify(me->mixer->chip->card, SNDRV_CTL_EVENT_MASK_VALUE,
++ &me->kctl->id);
++ }
++}
++
++static bool snd_dualsense_ih_match(struct input_handler *handler,
++ struct input_dev *dev)
++{
++ struct dualsense_mixer_elem_info *mei;
++ struct usb_device *snd_dev;
++ char *input_dev_path, *usb_dev_path;
++ size_t usb_dev_path_len;
++ bool match = false;
++
++ mei = container_of(handler, struct dualsense_mixer_elem_info, ih);
++ snd_dev = mei->info.head.mixer->chip->dev;
++
++ input_dev_path = kobject_get_path(&dev->dev.kobj, GFP_KERNEL);
++ if (!input_dev_path) {
++ dev_warn(&snd_dev->dev, "Failed to get input dev path\n");
++ return false;
++ }
++
++ usb_dev_path = kobject_get_path(&snd_dev->dev.kobj, GFP_KERNEL);
++ if (!usb_dev_path) {
++ dev_warn(&snd_dev->dev, "Failed to get USB dev path\n");
++ goto free_paths;
++ }
++
++ /*
++ * Ensure the VID:PID matched input device supposedly owned by the
++ * hid-playstation driver belongs to the actual hardware handled by
++ * the current USB audio device, which implies input_dev_path being
++ * a subpath of usb_dev_path.
++ *
++ * This verification is necessary when there is more than one identical
++ * controller attached to the host system.
++ */
++ usb_dev_path_len = strlen(usb_dev_path);
++ if (usb_dev_path_len >= strlen(input_dev_path))
++ goto free_paths;
++
++ usb_dev_path[usb_dev_path_len] = '/';
++ match = !memcmp(input_dev_path, usb_dev_path, usb_dev_path_len + 1);
++
++free_paths:
++ kfree(input_dev_path);
++ kfree(usb_dev_path);
++
++ return match;
++}
++
++static int snd_dualsense_ih_connect(struct input_handler *handler,
++ struct input_dev *dev,
++ const struct input_device_id *id)
++{
++ struct input_handle *handle;
++ int err;
++
++ handle = kzalloc(sizeof(*handle), GFP_KERNEL);
++ if (!handle)
++ return -ENOMEM;
++
++ handle->dev = dev;
++ handle->handler = handler;
++ handle->name = handler->name;
++
++ err = input_register_handle(handle);
++ if (err)
++ goto err_free;
++
++ err = input_open_device(handle);
++ if (err)
++ goto err_unregister;
++
++ return 0;
++
++err_unregister:
++ input_unregister_handle(handle);
++err_free:
++ kfree(handle);
++ return err;
++}
++
++static void snd_dualsense_ih_disconnect(struct input_handle *handle)
++{
++ input_close_device(handle);
++ input_unregister_handle(handle);
++ kfree(handle);
++}
++
++static void snd_dualsense_ih_start(struct input_handle *handle)
++{
++ struct dualsense_mixer_elem_info *mei;
++ struct usb_mixer_elem_list *me;
++ int status = -1;
++
++ mei = container_of(handle->handler, struct dualsense_mixer_elem_info, ih);
++ me = &mei->info.head;
++
++ if (me->id == SND_DUALSENSE_JACK_OUT_TERM_ID &&
++ test_bit(SW_HEADPHONE_INSERT, handle->dev->swbit))
++ status = test_bit(SW_HEADPHONE_INSERT, handle->dev->sw);
++ else if (me->id == SND_DUALSENSE_JACK_IN_TERM_ID &&
++ test_bit(SW_MICROPHONE_INSERT, handle->dev->swbit))
++ status = test_bit(SW_MICROPHONE_INSERT, handle->dev->sw);
++
++ if (status >= 0) {
++ mei->connected = !!status;
++ snd_ctl_notify(me->mixer->chip->card, SNDRV_CTL_EVENT_MASK_VALUE,
++ &me->kctl->id);
++ }
++}
++
++static int snd_dualsense_jack_get(struct snd_kcontrol *kctl,
++ struct snd_ctl_elem_value *ucontrol)
++{
++ struct dualsense_mixer_elem_info *mei = snd_kcontrol_chip(kctl);
++
++ ucontrol->value.integer.value[0] = mei->connected;
++
++ return 0;
++}
++
++static const struct snd_kcontrol_new snd_dualsense_jack_control = {
++ .iface = SNDRV_CTL_ELEM_IFACE_CARD,
++ .access = SNDRV_CTL_ELEM_ACCESS_READ,
++ .info = snd_ctl_boolean_mono_info,
++ .get = snd_dualsense_jack_get,
++};
++
++static int snd_dualsense_resume_jack(struct usb_mixer_elem_list *list)
++{
++ snd_ctl_notify(list->mixer->chip->card, SNDRV_CTL_EVENT_MASK_VALUE,
++ &list->kctl->id);
++ return 0;
++}
++
++static void snd_dualsense_mixer_elem_free(struct snd_kcontrol *kctl)
++{
++ struct dualsense_mixer_elem_info *mei = snd_kcontrol_chip(kctl);
++
++ if (mei->ih.event)
++ input_unregister_handler(&mei->ih);
++
++ snd_usb_mixer_elem_free(kctl);
++}
++
++static int snd_dualsense_jack_create(struct usb_mixer_interface *mixer,
++ const char *name, bool is_output)
++{
++ struct dualsense_mixer_elem_info *mei;
++ struct input_device_id *idev_id;
++ struct snd_kcontrol *kctl;
++ int err;
++
++ mei = kzalloc(sizeof(*mei), GFP_KERNEL);
++ if (!mei)
++ return -ENOMEM;
++
++ snd_usb_mixer_elem_init_std(&mei->info.head, mixer,
++ is_output ? SND_DUALSENSE_JACK_OUT_TERM_ID :
++ SND_DUALSENSE_JACK_IN_TERM_ID);
++
++ mei->info.head.resume = snd_dualsense_resume_jack;
++ mei->info.val_type = USB_MIXER_BOOLEAN;
++ mei->info.channels = 1;
++ mei->info.min = 0;
++ mei->info.max = 1;
++
++ kctl = snd_ctl_new1(&snd_dualsense_jack_control, mei);
++ if (!kctl) {
++ kfree(mei);
++ return -ENOMEM;
++ }
++
++ strscpy(kctl->id.name, name, sizeof(kctl->id.name));
++ kctl->private_free = snd_dualsense_mixer_elem_free;
++
++ err = snd_usb_mixer_add_control(&mei->info.head, kctl);
++ if (err)
++ return err;
++
++ idev_id = &mei->id_table[0];
++ idev_id->flags = INPUT_DEVICE_ID_MATCH_VENDOR | INPUT_DEVICE_ID_MATCH_PRODUCT |
++ INPUT_DEVICE_ID_MATCH_EVBIT | INPUT_DEVICE_ID_MATCH_SWBIT;
++ idev_id->vendor = USB_ID_VENDOR(mixer->chip->usb_id);
++ idev_id->product = USB_ID_PRODUCT(mixer->chip->usb_id);
++ idev_id->evbit[BIT_WORD(EV_SW)] = BIT_MASK(EV_SW);
++ if (is_output)
++ idev_id->swbit[BIT_WORD(SW_HEADPHONE_INSERT)] = BIT_MASK(SW_HEADPHONE_INSERT);
++ else
++ idev_id->swbit[BIT_WORD(SW_MICROPHONE_INSERT)] = BIT_MASK(SW_MICROPHONE_INSERT);
++
++ mei->ih.event = snd_dualsense_ih_event;
++ mei->ih.match = snd_dualsense_ih_match;
++ mei->ih.connect = snd_dualsense_ih_connect,
++ mei->ih.disconnect = snd_dualsense_ih_disconnect,
++ mei->ih.start = snd_dualsense_ih_start,
++ mei->ih.name = name;
++ mei->ih.id_table = mei->id_table;
++
++ err = input_register_handler(&mei->ih);
++ if (err) {
++ dev_warn(&mixer->chip->dev->dev,
++ "Could not register input handler: %d\n", err);
++ mei->ih.event = NULL;
++ }
++
++ return 0;
++}
++
++static int snd_dualsense_controls_create(struct usb_mixer_interface *mixer)
++{
++ int err;
++
++ err = snd_dualsense_jack_create(mixer, "Headphone Jack", true);
++ if (err < 0)
++ return err;
++
++ return snd_dualsense_jack_create(mixer, "Headset Mic Jack", false);
++}
++
+ /* ASUS Xonar U1 / U3 controls */
+
+ static int snd_xonar_u1_switch_get(struct snd_kcontrol *kcontrol,
+@@ -3372,6 +3630,11 @@ int snd_usb_mixer_apply_create_quirk(struct usb_mixer_interface *mixer)
+ err = snd_emu0204_controls_create(mixer);
+ break;
+
++ case USB_ID(0x054c, 0x0ce6): /* Sony DualSense controller (PS5) */
++ case USB_ID(0x054c, 0x0df2): /* Sony DualSense Edge controller (PS5) */
++ err = snd_dualsense_controls_create(mixer);
++ break;
++
+ case USB_ID(0x0763, 0x2030): /* M-Audio Fast Track C400 */
+ case USB_ID(0x0763, 0x2031): /* M-Audio Fast Track C400 */
+ err = snd_c400_create_mixer(mixer);
+--
+2.51.0
+
--- /dev/null
+From 8384af7d46a666fb0b1143d8e4ceea30a082b3f7 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 26 May 2025 17:07:45 +0300
+Subject: ALSA: usb-audio: Avoid multiple assignments in mixer_quirks
+
+From: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+
+[ Upstream commit 03ddd3bdb94df3edb1f2408b57cfb00b3d92a208 ]
+
+Handle report from checkpatch.pl:
+
+ CHECK: multiple assignments should be avoided
+
+Signed-off-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Link: https://patch.msgid.link/20250526-dualsense-alsa-jack-v1-6-1a821463b632@collabora.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/mixer_quirks.c | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
+index 866d309454aa3..4ab57ef56330d 100644
+--- a/sound/usb/mixer_quirks.c
++++ b/sound/usb/mixer_quirks.c
+@@ -1734,7 +1734,8 @@ static int snd_microii_spdif_default_put(struct snd_kcontrol *kcontrol,
+ unsigned int pval, pval_old;
+ int err;
+
+- pval = pval_old = kcontrol->private_value;
++ pval = kcontrol->private_value;
++ pval_old = pval;
+ pval &= 0xfffff0f0;
+ pval |= (ucontrol->value.iec958.status[1] & 0x0f) << 8;
+ pval |= (ucontrol->value.iec958.status[0] & 0x0f);
+--
+2.51.0
+
--- /dev/null
+From f3052688acdc59fc9d118721d033519f711b7fe8 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 12 Jun 2025 14:02:28 +0800
+Subject: ALSA: usb-audio: Convert comma to semicolon
+
+From: Chen Ni <nichen@iscas.ac.cn>
+
+[ Upstream commit 9ca30a1b007d5fefb5752428f852a2d8d7219c1c ]
+
+Replace comma between expressions with semicolons.
+
+Using a ',' in place of a ';' can have unintended side effects.
+Although that is not the case here, it is seems best to use ';'
+unless ',' is intended.
+
+Found by inspection.
+No functional change intended.
+Compile tested only.
+
+Fixes: 79d561c4ec04 ("ALSA: usb-audio: Add mixer quirk for Sony DualSense PS5")
+Signed-off-by: Chen Ni <nichen@iscas.ac.cn>
+Reviewed-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+Link: https://patch.msgid.link/20250612060228.1518028-1-nichen@iscas.ac.cn
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/mixer_quirks.c | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
+index fc62ad4c8ef11..9b59d90ab8ca5 100644
+--- a/sound/usb/mixer_quirks.c
++++ b/sound/usb/mixer_quirks.c
+@@ -758,9 +758,9 @@ static int snd_dualsense_jack_create(struct usb_mixer_interface *mixer,
+
+ mei->ih.event = snd_dualsense_ih_event;
+ mei->ih.match = snd_dualsense_ih_match;
+- mei->ih.connect = snd_dualsense_ih_connect,
+- mei->ih.disconnect = snd_dualsense_ih_disconnect,
+- mei->ih.start = snd_dualsense_ih_start,
++ mei->ih.connect = snd_dualsense_ih_connect;
++ mei->ih.disconnect = snd_dualsense_ih_disconnect;
++ mei->ih.start = snd_dualsense_ih_start;
+ mei->ih.name = name;
+ mei->ih.id_table = mei->id_table;
+
+--
+2.51.0
+
--- /dev/null
+From c73cf6bb37df2d1c41632050d689c9344c7d36d0 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 26 May 2025 17:07:44 +0300
+Subject: ALSA: usb-audio: Drop unnecessary parentheses in mixer_quirks
+
+From: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+
+[ Upstream commit c0495cef8b43ad61efbd4019e3573742e0e63c67 ]
+
+Fix multiple 'CHECK: Unnecessary parentheses around ...' reports from
+checkpatch.pl.
+
+Signed-off-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Link: https://patch.msgid.link/20250526-dualsense-alsa-jack-v1-5-1a821463b632@collabora.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/mixer_quirks.c | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
+index 0e8cf8b06b8ad..866d309454aa3 100644
+--- a/sound/usb/mixer_quirks.c
++++ b/sound/usb/mixer_quirks.c
+@@ -376,10 +376,10 @@ static int snd_audigy2nx_controls_create(struct usb_mixer_interface *mixer)
+ struct snd_kcontrol_new knew;
+
+ /* USB X-Fi S51 doesn't have a CMSS LED */
+- if ((mixer->chip->usb_id == USB_ID(0x041e, 0x3042)) && i == 0)
++ if (mixer->chip->usb_id == USB_ID(0x041e, 0x3042) && i == 0)
+ continue;
+ /* USB X-Fi S51 Pro doesn't have one either */
+- if ((mixer->chip->usb_id == USB_ID(0x041e, 0x30df)) && i == 0)
++ if (mixer->chip->usb_id == USB_ID(0x041e, 0x30df) && i == 0)
+ continue;
+ if (i > 1 && /* Live24ext has 2 LEDs only */
+ (mixer->chip->usb_id == USB_ID(0x041e, 0x3040) ||
+@@ -3254,7 +3254,7 @@ static int snd_djm_controls_update(struct usb_mixer_interface *mixer,
+ int err;
+ const struct snd_djm_device *device = &snd_djm_devices[device_idx];
+
+- if ((group >= device->ncontrols) || value >= device->controls[group].noptions)
++ if (group >= device->ncontrols || value >= device->controls[group].noptions)
+ return -EINVAL;
+
+ err = snd_usb_lock_shutdown(mixer->chip);
+--
+2.51.0
+
--- /dev/null
+From 214058846afe05b5006310fb5a3fcda407da42d8 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 26 May 2025 17:07:43 +0300
+Subject: ALSA: usb-audio: Fix block comments in mixer_quirks
+
+From: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+
+[ Upstream commit 231225d8a20f8668b4fd6601d54a2fac0e0ab7a5 ]
+
+Address a couple of comment formatting issues indicated by
+checkpatch.pl:
+
+ WARNING: Block comments use a trailing */ on a separate line
+
+Signed-off-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Link: https://patch.msgid.link/20250526-dualsense-alsa-jack-v1-4-1a821463b632@collabora.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/mixer_quirks.c | 6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
+
+diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
+index 60269535eb554..0e8cf8b06b8ad 100644
+--- a/sound/usb/mixer_quirks.c
++++ b/sound/usb/mixer_quirks.c
+@@ -76,7 +76,8 @@ static int snd_create_std_mono_ctl_offset(struct usb_mixer_interface *mixer,
+ cval->idx_off = idx_off;
+
+ /* get_min_max() is called only for integer volumes later,
+- * so provide a short-cut for booleans */
++ * so provide a short-cut for booleans
++ */
+ cval->min = 0;
+ cval->max = 1;
+ cval->res = 0;
+@@ -3524,7 +3525,8 @@ static void snd_dragonfly_quirk_db_scale(struct usb_mixer_interface *mixer,
+ struct snd_kcontrol *kctl)
+ {
+ /* Approximation using 10 ranges based on output measurement on hw v1.2.
+- * This seems close to the cubic mapping e.g. alsamixer uses. */
++ * This seems close to the cubic mapping e.g. alsamixer uses.
++ */
+ static const DECLARE_TLV_DB_RANGE(scale,
+ 0, 1, TLV_DB_MINMAX_ITEM(-5300, -4970),
+ 2, 5, TLV_DB_MINMAX_ITEM(-4710, -4160),
+--
+2.51.0
+
--- /dev/null
+From 8d09d38339c3772d61c618193eb78f18af85ba5a Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 13 Jun 2025 10:15:30 +0200
+Subject: ALSA: usb-audio: Fix build with CONFIG_INPUT=n
+
+From: Takashi Iwai <tiwai@suse.de>
+
+[ Upstream commit d0630a0b80c08530857146e3bf183a7d6b743847 ]
+
+The recent addition of DualSense mixer quirk relies on the input
+device handle, and the build can fail if CONFIG_INPUT isn't set.
+Put (rather ugly) workarounds to wrap with IS_REACHABLE() for avoiding
+the build error.
+
+Fixes: 79d561c4ec04 ("ALSA: usb-audio: Add mixer quirk for Sony DualSense PS5")
+Reported-by: kernel test robot <lkp@intel.com>
+Closes: https://lore.kernel.org/oe-kbuild-all/202506130733.gnPKw2l3-lkp@intel.com/
+Reviewed-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+Link: https://patch.msgid.link/20250613081543.7404-1-tiwai@suse.de
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/mixer_quirks.c | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
+index 9b59d90ab8ca5..177f64107bb1e 100644
+--- a/sound/usb/mixer_quirks.c
++++ b/sound/usb/mixer_quirks.c
+@@ -528,6 +528,7 @@ static int snd_emu0204_controls_create(struct usb_mixer_interface *mixer)
+ &snd_emu0204_control, NULL);
+ }
+
++#if IS_REACHABLE(CONFIG_INPUT)
+ /*
+ * Sony DualSense controller (PS5) jack detection
+ *
+@@ -784,6 +785,7 @@ static int snd_dualsense_controls_create(struct usb_mixer_interface *mixer)
+
+ return snd_dualsense_jack_create(mixer, "Headset Mic Jack", false);
+ }
++#endif /* IS_REACHABLE(CONFIG_INPUT) */
+
+ /* ASUS Xonar U1 / U3 controls */
+
+@@ -3630,10 +3632,12 @@ int snd_usb_mixer_apply_create_quirk(struct usb_mixer_interface *mixer)
+ err = snd_emu0204_controls_create(mixer);
+ break;
+
++#if IS_REACHABLE(CONFIG_INPUT)
+ case USB_ID(0x054c, 0x0ce6): /* Sony DualSense controller (PS5) */
+ case USB_ID(0x054c, 0x0df2): /* Sony DualSense Edge controller (PS5) */
+ err = snd_dualsense_controls_create(mixer);
+ break;
++#endif /* IS_REACHABLE(CONFIG_INPUT) */
+
+ case USB_ID(0x0763, 0x2030): /* M-Audio Fast Track C400 */
+ case USB_ID(0x0763, 0x2031): /* M-Audio Fast Track C400 */
+--
+2.51.0
+
--- /dev/null
+From 4cfee87dca7ee02e5186386d78944a84ebbd744e Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 26 May 2025 17:07:47 +0300
+Subject: ALSA: usb-audio: Remove unneeded wmb() in mixer_quirks
+
+From: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+
+[ Upstream commit 9cea7425595697802e8d55a322a251999554b8b1 ]
+
+Adding a memory barrier before wake_up() in
+snd_usb_soundblaster_remote_complete() is supposed to ensure the write
+to mixer->rc_code is visible in wait_event_interruptible() from
+snd_usb_sbrc_hwdep_read().
+
+However, this is not really necessary, since wake_up() is just a wrapper
+over __wake_up() which already executes a full memory barrier before
+accessing the state of the task to be waken up.
+
+Drop the redundant call to wmb() and implicitly fix the checkpatch
+complaint:
+
+ WARNING: memory barrier without comment
+
+Signed-off-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Link: https://patch.msgid.link/20250526-dualsense-alsa-jack-v1-8-1a821463b632@collabora.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/mixer_quirks.c | 1 -
+ 1 file changed, 1 deletion(-)
+
+diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
+index 3156bb50f9ff6..d50cd771356f8 100644
+--- a/sound/usb/mixer_quirks.c
++++ b/sound/usb/mixer_quirks.c
+@@ -208,7 +208,6 @@ static void snd_usb_soundblaster_remote_complete(struct urb *urb)
+ if (code == rc->mute_code)
+ snd_usb_mixer_notify_id(mixer, rc->mute_mixer_id);
+ mixer->rc_code = code;
+- wmb();
+ wake_up(&mixer->rc_waitq);
+ }
+
+--
+2.51.0
+
--- /dev/null
+From 8753adcb709f9740038d32339aa624391c9530ba Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 26 May 2025 17:07:46 +0300
+Subject: ALSA: usb-audio: Simplify NULL comparison in mixer_quirks
+
+From: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+
+[ Upstream commit f2d6d660e8fd5f4467e80743f82119201e67fa9c ]
+
+Handle report from checkpatch.pl:
+
+ CHECK: Comparison to NULL could be written "t->name"
+
+Signed-off-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Link: https://patch.msgid.link/20250526-dualsense-alsa-jack-v1-7-1a821463b632@collabora.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/mixer_quirks.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
+index 4ab57ef56330d..3156bb50f9ff6 100644
+--- a/sound/usb/mixer_quirks.c
++++ b/sound/usb/mixer_quirks.c
+@@ -126,7 +126,7 @@ static int snd_create_std_mono_table(struct usb_mixer_interface *mixer,
+ {
+ int err;
+
+- while (t->name != NULL) {
++ while (t->name) {
+ err = snd_create_std_mono_ctl(mixer, t->unitid, t->control,
+ t->cmask, t->val_type, t->name, t->tlv_callback);
+ if (err < 0)
+--
+2.51.0
+
--- /dev/null
+From 6df51ff6e19b1a32deb89eda387fc3d0e4dd6081 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sat, 20 Sep 2025 11:51:48 +0900
+Subject: firewire: core: fix overlooked update of subsystem ABI version
+
+From: Takashi Sakamoto <o-takashi@sakamocchi.jp>
+
+[ Upstream commit 853a57ba263adfecf4430b936d6862bc475b4bb5 ]
+
+In kernel v6.5, several functions were added to the cdev layer. This
+required updating the default version of subsystem ABI up to 6, but
+this requirement was overlooked.
+
+This commit updates the version accordingly.
+
+Fixes: 6add87e9764d ("firewire: cdev: add new version of ABI to notify time stamp at request/response subaction of transaction#")
+Link: https://lore.kernel.org/r/20250920025148.163402-1-o-takashi@sakamocchi.jp
+Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/firewire/core-cdev.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/firewire/core-cdev.c b/drivers/firewire/core-cdev.c
+index 16ea847ade5fd..3ca9d1c38fef8 100644
+--- a/drivers/firewire/core-cdev.c
++++ b/drivers/firewire/core-cdev.c
+@@ -38,7 +38,7 @@
+ /*
+ * ABI version history is documented in linux/firewire-cdev.h.
+ */
+-#define FW_CDEV_KERNEL_VERSION 5
++#define FW_CDEV_KERNEL_VERSION 6
+ #define FW_CDEV_VERSION_EVENT_REQUEST2 4
+ #define FW_CDEV_VERSION_ALLOCATE_REGION_END 4
+ #define FW_CDEV_VERSION_AUTO_FLUSH_ISO_OVERFLOW 5
+--
+2.51.0
+
--- /dev/null
+From 2376806b6718a40547d4feafecd41e053ffbf0e2 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 13 Aug 2025 15:43:20 +0300
+Subject: IB/mlx5: Fix obj_type mismatch for SRQ event subscriptions
+
+From: Or Har-Toov <ohartoov@nvidia.com>
+
+[ Upstream commit 85fe9f565d2d5af95ac2bbaa5082b8ce62b039f5 ]
+
+Fix a bug where the driver's event subscription logic for SRQ-related
+events incorrectly sets obj_type for RMP objects.
+
+When subscribing to SRQ events, get_legacy_obj_type() did not handle
+the MLX5_CMD_OP_CREATE_RMP case, which caused obj_type to be 0
+(default).
+This led to a mismatch between the obj_type used during subscription
+(0) and the value used during notification (1, taken from the event's
+type field). As a result, event mapping for SRQ objects could fail and
+event notification would not be delivered correctly.
+
+This fix adds handling for MLX5_CMD_OP_CREATE_RMP in get_legacy_obj_type,
+returning MLX5_EVENT_QUEUE_TYPE_RQ so obj_type is consistent between
+subscription and notification.
+
+Fixes: 759738537142 ("IB/mlx5: Enable subscription for device events over DEVX")
+Link: https://patch.msgid.link/r/8f1048e3fdd1fde6b90607ce0ed251afaf8a148c.1755088962.git.leon@kernel.org
+Signed-off-by: Or Har-Toov <ohartoov@nvidia.com>
+Reviewed-by: Edward Srouji <edwards@nvidia.com>
+Signed-off-by: Leon Romanovsky <leonro@nvidia.com>
+Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/infiniband/hw/mlx5/devx.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/drivers/infiniband/hw/mlx5/devx.c b/drivers/infiniband/hw/mlx5/devx.c
+index cc351390b568c..b2d5e21dba26c 100644
+--- a/drivers/infiniband/hw/mlx5/devx.c
++++ b/drivers/infiniband/hw/mlx5/devx.c
+@@ -191,6 +191,7 @@ static u16 get_legacy_obj_type(u16 opcode)
+ {
+ switch (opcode) {
+ case MLX5_CMD_OP_CREATE_RQ:
++ case MLX5_CMD_OP_CREATE_RMP:
+ return MLX5_EVENT_QUEUE_TYPE_RQ;
+ case MLX5_CMD_OP_CREATE_QP:
+ return MLX5_EVENT_QUEUE_TYPE_QP;
+--
+2.51.0
+
mptcp-propagate-shutdown-to-subflows-when-possible.patch
net-rfkill-gpio-add-dt-support.patch
net-rfkill-gpio-fix-crash-due-to-dereferencering-uninitialized-pointer.patch
+firewire-core-fix-overlooked-update-of-subsystem-abi.patch
+alsa-usb-audio-fix-block-comments-in-mixer_quirks.patch
+alsa-usb-audio-drop-unnecessary-parentheses-in-mixer.patch
+alsa-usb-audio-avoid-multiple-assignments-in-mixer_q.patch
+alsa-usb-audio-simplify-null-comparison-in-mixer_qui.patch
+alsa-usb-audio-remove-unneeded-wmb-in-mixer_quirks.patch
+alsa-usb-audio-add-mixer-quirk-for-sony-dualsense-ps.patch
+alsa-usb-audio-convert-comma-to-semicolon.patch
+alsa-usb-audio-fix-build-with-config_input-n.patch
+usb-core-add-0x-prefix-to-quirks-debug-output.patch
+ib-mlx5-fix-obj_type-mismatch-for-srq-event-subscrip.patch
--- /dev/null
+From 7182632669297365e9302b4e353956788cc9e870 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 3 Jun 2025 15:10:45 +0800
+Subject: usb: core: Add 0x prefix to quirks debug output
+
+From: Jiayi Li <lijiayi@kylinos.cn>
+
+[ Upstream commit 47c428fce0b41b15ab321d8ede871f780ccd038f ]
+
+Use "0x%x" format for quirks debug print to clarify it's a hexadecimal
+value. Improves readability and consistency with other hex outputs.
+
+Signed-off-by: Jiayi Li <lijiayi@kylinos.cn>
+Link: https://lore.kernel.org/r/20250603071045.3243699-1-lijiayi@kylinos.cn
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/usb/core/quirks.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/usb/core/quirks.c b/drivers/usb/core/quirks.c
+index 5935ab39bf8d8..f7747524be6dc 100644
+--- a/drivers/usb/core/quirks.c
++++ b/drivers/usb/core/quirks.c
+@@ -727,7 +727,7 @@ void usb_detect_quirks(struct usb_device *udev)
+ udev->quirks ^= usb_detect_dynamic_quirks(udev);
+
+ if (udev->quirks)
+- dev_dbg(&udev->dev, "USB quirks for this device: %x\n",
++ dev_dbg(&udev->dev, "USB quirks for this device: 0x%x\n",
+ udev->quirks);
+
+ #ifdef CONFIG_USB_DEFAULT_PERSIST
+--
+2.51.0
+
--- /dev/null
+From 6e9f8482c48870b45b89948251b95a3700f48c30 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 26 May 2025 17:07:48 +0300
+Subject: ALSA: usb-audio: Add mixer quirk for Sony DualSense PS5
+
+From: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+
+[ Upstream commit 79d561c4ec0497669f19a9550cfb74812f60938b ]
+
+The Sony DualSense wireless controller (PS5) features an internal mono
+speaker, but it also provides a 3.5mm jack socket for headphone output
+and headset microphone input.
+
+Since this is a UAC1 device, it doesn't advertise any jack detection
+capability. However, the controller is able to report HP & MIC insert
+events via HID, i.e. through a dedicated input device managed by the
+hid-playstation driver.
+
+Add a quirk to create the jack controls for headphone and headset mic,
+respectively, and setup an input handler for each of them in order to
+intercept the related hotplug events.
+
+Signed-off-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Link: https://patch.msgid.link/20250526-dualsense-alsa-jack-v1-9-1a821463b632@collabora.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/mixer_quirks.c | 263 +++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 263 insertions(+)
+
+diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
+index 03d49d4c5141d..cea1c970359c1 100644
+--- a/sound/usb/mixer_quirks.c
++++ b/sound/usb/mixer_quirks.c
+@@ -16,6 +16,7 @@
+
+ #include <linux/hid.h>
+ #include <linux/init.h>
++#include <linux/input.h>
+ #include <linux/math64.h>
+ #include <linux/slab.h>
+ #include <linux/usb.h>
+@@ -526,6 +527,263 @@ static int snd_emu0204_controls_create(struct usb_mixer_interface *mixer)
+ &snd_emu0204_control, NULL);
+ }
+
++/*
++ * Sony DualSense controller (PS5) jack detection
++ *
++ * Since this is an UAC 1 device, it doesn't support jack detection.
++ * However, the controller hid-playstation driver reports HP & MIC
++ * insert events through a dedicated input device.
++ */
++
++#define SND_DUALSENSE_JACK_OUT_TERM_ID 3
++#define SND_DUALSENSE_JACK_IN_TERM_ID 4
++
++struct dualsense_mixer_elem_info {
++ struct usb_mixer_elem_info info;
++ struct input_handler ih;
++ struct input_device_id id_table[2];
++ bool connected;
++};
++
++static void snd_dualsense_ih_event(struct input_handle *handle,
++ unsigned int type, unsigned int code,
++ int value)
++{
++ struct dualsense_mixer_elem_info *mei;
++ struct usb_mixer_elem_list *me;
++
++ if (type != EV_SW)
++ return;
++
++ mei = container_of(handle->handler, struct dualsense_mixer_elem_info, ih);
++ me = &mei->info.head;
++
++ if ((me->id == SND_DUALSENSE_JACK_OUT_TERM_ID && code == SW_HEADPHONE_INSERT) ||
++ (me->id == SND_DUALSENSE_JACK_IN_TERM_ID && code == SW_MICROPHONE_INSERT)) {
++ mei->connected = !!value;
++ snd_ctl_notify(me->mixer->chip->card, SNDRV_CTL_EVENT_MASK_VALUE,
++ &me->kctl->id);
++ }
++}
++
++static bool snd_dualsense_ih_match(struct input_handler *handler,
++ struct input_dev *dev)
++{
++ struct dualsense_mixer_elem_info *mei;
++ struct usb_device *snd_dev;
++ char *input_dev_path, *usb_dev_path;
++ size_t usb_dev_path_len;
++ bool match = false;
++
++ mei = container_of(handler, struct dualsense_mixer_elem_info, ih);
++ snd_dev = mei->info.head.mixer->chip->dev;
++
++ input_dev_path = kobject_get_path(&dev->dev.kobj, GFP_KERNEL);
++ if (!input_dev_path) {
++ dev_warn(&snd_dev->dev, "Failed to get input dev path\n");
++ return false;
++ }
++
++ usb_dev_path = kobject_get_path(&snd_dev->dev.kobj, GFP_KERNEL);
++ if (!usb_dev_path) {
++ dev_warn(&snd_dev->dev, "Failed to get USB dev path\n");
++ goto free_paths;
++ }
++
++ /*
++ * Ensure the VID:PID matched input device supposedly owned by the
++ * hid-playstation driver belongs to the actual hardware handled by
++ * the current USB audio device, which implies input_dev_path being
++ * a subpath of usb_dev_path.
++ *
++ * This verification is necessary when there is more than one identical
++ * controller attached to the host system.
++ */
++ usb_dev_path_len = strlen(usb_dev_path);
++ if (usb_dev_path_len >= strlen(input_dev_path))
++ goto free_paths;
++
++ usb_dev_path[usb_dev_path_len] = '/';
++ match = !memcmp(input_dev_path, usb_dev_path, usb_dev_path_len + 1);
++
++free_paths:
++ kfree(input_dev_path);
++ kfree(usb_dev_path);
++
++ return match;
++}
++
++static int snd_dualsense_ih_connect(struct input_handler *handler,
++ struct input_dev *dev,
++ const struct input_device_id *id)
++{
++ struct input_handle *handle;
++ int err;
++
++ handle = kzalloc(sizeof(*handle), GFP_KERNEL);
++ if (!handle)
++ return -ENOMEM;
++
++ handle->dev = dev;
++ handle->handler = handler;
++ handle->name = handler->name;
++
++ err = input_register_handle(handle);
++ if (err)
++ goto err_free;
++
++ err = input_open_device(handle);
++ if (err)
++ goto err_unregister;
++
++ return 0;
++
++err_unregister:
++ input_unregister_handle(handle);
++err_free:
++ kfree(handle);
++ return err;
++}
++
++static void snd_dualsense_ih_disconnect(struct input_handle *handle)
++{
++ input_close_device(handle);
++ input_unregister_handle(handle);
++ kfree(handle);
++}
++
++static void snd_dualsense_ih_start(struct input_handle *handle)
++{
++ struct dualsense_mixer_elem_info *mei;
++ struct usb_mixer_elem_list *me;
++ int status = -1;
++
++ mei = container_of(handle->handler, struct dualsense_mixer_elem_info, ih);
++ me = &mei->info.head;
++
++ if (me->id == SND_DUALSENSE_JACK_OUT_TERM_ID &&
++ test_bit(SW_HEADPHONE_INSERT, handle->dev->swbit))
++ status = test_bit(SW_HEADPHONE_INSERT, handle->dev->sw);
++ else if (me->id == SND_DUALSENSE_JACK_IN_TERM_ID &&
++ test_bit(SW_MICROPHONE_INSERT, handle->dev->swbit))
++ status = test_bit(SW_MICROPHONE_INSERT, handle->dev->sw);
++
++ if (status >= 0) {
++ mei->connected = !!status;
++ snd_ctl_notify(me->mixer->chip->card, SNDRV_CTL_EVENT_MASK_VALUE,
++ &me->kctl->id);
++ }
++}
++
++static int snd_dualsense_jack_get(struct snd_kcontrol *kctl,
++ struct snd_ctl_elem_value *ucontrol)
++{
++ struct dualsense_mixer_elem_info *mei = snd_kcontrol_chip(kctl);
++
++ ucontrol->value.integer.value[0] = mei->connected;
++
++ return 0;
++}
++
++static const struct snd_kcontrol_new snd_dualsense_jack_control = {
++ .iface = SNDRV_CTL_ELEM_IFACE_CARD,
++ .access = SNDRV_CTL_ELEM_ACCESS_READ,
++ .info = snd_ctl_boolean_mono_info,
++ .get = snd_dualsense_jack_get,
++};
++
++static int snd_dualsense_resume_jack(struct usb_mixer_elem_list *list)
++{
++ snd_ctl_notify(list->mixer->chip->card, SNDRV_CTL_EVENT_MASK_VALUE,
++ &list->kctl->id);
++ return 0;
++}
++
++static void snd_dualsense_mixer_elem_free(struct snd_kcontrol *kctl)
++{
++ struct dualsense_mixer_elem_info *mei = snd_kcontrol_chip(kctl);
++
++ if (mei->ih.event)
++ input_unregister_handler(&mei->ih);
++
++ snd_usb_mixer_elem_free(kctl);
++}
++
++static int snd_dualsense_jack_create(struct usb_mixer_interface *mixer,
++ const char *name, bool is_output)
++{
++ struct dualsense_mixer_elem_info *mei;
++ struct input_device_id *idev_id;
++ struct snd_kcontrol *kctl;
++ int err;
++
++ mei = kzalloc(sizeof(*mei), GFP_KERNEL);
++ if (!mei)
++ return -ENOMEM;
++
++ snd_usb_mixer_elem_init_std(&mei->info.head, mixer,
++ is_output ? SND_DUALSENSE_JACK_OUT_TERM_ID :
++ SND_DUALSENSE_JACK_IN_TERM_ID);
++
++ mei->info.head.resume = snd_dualsense_resume_jack;
++ mei->info.val_type = USB_MIXER_BOOLEAN;
++ mei->info.channels = 1;
++ mei->info.min = 0;
++ mei->info.max = 1;
++
++ kctl = snd_ctl_new1(&snd_dualsense_jack_control, mei);
++ if (!kctl) {
++ kfree(mei);
++ return -ENOMEM;
++ }
++
++ strscpy(kctl->id.name, name, sizeof(kctl->id.name));
++ kctl->private_free = snd_dualsense_mixer_elem_free;
++
++ err = snd_usb_mixer_add_control(&mei->info.head, kctl);
++ if (err)
++ return err;
++
++ idev_id = &mei->id_table[0];
++ idev_id->flags = INPUT_DEVICE_ID_MATCH_VENDOR | INPUT_DEVICE_ID_MATCH_PRODUCT |
++ INPUT_DEVICE_ID_MATCH_EVBIT | INPUT_DEVICE_ID_MATCH_SWBIT;
++ idev_id->vendor = USB_ID_VENDOR(mixer->chip->usb_id);
++ idev_id->product = USB_ID_PRODUCT(mixer->chip->usb_id);
++ idev_id->evbit[BIT_WORD(EV_SW)] = BIT_MASK(EV_SW);
++ if (is_output)
++ idev_id->swbit[BIT_WORD(SW_HEADPHONE_INSERT)] = BIT_MASK(SW_HEADPHONE_INSERT);
++ else
++ idev_id->swbit[BIT_WORD(SW_MICROPHONE_INSERT)] = BIT_MASK(SW_MICROPHONE_INSERT);
++
++ mei->ih.event = snd_dualsense_ih_event;
++ mei->ih.match = snd_dualsense_ih_match;
++ mei->ih.connect = snd_dualsense_ih_connect,
++ mei->ih.disconnect = snd_dualsense_ih_disconnect,
++ mei->ih.start = snd_dualsense_ih_start,
++ mei->ih.name = name;
++ mei->ih.id_table = mei->id_table;
++
++ err = input_register_handler(&mei->ih);
++ if (err) {
++ dev_warn(&mixer->chip->dev->dev,
++ "Could not register input handler: %d\n", err);
++ mei->ih.event = NULL;
++ }
++
++ return 0;
++}
++
++static int snd_dualsense_controls_create(struct usb_mixer_interface *mixer)
++{
++ int err;
++
++ err = snd_dualsense_jack_create(mixer, "Headphone Jack", true);
++ if (err < 0)
++ return err;
++
++ return snd_dualsense_jack_create(mixer, "Headset Mic Jack", false);
++}
++
+ /* ASUS Xonar U1 / U3 controls */
+
+ static int snd_xonar_u1_switch_get(struct snd_kcontrol *kcontrol,
+@@ -2381,6 +2639,11 @@ int snd_usb_mixer_apply_create_quirk(struct usb_mixer_interface *mixer)
+ err = snd_emu0204_controls_create(mixer);
+ break;
+
++ case USB_ID(0x054c, 0x0ce6): /* Sony DualSense controller (PS5) */
++ case USB_ID(0x054c, 0x0df2): /* Sony DualSense Edge controller (PS5) */
++ err = snd_dualsense_controls_create(mixer);
++ break;
++
+ case USB_ID(0x0763, 0x2030): /* M-Audio Fast Track C400 */
+ case USB_ID(0x0763, 0x2031): /* M-Audio Fast Track C400 */
+ err = snd_c400_create_mixer(mixer);
+--
+2.51.0
+
--- /dev/null
+From 842952962e0b96d3bd7d6a2a836a524a0748a91f Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 26 May 2025 17:07:45 +0300
+Subject: ALSA: usb-audio: Avoid multiple assignments in mixer_quirks
+
+From: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+
+[ Upstream commit 03ddd3bdb94df3edb1f2408b57cfb00b3d92a208 ]
+
+Handle report from checkpatch.pl:
+
+ CHECK: multiple assignments should be avoided
+
+Signed-off-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Link: https://patch.msgid.link/20250526-dualsense-alsa-jack-v1-6-1a821463b632@collabora.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/mixer_quirks.c | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
+index 96397a4fdf873..22f483fee5f8c 100644
+--- a/sound/usb/mixer_quirks.c
++++ b/sound/usb/mixer_quirks.c
+@@ -1592,7 +1592,8 @@ static int snd_microii_spdif_default_put(struct snd_kcontrol *kcontrol,
+ unsigned int pval, pval_old;
+ int err;
+
+- pval = pval_old = kcontrol->private_value;
++ pval = kcontrol->private_value;
++ pval_old = pval;
+ pval &= 0xfffff0f0;
+ pval |= (ucontrol->value.iec958.status[1] & 0x0f) << 8;
+ pval |= (ucontrol->value.iec958.status[0] & 0x0f);
+--
+2.51.0
+
--- /dev/null
+From c25cb2a2d7c5be595b76968b3b509ba09dbbb188 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 12 Jun 2025 14:02:28 +0800
+Subject: ALSA: usb-audio: Convert comma to semicolon
+
+From: Chen Ni <nichen@iscas.ac.cn>
+
+[ Upstream commit 9ca30a1b007d5fefb5752428f852a2d8d7219c1c ]
+
+Replace comma between expressions with semicolons.
+
+Using a ',' in place of a ';' can have unintended side effects.
+Although that is not the case here, it is seems best to use ';'
+unless ',' is intended.
+
+Found by inspection.
+No functional change intended.
+Compile tested only.
+
+Fixes: 79d561c4ec04 ("ALSA: usb-audio: Add mixer quirk for Sony DualSense PS5")
+Signed-off-by: Chen Ni <nichen@iscas.ac.cn>
+Reviewed-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+Link: https://patch.msgid.link/20250612060228.1518028-1-nichen@iscas.ac.cn
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/mixer_quirks.c | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
+index cea1c970359c1..833f894a692c7 100644
+--- a/sound/usb/mixer_quirks.c
++++ b/sound/usb/mixer_quirks.c
+@@ -757,9 +757,9 @@ static int snd_dualsense_jack_create(struct usb_mixer_interface *mixer,
+
+ mei->ih.event = snd_dualsense_ih_event;
+ mei->ih.match = snd_dualsense_ih_match;
+- mei->ih.connect = snd_dualsense_ih_connect,
+- mei->ih.disconnect = snd_dualsense_ih_disconnect,
+- mei->ih.start = snd_dualsense_ih_start,
++ mei->ih.connect = snd_dualsense_ih_connect;
++ mei->ih.disconnect = snd_dualsense_ih_disconnect;
++ mei->ih.start = snd_dualsense_ih_start;
+ mei->ih.name = name;
+ mei->ih.id_table = mei->id_table;
+
+--
+2.51.0
+
--- /dev/null
+From ce22a988ef225658f2555d443e36fa1ea5a91932 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 26 May 2025 17:07:43 +0300
+Subject: ALSA: usb-audio: Fix block comments in mixer_quirks
+
+From: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+
+[ Upstream commit 231225d8a20f8668b4fd6601d54a2fac0e0ab7a5 ]
+
+Address a couple of comment formatting issues indicated by
+checkpatch.pl:
+
+ WARNING: Block comments use a trailing */ on a separate line
+
+Signed-off-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Link: https://patch.msgid.link/20250526-dualsense-alsa-jack-v1-4-1a821463b632@collabora.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/mixer_quirks.c | 6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
+
+diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
+index bc065ec997f39..96397a4fdf873 100644
+--- a/sound/usb/mixer_quirks.c
++++ b/sound/usb/mixer_quirks.c
+@@ -75,7 +75,8 @@ static int snd_create_std_mono_ctl_offset(struct usb_mixer_interface *mixer,
+ cval->idx_off = idx_off;
+
+ /* get_min_max() is called only for integer volumes later,
+- * so provide a short-cut for booleans */
++ * so provide a short-cut for booleans
++ */
+ cval->min = 0;
+ cval->max = 1;
+ cval->res = 0;
+@@ -2502,7 +2503,8 @@ static void snd_dragonfly_quirk_db_scale(struct usb_mixer_interface *mixer,
+ struct snd_kcontrol *kctl)
+ {
+ /* Approximation using 10 ranges based on output measurement on hw v1.2.
+- * This seems close to the cubic mapping e.g. alsamixer uses. */
++ * This seems close to the cubic mapping e.g. alsamixer uses.
++ */
+ static const DECLARE_TLV_DB_RANGE(scale,
+ 0, 1, TLV_DB_MINMAX_ITEM(-5300, -4970),
+ 2, 5, TLV_DB_MINMAX_ITEM(-4710, -4160),
+--
+2.51.0
+
--- /dev/null
+From 9a538dc8bb5946599c7d20b2e917ec428e68a3be Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 13 Jun 2025 10:15:30 +0200
+Subject: ALSA: usb-audio: Fix build with CONFIG_INPUT=n
+
+From: Takashi Iwai <tiwai@suse.de>
+
+[ Upstream commit d0630a0b80c08530857146e3bf183a7d6b743847 ]
+
+The recent addition of DualSense mixer quirk relies on the input
+device handle, and the build can fail if CONFIG_INPUT isn't set.
+Put (rather ugly) workarounds to wrap with IS_REACHABLE() for avoiding
+the build error.
+
+Fixes: 79d561c4ec04 ("ALSA: usb-audio: Add mixer quirk for Sony DualSense PS5")
+Reported-by: kernel test robot <lkp@intel.com>
+Closes: https://lore.kernel.org/oe-kbuild-all/202506130733.gnPKw2l3-lkp@intel.com/
+Reviewed-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+Link: https://patch.msgid.link/20250613081543.7404-1-tiwai@suse.de
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/mixer_quirks.c | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
+index 833f894a692c7..974926d907c2f 100644
+--- a/sound/usb/mixer_quirks.c
++++ b/sound/usb/mixer_quirks.c
+@@ -527,6 +527,7 @@ static int snd_emu0204_controls_create(struct usb_mixer_interface *mixer)
+ &snd_emu0204_control, NULL);
+ }
+
++#if IS_REACHABLE(CONFIG_INPUT)
+ /*
+ * Sony DualSense controller (PS5) jack detection
+ *
+@@ -783,6 +784,7 @@ static int snd_dualsense_controls_create(struct usb_mixer_interface *mixer)
+
+ return snd_dualsense_jack_create(mixer, "Headset Mic Jack", false);
+ }
++#endif /* IS_REACHABLE(CONFIG_INPUT) */
+
+ /* ASUS Xonar U1 / U3 controls */
+
+@@ -2639,10 +2641,12 @@ int snd_usb_mixer_apply_create_quirk(struct usb_mixer_interface *mixer)
+ err = snd_emu0204_controls_create(mixer);
+ break;
+
++#if IS_REACHABLE(CONFIG_INPUT)
+ case USB_ID(0x054c, 0x0ce6): /* Sony DualSense controller (PS5) */
+ case USB_ID(0x054c, 0x0df2): /* Sony DualSense Edge controller (PS5) */
+ err = snd_dualsense_controls_create(mixer);
+ break;
++#endif /* IS_REACHABLE(CONFIG_INPUT) */
+
+ case USB_ID(0x0763, 0x2030): /* M-Audio Fast Track C400 */
+ case USB_ID(0x0763, 0x2031): /* M-Audio Fast Track C400 */
+--
+2.51.0
+
--- /dev/null
+From 3614852efe3537eae8739e9dca2d8647f0a7b17e Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 26 May 2025 17:07:47 +0300
+Subject: ALSA: usb-audio: Remove unneeded wmb() in mixer_quirks
+
+From: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+
+[ Upstream commit 9cea7425595697802e8d55a322a251999554b8b1 ]
+
+Adding a memory barrier before wake_up() in
+snd_usb_soundblaster_remote_complete() is supposed to ensure the write
+to mixer->rc_code is visible in wait_event_interruptible() from
+snd_usb_sbrc_hwdep_read().
+
+However, this is not really necessary, since wake_up() is just a wrapper
+over __wake_up() which already executes a full memory barrier before
+accessing the state of the task to be waken up.
+
+Drop the redundant call to wmb() and implicitly fix the checkpatch
+complaint:
+
+ WARNING: memory barrier without comment
+
+Signed-off-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Link: https://patch.msgid.link/20250526-dualsense-alsa-jack-v1-8-1a821463b632@collabora.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/mixer_quirks.c | 1 -
+ 1 file changed, 1 deletion(-)
+
+diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
+index f318b80d646d5..03d49d4c5141d 100644
+--- a/sound/usb/mixer_quirks.c
++++ b/sound/usb/mixer_quirks.c
+@@ -207,7 +207,6 @@ static void snd_usb_soundblaster_remote_complete(struct urb *urb)
+ if (code == rc->mute_code)
+ snd_usb_mixer_notify_id(mixer, rc->mute_mixer_id);
+ mixer->rc_code = code;
+- wmb();
+ wake_up(&mixer->rc_waitq);
+ }
+
+--
+2.51.0
+
--- /dev/null
+From 76c77107b9a92ca2915c09de59e9347d04bcad88 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 26 May 2025 17:07:46 +0300
+Subject: ALSA: usb-audio: Simplify NULL comparison in mixer_quirks
+
+From: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+
+[ Upstream commit f2d6d660e8fd5f4467e80743f82119201e67fa9c ]
+
+Handle report from checkpatch.pl:
+
+ CHECK: Comparison to NULL could be written "t->name"
+
+Signed-off-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Link: https://patch.msgid.link/20250526-dualsense-alsa-jack-v1-7-1a821463b632@collabora.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/mixer_quirks.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
+index 22f483fee5f8c..f318b80d646d5 100644
+--- a/sound/usb/mixer_quirks.c
++++ b/sound/usb/mixer_quirks.c
+@@ -125,7 +125,7 @@ static int snd_create_std_mono_table(struct usb_mixer_interface *mixer,
+ {
+ int err;
+
+- while (t->name != NULL) {
++ while (t->name) {
+ err = snd_create_std_mono_ctl(mixer, t->unitid, t->control,
+ t->cmask, t->val_type, t->name, t->tlv_callback);
+ if (err < 0)
+--
+2.51.0
+
--- /dev/null
+From 401eb36971159200b5cb73c00f6412c54dfdcb1f Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sat, 20 Sep 2025 11:51:48 +0900
+Subject: firewire: core: fix overlooked update of subsystem ABI version
+
+From: Takashi Sakamoto <o-takashi@sakamocchi.jp>
+
+[ Upstream commit 853a57ba263adfecf4430b936d6862bc475b4bb5 ]
+
+In kernel v6.5, several functions were added to the cdev layer. This
+required updating the default version of subsystem ABI up to 6, but
+this requirement was overlooked.
+
+This commit updates the version accordingly.
+
+Fixes: 6add87e9764d ("firewire: cdev: add new version of ABI to notify time stamp at request/response subaction of transaction#")
+Link: https://lore.kernel.org/r/20250920025148.163402-1-o-takashi@sakamocchi.jp
+Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/firewire/core-cdev.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/firewire/core-cdev.c b/drivers/firewire/core-cdev.c
+index 4fe36d549d615..f3f2c8fa8463f 100644
+--- a/drivers/firewire/core-cdev.c
++++ b/drivers/firewire/core-cdev.c
+@@ -38,7 +38,7 @@
+ /*
+ * ABI version history is documented in linux/firewire-cdev.h.
+ */
+-#define FW_CDEV_KERNEL_VERSION 5
++#define FW_CDEV_KERNEL_VERSION 6
+ #define FW_CDEV_VERSION_EVENT_REQUEST2 4
+ #define FW_CDEV_VERSION_ALLOCATE_REGION_END 4
+ #define FW_CDEV_VERSION_AUTO_FLUSH_ISO_OVERFLOW 5
+--
+2.51.0
+
--- /dev/null
+From b868d928960547389f71b12f735be47fd96f884b Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 13 Aug 2025 15:43:20 +0300
+Subject: IB/mlx5: Fix obj_type mismatch for SRQ event subscriptions
+
+From: Or Har-Toov <ohartoov@nvidia.com>
+
+[ Upstream commit 85fe9f565d2d5af95ac2bbaa5082b8ce62b039f5 ]
+
+Fix a bug where the driver's event subscription logic for SRQ-related
+events incorrectly sets obj_type for RMP objects.
+
+When subscribing to SRQ events, get_legacy_obj_type() did not handle
+the MLX5_CMD_OP_CREATE_RMP case, which caused obj_type to be 0
+(default).
+This led to a mismatch between the obj_type used during subscription
+(0) and the value used during notification (1, taken from the event's
+type field). As a result, event mapping for SRQ objects could fail and
+event notification would not be delivered correctly.
+
+This fix adds handling for MLX5_CMD_OP_CREATE_RMP in get_legacy_obj_type,
+returning MLX5_EVENT_QUEUE_TYPE_RQ so obj_type is consistent between
+subscription and notification.
+
+Fixes: 759738537142 ("IB/mlx5: Enable subscription for device events over DEVX")
+Link: https://patch.msgid.link/r/8f1048e3fdd1fde6b90607ce0ed251afaf8a148c.1755088962.git.leon@kernel.org
+Signed-off-by: Or Har-Toov <ohartoov@nvidia.com>
+Reviewed-by: Edward Srouji <edwards@nvidia.com>
+Signed-off-by: Leon Romanovsky <leonro@nvidia.com>
+Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/infiniband/hw/mlx5/devx.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/drivers/infiniband/hw/mlx5/devx.c b/drivers/infiniband/hw/mlx5/devx.c
+index ad8057bfd0c8b..3d7e067fde099 100644
+--- a/drivers/infiniband/hw/mlx5/devx.c
++++ b/drivers/infiniband/hw/mlx5/devx.c
+@@ -245,6 +245,7 @@ static u16 get_legacy_obj_type(u16 opcode)
+ {
+ switch (opcode) {
+ case MLX5_CMD_OP_CREATE_RQ:
++ case MLX5_CMD_OP_CREATE_RMP:
+ return MLX5_EVENT_QUEUE_TYPE_RQ;
+ case MLX5_CMD_OP_CREATE_QP:
+ return MLX5_EVENT_QUEUE_TYPE_QP;
+--
+2.51.0
+
net-rfkill-gpio-add-dt-support.patch
net-rfkill-gpio-fix-crash-due-to-dereferencering-uninitialized-pointer.patch
kvm-svm-sync-tpr-from-lapic-into-vmcb-v_tpr-even-if-avic-is-active.patch
+firewire-core-fix-overlooked-update-of-subsystem-abi.patch
+alsa-usb-audio-fix-block-comments-in-mixer_quirks.patch
+alsa-usb-audio-avoid-multiple-assignments-in-mixer_q.patch
+alsa-usb-audio-simplify-null-comparison-in-mixer_qui.patch
+alsa-usb-audio-remove-unneeded-wmb-in-mixer_quirks.patch
+alsa-usb-audio-add-mixer-quirk-for-sony-dualsense-ps.patch
+alsa-usb-audio-convert-comma-to-semicolon.patch
+alsa-usb-audio-fix-build-with-config_input-n.patch
+usb-core-add-0x-prefix-to-quirks-debug-output.patch
+ib-mlx5-fix-obj_type-mismatch-for-srq-event-subscrip.patch
--- /dev/null
+From 65af9c23427d32d4952b16de47008f4d0440e5c0 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 3 Jun 2025 15:10:45 +0800
+Subject: usb: core: Add 0x prefix to quirks debug output
+
+From: Jiayi Li <lijiayi@kylinos.cn>
+
+[ Upstream commit 47c428fce0b41b15ab321d8ede871f780ccd038f ]
+
+Use "0x%x" format for quirks debug print to clarify it's a hexadecimal
+value. Improves readability and consistency with other hex outputs.
+
+Signed-off-by: Jiayi Li <lijiayi@kylinos.cn>
+Link: https://lore.kernel.org/r/20250603071045.3243699-1-lijiayi@kylinos.cn
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/usb/core/quirks.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/usb/core/quirks.c b/drivers/usb/core/quirks.c
+index 75a4d162c58b3..716bcf9f4d347 100644
+--- a/drivers/usb/core/quirks.c
++++ b/drivers/usb/core/quirks.c
+@@ -728,7 +728,7 @@ void usb_detect_quirks(struct usb_device *udev)
+ udev->quirks ^= usb_detect_dynamic_quirks(udev);
+
+ if (udev->quirks)
+- dev_dbg(&udev->dev, "USB quirks for this device: %x\n",
++ dev_dbg(&udev->dev, "USB quirks for this device: 0x%x\n",
+ udev->quirks);
+
+ #ifdef CONFIG_USB_DEFAULT_PERSIST
+--
+2.51.0
+
--- /dev/null
+From 3339871db55d720fa4f008d4d0f920ca15e30e5f Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 31 Jul 2025 19:06:14 +0800
+Subject: ALSA: usb-audio: Add DSD support for Comtrue USB Audio device
+
+From: noble.yang <noble.yang@comtrue-inc.com>
+
+[ Upstream commit e9df1755485dd90a89656e8a21ec4d71c909fa30 ]
+
+The vendor Comtrue Inc. (0x2fc6) produces USB audio chipsets like
+the CT7601 which are capable of Native DSD playback.
+
+This patch adds QUIRK_FLAG_DSD_RAW for Comtrue (VID 0x2fc6), which enables
+native DSD playback (DSD_U32_LE) on their USB Audio device. This has been
+verified under Ubuntu 25.04 with JRiver.
+
+Signed-off-by: noble.yang <noble.yang@comtrue-inc.com>
+Link: https://patch.msgid.link/20250731110614.4070-1-noble228@gmail.com
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/quirks.c | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/sound/usb/quirks.c b/sound/usb/quirks.c
+index ac43bdf6e9ca6..d4f4466b028c8 100644
+--- a/sound/usb/quirks.c
++++ b/sound/usb/quirks.c
+@@ -2303,6 +2303,8 @@ static const struct usb_audio_quirk_flags_table quirk_flags_table[] = {
+ QUIRK_FLAG_DSD_RAW),
+ VENDOR_FLG(0x2d87, /* Cayin device */
+ QUIRK_FLAG_DSD_RAW),
++ VENDOR_FLG(0x2fc6, /* Comture-inc devices */
++ QUIRK_FLAG_DSD_RAW),
+ VENDOR_FLG(0x3336, /* HEM devices */
+ QUIRK_FLAG_DSD_RAW),
+ VENDOR_FLG(0x3353, /* Khadas devices */
+--
+2.51.0
+
--- /dev/null
+From b461a21e43fb1f5e0737a130fafa63e43e00fcfe Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 26 May 2025 17:07:48 +0300
+Subject: ALSA: usb-audio: Add mixer quirk for Sony DualSense PS5
+
+From: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+
+[ Upstream commit 79d561c4ec0497669f19a9550cfb74812f60938b ]
+
+The Sony DualSense wireless controller (PS5) features an internal mono
+speaker, but it also provides a 3.5mm jack socket for headphone output
+and headset microphone input.
+
+Since this is a UAC1 device, it doesn't advertise any jack detection
+capability. However, the controller is able to report HP & MIC insert
+events via HID, i.e. through a dedicated input device managed by the
+hid-playstation driver.
+
+Add a quirk to create the jack controls for headphone and headset mic,
+respectively, and setup an input handler for each of them in order to
+intercept the related hotplug events.
+
+Signed-off-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Link: https://patch.msgid.link/20250526-dualsense-alsa-jack-v1-9-1a821463b632@collabora.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/mixer_quirks.c | 263 +++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 263 insertions(+)
+
+diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
+index e5252167d6a40..95fa1c31ae550 100644
+--- a/sound/usb/mixer_quirks.c
++++ b/sound/usb/mixer_quirks.c
+@@ -16,6 +16,7 @@
+
+ #include <linux/hid.h>
+ #include <linux/init.h>
++#include <linux/input.h>
+ #include <linux/math64.h>
+ #include <linux/slab.h>
+ #include <linux/usb.h>
+@@ -527,6 +528,263 @@ static int snd_emu0204_controls_create(struct usb_mixer_interface *mixer)
+ &snd_emu0204_control, NULL);
+ }
+
++/*
++ * Sony DualSense controller (PS5) jack detection
++ *
++ * Since this is an UAC 1 device, it doesn't support jack detection.
++ * However, the controller hid-playstation driver reports HP & MIC
++ * insert events through a dedicated input device.
++ */
++
++#define SND_DUALSENSE_JACK_OUT_TERM_ID 3
++#define SND_DUALSENSE_JACK_IN_TERM_ID 4
++
++struct dualsense_mixer_elem_info {
++ struct usb_mixer_elem_info info;
++ struct input_handler ih;
++ struct input_device_id id_table[2];
++ bool connected;
++};
++
++static void snd_dualsense_ih_event(struct input_handle *handle,
++ unsigned int type, unsigned int code,
++ int value)
++{
++ struct dualsense_mixer_elem_info *mei;
++ struct usb_mixer_elem_list *me;
++
++ if (type != EV_SW)
++ return;
++
++ mei = container_of(handle->handler, struct dualsense_mixer_elem_info, ih);
++ me = &mei->info.head;
++
++ if ((me->id == SND_DUALSENSE_JACK_OUT_TERM_ID && code == SW_HEADPHONE_INSERT) ||
++ (me->id == SND_DUALSENSE_JACK_IN_TERM_ID && code == SW_MICROPHONE_INSERT)) {
++ mei->connected = !!value;
++ snd_ctl_notify(me->mixer->chip->card, SNDRV_CTL_EVENT_MASK_VALUE,
++ &me->kctl->id);
++ }
++}
++
++static bool snd_dualsense_ih_match(struct input_handler *handler,
++ struct input_dev *dev)
++{
++ struct dualsense_mixer_elem_info *mei;
++ struct usb_device *snd_dev;
++ char *input_dev_path, *usb_dev_path;
++ size_t usb_dev_path_len;
++ bool match = false;
++
++ mei = container_of(handler, struct dualsense_mixer_elem_info, ih);
++ snd_dev = mei->info.head.mixer->chip->dev;
++
++ input_dev_path = kobject_get_path(&dev->dev.kobj, GFP_KERNEL);
++ if (!input_dev_path) {
++ dev_warn(&snd_dev->dev, "Failed to get input dev path\n");
++ return false;
++ }
++
++ usb_dev_path = kobject_get_path(&snd_dev->dev.kobj, GFP_KERNEL);
++ if (!usb_dev_path) {
++ dev_warn(&snd_dev->dev, "Failed to get USB dev path\n");
++ goto free_paths;
++ }
++
++ /*
++ * Ensure the VID:PID matched input device supposedly owned by the
++ * hid-playstation driver belongs to the actual hardware handled by
++ * the current USB audio device, which implies input_dev_path being
++ * a subpath of usb_dev_path.
++ *
++ * This verification is necessary when there is more than one identical
++ * controller attached to the host system.
++ */
++ usb_dev_path_len = strlen(usb_dev_path);
++ if (usb_dev_path_len >= strlen(input_dev_path))
++ goto free_paths;
++
++ usb_dev_path[usb_dev_path_len] = '/';
++ match = !memcmp(input_dev_path, usb_dev_path, usb_dev_path_len + 1);
++
++free_paths:
++ kfree(input_dev_path);
++ kfree(usb_dev_path);
++
++ return match;
++}
++
++static int snd_dualsense_ih_connect(struct input_handler *handler,
++ struct input_dev *dev,
++ const struct input_device_id *id)
++{
++ struct input_handle *handle;
++ int err;
++
++ handle = kzalloc(sizeof(*handle), GFP_KERNEL);
++ if (!handle)
++ return -ENOMEM;
++
++ handle->dev = dev;
++ handle->handler = handler;
++ handle->name = handler->name;
++
++ err = input_register_handle(handle);
++ if (err)
++ goto err_free;
++
++ err = input_open_device(handle);
++ if (err)
++ goto err_unregister;
++
++ return 0;
++
++err_unregister:
++ input_unregister_handle(handle);
++err_free:
++ kfree(handle);
++ return err;
++}
++
++static void snd_dualsense_ih_disconnect(struct input_handle *handle)
++{
++ input_close_device(handle);
++ input_unregister_handle(handle);
++ kfree(handle);
++}
++
++static void snd_dualsense_ih_start(struct input_handle *handle)
++{
++ struct dualsense_mixer_elem_info *mei;
++ struct usb_mixer_elem_list *me;
++ int status = -1;
++
++ mei = container_of(handle->handler, struct dualsense_mixer_elem_info, ih);
++ me = &mei->info.head;
++
++ if (me->id == SND_DUALSENSE_JACK_OUT_TERM_ID &&
++ test_bit(SW_HEADPHONE_INSERT, handle->dev->swbit))
++ status = test_bit(SW_HEADPHONE_INSERT, handle->dev->sw);
++ else if (me->id == SND_DUALSENSE_JACK_IN_TERM_ID &&
++ test_bit(SW_MICROPHONE_INSERT, handle->dev->swbit))
++ status = test_bit(SW_MICROPHONE_INSERT, handle->dev->sw);
++
++ if (status >= 0) {
++ mei->connected = !!status;
++ snd_ctl_notify(me->mixer->chip->card, SNDRV_CTL_EVENT_MASK_VALUE,
++ &me->kctl->id);
++ }
++}
++
++static int snd_dualsense_jack_get(struct snd_kcontrol *kctl,
++ struct snd_ctl_elem_value *ucontrol)
++{
++ struct dualsense_mixer_elem_info *mei = snd_kcontrol_chip(kctl);
++
++ ucontrol->value.integer.value[0] = mei->connected;
++
++ return 0;
++}
++
++static const struct snd_kcontrol_new snd_dualsense_jack_control = {
++ .iface = SNDRV_CTL_ELEM_IFACE_CARD,
++ .access = SNDRV_CTL_ELEM_ACCESS_READ,
++ .info = snd_ctl_boolean_mono_info,
++ .get = snd_dualsense_jack_get,
++};
++
++static int snd_dualsense_resume_jack(struct usb_mixer_elem_list *list)
++{
++ snd_ctl_notify(list->mixer->chip->card, SNDRV_CTL_EVENT_MASK_VALUE,
++ &list->kctl->id);
++ return 0;
++}
++
++static void snd_dualsense_mixer_elem_free(struct snd_kcontrol *kctl)
++{
++ struct dualsense_mixer_elem_info *mei = snd_kcontrol_chip(kctl);
++
++ if (mei->ih.event)
++ input_unregister_handler(&mei->ih);
++
++ snd_usb_mixer_elem_free(kctl);
++}
++
++static int snd_dualsense_jack_create(struct usb_mixer_interface *mixer,
++ const char *name, bool is_output)
++{
++ struct dualsense_mixer_elem_info *mei;
++ struct input_device_id *idev_id;
++ struct snd_kcontrol *kctl;
++ int err;
++
++ mei = kzalloc(sizeof(*mei), GFP_KERNEL);
++ if (!mei)
++ return -ENOMEM;
++
++ snd_usb_mixer_elem_init_std(&mei->info.head, mixer,
++ is_output ? SND_DUALSENSE_JACK_OUT_TERM_ID :
++ SND_DUALSENSE_JACK_IN_TERM_ID);
++
++ mei->info.head.resume = snd_dualsense_resume_jack;
++ mei->info.val_type = USB_MIXER_BOOLEAN;
++ mei->info.channels = 1;
++ mei->info.min = 0;
++ mei->info.max = 1;
++
++ kctl = snd_ctl_new1(&snd_dualsense_jack_control, mei);
++ if (!kctl) {
++ kfree(mei);
++ return -ENOMEM;
++ }
++
++ strscpy(kctl->id.name, name, sizeof(kctl->id.name));
++ kctl->private_free = snd_dualsense_mixer_elem_free;
++
++ err = snd_usb_mixer_add_control(&mei->info.head, kctl);
++ if (err)
++ return err;
++
++ idev_id = &mei->id_table[0];
++ idev_id->flags = INPUT_DEVICE_ID_MATCH_VENDOR | INPUT_DEVICE_ID_MATCH_PRODUCT |
++ INPUT_DEVICE_ID_MATCH_EVBIT | INPUT_DEVICE_ID_MATCH_SWBIT;
++ idev_id->vendor = USB_ID_VENDOR(mixer->chip->usb_id);
++ idev_id->product = USB_ID_PRODUCT(mixer->chip->usb_id);
++ idev_id->evbit[BIT_WORD(EV_SW)] = BIT_MASK(EV_SW);
++ if (is_output)
++ idev_id->swbit[BIT_WORD(SW_HEADPHONE_INSERT)] = BIT_MASK(SW_HEADPHONE_INSERT);
++ else
++ idev_id->swbit[BIT_WORD(SW_MICROPHONE_INSERT)] = BIT_MASK(SW_MICROPHONE_INSERT);
++
++ mei->ih.event = snd_dualsense_ih_event;
++ mei->ih.match = snd_dualsense_ih_match;
++ mei->ih.connect = snd_dualsense_ih_connect,
++ mei->ih.disconnect = snd_dualsense_ih_disconnect,
++ mei->ih.start = snd_dualsense_ih_start,
++ mei->ih.name = name;
++ mei->ih.id_table = mei->id_table;
++
++ err = input_register_handler(&mei->ih);
++ if (err) {
++ dev_warn(&mixer->chip->dev->dev,
++ "Could not register input handler: %d\n", err);
++ mei->ih.event = NULL;
++ }
++
++ return 0;
++}
++
++static int snd_dualsense_controls_create(struct usb_mixer_interface *mixer)
++{
++ int err;
++
++ err = snd_dualsense_jack_create(mixer, "Headphone Jack", true);
++ if (err < 0)
++ return err;
++
++ return snd_dualsense_jack_create(mixer, "Headset Mic Jack", false);
++}
++
+ /* ASUS Xonar U1 / U3 controls */
+
+ static int snd_xonar_u1_switch_get(struct snd_kcontrol *kcontrol,
+@@ -3390,6 +3648,11 @@ int snd_usb_mixer_apply_create_quirk(struct usb_mixer_interface *mixer)
+ err = snd_emu0204_controls_create(mixer);
+ break;
+
++ case USB_ID(0x054c, 0x0ce6): /* Sony DualSense controller (PS5) */
++ case USB_ID(0x054c, 0x0df2): /* Sony DualSense Edge controller (PS5) */
++ err = snd_dualsense_controls_create(mixer);
++ break;
++
+ case USB_ID(0x0763, 0x2030): /* M-Audio Fast Track C400 */
+ case USB_ID(0x0763, 0x2031): /* M-Audio Fast Track C400 */
+ err = snd_c400_create_mixer(mixer);
+--
+2.51.0
+
--- /dev/null
+From 067794f0ba8a4e731ac23c997e29806495c6ebf7 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 29 Aug 2025 14:40:48 +0800
+Subject: ALSA: usb-audio: Add mute TLV for playback volumes on more devices
+
+From: qaqland <anguoli@uniontech.com>
+
+[ Upstream commit 2cbe4ac193ed7172cfd825c0cc46ce4a41be4ba1 ]
+
+Applying the quirk of that, the lowest Playback mixer volume setting
+mutes the audio output, on more devices.
+
+Suggested-by: Cryolitia PukNgae <cryolitia@uniontech.com>
+Signed-off-by: qaqland <anguoli@uniontech.com>
+Link: https://patch.msgid.link/20250829-sound_quirk-v1-1-745529b44440@uniontech.com
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/quirks.c | 10 ++++++++++
+ 1 file changed, 10 insertions(+)
+
+diff --git a/sound/usb/quirks.c b/sound/usb/quirks.c
+index 5b1aa5c418999..2a862785fd939 100644
+--- a/sound/usb/quirks.c
++++ b/sound/usb/quirks.c
+@@ -2094,6 +2094,8 @@ static const struct usb_audio_quirk_flags_table quirk_flags_table[] = {
+ QUIRK_FLAG_SET_IFACE_FIRST),
+ DEVICE_FLG(0x0556, 0x0014, /* Phoenix Audio TMX320VC */
+ QUIRK_FLAG_GET_SAMPLE_RATE),
++ DEVICE_FLG(0x0572, 0x1b08, /* Conexant Systems (Rockwell), Inc. */
++ QUIRK_FLAG_MIXER_MIN_MUTE),
+ DEVICE_FLG(0x0572, 0x1b09, /* Conexant Systems (Rockwell), Inc. */
+ QUIRK_FLAG_MIXER_MIN_MUTE),
+ DEVICE_FLG(0x05a3, 0x9420, /* ELP HD USB Camera */
+@@ -2138,6 +2140,8 @@ static const struct usb_audio_quirk_flags_table quirk_flags_table[] = {
+ QUIRK_FLAG_CTL_MSG_DELAY_1M),
+ DEVICE_FLG(0x0b0e, 0x0349, /* Jabra 550a */
+ QUIRK_FLAG_CTL_MSG_DELAY_1M),
++ DEVICE_FLG(0x0bda, 0x498a, /* Realtek Semiconductor Corp. */
++ QUIRK_FLAG_MIXER_MIN_MUTE),
+ DEVICE_FLG(0x0c45, 0x6340, /* Sonix HD USB Camera */
+ QUIRK_FLAG_GET_SAMPLE_RATE),
+ DEVICE_FLG(0x0c45, 0x636b, /* Microdia JP001 USB Camera */
+@@ -2154,6 +2158,8 @@ static const struct usb_audio_quirk_flags_table quirk_flags_table[] = {
+ QUIRK_FLAG_SHARE_MEDIA_DEVICE | QUIRK_FLAG_ALIGN_TRANSFER),
+ DEVICE_FLG(0x1101, 0x0003, /* Audioengine D1 */
+ QUIRK_FLAG_GET_SAMPLE_RATE),
++ DEVICE_FLG(0x12d1, 0x3a07, /* Huawei Technologies Co., Ltd. */
++ QUIRK_FLAG_MIXER_MIN_MUTE),
+ DEVICE_FLG(0x1224, 0x2a25, /* Jieli Technology USB PHY 2.0 */
+ QUIRK_FLAG_GET_SAMPLE_RATE | QUIRK_FLAG_MIC_RES_16),
+ DEVICE_FLG(0x1395, 0x740a, /* Sennheiser DECT */
+@@ -2244,6 +2250,8 @@ static const struct usb_audio_quirk_flags_table quirk_flags_table[] = {
+ QUIRK_FLAG_IGNORE_CTL_ERROR),
+ DEVICE_FLG(0x2912, 0x30c8, /* Audioengine D1 */
+ QUIRK_FLAG_GET_SAMPLE_RATE),
++ DEVICE_FLG(0x2a70, 0x1881, /* OnePlus Technology (Shenzhen) Co., Ltd. BE02T */
++ QUIRK_FLAG_MIXER_MIN_MUTE),
+ DEVICE_FLG(0x2b53, 0x0023, /* Fiero SC-01 (firmware v1.0.0 @ 48 kHz) */
+ QUIRK_FLAG_GENERIC_IMPLICIT_FB),
+ DEVICE_FLG(0x2b53, 0x0024, /* Fiero SC-01 (firmware v1.0.0 @ 96 kHz) */
+@@ -2260,6 +2268,8 @@ static const struct usb_audio_quirk_flags_table quirk_flags_table[] = {
+ QUIRK_FLAG_CTL_MSG_DELAY_1M),
+ DEVICE_FLG(0x30be, 0x0101, /* Schiit Hel */
+ QUIRK_FLAG_IGNORE_CTL_ERROR),
++ DEVICE_FLG(0x339b, 0x3a07, /* Synaptics HONOR USB-C HEADSET */
++ QUIRK_FLAG_MIXER_MIN_MUTE),
+ DEVICE_FLG(0x413c, 0xa506, /* Dell AE515 sound bar */
+ QUIRK_FLAG_GET_SAMPLE_RATE),
+ DEVICE_FLG(0x534d, 0x0021, /* MacroSilicon MS2100/MS2106 */
+--
+2.51.0
+
--- /dev/null
+From ddc1d108cd14502709e1583e051cdd30464a4de2 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 26 May 2025 17:07:45 +0300
+Subject: ALSA: usb-audio: Avoid multiple assignments in mixer_quirks
+
+From: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+
+[ Upstream commit 03ddd3bdb94df3edb1f2408b57cfb00b3d92a208 ]
+
+Handle report from checkpatch.pl:
+
+ CHECK: multiple assignments should be avoided
+
+Signed-off-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Link: https://patch.msgid.link/20250526-dualsense-alsa-jack-v1-6-1a821463b632@collabora.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/mixer_quirks.c | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
+index a1ab517e26b36..f91dbc9255f12 100644
+--- a/sound/usb/mixer_quirks.c
++++ b/sound/usb/mixer_quirks.c
+@@ -1734,7 +1734,8 @@ static int snd_microii_spdif_default_put(struct snd_kcontrol *kcontrol,
+ unsigned int pval, pval_old;
+ int err;
+
+- pval = pval_old = kcontrol->private_value;
++ pval = kcontrol->private_value;
++ pval_old = pval;
+ pval &= 0xfffff0f0;
+ pval |= (ucontrol->value.iec958.status[1] & 0x0f) << 8;
+ pval |= (ucontrol->value.iec958.status[0] & 0x0f);
+--
+2.51.0
+
--- /dev/null
+From a35ad58bbcd63d97132722391732385429f3b07b Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 12 Jun 2025 14:02:28 +0800
+Subject: ALSA: usb-audio: Convert comma to semicolon
+
+From: Chen Ni <nichen@iscas.ac.cn>
+
+[ Upstream commit 9ca30a1b007d5fefb5752428f852a2d8d7219c1c ]
+
+Replace comma between expressions with semicolons.
+
+Using a ',' in place of a ';' can have unintended side effects.
+Although that is not the case here, it is seems best to use ';'
+unless ',' is intended.
+
+Found by inspection.
+No functional change intended.
+Compile tested only.
+
+Fixes: 79d561c4ec04 ("ALSA: usb-audio: Add mixer quirk for Sony DualSense PS5")
+Signed-off-by: Chen Ni <nichen@iscas.ac.cn>
+Reviewed-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+Link: https://patch.msgid.link/20250612060228.1518028-1-nichen@iscas.ac.cn
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/mixer_quirks.c | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
+index 95fa1c31ae550..f1b663a05f295 100644
+--- a/sound/usb/mixer_quirks.c
++++ b/sound/usb/mixer_quirks.c
+@@ -758,9 +758,9 @@ static int snd_dualsense_jack_create(struct usb_mixer_interface *mixer,
+
+ mei->ih.event = snd_dualsense_ih_event;
+ mei->ih.match = snd_dualsense_ih_match;
+- mei->ih.connect = snd_dualsense_ih_connect,
+- mei->ih.disconnect = snd_dualsense_ih_disconnect,
+- mei->ih.start = snd_dualsense_ih_start,
++ mei->ih.connect = snd_dualsense_ih_connect;
++ mei->ih.disconnect = snd_dualsense_ih_disconnect;
++ mei->ih.start = snd_dualsense_ih_start;
+ mei->ih.name = name;
+ mei->ih.id_table = mei->id_table;
+
+--
+2.51.0
+
--- /dev/null
+From 43af9b5123efff5f9713e44766b9c0e7eefcc4a1 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 26 May 2025 17:07:44 +0300
+Subject: ALSA: usb-audio: Drop unnecessary parentheses in mixer_quirks
+
+From: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+
+[ Upstream commit c0495cef8b43ad61efbd4019e3573742e0e63c67 ]
+
+Fix multiple 'CHECK: Unnecessary parentheses around ...' reports from
+checkpatch.pl.
+
+Signed-off-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Link: https://patch.msgid.link/20250526-dualsense-alsa-jack-v1-5-1a821463b632@collabora.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/mixer_quirks.c | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
+index 4ce470e291b25..a1ab517e26b36 100644
+--- a/sound/usb/mixer_quirks.c
++++ b/sound/usb/mixer_quirks.c
+@@ -376,10 +376,10 @@ static int snd_audigy2nx_controls_create(struct usb_mixer_interface *mixer)
+ struct snd_kcontrol_new knew;
+
+ /* USB X-Fi S51 doesn't have a CMSS LED */
+- if ((mixer->chip->usb_id == USB_ID(0x041e, 0x3042)) && i == 0)
++ if (mixer->chip->usb_id == USB_ID(0x041e, 0x3042) && i == 0)
+ continue;
+ /* USB X-Fi S51 Pro doesn't have one either */
+- if ((mixer->chip->usb_id == USB_ID(0x041e, 0x30df)) && i == 0)
++ if (mixer->chip->usb_id == USB_ID(0x041e, 0x30df) && i == 0)
+ continue;
+ if (i > 1 && /* Live24ext has 2 LEDs only */
+ (mixer->chip->usb_id == USB_ID(0x041e, 0x3040) ||
+@@ -3272,7 +3272,7 @@ static int snd_djm_controls_update(struct usb_mixer_interface *mixer,
+ int err;
+ const struct snd_djm_device *device = &snd_djm_devices[device_idx];
+
+- if ((group >= device->ncontrols) || value >= device->controls[group].noptions)
++ if (group >= device->ncontrols || value >= device->controls[group].noptions)
+ return -EINVAL;
+
+ err = snd_usb_lock_shutdown(mixer->chip);
+--
+2.51.0
+
--- /dev/null
+From c34c9eb1031578b4ab613bbc8be72fd4d942465e Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 26 May 2025 17:07:43 +0300
+Subject: ALSA: usb-audio: Fix block comments in mixer_quirks
+
+From: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+
+[ Upstream commit 231225d8a20f8668b4fd6601d54a2fac0e0ab7a5 ]
+
+Address a couple of comment formatting issues indicated by
+checkpatch.pl:
+
+ WARNING: Block comments use a trailing */ on a separate line
+
+Signed-off-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Link: https://patch.msgid.link/20250526-dualsense-alsa-jack-v1-4-1a821463b632@collabora.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/mixer_quirks.c | 6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
+
+diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
+index 68c82e344d3ba..4ce470e291b25 100644
+--- a/sound/usb/mixer_quirks.c
++++ b/sound/usb/mixer_quirks.c
+@@ -76,7 +76,8 @@ static int snd_create_std_mono_ctl_offset(struct usb_mixer_interface *mixer,
+ cval->idx_off = idx_off;
+
+ /* get_min_max() is called only for integer volumes later,
+- * so provide a short-cut for booleans */
++ * so provide a short-cut for booleans
++ */
+ cval->min = 0;
+ cval->max = 1;
+ cval->res = 0;
+@@ -3546,7 +3547,8 @@ static void snd_dragonfly_quirk_db_scale(struct usb_mixer_interface *mixer,
+ struct snd_kcontrol *kctl)
+ {
+ /* Approximation using 10 ranges based on output measurement on hw v1.2.
+- * This seems close to the cubic mapping e.g. alsamixer uses. */
++ * This seems close to the cubic mapping e.g. alsamixer uses.
++ */
+ static const DECLARE_TLV_DB_RANGE(scale,
+ 0, 1, TLV_DB_MINMAX_ITEM(-5300, -4970),
+ 2, 5, TLV_DB_MINMAX_ITEM(-4710, -4160),
+--
+2.51.0
+
--- /dev/null
+From 26a701f863b3041c0d9c676d992922d90250f89c Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 13 Jun 2025 10:15:30 +0200
+Subject: ALSA: usb-audio: Fix build with CONFIG_INPUT=n
+
+From: Takashi Iwai <tiwai@suse.de>
+
+[ Upstream commit d0630a0b80c08530857146e3bf183a7d6b743847 ]
+
+The recent addition of DualSense mixer quirk relies on the input
+device handle, and the build can fail if CONFIG_INPUT isn't set.
+Put (rather ugly) workarounds to wrap with IS_REACHABLE() for avoiding
+the build error.
+
+Fixes: 79d561c4ec04 ("ALSA: usb-audio: Add mixer quirk for Sony DualSense PS5")
+Reported-by: kernel test robot <lkp@intel.com>
+Closes: https://lore.kernel.org/oe-kbuild-all/202506130733.gnPKw2l3-lkp@intel.com/
+Reviewed-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+Link: https://patch.msgid.link/20250613081543.7404-1-tiwai@suse.de
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/mixer_quirks.c | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
+index f1b663a05f295..8c0b8383abe1e 100644
+--- a/sound/usb/mixer_quirks.c
++++ b/sound/usb/mixer_quirks.c
+@@ -528,6 +528,7 @@ static int snd_emu0204_controls_create(struct usb_mixer_interface *mixer)
+ &snd_emu0204_control, NULL);
+ }
+
++#if IS_REACHABLE(CONFIG_INPUT)
+ /*
+ * Sony DualSense controller (PS5) jack detection
+ *
+@@ -784,6 +785,7 @@ static int snd_dualsense_controls_create(struct usb_mixer_interface *mixer)
+
+ return snd_dualsense_jack_create(mixer, "Headset Mic Jack", false);
+ }
++#endif /* IS_REACHABLE(CONFIG_INPUT) */
+
+ /* ASUS Xonar U1 / U3 controls */
+
+@@ -3648,10 +3650,12 @@ int snd_usb_mixer_apply_create_quirk(struct usb_mixer_interface *mixer)
+ err = snd_emu0204_controls_create(mixer);
+ break;
+
++#if IS_REACHABLE(CONFIG_INPUT)
+ case USB_ID(0x054c, 0x0ce6): /* Sony DualSense controller (PS5) */
+ case USB_ID(0x054c, 0x0df2): /* Sony DualSense Edge controller (PS5) */
+ err = snd_dualsense_controls_create(mixer);
+ break;
++#endif /* IS_REACHABLE(CONFIG_INPUT) */
+
+ case USB_ID(0x0763, 0x2030): /* M-Audio Fast Track C400 */
+ case USB_ID(0x0763, 0x2031): /* M-Audio Fast Track C400 */
+--
+2.51.0
+
--- /dev/null
+From ce09659ac8c11712d9c52325ca5d71a1652f8da0 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 27 Aug 2025 11:29:02 +0800
+Subject: ALSA: usb-audio: move mixer_quirks' min_mute into common quirk
+
+From: Cryolitia PukNgae <cryolitia@uniontech.com>
+
+[ Upstream commit 2c3ca8cc55a3afc7a4fa99ed8f5f5d05dd2e65b3 ]
+
+We have found more and more devices that have the same problem, that
+the mixer's minimum value is muted. Accroding to pipewire's MR[1]
+and Arch Linux wiki[2], this should be a very common problem in USB
+audio devices. Move the quirk into common quirk,as a preparation of
+more devices' quirk's patch coming on the road[3].
+
+1. https://gitlab.freedesktop.org/pipewire/pipewire/-/merge_requests/2514
+2. https://wiki.archlinux.org/index.php?title=PipeWire&oldid=804138#No_sound_from_USB_DAC_until_30%_volume
+3. On the road, in the physical sense. We have been buying ton of
+ these devices for testing the problem.
+
+Tested-by: Guoli An <anguoli@uniontech.com>
+Signed-off-by: Cryolitia PukNgae <cryolitia@uniontech.com>
+Link: https://patch.msgid.link/20250827-sound-quirk-min-mute-v1-1-4717aa8a4f6a@uniontech.com
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/mixer_quirks.c | 10 +++-------
+ sound/usb/quirks.c | 12 ++++++++++--
+ sound/usb/usbaudio.h | 4 ++++
+ 3 files changed, 17 insertions(+), 9 deletions(-)
+
+diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
+index 8c0b8383abe1e..270a0be672b7e 100644
+--- a/sound/usb/mixer_quirks.c
++++ b/sound/usb/mixer_quirks.c
+@@ -3899,16 +3899,12 @@ void snd_usb_mixer_fu_apply_quirk(struct usb_mixer_interface *mixer,
+ if (unitid == 7 && cval->control == UAC_FU_VOLUME)
+ snd_dragonfly_quirk_db_scale(mixer, cval, kctl);
+ break;
++ }
++
+ /* lowest playback value is muted on some devices */
+- case USB_ID(0x0572, 0x1b09): /* Conexant Systems (Rockwell), Inc. */
+- case USB_ID(0x0d8c, 0x000c): /* C-Media */
+- case USB_ID(0x0d8c, 0x0014): /* C-Media */
+- case USB_ID(0x19f7, 0x0003): /* RODE NT-USB */
+- case USB_ID(0x2d99, 0x0026): /* HECATE G2 GAMING HEADSET */
++ if (mixer->chip->quirk_flags & QUIRK_FLAG_MIXER_MIN_MUTE)
+ if (strstr(kctl->id.name, "Playback"))
+ cval->min_mute = 1;
+- break;
+- }
+
+ /* ALSA-ify some Plantronics headset control names */
+ if (USB_ID_VENDOR(mixer->chip->usb_id) == 0x047f &&
+diff --git a/sound/usb/quirks.c b/sound/usb/quirks.c
+index d4f4466b028c8..5b1aa5c418999 100644
+--- a/sound/usb/quirks.c
++++ b/sound/usb/quirks.c
+@@ -2094,6 +2094,8 @@ static const struct usb_audio_quirk_flags_table quirk_flags_table[] = {
+ QUIRK_FLAG_SET_IFACE_FIRST),
+ DEVICE_FLG(0x0556, 0x0014, /* Phoenix Audio TMX320VC */
+ QUIRK_FLAG_GET_SAMPLE_RATE),
++ DEVICE_FLG(0x0572, 0x1b09, /* Conexant Systems (Rockwell), Inc. */
++ QUIRK_FLAG_MIXER_MIN_MUTE),
+ DEVICE_FLG(0x05a3, 0x9420, /* ELP HD USB Camera */
+ QUIRK_FLAG_GET_SAMPLE_RATE),
+ DEVICE_FLG(0x05a7, 0x1020, /* Bose Companion 5 */
+@@ -2140,8 +2142,10 @@ static const struct usb_audio_quirk_flags_table quirk_flags_table[] = {
+ QUIRK_FLAG_GET_SAMPLE_RATE),
+ DEVICE_FLG(0x0c45, 0x636b, /* Microdia JP001 USB Camera */
+ QUIRK_FLAG_GET_SAMPLE_RATE),
+- DEVICE_FLG(0x0d8c, 0x0014, /* USB Audio Device */
+- QUIRK_FLAG_CTL_MSG_DELAY_1M),
++ DEVICE_FLG(0x0d8c, 0x000c, /* C-Media */
++ QUIRK_FLAG_MIXER_MIN_MUTE),
++ DEVICE_FLG(0x0d8c, 0x0014, /* C-Media */
++ QUIRK_FLAG_CTL_MSG_DELAY_1M | QUIRK_FLAG_MIXER_MIN_MUTE),
+ DEVICE_FLG(0x0ecb, 0x205c, /* JBL Quantum610 Wireless */
+ QUIRK_FLAG_FIXED_RATE),
+ DEVICE_FLG(0x0ecb, 0x2069, /* JBL Quantum810 Wireless */
+@@ -2188,6 +2192,8 @@ static const struct usb_audio_quirk_flags_table quirk_flags_table[] = {
+ QUIRK_FLAG_ITF_USB_DSD_DAC | QUIRK_FLAG_CTL_MSG_DELAY),
+ DEVICE_FLG(0x1901, 0x0191, /* GE B850V3 CP2114 audio interface */
+ QUIRK_FLAG_GET_SAMPLE_RATE),
++ DEVICE_FLG(0x19f7, 0x0003, /* RODE NT-USB */
++ QUIRK_FLAG_MIXER_MIN_MUTE),
+ DEVICE_FLG(0x19f7, 0x0035, /* RODE NT-USB+ */
+ QUIRK_FLAG_GET_SAMPLE_RATE),
+ DEVICE_FLG(0x1bcf, 0x2281, /* HD Webcam */
+@@ -2248,6 +2254,8 @@ static const struct usb_audio_quirk_flags_table quirk_flags_table[] = {
+ QUIRK_FLAG_CTL_MSG_DELAY_1M),
+ DEVICE_FLG(0x2d95, 0x8021, /* VIVO USB-C-XE710 HEADSET */
+ QUIRK_FLAG_CTL_MSG_DELAY_1M),
++ DEVICE_FLG(0x2d99, 0x0026, /* HECATE G2 GAMING HEADSET */
++ QUIRK_FLAG_MIXER_MIN_MUTE),
+ DEVICE_FLG(0x2fc6, 0xf0b7, /* iBasso DC07 Pro */
+ QUIRK_FLAG_CTL_MSG_DELAY_1M),
+ DEVICE_FLG(0x30be, 0x0101, /* Schiit Hel */
+diff --git a/sound/usb/usbaudio.h b/sound/usb/usbaudio.h
+index 65dcb1a02e976..17db6a7f3a844 100644
+--- a/sound/usb/usbaudio.h
++++ b/sound/usb/usbaudio.h
+@@ -180,6 +180,9 @@ extern bool snd_usb_skip_validation;
+ * for the given endpoint.
+ * QUIRK_FLAG_MIC_RES_16 and QUIRK_FLAG_MIC_RES_384
+ * Set the fixed resolution for Mic Capture Volume (mostly for webcams)
++ * QUIRK_FLAG_MIXER_MIN_MUTE
++ * Set minimum volume control value as mute for devices where the lowest
++ * playback value represents muted state instead of minimum audible volume
+ */
+
+ #define QUIRK_FLAG_GET_SAMPLE_RATE (1U << 0)
+@@ -206,5 +209,6 @@ extern bool snd_usb_skip_validation;
+ #define QUIRK_FLAG_FIXED_RATE (1U << 21)
+ #define QUIRK_FLAG_MIC_RES_16 (1U << 22)
+ #define QUIRK_FLAG_MIC_RES_384 (1U << 23)
++#define QUIRK_FLAG_MIXER_MIN_MUTE (1U << 24)
+
+ #endif /* __USBAUDIO_H */
+--
+2.51.0
+
--- /dev/null
+From 38979066db6025a003832a425605e769086f2044 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 26 May 2025 17:07:47 +0300
+Subject: ALSA: usb-audio: Remove unneeded wmb() in mixer_quirks
+
+From: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+
+[ Upstream commit 9cea7425595697802e8d55a322a251999554b8b1 ]
+
+Adding a memory barrier before wake_up() in
+snd_usb_soundblaster_remote_complete() is supposed to ensure the write
+to mixer->rc_code is visible in wait_event_interruptible() from
+snd_usb_sbrc_hwdep_read().
+
+However, this is not really necessary, since wake_up() is just a wrapper
+over __wake_up() which already executes a full memory barrier before
+accessing the state of the task to be waken up.
+
+Drop the redundant call to wmb() and implicitly fix the checkpatch
+complaint:
+
+ WARNING: memory barrier without comment
+
+Signed-off-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Link: https://patch.msgid.link/20250526-dualsense-alsa-jack-v1-8-1a821463b632@collabora.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/mixer_quirks.c | 1 -
+ 1 file changed, 1 deletion(-)
+
+diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
+index 9a5e8c47ce0d2..e5252167d6a40 100644
+--- a/sound/usb/mixer_quirks.c
++++ b/sound/usb/mixer_quirks.c
+@@ -208,7 +208,6 @@ static void snd_usb_soundblaster_remote_complete(struct urb *urb)
+ if (code == rc->mute_code)
+ snd_usb_mixer_notify_id(mixer, rc->mute_mixer_id);
+ mixer->rc_code = code;
+- wmb();
+ wake_up(&mixer->rc_waitq);
+ }
+
+--
+2.51.0
+
--- /dev/null
+From 7c3f52358c57afbbb4c0759fd1d27969d5c7a494 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 26 May 2025 17:07:46 +0300
+Subject: ALSA: usb-audio: Simplify NULL comparison in mixer_quirks
+
+From: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+
+[ Upstream commit f2d6d660e8fd5f4467e80743f82119201e67fa9c ]
+
+Handle report from checkpatch.pl:
+
+ CHECK: Comparison to NULL could be written "t->name"
+
+Signed-off-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Link: https://patch.msgid.link/20250526-dualsense-alsa-jack-v1-7-1a821463b632@collabora.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/mixer_quirks.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
+index f91dbc9255f12..9a5e8c47ce0d2 100644
+--- a/sound/usb/mixer_quirks.c
++++ b/sound/usb/mixer_quirks.c
+@@ -126,7 +126,7 @@ static int snd_create_std_mono_table(struct usb_mixer_interface *mixer,
+ {
+ int err;
+
+- while (t->name != NULL) {
++ while (t->name) {
+ err = snd_create_std_mono_ctl(mixer, t->unitid, t->control,
+ t->cmask, t->val_type, t->name, t->tlv_callback);
+ if (err < 0)
+--
+2.51.0
+
--- /dev/null
+From bbb4ab1d7b1ad7fff7a85aa9144d0edc5a70bacc Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sat, 20 Sep 2025 11:51:48 +0900
+Subject: firewire: core: fix overlooked update of subsystem ABI version
+
+From: Takashi Sakamoto <o-takashi@sakamocchi.jp>
+
+[ Upstream commit 853a57ba263adfecf4430b936d6862bc475b4bb5 ]
+
+In kernel v6.5, several functions were added to the cdev layer. This
+required updating the default version of subsystem ABI up to 6, but
+this requirement was overlooked.
+
+This commit updates the version accordingly.
+
+Fixes: 6add87e9764d ("firewire: cdev: add new version of ABI to notify time stamp at request/response subaction of transaction#")
+Link: https://lore.kernel.org/r/20250920025148.163402-1-o-takashi@sakamocchi.jp
+Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/firewire/core-cdev.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/firewire/core-cdev.c b/drivers/firewire/core-cdev.c
+index 958aa4662ccb0..5cb0059f57e6b 100644
+--- a/drivers/firewire/core-cdev.c
++++ b/drivers/firewire/core-cdev.c
+@@ -39,7 +39,7 @@
+ /*
+ * ABI version history is documented in linux/firewire-cdev.h.
+ */
+-#define FW_CDEV_KERNEL_VERSION 5
++#define FW_CDEV_KERNEL_VERSION 6
+ #define FW_CDEV_VERSION_EVENT_REQUEST2 4
+ #define FW_CDEV_VERSION_ALLOCATE_REGION_END 4
+ #define FW_CDEV_VERSION_AUTO_FLUSH_ISO_OVERFLOW 5
+--
+2.51.0
+
--- /dev/null
+From 5afe8201f82e93e444ae5810da5d51e6c2a89f89 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 27 May 2025 22:13:13 +0530
+Subject: HID: multitouch: Get the contact ID from HID_DG_TRANSDUCER_INDEX
+ fields in case of Apple Touch Bar
+
+From: Kerem Karabay <kekrby@gmail.com>
+
+[ Upstream commit f41d736acc039d86512951f4e874b0f5e666babf ]
+
+In Apple Touch Bar, the contact ID is contained in fields with the
+HID_DG_TRANSDUCER_INDEX usage rather than HID_DG_CONTACTID, thus differing
+from the HID spec. Add a quirk for the same.
+
+Acked-by: Benjamin Tissoires <bentiss@kernel.org>
+Signed-off-by: Kerem Karabay <kekrby@gmail.com>
+Co-developed-by: Aditya Garg <gargaditya08@live.com>
+Signed-off-by: Aditya Garg <gargaditya08@live.com>
+Signed-off-by: Jiri Kosina <jkosina@suse.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/hid/hid-multitouch.c | 16 +++++++++++++++-
+ 1 file changed, 15 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/hid/hid-multitouch.c b/drivers/hid/hid-multitouch.c
+index a85581cd511fd..35426e702b301 100644
+--- a/drivers/hid/hid-multitouch.c
++++ b/drivers/hid/hid-multitouch.c
+@@ -72,6 +72,7 @@ MODULE_LICENSE("GPL");
+ #define MT_QUIRK_FORCE_MULTI_INPUT BIT(20)
+ #define MT_QUIRK_DISABLE_WAKEUP BIT(21)
+ #define MT_QUIRK_ORIENTATION_INVERT BIT(22)
++#define MT_QUIRK_APPLE_TOUCHBAR BIT(23)
+
+ #define MT_INPUTMODE_TOUCHSCREEN 0x02
+ #define MT_INPUTMODE_TOUCHPAD 0x03
+@@ -612,6 +613,7 @@ static struct mt_application *mt_find_application(struct mt_device *td,
+ static struct mt_report_data *mt_allocate_report_data(struct mt_device *td,
+ struct hid_report *report)
+ {
++ struct mt_class *cls = &td->mtclass;
+ struct mt_report_data *rdata;
+ struct hid_field *field;
+ int r, n;
+@@ -636,7 +638,11 @@ static struct mt_report_data *mt_allocate_report_data(struct mt_device *td,
+
+ if (field->logical == HID_DG_FINGER || td->hdev->group != HID_GROUP_MULTITOUCH_WIN_8) {
+ for (n = 0; n < field->report_count; n++) {
+- if (field->usage[n].hid == HID_DG_CONTACTID) {
++ unsigned int hid = field->usage[n].hid;
++
++ if (hid == HID_DG_CONTACTID ||
++ (cls->quirks & MT_QUIRK_APPLE_TOUCHBAR &&
++ hid == HID_DG_TRANSDUCER_INDEX)) {
+ rdata->is_mt_collection = true;
+ break;
+ }
+@@ -814,6 +820,14 @@ static int mt_touch_input_mapping(struct hid_device *hdev, struct hid_input *hi,
+ EV_KEY, BTN_TOUCH);
+ MT_STORE_FIELD(tip_state);
+ return 1;
++ case HID_DG_TRANSDUCER_INDEX:
++ /*
++ * Contact ID in case of Apple Touch Bars is contained
++ * in fields with HID_DG_TRANSDUCER_INDEX usage.
++ */
++ if (!(cls->quirks & MT_QUIRK_APPLE_TOUCHBAR))
++ return 0;
++ fallthrough;
+ case HID_DG_CONTACTID:
+ MT_STORE_FIELD(contactid);
+ app->touches_by_report++;
+--
+2.51.0
+
--- /dev/null
+From f65f5948ad5665603d29403da0e42e876265c97b Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 27 May 2025 22:13:16 +0530
+Subject: HID: multitouch: specify that Apple Touch Bar is direct
+
+From: Kerem Karabay <kekrby@gmail.com>
+
+[ Upstream commit 45ca23c5ee8b2b3074377fecc92fa72aa595f7c9 ]
+
+Currently the driver determines the device type based on the
+application, but this value is not reliable on Apple Touch Bar, where
+the application is HID_DG_TOUCHPAD even though this device is direct,
+so add a quirk for the same.
+
+Acked-by: Benjamin Tissoires <bentiss@kernel.org>
+Signed-off-by: Kerem Karabay <kekrby@gmail.com>
+Co-developed-by: Aditya Garg <gargaditya08@live.com>
+Signed-off-by: Aditya Garg <gargaditya08@live.com>
+Signed-off-by: Jiri Kosina <jkosina@suse.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/hid/hid-multitouch.c | 7 +++++++
+ 1 file changed, 7 insertions(+)
+
+diff --git a/drivers/hid/hid-multitouch.c b/drivers/hid/hid-multitouch.c
+index 8e9f71e69dd8c..d8fee341c096e 100644
+--- a/drivers/hid/hid-multitouch.c
++++ b/drivers/hid/hid-multitouch.c
+@@ -1336,6 +1336,13 @@ static int mt_touch_input_configured(struct hid_device *hdev,
+ if (td->serial_maybe)
+ mt_post_parse_default_settings(td, app);
+
++ /*
++ * The application for Apple Touch Bars is HID_DG_TOUCHPAD,
++ * but these devices are direct.
++ */
++ if (cls->quirks & MT_QUIRK_APPLE_TOUCHBAR)
++ app->mt_flags |= INPUT_MT_DIRECT;
++
+ if (cls->is_indirect)
+ app->mt_flags |= INPUT_MT_POINTER;
+
+--
+2.51.0
+
--- /dev/null
+From 71e885c6131bb4ef7c6a94c64ab3ecac2e6b88c6 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 27 May 2025 22:13:14 +0530
+Subject: HID: multitouch: support getting the tip state from HID_DG_TOUCH
+ fields in Apple Touch Bar
+
+From: Kerem Karabay <kekrby@gmail.com>
+
+[ Upstream commit e0976a61a543b5e03bc0d08030a0ea036ee3751d ]
+
+In Apple Touch Bar, the tip state is contained in fields with the
+HID_DG_TOUCH usage. This feature is gated by a quirk in order to
+prevent breaking other devices, see commit c2ef8f21ea8f
+("HID: multitouch: add support for trackpads").
+
+Acked-by: Benjamin Tissoires <bentiss@kernel.org>
+Signed-off-by: Kerem Karabay <kekrby@gmail.com>
+Co-developed-by: Aditya Garg <gargaditya08@live.com>
+Signed-off-by: Aditya Garg <gargaditya08@live.com>
+Signed-off-by: Jiri Kosina <jkosina@suse.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/hid/hid-multitouch.c | 15 +++++++++++----
+ 1 file changed, 11 insertions(+), 4 deletions(-)
+
+diff --git a/drivers/hid/hid-multitouch.c b/drivers/hid/hid-multitouch.c
+index 35426e702b301..d0b2e866dadaf 100644
+--- a/drivers/hid/hid-multitouch.c
++++ b/drivers/hid/hid-multitouch.c
+@@ -814,6 +814,17 @@ static int mt_touch_input_mapping(struct hid_device *hdev, struct hid_input *hi,
+
+ MT_STORE_FIELD(confidence_state);
+ return 1;
++ case HID_DG_TOUCH:
++ /*
++ * Legacy devices use TIPSWITCH and not TOUCH.
++ * One special case here is of the Apple Touch Bars.
++ * In these devices, the tip state is contained in
++ * fields with the HID_DG_TOUCH usage.
++ * Let's just ignore this field for other devices.
++ */
++ if (!(cls->quirks & MT_QUIRK_APPLE_TOUCHBAR))
++ return -1;
++ fallthrough;
+ case HID_DG_TIPSWITCH:
+ if (field->application != HID_GD_SYSTEM_MULTIAXIS)
+ input_set_capability(hi->input,
+@@ -884,10 +895,6 @@ static int mt_touch_input_mapping(struct hid_device *hdev, struct hid_input *hi,
+ case HID_DG_CONTACTMAX:
+ /* contact max are global to the report */
+ return -1;
+- case HID_DG_TOUCH:
+- /* Legacy devices use TIPSWITCH and not TOUCH.
+- * Let's just ignore this field. */
+- return -1;
+ }
+ /* let hid-input decide for the others */
+ return 0;
+--
+2.51.0
+
--- /dev/null
+From 22fc5906200564aa090085ab193d4808aec35152 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 27 May 2025 22:13:15 +0530
+Subject: HID: multitouch: take cls->maxcontacts into account for Apple Touch
+ Bar even without a HID_DG_CONTACTMAX field
+
+From: Kerem Karabay <kekrby@gmail.com>
+
+[ Upstream commit 7dfe48bdc9d38db46283f2e0281bc1626277b8bf ]
+
+In Apple Touch Bar, the HID_DG_CONTACTMAX is not present, but the maximum
+contact count is still greater than the default. Add quirks for the same.
+
+Acked-by: Benjamin Tissoires <bentiss@kernel.org>
+Signed-off-by: Kerem Karabay <kekrby@gmail.com>
+Co-developed-by: Aditya Garg <gargaditya08@live.com>
+Signed-off-by: Aditya Garg <gargaditya08@live.com>
+Signed-off-by: Jiri Kosina <jkosina@suse.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/hid/hid-multitouch.c | 7 +++++++
+ 1 file changed, 7 insertions(+)
+
+diff --git a/drivers/hid/hid-multitouch.c b/drivers/hid/hid-multitouch.c
+index d0b2e866dadaf..8e9f71e69dd8c 100644
+--- a/drivers/hid/hid-multitouch.c
++++ b/drivers/hid/hid-multitouch.c
+@@ -1322,6 +1322,13 @@ static int mt_touch_input_configured(struct hid_device *hdev,
+ struct input_dev *input = hi->input;
+ int ret;
+
++ /*
++ * HID_DG_CONTACTMAX field is not present on Apple Touch Bars,
++ * but the maximum contact count is greater than the default.
++ */
++ if (cls->quirks & MT_QUIRK_APPLE_TOUCHBAR && cls->maxcontacts)
++ td->maxcontacts = cls->maxcontacts;
++
+ if (!td->maxcontacts)
+ td->maxcontacts = MT_DEFAULT_MAXCONTACT;
+
+--
+2.51.0
+
--- /dev/null
+From ae7825d03c4c1d44697f581afae759af7a521fb8 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 13 Aug 2025 15:43:20 +0300
+Subject: IB/mlx5: Fix obj_type mismatch for SRQ event subscriptions
+
+From: Or Har-Toov <ohartoov@nvidia.com>
+
+[ Upstream commit 85fe9f565d2d5af95ac2bbaa5082b8ce62b039f5 ]
+
+Fix a bug where the driver's event subscription logic for SRQ-related
+events incorrectly sets obj_type for RMP objects.
+
+When subscribing to SRQ events, get_legacy_obj_type() did not handle
+the MLX5_CMD_OP_CREATE_RMP case, which caused obj_type to be 0
+(default).
+This led to a mismatch between the obj_type used during subscription
+(0) and the value used during notification (1, taken from the event's
+type field). As a result, event mapping for SRQ objects could fail and
+event notification would not be delivered correctly.
+
+This fix adds handling for MLX5_CMD_OP_CREATE_RMP in get_legacy_obj_type,
+returning MLX5_EVENT_QUEUE_TYPE_RQ so obj_type is consistent between
+subscription and notification.
+
+Fixes: 759738537142 ("IB/mlx5: Enable subscription for device events over DEVX")
+Link: https://patch.msgid.link/r/8f1048e3fdd1fde6b90607ce0ed251afaf8a148c.1755088962.git.leon@kernel.org
+Signed-off-by: Or Har-Toov <ohartoov@nvidia.com>
+Reviewed-by: Edward Srouji <edwards@nvidia.com>
+Signed-off-by: Leon Romanovsky <leonro@nvidia.com>
+Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/infiniband/hw/mlx5/devx.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/drivers/infiniband/hw/mlx5/devx.c b/drivers/infiniband/hw/mlx5/devx.c
+index cc126e62643a0..80c26551564fb 100644
+--- a/drivers/infiniband/hw/mlx5/devx.c
++++ b/drivers/infiniband/hw/mlx5/devx.c
+@@ -191,6 +191,7 @@ static u16 get_legacy_obj_type(u16 opcode)
+ {
+ switch (opcode) {
+ case MLX5_CMD_OP_CREATE_RQ:
++ case MLX5_CMD_OP_CREATE_RMP:
+ return MLX5_EVENT_QUEUE_TYPE_RQ;
+ case MLX5_CMD_OP_CREATE_QP:
+ return MLX5_EVENT_QUEUE_TYPE_QP;
+--
+2.51.0
+
--- /dev/null
+firewire-core-fix-overlooked-update-of-subsystem-abi.patch
+alsa-usb-audio-fix-block-comments-in-mixer_quirks.patch
+alsa-usb-audio-drop-unnecessary-parentheses-in-mixer.patch
+alsa-usb-audio-avoid-multiple-assignments-in-mixer_q.patch
+alsa-usb-audio-simplify-null-comparison-in-mixer_qui.patch
+alsa-usb-audio-remove-unneeded-wmb-in-mixer_quirks.patch
+alsa-usb-audio-add-mixer-quirk-for-sony-dualsense-ps.patch
+hid-multitouch-get-the-contact-id-from-hid_dg_transd.patch
+hid-multitouch-support-getting-the-tip-state-from-hi.patch
+hid-multitouch-take-cls-maxcontacts-into-account-for.patch
+hid-multitouch-specify-that-apple-touch-bar-is-direc.patch
+alsa-usb-audio-convert-comma-to-semicolon.patch
+alsa-usb-audio-fix-build-with-config_input-n.patch
+usb-core-add-0x-prefix-to-quirks-debug-output.patch
+alsa-usb-audio-add-dsd-support-for-comtrue-usb-audio.patch
+alsa-usb-audio-move-mixer_quirks-min_mute-into-commo.patch
+alsa-usb-audio-add-mute-tlv-for-playback-volumes-on-.patch
+ib-mlx5-fix-obj_type-mismatch-for-srq-event-subscrip.patch
--- /dev/null
+From 50fc8faaee16759f5d09b39584bf59909eff37d4 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 3 Jun 2025 15:10:45 +0800
+Subject: usb: core: Add 0x prefix to quirks debug output
+
+From: Jiayi Li <lijiayi@kylinos.cn>
+
+[ Upstream commit 47c428fce0b41b15ab321d8ede871f780ccd038f ]
+
+Use "0x%x" format for quirks debug print to clarify it's a hexadecimal
+value. Improves readability and consistency with other hex outputs.
+
+Signed-off-by: Jiayi Li <lijiayi@kylinos.cn>
+Link: https://lore.kernel.org/r/20250603071045.3243699-1-lijiayi@kylinos.cn
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/usb/core/quirks.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/usb/core/quirks.c b/drivers/usb/core/quirks.c
+index bfd97cad8aa4d..c0fd8ab3fe8fc 100644
+--- a/drivers/usb/core/quirks.c
++++ b/drivers/usb/core/quirks.c
+@@ -734,7 +734,7 @@ void usb_detect_quirks(struct usb_device *udev)
+ udev->quirks ^= usb_detect_dynamic_quirks(udev);
+
+ if (udev->quirks)
+- dev_dbg(&udev->dev, "USB quirks for this device: %x\n",
++ dev_dbg(&udev->dev, "USB quirks for this device: 0x%x\n",
+ udev->quirks);
+
+ #ifdef CONFIG_USB_DEFAULT_PERSIST
+--
+2.51.0
+
--- /dev/null
+From 5d3c20a087e7efd77ea6d286e8c2dc44e40a1909 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 12 Jun 2025 17:00:23 +0100
+Subject: ALSA: hda/realtek: Add support for ASUS NUC using CS35L41 HDA
+
+From: Stefan Binding <sbinding@opensource.cirrus.com>
+
+[ Upstream commit 84fc8896f0d9d1c075e0e08a416faedbd73907fa ]
+
+Add support for ASUS NUC14LNS.
+
+This NUC uses a single CS35L41 Amp in using Internal Boost with SPI.
+To support the Single Amp, a new quirk is required.
+
+Signed-off-by: Stefan Binding <sbinding@opensource.cirrus.com>
+Link: https://patch.msgid.link/20250612160029.848104-3-sbinding@opensource.cirrus.com
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/pci/hda/patch_realtek.c | 11 +++++++++++
+ 1 file changed, 11 insertions(+)
+
+diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c
+index 5f061d2d9fc96..a41df821e15f7 100644
+--- a/sound/pci/hda/patch_realtek.c
++++ b/sound/pci/hda/patch_realtek.c
+@@ -7272,6 +7272,11 @@ static void cs35l41_fixup_spi_two(struct hda_codec *codec, const struct hda_fixu
+ comp_generic_fixup(codec, action, "spi", "CSC3551", "-%s:00-cs35l41-hda.%d", 2);
+ }
+
++static void cs35l41_fixup_spi_one(struct hda_codec *codec, const struct hda_fixup *fix, int action)
++{
++ comp_generic_fixup(codec, action, "spi", "CSC3551", "-%s:00-cs35l41-hda.%d", 1);
++}
++
+ static void cs35l41_fixup_spi_four(struct hda_codec *codec, const struct hda_fixup *fix, int action)
+ {
+ comp_generic_fixup(codec, action, "spi", "CSC3551", "-%s:00-cs35l41-hda.%d", 4);
+@@ -7956,6 +7961,7 @@ enum {
+ ALC287_FIXUP_CS35L41_I2C_2,
+ ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED,
+ ALC287_FIXUP_CS35L41_I2C_4,
++ ALC245_FIXUP_CS35L41_SPI_1,
+ ALC245_FIXUP_CS35L41_SPI_2,
+ ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED,
+ ALC245_FIXUP_CS35L41_SPI_4,
+@@ -10067,6 +10073,10 @@ static const struct hda_fixup alc269_fixups[] = {
+ .type = HDA_FIXUP_FUNC,
+ .v.func = cs35l41_fixup_spi_two,
+ },
++ [ALC245_FIXUP_CS35L41_SPI_1] = {
++ .type = HDA_FIXUP_FUNC,
++ .v.func = cs35l41_fixup_spi_one,
++ },
+ [ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED] = {
+ .type = HDA_FIXUP_FUNC,
+ .v.func = cs35l41_fixup_spi_two,
+@@ -11001,6 +11011,7 @@ static const struct hda_quirk alc269_fixup_tbl[] = {
+ SND_PCI_QUIRK(0x1043, 0x8398, "ASUS P1005", ALC269_FIXUP_STEREO_DMIC),
+ SND_PCI_QUIRK(0x1043, 0x83ce, "ASUS P1005", ALC269_FIXUP_STEREO_DMIC),
+ SND_PCI_QUIRK(0x1043, 0x8516, "ASUS X101CH", ALC269_FIXUP_ASUS_X101),
++ SND_PCI_QUIRK(0x1043, 0x88f4, "ASUS NUC14LNS", ALC245_FIXUP_CS35L41_SPI_1),
+ SND_PCI_QUIRK(0x104d, 0x9073, "Sony VAIO", ALC275_FIXUP_SONY_VAIO_GPIO2),
+ SND_PCI_QUIRK(0x104d, 0x907b, "Sony VAIO", ALC275_FIXUP_SONY_HWEQ),
+ SND_PCI_QUIRK(0x104d, 0x9084, "Sony VAIO", ALC275_FIXUP_SONY_HWEQ),
+--
+2.51.0
+
--- /dev/null
+From a3f38fa4ee1b437d3687dd8390095911d2db6ae0 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 31 Jul 2025 19:06:14 +0800
+Subject: ALSA: usb-audio: Add DSD support for Comtrue USB Audio device
+
+From: noble.yang <noble.yang@comtrue-inc.com>
+
+[ Upstream commit e9df1755485dd90a89656e8a21ec4d71c909fa30 ]
+
+The vendor Comtrue Inc. (0x2fc6) produces USB audio chipsets like
+the CT7601 which are capable of Native DSD playback.
+
+This patch adds QUIRK_FLAG_DSD_RAW for Comtrue (VID 0x2fc6), which enables
+native DSD playback (DSD_U32_LE) on their USB Audio device. This has been
+verified under Ubuntu 25.04 with JRiver.
+
+Signed-off-by: noble.yang <noble.yang@comtrue-inc.com>
+Link: https://patch.msgid.link/20250731110614.4070-1-noble228@gmail.com
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/quirks.c | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/sound/usb/quirks.c b/sound/usb/quirks.c
+index 0da4ee9757c01..de57cf35d8258 100644
+--- a/sound/usb/quirks.c
++++ b/sound/usb/quirks.c
+@@ -2405,6 +2405,8 @@ static const struct usb_audio_quirk_flags_table quirk_flags_table[] = {
+ QUIRK_FLAG_DSD_RAW),
+ VENDOR_FLG(0x2d87, /* Cayin device */
+ QUIRK_FLAG_DSD_RAW),
++ VENDOR_FLG(0x2fc6, /* Comture-inc devices */
++ QUIRK_FLAG_DSD_RAW),
+ VENDOR_FLG(0x3336, /* HEM devices */
+ QUIRK_FLAG_DSD_RAW),
+ VENDOR_FLG(0x3353, /* Khadas devices */
+--
+2.51.0
+
--- /dev/null
+From 3f4aaaec3655e8f9d5e4bcabfb1b169c5c30b832 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 26 May 2025 17:07:48 +0300
+Subject: ALSA: usb-audio: Add mixer quirk for Sony DualSense PS5
+
+From: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+
+[ Upstream commit 79d561c4ec0497669f19a9550cfb74812f60938b ]
+
+The Sony DualSense wireless controller (PS5) features an internal mono
+speaker, but it also provides a 3.5mm jack socket for headphone output
+and headset microphone input.
+
+Since this is a UAC1 device, it doesn't advertise any jack detection
+capability. However, the controller is able to report HP & MIC insert
+events via HID, i.e. through a dedicated input device managed by the
+hid-playstation driver.
+
+Add a quirk to create the jack controls for headphone and headset mic,
+respectively, and setup an input handler for each of them in order to
+intercept the related hotplug events.
+
+Signed-off-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Link: https://patch.msgid.link/20250526-dualsense-alsa-jack-v1-9-1a821463b632@collabora.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/mixer_quirks.c | 263 +++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 263 insertions(+)
+
+diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
+index 5f660c6933d2d..b495c9ccb56ca 100644
+--- a/sound/usb/mixer_quirks.c
++++ b/sound/usb/mixer_quirks.c
+@@ -17,6 +17,7 @@
+ #include <linux/bitfield.h>
+ #include <linux/hid.h>
+ #include <linux/init.h>
++#include <linux/input.h>
+ #include <linux/math64.h>
+ #include <linux/slab.h>
+ #include <linux/usb.h>
+@@ -530,6 +531,263 @@ static int snd_emu0204_controls_create(struct usb_mixer_interface *mixer)
+ &snd_emu0204_control, NULL);
+ }
+
++/*
++ * Sony DualSense controller (PS5) jack detection
++ *
++ * Since this is an UAC 1 device, it doesn't support jack detection.
++ * However, the controller hid-playstation driver reports HP & MIC
++ * insert events through a dedicated input device.
++ */
++
++#define SND_DUALSENSE_JACK_OUT_TERM_ID 3
++#define SND_DUALSENSE_JACK_IN_TERM_ID 4
++
++struct dualsense_mixer_elem_info {
++ struct usb_mixer_elem_info info;
++ struct input_handler ih;
++ struct input_device_id id_table[2];
++ bool connected;
++};
++
++static void snd_dualsense_ih_event(struct input_handle *handle,
++ unsigned int type, unsigned int code,
++ int value)
++{
++ struct dualsense_mixer_elem_info *mei;
++ struct usb_mixer_elem_list *me;
++
++ if (type != EV_SW)
++ return;
++
++ mei = container_of(handle->handler, struct dualsense_mixer_elem_info, ih);
++ me = &mei->info.head;
++
++ if ((me->id == SND_DUALSENSE_JACK_OUT_TERM_ID && code == SW_HEADPHONE_INSERT) ||
++ (me->id == SND_DUALSENSE_JACK_IN_TERM_ID && code == SW_MICROPHONE_INSERT)) {
++ mei->connected = !!value;
++ snd_ctl_notify(me->mixer->chip->card, SNDRV_CTL_EVENT_MASK_VALUE,
++ &me->kctl->id);
++ }
++}
++
++static bool snd_dualsense_ih_match(struct input_handler *handler,
++ struct input_dev *dev)
++{
++ struct dualsense_mixer_elem_info *mei;
++ struct usb_device *snd_dev;
++ char *input_dev_path, *usb_dev_path;
++ size_t usb_dev_path_len;
++ bool match = false;
++
++ mei = container_of(handler, struct dualsense_mixer_elem_info, ih);
++ snd_dev = mei->info.head.mixer->chip->dev;
++
++ input_dev_path = kobject_get_path(&dev->dev.kobj, GFP_KERNEL);
++ if (!input_dev_path) {
++ dev_warn(&snd_dev->dev, "Failed to get input dev path\n");
++ return false;
++ }
++
++ usb_dev_path = kobject_get_path(&snd_dev->dev.kobj, GFP_KERNEL);
++ if (!usb_dev_path) {
++ dev_warn(&snd_dev->dev, "Failed to get USB dev path\n");
++ goto free_paths;
++ }
++
++ /*
++ * Ensure the VID:PID matched input device supposedly owned by the
++ * hid-playstation driver belongs to the actual hardware handled by
++ * the current USB audio device, which implies input_dev_path being
++ * a subpath of usb_dev_path.
++ *
++ * This verification is necessary when there is more than one identical
++ * controller attached to the host system.
++ */
++ usb_dev_path_len = strlen(usb_dev_path);
++ if (usb_dev_path_len >= strlen(input_dev_path))
++ goto free_paths;
++
++ usb_dev_path[usb_dev_path_len] = '/';
++ match = !memcmp(input_dev_path, usb_dev_path, usb_dev_path_len + 1);
++
++free_paths:
++ kfree(input_dev_path);
++ kfree(usb_dev_path);
++
++ return match;
++}
++
++static int snd_dualsense_ih_connect(struct input_handler *handler,
++ struct input_dev *dev,
++ const struct input_device_id *id)
++{
++ struct input_handle *handle;
++ int err;
++
++ handle = kzalloc(sizeof(*handle), GFP_KERNEL);
++ if (!handle)
++ return -ENOMEM;
++
++ handle->dev = dev;
++ handle->handler = handler;
++ handle->name = handler->name;
++
++ err = input_register_handle(handle);
++ if (err)
++ goto err_free;
++
++ err = input_open_device(handle);
++ if (err)
++ goto err_unregister;
++
++ return 0;
++
++err_unregister:
++ input_unregister_handle(handle);
++err_free:
++ kfree(handle);
++ return err;
++}
++
++static void snd_dualsense_ih_disconnect(struct input_handle *handle)
++{
++ input_close_device(handle);
++ input_unregister_handle(handle);
++ kfree(handle);
++}
++
++static void snd_dualsense_ih_start(struct input_handle *handle)
++{
++ struct dualsense_mixer_elem_info *mei;
++ struct usb_mixer_elem_list *me;
++ int status = -1;
++
++ mei = container_of(handle->handler, struct dualsense_mixer_elem_info, ih);
++ me = &mei->info.head;
++
++ if (me->id == SND_DUALSENSE_JACK_OUT_TERM_ID &&
++ test_bit(SW_HEADPHONE_INSERT, handle->dev->swbit))
++ status = test_bit(SW_HEADPHONE_INSERT, handle->dev->sw);
++ else if (me->id == SND_DUALSENSE_JACK_IN_TERM_ID &&
++ test_bit(SW_MICROPHONE_INSERT, handle->dev->swbit))
++ status = test_bit(SW_MICROPHONE_INSERT, handle->dev->sw);
++
++ if (status >= 0) {
++ mei->connected = !!status;
++ snd_ctl_notify(me->mixer->chip->card, SNDRV_CTL_EVENT_MASK_VALUE,
++ &me->kctl->id);
++ }
++}
++
++static int snd_dualsense_jack_get(struct snd_kcontrol *kctl,
++ struct snd_ctl_elem_value *ucontrol)
++{
++ struct dualsense_mixer_elem_info *mei = snd_kcontrol_chip(kctl);
++
++ ucontrol->value.integer.value[0] = mei->connected;
++
++ return 0;
++}
++
++static const struct snd_kcontrol_new snd_dualsense_jack_control = {
++ .iface = SNDRV_CTL_ELEM_IFACE_CARD,
++ .access = SNDRV_CTL_ELEM_ACCESS_READ,
++ .info = snd_ctl_boolean_mono_info,
++ .get = snd_dualsense_jack_get,
++};
++
++static int snd_dualsense_resume_jack(struct usb_mixer_elem_list *list)
++{
++ snd_ctl_notify(list->mixer->chip->card, SNDRV_CTL_EVENT_MASK_VALUE,
++ &list->kctl->id);
++ return 0;
++}
++
++static void snd_dualsense_mixer_elem_free(struct snd_kcontrol *kctl)
++{
++ struct dualsense_mixer_elem_info *mei = snd_kcontrol_chip(kctl);
++
++ if (mei->ih.event)
++ input_unregister_handler(&mei->ih);
++
++ snd_usb_mixer_elem_free(kctl);
++}
++
++static int snd_dualsense_jack_create(struct usb_mixer_interface *mixer,
++ const char *name, bool is_output)
++{
++ struct dualsense_mixer_elem_info *mei;
++ struct input_device_id *idev_id;
++ struct snd_kcontrol *kctl;
++ int err;
++
++ mei = kzalloc(sizeof(*mei), GFP_KERNEL);
++ if (!mei)
++ return -ENOMEM;
++
++ snd_usb_mixer_elem_init_std(&mei->info.head, mixer,
++ is_output ? SND_DUALSENSE_JACK_OUT_TERM_ID :
++ SND_DUALSENSE_JACK_IN_TERM_ID);
++
++ mei->info.head.resume = snd_dualsense_resume_jack;
++ mei->info.val_type = USB_MIXER_BOOLEAN;
++ mei->info.channels = 1;
++ mei->info.min = 0;
++ mei->info.max = 1;
++
++ kctl = snd_ctl_new1(&snd_dualsense_jack_control, mei);
++ if (!kctl) {
++ kfree(mei);
++ return -ENOMEM;
++ }
++
++ strscpy(kctl->id.name, name, sizeof(kctl->id.name));
++ kctl->private_free = snd_dualsense_mixer_elem_free;
++
++ err = snd_usb_mixer_add_control(&mei->info.head, kctl);
++ if (err)
++ return err;
++
++ idev_id = &mei->id_table[0];
++ idev_id->flags = INPUT_DEVICE_ID_MATCH_VENDOR | INPUT_DEVICE_ID_MATCH_PRODUCT |
++ INPUT_DEVICE_ID_MATCH_EVBIT | INPUT_DEVICE_ID_MATCH_SWBIT;
++ idev_id->vendor = USB_ID_VENDOR(mixer->chip->usb_id);
++ idev_id->product = USB_ID_PRODUCT(mixer->chip->usb_id);
++ idev_id->evbit[BIT_WORD(EV_SW)] = BIT_MASK(EV_SW);
++ if (is_output)
++ idev_id->swbit[BIT_WORD(SW_HEADPHONE_INSERT)] = BIT_MASK(SW_HEADPHONE_INSERT);
++ else
++ idev_id->swbit[BIT_WORD(SW_MICROPHONE_INSERT)] = BIT_MASK(SW_MICROPHONE_INSERT);
++
++ mei->ih.event = snd_dualsense_ih_event;
++ mei->ih.match = snd_dualsense_ih_match;
++ mei->ih.connect = snd_dualsense_ih_connect,
++ mei->ih.disconnect = snd_dualsense_ih_disconnect,
++ mei->ih.start = snd_dualsense_ih_start,
++ mei->ih.name = name;
++ mei->ih.id_table = mei->id_table;
++
++ err = input_register_handler(&mei->ih);
++ if (err) {
++ dev_warn(&mixer->chip->dev->dev,
++ "Could not register input handler: %d\n", err);
++ mei->ih.event = NULL;
++ }
++
++ return 0;
++}
++
++static int snd_dualsense_controls_create(struct usb_mixer_interface *mixer)
++{
++ int err;
++
++ err = snd_dualsense_jack_create(mixer, "Headphone Jack", true);
++ if (err < 0)
++ return err;
++
++ return snd_dualsense_jack_create(mixer, "Headset Mic Jack", false);
++}
++
+ /* ASUS Xonar U1 / U3 controls */
+
+ static int snd_xonar_u1_switch_get(struct snd_kcontrol *kcontrol,
+@@ -3964,6 +4222,11 @@ int snd_usb_mixer_apply_create_quirk(struct usb_mixer_interface *mixer)
+ err = snd_emu0204_controls_create(mixer);
+ break;
+
++ case USB_ID(0x054c, 0x0ce6): /* Sony DualSense controller (PS5) */
++ case USB_ID(0x054c, 0x0df2): /* Sony DualSense Edge controller (PS5) */
++ err = snd_dualsense_controls_create(mixer);
++ break;
++
+ case USB_ID(0x0763, 0x2030): /* M-Audio Fast Track C400 */
+ case USB_ID(0x0763, 0x2031): /* M-Audio Fast Track C400 */
+ err = snd_c400_create_mixer(mixer);
+--
+2.51.0
+
--- /dev/null
+From 1fd3bf7ff290e474ef2ceab0c10da3b87a2cac88 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 29 Aug 2025 14:40:48 +0800
+Subject: ALSA: usb-audio: Add mute TLV for playback volumes on more devices
+
+From: qaqland <anguoli@uniontech.com>
+
+[ Upstream commit 2cbe4ac193ed7172cfd825c0cc46ce4a41be4ba1 ]
+
+Applying the quirk of that, the lowest Playback mixer volume setting
+mutes the audio output, on more devices.
+
+Suggested-by: Cryolitia PukNgae <cryolitia@uniontech.com>
+Signed-off-by: qaqland <anguoli@uniontech.com>
+Link: https://patch.msgid.link/20250829-sound_quirk-v1-1-745529b44440@uniontech.com
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/quirks.c | 10 ++++++++++
+ 1 file changed, 10 insertions(+)
+
+diff --git a/sound/usb/quirks.c b/sound/usb/quirks.c
+index 03962b3e3bd58..8a20508e055a3 100644
+--- a/sound/usb/quirks.c
++++ b/sound/usb/quirks.c
+@@ -2196,6 +2196,8 @@ static const struct usb_audio_quirk_flags_table quirk_flags_table[] = {
+ QUIRK_FLAG_SET_IFACE_FIRST),
+ DEVICE_FLG(0x0556, 0x0014, /* Phoenix Audio TMX320VC */
+ QUIRK_FLAG_GET_SAMPLE_RATE),
++ DEVICE_FLG(0x0572, 0x1b08, /* Conexant Systems (Rockwell), Inc. */
++ QUIRK_FLAG_MIXER_MIN_MUTE),
+ DEVICE_FLG(0x0572, 0x1b09, /* Conexant Systems (Rockwell), Inc. */
+ QUIRK_FLAG_MIXER_MIN_MUTE),
+ DEVICE_FLG(0x05a3, 0x9420, /* ELP HD USB Camera */
+@@ -2240,6 +2242,8 @@ static const struct usb_audio_quirk_flags_table quirk_flags_table[] = {
+ QUIRK_FLAG_CTL_MSG_DELAY_1M),
+ DEVICE_FLG(0x0b0e, 0x0349, /* Jabra 550a */
+ QUIRK_FLAG_CTL_MSG_DELAY_1M),
++ DEVICE_FLG(0x0bda, 0x498a, /* Realtek Semiconductor Corp. */
++ QUIRK_FLAG_MIXER_MIN_MUTE),
+ DEVICE_FLG(0x0c45, 0x6340, /* Sonix HD USB Camera */
+ QUIRK_FLAG_GET_SAMPLE_RATE),
+ DEVICE_FLG(0x0c45, 0x636b, /* Microdia JP001 USB Camera */
+@@ -2256,6 +2260,8 @@ static const struct usb_audio_quirk_flags_table quirk_flags_table[] = {
+ QUIRK_FLAG_SHARE_MEDIA_DEVICE | QUIRK_FLAG_ALIGN_TRANSFER),
+ DEVICE_FLG(0x1101, 0x0003, /* Audioengine D1 */
+ QUIRK_FLAG_GET_SAMPLE_RATE),
++ DEVICE_FLG(0x12d1, 0x3a07, /* Huawei Technologies Co., Ltd. */
++ QUIRK_FLAG_MIXER_MIN_MUTE),
+ DEVICE_FLG(0x1224, 0x2a25, /* Jieli Technology USB PHY 2.0 */
+ QUIRK_FLAG_GET_SAMPLE_RATE | QUIRK_FLAG_MIC_RES_16),
+ DEVICE_FLG(0x1395, 0x740a, /* Sennheiser DECT */
+@@ -2346,6 +2352,8 @@ static const struct usb_audio_quirk_flags_table quirk_flags_table[] = {
+ QUIRK_FLAG_IGNORE_CTL_ERROR),
+ DEVICE_FLG(0x2912, 0x30c8, /* Audioengine D1 */
+ QUIRK_FLAG_GET_SAMPLE_RATE),
++ DEVICE_FLG(0x2a70, 0x1881, /* OnePlus Technology (Shenzhen) Co., Ltd. BE02T */
++ QUIRK_FLAG_MIXER_MIN_MUTE),
+ DEVICE_FLG(0x2b53, 0x0023, /* Fiero SC-01 (firmware v1.0.0 @ 48 kHz) */
+ QUIRK_FLAG_GENERIC_IMPLICIT_FB),
+ DEVICE_FLG(0x2b53, 0x0024, /* Fiero SC-01 (firmware v1.0.0 @ 96 kHz) */
+@@ -2362,6 +2370,8 @@ static const struct usb_audio_quirk_flags_table quirk_flags_table[] = {
+ QUIRK_FLAG_CTL_MSG_DELAY_1M),
+ DEVICE_FLG(0x30be, 0x0101, /* Schiit Hel */
+ QUIRK_FLAG_IGNORE_CTL_ERROR),
++ DEVICE_FLG(0x339b, 0x3a07, /* Synaptics HONOR USB-C HEADSET */
++ QUIRK_FLAG_MIXER_MIN_MUTE),
+ DEVICE_FLG(0x413c, 0xa506, /* Dell AE515 sound bar */
+ QUIRK_FLAG_GET_SAMPLE_RATE),
+ DEVICE_FLG(0x534d, 0x0021, /* MacroSilicon MS2100/MS2106 */
+--
+2.51.0
+
--- /dev/null
+From c34e59de5575b651a50fa583f57a7450c7542233 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 26 May 2025 17:07:45 +0300
+Subject: ALSA: usb-audio: Avoid multiple assignments in mixer_quirks
+
+From: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+
+[ Upstream commit 03ddd3bdb94df3edb1f2408b57cfb00b3d92a208 ]
+
+Handle report from checkpatch.pl:
+
+ CHECK: multiple assignments should be avoided
+
+Signed-off-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Link: https://patch.msgid.link/20250526-dualsense-alsa-jack-v1-6-1a821463b632@collabora.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/mixer_quirks.c | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
+index 78c0feb7dcdb7..1eae6e83d0259 100644
+--- a/sound/usb/mixer_quirks.c
++++ b/sound/usb/mixer_quirks.c
+@@ -1737,7 +1737,8 @@ static int snd_microii_spdif_default_put(struct snd_kcontrol *kcontrol,
+ unsigned int pval, pval_old;
+ int err;
+
+- pval = pval_old = kcontrol->private_value;
++ pval = kcontrol->private_value;
++ pval_old = pval;
+ pval &= 0xfffff0f0;
+ pval |= (ucontrol->value.iec958.status[1] & 0x0f) << 8;
+ pval |= (ucontrol->value.iec958.status[0] & 0x0f);
+--
+2.51.0
+
--- /dev/null
+From c00bd8417cf95599e9b49f0000800e5eacd817ce Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 12 Jun 2025 14:02:28 +0800
+Subject: ALSA: usb-audio: Convert comma to semicolon
+
+From: Chen Ni <nichen@iscas.ac.cn>
+
+[ Upstream commit 9ca30a1b007d5fefb5752428f852a2d8d7219c1c ]
+
+Replace comma between expressions with semicolons.
+
+Using a ',' in place of a ';' can have unintended side effects.
+Although that is not the case here, it is seems best to use ';'
+unless ',' is intended.
+
+Found by inspection.
+No functional change intended.
+Compile tested only.
+
+Fixes: 79d561c4ec04 ("ALSA: usb-audio: Add mixer quirk for Sony DualSense PS5")
+Signed-off-by: Chen Ni <nichen@iscas.ac.cn>
+Reviewed-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+Link: https://patch.msgid.link/20250612060228.1518028-1-nichen@iscas.ac.cn
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/mixer_quirks.c | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
+index b495c9ccb56ca..2ee91469e6f73 100644
+--- a/sound/usb/mixer_quirks.c
++++ b/sound/usb/mixer_quirks.c
+@@ -761,9 +761,9 @@ static int snd_dualsense_jack_create(struct usb_mixer_interface *mixer,
+
+ mei->ih.event = snd_dualsense_ih_event;
+ mei->ih.match = snd_dualsense_ih_match;
+- mei->ih.connect = snd_dualsense_ih_connect,
+- mei->ih.disconnect = snd_dualsense_ih_disconnect,
+- mei->ih.start = snd_dualsense_ih_start,
++ mei->ih.connect = snd_dualsense_ih_connect;
++ mei->ih.disconnect = snd_dualsense_ih_disconnect;
++ mei->ih.start = snd_dualsense_ih_start;
+ mei->ih.name = name;
+ mei->ih.id_table = mei->id_table;
+
+--
+2.51.0
+
--- /dev/null
+From 93a5973dc1432f399b38572a197c41e726e8ed48 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 26 May 2025 17:07:44 +0300
+Subject: ALSA: usb-audio: Drop unnecessary parentheses in mixer_quirks
+
+From: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+
+[ Upstream commit c0495cef8b43ad61efbd4019e3573742e0e63c67 ]
+
+Fix multiple 'CHECK: Unnecessary parentheses around ...' reports from
+checkpatch.pl.
+
+Signed-off-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Link: https://patch.msgid.link/20250526-dualsense-alsa-jack-v1-5-1a821463b632@collabora.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/mixer_quirks.c | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
+index a97d1ca8443ca..78c0feb7dcdb7 100644
+--- a/sound/usb/mixer_quirks.c
++++ b/sound/usb/mixer_quirks.c
+@@ -379,10 +379,10 @@ static int snd_audigy2nx_controls_create(struct usb_mixer_interface *mixer)
+ struct snd_kcontrol_new knew;
+
+ /* USB X-Fi S51 doesn't have a CMSS LED */
+- if ((mixer->chip->usb_id == USB_ID(0x041e, 0x3042)) && i == 0)
++ if (mixer->chip->usb_id == USB_ID(0x041e, 0x3042) && i == 0)
+ continue;
+ /* USB X-Fi S51 Pro doesn't have one either */
+- if ((mixer->chip->usb_id == USB_ID(0x041e, 0x30df)) && i == 0)
++ if (mixer->chip->usb_id == USB_ID(0x041e, 0x30df) && i == 0)
+ continue;
+ if (i > 1 && /* Live24ext has 2 LEDs only */
+ (mixer->chip->usb_id == USB_ID(0x041e, 0x3040) ||
+@@ -3846,7 +3846,7 @@ static int snd_djm_controls_update(struct usb_mixer_interface *mixer,
+ int err;
+ const struct snd_djm_device *device = &snd_djm_devices[device_idx];
+
+- if ((group >= device->ncontrols) || value >= device->controls[group].noptions)
++ if (group >= device->ncontrols || value >= device->controls[group].noptions)
+ return -EINVAL;
+
+ err = snd_usb_lock_shutdown(mixer->chip);
+--
+2.51.0
+
--- /dev/null
+From 558388d7d2a5037867cf1f6b65ac52725545c13e Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 26 May 2025 17:07:43 +0300
+Subject: ALSA: usb-audio: Fix block comments in mixer_quirks
+
+From: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+
+[ Upstream commit 231225d8a20f8668b4fd6601d54a2fac0e0ab7a5 ]
+
+Address a couple of comment formatting issues indicated by
+checkpatch.pl:
+
+ WARNING: Block comments use a trailing */ on a separate line
+
+Signed-off-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Link: https://patch.msgid.link/20250526-dualsense-alsa-jack-v1-4-1a821463b632@collabora.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/mixer_quirks.c | 6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
+
+diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
+index 4d2232bef600d..a97d1ca8443ca 100644
+--- a/sound/usb/mixer_quirks.c
++++ b/sound/usb/mixer_quirks.c
+@@ -77,7 +77,8 @@ static int snd_create_std_mono_ctl_offset(struct usb_mixer_interface *mixer,
+ cval->idx_off = idx_off;
+
+ /* get_min_max() is called only for integer volumes later,
+- * so provide a short-cut for booleans */
++ * so provide a short-cut for booleans
++ */
+ cval->min = 0;
+ cval->max = 1;
+ cval->res = 0;
+@@ -4131,7 +4132,8 @@ static void snd_dragonfly_quirk_db_scale(struct usb_mixer_interface *mixer,
+ struct snd_kcontrol *kctl)
+ {
+ /* Approximation using 10 ranges based on output measurement on hw v1.2.
+- * This seems close to the cubic mapping e.g. alsamixer uses. */
++ * This seems close to the cubic mapping e.g. alsamixer uses.
++ */
+ static const DECLARE_TLV_DB_RANGE(scale,
+ 0, 1, TLV_DB_MINMAX_ITEM(-5300, -4970),
+ 2, 5, TLV_DB_MINMAX_ITEM(-4710, -4160),
+--
+2.51.0
+
--- /dev/null
+From 7665dbf10583fc45a1d223bc0e32e1c1640e1b28 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 13 Jun 2025 10:15:30 +0200
+Subject: ALSA: usb-audio: Fix build with CONFIG_INPUT=n
+
+From: Takashi Iwai <tiwai@suse.de>
+
+[ Upstream commit d0630a0b80c08530857146e3bf183a7d6b743847 ]
+
+The recent addition of DualSense mixer quirk relies on the input
+device handle, and the build can fail if CONFIG_INPUT isn't set.
+Put (rather ugly) workarounds to wrap with IS_REACHABLE() for avoiding
+the build error.
+
+Fixes: 79d561c4ec04 ("ALSA: usb-audio: Add mixer quirk for Sony DualSense PS5")
+Reported-by: kernel test robot <lkp@intel.com>
+Closes: https://lore.kernel.org/oe-kbuild-all/202506130733.gnPKw2l3-lkp@intel.com/
+Reviewed-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+Link: https://patch.msgid.link/20250613081543.7404-1-tiwai@suse.de
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/mixer_quirks.c | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
+index 2ee91469e6f73..8d7fc6edc8c79 100644
+--- a/sound/usb/mixer_quirks.c
++++ b/sound/usb/mixer_quirks.c
+@@ -531,6 +531,7 @@ static int snd_emu0204_controls_create(struct usb_mixer_interface *mixer)
+ &snd_emu0204_control, NULL);
+ }
+
++#if IS_REACHABLE(CONFIG_INPUT)
+ /*
+ * Sony DualSense controller (PS5) jack detection
+ *
+@@ -787,6 +788,7 @@ static int snd_dualsense_controls_create(struct usb_mixer_interface *mixer)
+
+ return snd_dualsense_jack_create(mixer, "Headset Mic Jack", false);
+ }
++#endif /* IS_REACHABLE(CONFIG_INPUT) */
+
+ /* ASUS Xonar U1 / U3 controls */
+
+@@ -4222,10 +4224,12 @@ int snd_usb_mixer_apply_create_quirk(struct usb_mixer_interface *mixer)
+ err = snd_emu0204_controls_create(mixer);
+ break;
+
++#if IS_REACHABLE(CONFIG_INPUT)
+ case USB_ID(0x054c, 0x0ce6): /* Sony DualSense controller (PS5) */
+ case USB_ID(0x054c, 0x0df2): /* Sony DualSense Edge controller (PS5) */
+ err = snd_dualsense_controls_create(mixer);
+ break;
++#endif /* IS_REACHABLE(CONFIG_INPUT) */
+
+ case USB_ID(0x0763, 0x2030): /* M-Audio Fast Track C400 */
+ case USB_ID(0x0763, 0x2031): /* M-Audio Fast Track C400 */
+--
+2.51.0
+
--- /dev/null
+From bec753a2b38ebeba0f89a23fd94063d141e3350e Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 26 May 2025 17:07:40 +0300
+Subject: ALSA: usb-audio: Fix code alignment in mixer_quirks
+
+From: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+
+[ Upstream commit bca638aa737d13749a871d1a0d2ed276501ffc54 ]
+
+Format code to fix all alignment issues reported by checkpatch.pl:
+
+ CHECK: Alignment should match open parenthesis
+
+Signed-off-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Link: https://patch.msgid.link/20250526-dualsense-alsa-jack-v1-1-1a821463b632@collabora.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/mixer_quirks.c | 250 ++++++++++++++++++++-------------------
+ 1 file changed, 127 insertions(+), 123 deletions(-)
+
+diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
+index 7bd87193c6177..4d2232bef600d 100644
+--- a/sound/usb/mixer_quirks.c
++++ b/sound/usb/mixer_quirks.c
+@@ -54,13 +54,13 @@ struct std_mono_table {
+ * version, we keep it mono for simplicity.
+ */
+ static int snd_create_std_mono_ctl_offset(struct usb_mixer_interface *mixer,
+- unsigned int unitid,
+- unsigned int control,
+- unsigned int cmask,
+- int val_type,
+- unsigned int idx_off,
+- const char *name,
+- snd_kcontrol_tlv_rw_t *tlv_callback)
++ unsigned int unitid,
++ unsigned int control,
++ unsigned int cmask,
++ int val_type,
++ unsigned int idx_off,
++ const char *name,
++ snd_kcontrol_tlv_rw_t *tlv_callback)
+ {
+ struct usb_mixer_elem_info *cval;
+ struct snd_kcontrol *kctl;
+@@ -107,15 +107,16 @@ static int snd_create_std_mono_ctl_offset(struct usb_mixer_interface *mixer,
+ }
+
+ static int snd_create_std_mono_ctl(struct usb_mixer_interface *mixer,
+- unsigned int unitid,
+- unsigned int control,
+- unsigned int cmask,
+- int val_type,
+- const char *name,
+- snd_kcontrol_tlv_rw_t *tlv_callback)
++ unsigned int unitid,
++ unsigned int control,
++ unsigned int cmask,
++ int val_type,
++ const char *name,
++ snd_kcontrol_tlv_rw_t *tlv_callback)
+ {
+ return snd_create_std_mono_ctl_offset(mixer, unitid, control, cmask,
+- val_type, 0 /* Offset */, name, tlv_callback);
++ val_type, 0 /* Offset */,
++ name, tlv_callback);
+ }
+
+ /*
+@@ -128,7 +129,8 @@ static int snd_create_std_mono_table(struct usb_mixer_interface *mixer,
+
+ while (t->name != NULL) {
+ err = snd_create_std_mono_ctl(mixer, t->unitid, t->control,
+- t->cmask, t->val_type, t->name, t->tlv_callback);
++ t->cmask, t->val_type, t->name,
++ t->tlv_callback);
+ if (err < 0)
+ return err;
+ t++;
+@@ -213,7 +215,7 @@ static void snd_usb_soundblaster_remote_complete(struct urb *urb)
+ }
+
+ static long snd_usb_sbrc_hwdep_read(struct snd_hwdep *hw, char __user *buf,
+- long count, loff_t *offset)
++ long count, loff_t *offset)
+ {
+ struct usb_mixer_interface *mixer = hw->private_data;
+ int err;
+@@ -233,7 +235,7 @@ static long snd_usb_sbrc_hwdep_read(struct snd_hwdep *hw, char __user *buf,
+ }
+
+ static __poll_t snd_usb_sbrc_hwdep_poll(struct snd_hwdep *hw, struct file *file,
+- poll_table *wait)
++ poll_table *wait)
+ {
+ struct usb_mixer_interface *mixer = hw->private_data;
+
+@@ -309,20 +311,20 @@ static int snd_audigy2nx_led_update(struct usb_mixer_interface *mixer,
+
+ if (chip->usb_id == USB_ID(0x041e, 0x3042))
+ err = snd_usb_ctl_msg(chip->dev,
+- usb_sndctrlpipe(chip->dev, 0), 0x24,
+- USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_OTHER,
+- !value, 0, NULL, 0);
++ usb_sndctrlpipe(chip->dev, 0), 0x24,
++ USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_OTHER,
++ !value, 0, NULL, 0);
+ /* USB X-Fi S51 Pro */
+ if (chip->usb_id == USB_ID(0x041e, 0x30df))
+ err = snd_usb_ctl_msg(chip->dev,
+- usb_sndctrlpipe(chip->dev, 0), 0x24,
+- USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_OTHER,
+- !value, 0, NULL, 0);
++ usb_sndctrlpipe(chip->dev, 0), 0x24,
++ USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_OTHER,
++ !value, 0, NULL, 0);
+ else
+ err = snd_usb_ctl_msg(chip->dev,
+- usb_sndctrlpipe(chip->dev, 0), 0x24,
+- USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_OTHER,
+- value, index + 2, NULL, 0);
++ usb_sndctrlpipe(chip->dev, 0), 0x24,
++ USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_OTHER,
++ value, index + 2, NULL, 0);
+ snd_usb_unlock_shutdown(chip);
+ return err;
+ }
+@@ -480,9 +482,9 @@ static int snd_emu0204_ch_switch_update(struct usb_mixer_interface *mixer,
+ buf[0] = 0x01;
+ buf[1] = value ? 0x02 : 0x01;
+ err = snd_usb_ctl_msg(chip->dev,
+- usb_sndctrlpipe(chip->dev, 0), UAC_SET_CUR,
+- USB_RECIP_INTERFACE | USB_TYPE_CLASS | USB_DIR_OUT,
+- 0x0400, 0x0e00, buf, 2);
++ usb_sndctrlpipe(chip->dev, 0), UAC_SET_CUR,
++ USB_RECIP_INTERFACE | USB_TYPE_CLASS | USB_DIR_OUT,
++ 0x0400, 0x0e00, buf, 2);
+ snd_usb_unlock_shutdown(chip);
+ return err;
+ }
+@@ -1020,7 +1022,7 @@ static int snd_nativeinstruments_create_mixer(struct usb_mixer_interface *mixer,
+ /* M-Audio FastTrack Ultra quirks */
+ /* FTU Effect switch (also used by C400/C600) */
+ static int snd_ftu_eff_switch_info(struct snd_kcontrol *kcontrol,
+- struct snd_ctl_elem_info *uinfo)
++ struct snd_ctl_elem_info *uinfo)
+ {
+ static const char *const texts[8] = {
+ "Room 1", "Room 2", "Room 3", "Hall 1",
+@@ -1054,7 +1056,7 @@ static int snd_ftu_eff_switch_init(struct usb_mixer_interface *mixer,
+ }
+
+ static int snd_ftu_eff_switch_get(struct snd_kcontrol *kctl,
+- struct snd_ctl_elem_value *ucontrol)
++ struct snd_ctl_elem_value *ucontrol)
+ {
+ ucontrol->value.enumerated.item[0] = kctl->private_value >> 24;
+ return 0;
+@@ -1085,7 +1087,7 @@ static int snd_ftu_eff_switch_update(struct usb_mixer_elem_list *list)
+ }
+
+ static int snd_ftu_eff_switch_put(struct snd_kcontrol *kctl,
+- struct snd_ctl_elem_value *ucontrol)
++ struct snd_ctl_elem_value *ucontrol)
+ {
+ struct usb_mixer_elem_list *list = snd_kcontrol_chip(kctl);
+ unsigned int pval = list->kctl->private_value;
+@@ -1103,7 +1105,7 @@ static int snd_ftu_eff_switch_put(struct snd_kcontrol *kctl,
+ }
+
+ static int snd_ftu_create_effect_switch(struct usb_mixer_interface *mixer,
+- int validx, int bUnitID)
++ int validx, int bUnitID)
+ {
+ static struct snd_kcontrol_new template = {
+ .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
+@@ -1142,22 +1144,22 @@ static int snd_ftu_create_volume_ctls(struct usb_mixer_interface *mixer)
+ for (in = 0; in < 8; in++) {
+ cmask = BIT(in);
+ snprintf(name, sizeof(name),
+- "AIn%d - Out%d Capture Volume",
+- in + 1, out + 1);
++ "AIn%d - Out%d Capture Volume",
++ in + 1, out + 1);
+ err = snd_create_std_mono_ctl(mixer, id, control,
+- cmask, val_type, name,
+- &snd_usb_mixer_vol_tlv);
++ cmask, val_type, name,
++ &snd_usb_mixer_vol_tlv);
+ if (err < 0)
+ return err;
+ }
+ for (in = 8; in < 16; in++) {
+ cmask = BIT(in);
+ snprintf(name, sizeof(name),
+- "DIn%d - Out%d Playback Volume",
+- in - 7, out + 1);
++ "DIn%d - Out%d Playback Volume",
++ in - 7, out + 1);
+ err = snd_create_std_mono_ctl(mixer, id, control,
+- cmask, val_type, name,
+- &snd_usb_mixer_vol_tlv);
++ cmask, val_type, name,
++ &snd_usb_mixer_vol_tlv);
+ if (err < 0)
+ return err;
+ }
+@@ -1218,10 +1220,10 @@ static int snd_ftu_create_effect_return_ctls(struct usb_mixer_interface *mixer)
+ for (ch = 0; ch < 4; ++ch) {
+ cmask = BIT(ch);
+ snprintf(name, sizeof(name),
+- "Effect Return %d Volume", ch + 1);
++ "Effect Return %d Volume", ch + 1);
+ err = snd_create_std_mono_ctl(mixer, id, control,
+- cmask, val_type, name,
+- snd_usb_mixer_vol_tlv);
++ cmask, val_type, name,
++ snd_usb_mixer_vol_tlv);
+ if (err < 0)
+ return err;
+ }
+@@ -1242,20 +1244,20 @@ static int snd_ftu_create_effect_send_ctls(struct usb_mixer_interface *mixer)
+ for (ch = 0; ch < 8; ++ch) {
+ cmask = BIT(ch);
+ snprintf(name, sizeof(name),
+- "Effect Send AIn%d Volume", ch + 1);
++ "Effect Send AIn%d Volume", ch + 1);
+ err = snd_create_std_mono_ctl(mixer, id, control, cmask,
+- val_type, name,
+- snd_usb_mixer_vol_tlv);
++ val_type, name,
++ snd_usb_mixer_vol_tlv);
+ if (err < 0)
+ return err;
+ }
+ for (ch = 8; ch < 16; ++ch) {
+ cmask = BIT(ch);
+ snprintf(name, sizeof(name),
+- "Effect Send DIn%d Volume", ch - 7);
++ "Effect Send DIn%d Volume", ch - 7);
+ err = snd_create_std_mono_ctl(mixer, id, control, cmask,
+- val_type, name,
+- snd_usb_mixer_vol_tlv);
++ val_type, name,
++ snd_usb_mixer_vol_tlv);
+ if (err < 0)
+ return err;
+ }
+@@ -1345,19 +1347,19 @@ static int snd_c400_create_vol_ctls(struct usb_mixer_interface *mixer)
+ for (out = 0; out < num_outs; out++) {
+ if (chan < num_outs) {
+ snprintf(name, sizeof(name),
+- "PCM%d-Out%d Playback Volume",
+- chan + 1, out + 1);
++ "PCM%d-Out%d Playback Volume",
++ chan + 1, out + 1);
+ } else {
+ snprintf(name, sizeof(name),
+- "In%d-Out%d Playback Volume",
+- chan - num_outs + 1, out + 1);
++ "In%d-Out%d Playback Volume",
++ chan - num_outs + 1, out + 1);
+ }
+
+ cmask = (out == 0) ? 0 : BIT(out - 1);
+ offset = chan * num_outs;
+ err = snd_create_std_mono_ctl_offset(mixer, id, control,
+- cmask, val_type, offset, name,
+- &snd_usb_mixer_vol_tlv);
++ cmask, val_type, offset, name,
++ &snd_usb_mixer_vol_tlv);
+ if (err < 0)
+ return err;
+ }
+@@ -1376,7 +1378,7 @@ static int snd_c400_create_effect_volume_ctl(struct usb_mixer_interface *mixer)
+ const unsigned int cmask = 0;
+
+ return snd_create_std_mono_ctl(mixer, id, control, cmask, val_type,
+- name, snd_usb_mixer_vol_tlv);
++ name, snd_usb_mixer_vol_tlv);
+ }
+
+ /* This control needs a volume quirk, see mixer.c */
+@@ -1389,7 +1391,7 @@ static int snd_c400_create_effect_duration_ctl(struct usb_mixer_interface *mixer
+ const unsigned int cmask = 0;
+
+ return snd_create_std_mono_ctl(mixer, id, control, cmask, val_type,
+- name, snd_usb_mixer_vol_tlv);
++ name, snd_usb_mixer_vol_tlv);
+ }
+
+ /* This control needs a volume quirk, see mixer.c */
+@@ -1402,7 +1404,7 @@ static int snd_c400_create_effect_feedback_ctl(struct usb_mixer_interface *mixer
+ const unsigned int cmask = 0;
+
+ return snd_create_std_mono_ctl(mixer, id, control, cmask, val_type,
+- name, NULL);
++ name, NULL);
+ }
+
+ static int snd_c400_create_effect_vol_ctls(struct usb_mixer_interface *mixer)
+@@ -1431,18 +1433,18 @@ static int snd_c400_create_effect_vol_ctls(struct usb_mixer_interface *mixer)
+ for (chan = 0; chan < num_outs + num_ins; chan++) {
+ if (chan < num_outs) {
+ snprintf(name, sizeof(name),
+- "Effect Send DOut%d",
+- chan + 1);
++ "Effect Send DOut%d",
++ chan + 1);
+ } else {
+ snprintf(name, sizeof(name),
+- "Effect Send AIn%d",
+- chan - num_outs + 1);
++ "Effect Send AIn%d",
++ chan - num_outs + 1);
+ }
+
+ cmask = (chan == 0) ? 0 : BIT(chan - 1);
+ err = snd_create_std_mono_ctl(mixer, id, control,
+- cmask, val_type, name,
+- &snd_usb_mixer_vol_tlv);
++ cmask, val_type, name,
++ &snd_usb_mixer_vol_tlv);
+ if (err < 0)
+ return err;
+ }
+@@ -1477,14 +1479,14 @@ static int snd_c400_create_effect_ret_vol_ctls(struct usb_mixer_interface *mixer
+
+ for (chan = 0; chan < num_outs; chan++) {
+ snprintf(name, sizeof(name),
+- "Effect Return %d",
+- chan + 1);
++ "Effect Return %d",
++ chan + 1);
+
+ cmask = (chan == 0) ? 0 :
+ BIT(chan + (chan % 2) * num_outs - 1);
+ err = snd_create_std_mono_ctl_offset(mixer, id, control,
+- cmask, val_type, offset, name,
+- &snd_usb_mixer_vol_tlv);
++ cmask, val_type, offset, name,
++ &snd_usb_mixer_vol_tlv);
+ if (err < 0)
+ return err;
+ }
+@@ -1625,7 +1627,7 @@ static const struct std_mono_table ebox44_table[] = {
+ *
+ */
+ static int snd_microii_spdif_info(struct snd_kcontrol *kcontrol,
+- struct snd_ctl_elem_info *uinfo)
++ struct snd_ctl_elem_info *uinfo)
+ {
+ uinfo->type = SNDRV_CTL_ELEM_TYPE_IEC958;
+ uinfo->count = 1;
+@@ -1633,7 +1635,7 @@ static int snd_microii_spdif_info(struct snd_kcontrol *kcontrol,
+ }
+
+ static int snd_microii_spdif_default_get(struct snd_kcontrol *kcontrol,
+- struct snd_ctl_elem_value *ucontrol)
++ struct snd_ctl_elem_value *ucontrol)
+ {
+ struct usb_mixer_elem_list *list = snd_kcontrol_chip(kcontrol);
+ struct snd_usb_audio *chip = list->mixer->chip;
+@@ -1666,13 +1668,13 @@ static int snd_microii_spdif_default_get(struct snd_kcontrol *kcontrol,
+ ep = get_endpoint(alts, 0)->bEndpointAddress;
+
+ err = snd_usb_ctl_msg(chip->dev,
+- usb_rcvctrlpipe(chip->dev, 0),
+- UAC_GET_CUR,
+- USB_TYPE_CLASS | USB_RECIP_ENDPOINT | USB_DIR_IN,
+- UAC_EP_CS_ATTR_SAMPLE_RATE << 8,
+- ep,
+- data,
+- sizeof(data));
++ usb_rcvctrlpipe(chip->dev, 0),
++ UAC_GET_CUR,
++ USB_TYPE_CLASS | USB_RECIP_ENDPOINT | USB_DIR_IN,
++ UAC_EP_CS_ATTR_SAMPLE_RATE << 8,
++ ep,
++ data,
++ sizeof(data));
+ if (err < 0)
+ goto end;
+
+@@ -1699,26 +1701,26 @@ static int snd_microii_spdif_default_update(struct usb_mixer_elem_list *list)
+
+ reg = ((pval >> 4) & 0xf0) | (pval & 0x0f);
+ err = snd_usb_ctl_msg(chip->dev,
+- usb_sndctrlpipe(chip->dev, 0),
+- UAC_SET_CUR,
+- USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_OTHER,
+- reg,
+- 2,
+- NULL,
+- 0);
++ usb_sndctrlpipe(chip->dev, 0),
++ UAC_SET_CUR,
++ USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_OTHER,
++ reg,
++ 2,
++ NULL,
++ 0);
+ if (err < 0)
+ goto end;
+
+ reg = (pval & IEC958_AES0_NONAUDIO) ? 0xa0 : 0x20;
+ reg |= (pval >> 12) & 0x0f;
+ err = snd_usb_ctl_msg(chip->dev,
+- usb_sndctrlpipe(chip->dev, 0),
+- UAC_SET_CUR,
+- USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_OTHER,
+- reg,
+- 3,
+- NULL,
+- 0);
++ usb_sndctrlpipe(chip->dev, 0),
++ UAC_SET_CUR,
++ USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_OTHER,
++ reg,
++ 3,
++ NULL,
++ 0);
+ if (err < 0)
+ goto end;
+
+@@ -1728,7 +1730,7 @@ static int snd_microii_spdif_default_update(struct usb_mixer_elem_list *list)
+ }
+
+ static int snd_microii_spdif_default_put(struct snd_kcontrol *kcontrol,
+- struct snd_ctl_elem_value *ucontrol)
++ struct snd_ctl_elem_value *ucontrol)
+ {
+ struct usb_mixer_elem_list *list = snd_kcontrol_chip(kcontrol);
+ unsigned int pval, pval_old;
+@@ -1755,7 +1757,7 @@ static int snd_microii_spdif_default_put(struct snd_kcontrol *kcontrol,
+ }
+
+ static int snd_microii_spdif_mask_get(struct snd_kcontrol *kcontrol,
+- struct snd_ctl_elem_value *ucontrol)
++ struct snd_ctl_elem_value *ucontrol)
+ {
+ ucontrol->value.iec958.status[0] = 0x0f;
+ ucontrol->value.iec958.status[1] = 0xff;
+@@ -1766,7 +1768,7 @@ static int snd_microii_spdif_mask_get(struct snd_kcontrol *kcontrol,
+ }
+
+ static int snd_microii_spdif_switch_get(struct snd_kcontrol *kcontrol,
+- struct snd_ctl_elem_value *ucontrol)
++ struct snd_ctl_elem_value *ucontrol)
+ {
+ ucontrol->value.integer.value[0] = !(kcontrol->private_value & 0x02);
+
+@@ -1784,20 +1786,20 @@ static int snd_microii_spdif_switch_update(struct usb_mixer_elem_list *list)
+ return err;
+
+ err = snd_usb_ctl_msg(chip->dev,
+- usb_sndctrlpipe(chip->dev, 0),
+- UAC_SET_CUR,
+- USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_OTHER,
+- reg,
+- 9,
+- NULL,
+- 0);
++ usb_sndctrlpipe(chip->dev, 0),
++ UAC_SET_CUR,
++ USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_OTHER,
++ reg,
++ 9,
++ NULL,
++ 0);
+
+ snd_usb_unlock_shutdown(chip);
+ return err;
+ }
+
+ static int snd_microii_spdif_switch_put(struct snd_kcontrol *kcontrol,
+- struct snd_ctl_elem_value *ucontrol)
++ struct snd_ctl_elem_value *ucontrol)
+ {
+ struct usb_mixer_elem_list *list = snd_kcontrol_chip(kcontrol);
+ u8 reg;
+@@ -1882,9 +1884,9 @@ static int snd_soundblaster_e1_switch_update(struct usb_mixer_interface *mixer,
+ if (err < 0)
+ return err;
+ err = snd_usb_ctl_msg(chip->dev,
+- usb_sndctrlpipe(chip->dev, 0), HID_REQ_SET_REPORT,
+- USB_TYPE_CLASS | USB_RECIP_INTERFACE | USB_DIR_OUT,
+- 0x0202, 3, buff, 2);
++ usb_sndctrlpipe(chip->dev, 0), HID_REQ_SET_REPORT,
++ USB_TYPE_CLASS | USB_RECIP_INTERFACE | USB_DIR_OUT,
++ 0x0202, 3, buff, 2);
+ snd_usb_unlock_shutdown(chip);
+ return err;
+ }
+@@ -3234,7 +3236,7 @@ static int snd_rme_digiface_enum_put(struct snd_kcontrol *kcontrol,
+ }
+
+ static int snd_rme_digiface_current_sync_get(struct snd_kcontrol *kcontrol,
+- struct snd_ctl_elem_value *ucontrol)
++ struct snd_ctl_elem_value *ucontrol)
+ {
+ int ret = snd_rme_digiface_enum_get(kcontrol, ucontrol);
+
+@@ -3806,7 +3808,7 @@ static const struct snd_djm_device snd_djm_devices[] = {
+
+
+ static int snd_djm_controls_info(struct snd_kcontrol *kctl,
+- struct snd_ctl_elem_info *info)
++ struct snd_ctl_elem_info *info)
+ {
+ unsigned long private_value = kctl->private_value;
+ u8 device_idx = (private_value & SND_DJM_DEVICE_MASK) >> SND_DJM_DEVICE_SHIFT;
+@@ -3825,8 +3827,8 @@ static int snd_djm_controls_info(struct snd_kcontrol *kctl,
+ info->value.enumerated.item = noptions - 1;
+
+ name = snd_djm_get_label(device_idx,
+- ctl->options[info->value.enumerated.item],
+- ctl->wIndex);
++ ctl->options[info->value.enumerated.item],
++ ctl->wIndex);
+ if (!name)
+ return -EINVAL;
+
+@@ -3838,7 +3840,7 @@ static int snd_djm_controls_info(struct snd_kcontrol *kctl,
+ }
+
+ static int snd_djm_controls_update(struct usb_mixer_interface *mixer,
+- u8 device_idx, u8 group, u16 value)
++ u8 device_idx, u8 group, u16 value)
+ {
+ int err;
+ const struct snd_djm_device *device = &snd_djm_devices[device_idx];
+@@ -3850,13 +3852,13 @@ static int snd_djm_controls_update(struct usb_mixer_interface *mixer,
+ if (err)
+ return err;
+
+- err = snd_usb_ctl_msg(
+- mixer->chip->dev, usb_sndctrlpipe(mixer->chip->dev, 0),
+- USB_REQ_SET_FEATURE,
+- USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
+- device->controls[group].options[value],
+- device->controls[group].wIndex,
+- NULL, 0);
++ err = snd_usb_ctl_msg(mixer->chip->dev,
++ usb_sndctrlpipe(mixer->chip->dev, 0),
++ USB_REQ_SET_FEATURE,
++ USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
++ device->controls[group].options[value],
++ device->controls[group].wIndex,
++ NULL, 0);
+
+ snd_usb_unlock_shutdown(mixer->chip);
+ return err;
+@@ -3897,7 +3899,7 @@ static int snd_djm_controls_resume(struct usb_mixer_elem_list *list)
+ }
+
+ static int snd_djm_controls_create(struct usb_mixer_interface *mixer,
+- const u8 device_idx)
++ const u8 device_idx)
+ {
+ int err, i;
+ u16 value;
+@@ -3916,10 +3918,10 @@ static int snd_djm_controls_create(struct usb_mixer_interface *mixer,
+ for (i = 0; i < device->ncontrols; i++) {
+ value = device->controls[i].default_value;
+ knew.name = device->controls[i].name;
+- knew.private_value = (
++ knew.private_value =
+ ((unsigned long)device_idx << SND_DJM_DEVICE_SHIFT) |
+ (i << SND_DJM_GROUP_SHIFT) |
+- value);
++ value;
+ err = snd_djm_controls_update(mixer, device_idx, i, value);
+ if (err)
+ return err;
+@@ -3986,13 +3988,15 @@ int snd_usb_mixer_apply_create_quirk(struct usb_mixer_interface *mixer)
+ break;
+
+ case USB_ID(0x17cc, 0x1011): /* Traktor Audio 6 */
+- err = snd_nativeinstruments_create_mixer(mixer,
++ err = snd_nativeinstruments_create_mixer(/* checkpatch hack */
++ mixer,
+ snd_nativeinstruments_ta6_mixers,
+ ARRAY_SIZE(snd_nativeinstruments_ta6_mixers));
+ break;
+
+ case USB_ID(0x17cc, 0x1021): /* Traktor Audio 10 */
+- err = snd_nativeinstruments_create_mixer(mixer,
++ err = snd_nativeinstruments_create_mixer(/* checkpatch hack */
++ mixer,
+ snd_nativeinstruments_ta10_mixers,
+ ARRAY_SIZE(snd_nativeinstruments_ta10_mixers));
+ break;
+--
+2.51.0
+
--- /dev/null
+From 6546ef4333172120bf5a5e875cc1ec792c54482e Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 27 Aug 2025 11:29:02 +0800
+Subject: ALSA: usb-audio: move mixer_quirks' min_mute into common quirk
+
+From: Cryolitia PukNgae <cryolitia@uniontech.com>
+
+[ Upstream commit 2c3ca8cc55a3afc7a4fa99ed8f5f5d05dd2e65b3 ]
+
+We have found more and more devices that have the same problem, that
+the mixer's minimum value is muted. Accroding to pipewire's MR[1]
+and Arch Linux wiki[2], this should be a very common problem in USB
+audio devices. Move the quirk into common quirk,as a preparation of
+more devices' quirk's patch coming on the road[3].
+
+1. https://gitlab.freedesktop.org/pipewire/pipewire/-/merge_requests/2514
+2. https://wiki.archlinux.org/index.php?title=PipeWire&oldid=804138#No_sound_from_USB_DAC_until_30%_volume
+3. On the road, in the physical sense. We have been buying ton of
+ these devices for testing the problem.
+
+Tested-by: Guoli An <anguoli@uniontech.com>
+Signed-off-by: Cryolitia PukNgae <cryolitia@uniontech.com>
+Link: https://patch.msgid.link/20250827-sound-quirk-min-mute-v1-1-4717aa8a4f6a@uniontech.com
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/mixer_quirks.c | 10 +++-------
+ sound/usb/quirks.c | 12 ++++++++++--
+ sound/usb/usbaudio.h | 4 ++++
+ 3 files changed, 17 insertions(+), 9 deletions(-)
+
+diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
+index 8d7fc6edc8c79..b663764644cd8 100644
+--- a/sound/usb/mixer_quirks.c
++++ b/sound/usb/mixer_quirks.c
+@@ -4484,16 +4484,12 @@ void snd_usb_mixer_fu_apply_quirk(struct usb_mixer_interface *mixer,
+ if (unitid == 7 && cval->control == UAC_FU_VOLUME)
+ snd_dragonfly_quirk_db_scale(mixer, cval, kctl);
+ break;
++ }
++
+ /* lowest playback value is muted on some devices */
+- case USB_ID(0x0572, 0x1b09): /* Conexant Systems (Rockwell), Inc. */
+- case USB_ID(0x0d8c, 0x000c): /* C-Media */
+- case USB_ID(0x0d8c, 0x0014): /* C-Media */
+- case USB_ID(0x19f7, 0x0003): /* RODE NT-USB */
+- case USB_ID(0x2d99, 0x0026): /* HECATE G2 GAMING HEADSET */
++ if (mixer->chip->quirk_flags & QUIRK_FLAG_MIXER_MIN_MUTE)
+ if (strstr(kctl->id.name, "Playback"))
+ cval->min_mute = 1;
+- break;
+- }
+
+ /* ALSA-ify some Plantronics headset control names */
+ if (USB_ID_VENDOR(mixer->chip->usb_id) == 0x047f &&
+diff --git a/sound/usb/quirks.c b/sound/usb/quirks.c
+index de57cf35d8258..03962b3e3bd58 100644
+--- a/sound/usb/quirks.c
++++ b/sound/usb/quirks.c
+@@ -2196,6 +2196,8 @@ static const struct usb_audio_quirk_flags_table quirk_flags_table[] = {
+ QUIRK_FLAG_SET_IFACE_FIRST),
+ DEVICE_FLG(0x0556, 0x0014, /* Phoenix Audio TMX320VC */
+ QUIRK_FLAG_GET_SAMPLE_RATE),
++ DEVICE_FLG(0x0572, 0x1b09, /* Conexant Systems (Rockwell), Inc. */
++ QUIRK_FLAG_MIXER_MIN_MUTE),
+ DEVICE_FLG(0x05a3, 0x9420, /* ELP HD USB Camera */
+ QUIRK_FLAG_GET_SAMPLE_RATE),
+ DEVICE_FLG(0x05a7, 0x1020, /* Bose Companion 5 */
+@@ -2242,8 +2244,10 @@ static const struct usb_audio_quirk_flags_table quirk_flags_table[] = {
+ QUIRK_FLAG_GET_SAMPLE_RATE),
+ DEVICE_FLG(0x0c45, 0x636b, /* Microdia JP001 USB Camera */
+ QUIRK_FLAG_GET_SAMPLE_RATE),
+- DEVICE_FLG(0x0d8c, 0x0014, /* USB Audio Device */
+- QUIRK_FLAG_CTL_MSG_DELAY_1M),
++ DEVICE_FLG(0x0d8c, 0x000c, /* C-Media */
++ QUIRK_FLAG_MIXER_MIN_MUTE),
++ DEVICE_FLG(0x0d8c, 0x0014, /* C-Media */
++ QUIRK_FLAG_CTL_MSG_DELAY_1M | QUIRK_FLAG_MIXER_MIN_MUTE),
+ DEVICE_FLG(0x0ecb, 0x205c, /* JBL Quantum610 Wireless */
+ QUIRK_FLAG_FIXED_RATE),
+ DEVICE_FLG(0x0ecb, 0x2069, /* JBL Quantum810 Wireless */
+@@ -2290,6 +2294,8 @@ static const struct usb_audio_quirk_flags_table quirk_flags_table[] = {
+ QUIRK_FLAG_ITF_USB_DSD_DAC | QUIRK_FLAG_CTL_MSG_DELAY),
+ DEVICE_FLG(0x1901, 0x0191, /* GE B850V3 CP2114 audio interface */
+ QUIRK_FLAG_GET_SAMPLE_RATE),
++ DEVICE_FLG(0x19f7, 0x0003, /* RODE NT-USB */
++ QUIRK_FLAG_MIXER_MIN_MUTE),
+ DEVICE_FLG(0x19f7, 0x0035, /* RODE NT-USB+ */
+ QUIRK_FLAG_GET_SAMPLE_RATE),
+ DEVICE_FLG(0x1bcf, 0x2281, /* HD Webcam */
+@@ -2350,6 +2356,8 @@ static const struct usb_audio_quirk_flags_table quirk_flags_table[] = {
+ QUIRK_FLAG_CTL_MSG_DELAY_1M),
+ DEVICE_FLG(0x2d95, 0x8021, /* VIVO USB-C-XE710 HEADSET */
+ QUIRK_FLAG_CTL_MSG_DELAY_1M),
++ DEVICE_FLG(0x2d99, 0x0026, /* HECATE G2 GAMING HEADSET */
++ QUIRK_FLAG_MIXER_MIN_MUTE),
+ DEVICE_FLG(0x2fc6, 0xf0b7, /* iBasso DC07 Pro */
+ QUIRK_FLAG_CTL_MSG_DELAY_1M),
+ DEVICE_FLG(0x30be, 0x0101, /* Schiit Hel */
+diff --git a/sound/usb/usbaudio.h b/sound/usb/usbaudio.h
+index 158ec053dc44d..1ef4d39978df3 100644
+--- a/sound/usb/usbaudio.h
++++ b/sound/usb/usbaudio.h
+@@ -196,6 +196,9 @@ extern bool snd_usb_skip_validation;
+ * for the given endpoint.
+ * QUIRK_FLAG_MIC_RES_16 and QUIRK_FLAG_MIC_RES_384
+ * Set the fixed resolution for Mic Capture Volume (mostly for webcams)
++ * QUIRK_FLAG_MIXER_MIN_MUTE
++ * Set minimum volume control value as mute for devices where the lowest
++ * playback value represents muted state instead of minimum audible volume
+ */
+
+ #define QUIRK_FLAG_GET_SAMPLE_RATE (1U << 0)
+@@ -222,5 +225,6 @@ extern bool snd_usb_skip_validation;
+ #define QUIRK_FLAG_FIXED_RATE (1U << 21)
+ #define QUIRK_FLAG_MIC_RES_16 (1U << 22)
+ #define QUIRK_FLAG_MIC_RES_384 (1U << 23)
++#define QUIRK_FLAG_MIXER_MIN_MUTE (1U << 24)
+
+ #endif /* __USBAUDIO_H */
+--
+2.51.0
+
--- /dev/null
+From 18a47bcf8606c3a4ce9c8f4fcfc9666cba9f8f06 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 26 May 2025 17:07:47 +0300
+Subject: ALSA: usb-audio: Remove unneeded wmb() in mixer_quirks
+
+From: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+
+[ Upstream commit 9cea7425595697802e8d55a322a251999554b8b1 ]
+
+Adding a memory barrier before wake_up() in
+snd_usb_soundblaster_remote_complete() is supposed to ensure the write
+to mixer->rc_code is visible in wait_event_interruptible() from
+snd_usb_sbrc_hwdep_read().
+
+However, this is not really necessary, since wake_up() is just a wrapper
+over __wake_up() which already executes a full memory barrier before
+accessing the state of the task to be waken up.
+
+Drop the redundant call to wmb() and implicitly fix the checkpatch
+complaint:
+
+ WARNING: memory barrier without comment
+
+Signed-off-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Link: https://patch.msgid.link/20250526-dualsense-alsa-jack-v1-8-1a821463b632@collabora.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/mixer_quirks.c | 1 -
+ 1 file changed, 1 deletion(-)
+
+diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
+index 3bd2daba8ecac..5f660c6933d2d 100644
+--- a/sound/usb/mixer_quirks.c
++++ b/sound/usb/mixer_quirks.c
+@@ -211,7 +211,6 @@ static void snd_usb_soundblaster_remote_complete(struct urb *urb)
+ if (code == rc->mute_code)
+ snd_usb_mixer_notify_id(mixer, rc->mute_mixer_id);
+ mixer->rc_code = code;
+- wmb();
+ wake_up(&mixer->rc_waitq);
+ }
+
+--
+2.51.0
+
--- /dev/null
+From 1325f86d8ad91a2f9a796f6124db1a39cb4745db Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 26 May 2025 17:07:46 +0300
+Subject: ALSA: usb-audio: Simplify NULL comparison in mixer_quirks
+
+From: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+
+[ Upstream commit f2d6d660e8fd5f4467e80743f82119201e67fa9c ]
+
+Handle report from checkpatch.pl:
+
+ CHECK: Comparison to NULL could be written "t->name"
+
+Signed-off-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Link: https://patch.msgid.link/20250526-dualsense-alsa-jack-v1-7-1a821463b632@collabora.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/mixer_quirks.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
+index 1eae6e83d0259..3bd2daba8ecac 100644
+--- a/sound/usb/mixer_quirks.c
++++ b/sound/usb/mixer_quirks.c
+@@ -128,7 +128,7 @@ static int snd_create_std_mono_table(struct usb_mixer_interface *mixer,
+ {
+ int err;
+
+- while (t->name != NULL) {
++ while (t->name) {
+ err = snd_create_std_mono_ctl(mixer, t->unitid, t->control,
+ t->cmask, t->val_type, t->name,
+ t->tlv_callback);
+--
+2.51.0
+
--- /dev/null
+From 78be8f8bc5843b250eb181403815ec1552e4e1f8 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sat, 20 Sep 2025 11:51:48 +0900
+Subject: firewire: core: fix overlooked update of subsystem ABI version
+
+From: Takashi Sakamoto <o-takashi@sakamocchi.jp>
+
+[ Upstream commit 853a57ba263adfecf4430b936d6862bc475b4bb5 ]
+
+In kernel v6.5, several functions were added to the cdev layer. This
+required updating the default version of subsystem ABI up to 6, but
+this requirement was overlooked.
+
+This commit updates the version accordingly.
+
+Fixes: 6add87e9764d ("firewire: cdev: add new version of ABI to notify time stamp at request/response subaction of transaction#")
+Link: https://lore.kernel.org/r/20250920025148.163402-1-o-takashi@sakamocchi.jp
+Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/firewire/core-cdev.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/firewire/core-cdev.c b/drivers/firewire/core-cdev.c
+index b360dca2c69e8..cc9731c3616c1 100644
+--- a/drivers/firewire/core-cdev.c
++++ b/drivers/firewire/core-cdev.c
+@@ -41,7 +41,7 @@
+ /*
+ * ABI version history is documented in linux/firewire-cdev.h.
+ */
+-#define FW_CDEV_KERNEL_VERSION 5
++#define FW_CDEV_KERNEL_VERSION 6
+ #define FW_CDEV_VERSION_EVENT_REQUEST2 4
+ #define FW_CDEV_VERSION_ALLOCATE_REGION_END 4
+ #define FW_CDEV_VERSION_AUTO_FLUSH_ISO_OVERFLOW 5
+--
+2.51.0
+
--- /dev/null
+From 8186d94bba187509fd59a944aafed98527a58456 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 18 Sep 2025 18:02:02 +0530
+Subject: HID: amd_sfh: Add sync across amd sfh work functions
+
+From: Basavaraj Natikar <Basavaraj.Natikar@amd.com>
+
+[ Upstream commit bba920e6f803138587248079de47ad3464a396f6 ]
+
+The process of the report is delegated across different work functions.
+Hence, add a sync mechanism to protect SFH work data across functions.
+
+Fixes: 4b2c53d93a4b ("SFH:Transport Driver to add support of AMD Sensor Fusion Hub (SFH)")
+Reported-by: Matthew Schwartz <matthew.schwartz@linux.dev>
+Closes: https://lore.kernel.org/all/a21abca5-4268-449d-95f1-bdd7a25894a5@linux.dev/
+Tested-by: Prakruthi SP <Prakruthi.SP@amd.com>
+Co-developed-by: Akshata MukundShetty <akshata.mukundshetty@amd.com>
+Signed-off-by: Akshata MukundShetty <akshata.mukundshetty@amd.com>
+Signed-off-by: Basavaraj Natikar <Basavaraj.Natikar@amd.com>
+Reviewed-by: Mario Limonciello (AMD) <superm1@kernel.org>
+Signed-off-by: Jiri Kosina <jkosina@suse.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/hid/amd-sfh-hid/amd_sfh_client.c | 12 ++++++++++--
+ drivers/hid/amd-sfh-hid/amd_sfh_common.h | 3 +++
+ drivers/hid/amd-sfh-hid/amd_sfh_pcie.c | 4 ++++
+ 3 files changed, 17 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/hid/amd-sfh-hid/amd_sfh_client.c b/drivers/hid/amd-sfh-hid/amd_sfh_client.c
+index 3438d392920fa..8dae9a7766853 100644
+--- a/drivers/hid/amd-sfh-hid/amd_sfh_client.c
++++ b/drivers/hid/amd-sfh-hid/amd_sfh_client.c
+@@ -39,8 +39,12 @@ int amd_sfh_get_report(struct hid_device *hid, int report_id, int report_type)
+ struct amdtp_hid_data *hid_data = hid->driver_data;
+ struct amdtp_cl_data *cli_data = hid_data->cli_data;
+ struct request_list *req_list = &cli_data->req_list;
++ struct amd_input_data *in_data = cli_data->in_data;
++ struct amd_mp2_dev *mp2;
+ int i;
+
++ mp2 = container_of(in_data, struct amd_mp2_dev, in_data);
++ guard(mutex)(&mp2->lock);
+ for (i = 0; i < cli_data->num_hid_devices; i++) {
+ if (cli_data->hid_sensor_hubs[i] == hid) {
+ struct request_list *new = kzalloc(sizeof(*new), GFP_KERNEL);
+@@ -75,6 +79,8 @@ void amd_sfh_work(struct work_struct *work)
+ u8 report_id, node_type;
+ u8 report_size = 0;
+
++ mp2 = container_of(in_data, struct amd_mp2_dev, in_data);
++ guard(mutex)(&mp2->lock);
+ req_node = list_last_entry(&req_list->list, struct request_list, list);
+ list_del(&req_node->list);
+ current_index = req_node->current_index;
+@@ -83,7 +89,6 @@ void amd_sfh_work(struct work_struct *work)
+ node_type = req_node->report_type;
+ kfree(req_node);
+
+- mp2 = container_of(in_data, struct amd_mp2_dev, in_data);
+ mp2_ops = mp2->mp2_ops;
+ if (node_type == HID_FEATURE_REPORT) {
+ report_size = mp2_ops->get_feat_rep(sensor_index, report_id,
+@@ -107,6 +112,8 @@ void amd_sfh_work(struct work_struct *work)
+ cli_data->cur_hid_dev = current_index;
+ cli_data->sensor_requested_cnt[current_index] = 0;
+ amdtp_hid_wakeup(cli_data->hid_sensor_hubs[current_index]);
++ if (!list_empty(&req_list->list))
++ schedule_delayed_work(&cli_data->work, 0);
+ }
+
+ void amd_sfh_work_buffer(struct work_struct *work)
+@@ -117,9 +124,10 @@ void amd_sfh_work_buffer(struct work_struct *work)
+ u8 report_size;
+ int i;
+
++ mp2 = container_of(in_data, struct amd_mp2_dev, in_data);
++ guard(mutex)(&mp2->lock);
+ for (i = 0; i < cli_data->num_hid_devices; i++) {
+ if (cli_data->sensor_sts[i] == SENSOR_ENABLED) {
+- mp2 = container_of(in_data, struct amd_mp2_dev, in_data);
+ report_size = mp2->mp2_ops->get_in_rep(i, cli_data->sensor_idx[i],
+ cli_data->report_id[i], in_data);
+ hid_input_report(cli_data->hid_sensor_hubs[i], HID_INPUT_REPORT,
+diff --git a/drivers/hid/amd-sfh-hid/amd_sfh_common.h b/drivers/hid/amd-sfh-hid/amd_sfh_common.h
+index e5620d7db5690..00308d8998d4d 100644
+--- a/drivers/hid/amd-sfh-hid/amd_sfh_common.h
++++ b/drivers/hid/amd-sfh-hid/amd_sfh_common.h
+@@ -10,6 +10,7 @@
+ #ifndef AMD_SFH_COMMON_H
+ #define AMD_SFH_COMMON_H
+
++#include <linux/mutex.h>
+ #include <linux/pci.h>
+ #include "amd_sfh_hid.h"
+
+@@ -57,6 +58,8 @@ struct amd_mp2_dev {
+ u32 mp2_acs;
+ struct sfh_dev_status dev_en;
+ struct work_struct work;
++ /* mp2 to protect data */
++ struct mutex lock;
+ u8 init_done;
+ u8 rver;
+ };
+diff --git a/drivers/hid/amd-sfh-hid/amd_sfh_pcie.c b/drivers/hid/amd-sfh-hid/amd_sfh_pcie.c
+index 0c28ca349bcd3..9739f66e925c0 100644
+--- a/drivers/hid/amd-sfh-hid/amd_sfh_pcie.c
++++ b/drivers/hid/amd-sfh-hid/amd_sfh_pcie.c
+@@ -405,6 +405,10 @@ static int amd_mp2_pci_probe(struct pci_dev *pdev, const struct pci_device_id *i
+ if (!privdata->cl_data)
+ return -ENOMEM;
+
++ rc = devm_mutex_init(&pdev->dev, &privdata->lock);
++ if (rc)
++ return rc;
++
+ privdata->sfh1_1_ops = (const struct amd_sfh1_1_ops *)id->driver_data;
+ if (privdata->sfh1_1_ops) {
+ if (boot_cpu_data.x86 >= 0x1A)
+--
+2.51.0
+
--- /dev/null
+From 4dd91ed501915ea23f94f24b5a0318903bbe2d7c Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 27 May 2025 22:13:13 +0530
+Subject: HID: multitouch: Get the contact ID from HID_DG_TRANSDUCER_INDEX
+ fields in case of Apple Touch Bar
+
+From: Kerem Karabay <kekrby@gmail.com>
+
+[ Upstream commit f41d736acc039d86512951f4e874b0f5e666babf ]
+
+In Apple Touch Bar, the contact ID is contained in fields with the
+HID_DG_TRANSDUCER_INDEX usage rather than HID_DG_CONTACTID, thus differing
+from the HID spec. Add a quirk for the same.
+
+Acked-by: Benjamin Tissoires <bentiss@kernel.org>
+Signed-off-by: Kerem Karabay <kekrby@gmail.com>
+Co-developed-by: Aditya Garg <gargaditya08@live.com>
+Signed-off-by: Aditya Garg <gargaditya08@live.com>
+Signed-off-by: Jiri Kosina <jkosina@suse.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/hid/hid-multitouch.c | 16 +++++++++++++++-
+ 1 file changed, 15 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/hid/hid-multitouch.c b/drivers/hid/hid-multitouch.c
+index 5c424010bc025..be2bbce25b3df 100644
+--- a/drivers/hid/hid-multitouch.c
++++ b/drivers/hid/hid-multitouch.c
+@@ -72,6 +72,7 @@ MODULE_LICENSE("GPL");
+ #define MT_QUIRK_FORCE_MULTI_INPUT BIT(20)
+ #define MT_QUIRK_DISABLE_WAKEUP BIT(21)
+ #define MT_QUIRK_ORIENTATION_INVERT BIT(22)
++#define MT_QUIRK_APPLE_TOUCHBAR BIT(23)
+
+ #define MT_INPUTMODE_TOUCHSCREEN 0x02
+ #define MT_INPUTMODE_TOUCHPAD 0x03
+@@ -617,6 +618,7 @@ static struct mt_application *mt_find_application(struct mt_device *td,
+ static struct mt_report_data *mt_allocate_report_data(struct mt_device *td,
+ struct hid_report *report)
+ {
++ struct mt_class *cls = &td->mtclass;
+ struct mt_report_data *rdata;
+ struct hid_field *field;
+ int r, n;
+@@ -641,7 +643,11 @@ static struct mt_report_data *mt_allocate_report_data(struct mt_device *td,
+
+ if (field->logical == HID_DG_FINGER || td->hdev->group != HID_GROUP_MULTITOUCH_WIN_8) {
+ for (n = 0; n < field->report_count; n++) {
+- if (field->usage[n].hid == HID_DG_CONTACTID) {
++ unsigned int hid = field->usage[n].hid;
++
++ if (hid == HID_DG_CONTACTID ||
++ (cls->quirks & MT_QUIRK_APPLE_TOUCHBAR &&
++ hid == HID_DG_TRANSDUCER_INDEX)) {
+ rdata->is_mt_collection = true;
+ break;
+ }
+@@ -819,6 +825,14 @@ static int mt_touch_input_mapping(struct hid_device *hdev, struct hid_input *hi,
+ EV_KEY, BTN_TOUCH);
+ MT_STORE_FIELD(tip_state);
+ return 1;
++ case HID_DG_TRANSDUCER_INDEX:
++ /*
++ * Contact ID in case of Apple Touch Bars is contained
++ * in fields with HID_DG_TRANSDUCER_INDEX usage.
++ */
++ if (!(cls->quirks & MT_QUIRK_APPLE_TOUCHBAR))
++ return 0;
++ fallthrough;
+ case HID_DG_CONTACTID:
+ MT_STORE_FIELD(contactid);
+ app->touches_by_report++;
+--
+2.51.0
+
--- /dev/null
+From 7d95678cea9d56d1b33d42525d44321f1dad308b Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 27 May 2025 22:13:16 +0530
+Subject: HID: multitouch: specify that Apple Touch Bar is direct
+
+From: Kerem Karabay <kekrby@gmail.com>
+
+[ Upstream commit 45ca23c5ee8b2b3074377fecc92fa72aa595f7c9 ]
+
+Currently the driver determines the device type based on the
+application, but this value is not reliable on Apple Touch Bar, where
+the application is HID_DG_TOUCHPAD even though this device is direct,
+so add a quirk for the same.
+
+Acked-by: Benjamin Tissoires <bentiss@kernel.org>
+Signed-off-by: Kerem Karabay <kekrby@gmail.com>
+Co-developed-by: Aditya Garg <gargaditya08@live.com>
+Signed-off-by: Aditya Garg <gargaditya08@live.com>
+Signed-off-by: Jiri Kosina <jkosina@suse.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/hid/hid-multitouch.c | 7 +++++++
+ 1 file changed, 7 insertions(+)
+
+diff --git a/drivers/hid/hid-multitouch.c b/drivers/hid/hid-multitouch.c
+index ec676f26800ea..09a56adf619b7 100644
+--- a/drivers/hid/hid-multitouch.c
++++ b/drivers/hid/hid-multitouch.c
+@@ -1341,6 +1341,13 @@ static int mt_touch_input_configured(struct hid_device *hdev,
+ if (td->serial_maybe)
+ mt_post_parse_default_settings(td, app);
+
++ /*
++ * The application for Apple Touch Bars is HID_DG_TOUCHPAD,
++ * but these devices are direct.
++ */
++ if (cls->quirks & MT_QUIRK_APPLE_TOUCHBAR)
++ app->mt_flags |= INPUT_MT_DIRECT;
++
+ if (cls->is_indirect)
+ app->mt_flags |= INPUT_MT_POINTER;
+
+--
+2.51.0
+
--- /dev/null
+From d99d0f667e7db683abddcad7b94fe59a28866299 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 27 May 2025 22:13:14 +0530
+Subject: HID: multitouch: support getting the tip state from HID_DG_TOUCH
+ fields in Apple Touch Bar
+
+From: Kerem Karabay <kekrby@gmail.com>
+
+[ Upstream commit e0976a61a543b5e03bc0d08030a0ea036ee3751d ]
+
+In Apple Touch Bar, the tip state is contained in fields with the
+HID_DG_TOUCH usage. This feature is gated by a quirk in order to
+prevent breaking other devices, see commit c2ef8f21ea8f
+("HID: multitouch: add support for trackpads").
+
+Acked-by: Benjamin Tissoires <bentiss@kernel.org>
+Signed-off-by: Kerem Karabay <kekrby@gmail.com>
+Co-developed-by: Aditya Garg <gargaditya08@live.com>
+Signed-off-by: Aditya Garg <gargaditya08@live.com>
+Signed-off-by: Jiri Kosina <jkosina@suse.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/hid/hid-multitouch.c | 15 +++++++++++----
+ 1 file changed, 11 insertions(+), 4 deletions(-)
+
+diff --git a/drivers/hid/hid-multitouch.c b/drivers/hid/hid-multitouch.c
+index be2bbce25b3df..39a8c6619876b 100644
+--- a/drivers/hid/hid-multitouch.c
++++ b/drivers/hid/hid-multitouch.c
+@@ -819,6 +819,17 @@ static int mt_touch_input_mapping(struct hid_device *hdev, struct hid_input *hi,
+
+ MT_STORE_FIELD(confidence_state);
+ return 1;
++ case HID_DG_TOUCH:
++ /*
++ * Legacy devices use TIPSWITCH and not TOUCH.
++ * One special case here is of the Apple Touch Bars.
++ * In these devices, the tip state is contained in
++ * fields with the HID_DG_TOUCH usage.
++ * Let's just ignore this field for other devices.
++ */
++ if (!(cls->quirks & MT_QUIRK_APPLE_TOUCHBAR))
++ return -1;
++ fallthrough;
+ case HID_DG_TIPSWITCH:
+ if (field->application != HID_GD_SYSTEM_MULTIAXIS)
+ input_set_capability(hi->input,
+@@ -889,10 +900,6 @@ static int mt_touch_input_mapping(struct hid_device *hdev, struct hid_input *hi,
+ case HID_DG_CONTACTMAX:
+ /* contact max are global to the report */
+ return -1;
+- case HID_DG_TOUCH:
+- /* Legacy devices use TIPSWITCH and not TOUCH.
+- * Let's just ignore this field. */
+- return -1;
+ }
+ /* let hid-input decide for the others */
+ return 0;
+--
+2.51.0
+
--- /dev/null
+From c820a09485b828fbd040e764a222d777b27e946d Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 27 May 2025 22:13:15 +0530
+Subject: HID: multitouch: take cls->maxcontacts into account for Apple Touch
+ Bar even without a HID_DG_CONTACTMAX field
+
+From: Kerem Karabay <kekrby@gmail.com>
+
+[ Upstream commit 7dfe48bdc9d38db46283f2e0281bc1626277b8bf ]
+
+In Apple Touch Bar, the HID_DG_CONTACTMAX is not present, but the maximum
+contact count is still greater than the default. Add quirks for the same.
+
+Acked-by: Benjamin Tissoires <bentiss@kernel.org>
+Signed-off-by: Kerem Karabay <kekrby@gmail.com>
+Co-developed-by: Aditya Garg <gargaditya08@live.com>
+Signed-off-by: Aditya Garg <gargaditya08@live.com>
+Signed-off-by: Jiri Kosina <jkosina@suse.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/hid/hid-multitouch.c | 7 +++++++
+ 1 file changed, 7 insertions(+)
+
+diff --git a/drivers/hid/hid-multitouch.c b/drivers/hid/hid-multitouch.c
+index 39a8c6619876b..ec676f26800ea 100644
+--- a/drivers/hid/hid-multitouch.c
++++ b/drivers/hid/hid-multitouch.c
+@@ -1327,6 +1327,13 @@ static int mt_touch_input_configured(struct hid_device *hdev,
+ struct input_dev *input = hi->input;
+ int ret;
+
++ /*
++ * HID_DG_CONTACTMAX field is not present on Apple Touch Bars,
++ * but the maximum contact count is greater than the default.
++ */
++ if (cls->quirks & MT_QUIRK_APPLE_TOUCHBAR && cls->maxcontacts)
++ td->maxcontacts = cls->maxcontacts;
++
+ if (!td->maxcontacts)
+ td->maxcontacts = MT_DEFAULT_MAXCONTACT;
+
+--
+2.51.0
+
--- /dev/null
+From f34f191e10a96d92ad3ed6c2a0c66e81aeb0fd20 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 1 Jul 2025 15:22:49 +0300
+Subject: i2c: designware: Add quirk for Intel Xe
+
+From: Heikki Krogerus <heikki.krogerus@linux.intel.com>
+
+[ Upstream commit f6a8e9f3de4567c71ef9f5f13719df69a8b96081 ]
+
+The regmap is coming from the parent also in case of Xe
+GPUs. Reusing the Wangxun quirk for that.
+
+Acked-by: Jarkko Nikula <jarkko.nikula@linux.intel.com>
+Co-developed-by: Michael J. Ruhl <michael.j.ruhl@intel.com>
+Signed-off-by: Michael J. Ruhl <michael.j.ruhl@intel.com>
+Signed-off-by: Heikki Krogerus <heikki.krogerus@linux.intel.com>
+Reviewed-by: Andi Shyti <andi.shyti@kernel.org>
+Link: https://lore.kernel.org/r/20250701122252.2590230-3-heikki.krogerus@linux.intel.com
+Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
+[Rodrigo fixed the co-developed tags while merging]
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/i2c/busses/i2c-designware-platdrv.c | 7 +++++--
+ 1 file changed, 5 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/i2c/busses/i2c-designware-platdrv.c b/drivers/i2c/busses/i2c-designware-platdrv.c
+index a3e86930bf418..ef9bed2f2dccb 100644
+--- a/drivers/i2c/busses/i2c-designware-platdrv.c
++++ b/drivers/i2c/busses/i2c-designware-platdrv.c
+@@ -101,7 +101,7 @@ static int bt1_i2c_request_regs(struct dw_i2c_dev *dev)
+ }
+ #endif
+
+-static int txgbe_i2c_request_regs(struct dw_i2c_dev *dev)
++static int dw_i2c_get_parent_regmap(struct dw_i2c_dev *dev)
+ {
+ dev->map = dev_get_regmap(dev->dev->parent, NULL);
+ if (!dev->map)
+@@ -123,12 +123,15 @@ static int dw_i2c_plat_request_regs(struct dw_i2c_dev *dev)
+ struct platform_device *pdev = to_platform_device(dev->dev);
+ int ret;
+
++ if (device_is_compatible(dev->dev, "intel,xe-i2c"))
++ return dw_i2c_get_parent_regmap(dev);
++
+ switch (dev->flags & MODEL_MASK) {
+ case MODEL_BAIKAL_BT1:
+ ret = bt1_i2c_request_regs(dev);
+ break;
+ case MODEL_WANGXUN_SP:
+- ret = txgbe_i2c_request_regs(dev);
++ ret = dw_i2c_get_parent_regmap(dev);
+ break;
+ default:
+ dev->base = devm_platform_ioremap_resource(pdev, 0);
+--
+2.51.0
+
--- /dev/null
+From 264cbbd1e602b59bfe58dd324a936b3ea2ffd469 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 13 Aug 2025 15:43:20 +0300
+Subject: IB/mlx5: Fix obj_type mismatch for SRQ event subscriptions
+
+From: Or Har-Toov <ohartoov@nvidia.com>
+
+[ Upstream commit 85fe9f565d2d5af95ac2bbaa5082b8ce62b039f5 ]
+
+Fix a bug where the driver's event subscription logic for SRQ-related
+events incorrectly sets obj_type for RMP objects.
+
+When subscribing to SRQ events, get_legacy_obj_type() did not handle
+the MLX5_CMD_OP_CREATE_RMP case, which caused obj_type to be 0
+(default).
+This led to a mismatch between the obj_type used during subscription
+(0) and the value used during notification (1, taken from the event's
+type field). As a result, event mapping for SRQ objects could fail and
+event notification would not be delivered correctly.
+
+This fix adds handling for MLX5_CMD_OP_CREATE_RMP in get_legacy_obj_type,
+returning MLX5_EVENT_QUEUE_TYPE_RQ so obj_type is consistent between
+subscription and notification.
+
+Fixes: 759738537142 ("IB/mlx5: Enable subscription for device events over DEVX")
+Link: https://patch.msgid.link/r/8f1048e3fdd1fde6b90607ce0ed251afaf8a148c.1755088962.git.leon@kernel.org
+Signed-off-by: Or Har-Toov <ohartoov@nvidia.com>
+Reviewed-by: Edward Srouji <edwards@nvidia.com>
+Signed-off-by: Leon Romanovsky <leonro@nvidia.com>
+Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/infiniband/hw/mlx5/devx.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/drivers/infiniband/hw/mlx5/devx.c b/drivers/infiniband/hw/mlx5/devx.c
+index f49f78b69ab9c..e74273bc078be 100644
+--- a/drivers/infiniband/hw/mlx5/devx.c
++++ b/drivers/infiniband/hw/mlx5/devx.c
+@@ -191,6 +191,7 @@ static u16 get_legacy_obj_type(u16 opcode)
+ {
+ switch (opcode) {
+ case MLX5_CMD_OP_CREATE_RQ:
++ case MLX5_CMD_OP_CREATE_RMP:
+ return MLX5_EVENT_QUEUE_TYPE_RQ;
+ case MLX5_CMD_OP_CREATE_QP:
+ return MLX5_EVENT_QUEUE_TYPE_QP;
+--
+2.51.0
+
--- /dev/null
+From d1bc7a167103caf4d1752c5479321b01b3e28ea5 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 17 Jun 2025 15:25:52 +0200
+Subject: mmc: sdhci-cadence: add Mobileye eyeQ support
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Benoît Monin <benoit.monin@bootlin.com>
+
+[ Upstream commit 120ffe250dd95b5089d032f582c5be9e3a04b94b ]
+
+The MMC/SDHCI controller implemented by Mobileye needs the preset value
+quirks to configure the clock properly at speed slower than HS200.
+It otherwise works as a standard sd4hc controller.
+
+Signed-off-by: Benoît Monin <benoit.monin@bootlin.com>
+Link: https://lore.kernel.org/r/e97f409650495791e07484589e1666ead570fa12.1750156323.git.benoit.monin@bootlin.com
+Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/mmc/host/sdhci-cadence.c | 11 +++++++++++
+ 1 file changed, 11 insertions(+)
+
+diff --git a/drivers/mmc/host/sdhci-cadence.c b/drivers/mmc/host/sdhci-cadence.c
+index be1505e8c536e..7759531ccca70 100644
+--- a/drivers/mmc/host/sdhci-cadence.c
++++ b/drivers/mmc/host/sdhci-cadence.c
+@@ -433,6 +433,13 @@ static const struct sdhci_cdns_drv_data sdhci_elba_drv_data = {
+ },
+ };
+
++static const struct sdhci_cdns_drv_data sdhci_eyeq_drv_data = {
++ .pltfm_data = {
++ .ops = &sdhci_cdns_ops,
++ .quirks2 = SDHCI_QUIRK2_PRESET_VALUE_BROKEN,
++ },
++};
++
+ static const struct sdhci_cdns_drv_data sdhci_cdns_drv_data = {
+ .pltfm_data = {
+ .ops = &sdhci_cdns_ops,
+@@ -595,6 +602,10 @@ static const struct of_device_id sdhci_cdns_match[] = {
+ .compatible = "amd,pensando-elba-sd4hc",
+ .data = &sdhci_elba_drv_data,
+ },
++ {
++ .compatible = "mobileye,eyeq-sd4hc",
++ .data = &sdhci_eyeq_drv_data,
++ },
+ { .compatible = "cdns,sd4hc" },
+ { /* sentinel */ }
+ };
+--
+2.51.0
+
--- /dev/null
+From 6f8d1edd75c01703cfe815415e180f4f41e3e649 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 18 Jun 2025 14:00:05 +0200
+Subject: net: fec: rename struct fec_devinfo fec_imx6x_info -> fec_imx6sx_info
+
+From: Marc Kleine-Budde <mkl@pengutronix.de>
+
+[ Upstream commit 4e8594a88656fa86a9d2b1e72770432470b6dc0c ]
+
+In da722186f654 ("net: fec: set GPR bit on suspend by DT
+configuration.") the platform_device_id fec_devtype::driver_data was
+converted from holding the quirks to a pointing to struct fec_devinfo.
+
+The struct fec_devinfo holding the information for the i.MX6SX was
+named fec_imx6x_info.
+
+Rename fec_imx6x_info to fec_imx6sx_info to align with the SoC's name.
+
+Reviewed-by: Wei Fang <wei.fang@nxp.com>
+Reviewed-by: Frank Li <Frank.Li@nxp.com>
+Reviewed-by: Andrew Lunn <andrew@lunn.ch>
+Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
+Link: https://patch.msgid.link/20250618-fec-cleanups-v4-5-c16f9a1af124@pengutronix.de
+Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/ethernet/freescale/fec_main.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/net/ethernet/freescale/fec_main.c b/drivers/net/ethernet/freescale/fec_main.c
+index 0bd814251d56e..d144494f97e91 100644
+--- a/drivers/net/ethernet/freescale/fec_main.c
++++ b/drivers/net/ethernet/freescale/fec_main.c
+@@ -131,7 +131,7 @@ static const struct fec_devinfo fec_mvf600_info = {
+ FEC_QUIRK_HAS_MDIO_C45,
+ };
+
+-static const struct fec_devinfo fec_imx6x_info = {
++static const struct fec_devinfo fec_imx6sx_info = {
+ .quirks = FEC_QUIRK_ENET_MAC | FEC_QUIRK_HAS_GBIT |
+ FEC_QUIRK_HAS_BUFDESC_EX | FEC_QUIRK_HAS_CSUM |
+ FEC_QUIRK_HAS_VLAN | FEC_QUIRK_HAS_AVB |
+@@ -196,7 +196,7 @@ static const struct of_device_id fec_dt_ids[] = {
+ { .compatible = "fsl,imx28-fec", .data = &fec_imx28_info, },
+ { .compatible = "fsl,imx6q-fec", .data = &fec_imx6q_info, },
+ { .compatible = "fsl,mvf600-fec", .data = &fec_mvf600_info, },
+- { .compatible = "fsl,imx6sx-fec", .data = &fec_imx6x_info, },
++ { .compatible = "fsl,imx6sx-fec", .data = &fec_imx6sx_info, },
+ { .compatible = "fsl,imx6ul-fec", .data = &fec_imx6ul_info, },
+ { .compatible = "fsl,imx8mq-fec", .data = &fec_imx8mq_info, },
+ { .compatible = "fsl,imx8qm-fec", .data = &fec_imx8qm_info, },
+--
+2.51.0
+
--- /dev/null
+From 8e8da1bf4065a2c463d8fcb31ffdb19ba772b021 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sun, 31 Aug 2025 12:59:07 +0200
+Subject: net: sfp: add quirk for FLYPRO copper SFP+ module
+
+From: Aleksander Jan Bajkowski <olek2@wp.pl>
+
+[ Upstream commit ddbf0e78a8b20ec18d314d31336a0230fdc9b394 ]
+
+Add quirk for a copper SFP that identifies itself as "FLYPRO"
+"SFP-10GT-CS-30M". It uses RollBall protocol to talk to the PHY.
+
+Signed-off-by: Aleksander Jan Bajkowski <olek2@wp.pl>
+Reviewed-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
+Link: https://patch.msgid.link/20250831105910.3174-1-olek2@wp.pl
+Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/phy/sfp.c | 3 +++
+ 1 file changed, 3 insertions(+)
+
+diff --git a/drivers/net/phy/sfp.c b/drivers/net/phy/sfp.c
+index e8670249d32c1..f1827a1bd7a59 100644
+--- a/drivers/net/phy/sfp.c
++++ b/drivers/net/phy/sfp.c
+@@ -491,6 +491,9 @@ static const struct sfp_quirk sfp_quirks[] = {
+ SFP_QUIRK("ALCATELLUCENT", "3FE46541AA", sfp_quirk_2500basex,
+ sfp_fixup_nokia),
+
++ // FLYPRO SFP-10GT-CS-30M uses Rollball protocol to talk to the PHY.
++ SFP_QUIRK_F("FLYPRO", "SFP-10GT-CS-30M", sfp_fixup_rollball),
++
+ // Fiberstore SFP-10G-T doesn't identify as copper, uses the Rollball
+ // protocol to talk to the PHY and needs 4 sec wait before probing the
+ // PHY.
+--
+2.51.0
+
--- /dev/null
+From 35d4e83935f6c63b195f591b1382e4291a5ab16f Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 17 Jun 2025 13:03:24 -0500
+Subject: net: sfp: add quirk for Potron SFP+ XGSPON ONU Stick
+
+From: Chris Morgan <macromorgan@hotmail.com>
+
+[ Upstream commit dfec1c14aecee6813f9bafc7b560cc3a31d24079 ]
+
+Add quirk for Potron SFP+ XGSPON ONU Stick (YV SFP+ONT-XGSPON).
+
+This device uses pins 2 and 7 for UART communication, so disable
+TX_FAULT and LOS. Additionally as it is an embedded system in an
+SFP+ form factor provide it enough time to fully boot before we
+attempt to use it.
+
+https://www.potrontec.com/index/index/list/cat_id/2.html#11-83
+https://pon.wiki/xgs-pon/ont/potron-technology/x-onu-sfpp/
+
+Signed-off-by: Chris Morgan <macromorgan@hotmail.com>
+Link: https://patch.msgid.link/20250617180324.229487-1-macroalpha82@gmail.com
+Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/phy/sfp.c | 21 ++++++++++++++++++++-
+ 1 file changed, 20 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/net/phy/sfp.c b/drivers/net/phy/sfp.c
+index 7b33993f7001e..e8670249d32c1 100644
+--- a/drivers/net/phy/sfp.c
++++ b/drivers/net/phy/sfp.c
+@@ -360,6 +360,11 @@ static void sfp_fixup_ignore_tx_fault(struct sfp *sfp)
+ sfp->state_ignore_mask |= SFP_F_TX_FAULT;
+ }
+
++static void sfp_fixup_ignore_hw(struct sfp *sfp, unsigned int mask)
++{
++ sfp->state_hw_mask &= ~mask;
++}
++
+ static void sfp_fixup_nokia(struct sfp *sfp)
+ {
+ sfp_fixup_long_startup(sfp);
+@@ -408,7 +413,19 @@ static void sfp_fixup_halny_gsfp(struct sfp *sfp)
+ * these are possibly used for other purposes on this
+ * module, e.g. a serial port.
+ */
+- sfp->state_hw_mask &= ~(SFP_F_TX_FAULT | SFP_F_LOS);
++ sfp_fixup_ignore_hw(sfp, SFP_F_TX_FAULT | SFP_F_LOS);
++}
++
++static void sfp_fixup_potron(struct sfp *sfp)
++{
++ /*
++ * The TX_FAULT and LOS pins on this device are used for serial
++ * communication, so ignore them. Additionally, provide extra
++ * time for this device to fully start up.
++ */
++
++ sfp_fixup_long_startup(sfp);
++ sfp_fixup_ignore_hw(sfp, SFP_F_TX_FAULT | SFP_F_LOS);
+ }
+
+ static void sfp_fixup_rollball_cc(struct sfp *sfp)
+@@ -511,6 +528,8 @@ static const struct sfp_quirk sfp_quirks[] = {
+ SFP_QUIRK_F("Walsun", "HXSX-ATRC-1", sfp_fixup_fs_10gt),
+ SFP_QUIRK_F("Walsun", "HXSX-ATRI-1", sfp_fixup_fs_10gt),
+
++ SFP_QUIRK_F("YV", "SFP+ONU-XGSPON", sfp_fixup_potron),
++
+ // OEM SFP-GE-T is a 1000Base-T module with broken TX_FAULT indicator
+ SFP_QUIRK_F("OEM", "SFP-GE-T", sfp_fixup_ignore_tx_fault),
+
+--
+2.51.0
+
--- /dev/null
+From 69b99296cbed1582878ec5b0bf59a62debbe59c5 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sun, 7 Sep 2025 12:40:16 -0700
+Subject: scsi: ufs: mcq: Fix memory allocation checks for SQE and CQE
+
+From: Alok Tiwari <alok.a.tiwari@oracle.com>
+
+[ Upstream commit 5cb782ff3c62c837e4984b6ae9f5d9a423cd5088 ]
+
+Previous checks incorrectly tested the DMA addresses (dma_handle) for
+NULL. Since dma_alloc_coherent() returns the CPU (virtual) address, the
+NULL check should be performed on the *_base_addr pointer to correctly
+detect allocation failures.
+
+Update the checks to validate sqe_base_addr and cqe_base_addr instead of
+sqe_dma_addr and cqe_dma_addr.
+
+Fixes: 4682abfae2eb ("scsi: ufs: core: mcq: Allocate memory for MCQ mode")
+Signed-off-by: Alok Tiwari <alok.a.tiwari@oracle.com>
+Reviewed-by: Alim Akhtar <alim.akhtar@samsung.com>
+Reviewed-by: Manivannan Sadhasivam <mani@kernel.org>
+Reviewed-by: Peter Wang <peter.wang@mediatek.com>
+Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/ufs/core/ufs-mcq.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/ufs/core/ufs-mcq.c b/drivers/ufs/core/ufs-mcq.c
+index 420e943bb73a7..5e6197a6af5e2 100644
+--- a/drivers/ufs/core/ufs-mcq.c
++++ b/drivers/ufs/core/ufs-mcq.c
+@@ -243,7 +243,7 @@ int ufshcd_mcq_memory_alloc(struct ufs_hba *hba)
+ hwq->sqe_base_addr = dmam_alloc_coherent(hba->dev, utrdl_size,
+ &hwq->sqe_dma_addr,
+ GFP_KERNEL);
+- if (!hwq->sqe_dma_addr) {
++ if (!hwq->sqe_base_addr) {
+ dev_err(hba->dev, "SQE allocation failed\n");
+ return -ENOMEM;
+ }
+@@ -252,7 +252,7 @@ int ufshcd_mcq_memory_alloc(struct ufs_hba *hba)
+ hwq->cqe_base_addr = dmam_alloc_coherent(hba->dev, cqe_size,
+ &hwq->cqe_dma_addr,
+ GFP_KERNEL);
+- if (!hwq->cqe_dma_addr) {
++ if (!hwq->cqe_base_addr) {
+ dev_err(hba->dev, "CQE allocation failed\n");
+ return -ENOMEM;
+ }
+--
+2.51.0
+
--- /dev/null
+scsi-ufs-mcq-fix-memory-allocation-checks-for-sqe-an.patch
+firewire-core-fix-overlooked-update-of-subsystem-abi.patch
+alsa-usb-audio-fix-code-alignment-in-mixer_quirks.patch
+alsa-usb-audio-fix-block-comments-in-mixer_quirks.patch
+alsa-usb-audio-drop-unnecessary-parentheses-in-mixer.patch
+alsa-usb-audio-avoid-multiple-assignments-in-mixer_q.patch
+alsa-usb-audio-simplify-null-comparison-in-mixer_qui.patch
+alsa-usb-audio-remove-unneeded-wmb-in-mixer_quirks.patch
+alsa-usb-audio-add-mixer-quirk-for-sony-dualsense-ps.patch
+hid-multitouch-get-the-contact-id-from-hid_dg_transd.patch
+hid-multitouch-support-getting-the-tip-state-from-hi.patch
+hid-multitouch-take-cls-maxcontacts-into-account-for.patch
+hid-multitouch-specify-that-apple-touch-bar-is-direc.patch
+alsa-usb-audio-convert-comma-to-semicolon.patch
+alsa-hda-realtek-add-support-for-asus-nuc-using-cs35.patch
+alsa-usb-audio-fix-build-with-config_input-n.patch
+usb-core-add-0x-prefix-to-quirks-debug-output.patch
+net-fec-rename-struct-fec_devinfo-fec_imx6x_info-fec.patch
+net-sfp-add-quirk-for-potron-sfp-xgspon-onu-stick.patch
+mmc-sdhci-cadence-add-mobileye-eyeq-support.patch
+i2c-designware-add-quirk-for-intel-xe.patch
+alsa-usb-audio-add-dsd-support-for-comtrue-usb-audio.patch
+alsa-usb-audio-move-mixer_quirks-min_mute-into-commo.patch
+alsa-usb-audio-add-mute-tlv-for-playback-volumes-on-.patch
+net-sfp-add-quirk-for-flypro-copper-sfp-module.patch
+ib-mlx5-fix-obj_type-mismatch-for-srq-event-subscrip.patch
+hid-amd_sfh-add-sync-across-amd-sfh-work-functions.patch
--- /dev/null
+From 9751aca54e163844a18dea59c65cd787fb3e79c0 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 3 Jun 2025 15:10:45 +0800
+Subject: usb: core: Add 0x prefix to quirks debug output
+
+From: Jiayi Li <lijiayi@kylinos.cn>
+
+[ Upstream commit 47c428fce0b41b15ab321d8ede871f780ccd038f ]
+
+Use "0x%x" format for quirks debug print to clarify it's a hexadecimal
+value. Improves readability and consistency with other hex outputs.
+
+Signed-off-by: Jiayi Li <lijiayi@kylinos.cn>
+Link: https://lore.kernel.org/r/20250603071045.3243699-1-lijiayi@kylinos.cn
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/usb/core/quirks.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/usb/core/quirks.c b/drivers/usb/core/quirks.c
+index bfd97cad8aa4d..c0fd8ab3fe8fc 100644
+--- a/drivers/usb/core/quirks.c
++++ b/drivers/usb/core/quirks.c
+@@ -734,7 +734,7 @@ void usb_detect_quirks(struct usb_device *udev)
+ udev->quirks ^= usb_detect_dynamic_quirks(udev);
+
+ if (udev->quirks)
+- dev_dbg(&udev->dev, "USB quirks for this device: %x\n",
++ dev_dbg(&udev->dev, "USB quirks for this device: 0x%x\n",
+ udev->quirks);
+
+ #ifdef CONFIG_USB_DEFAULT_PERSIST
+--
+2.51.0
+
--- /dev/null
+From 89062c2302a3e327ce53cce4281360ce356dce91 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 12 Jun 2025 17:00:23 +0100
+Subject: ALSA: hda/realtek: Add support for ASUS NUC using CS35L41 HDA
+
+From: Stefan Binding <sbinding@opensource.cirrus.com>
+
+[ Upstream commit 84fc8896f0d9d1c075e0e08a416faedbd73907fa ]
+
+Add support for ASUS NUC14LNS.
+
+This NUC uses a single CS35L41 Amp in using Internal Boost with SPI.
+To support the Single Amp, a new quirk is required.
+
+Signed-off-by: Stefan Binding <sbinding@opensource.cirrus.com>
+Link: https://patch.msgid.link/20250612160029.848104-3-sbinding@opensource.cirrus.com
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/pci/hda/patch_realtek.c | 11 +++++++++++
+ 1 file changed, 11 insertions(+)
+
+diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c
+index 4819bd332f039..fa28e3e85861c 100644
+--- a/sound/pci/hda/patch_realtek.c
++++ b/sound/pci/hda/patch_realtek.c
+@@ -7298,6 +7298,11 @@ static void cs35l41_fixup_spi_two(struct hda_codec *codec, const struct hda_fixu
+ comp_generic_fixup(codec, action, "spi", "CSC3551", "-%s:00-cs35l41-hda.%d", 2);
+ }
+
++static void cs35l41_fixup_spi_one(struct hda_codec *codec, const struct hda_fixup *fix, int action)
++{
++ comp_generic_fixup(codec, action, "spi", "CSC3551", "-%s:00-cs35l41-hda.%d", 1);
++}
++
+ static void cs35l41_fixup_spi_four(struct hda_codec *codec, const struct hda_fixup *fix, int action)
+ {
+ comp_generic_fixup(codec, action, "spi", "CSC3551", "-%s:00-cs35l41-hda.%d", 4);
+@@ -7991,6 +7996,7 @@ enum {
+ ALC287_FIXUP_CS35L41_I2C_2,
+ ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED,
+ ALC287_FIXUP_CS35L41_I2C_4,
++ ALC245_FIXUP_CS35L41_SPI_1,
+ ALC245_FIXUP_CS35L41_SPI_2,
+ ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED,
+ ALC245_FIXUP_CS35L41_SPI_4,
+@@ -10120,6 +10126,10 @@ static const struct hda_fixup alc269_fixups[] = {
+ .type = HDA_FIXUP_FUNC,
+ .v.func = cs35l41_fixup_spi_two,
+ },
++ [ALC245_FIXUP_CS35L41_SPI_1] = {
++ .type = HDA_FIXUP_FUNC,
++ .v.func = cs35l41_fixup_spi_one,
++ },
+ [ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED] = {
+ .type = HDA_FIXUP_FUNC,
+ .v.func = cs35l41_fixup_spi_two,
+@@ -11099,6 +11109,7 @@ static const struct hda_quirk alc269_fixup_tbl[] = {
+ SND_PCI_QUIRK(0x1043, 0x8398, "ASUS P1005", ALC269_FIXUP_STEREO_DMIC),
+ SND_PCI_QUIRK(0x1043, 0x83ce, "ASUS P1005", ALC269_FIXUP_STEREO_DMIC),
+ SND_PCI_QUIRK(0x1043, 0x8516, "ASUS X101CH", ALC269_FIXUP_ASUS_X101),
++ SND_PCI_QUIRK(0x1043, 0x88f4, "ASUS NUC14LNS", ALC245_FIXUP_CS35L41_SPI_1),
+ SND_PCI_QUIRK(0x104d, 0x9073, "Sony VAIO", ALC275_FIXUP_SONY_VAIO_GPIO2),
+ SND_PCI_QUIRK(0x104d, 0x907b, "Sony VAIO", ALC275_FIXUP_SONY_HWEQ),
+ SND_PCI_QUIRK(0x104d, 0x9084, "Sony VAIO", ALC275_FIXUP_SONY_HWEQ),
+--
+2.51.0
+
--- /dev/null
+From decc4cd1c2823816111fed796d8a8aaf7bce62f1 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 31 Jul 2025 19:06:14 +0800
+Subject: ALSA: usb-audio: Add DSD support for Comtrue USB Audio device
+
+From: noble.yang <noble.yang@comtrue-inc.com>
+
+[ Upstream commit e9df1755485dd90a89656e8a21ec4d71c909fa30 ]
+
+The vendor Comtrue Inc. (0x2fc6) produces USB audio chipsets like
+the CT7601 which are capable of Native DSD playback.
+
+This patch adds QUIRK_FLAG_DSD_RAW for Comtrue (VID 0x2fc6), which enables
+native DSD playback (DSD_U32_LE) on their USB Audio device. This has been
+verified under Ubuntu 25.04 with JRiver.
+
+Signed-off-by: noble.yang <noble.yang@comtrue-inc.com>
+Link: https://patch.msgid.link/20250731110614.4070-1-noble228@gmail.com
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/quirks.c | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/sound/usb/quirks.c b/sound/usb/quirks.c
+index bd24f3a78ea9d..e75b0b1df6eb2 100644
+--- a/sound/usb/quirks.c
++++ b/sound/usb/quirks.c
+@@ -2408,6 +2408,8 @@ static const struct usb_audio_quirk_flags_table quirk_flags_table[] = {
+ QUIRK_FLAG_DSD_RAW),
+ VENDOR_FLG(0x2d87, /* Cayin device */
+ QUIRK_FLAG_DSD_RAW),
++ VENDOR_FLG(0x2fc6, /* Comture-inc devices */
++ QUIRK_FLAG_DSD_RAW),
+ VENDOR_FLG(0x3336, /* HEM devices */
+ QUIRK_FLAG_DSD_RAW),
+ VENDOR_FLG(0x3353, /* Khadas devices */
+--
+2.51.0
+
--- /dev/null
+From 3384e9d7e13293e641c4a2a343654f9ad33d15bb Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 26 May 2025 17:07:48 +0300
+Subject: ALSA: usb-audio: Add mixer quirk for Sony DualSense PS5
+
+From: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+
+[ Upstream commit 79d561c4ec0497669f19a9550cfb74812f60938b ]
+
+The Sony DualSense wireless controller (PS5) features an internal mono
+speaker, but it also provides a 3.5mm jack socket for headphone output
+and headset microphone input.
+
+Since this is a UAC1 device, it doesn't advertise any jack detection
+capability. However, the controller is able to report HP & MIC insert
+events via HID, i.e. through a dedicated input device managed by the
+hid-playstation driver.
+
+Add a quirk to create the jack controls for headphone and headset mic,
+respectively, and setup an input handler for each of them in order to
+intercept the related hotplug events.
+
+Signed-off-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Link: https://patch.msgid.link/20250526-dualsense-alsa-jack-v1-9-1a821463b632@collabora.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/mixer_quirks.c | 263 +++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 263 insertions(+)
+
+diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
+index 5507340a7723e..28842e49700d8 100644
+--- a/sound/usb/mixer_quirks.c
++++ b/sound/usb/mixer_quirks.c
+@@ -17,6 +17,7 @@
+ #include <linux/bitfield.h>
+ #include <linux/hid.h>
+ #include <linux/init.h>
++#include <linux/input.h>
+ #include <linux/math64.h>
+ #include <linux/slab.h>
+ #include <linux/usb.h>
+@@ -531,6 +532,263 @@ static int snd_emu0204_controls_create(struct usb_mixer_interface *mixer)
+ &snd_emu0204_control, NULL);
+ }
+
++/*
++ * Sony DualSense controller (PS5) jack detection
++ *
++ * Since this is an UAC 1 device, it doesn't support jack detection.
++ * However, the controller hid-playstation driver reports HP & MIC
++ * insert events through a dedicated input device.
++ */
++
++#define SND_DUALSENSE_JACK_OUT_TERM_ID 3
++#define SND_DUALSENSE_JACK_IN_TERM_ID 4
++
++struct dualsense_mixer_elem_info {
++ struct usb_mixer_elem_info info;
++ struct input_handler ih;
++ struct input_device_id id_table[2];
++ bool connected;
++};
++
++static void snd_dualsense_ih_event(struct input_handle *handle,
++ unsigned int type, unsigned int code,
++ int value)
++{
++ struct dualsense_mixer_elem_info *mei;
++ struct usb_mixer_elem_list *me;
++
++ if (type != EV_SW)
++ return;
++
++ mei = container_of(handle->handler, struct dualsense_mixer_elem_info, ih);
++ me = &mei->info.head;
++
++ if ((me->id == SND_DUALSENSE_JACK_OUT_TERM_ID && code == SW_HEADPHONE_INSERT) ||
++ (me->id == SND_DUALSENSE_JACK_IN_TERM_ID && code == SW_MICROPHONE_INSERT)) {
++ mei->connected = !!value;
++ snd_ctl_notify(me->mixer->chip->card, SNDRV_CTL_EVENT_MASK_VALUE,
++ &me->kctl->id);
++ }
++}
++
++static bool snd_dualsense_ih_match(struct input_handler *handler,
++ struct input_dev *dev)
++{
++ struct dualsense_mixer_elem_info *mei;
++ struct usb_device *snd_dev;
++ char *input_dev_path, *usb_dev_path;
++ size_t usb_dev_path_len;
++ bool match = false;
++
++ mei = container_of(handler, struct dualsense_mixer_elem_info, ih);
++ snd_dev = mei->info.head.mixer->chip->dev;
++
++ input_dev_path = kobject_get_path(&dev->dev.kobj, GFP_KERNEL);
++ if (!input_dev_path) {
++ dev_warn(&snd_dev->dev, "Failed to get input dev path\n");
++ return false;
++ }
++
++ usb_dev_path = kobject_get_path(&snd_dev->dev.kobj, GFP_KERNEL);
++ if (!usb_dev_path) {
++ dev_warn(&snd_dev->dev, "Failed to get USB dev path\n");
++ goto free_paths;
++ }
++
++ /*
++ * Ensure the VID:PID matched input device supposedly owned by the
++ * hid-playstation driver belongs to the actual hardware handled by
++ * the current USB audio device, which implies input_dev_path being
++ * a subpath of usb_dev_path.
++ *
++ * This verification is necessary when there is more than one identical
++ * controller attached to the host system.
++ */
++ usb_dev_path_len = strlen(usb_dev_path);
++ if (usb_dev_path_len >= strlen(input_dev_path))
++ goto free_paths;
++
++ usb_dev_path[usb_dev_path_len] = '/';
++ match = !memcmp(input_dev_path, usb_dev_path, usb_dev_path_len + 1);
++
++free_paths:
++ kfree(input_dev_path);
++ kfree(usb_dev_path);
++
++ return match;
++}
++
++static int snd_dualsense_ih_connect(struct input_handler *handler,
++ struct input_dev *dev,
++ const struct input_device_id *id)
++{
++ struct input_handle *handle;
++ int err;
++
++ handle = kzalloc(sizeof(*handle), GFP_KERNEL);
++ if (!handle)
++ return -ENOMEM;
++
++ handle->dev = dev;
++ handle->handler = handler;
++ handle->name = handler->name;
++
++ err = input_register_handle(handle);
++ if (err)
++ goto err_free;
++
++ err = input_open_device(handle);
++ if (err)
++ goto err_unregister;
++
++ return 0;
++
++err_unregister:
++ input_unregister_handle(handle);
++err_free:
++ kfree(handle);
++ return err;
++}
++
++static void snd_dualsense_ih_disconnect(struct input_handle *handle)
++{
++ input_close_device(handle);
++ input_unregister_handle(handle);
++ kfree(handle);
++}
++
++static void snd_dualsense_ih_start(struct input_handle *handle)
++{
++ struct dualsense_mixer_elem_info *mei;
++ struct usb_mixer_elem_list *me;
++ int status = -1;
++
++ mei = container_of(handle->handler, struct dualsense_mixer_elem_info, ih);
++ me = &mei->info.head;
++
++ if (me->id == SND_DUALSENSE_JACK_OUT_TERM_ID &&
++ test_bit(SW_HEADPHONE_INSERT, handle->dev->swbit))
++ status = test_bit(SW_HEADPHONE_INSERT, handle->dev->sw);
++ else if (me->id == SND_DUALSENSE_JACK_IN_TERM_ID &&
++ test_bit(SW_MICROPHONE_INSERT, handle->dev->swbit))
++ status = test_bit(SW_MICROPHONE_INSERT, handle->dev->sw);
++
++ if (status >= 0) {
++ mei->connected = !!status;
++ snd_ctl_notify(me->mixer->chip->card, SNDRV_CTL_EVENT_MASK_VALUE,
++ &me->kctl->id);
++ }
++}
++
++static int snd_dualsense_jack_get(struct snd_kcontrol *kctl,
++ struct snd_ctl_elem_value *ucontrol)
++{
++ struct dualsense_mixer_elem_info *mei = snd_kcontrol_chip(kctl);
++
++ ucontrol->value.integer.value[0] = mei->connected;
++
++ return 0;
++}
++
++static const struct snd_kcontrol_new snd_dualsense_jack_control = {
++ .iface = SNDRV_CTL_ELEM_IFACE_CARD,
++ .access = SNDRV_CTL_ELEM_ACCESS_READ,
++ .info = snd_ctl_boolean_mono_info,
++ .get = snd_dualsense_jack_get,
++};
++
++static int snd_dualsense_resume_jack(struct usb_mixer_elem_list *list)
++{
++ snd_ctl_notify(list->mixer->chip->card, SNDRV_CTL_EVENT_MASK_VALUE,
++ &list->kctl->id);
++ return 0;
++}
++
++static void snd_dualsense_mixer_elem_free(struct snd_kcontrol *kctl)
++{
++ struct dualsense_mixer_elem_info *mei = snd_kcontrol_chip(kctl);
++
++ if (mei->ih.event)
++ input_unregister_handler(&mei->ih);
++
++ snd_usb_mixer_elem_free(kctl);
++}
++
++static int snd_dualsense_jack_create(struct usb_mixer_interface *mixer,
++ const char *name, bool is_output)
++{
++ struct dualsense_mixer_elem_info *mei;
++ struct input_device_id *idev_id;
++ struct snd_kcontrol *kctl;
++ int err;
++
++ mei = kzalloc(sizeof(*mei), GFP_KERNEL);
++ if (!mei)
++ return -ENOMEM;
++
++ snd_usb_mixer_elem_init_std(&mei->info.head, mixer,
++ is_output ? SND_DUALSENSE_JACK_OUT_TERM_ID :
++ SND_DUALSENSE_JACK_IN_TERM_ID);
++
++ mei->info.head.resume = snd_dualsense_resume_jack;
++ mei->info.val_type = USB_MIXER_BOOLEAN;
++ mei->info.channels = 1;
++ mei->info.min = 0;
++ mei->info.max = 1;
++
++ kctl = snd_ctl_new1(&snd_dualsense_jack_control, mei);
++ if (!kctl) {
++ kfree(mei);
++ return -ENOMEM;
++ }
++
++ strscpy(kctl->id.name, name, sizeof(kctl->id.name));
++ kctl->private_free = snd_dualsense_mixer_elem_free;
++
++ err = snd_usb_mixer_add_control(&mei->info.head, kctl);
++ if (err)
++ return err;
++
++ idev_id = &mei->id_table[0];
++ idev_id->flags = INPUT_DEVICE_ID_MATCH_VENDOR | INPUT_DEVICE_ID_MATCH_PRODUCT |
++ INPUT_DEVICE_ID_MATCH_EVBIT | INPUT_DEVICE_ID_MATCH_SWBIT;
++ idev_id->vendor = USB_ID_VENDOR(mixer->chip->usb_id);
++ idev_id->product = USB_ID_PRODUCT(mixer->chip->usb_id);
++ idev_id->evbit[BIT_WORD(EV_SW)] = BIT_MASK(EV_SW);
++ if (is_output)
++ idev_id->swbit[BIT_WORD(SW_HEADPHONE_INSERT)] = BIT_MASK(SW_HEADPHONE_INSERT);
++ else
++ idev_id->swbit[BIT_WORD(SW_MICROPHONE_INSERT)] = BIT_MASK(SW_MICROPHONE_INSERT);
++
++ mei->ih.event = snd_dualsense_ih_event;
++ mei->ih.match = snd_dualsense_ih_match;
++ mei->ih.connect = snd_dualsense_ih_connect,
++ mei->ih.disconnect = snd_dualsense_ih_disconnect,
++ mei->ih.start = snd_dualsense_ih_start,
++ mei->ih.name = name;
++ mei->ih.id_table = mei->id_table;
++
++ err = input_register_handler(&mei->ih);
++ if (err) {
++ dev_warn(&mixer->chip->dev->dev,
++ "Could not register input handler: %d\n", err);
++ mei->ih.event = NULL;
++ }
++
++ return 0;
++}
++
++static int snd_dualsense_controls_create(struct usb_mixer_interface *mixer)
++{
++ int err;
++
++ err = snd_dualsense_jack_create(mixer, "Headphone Jack", true);
++ if (err < 0)
++ return err;
++
++ return snd_dualsense_jack_create(mixer, "Headset Mic Jack", false);
++}
++
+ /* ASUS Xonar U1 / U3 controls */
+
+ static int snd_xonar_u1_switch_get(struct snd_kcontrol *kcontrol,
+@@ -4073,6 +4331,11 @@ int snd_usb_mixer_apply_create_quirk(struct usb_mixer_interface *mixer)
+ err = snd_emu0204_controls_create(mixer);
+ break;
+
++ case USB_ID(0x054c, 0x0ce6): /* Sony DualSense controller (PS5) */
++ case USB_ID(0x054c, 0x0df2): /* Sony DualSense Edge controller (PS5) */
++ err = snd_dualsense_controls_create(mixer);
++ break;
++
+ case USB_ID(0x0763, 0x2030): /* M-Audio Fast Track C400 */
+ case USB_ID(0x0763, 0x2031): /* M-Audio Fast Track C400 */
+ err = snd_c400_create_mixer(mixer);
+--
+2.51.0
+
--- /dev/null
+From e025cc0e24b72a15c0906f8f8c16843272c4a352 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 29 Aug 2025 14:40:48 +0800
+Subject: ALSA: usb-audio: Add mute TLV for playback volumes on more devices
+
+From: qaqland <anguoli@uniontech.com>
+
+[ Upstream commit 2cbe4ac193ed7172cfd825c0cc46ce4a41be4ba1 ]
+
+Applying the quirk of that, the lowest Playback mixer volume setting
+mutes the audio output, on more devices.
+
+Suggested-by: Cryolitia PukNgae <cryolitia@uniontech.com>
+Signed-off-by: qaqland <anguoli@uniontech.com>
+Link: https://patch.msgid.link/20250829-sound_quirk-v1-1-745529b44440@uniontech.com
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/quirks.c | 10 ++++++++++
+ 1 file changed, 10 insertions(+)
+
+diff --git a/sound/usb/quirks.c b/sound/usb/quirks.c
+index 8bc1e247cdf1a..766db7d00cbc9 100644
+--- a/sound/usb/quirks.c
++++ b/sound/usb/quirks.c
+@@ -2199,6 +2199,8 @@ static const struct usb_audio_quirk_flags_table quirk_flags_table[] = {
+ QUIRK_FLAG_SET_IFACE_FIRST),
+ DEVICE_FLG(0x0556, 0x0014, /* Phoenix Audio TMX320VC */
+ QUIRK_FLAG_GET_SAMPLE_RATE),
++ DEVICE_FLG(0x0572, 0x1b08, /* Conexant Systems (Rockwell), Inc. */
++ QUIRK_FLAG_MIXER_MIN_MUTE),
+ DEVICE_FLG(0x0572, 0x1b09, /* Conexant Systems (Rockwell), Inc. */
+ QUIRK_FLAG_MIXER_MIN_MUTE),
+ DEVICE_FLG(0x05a3, 0x9420, /* ELP HD USB Camera */
+@@ -2243,6 +2245,8 @@ static const struct usb_audio_quirk_flags_table quirk_flags_table[] = {
+ QUIRK_FLAG_CTL_MSG_DELAY_1M),
+ DEVICE_FLG(0x0b0e, 0x0349, /* Jabra 550a */
+ QUIRK_FLAG_CTL_MSG_DELAY_1M),
++ DEVICE_FLG(0x0bda, 0x498a, /* Realtek Semiconductor Corp. */
++ QUIRK_FLAG_MIXER_MIN_MUTE),
+ DEVICE_FLG(0x0c45, 0x6340, /* Sonix HD USB Camera */
+ QUIRK_FLAG_GET_SAMPLE_RATE),
+ DEVICE_FLG(0x0c45, 0x636b, /* Microdia JP001 USB Camera */
+@@ -2259,6 +2263,8 @@ static const struct usb_audio_quirk_flags_table quirk_flags_table[] = {
+ QUIRK_FLAG_SHARE_MEDIA_DEVICE | QUIRK_FLAG_ALIGN_TRANSFER),
+ DEVICE_FLG(0x1101, 0x0003, /* Audioengine D1 */
+ QUIRK_FLAG_GET_SAMPLE_RATE),
++ DEVICE_FLG(0x12d1, 0x3a07, /* Huawei Technologies Co., Ltd. */
++ QUIRK_FLAG_MIXER_MIN_MUTE),
+ DEVICE_FLG(0x1224, 0x2a25, /* Jieli Technology USB PHY 2.0 */
+ QUIRK_FLAG_GET_SAMPLE_RATE | QUIRK_FLAG_MIC_RES_16),
+ DEVICE_FLG(0x1395, 0x740a, /* Sennheiser DECT */
+@@ -2349,6 +2355,8 @@ static const struct usb_audio_quirk_flags_table quirk_flags_table[] = {
+ QUIRK_FLAG_IGNORE_CTL_ERROR),
+ DEVICE_FLG(0x2912, 0x30c8, /* Audioengine D1 */
+ QUIRK_FLAG_GET_SAMPLE_RATE),
++ DEVICE_FLG(0x2a70, 0x1881, /* OnePlus Technology (Shenzhen) Co., Ltd. BE02T */
++ QUIRK_FLAG_MIXER_MIN_MUTE),
+ DEVICE_FLG(0x2b53, 0x0023, /* Fiero SC-01 (firmware v1.0.0 @ 48 kHz) */
+ QUIRK_FLAG_GENERIC_IMPLICIT_FB),
+ DEVICE_FLG(0x2b53, 0x0024, /* Fiero SC-01 (firmware v1.0.0 @ 96 kHz) */
+@@ -2365,6 +2373,8 @@ static const struct usb_audio_quirk_flags_table quirk_flags_table[] = {
+ QUIRK_FLAG_CTL_MSG_DELAY_1M),
+ DEVICE_FLG(0x30be, 0x0101, /* Schiit Hel */
+ QUIRK_FLAG_IGNORE_CTL_ERROR),
++ DEVICE_FLG(0x339b, 0x3a07, /* Synaptics HONOR USB-C HEADSET */
++ QUIRK_FLAG_MIXER_MIN_MUTE),
+ DEVICE_FLG(0x413c, 0xa506, /* Dell AE515 sound bar */
+ QUIRK_FLAG_GET_SAMPLE_RATE),
+ DEVICE_FLG(0x534d, 0x0021, /* MacroSilicon MS2100/MS2106 */
+--
+2.51.0
+
--- /dev/null
+From 1eb785168edc6468059db12223f2e77c9dbc5981 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 26 May 2025 17:07:45 +0300
+Subject: ALSA: usb-audio: Avoid multiple assignments in mixer_quirks
+
+From: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+
+[ Upstream commit 03ddd3bdb94df3edb1f2408b57cfb00b3d92a208 ]
+
+Handle report from checkpatch.pl:
+
+ CHECK: multiple assignments should be avoided
+
+Signed-off-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Link: https://patch.msgid.link/20250526-dualsense-alsa-jack-v1-6-1a821463b632@collabora.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/mixer_quirks.c | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
+index eb245272f123a..741a70d0816cc 100644
+--- a/sound/usb/mixer_quirks.c
++++ b/sound/usb/mixer_quirks.c
+@@ -1739,7 +1739,8 @@ static int snd_microii_spdif_default_put(struct snd_kcontrol *kcontrol,
+ unsigned int pval, pval_old;
+ int err;
+
+- pval = pval_old = kcontrol->private_value;
++ pval = kcontrol->private_value;
++ pval_old = pval;
+ pval &= 0xfffff0f0;
+ pval |= (ucontrol->value.iec958.status[1] & 0x0f) << 8;
+ pval |= (ucontrol->value.iec958.status[0] & 0x0f);
+--
+2.51.0
+
--- /dev/null
+From c4d797fdb36594ea83b93a261f245b8942819b02 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 12 Jun 2025 14:02:28 +0800
+Subject: ALSA: usb-audio: Convert comma to semicolon
+
+From: Chen Ni <nichen@iscas.ac.cn>
+
+[ Upstream commit 9ca30a1b007d5fefb5752428f852a2d8d7219c1c ]
+
+Replace comma between expressions with semicolons.
+
+Using a ',' in place of a ';' can have unintended side effects.
+Although that is not the case here, it is seems best to use ';'
+unless ',' is intended.
+
+Found by inspection.
+No functional change intended.
+Compile tested only.
+
+Fixes: 79d561c4ec04 ("ALSA: usb-audio: Add mixer quirk for Sony DualSense PS5")
+Signed-off-by: Chen Ni <nichen@iscas.ac.cn>
+Reviewed-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+Link: https://patch.msgid.link/20250612060228.1518028-1-nichen@iscas.ac.cn
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/mixer_quirks.c | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
+index 28842e49700d8..8cb98b5d31124 100644
+--- a/sound/usb/mixer_quirks.c
++++ b/sound/usb/mixer_quirks.c
+@@ -762,9 +762,9 @@ static int snd_dualsense_jack_create(struct usb_mixer_interface *mixer,
+
+ mei->ih.event = snd_dualsense_ih_event;
+ mei->ih.match = snd_dualsense_ih_match;
+- mei->ih.connect = snd_dualsense_ih_connect,
+- mei->ih.disconnect = snd_dualsense_ih_disconnect,
+- mei->ih.start = snd_dualsense_ih_start,
++ mei->ih.connect = snd_dualsense_ih_connect;
++ mei->ih.disconnect = snd_dualsense_ih_disconnect;
++ mei->ih.start = snd_dualsense_ih_start;
+ mei->ih.name = name;
+ mei->ih.id_table = mei->id_table;
+
+--
+2.51.0
+
--- /dev/null
+From 8712eff9fbf533b4d2e1f3df04d4b06fcd6064cc Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 26 May 2025 17:07:44 +0300
+Subject: ALSA: usb-audio: Drop unnecessary parentheses in mixer_quirks
+
+From: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+
+[ Upstream commit c0495cef8b43ad61efbd4019e3573742e0e63c67 ]
+
+Fix multiple 'CHECK: Unnecessary parentheses around ...' reports from
+checkpatch.pl.
+
+Signed-off-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Link: https://patch.msgid.link/20250526-dualsense-alsa-jack-v1-5-1a821463b632@collabora.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/mixer_quirks.c | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
+index c4d79a9ce2baa..eb245272f123a 100644
+--- a/sound/usb/mixer_quirks.c
++++ b/sound/usb/mixer_quirks.c
+@@ -380,10 +380,10 @@ static int snd_audigy2nx_controls_create(struct usb_mixer_interface *mixer)
+ struct snd_kcontrol_new knew;
+
+ /* USB X-Fi S51 doesn't have a CMSS LED */
+- if ((mixer->chip->usb_id == USB_ID(0x041e, 0x3042)) && i == 0)
++ if (mixer->chip->usb_id == USB_ID(0x041e, 0x3042) && i == 0)
+ continue;
+ /* USB X-Fi S51 Pro doesn't have one either */
+- if ((mixer->chip->usb_id == USB_ID(0x041e, 0x30df)) && i == 0)
++ if (mixer->chip->usb_id == USB_ID(0x041e, 0x30df) && i == 0)
+ continue;
+ if (i > 1 && /* Live24ext has 2 LEDs only */
+ (mixer->chip->usb_id == USB_ID(0x041e, 0x3040) ||
+@@ -3955,7 +3955,7 @@ static int snd_djm_controls_update(struct usb_mixer_interface *mixer,
+ int err;
+ const struct snd_djm_device *device = &snd_djm_devices[device_idx];
+
+- if ((group >= device->ncontrols) || value >= device->controls[group].noptions)
++ if (group >= device->ncontrols || value >= device->controls[group].noptions)
+ return -EINVAL;
+
+ err = snd_usb_lock_shutdown(mixer->chip);
+--
+2.51.0
+
--- /dev/null
+From c5e37cf0f4779f6245f07b6b10764c6ee3345cf3 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 26 May 2025 17:07:43 +0300
+Subject: ALSA: usb-audio: Fix block comments in mixer_quirks
+
+From: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+
+[ Upstream commit 231225d8a20f8668b4fd6601d54a2fac0e0ab7a5 ]
+
+Address a couple of comment formatting issues indicated by
+checkpatch.pl:
+
+ WARNING: Block comments use a trailing */ on a separate line
+
+Signed-off-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Link: https://patch.msgid.link/20250526-dualsense-alsa-jack-v1-4-1a821463b632@collabora.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/mixer_quirks.c | 6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
+
+diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
+index 0aad92cb33276..c4d79a9ce2baa 100644
+--- a/sound/usb/mixer_quirks.c
++++ b/sound/usb/mixer_quirks.c
+@@ -78,7 +78,8 @@ static int snd_create_std_mono_ctl_offset(struct usb_mixer_interface *mixer,
+ cval->idx_off = idx_off;
+
+ /* get_min_max() is called only for integer volumes later,
+- * so provide a short-cut for booleans */
++ * so provide a short-cut for booleans
++ */
+ cval->min = 0;
+ cval->max = 1;
+ cval->res = 0;
+@@ -4255,7 +4256,8 @@ static void snd_dragonfly_quirk_db_scale(struct usb_mixer_interface *mixer,
+ struct snd_kcontrol *kctl)
+ {
+ /* Approximation using 10 ranges based on output measurement on hw v1.2.
+- * This seems close to the cubic mapping e.g. alsamixer uses. */
++ * This seems close to the cubic mapping e.g. alsamixer uses.
++ */
+ static const DECLARE_TLV_DB_RANGE(scale,
+ 0, 1, TLV_DB_MINMAX_ITEM(-5300, -4970),
+ 2, 5, TLV_DB_MINMAX_ITEM(-4710, -4160),
+--
+2.51.0
+
--- /dev/null
+From a1909621ea9fd0a6e71f44a5e40331c15a63e450 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 13 Jun 2025 10:15:30 +0200
+Subject: ALSA: usb-audio: Fix build with CONFIG_INPUT=n
+
+From: Takashi Iwai <tiwai@suse.de>
+
+[ Upstream commit d0630a0b80c08530857146e3bf183a7d6b743847 ]
+
+The recent addition of DualSense mixer quirk relies on the input
+device handle, and the build can fail if CONFIG_INPUT isn't set.
+Put (rather ugly) workarounds to wrap with IS_REACHABLE() for avoiding
+the build error.
+
+Fixes: 79d561c4ec04 ("ALSA: usb-audio: Add mixer quirk for Sony DualSense PS5")
+Reported-by: kernel test robot <lkp@intel.com>
+Closes: https://lore.kernel.org/oe-kbuild-all/202506130733.gnPKw2l3-lkp@intel.com/
+Reviewed-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+Link: https://patch.msgid.link/20250613081543.7404-1-tiwai@suse.de
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/mixer_quirks.c | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
+index 8cb98b5d31124..6b47b3145d2cf 100644
+--- a/sound/usb/mixer_quirks.c
++++ b/sound/usb/mixer_quirks.c
+@@ -532,6 +532,7 @@ static int snd_emu0204_controls_create(struct usb_mixer_interface *mixer)
+ &snd_emu0204_control, NULL);
+ }
+
++#if IS_REACHABLE(CONFIG_INPUT)
+ /*
+ * Sony DualSense controller (PS5) jack detection
+ *
+@@ -788,6 +789,7 @@ static int snd_dualsense_controls_create(struct usb_mixer_interface *mixer)
+
+ return snd_dualsense_jack_create(mixer, "Headset Mic Jack", false);
+ }
++#endif /* IS_REACHABLE(CONFIG_INPUT) */
+
+ /* ASUS Xonar U1 / U3 controls */
+
+@@ -4331,10 +4333,12 @@ int snd_usb_mixer_apply_create_quirk(struct usb_mixer_interface *mixer)
+ err = snd_emu0204_controls_create(mixer);
+ break;
+
++#if IS_REACHABLE(CONFIG_INPUT)
+ case USB_ID(0x054c, 0x0ce6): /* Sony DualSense controller (PS5) */
+ case USB_ID(0x054c, 0x0df2): /* Sony DualSense Edge controller (PS5) */
+ err = snd_dualsense_controls_create(mixer);
+ break;
++#endif /* IS_REACHABLE(CONFIG_INPUT) */
+
+ case USB_ID(0x0763, 0x2030): /* M-Audio Fast Track C400 */
+ case USB_ID(0x0763, 0x2031): /* M-Audio Fast Track C400 */
+--
+2.51.0
+
--- /dev/null
+From b60d27fddea61ff6276b83f4f243e9c13ccb793c Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 26 May 2025 17:07:40 +0300
+Subject: ALSA: usb-audio: Fix code alignment in mixer_quirks
+
+From: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+
+[ Upstream commit bca638aa737d13749a871d1a0d2ed276501ffc54 ]
+
+Format code to fix all alignment issues reported by checkpatch.pl:
+
+ CHECK: Alignment should match open parenthesis
+
+Signed-off-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Link: https://patch.msgid.link/20250526-dualsense-alsa-jack-v1-1-1a821463b632@collabora.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/mixer_quirks.c | 250 ++++++++++++++++++++-------------------
+ 1 file changed, 127 insertions(+), 123 deletions(-)
+
+diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
+index 9530c59b3cf4c..7f1e7a5fe8f0a 100644
+--- a/sound/usb/mixer_quirks.c
++++ b/sound/usb/mixer_quirks.c
+@@ -55,13 +55,13 @@ struct std_mono_table {
+ * version, we keep it mono for simplicity.
+ */
+ static int snd_create_std_mono_ctl_offset(struct usb_mixer_interface *mixer,
+- unsigned int unitid,
+- unsigned int control,
+- unsigned int cmask,
+- int val_type,
+- unsigned int idx_off,
+- const char *name,
+- snd_kcontrol_tlv_rw_t *tlv_callback)
++ unsigned int unitid,
++ unsigned int control,
++ unsigned int cmask,
++ int val_type,
++ unsigned int idx_off,
++ const char *name,
++ snd_kcontrol_tlv_rw_t *tlv_callback)
+ {
+ struct usb_mixer_elem_info *cval;
+ struct snd_kcontrol *kctl;
+@@ -108,15 +108,16 @@ static int snd_create_std_mono_ctl_offset(struct usb_mixer_interface *mixer,
+ }
+
+ static int snd_create_std_mono_ctl(struct usb_mixer_interface *mixer,
+- unsigned int unitid,
+- unsigned int control,
+- unsigned int cmask,
+- int val_type,
+- const char *name,
+- snd_kcontrol_tlv_rw_t *tlv_callback)
++ unsigned int unitid,
++ unsigned int control,
++ unsigned int cmask,
++ int val_type,
++ const char *name,
++ snd_kcontrol_tlv_rw_t *tlv_callback)
+ {
+ return snd_create_std_mono_ctl_offset(mixer, unitid, control, cmask,
+- val_type, 0 /* Offset */, name, tlv_callback);
++ val_type, 0 /* Offset */,
++ name, tlv_callback);
+ }
+
+ /*
+@@ -129,7 +130,8 @@ static int snd_create_std_mono_table(struct usb_mixer_interface *mixer,
+
+ while (t->name != NULL) {
+ err = snd_create_std_mono_ctl(mixer, t->unitid, t->control,
+- t->cmask, t->val_type, t->name, t->tlv_callback);
++ t->cmask, t->val_type, t->name,
++ t->tlv_callback);
+ if (err < 0)
+ return err;
+ t++;
+@@ -214,7 +216,7 @@ static void snd_usb_soundblaster_remote_complete(struct urb *urb)
+ }
+
+ static long snd_usb_sbrc_hwdep_read(struct snd_hwdep *hw, char __user *buf,
+- long count, loff_t *offset)
++ long count, loff_t *offset)
+ {
+ struct usb_mixer_interface *mixer = hw->private_data;
+ int err;
+@@ -234,7 +236,7 @@ static long snd_usb_sbrc_hwdep_read(struct snd_hwdep *hw, char __user *buf,
+ }
+
+ static __poll_t snd_usb_sbrc_hwdep_poll(struct snd_hwdep *hw, struct file *file,
+- poll_table *wait)
++ poll_table *wait)
+ {
+ struct usb_mixer_interface *mixer = hw->private_data;
+
+@@ -310,20 +312,20 @@ static int snd_audigy2nx_led_update(struct usb_mixer_interface *mixer,
+
+ if (chip->usb_id == USB_ID(0x041e, 0x3042))
+ err = snd_usb_ctl_msg(chip->dev,
+- usb_sndctrlpipe(chip->dev, 0), 0x24,
+- USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_OTHER,
+- !value, 0, NULL, 0);
++ usb_sndctrlpipe(chip->dev, 0), 0x24,
++ USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_OTHER,
++ !value, 0, NULL, 0);
+ /* USB X-Fi S51 Pro */
+ if (chip->usb_id == USB_ID(0x041e, 0x30df))
+ err = snd_usb_ctl_msg(chip->dev,
+- usb_sndctrlpipe(chip->dev, 0), 0x24,
+- USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_OTHER,
+- !value, 0, NULL, 0);
++ usb_sndctrlpipe(chip->dev, 0), 0x24,
++ USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_OTHER,
++ !value, 0, NULL, 0);
+ else
+ err = snd_usb_ctl_msg(chip->dev,
+- usb_sndctrlpipe(chip->dev, 0), 0x24,
+- USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_OTHER,
+- value, index + 2, NULL, 0);
++ usb_sndctrlpipe(chip->dev, 0), 0x24,
++ USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_OTHER,
++ value, index + 2, NULL, 0);
+ snd_usb_unlock_shutdown(chip);
+ return err;
+ }
+@@ -481,9 +483,9 @@ static int snd_emu0204_ch_switch_update(struct usb_mixer_interface *mixer,
+ buf[0] = 0x01;
+ buf[1] = value ? 0x02 : 0x01;
+ err = snd_usb_ctl_msg(chip->dev,
+- usb_sndctrlpipe(chip->dev, 0), UAC_SET_CUR,
+- USB_RECIP_INTERFACE | USB_TYPE_CLASS | USB_DIR_OUT,
+- 0x0400, 0x0e00, buf, 2);
++ usb_sndctrlpipe(chip->dev, 0), UAC_SET_CUR,
++ USB_RECIP_INTERFACE | USB_TYPE_CLASS | USB_DIR_OUT,
++ 0x0400, 0x0e00, buf, 2);
+ snd_usb_unlock_shutdown(chip);
+ return err;
+ }
+@@ -1021,7 +1023,7 @@ static int snd_nativeinstruments_create_mixer(struct usb_mixer_interface *mixer,
+ /* M-Audio FastTrack Ultra quirks */
+ /* FTU Effect switch (also used by C400/C600) */
+ static int snd_ftu_eff_switch_info(struct snd_kcontrol *kcontrol,
+- struct snd_ctl_elem_info *uinfo)
++ struct snd_ctl_elem_info *uinfo)
+ {
+ static const char *const texts[8] = {
+ "Room 1", "Room 2", "Room 3", "Hall 1",
+@@ -1055,7 +1057,7 @@ static int snd_ftu_eff_switch_init(struct usb_mixer_interface *mixer,
+ }
+
+ static int snd_ftu_eff_switch_get(struct snd_kcontrol *kctl,
+- struct snd_ctl_elem_value *ucontrol)
++ struct snd_ctl_elem_value *ucontrol)
+ {
+ ucontrol->value.enumerated.item[0] = kctl->private_value >> 24;
+ return 0;
+@@ -1086,7 +1088,7 @@ static int snd_ftu_eff_switch_update(struct usb_mixer_elem_list *list)
+ }
+
+ static int snd_ftu_eff_switch_put(struct snd_kcontrol *kctl,
+- struct snd_ctl_elem_value *ucontrol)
++ struct snd_ctl_elem_value *ucontrol)
+ {
+ struct usb_mixer_elem_list *list = snd_kcontrol_chip(kctl);
+ unsigned int pval = list->kctl->private_value;
+@@ -1104,7 +1106,7 @@ static int snd_ftu_eff_switch_put(struct snd_kcontrol *kctl,
+ }
+
+ static int snd_ftu_create_effect_switch(struct usb_mixer_interface *mixer,
+- int validx, int bUnitID)
++ int validx, int bUnitID)
+ {
+ static struct snd_kcontrol_new template = {
+ .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
+@@ -1143,22 +1145,22 @@ static int snd_ftu_create_volume_ctls(struct usb_mixer_interface *mixer)
+ for (in = 0; in < 8; in++) {
+ cmask = BIT(in);
+ snprintf(name, sizeof(name),
+- "AIn%d - Out%d Capture Volume",
+- in + 1, out + 1);
++ "AIn%d - Out%d Capture Volume",
++ in + 1, out + 1);
+ err = snd_create_std_mono_ctl(mixer, id, control,
+- cmask, val_type, name,
+- &snd_usb_mixer_vol_tlv);
++ cmask, val_type, name,
++ &snd_usb_mixer_vol_tlv);
+ if (err < 0)
+ return err;
+ }
+ for (in = 8; in < 16; in++) {
+ cmask = BIT(in);
+ snprintf(name, sizeof(name),
+- "DIn%d - Out%d Playback Volume",
+- in - 7, out + 1);
++ "DIn%d - Out%d Playback Volume",
++ in - 7, out + 1);
+ err = snd_create_std_mono_ctl(mixer, id, control,
+- cmask, val_type, name,
+- &snd_usb_mixer_vol_tlv);
++ cmask, val_type, name,
++ &snd_usb_mixer_vol_tlv);
+ if (err < 0)
+ return err;
+ }
+@@ -1219,10 +1221,10 @@ static int snd_ftu_create_effect_return_ctls(struct usb_mixer_interface *mixer)
+ for (ch = 0; ch < 4; ++ch) {
+ cmask = BIT(ch);
+ snprintf(name, sizeof(name),
+- "Effect Return %d Volume", ch + 1);
++ "Effect Return %d Volume", ch + 1);
+ err = snd_create_std_mono_ctl(mixer, id, control,
+- cmask, val_type, name,
+- snd_usb_mixer_vol_tlv);
++ cmask, val_type, name,
++ snd_usb_mixer_vol_tlv);
+ if (err < 0)
+ return err;
+ }
+@@ -1243,20 +1245,20 @@ static int snd_ftu_create_effect_send_ctls(struct usb_mixer_interface *mixer)
+ for (ch = 0; ch < 8; ++ch) {
+ cmask = BIT(ch);
+ snprintf(name, sizeof(name),
+- "Effect Send AIn%d Volume", ch + 1);
++ "Effect Send AIn%d Volume", ch + 1);
+ err = snd_create_std_mono_ctl(mixer, id, control, cmask,
+- val_type, name,
+- snd_usb_mixer_vol_tlv);
++ val_type, name,
++ snd_usb_mixer_vol_tlv);
+ if (err < 0)
+ return err;
+ }
+ for (ch = 8; ch < 16; ++ch) {
+ cmask = BIT(ch);
+ snprintf(name, sizeof(name),
+- "Effect Send DIn%d Volume", ch - 7);
++ "Effect Send DIn%d Volume", ch - 7);
+ err = snd_create_std_mono_ctl(mixer, id, control, cmask,
+- val_type, name,
+- snd_usb_mixer_vol_tlv);
++ val_type, name,
++ snd_usb_mixer_vol_tlv);
+ if (err < 0)
+ return err;
+ }
+@@ -1346,19 +1348,19 @@ static int snd_c400_create_vol_ctls(struct usb_mixer_interface *mixer)
+ for (out = 0; out < num_outs; out++) {
+ if (chan < num_outs) {
+ snprintf(name, sizeof(name),
+- "PCM%d-Out%d Playback Volume",
+- chan + 1, out + 1);
++ "PCM%d-Out%d Playback Volume",
++ chan + 1, out + 1);
+ } else {
+ snprintf(name, sizeof(name),
+- "In%d-Out%d Playback Volume",
+- chan - num_outs + 1, out + 1);
++ "In%d-Out%d Playback Volume",
++ chan - num_outs + 1, out + 1);
+ }
+
+ cmask = (out == 0) ? 0 : BIT(out - 1);
+ offset = chan * num_outs;
+ err = snd_create_std_mono_ctl_offset(mixer, id, control,
+- cmask, val_type, offset, name,
+- &snd_usb_mixer_vol_tlv);
++ cmask, val_type, offset, name,
++ &snd_usb_mixer_vol_tlv);
+ if (err < 0)
+ return err;
+ }
+@@ -1377,7 +1379,7 @@ static int snd_c400_create_effect_volume_ctl(struct usb_mixer_interface *mixer)
+ const unsigned int cmask = 0;
+
+ return snd_create_std_mono_ctl(mixer, id, control, cmask, val_type,
+- name, snd_usb_mixer_vol_tlv);
++ name, snd_usb_mixer_vol_tlv);
+ }
+
+ /* This control needs a volume quirk, see mixer.c */
+@@ -1390,7 +1392,7 @@ static int snd_c400_create_effect_duration_ctl(struct usb_mixer_interface *mixer
+ const unsigned int cmask = 0;
+
+ return snd_create_std_mono_ctl(mixer, id, control, cmask, val_type,
+- name, snd_usb_mixer_vol_tlv);
++ name, snd_usb_mixer_vol_tlv);
+ }
+
+ /* This control needs a volume quirk, see mixer.c */
+@@ -1403,7 +1405,7 @@ static int snd_c400_create_effect_feedback_ctl(struct usb_mixer_interface *mixer
+ const unsigned int cmask = 0;
+
+ return snd_create_std_mono_ctl(mixer, id, control, cmask, val_type,
+- name, NULL);
++ name, NULL);
+ }
+
+ static int snd_c400_create_effect_vol_ctls(struct usb_mixer_interface *mixer)
+@@ -1432,18 +1434,18 @@ static int snd_c400_create_effect_vol_ctls(struct usb_mixer_interface *mixer)
+ for (chan = 0; chan < num_outs + num_ins; chan++) {
+ if (chan < num_outs) {
+ snprintf(name, sizeof(name),
+- "Effect Send DOut%d",
+- chan + 1);
++ "Effect Send DOut%d",
++ chan + 1);
+ } else {
+ snprintf(name, sizeof(name),
+- "Effect Send AIn%d",
+- chan - num_outs + 1);
++ "Effect Send AIn%d",
++ chan - num_outs + 1);
+ }
+
+ cmask = (chan == 0) ? 0 : BIT(chan - 1);
+ err = snd_create_std_mono_ctl(mixer, id, control,
+- cmask, val_type, name,
+- &snd_usb_mixer_vol_tlv);
++ cmask, val_type, name,
++ &snd_usb_mixer_vol_tlv);
+ if (err < 0)
+ return err;
+ }
+@@ -1478,14 +1480,14 @@ static int snd_c400_create_effect_ret_vol_ctls(struct usb_mixer_interface *mixer
+
+ for (chan = 0; chan < num_outs; chan++) {
+ snprintf(name, sizeof(name),
+- "Effect Return %d",
+- chan + 1);
++ "Effect Return %d",
++ chan + 1);
+
+ cmask = (chan == 0) ? 0 :
+ BIT(chan + (chan % 2) * num_outs - 1);
+ err = snd_create_std_mono_ctl_offset(mixer, id, control,
+- cmask, val_type, offset, name,
+- &snd_usb_mixer_vol_tlv);
++ cmask, val_type, offset, name,
++ &snd_usb_mixer_vol_tlv);
+ if (err < 0)
+ return err;
+ }
+@@ -1626,7 +1628,7 @@ static const struct std_mono_table ebox44_table[] = {
+ *
+ */
+ static int snd_microii_spdif_info(struct snd_kcontrol *kcontrol,
+- struct snd_ctl_elem_info *uinfo)
++ struct snd_ctl_elem_info *uinfo)
+ {
+ uinfo->type = SNDRV_CTL_ELEM_TYPE_IEC958;
+ uinfo->count = 1;
+@@ -1634,7 +1636,7 @@ static int snd_microii_spdif_info(struct snd_kcontrol *kcontrol,
+ }
+
+ static int snd_microii_spdif_default_get(struct snd_kcontrol *kcontrol,
+- struct snd_ctl_elem_value *ucontrol)
++ struct snd_ctl_elem_value *ucontrol)
+ {
+ struct usb_mixer_elem_list *list = snd_kcontrol_chip(kcontrol);
+ struct snd_usb_audio *chip = list->mixer->chip;
+@@ -1667,13 +1669,13 @@ static int snd_microii_spdif_default_get(struct snd_kcontrol *kcontrol,
+ ep = get_endpoint(alts, 0)->bEndpointAddress;
+
+ err = snd_usb_ctl_msg(chip->dev,
+- usb_rcvctrlpipe(chip->dev, 0),
+- UAC_GET_CUR,
+- USB_TYPE_CLASS | USB_RECIP_ENDPOINT | USB_DIR_IN,
+- UAC_EP_CS_ATTR_SAMPLE_RATE << 8,
+- ep,
+- data,
+- sizeof(data));
++ usb_rcvctrlpipe(chip->dev, 0),
++ UAC_GET_CUR,
++ USB_TYPE_CLASS | USB_RECIP_ENDPOINT | USB_DIR_IN,
++ UAC_EP_CS_ATTR_SAMPLE_RATE << 8,
++ ep,
++ data,
++ sizeof(data));
+ if (err < 0)
+ goto end;
+
+@@ -1700,26 +1702,26 @@ static int snd_microii_spdif_default_update(struct usb_mixer_elem_list *list)
+
+ reg = ((pval >> 4) & 0xf0) | (pval & 0x0f);
+ err = snd_usb_ctl_msg(chip->dev,
+- usb_sndctrlpipe(chip->dev, 0),
+- UAC_SET_CUR,
+- USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_OTHER,
+- reg,
+- 2,
+- NULL,
+- 0);
++ usb_sndctrlpipe(chip->dev, 0),
++ UAC_SET_CUR,
++ USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_OTHER,
++ reg,
++ 2,
++ NULL,
++ 0);
+ if (err < 0)
+ goto end;
+
+ reg = (pval & IEC958_AES0_NONAUDIO) ? 0xa0 : 0x20;
+ reg |= (pval >> 12) & 0x0f;
+ err = snd_usb_ctl_msg(chip->dev,
+- usb_sndctrlpipe(chip->dev, 0),
+- UAC_SET_CUR,
+- USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_OTHER,
+- reg,
+- 3,
+- NULL,
+- 0);
++ usb_sndctrlpipe(chip->dev, 0),
++ UAC_SET_CUR,
++ USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_OTHER,
++ reg,
++ 3,
++ NULL,
++ 0);
+ if (err < 0)
+ goto end;
+
+@@ -1729,7 +1731,7 @@ static int snd_microii_spdif_default_update(struct usb_mixer_elem_list *list)
+ }
+
+ static int snd_microii_spdif_default_put(struct snd_kcontrol *kcontrol,
+- struct snd_ctl_elem_value *ucontrol)
++ struct snd_ctl_elem_value *ucontrol)
+ {
+ struct usb_mixer_elem_list *list = snd_kcontrol_chip(kcontrol);
+ unsigned int pval, pval_old;
+@@ -1756,7 +1758,7 @@ static int snd_microii_spdif_default_put(struct snd_kcontrol *kcontrol,
+ }
+
+ static int snd_microii_spdif_mask_get(struct snd_kcontrol *kcontrol,
+- struct snd_ctl_elem_value *ucontrol)
++ struct snd_ctl_elem_value *ucontrol)
+ {
+ ucontrol->value.iec958.status[0] = 0x0f;
+ ucontrol->value.iec958.status[1] = 0xff;
+@@ -1767,7 +1769,7 @@ static int snd_microii_spdif_mask_get(struct snd_kcontrol *kcontrol,
+ }
+
+ static int snd_microii_spdif_switch_get(struct snd_kcontrol *kcontrol,
+- struct snd_ctl_elem_value *ucontrol)
++ struct snd_ctl_elem_value *ucontrol)
+ {
+ ucontrol->value.integer.value[0] = !(kcontrol->private_value & 0x02);
+
+@@ -1785,20 +1787,20 @@ static int snd_microii_spdif_switch_update(struct usb_mixer_elem_list *list)
+ return err;
+
+ err = snd_usb_ctl_msg(chip->dev,
+- usb_sndctrlpipe(chip->dev, 0),
+- UAC_SET_CUR,
+- USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_OTHER,
+- reg,
+- 9,
+- NULL,
+- 0);
++ usb_sndctrlpipe(chip->dev, 0),
++ UAC_SET_CUR,
++ USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_OTHER,
++ reg,
++ 9,
++ NULL,
++ 0);
+
+ snd_usb_unlock_shutdown(chip);
+ return err;
+ }
+
+ static int snd_microii_spdif_switch_put(struct snd_kcontrol *kcontrol,
+- struct snd_ctl_elem_value *ucontrol)
++ struct snd_ctl_elem_value *ucontrol)
+ {
+ struct usb_mixer_elem_list *list = snd_kcontrol_chip(kcontrol);
+ u8 reg;
+@@ -1883,9 +1885,9 @@ static int snd_soundblaster_e1_switch_update(struct usb_mixer_interface *mixer,
+ if (err < 0)
+ return err;
+ err = snd_usb_ctl_msg(chip->dev,
+- usb_sndctrlpipe(chip->dev, 0), HID_REQ_SET_REPORT,
+- USB_TYPE_CLASS | USB_RECIP_INTERFACE | USB_DIR_OUT,
+- 0x0202, 3, buff, 2);
++ usb_sndctrlpipe(chip->dev, 0), HID_REQ_SET_REPORT,
++ USB_TYPE_CLASS | USB_RECIP_INTERFACE | USB_DIR_OUT,
++ 0x0202, 3, buff, 2);
+ snd_usb_unlock_shutdown(chip);
+ return err;
+ }
+@@ -3235,7 +3237,7 @@ static int snd_rme_digiface_enum_put(struct snd_kcontrol *kcontrol,
+ }
+
+ static int snd_rme_digiface_current_sync_get(struct snd_kcontrol *kcontrol,
+- struct snd_ctl_elem_value *ucontrol)
++ struct snd_ctl_elem_value *ucontrol)
+ {
+ int ret = snd_rme_digiface_enum_get(kcontrol, ucontrol);
+
+@@ -3918,7 +3920,7 @@ static const struct snd_djm_device snd_djm_devices[] = {
+
+
+ static int snd_djm_controls_info(struct snd_kcontrol *kctl,
+- struct snd_ctl_elem_info *info)
++ struct snd_ctl_elem_info *info)
+ {
+ unsigned long private_value = kctl->private_value;
+ u8 device_idx = (private_value & SND_DJM_DEVICE_MASK) >> SND_DJM_DEVICE_SHIFT;
+@@ -3937,8 +3939,8 @@ static int snd_djm_controls_info(struct snd_kcontrol *kctl,
+ info->value.enumerated.item = noptions - 1;
+
+ name = snd_djm_get_label(device_idx,
+- ctl->options[info->value.enumerated.item],
+- ctl->wIndex);
++ ctl->options[info->value.enumerated.item],
++ ctl->wIndex);
+ if (!name)
+ return -EINVAL;
+
+@@ -3950,7 +3952,7 @@ static int snd_djm_controls_info(struct snd_kcontrol *kctl,
+ }
+
+ static int snd_djm_controls_update(struct usb_mixer_interface *mixer,
+- u8 device_idx, u8 group, u16 value)
++ u8 device_idx, u8 group, u16 value)
+ {
+ int err;
+ const struct snd_djm_device *device = &snd_djm_devices[device_idx];
+@@ -3962,13 +3964,13 @@ static int snd_djm_controls_update(struct usb_mixer_interface *mixer,
+ if (err)
+ return err;
+
+- err = snd_usb_ctl_msg(
+- mixer->chip->dev, usb_sndctrlpipe(mixer->chip->dev, 0),
+- USB_REQ_SET_FEATURE,
+- USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
+- device->controls[group].options[value],
+- device->controls[group].wIndex,
+- NULL, 0);
++ err = snd_usb_ctl_msg(mixer->chip->dev,
++ usb_sndctrlpipe(mixer->chip->dev, 0),
++ USB_REQ_SET_FEATURE,
++ USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
++ device->controls[group].options[value],
++ device->controls[group].wIndex,
++ NULL, 0);
+
+ snd_usb_unlock_shutdown(mixer->chip);
+ return err;
+@@ -4009,7 +4011,7 @@ static int snd_djm_controls_resume(struct usb_mixer_elem_list *list)
+ }
+
+ static int snd_djm_controls_create(struct usb_mixer_interface *mixer,
+- const u8 device_idx)
++ const u8 device_idx)
+ {
+ int err, i;
+ u16 value;
+@@ -4028,10 +4030,10 @@ static int snd_djm_controls_create(struct usb_mixer_interface *mixer,
+ for (i = 0; i < device->ncontrols; i++) {
+ value = device->controls[i].default_value;
+ knew.name = device->controls[i].name;
+- knew.private_value = (
++ knew.private_value =
+ ((unsigned long)device_idx << SND_DJM_DEVICE_SHIFT) |
+ (i << SND_DJM_GROUP_SHIFT) |
+- value);
++ value;
+ err = snd_djm_controls_update(mixer, device_idx, i, value);
+ if (err)
+ return err;
+@@ -4098,13 +4100,15 @@ int snd_usb_mixer_apply_create_quirk(struct usb_mixer_interface *mixer)
+ break;
+
+ case USB_ID(0x17cc, 0x1011): /* Traktor Audio 6 */
+- err = snd_nativeinstruments_create_mixer(mixer,
++ err = snd_nativeinstruments_create_mixer(/* checkpatch hack */
++ mixer,
+ snd_nativeinstruments_ta6_mixers,
+ ARRAY_SIZE(snd_nativeinstruments_ta6_mixers));
+ break;
+
+ case USB_ID(0x17cc, 0x1021): /* Traktor Audio 10 */
+- err = snd_nativeinstruments_create_mixer(mixer,
++ err = snd_nativeinstruments_create_mixer(/* checkpatch hack */
++ mixer,
+ snd_nativeinstruments_ta10_mixers,
+ ARRAY_SIZE(snd_nativeinstruments_ta10_mixers));
+ break;
+--
+2.51.0
+
--- /dev/null
+From 7d67689f522a9e71621af23028a80bc1240310bd Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 26 May 2025 17:07:41 +0300
+Subject: ALSA: usb-audio: Fix whitespace & blank line issues in mixer_quirks
+
+From: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+
+[ Upstream commit df6b4dcf2e2c3b4e34c3213a575c92d0c9415d0d ]
+
+Address all whitespace & blank line(s) related issues reported by
+checkpatch.pl:
+
+ ERROR: trailing whitespace
+ ERROR: space required after that ',' (ctx:VxV)
+ WARNING: Missing a blank line after declarations
+ CHECK: Please use a blank line after function/struct/union/enum declarations
+ CHECK: Please don't use multiple blank lines
+
+Signed-off-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Link: https://patch.msgid.link/20250526-dualsense-alsa-jack-v1-2-1a821463b632@collabora.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/mixer_quirks.c | 26 +++++++++++---------------
+ 1 file changed, 11 insertions(+), 15 deletions(-)
+
+diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
+index 7f1e7a5fe8f0a..0aad92cb33276 100644
+--- a/sound/usb/mixer_quirks.c
++++ b/sound/usb/mixer_quirks.c
+@@ -287,7 +287,7 @@ static int snd_usb_soundblaster_remote_init(struct usb_mixer_interface *mixer)
+ mixer->rc_setup_packet->wLength = cpu_to_le16(len);
+ usb_fill_control_urb(mixer->rc_urb, mixer->chip->dev,
+ usb_rcvctrlpipe(mixer->chip->dev, 0),
+- (u8*)mixer->rc_setup_packet, mixer->rc_buffer, len,
++ (u8 *)mixer->rc_setup_packet, mixer->rc_buffer, len,
+ snd_usb_soundblaster_remote_complete, mixer);
+ return 0;
+ }
+@@ -389,7 +389,7 @@ static int snd_audigy2nx_controls_create(struct usb_mixer_interface *mixer)
+ mixer->chip->usb_id == USB_ID(0x041e, 0x3042) ||
+ mixer->chip->usb_id == USB_ID(0x041e, 0x30df) ||
+ mixer->chip->usb_id == USB_ID(0x041e, 0x3048)))
+- break;
++ break;
+
+ knew = snd_audigy2nx_control;
+ knew.name = snd_audigy2nx_led_names[i];
+@@ -858,6 +858,7 @@ static const struct snd_kcontrol_new snd_mbox1_src_switch = {
+ static int snd_mbox1_controls_create(struct usb_mixer_interface *mixer)
+ {
+ int err;
++
+ err = add_single_ctl_with_resume(mixer, 0,
+ snd_mbox1_clk_switch_resume,
+ &snd_mbox1_clk_switch, NULL);
+@@ -871,7 +872,7 @@ static int snd_mbox1_controls_create(struct usb_mixer_interface *mixer)
+
+ /* Native Instruments device quirks */
+
+-#define _MAKE_NI_CONTROL(bRequest,wIndex) ((bRequest) << 16 | (wIndex))
++#define _MAKE_NI_CONTROL(bRequest, wIndex) ((bRequest) << 16 | (wIndex))
+
+ static int snd_ni_control_init_val(struct usb_mixer_interface *mixer,
+ struct snd_kcontrol *kctl)
+@@ -2183,6 +2184,7 @@ static const u32 snd_rme_rate_table[] = {
+ 256000, 352800, 384000, 400000,
+ 512000, 705600, 768000, 800000
+ };
++
+ /* maximum number of items for AES and S/PDIF rates for above table */
+ #define SND_RME_RATE_IDX_AES_SPDIF_NUM 12
+
+@@ -3271,7 +3273,6 @@ static int snd_rme_digiface_sync_state_get(struct snd_kcontrol *kcontrol,
+ return 0;
+ }
+
+-
+ static int snd_rme_digiface_format_info(struct snd_kcontrol *kcontrol,
+ struct snd_ctl_elem_info *uinfo)
+ {
+@@ -3283,7 +3284,6 @@ static int snd_rme_digiface_format_info(struct snd_kcontrol *kcontrol,
+ ARRAY_SIZE(format), format);
+ }
+
+-
+ static int snd_rme_digiface_sync_source_info(struct snd_kcontrol *kcontrol,
+ struct snd_ctl_elem_info *uinfo)
+ {
+@@ -3566,7 +3566,6 @@ static int snd_rme_digiface_controls_create(struct usb_mixer_interface *mixer)
+ #define SND_DJM_A9_IDX 0x6
+ #define SND_DJM_V10_IDX 0x7
+
+-
+ #define SND_DJM_CTL(_name, suffix, _default_value, _windex) { \
+ .name = _name, \
+ .options = snd_djm_opts_##suffix, \
+@@ -3578,7 +3577,6 @@ static int snd_rme_digiface_controls_create(struct usb_mixer_interface *mixer)
+ .controls = snd_djm_ctls_##suffix, \
+ .ncontrols = ARRAY_SIZE(snd_djm_ctls_##suffix) }
+
+-
+ struct snd_djm_device {
+ const char *name;
+ const struct snd_djm_ctl *controls;
+@@ -3724,7 +3722,6 @@ static const struct snd_djm_ctl snd_djm_ctls_250mk2[] = {
+ SND_DJM_CTL("Output 3 Playback Switch", 250mk2_pb3, 2, SND_DJM_WINDEX_PB)
+ };
+
+-
+ // DJM-450
+ static const u16 snd_djm_opts_450_cap1[] = {
+ 0x0103, 0x0100, 0x0106, 0x0107, 0x0108, 0x0109, 0x010d, 0x010a };
+@@ -3749,7 +3746,6 @@ static const struct snd_djm_ctl snd_djm_ctls_450[] = {
+ SND_DJM_CTL("Output 3 Playback Switch", 450_pb3, 2, SND_DJM_WINDEX_PB)
+ };
+
+-
+ // DJM-750
+ static const u16 snd_djm_opts_750_cap1[] = {
+ 0x0101, 0x0103, 0x0106, 0x0107, 0x0108, 0x0109, 0x010a, 0x010f };
+@@ -3768,7 +3764,6 @@ static const struct snd_djm_ctl snd_djm_ctls_750[] = {
+ SND_DJM_CTL("Input 4 Capture Switch", 750_cap4, 0, SND_DJM_WINDEX_CAP)
+ };
+
+-
+ // DJM-850
+ static const u16 snd_djm_opts_850_cap1[] = {
+ 0x0100, 0x0103, 0x0106, 0x0107, 0x0108, 0x0109, 0x010a, 0x010f };
+@@ -3787,7 +3782,6 @@ static const struct snd_djm_ctl snd_djm_ctls_850[] = {
+ SND_DJM_CTL("Input 4 Capture Switch", 850_cap4, 1, SND_DJM_WINDEX_CAP)
+ };
+
+-
+ // DJM-900NXS2
+ static const u16 snd_djm_opts_900nxs2_cap1[] = {
+ 0x0100, 0x0102, 0x0103, 0x0106, 0x0107, 0x0108, 0x0109, 0x010a };
+@@ -3825,7 +3819,6 @@ static const u16 snd_djm_opts_750mk2_pb1[] = { 0x0100, 0x0101, 0x0104 };
+ static const u16 snd_djm_opts_750mk2_pb2[] = { 0x0200, 0x0201, 0x0204 };
+ static const u16 snd_djm_opts_750mk2_pb3[] = { 0x0300, 0x0301, 0x0304 };
+
+-
+ static const struct snd_djm_ctl snd_djm_ctls_750mk2[] = {
+ SND_DJM_CTL("Master Input Level Capture Switch", cap_level, 0, SND_DJM_WINDEX_CAPLVL),
+ SND_DJM_CTL("Input 1 Capture Switch", 750mk2_cap1, 2, SND_DJM_WINDEX_CAP),
+@@ -3838,7 +3831,6 @@ static const struct snd_djm_ctl snd_djm_ctls_750mk2[] = {
+ SND_DJM_CTL("Output 3 Playback Switch", 750mk2_pb3, 2, SND_DJM_WINDEX_PB)
+ };
+
+-
+ // DJM-A9
+ static const u16 snd_djm_opts_a9_cap_level[] = {
+ 0x0000, 0x0100, 0x0200, 0x0300, 0x0400, 0x0500 };
+@@ -3867,29 +3859,35 @@ static const struct snd_djm_ctl snd_djm_ctls_a9[] = {
+ static const u16 snd_djm_opts_v10_cap_level[] = {
+ 0x0000, 0x0100, 0x0200, 0x0300, 0x0400, 0x0500
+ };
++
+ static const u16 snd_djm_opts_v10_cap1[] = {
+ 0x0103,
+ 0x0100, 0x0102, 0x0106, 0x0110, 0x0107,
+ 0x0108, 0x0109, 0x010a, 0x0121, 0x0122
+ };
++
+ static const u16 snd_djm_opts_v10_cap2[] = {
+ 0x0200, 0x0202, 0x0206, 0x0210, 0x0207,
+ 0x0208, 0x0209, 0x020a, 0x0221, 0x0222
+ };
++
+ static const u16 snd_djm_opts_v10_cap3[] = {
+ 0x0303,
+ 0x0300, 0x0302, 0x0306, 0x0310, 0x0307,
+ 0x0308, 0x0309, 0x030a, 0x0321, 0x0322
+ };
++
+ static const u16 snd_djm_opts_v10_cap4[] = {
+ 0x0403,
+ 0x0400, 0x0402, 0x0406, 0x0410, 0x0407,
+ 0x0408, 0x0409, 0x040a, 0x0421, 0x0422
+ };
++
+ static const u16 snd_djm_opts_v10_cap5[] = {
+ 0x0500, 0x0502, 0x0506, 0x0510, 0x0507,
+ 0x0508, 0x0509, 0x050a, 0x0521, 0x0522
+ };
++
+ static const u16 snd_djm_opts_v10_cap6[] = {
+ 0x0603,
+ 0x0600, 0x0602, 0x0606, 0x0610, 0x0607,
+@@ -3918,7 +3916,6 @@ static const struct snd_djm_device snd_djm_devices[] = {
+ [SND_DJM_V10_IDX] = SND_DJM_DEVICE(v10),
+ };
+
+-
+ static int snd_djm_controls_info(struct snd_kcontrol *kctl,
+ struct snd_ctl_elem_info *info)
+ {
+@@ -4358,4 +4355,3 @@ void snd_usb_mixer_fu_apply_quirk(struct usb_mixer_interface *mixer,
+ (cval->control == UAC_FU_MUTE || cval->control == UAC_FU_VOLUME))
+ snd_fix_plt_name(mixer->chip, &kctl->id);
+ }
+-
+--
+2.51.0
+
--- /dev/null
+From e3088a152335039f8b9110412995a11082b3d6a4 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 27 Aug 2025 11:29:02 +0800
+Subject: ALSA: usb-audio: move mixer_quirks' min_mute into common quirk
+
+From: Cryolitia PukNgae <cryolitia@uniontech.com>
+
+[ Upstream commit 2c3ca8cc55a3afc7a4fa99ed8f5f5d05dd2e65b3 ]
+
+We have found more and more devices that have the same problem, that
+the mixer's minimum value is muted. Accroding to pipewire's MR[1]
+and Arch Linux wiki[2], this should be a very common problem in USB
+audio devices. Move the quirk into common quirk,as a preparation of
+more devices' quirk's patch coming on the road[3].
+
+1. https://gitlab.freedesktop.org/pipewire/pipewire/-/merge_requests/2514
+2. https://wiki.archlinux.org/index.php?title=PipeWire&oldid=804138#No_sound_from_USB_DAC_until_30%_volume
+3. On the road, in the physical sense. We have been buying ton of
+ these devices for testing the problem.
+
+Tested-by: Guoli An <anguoli@uniontech.com>
+Signed-off-by: Cryolitia PukNgae <cryolitia@uniontech.com>
+Link: https://patch.msgid.link/20250827-sound-quirk-min-mute-v1-1-4717aa8a4f6a@uniontech.com
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/mixer_quirks.c | 10 +++-------
+ sound/usb/quirks.c | 12 ++++++++++--
+ sound/usb/usbaudio.h | 4 ++++
+ 3 files changed, 17 insertions(+), 9 deletions(-)
+
+diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
+index 6b47b3145d2cf..3df537fdb9f1c 100644
+--- a/sound/usb/mixer_quirks.c
++++ b/sound/usb/mixer_quirks.c
+@@ -4608,16 +4608,12 @@ void snd_usb_mixer_fu_apply_quirk(struct usb_mixer_interface *mixer,
+ if (unitid == 7 && cval->control == UAC_FU_VOLUME)
+ snd_dragonfly_quirk_db_scale(mixer, cval, kctl);
+ break;
++ }
++
+ /* lowest playback value is muted on some devices */
+- case USB_ID(0x0572, 0x1b09): /* Conexant Systems (Rockwell), Inc. */
+- case USB_ID(0x0d8c, 0x000c): /* C-Media */
+- case USB_ID(0x0d8c, 0x0014): /* C-Media */
+- case USB_ID(0x19f7, 0x0003): /* RODE NT-USB */
+- case USB_ID(0x2d99, 0x0026): /* HECATE G2 GAMING HEADSET */
++ if (mixer->chip->quirk_flags & QUIRK_FLAG_MIXER_MIN_MUTE)
+ if (strstr(kctl->id.name, "Playback"))
+ cval->min_mute = 1;
+- break;
+- }
+
+ /* ALSA-ify some Plantronics headset control names */
+ if (USB_ID_VENDOR(mixer->chip->usb_id) == 0x047f &&
+diff --git a/sound/usb/quirks.c b/sound/usb/quirks.c
+index e75b0b1df6eb2..8bc1e247cdf1a 100644
+--- a/sound/usb/quirks.c
++++ b/sound/usb/quirks.c
+@@ -2199,6 +2199,8 @@ static const struct usb_audio_quirk_flags_table quirk_flags_table[] = {
+ QUIRK_FLAG_SET_IFACE_FIRST),
+ DEVICE_FLG(0x0556, 0x0014, /* Phoenix Audio TMX320VC */
+ QUIRK_FLAG_GET_SAMPLE_RATE),
++ DEVICE_FLG(0x0572, 0x1b09, /* Conexant Systems (Rockwell), Inc. */
++ QUIRK_FLAG_MIXER_MIN_MUTE),
+ DEVICE_FLG(0x05a3, 0x9420, /* ELP HD USB Camera */
+ QUIRK_FLAG_GET_SAMPLE_RATE),
+ DEVICE_FLG(0x05a7, 0x1020, /* Bose Companion 5 */
+@@ -2245,8 +2247,10 @@ static const struct usb_audio_quirk_flags_table quirk_flags_table[] = {
+ QUIRK_FLAG_GET_SAMPLE_RATE),
+ DEVICE_FLG(0x0c45, 0x636b, /* Microdia JP001 USB Camera */
+ QUIRK_FLAG_GET_SAMPLE_RATE),
+- DEVICE_FLG(0x0d8c, 0x0014, /* USB Audio Device */
+- QUIRK_FLAG_CTL_MSG_DELAY_1M),
++ DEVICE_FLG(0x0d8c, 0x000c, /* C-Media */
++ QUIRK_FLAG_MIXER_MIN_MUTE),
++ DEVICE_FLG(0x0d8c, 0x0014, /* C-Media */
++ QUIRK_FLAG_CTL_MSG_DELAY_1M | QUIRK_FLAG_MIXER_MIN_MUTE),
+ DEVICE_FLG(0x0ecb, 0x205c, /* JBL Quantum610 Wireless */
+ QUIRK_FLAG_FIXED_RATE),
+ DEVICE_FLG(0x0ecb, 0x2069, /* JBL Quantum810 Wireless */
+@@ -2293,6 +2297,8 @@ static const struct usb_audio_quirk_flags_table quirk_flags_table[] = {
+ QUIRK_FLAG_ITF_USB_DSD_DAC | QUIRK_FLAG_CTL_MSG_DELAY),
+ DEVICE_FLG(0x1901, 0x0191, /* GE B850V3 CP2114 audio interface */
+ QUIRK_FLAG_GET_SAMPLE_RATE),
++ DEVICE_FLG(0x19f7, 0x0003, /* RODE NT-USB */
++ QUIRK_FLAG_MIXER_MIN_MUTE),
+ DEVICE_FLG(0x19f7, 0x0035, /* RODE NT-USB+ */
+ QUIRK_FLAG_GET_SAMPLE_RATE),
+ DEVICE_FLG(0x1bcf, 0x2281, /* HD Webcam */
+@@ -2353,6 +2359,8 @@ static const struct usb_audio_quirk_flags_table quirk_flags_table[] = {
+ QUIRK_FLAG_CTL_MSG_DELAY_1M),
+ DEVICE_FLG(0x2d95, 0x8021, /* VIVO USB-C-XE710 HEADSET */
+ QUIRK_FLAG_CTL_MSG_DELAY_1M),
++ DEVICE_FLG(0x2d99, 0x0026, /* HECATE G2 GAMING HEADSET */
++ QUIRK_FLAG_MIXER_MIN_MUTE),
+ DEVICE_FLG(0x2fc6, 0xf0b7, /* iBasso DC07 Pro */
+ QUIRK_FLAG_CTL_MSG_DELAY_1M),
+ DEVICE_FLG(0x30be, 0x0101, /* Schiit Hel */
+diff --git a/sound/usb/usbaudio.h b/sound/usb/usbaudio.h
+index 158ec053dc44d..1ef4d39978df3 100644
+--- a/sound/usb/usbaudio.h
++++ b/sound/usb/usbaudio.h
+@@ -196,6 +196,9 @@ extern bool snd_usb_skip_validation;
+ * for the given endpoint.
+ * QUIRK_FLAG_MIC_RES_16 and QUIRK_FLAG_MIC_RES_384
+ * Set the fixed resolution for Mic Capture Volume (mostly for webcams)
++ * QUIRK_FLAG_MIXER_MIN_MUTE
++ * Set minimum volume control value as mute for devices where the lowest
++ * playback value represents muted state instead of minimum audible volume
+ */
+
+ #define QUIRK_FLAG_GET_SAMPLE_RATE (1U << 0)
+@@ -222,5 +225,6 @@ extern bool snd_usb_skip_validation;
+ #define QUIRK_FLAG_FIXED_RATE (1U << 21)
+ #define QUIRK_FLAG_MIC_RES_16 (1U << 22)
+ #define QUIRK_FLAG_MIC_RES_384 (1U << 23)
++#define QUIRK_FLAG_MIXER_MIN_MUTE (1U << 24)
+
+ #endif /* __USBAUDIO_H */
+--
+2.51.0
+
--- /dev/null
+From fab9ea2ce5ecbac45dc1fd6359dc1f963eb4d67f Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 26 May 2025 17:07:47 +0300
+Subject: ALSA: usb-audio: Remove unneeded wmb() in mixer_quirks
+
+From: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+
+[ Upstream commit 9cea7425595697802e8d55a322a251999554b8b1 ]
+
+Adding a memory barrier before wake_up() in
+snd_usb_soundblaster_remote_complete() is supposed to ensure the write
+to mixer->rc_code is visible in wait_event_interruptible() from
+snd_usb_sbrc_hwdep_read().
+
+However, this is not really necessary, since wake_up() is just a wrapper
+over __wake_up() which already executes a full memory barrier before
+accessing the state of the task to be waken up.
+
+Drop the redundant call to wmb() and implicitly fix the checkpatch
+complaint:
+
+ WARNING: memory barrier without comment
+
+Signed-off-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Link: https://patch.msgid.link/20250526-dualsense-alsa-jack-v1-8-1a821463b632@collabora.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/mixer_quirks.c | 1 -
+ 1 file changed, 1 deletion(-)
+
+diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
+index dab6d461cf8cd..5507340a7723e 100644
+--- a/sound/usb/mixer_quirks.c
++++ b/sound/usb/mixer_quirks.c
+@@ -212,7 +212,6 @@ static void snd_usb_soundblaster_remote_complete(struct urb *urb)
+ if (code == rc->mute_code)
+ snd_usb_mixer_notify_id(mixer, rc->mute_mixer_id);
+ mixer->rc_code = code;
+- wmb();
+ wake_up(&mixer->rc_waitq);
+ }
+
+--
+2.51.0
+
--- /dev/null
+From 49f28fbe893563cc48b2cf31f1a5248d6f2c44de Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 26 May 2025 17:07:46 +0300
+Subject: ALSA: usb-audio: Simplify NULL comparison in mixer_quirks
+
+From: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+
+[ Upstream commit f2d6d660e8fd5f4467e80743f82119201e67fa9c ]
+
+Handle report from checkpatch.pl:
+
+ CHECK: Comparison to NULL could be written "t->name"
+
+Signed-off-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Link: https://patch.msgid.link/20250526-dualsense-alsa-jack-v1-7-1a821463b632@collabora.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/mixer_quirks.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
+index 741a70d0816cc..dab6d461cf8cd 100644
+--- a/sound/usb/mixer_quirks.c
++++ b/sound/usb/mixer_quirks.c
+@@ -129,7 +129,7 @@ static int snd_create_std_mono_table(struct usb_mixer_interface *mixer,
+ {
+ int err;
+
+- while (t->name != NULL) {
++ while (t->name) {
+ err = snd_create_std_mono_ctl(mixer, t->unitid, t->control,
+ t->cmask, t->val_type, t->name,
+ t->tlv_callback);
+--
+2.51.0
+
--- /dev/null
+From ccd379cf477b3ef311a7e1df6f16301204ecf686 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 8 Jul 2025 16:00:27 +0800
+Subject: ASoC: Intel: soc-acpi: Add entry for HDMI_In capture support in PTL
+ match table
+
+From: Balamurugan C <balamurugan.c@intel.com>
+
+[ Upstream commit fb00ab1f39369e49d25c74f0d41e4c1ec2f12576 ]
+
+Adding HDMI-In capture via I2S feature support in PTL platform.
+
+Signed-off-by: Balamurugan C <balamurugan.c@intel.com>
+Reviewed-by: Liam Girdwood <liam.r.girdwood@intel.com>
+Signed-off-by: Bard Liao <yung-chuan.liao@linux.intel.com>
+Link: https://patch.msgid.link/20250708080030.1257790-3-yung-chuan.liao@linux.intel.com
+Signed-off-by: Mark Brown <broonie@kernel.org>
+Stable-dep-of: 03aa2ed9e187 ("ASoC: Intel: sof_rt5682: Add HDMI-In capture with rt5682 support for PTL.")
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/soc/intel/boards/sof_es8336.c | 10 ++++++++++
+ sound/soc/intel/common/soc-acpi-intel-ptl-match.c | 12 ++++++++++++
+ 2 files changed, 22 insertions(+)
+
+diff --git a/sound/soc/intel/boards/sof_es8336.c b/sound/soc/intel/boards/sof_es8336.c
+index a0b3679b17b42..1211a2b8a2a2c 100644
+--- a/sound/soc/intel/boards/sof_es8336.c
++++ b/sound/soc/intel/boards/sof_es8336.c
+@@ -826,6 +826,16 @@ static const struct platform_device_id board_ids[] = {
+ SOF_ES8336_SPEAKERS_EN_GPIO1_QUIRK |
+ SOF_ES8336_JD_INVERTED),
+ },
++ {
++ .name = "ptl_es83x6_c1_h02",
++ .driver_data = (kernel_ulong_t)(SOF_ES8336_SSP_CODEC(1) |
++ SOF_NO_OF_HDMI_CAPTURE_SSP(2) |
++ SOF_HDMI_CAPTURE_1_SSP(0) |
++ SOF_HDMI_CAPTURE_2_SSP(2) |
++ SOF_SSP_HDMI_CAPTURE_PRESENT |
++ SOF_ES8336_SPEAKERS_EN_GPIO1_QUIRK |
++ SOF_ES8336_JD_INVERTED),
++ },
+ { }
+ };
+ MODULE_DEVICE_TABLE(platform, board_ids);
+diff --git a/sound/soc/intel/common/soc-acpi-intel-ptl-match.c b/sound/soc/intel/common/soc-acpi-intel-ptl-match.c
+index ff4f2fbf9271d..67f1091483dce 100644
+--- a/sound/soc/intel/common/soc-acpi-intel-ptl-match.c
++++ b/sound/soc/intel/common/soc-acpi-intel-ptl-match.c
+@@ -26,6 +26,11 @@ static const struct snd_soc_acpi_codecs ptl_essx_83x6 = {
+ .codecs = { "ESSX8316", "ESSX8326", "ESSX8336"},
+ };
+
++static const struct snd_soc_acpi_codecs ptl_lt6911_hdmi = {
++ .num_codecs = 1,
++ .codecs = {"INTC10B0"}
++};
++
+ struct snd_soc_acpi_mach snd_soc_acpi_intel_ptl_machines[] = {
+ {
+ .comp_ids = &ptl_rt5682_rt5682s_hp,
+@@ -34,6 +39,13 @@ struct snd_soc_acpi_mach snd_soc_acpi_intel_ptl_machines[] = {
+ .tplg_quirk_mask = SND_SOC_ACPI_TPLG_INTEL_AMP_NAME |
+ SND_SOC_ACPI_TPLG_INTEL_CODEC_NAME,
+ },
++ {
++ .comp_ids = &ptl_essx_83x6,
++ .drv_name = "ptl_es83x6_c1_h02",
++ .machine_quirk = snd_soc_acpi_codec_list,
++ .quirk_data = &ptl_lt6911_hdmi,
++ .sof_tplg_filename = "sof-ptl-es83x6-ssp1-hdmi-ssp02.tplg",
++ },
+ {
+ .comp_ids = &ptl_essx_83x6,
+ .drv_name = "sof-essx8336",
+--
+2.51.0
+
--- /dev/null
+From 6fa39960d3447874390f33535f85ab240a81394b Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 8 Jul 2025 16:00:26 +0800
+Subject: ASoC: Intel: soc-acpi: Add entry for sof_es8336 in PTL match table.
+
+From: Balamurugan C <balamurugan.c@intel.com>
+
+[ Upstream commit 2813f535b5847771d9e56df678c523a7e64f860e ]
+
+Adding ES83x6 I2S codec support for PTL platforms and entry in match table.
+
+Signed-off-by: Balamurugan C <balamurugan.c@intel.com>
+Reviewed-by: Liam Girdwood <liam.r.girdwood@intel.com>
+Signed-off-by: Bard Liao <yung-chuan.liao@linux.intel.com>
+Link: https://patch.msgid.link/20250708080030.1257790-2-yung-chuan.liao@linux.intel.com
+Signed-off-by: Mark Brown <broonie@kernel.org>
+Stable-dep-of: 03aa2ed9e187 ("ASoC: Intel: sof_rt5682: Add HDMI-In capture with rt5682 support for PTL.")
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/soc/intel/common/soc-acpi-intel-ptl-match.c | 13 +++++++++++++
+ 1 file changed, 13 insertions(+)
+
+diff --git a/sound/soc/intel/common/soc-acpi-intel-ptl-match.c b/sound/soc/intel/common/soc-acpi-intel-ptl-match.c
+index eae75f3f0fa40..ff4f2fbf9271d 100644
+--- a/sound/soc/intel/common/soc-acpi-intel-ptl-match.c
++++ b/sound/soc/intel/common/soc-acpi-intel-ptl-match.c
+@@ -21,6 +21,11 @@ static const struct snd_soc_acpi_codecs ptl_rt5682_rt5682s_hp = {
+ .codecs = {RT5682_ACPI_HID, RT5682S_ACPI_HID},
+ };
+
++static const struct snd_soc_acpi_codecs ptl_essx_83x6 = {
++ .num_codecs = 3,
++ .codecs = { "ESSX8316", "ESSX8326", "ESSX8336"},
++};
++
+ struct snd_soc_acpi_mach snd_soc_acpi_intel_ptl_machines[] = {
+ {
+ .comp_ids = &ptl_rt5682_rt5682s_hp,
+@@ -29,6 +34,14 @@ struct snd_soc_acpi_mach snd_soc_acpi_intel_ptl_machines[] = {
+ .tplg_quirk_mask = SND_SOC_ACPI_TPLG_INTEL_AMP_NAME |
+ SND_SOC_ACPI_TPLG_INTEL_CODEC_NAME,
+ },
++ {
++ .comp_ids = &ptl_essx_83x6,
++ .drv_name = "sof-essx8336",
++ .sof_tplg_filename = "sof-ptl-es8336", /* the tplg suffix is added at run time */
++ .tplg_quirk_mask = SND_SOC_ACPI_TPLG_INTEL_SSP_NUMBER |
++ SND_SOC_ACPI_TPLG_INTEL_SSP_MSB |
++ SND_SOC_ACPI_TPLG_INTEL_DMIC_NUMBER,
++ },
+ {},
+ };
+ EXPORT_SYMBOL_GPL(snd_soc_acpi_intel_ptl_machines);
+--
+2.51.0
+
--- /dev/null
+From b091385f84e49447d27ad52d211229aee8bb6e92 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 16 Jul 2025 16:23:00 +0800
+Subject: ASoC: Intel: sof_rt5682: Add HDMI-In capture with rt5682 support for
+ PTL.
+
+From: Balamurugan C <balamurugan.c@intel.com>
+
+[ Upstream commit 03aa2ed9e187e42f25b3871b691d535fc19156c4 ]
+
+Added match table entry on ptl machines to support HDMI-In capture
+with rt5682 I2S audio codec. also added the respective quirk
+configuration in rt5682 machine driver.
+
+Signed-off-by: Balamurugan C <balamurugan.c@intel.com>
+Signed-off-by: Bard Liao <yung-chuan.liao@linux.intel.com>
+Link: https://patch.msgid.link/20250716082300.1810352-1-yung-chuan.liao@linux.intel.com
+Signed-off-by: Mark Brown <broonie@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/soc/intel/boards/sof_rt5682.c | 7 +++++++
+ sound/soc/intel/common/soc-acpi-intel-ptl-match.c | 7 +++++++
+ 2 files changed, 14 insertions(+)
+
+diff --git a/sound/soc/intel/boards/sof_rt5682.c b/sound/soc/intel/boards/sof_rt5682.c
+index f5925bd0a3fc6..4994aaccc583a 100644
+--- a/sound/soc/intel/boards/sof_rt5682.c
++++ b/sound/soc/intel/boards/sof_rt5682.c
+@@ -892,6 +892,13 @@ static const struct platform_device_id board_ids[] = {
+ SOF_SSP_PORT_BT_OFFLOAD(2) |
+ SOF_BT_OFFLOAD_PRESENT),
+ },
++ {
++ .name = "ptl_rt5682_c1_h02",
++ .driver_data = (kernel_ulong_t)(SOF_RT5682_MCLK_EN |
++ SOF_SSP_PORT_CODEC(1) |
++ /* SSP 0 and SSP 2 are used for HDMI IN */
++ SOF_SSP_MASK_HDMI_CAPTURE(0x5)),
++ },
+ { }
+ };
+ MODULE_DEVICE_TABLE(platform, board_ids);
+diff --git a/sound/soc/intel/common/soc-acpi-intel-ptl-match.c b/sound/soc/intel/common/soc-acpi-intel-ptl-match.c
+index 67f1091483dce..d90d8672ab77d 100644
+--- a/sound/soc/intel/common/soc-acpi-intel-ptl-match.c
++++ b/sound/soc/intel/common/soc-acpi-intel-ptl-match.c
+@@ -32,6 +32,13 @@ static const struct snd_soc_acpi_codecs ptl_lt6911_hdmi = {
+ };
+
+ struct snd_soc_acpi_mach snd_soc_acpi_intel_ptl_machines[] = {
++ {
++ .comp_ids = &ptl_rt5682_rt5682s_hp,
++ .drv_name = "ptl_rt5682_c1_h02",
++ .machine_quirk = snd_soc_acpi_codec_list,
++ .quirk_data = &ptl_lt6911_hdmi,
++ .sof_tplg_filename = "sof-ptl-rt5682-ssp1-hdmi-ssp02.tplg",
++ },
+ {
+ .comp_ids = &ptl_rt5682_rt5682s_hp,
+ .drv_name = "ptl_rt5682_def",
+--
+2.51.0
+
--- /dev/null
+From ad62c26d2ac3c407a8c4d35dfa8669df5132f4bd Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 9 May 2025 12:12:50 +0200
+Subject: drm/panfrost: Add support for Mali on the MT8370 SoC
+
+From: Louis-Alexis Eyraud <louisalexis.eyraud@collabora.com>
+
+[ Upstream commit 81645377c231803389ab0f2d09df6622e32dd327 ]
+
+Add a compatible for the MediaTek MT8370 SoC, with an integrated ARM
+Mali G57 MC2 GPU (Valhall-JM, dual core), with new platform data for
+its support in the panfrost driver.
+It uses the same data as MT8186 for the power management features to
+describe power supplies, pm_domains and enablement (one regulator, two
+power domains) but also sets the FORCE_AARCH64_PGTABLE flag in the GPU
+configuration quirks bitfield to enable AARCH64 4K page table format
+mode.
+As MT8186 and MT8370 SoC have different GPU architecture (Mali G52 2EE
+MC2 for MT8186), making them not compatible, and this mode is only
+enabled for Mediatek SoC that are Mali G57 based (compatible with
+mediatek,mali-mt8188 or mediatek,mali-8192), having specific platform
+data allows to set this flag for MT8370 without modifying MT8186
+configuration and behaviour.
+
+Reviewed-by: Steven Price <steven.price@arm.com>
+Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
+Signed-off-by: Louis-Alexis Eyraud <louisalexis.eyraud@collabora.com>
+Signed-off-by: Steven Price <steven.price@arm.com>
+Link: https://lore.kernel.org/r/20250509-mt8370-enable-gpu-v6-4-2833888cb1d3@collabora.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/gpu/drm/panfrost/panfrost_drv.c | 10 ++++++++++
+ 1 file changed, 10 insertions(+)
+
+diff --git a/drivers/gpu/drm/panfrost/panfrost_drv.c b/drivers/gpu/drm/panfrost/panfrost_drv.c
+index 21b28bef84015..07cd67baa81bf 100644
+--- a/drivers/gpu/drm/panfrost/panfrost_drv.c
++++ b/drivers/gpu/drm/panfrost/panfrost_drv.c
+@@ -841,6 +841,15 @@ static const struct panfrost_compatible mediatek_mt8192_data = {
+ .gpu_quirks = BIT(GPU_QUIRK_FORCE_AARCH64_PGTABLE),
+ };
+
++static const struct panfrost_compatible mediatek_mt8370_data = {
++ .num_supplies = ARRAY_SIZE(default_supplies) - 1,
++ .supply_names = default_supplies,
++ .num_pm_domains = 2,
++ .pm_domain_names = mediatek_pm_domains,
++ .pm_features = BIT(GPU_PM_CLK_DIS) | BIT(GPU_PM_VREG_OFF),
++ .gpu_quirks = BIT(GPU_QUIRK_FORCE_AARCH64_PGTABLE),
++};
++
+ static const struct of_device_id dt_match[] = {
+ /* Set first to probe before the generic compatibles */
+ { .compatible = "amlogic,meson-gxm-mali",
+@@ -863,6 +872,7 @@ static const struct of_device_id dt_match[] = {
+ { .compatible = "mediatek,mt8186-mali", .data = &mediatek_mt8186_data },
+ { .compatible = "mediatek,mt8188-mali", .data = &mediatek_mt8188_data },
+ { .compatible = "mediatek,mt8192-mali", .data = &mediatek_mt8192_data },
++ { .compatible = "mediatek,mt8370-mali", .data = &mediatek_mt8370_data },
+ { .compatible = "allwinner,sun50i-h616-mali", .data = &allwinner_h616_data },
+ {}
+ };
+--
+2.51.0
+
--- /dev/null
+From d5956bf938dd402a3680bef657aaaeb51470e153 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 9 May 2025 12:12:49 +0200
+Subject: drm/panfrost: Commonize Mediatek power domain array definitions
+
+From: Louis-Alexis Eyraud <louisalexis.eyraud@collabora.com>
+
+[ Upstream commit bd77b870eb190c9cf5d9b7208625513e99e5be2d ]
+
+In the panfrost driver, the platform data of several Mediatek SoC
+declares and uses several different power domains arrays according to
+GPU core number present in the SoC:
+- mediatek_mt8186_pm_domains (2 cores)
+- mediatek_mt8183_pm_domains (3 cores)
+- mediatek_mt8192_pm_domains (5 cores)
+
+As they all are fixed arrays, starting with the same entries and the
+platform data also has a power domains array length field
+(num_pm_domains), they can be replaced by a single array, containing
+all entries, if the num_pm_domains field of the platform data is also
+set to the matching core number.
+
+So, create a generic power domain array (mediatek_pm_domains) and use
+it in the mt8183(b), mt8186, mt8188 and mt8192 platform data instead.
+
+Signed-off-by: Louis-Alexis Eyraud <louisalexis.eyraud@collabora.com>
+Reviewed-by: Steven Price <steven.price@arm.com>
+Signed-off-by: Steven Price <steven.price@arm.com>
+Link: https://lore.kernel.org/r/20250509-mt8370-enable-gpu-v6-3-2833888cb1d3@collabora.com
+Stable-dep-of: 81645377c231 ("drm/panfrost: Add support for Mali on the MT8370 SoC")
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/gpu/drm/panfrost/panfrost_drv.c | 27 +++++++++++--------------
+ 1 file changed, 12 insertions(+), 15 deletions(-)
+
+diff --git a/drivers/gpu/drm/panfrost/panfrost_drv.c b/drivers/gpu/drm/panfrost/panfrost_drv.c
+index 7b899a9b2120c..21b28bef84015 100644
+--- a/drivers/gpu/drm/panfrost/panfrost_drv.c
++++ b/drivers/gpu/drm/panfrost/panfrost_drv.c
+@@ -789,6 +789,8 @@ static const struct panfrost_compatible amlogic_data = {
+ .vendor_quirk = panfrost_gpu_amlogic_quirk,
+ };
+
++static const char * const mediatek_pm_domains[] = { "core0", "core1", "core2",
++ "core3", "core4" };
+ /*
+ * The old data with two power supplies for MT8183 is here only to
+ * keep retro-compatibility with older devicetrees, as DVFS will
+@@ -798,48 +800,43 @@ static const struct panfrost_compatible amlogic_data = {
+ * coupled regulators instead.
+ */
+ static const char * const legacy_supplies[] = { "mali", "sram", NULL };
+-static const char * const mediatek_mt8183_pm_domains[] = { "core0", "core1", "core2" };
+ static const struct panfrost_compatible mediatek_mt8183_data = {
+ .num_supplies = ARRAY_SIZE(legacy_supplies) - 1,
+ .supply_names = legacy_supplies,
+- .num_pm_domains = ARRAY_SIZE(mediatek_mt8183_pm_domains),
+- .pm_domain_names = mediatek_mt8183_pm_domains,
++ .num_pm_domains = 3,
++ .pm_domain_names = mediatek_pm_domains,
+ };
+
+ static const struct panfrost_compatible mediatek_mt8183_b_data = {
+ .num_supplies = ARRAY_SIZE(default_supplies) - 1,
+ .supply_names = default_supplies,
+- .num_pm_domains = ARRAY_SIZE(mediatek_mt8183_pm_domains),
+- .pm_domain_names = mediatek_mt8183_pm_domains,
++ .num_pm_domains = 3,
++ .pm_domain_names = mediatek_pm_domains,
+ .pm_features = BIT(GPU_PM_CLK_DIS) | BIT(GPU_PM_VREG_OFF),
+ };
+
+-static const char * const mediatek_mt8186_pm_domains[] = { "core0", "core1" };
+ static const struct panfrost_compatible mediatek_mt8186_data = {
+ .num_supplies = ARRAY_SIZE(default_supplies) - 1,
+ .supply_names = default_supplies,
+- .num_pm_domains = ARRAY_SIZE(mediatek_mt8186_pm_domains),
+- .pm_domain_names = mediatek_mt8186_pm_domains,
++ .num_pm_domains = 2,
++ .pm_domain_names = mediatek_pm_domains,
+ .pm_features = BIT(GPU_PM_CLK_DIS) | BIT(GPU_PM_VREG_OFF),
+ };
+
+-/* MT8188 uses the same power domains and power supplies as MT8183 */
+ static const struct panfrost_compatible mediatek_mt8188_data = {
+ .num_supplies = ARRAY_SIZE(default_supplies) - 1,
+ .supply_names = default_supplies,
+- .num_pm_domains = ARRAY_SIZE(mediatek_mt8183_pm_domains),
+- .pm_domain_names = mediatek_mt8183_pm_domains,
++ .num_pm_domains = 3,
++ .pm_domain_names = mediatek_pm_domains,
+ .pm_features = BIT(GPU_PM_CLK_DIS) | BIT(GPU_PM_VREG_OFF),
+ .gpu_quirks = BIT(GPU_QUIRK_FORCE_AARCH64_PGTABLE),
+ };
+
+-static const char * const mediatek_mt8192_pm_domains[] = { "core0", "core1", "core2",
+- "core3", "core4" };
+ static const struct panfrost_compatible mediatek_mt8192_data = {
+ .num_supplies = ARRAY_SIZE(default_supplies) - 1,
+ .supply_names = default_supplies,
+- .num_pm_domains = ARRAY_SIZE(mediatek_mt8192_pm_domains),
+- .pm_domain_names = mediatek_mt8192_pm_domains,
++ .num_pm_domains = 5,
++ .pm_domain_names = mediatek_pm_domains,
+ .pm_features = BIT(GPU_PM_CLK_DIS) | BIT(GPU_PM_VREG_OFF),
+ .gpu_quirks = BIT(GPU_QUIRK_FORCE_AARCH64_PGTABLE),
+ };
+--
+2.51.0
+
--- /dev/null
+From ba8a94b1728d25d446b95b52e2d2a52ff439ad84 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 9 May 2025 12:12:48 +0200
+Subject: drm/panfrost: Drop duplicated Mediatek supplies arrays
+
+From: Louis-Alexis Eyraud <louisalexis.eyraud@collabora.com>
+
+[ Upstream commit 6905b0d9813176087fc0f28bc5e4ee2b86e6ce13 ]
+
+In the panfrost driver, the platform data of several Mediatek SoC
+declares and uses custom supplies array definitions
+(mediatek_mt8192_supplies, mediatek_mt8183_b_supplies), that are the
+same as default_supplies (used by default platform data).
+
+So drop these duplicated definitions and use default_supplies instead.
+Also, rename mediatek_mt8183_supplies to a more generic name too
+(legacy_supplies).
+
+Signed-off-by: Louis-Alexis Eyraud <louisalexis.eyraud@collabora.com>
+Reviewed-by: Steven Price <steven.price@arm.com>
+Signed-off-by: Steven Price <steven.price@arm.com>
+Link: https://lore.kernel.org/r/20250509-mt8370-enable-gpu-v6-2-2833888cb1d3@collabora.com
+Stable-dep-of: 81645377c231 ("drm/panfrost: Add support for Mali on the MT8370 SoC")
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/gpu/drm/panfrost/panfrost_drv.c | 24 +++++++++++-------------
+ 1 file changed, 11 insertions(+), 13 deletions(-)
+
+diff --git a/drivers/gpu/drm/panfrost/panfrost_drv.c b/drivers/gpu/drm/panfrost/panfrost_drv.c
+index f1ec3b02f15a0..7b899a9b2120c 100644
+--- a/drivers/gpu/drm/panfrost/panfrost_drv.c
++++ b/drivers/gpu/drm/panfrost/panfrost_drv.c
+@@ -797,19 +797,18 @@ static const struct panfrost_compatible amlogic_data = {
+ * On new devicetrees please use the _b variant with a single and
+ * coupled regulators instead.
+ */
+-static const char * const mediatek_mt8183_supplies[] = { "mali", "sram", NULL };
++static const char * const legacy_supplies[] = { "mali", "sram", NULL };
+ static const char * const mediatek_mt8183_pm_domains[] = { "core0", "core1", "core2" };
+ static const struct panfrost_compatible mediatek_mt8183_data = {
+- .num_supplies = ARRAY_SIZE(mediatek_mt8183_supplies) - 1,
+- .supply_names = mediatek_mt8183_supplies,
++ .num_supplies = ARRAY_SIZE(legacy_supplies) - 1,
++ .supply_names = legacy_supplies,
+ .num_pm_domains = ARRAY_SIZE(mediatek_mt8183_pm_domains),
+ .pm_domain_names = mediatek_mt8183_pm_domains,
+ };
+
+-static const char * const mediatek_mt8183_b_supplies[] = { "mali", NULL };
+ static const struct panfrost_compatible mediatek_mt8183_b_data = {
+- .num_supplies = ARRAY_SIZE(mediatek_mt8183_b_supplies) - 1,
+- .supply_names = mediatek_mt8183_b_supplies,
++ .num_supplies = ARRAY_SIZE(default_supplies) - 1,
++ .supply_names = default_supplies,
+ .num_pm_domains = ARRAY_SIZE(mediatek_mt8183_pm_domains),
+ .pm_domain_names = mediatek_mt8183_pm_domains,
+ .pm_features = BIT(GPU_PM_CLK_DIS) | BIT(GPU_PM_VREG_OFF),
+@@ -817,8 +816,8 @@ static const struct panfrost_compatible mediatek_mt8183_b_data = {
+
+ static const char * const mediatek_mt8186_pm_domains[] = { "core0", "core1" };
+ static const struct panfrost_compatible mediatek_mt8186_data = {
+- .num_supplies = ARRAY_SIZE(mediatek_mt8183_b_supplies) - 1,
+- .supply_names = mediatek_mt8183_b_supplies,
++ .num_supplies = ARRAY_SIZE(default_supplies) - 1,
++ .supply_names = default_supplies,
+ .num_pm_domains = ARRAY_SIZE(mediatek_mt8186_pm_domains),
+ .pm_domain_names = mediatek_mt8186_pm_domains,
+ .pm_features = BIT(GPU_PM_CLK_DIS) | BIT(GPU_PM_VREG_OFF),
+@@ -826,20 +825,19 @@ static const struct panfrost_compatible mediatek_mt8186_data = {
+
+ /* MT8188 uses the same power domains and power supplies as MT8183 */
+ static const struct panfrost_compatible mediatek_mt8188_data = {
+- .num_supplies = ARRAY_SIZE(mediatek_mt8183_b_supplies) - 1,
+- .supply_names = mediatek_mt8183_b_supplies,
++ .num_supplies = ARRAY_SIZE(default_supplies) - 1,
++ .supply_names = default_supplies,
+ .num_pm_domains = ARRAY_SIZE(mediatek_mt8183_pm_domains),
+ .pm_domain_names = mediatek_mt8183_pm_domains,
+ .pm_features = BIT(GPU_PM_CLK_DIS) | BIT(GPU_PM_VREG_OFF),
+ .gpu_quirks = BIT(GPU_QUIRK_FORCE_AARCH64_PGTABLE),
+ };
+
+-static const char * const mediatek_mt8192_supplies[] = { "mali", NULL };
+ static const char * const mediatek_mt8192_pm_domains[] = { "core0", "core1", "core2",
+ "core3", "core4" };
+ static const struct panfrost_compatible mediatek_mt8192_data = {
+- .num_supplies = ARRAY_SIZE(mediatek_mt8192_supplies) - 1,
+- .supply_names = mediatek_mt8192_supplies,
++ .num_supplies = ARRAY_SIZE(default_supplies) - 1,
++ .supply_names = default_supplies,
+ .num_pm_domains = ARRAY_SIZE(mediatek_mt8192_pm_domains),
+ .pm_domain_names = mediatek_mt8192_pm_domains,
+ .pm_features = BIT(GPU_PM_CLK_DIS) | BIT(GPU_PM_VREG_OFF),
+--
+2.51.0
+
--- /dev/null
+From 8e01c0e2e9aaf018d6a8b0b9d009775caf5bfae3 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sat, 20 Sep 2025 11:51:48 +0900
+Subject: firewire: core: fix overlooked update of subsystem ABI version
+
+From: Takashi Sakamoto <o-takashi@sakamocchi.jp>
+
+[ Upstream commit 853a57ba263adfecf4430b936d6862bc475b4bb5 ]
+
+In kernel v6.5, several functions were added to the cdev layer. This
+required updating the default version of subsystem ABI up to 6, but
+this requirement was overlooked.
+
+This commit updates the version accordingly.
+
+Fixes: 6add87e9764d ("firewire: cdev: add new version of ABI to notify time stamp at request/response subaction of transaction#")
+Link: https://lore.kernel.org/r/20250920025148.163402-1-o-takashi@sakamocchi.jp
+Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/firewire/core-cdev.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/firewire/core-cdev.c b/drivers/firewire/core-cdev.c
+index bd04980009a46..6a81c3fd4c860 100644
+--- a/drivers/firewire/core-cdev.c
++++ b/drivers/firewire/core-cdev.c
+@@ -41,7 +41,7 @@
+ /*
+ * ABI version history is documented in linux/firewire-cdev.h.
+ */
+-#define FW_CDEV_KERNEL_VERSION 5
++#define FW_CDEV_KERNEL_VERSION 6
+ #define FW_CDEV_VERSION_EVENT_REQUEST2 4
+ #define FW_CDEV_VERSION_ALLOCATE_REGION_END 4
+ #define FW_CDEV_VERSION_AUTO_FLUSH_ISO_OVERFLOW 5
+--
+2.51.0
+
--- /dev/null
+From c175c38a14919414e73f6de6f400163d0220ccf1 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 14 Aug 2025 13:34:29 -0500
+Subject: gpiolib: acpi: Add quirk for ASUS ProArt PX13
+
+From: Mario Limonciello (AMD) <superm1@kernel.org>
+
+[ Upstream commit 23800ad1265f10c2bc6f42154ce4d20e59f2900e ]
+
+The ASUS ProArt PX13 has a spurious wakeup event from the touchpad
+a few moments after entering hardware sleep. This can be avoided
+by preventing the touchpad from being a wake source.
+
+Add to the wakeup ignore list.
+
+Reported-by: Amit Chaudhari <amitchaudhari@mac.com>
+Closes: https://gitlab.freedesktop.org/drm/amd/-/issues/4482
+Tested-by: Amit Chaudhari <amitchaudhari@mac.com>
+Signed-off-by: Mario Limonciello (AMD) <superm1@kernel.org>
+Reviewed-by: Mika Westerberg <mika.westerberg@linux.intel.com>
+Link: https://lore.kernel.org/20250814183430.3887973-1-superm1@kernel.org
+Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/gpio/gpiolib-acpi-quirks.c | 14 ++++++++++++++
+ 1 file changed, 14 insertions(+)
+
+diff --git a/drivers/gpio/gpiolib-acpi-quirks.c b/drivers/gpio/gpiolib-acpi-quirks.c
+index c13545dce3492..bfb04e67c4bc8 100644
+--- a/drivers/gpio/gpiolib-acpi-quirks.c
++++ b/drivers/gpio/gpiolib-acpi-quirks.c
+@@ -344,6 +344,20 @@ static const struct dmi_system_id gpiolib_acpi_quirks[] __initconst = {
+ .ignore_interrupt = "AMDI0030:00@8",
+ },
+ },
++ {
++ /*
++ * Spurious wakeups from TP_ATTN# pin
++ * Found in BIOS 5.35
++ * https://gitlab.freedesktop.org/drm/amd/-/issues/4482
++ */
++ .matches = {
++ DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
++ DMI_MATCH(DMI_PRODUCT_FAMILY, "ProArt PX13"),
++ },
++ .driver_data = &(struct acpi_gpiolib_dmi_quirk) {
++ .ignore_wake = "ASCP1A00:00@8",
++ },
++ },
+ {} /* Terminating entry */
+ };
+
+--
+2.51.0
+
--- /dev/null
+From bfaca0e9326e817fd5bff79f2676ccb98b4b27ff Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 18 Sep 2025 18:02:02 +0530
+Subject: HID: amd_sfh: Add sync across amd sfh work functions
+
+From: Basavaraj Natikar <Basavaraj.Natikar@amd.com>
+
+[ Upstream commit bba920e6f803138587248079de47ad3464a396f6 ]
+
+The process of the report is delegated across different work functions.
+Hence, add a sync mechanism to protect SFH work data across functions.
+
+Fixes: 4b2c53d93a4b ("SFH:Transport Driver to add support of AMD Sensor Fusion Hub (SFH)")
+Reported-by: Matthew Schwartz <matthew.schwartz@linux.dev>
+Closes: https://lore.kernel.org/all/a21abca5-4268-449d-95f1-bdd7a25894a5@linux.dev/
+Tested-by: Prakruthi SP <Prakruthi.SP@amd.com>
+Co-developed-by: Akshata MukundShetty <akshata.mukundshetty@amd.com>
+Signed-off-by: Akshata MukundShetty <akshata.mukundshetty@amd.com>
+Signed-off-by: Basavaraj Natikar <Basavaraj.Natikar@amd.com>
+Reviewed-by: Mario Limonciello (AMD) <superm1@kernel.org>
+Signed-off-by: Jiri Kosina <jkosina@suse.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/hid/amd-sfh-hid/amd_sfh_client.c | 12 ++++++++++--
+ drivers/hid/amd-sfh-hid/amd_sfh_common.h | 3 +++
+ drivers/hid/amd-sfh-hid/amd_sfh_pcie.c | 4 ++++
+ 3 files changed, 17 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/hid/amd-sfh-hid/amd_sfh_client.c b/drivers/hid/amd-sfh-hid/amd_sfh_client.c
+index 3438d392920fa..8dae9a7766853 100644
+--- a/drivers/hid/amd-sfh-hid/amd_sfh_client.c
++++ b/drivers/hid/amd-sfh-hid/amd_sfh_client.c
+@@ -39,8 +39,12 @@ int amd_sfh_get_report(struct hid_device *hid, int report_id, int report_type)
+ struct amdtp_hid_data *hid_data = hid->driver_data;
+ struct amdtp_cl_data *cli_data = hid_data->cli_data;
+ struct request_list *req_list = &cli_data->req_list;
++ struct amd_input_data *in_data = cli_data->in_data;
++ struct amd_mp2_dev *mp2;
+ int i;
+
++ mp2 = container_of(in_data, struct amd_mp2_dev, in_data);
++ guard(mutex)(&mp2->lock);
+ for (i = 0; i < cli_data->num_hid_devices; i++) {
+ if (cli_data->hid_sensor_hubs[i] == hid) {
+ struct request_list *new = kzalloc(sizeof(*new), GFP_KERNEL);
+@@ -75,6 +79,8 @@ void amd_sfh_work(struct work_struct *work)
+ u8 report_id, node_type;
+ u8 report_size = 0;
+
++ mp2 = container_of(in_data, struct amd_mp2_dev, in_data);
++ guard(mutex)(&mp2->lock);
+ req_node = list_last_entry(&req_list->list, struct request_list, list);
+ list_del(&req_node->list);
+ current_index = req_node->current_index;
+@@ -83,7 +89,6 @@ void amd_sfh_work(struct work_struct *work)
+ node_type = req_node->report_type;
+ kfree(req_node);
+
+- mp2 = container_of(in_data, struct amd_mp2_dev, in_data);
+ mp2_ops = mp2->mp2_ops;
+ if (node_type == HID_FEATURE_REPORT) {
+ report_size = mp2_ops->get_feat_rep(sensor_index, report_id,
+@@ -107,6 +112,8 @@ void amd_sfh_work(struct work_struct *work)
+ cli_data->cur_hid_dev = current_index;
+ cli_data->sensor_requested_cnt[current_index] = 0;
+ amdtp_hid_wakeup(cli_data->hid_sensor_hubs[current_index]);
++ if (!list_empty(&req_list->list))
++ schedule_delayed_work(&cli_data->work, 0);
+ }
+
+ void amd_sfh_work_buffer(struct work_struct *work)
+@@ -117,9 +124,10 @@ void amd_sfh_work_buffer(struct work_struct *work)
+ u8 report_size;
+ int i;
+
++ mp2 = container_of(in_data, struct amd_mp2_dev, in_data);
++ guard(mutex)(&mp2->lock);
+ for (i = 0; i < cli_data->num_hid_devices; i++) {
+ if (cli_data->sensor_sts[i] == SENSOR_ENABLED) {
+- mp2 = container_of(in_data, struct amd_mp2_dev, in_data);
+ report_size = mp2->mp2_ops->get_in_rep(i, cli_data->sensor_idx[i],
+ cli_data->report_id[i], in_data);
+ hid_input_report(cli_data->hid_sensor_hubs[i], HID_INPUT_REPORT,
+diff --git a/drivers/hid/amd-sfh-hid/amd_sfh_common.h b/drivers/hid/amd-sfh-hid/amd_sfh_common.h
+index f44a3bb2fbd4f..78f830c133e5c 100644
+--- a/drivers/hid/amd-sfh-hid/amd_sfh_common.h
++++ b/drivers/hid/amd-sfh-hid/amd_sfh_common.h
+@@ -10,6 +10,7 @@
+ #ifndef AMD_SFH_COMMON_H
+ #define AMD_SFH_COMMON_H
+
++#include <linux/mutex.h>
+ #include <linux/pci.h>
+ #include "amd_sfh_hid.h"
+
+@@ -59,6 +60,8 @@ struct amd_mp2_dev {
+ u32 mp2_acs;
+ struct sfh_dev_status dev_en;
+ struct work_struct work;
++ /* mp2 to protect data */
++ struct mutex lock;
+ u8 init_done;
+ u8 rver;
+ };
+diff --git a/drivers/hid/amd-sfh-hid/amd_sfh_pcie.c b/drivers/hid/amd-sfh-hid/amd_sfh_pcie.c
+index 1c1fd63330c93..9a669c18a132f 100644
+--- a/drivers/hid/amd-sfh-hid/amd_sfh_pcie.c
++++ b/drivers/hid/amd-sfh-hid/amd_sfh_pcie.c
+@@ -462,6 +462,10 @@ static int amd_mp2_pci_probe(struct pci_dev *pdev, const struct pci_device_id *i
+ if (!privdata->cl_data)
+ return -ENOMEM;
+
++ rc = devm_mutex_init(&pdev->dev, &privdata->lock);
++ if (rc)
++ return rc;
++
+ privdata->sfh1_1_ops = (const struct amd_sfh1_1_ops *)id->driver_data;
+ if (privdata->sfh1_1_ops) {
+ if (boot_cpu_data.x86 >= 0x1A)
+--
+2.51.0
+
--- /dev/null
+From 0d34bdade971798913a9fbbd9b6b662c604198ca Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 4 Sep 2025 18:42:07 +0200
+Subject: HID: cp2112: fix setter callbacks return value
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Sébastien Szymanski <sebastien.szymanski@armadeus.com>
+
+[ Upstream commit 2a5e76b9a0efc44807ff0e6b141649fac65a55ac ]
+
+Since commit 6485543488a6 ("HID: cp2112: use new line value setter
+callbacks"), setting a GPIO value always fails with error -EBADE.
+
+That's because the returned value by the setter callbacks is the
+returned value by the hid_hw_raw_request() function which is the number of
+bytes sent on success or a negative value on error. The function
+gpiochip_set() returns -EBADE if the setter callbacks return a value >
+0.
+
+Fix this by making the setter callbacks return 0 on success or a negative
+value on error.
+
+While at it, use the returned value by cp2112_gpio_set_unlocked() in the
+direction_output callback.
+
+Fixes: 6485543488a6 ("HID: cp2112: use new line value setter callbacks")
+Signed-off-by: Sébastien Szymanski <sebastien.szymanski@armadeus.com>
+Reviewed-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
+Signed-off-by: Jiri Kosina <jkosina@suse.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/hid/hid-cp2112.c | 10 +++++-----
+ 1 file changed, 5 insertions(+), 5 deletions(-)
+
+diff --git a/drivers/hid/hid-cp2112.c b/drivers/hid/hid-cp2112.c
+index 234fa82eab079..b5f2b6356f512 100644
+--- a/drivers/hid/hid-cp2112.c
++++ b/drivers/hid/hid-cp2112.c
+@@ -229,10 +229,12 @@ static int cp2112_gpio_set_unlocked(struct cp2112_device *dev,
+ ret = hid_hw_raw_request(hdev, CP2112_GPIO_SET, buf,
+ CP2112_GPIO_SET_LENGTH, HID_FEATURE_REPORT,
+ HID_REQ_SET_REPORT);
+- if (ret < 0)
++ if (ret != CP2112_GPIO_SET_LENGTH) {
+ hid_err(hdev, "error setting GPIO values: %d\n", ret);
++ return ret < 0 ? ret : -EIO;
++ }
+
+- return ret;
++ return 0;
+ }
+
+ static int cp2112_gpio_set(struct gpio_chip *chip, unsigned int offset,
+@@ -309,9 +311,7 @@ static int cp2112_gpio_direction_output(struct gpio_chip *chip,
+ * Set gpio value when output direction is already set,
+ * as specified in AN495, Rev. 0.2, cpt. 4.4
+ */
+- cp2112_gpio_set_unlocked(dev, offset, value);
+-
+- return 0;
++ return cp2112_gpio_set_unlocked(dev, offset, value);
+ }
+
+ static int cp2112_hid_get(struct hid_device *hdev, unsigned char report_number,
+--
+2.51.0
+
--- /dev/null
+From 2b4c2aa0ee0f045d788eac348125112de31d8154 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 27 May 2025 22:13:13 +0530
+Subject: HID: multitouch: Get the contact ID from HID_DG_TRANSDUCER_INDEX
+ fields in case of Apple Touch Bar
+
+From: Kerem Karabay <kekrby@gmail.com>
+
+[ Upstream commit f41d736acc039d86512951f4e874b0f5e666babf ]
+
+In Apple Touch Bar, the contact ID is contained in fields with the
+HID_DG_TRANSDUCER_INDEX usage rather than HID_DG_CONTACTID, thus differing
+from the HID spec. Add a quirk for the same.
+
+Acked-by: Benjamin Tissoires <bentiss@kernel.org>
+Signed-off-by: Kerem Karabay <kekrby@gmail.com>
+Co-developed-by: Aditya Garg <gargaditya08@live.com>
+Signed-off-by: Aditya Garg <gargaditya08@live.com>
+Signed-off-by: Jiri Kosina <jkosina@suse.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/hid/hid-multitouch.c | 16 +++++++++++++++-
+ 1 file changed, 15 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/hid/hid-multitouch.c b/drivers/hid/hid-multitouch.c
+index 4c22bd2ba1708..c1be2978c0987 100644
+--- a/drivers/hid/hid-multitouch.c
++++ b/drivers/hid/hid-multitouch.c
+@@ -73,6 +73,7 @@ MODULE_LICENSE("GPL");
+ #define MT_QUIRK_FORCE_MULTI_INPUT BIT(20)
+ #define MT_QUIRK_DISABLE_WAKEUP BIT(21)
+ #define MT_QUIRK_ORIENTATION_INVERT BIT(22)
++#define MT_QUIRK_APPLE_TOUCHBAR BIT(23)
+
+ #define MT_INPUTMODE_TOUCHSCREEN 0x02
+ #define MT_INPUTMODE_TOUCHPAD 0x03
+@@ -625,6 +626,7 @@ static struct mt_application *mt_find_application(struct mt_device *td,
+ static struct mt_report_data *mt_allocate_report_data(struct mt_device *td,
+ struct hid_report *report)
+ {
++ struct mt_class *cls = &td->mtclass;
+ struct mt_report_data *rdata;
+ struct hid_field *field;
+ int r, n;
+@@ -649,7 +651,11 @@ static struct mt_report_data *mt_allocate_report_data(struct mt_device *td,
+
+ if (field->logical == HID_DG_FINGER || td->hdev->group != HID_GROUP_MULTITOUCH_WIN_8) {
+ for (n = 0; n < field->report_count; n++) {
+- if (field->usage[n].hid == HID_DG_CONTACTID) {
++ unsigned int hid = field->usage[n].hid;
++
++ if (hid == HID_DG_CONTACTID ||
++ (cls->quirks & MT_QUIRK_APPLE_TOUCHBAR &&
++ hid == HID_DG_TRANSDUCER_INDEX)) {
+ rdata->is_mt_collection = true;
+ break;
+ }
+@@ -827,6 +833,14 @@ static int mt_touch_input_mapping(struct hid_device *hdev, struct hid_input *hi,
+ EV_KEY, BTN_TOUCH);
+ MT_STORE_FIELD(tip_state);
+ return 1;
++ case HID_DG_TRANSDUCER_INDEX:
++ /*
++ * Contact ID in case of Apple Touch Bars is contained
++ * in fields with HID_DG_TRANSDUCER_INDEX usage.
++ */
++ if (!(cls->quirks & MT_QUIRK_APPLE_TOUCHBAR))
++ return 0;
++ fallthrough;
+ case HID_DG_CONTACTID:
+ MT_STORE_FIELD(contactid);
+ app->touches_by_report++;
+--
+2.51.0
+
--- /dev/null
+From 73d04f08aaa905e59dd83e286f5a136b211c1e8c Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 27 May 2025 22:13:16 +0530
+Subject: HID: multitouch: specify that Apple Touch Bar is direct
+
+From: Kerem Karabay <kekrby@gmail.com>
+
+[ Upstream commit 45ca23c5ee8b2b3074377fecc92fa72aa595f7c9 ]
+
+Currently the driver determines the device type based on the
+application, but this value is not reliable on Apple Touch Bar, where
+the application is HID_DG_TOUCHPAD even though this device is direct,
+so add a quirk for the same.
+
+Acked-by: Benjamin Tissoires <bentiss@kernel.org>
+Signed-off-by: Kerem Karabay <kekrby@gmail.com>
+Co-developed-by: Aditya Garg <gargaditya08@live.com>
+Signed-off-by: Aditya Garg <gargaditya08@live.com>
+Signed-off-by: Jiri Kosina <jkosina@suse.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/hid/hid-multitouch.c | 7 +++++++
+ 1 file changed, 7 insertions(+)
+
+diff --git a/drivers/hid/hid-multitouch.c b/drivers/hid/hid-multitouch.c
+index c9f9f21a6ec6b..edb8da49d9167 100644
+--- a/drivers/hid/hid-multitouch.c
++++ b/drivers/hid/hid-multitouch.c
+@@ -1349,6 +1349,13 @@ static int mt_touch_input_configured(struct hid_device *hdev,
+ if (td->serial_maybe)
+ mt_post_parse_default_settings(td, app);
+
++ /*
++ * The application for Apple Touch Bars is HID_DG_TOUCHPAD,
++ * but these devices are direct.
++ */
++ if (cls->quirks & MT_QUIRK_APPLE_TOUCHBAR)
++ app->mt_flags |= INPUT_MT_DIRECT;
++
+ if (cls->is_indirect)
+ app->mt_flags |= INPUT_MT_POINTER;
+
+--
+2.51.0
+
--- /dev/null
+From 16532132671468af37504e1bdb68288d5b01ed4e Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 27 May 2025 22:13:14 +0530
+Subject: HID: multitouch: support getting the tip state from HID_DG_TOUCH
+ fields in Apple Touch Bar
+
+From: Kerem Karabay <kekrby@gmail.com>
+
+[ Upstream commit e0976a61a543b5e03bc0d08030a0ea036ee3751d ]
+
+In Apple Touch Bar, the tip state is contained in fields with the
+HID_DG_TOUCH usage. This feature is gated by a quirk in order to
+prevent breaking other devices, see commit c2ef8f21ea8f
+("HID: multitouch: add support for trackpads").
+
+Acked-by: Benjamin Tissoires <bentiss@kernel.org>
+Signed-off-by: Kerem Karabay <kekrby@gmail.com>
+Co-developed-by: Aditya Garg <gargaditya08@live.com>
+Signed-off-by: Aditya Garg <gargaditya08@live.com>
+Signed-off-by: Jiri Kosina <jkosina@suse.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/hid/hid-multitouch.c | 15 +++++++++++----
+ 1 file changed, 11 insertions(+), 4 deletions(-)
+
+diff --git a/drivers/hid/hid-multitouch.c b/drivers/hid/hid-multitouch.c
+index c1be2978c0987..20e0958d0fa9f 100644
+--- a/drivers/hid/hid-multitouch.c
++++ b/drivers/hid/hid-multitouch.c
+@@ -827,6 +827,17 @@ static int mt_touch_input_mapping(struct hid_device *hdev, struct hid_input *hi,
+
+ MT_STORE_FIELD(confidence_state);
+ return 1;
++ case HID_DG_TOUCH:
++ /*
++ * Legacy devices use TIPSWITCH and not TOUCH.
++ * One special case here is of the Apple Touch Bars.
++ * In these devices, the tip state is contained in
++ * fields with the HID_DG_TOUCH usage.
++ * Let's just ignore this field for other devices.
++ */
++ if (!(cls->quirks & MT_QUIRK_APPLE_TOUCHBAR))
++ return -1;
++ fallthrough;
+ case HID_DG_TIPSWITCH:
+ if (field->application != HID_GD_SYSTEM_MULTIAXIS)
+ input_set_capability(hi->input,
+@@ -897,10 +908,6 @@ static int mt_touch_input_mapping(struct hid_device *hdev, struct hid_input *hi,
+ case HID_DG_CONTACTMAX:
+ /* contact max are global to the report */
+ return -1;
+- case HID_DG_TOUCH:
+- /* Legacy devices use TIPSWITCH and not TOUCH.
+- * Let's just ignore this field. */
+- return -1;
+ }
+ /* let hid-input decide for the others */
+ return 0;
+--
+2.51.0
+
--- /dev/null
+From 4c1a276b705de6fddcbfc1a096ea869da02992e0 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 27 May 2025 22:13:15 +0530
+Subject: HID: multitouch: take cls->maxcontacts into account for Apple Touch
+ Bar even without a HID_DG_CONTACTMAX field
+
+From: Kerem Karabay <kekrby@gmail.com>
+
+[ Upstream commit 7dfe48bdc9d38db46283f2e0281bc1626277b8bf ]
+
+In Apple Touch Bar, the HID_DG_CONTACTMAX is not present, but the maximum
+contact count is still greater than the default. Add quirks for the same.
+
+Acked-by: Benjamin Tissoires <bentiss@kernel.org>
+Signed-off-by: Kerem Karabay <kekrby@gmail.com>
+Co-developed-by: Aditya Garg <gargaditya08@live.com>
+Signed-off-by: Aditya Garg <gargaditya08@live.com>
+Signed-off-by: Jiri Kosina <jkosina@suse.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/hid/hid-multitouch.c | 7 +++++++
+ 1 file changed, 7 insertions(+)
+
+diff --git a/drivers/hid/hid-multitouch.c b/drivers/hid/hid-multitouch.c
+index 20e0958d0fa9f..c9f9f21a6ec6b 100644
+--- a/drivers/hid/hid-multitouch.c
++++ b/drivers/hid/hid-multitouch.c
+@@ -1335,6 +1335,13 @@ static int mt_touch_input_configured(struct hid_device *hdev,
+ struct input_dev *input = hi->input;
+ int ret;
+
++ /*
++ * HID_DG_CONTACTMAX field is not present on Apple Touch Bars,
++ * but the maximum contact count is greater than the default.
++ */
++ if (cls->quirks & MT_QUIRK_APPLE_TOUCHBAR && cls->maxcontacts)
++ td->maxcontacts = cls->maxcontacts;
++
+ if (!td->maxcontacts)
+ td->maxcontacts = MT_DEFAULT_MAXCONTACT;
+
+--
+2.51.0
+
--- /dev/null
+From 065d51137325b35e03432850e97842bd682e478a Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 1 Jul 2025 15:22:49 +0300
+Subject: i2c: designware: Add quirk for Intel Xe
+
+From: Heikki Krogerus <heikki.krogerus@linux.intel.com>
+
+[ Upstream commit f6a8e9f3de4567c71ef9f5f13719df69a8b96081 ]
+
+The regmap is coming from the parent also in case of Xe
+GPUs. Reusing the Wangxun quirk for that.
+
+Acked-by: Jarkko Nikula <jarkko.nikula@linux.intel.com>
+Co-developed-by: Michael J. Ruhl <michael.j.ruhl@intel.com>
+Signed-off-by: Michael J. Ruhl <michael.j.ruhl@intel.com>
+Signed-off-by: Heikki Krogerus <heikki.krogerus@linux.intel.com>
+Reviewed-by: Andi Shyti <andi.shyti@kernel.org>
+Link: https://lore.kernel.org/r/20250701122252.2590230-3-heikki.krogerus@linux.intel.com
+Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
+[Rodrigo fixed the co-developed tags while merging]
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/i2c/busses/i2c-designware-platdrv.c | 7 +++++--
+ 1 file changed, 5 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/i2c/busses/i2c-designware-platdrv.c b/drivers/i2c/busses/i2c-designware-platdrv.c
+index 879719e91df2a..c1262df02cdb2 100644
+--- a/drivers/i2c/busses/i2c-designware-platdrv.c
++++ b/drivers/i2c/busses/i2c-designware-platdrv.c
+@@ -101,7 +101,7 @@ static int bt1_i2c_request_regs(struct dw_i2c_dev *dev)
+ }
+ #endif
+
+-static int txgbe_i2c_request_regs(struct dw_i2c_dev *dev)
++static int dw_i2c_get_parent_regmap(struct dw_i2c_dev *dev)
+ {
+ dev->map = dev_get_regmap(dev->dev->parent, NULL);
+ if (!dev->map)
+@@ -123,12 +123,15 @@ static int dw_i2c_plat_request_regs(struct dw_i2c_dev *dev)
+ struct platform_device *pdev = to_platform_device(dev->dev);
+ int ret;
+
++ if (device_is_compatible(dev->dev, "intel,xe-i2c"))
++ return dw_i2c_get_parent_regmap(dev);
++
+ switch (dev->flags & MODEL_MASK) {
+ case MODEL_BAIKAL_BT1:
+ ret = bt1_i2c_request_regs(dev);
+ break;
+ case MODEL_WANGXUN_SP:
+- ret = txgbe_i2c_request_regs(dev);
++ ret = dw_i2c_get_parent_regmap(dev);
+ break;
+ default:
+ dev->base = devm_platform_ioremap_resource(pdev, 0);
+--
+2.51.0
+
--- /dev/null
+From cd1edadf90b093fda95efd95930df7fe554520cc Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 13 Aug 2025 15:43:20 +0300
+Subject: IB/mlx5: Fix obj_type mismatch for SRQ event subscriptions
+
+From: Or Har-Toov <ohartoov@nvidia.com>
+
+[ Upstream commit 85fe9f565d2d5af95ac2bbaa5082b8ce62b039f5 ]
+
+Fix a bug where the driver's event subscription logic for SRQ-related
+events incorrectly sets obj_type for RMP objects.
+
+When subscribing to SRQ events, get_legacy_obj_type() did not handle
+the MLX5_CMD_OP_CREATE_RMP case, which caused obj_type to be 0
+(default).
+This led to a mismatch between the obj_type used during subscription
+(0) and the value used during notification (1, taken from the event's
+type field). As a result, event mapping for SRQ objects could fail and
+event notification would not be delivered correctly.
+
+This fix adds handling for MLX5_CMD_OP_CREATE_RMP in get_legacy_obj_type,
+returning MLX5_EVENT_QUEUE_TYPE_RQ so obj_type is consistent between
+subscription and notification.
+
+Fixes: 759738537142 ("IB/mlx5: Enable subscription for device events over DEVX")
+Link: https://patch.msgid.link/r/8f1048e3fdd1fde6b90607ce0ed251afaf8a148c.1755088962.git.leon@kernel.org
+Signed-off-by: Or Har-Toov <ohartoov@nvidia.com>
+Reviewed-by: Edward Srouji <edwards@nvidia.com>
+Signed-off-by: Leon Romanovsky <leonro@nvidia.com>
+Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/infiniband/hw/mlx5/devx.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/drivers/infiniband/hw/mlx5/devx.c b/drivers/infiniband/hw/mlx5/devx.c
+index c369fee335621..00727472c8738 100644
+--- a/drivers/infiniband/hw/mlx5/devx.c
++++ b/drivers/infiniband/hw/mlx5/devx.c
+@@ -233,6 +233,7 @@ static u16 get_legacy_obj_type(u16 opcode)
+ {
+ switch (opcode) {
+ case MLX5_CMD_OP_CREATE_RQ:
++ case MLX5_CMD_OP_CREATE_RMP:
+ return MLX5_EVENT_QUEUE_TYPE_RQ;
+ case MLX5_CMD_OP_CREATE_QP:
+ return MLX5_EVENT_QUEUE_TYPE_QP;
+--
+2.51.0
+
--- /dev/null
+From 44d1ab5475078b5fc07110ea7b25bd4c34aca78b Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 17 Jun 2025 15:25:52 +0200
+Subject: mmc: sdhci-cadence: add Mobileye eyeQ support
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Benoît Monin <benoit.monin@bootlin.com>
+
+[ Upstream commit 120ffe250dd95b5089d032f582c5be9e3a04b94b ]
+
+The MMC/SDHCI controller implemented by Mobileye needs the preset value
+quirks to configure the clock properly at speed slower than HS200.
+It otherwise works as a standard sd4hc controller.
+
+Signed-off-by: Benoît Monin <benoit.monin@bootlin.com>
+Link: https://lore.kernel.org/r/e97f409650495791e07484589e1666ead570fa12.1750156323.git.benoit.monin@bootlin.com
+Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/mmc/host/sdhci-cadence.c | 11 +++++++++++
+ 1 file changed, 11 insertions(+)
+
+diff --git a/drivers/mmc/host/sdhci-cadence.c b/drivers/mmc/host/sdhci-cadence.c
+index a94b297fcf2a3..60ca09780da32 100644
+--- a/drivers/mmc/host/sdhci-cadence.c
++++ b/drivers/mmc/host/sdhci-cadence.c
+@@ -433,6 +433,13 @@ static const struct sdhci_cdns_drv_data sdhci_elba_drv_data = {
+ },
+ };
+
++static const struct sdhci_cdns_drv_data sdhci_eyeq_drv_data = {
++ .pltfm_data = {
++ .ops = &sdhci_cdns_ops,
++ .quirks2 = SDHCI_QUIRK2_PRESET_VALUE_BROKEN,
++ },
++};
++
+ static const struct sdhci_cdns_drv_data sdhci_cdns_drv_data = {
+ .pltfm_data = {
+ .ops = &sdhci_cdns_ops,
+@@ -595,6 +602,10 @@ static const struct of_device_id sdhci_cdns_match[] = {
+ .compatible = "amd,pensando-elba-sd4hc",
+ .data = &sdhci_elba_drv_data,
+ },
++ {
++ .compatible = "mobileye,eyeq-sd4hc",
++ .data = &sdhci_eyeq_drv_data,
++ },
+ { .compatible = "cdns,sd4hc" },
+ { /* sentinel */ }
+ };
+--
+2.51.0
+
--- /dev/null
+From ade2cc7270d961115a53eb68df51f8a8cc9b2fe6 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 18 Jun 2025 14:00:05 +0200
+Subject: net: fec: rename struct fec_devinfo fec_imx6x_info -> fec_imx6sx_info
+
+From: Marc Kleine-Budde <mkl@pengutronix.de>
+
+[ Upstream commit 4e8594a88656fa86a9d2b1e72770432470b6dc0c ]
+
+In da722186f654 ("net: fec: set GPR bit on suspend by DT
+configuration.") the platform_device_id fec_devtype::driver_data was
+converted from holding the quirks to a pointing to struct fec_devinfo.
+
+The struct fec_devinfo holding the information for the i.MX6SX was
+named fec_imx6x_info.
+
+Rename fec_imx6x_info to fec_imx6sx_info to align with the SoC's name.
+
+Reviewed-by: Wei Fang <wei.fang@nxp.com>
+Reviewed-by: Frank Li <Frank.Li@nxp.com>
+Reviewed-by: Andrew Lunn <andrew@lunn.ch>
+Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
+Link: https://patch.msgid.link/20250618-fec-cleanups-v4-5-c16f9a1af124@pengutronix.de
+Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/ethernet/freescale/fec_main.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/net/ethernet/freescale/fec_main.c b/drivers/net/ethernet/freescale/fec_main.c
+index 5f15f42070c53..e8b37dfd5cc1d 100644
+--- a/drivers/net/ethernet/freescale/fec_main.c
++++ b/drivers/net/ethernet/freescale/fec_main.c
+@@ -131,7 +131,7 @@ static const struct fec_devinfo fec_mvf600_info = {
+ FEC_QUIRK_HAS_MDIO_C45,
+ };
+
+-static const struct fec_devinfo fec_imx6x_info = {
++static const struct fec_devinfo fec_imx6sx_info = {
+ .quirks = FEC_QUIRK_ENET_MAC | FEC_QUIRK_HAS_GBIT |
+ FEC_QUIRK_HAS_BUFDESC_EX | FEC_QUIRK_HAS_CSUM |
+ FEC_QUIRK_HAS_VLAN | FEC_QUIRK_HAS_AVB |
+@@ -196,7 +196,7 @@ static const struct of_device_id fec_dt_ids[] = {
+ { .compatible = "fsl,imx28-fec", .data = &fec_imx28_info, },
+ { .compatible = "fsl,imx6q-fec", .data = &fec_imx6q_info, },
+ { .compatible = "fsl,mvf600-fec", .data = &fec_mvf600_info, },
+- { .compatible = "fsl,imx6sx-fec", .data = &fec_imx6x_info, },
++ { .compatible = "fsl,imx6sx-fec", .data = &fec_imx6sx_info, },
+ { .compatible = "fsl,imx6ul-fec", .data = &fec_imx6ul_info, },
+ { .compatible = "fsl,imx8mq-fec", .data = &fec_imx8mq_info, },
+ { .compatible = "fsl,imx8qm-fec", .data = &fec_imx8qm_info, },
+--
+2.51.0
+
--- /dev/null
+From 16c2b13944194dc0cd1cd0006801ec6addb1c715 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sun, 31 Aug 2025 12:59:07 +0200
+Subject: net: sfp: add quirk for FLYPRO copper SFP+ module
+
+From: Aleksander Jan Bajkowski <olek2@wp.pl>
+
+[ Upstream commit ddbf0e78a8b20ec18d314d31336a0230fdc9b394 ]
+
+Add quirk for a copper SFP that identifies itself as "FLYPRO"
+"SFP-10GT-CS-30M". It uses RollBall protocol to talk to the PHY.
+
+Signed-off-by: Aleksander Jan Bajkowski <olek2@wp.pl>
+Reviewed-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
+Link: https://patch.msgid.link/20250831105910.3174-1-olek2@wp.pl
+Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/phy/sfp.c | 3 +++
+ 1 file changed, 3 insertions(+)
+
+diff --git a/drivers/net/phy/sfp.c b/drivers/net/phy/sfp.c
+index 5347c95d1e772..4cd1d6c51dc2a 100644
+--- a/drivers/net/phy/sfp.c
++++ b/drivers/net/phy/sfp.c
+@@ -492,6 +492,9 @@ static const struct sfp_quirk sfp_quirks[] = {
+ SFP_QUIRK("ALCATELLUCENT", "3FE46541AA", sfp_quirk_2500basex,
+ sfp_fixup_nokia),
+
++ // FLYPRO SFP-10GT-CS-30M uses Rollball protocol to talk to the PHY.
++ SFP_QUIRK_F("FLYPRO", "SFP-10GT-CS-30M", sfp_fixup_rollball),
++
+ // Fiberstore SFP-10G-T doesn't identify as copper, uses the Rollball
+ // protocol to talk to the PHY and needs 4 sec wait before probing the
+ // PHY.
+--
+2.51.0
+
--- /dev/null
+From cdd2b98dc99825669d43ab26a0764500ff36a308 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 17 Jun 2025 13:03:24 -0500
+Subject: net: sfp: add quirk for Potron SFP+ XGSPON ONU Stick
+
+From: Chris Morgan <macromorgan@hotmail.com>
+
+[ Upstream commit dfec1c14aecee6813f9bafc7b560cc3a31d24079 ]
+
+Add quirk for Potron SFP+ XGSPON ONU Stick (YV SFP+ONT-XGSPON).
+
+This device uses pins 2 and 7 for UART communication, so disable
+TX_FAULT and LOS. Additionally as it is an embedded system in an
+SFP+ form factor provide it enough time to fully boot before we
+attempt to use it.
+
+https://www.potrontec.com/index/index/list/cat_id/2.html#11-83
+https://pon.wiki/xgs-pon/ont/potron-technology/x-onu-sfpp/
+
+Signed-off-by: Chris Morgan <macromorgan@hotmail.com>
+Link: https://patch.msgid.link/20250617180324.229487-1-macroalpha82@gmail.com
+Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/phy/sfp.c | 21 ++++++++++++++++++++-
+ 1 file changed, 20 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/net/phy/sfp.c b/drivers/net/phy/sfp.c
+index 347c1e0e94d95..5347c95d1e772 100644
+--- a/drivers/net/phy/sfp.c
++++ b/drivers/net/phy/sfp.c
+@@ -361,6 +361,11 @@ static void sfp_fixup_ignore_tx_fault(struct sfp *sfp)
+ sfp->state_ignore_mask |= SFP_F_TX_FAULT;
+ }
+
++static void sfp_fixup_ignore_hw(struct sfp *sfp, unsigned int mask)
++{
++ sfp->state_hw_mask &= ~mask;
++}
++
+ static void sfp_fixup_nokia(struct sfp *sfp)
+ {
+ sfp_fixup_long_startup(sfp);
+@@ -409,7 +414,19 @@ static void sfp_fixup_halny_gsfp(struct sfp *sfp)
+ * these are possibly used for other purposes on this
+ * module, e.g. a serial port.
+ */
+- sfp->state_hw_mask &= ~(SFP_F_TX_FAULT | SFP_F_LOS);
++ sfp_fixup_ignore_hw(sfp, SFP_F_TX_FAULT | SFP_F_LOS);
++}
++
++static void sfp_fixup_potron(struct sfp *sfp)
++{
++ /*
++ * The TX_FAULT and LOS pins on this device are used for serial
++ * communication, so ignore them. Additionally, provide extra
++ * time for this device to fully start up.
++ */
++
++ sfp_fixup_long_startup(sfp);
++ sfp_fixup_ignore_hw(sfp, SFP_F_TX_FAULT | SFP_F_LOS);
+ }
+
+ static void sfp_fixup_rollball_cc(struct sfp *sfp)
+@@ -512,6 +529,8 @@ static const struct sfp_quirk sfp_quirks[] = {
+ SFP_QUIRK_F("Walsun", "HXSX-ATRC-1", sfp_fixup_fs_10gt),
+ SFP_QUIRK_F("Walsun", "HXSX-ATRI-1", sfp_fixup_fs_10gt),
+
++ SFP_QUIRK_F("YV", "SFP+ONU-XGSPON", sfp_fixup_potron),
++
+ // OEM SFP-GE-T is a 1000Base-T module with broken TX_FAULT indicator
+ SFP_QUIRK_F("OEM", "SFP-GE-T", sfp_fixup_ignore_tx_fault),
+
+--
+2.51.0
+
--- /dev/null
+From 23a5c64fe65fa6f85b3f91656b7a4700e1a2959e Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 18 Jul 2025 18:33:05 +0200
+Subject: platform/x86: oxpec: Add support for OneXPlayer X1 Mini Pro (Strix
+ Point)
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Antheas Kapenekakis <lkml@antheas.dev>
+
+[ Upstream commit 1798561befd8be1e52feb54f850efcab5a595f43 ]
+
+The OneXPlayer X1 Mini Pro (which is the Strix Point variant of the Mini)
+uses the same registers as the X1 Mini, so re-use the quirk.
+
+Signed-off-by: Antheas Kapenekakis <lkml@antheas.dev>
+Link: https://lore.kernel.org/r/20250718163305.159232-2-lkml@antheas.dev
+Reviewed-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
+Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/platform/x86/oxpec.c | 7 +++++++
+ 1 file changed, 7 insertions(+)
+
+diff --git a/drivers/platform/x86/oxpec.c b/drivers/platform/x86/oxpec.c
+index 9839e8cb82ce4..eb076bb4099be 100644
+--- a/drivers/platform/x86/oxpec.c
++++ b/drivers/platform/x86/oxpec.c
+@@ -292,6 +292,13 @@ static const struct dmi_system_id dmi_table[] = {
+ },
+ .driver_data = (void *)oxp_x1,
+ },
++ {
++ .matches = {
++ DMI_MATCH(DMI_BOARD_VENDOR, "ONE-NETBOOK"),
++ DMI_EXACT_MATCH(DMI_BOARD_NAME, "ONEXPLAYER X1Mini Pro"),
++ },
++ .driver_data = (void *)oxp_x1,
++ },
+ {
+ .matches = {
+ DMI_MATCH(DMI_BOARD_VENDOR, "ONE-NETBOOK"),
+--
+2.51.0
+
--- /dev/null
+From 084956e2ad776015771204067591d0e2514e77d7 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sun, 7 Sep 2025 12:40:16 -0700
+Subject: scsi: ufs: mcq: Fix memory allocation checks for SQE and CQE
+
+From: Alok Tiwari <alok.a.tiwari@oracle.com>
+
+[ Upstream commit 5cb782ff3c62c837e4984b6ae9f5d9a423cd5088 ]
+
+Previous checks incorrectly tested the DMA addresses (dma_handle) for
+NULL. Since dma_alloc_coherent() returns the CPU (virtual) address, the
+NULL check should be performed on the *_base_addr pointer to correctly
+detect allocation failures.
+
+Update the checks to validate sqe_base_addr and cqe_base_addr instead of
+sqe_dma_addr and cqe_dma_addr.
+
+Fixes: 4682abfae2eb ("scsi: ufs: core: mcq: Allocate memory for MCQ mode")
+Signed-off-by: Alok Tiwari <alok.a.tiwari@oracle.com>
+Reviewed-by: Alim Akhtar <alim.akhtar@samsung.com>
+Reviewed-by: Manivannan Sadhasivam <mani@kernel.org>
+Reviewed-by: Peter Wang <peter.wang@mediatek.com>
+Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/ufs/core/ufs-mcq.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/ufs/core/ufs-mcq.c b/drivers/ufs/core/ufs-mcq.c
+index 1e50675772feb..cc88aaa106da3 100644
+--- a/drivers/ufs/core/ufs-mcq.c
++++ b/drivers/ufs/core/ufs-mcq.c
+@@ -243,7 +243,7 @@ int ufshcd_mcq_memory_alloc(struct ufs_hba *hba)
+ hwq->sqe_base_addr = dmam_alloc_coherent(hba->dev, utrdl_size,
+ &hwq->sqe_dma_addr,
+ GFP_KERNEL);
+- if (!hwq->sqe_dma_addr) {
++ if (!hwq->sqe_base_addr) {
+ dev_err(hba->dev, "SQE allocation failed\n");
+ return -ENOMEM;
+ }
+@@ -252,7 +252,7 @@ int ufshcd_mcq_memory_alloc(struct ufs_hba *hba)
+ hwq->cqe_base_addr = dmam_alloc_coherent(hba->dev, cqe_size,
+ &hwq->cqe_dma_addr,
+ GFP_KERNEL);
+- if (!hwq->cqe_dma_addr) {
++ if (!hwq->cqe_base_addr) {
+ dev_err(hba->dev, "CQE allocation failed\n");
+ return -ENOMEM;
+ }
+--
+2.51.0
+
--- /dev/null
+scsi-ufs-mcq-fix-memory-allocation-checks-for-sqe-an.patch
+firewire-core-fix-overlooked-update-of-subsystem-abi.patch
+alsa-usb-audio-fix-code-alignment-in-mixer_quirks.patch
+alsa-usb-audio-fix-whitespace-blank-line-issues-in-m.patch
+alsa-usb-audio-fix-block-comments-in-mixer_quirks.patch
+alsa-usb-audio-drop-unnecessary-parentheses-in-mixer.patch
+alsa-usb-audio-avoid-multiple-assignments-in-mixer_q.patch
+alsa-usb-audio-simplify-null-comparison-in-mixer_qui.patch
+alsa-usb-audio-remove-unneeded-wmb-in-mixer_quirks.patch
+alsa-usb-audio-add-mixer-quirk-for-sony-dualsense-ps.patch
+hid-multitouch-get-the-contact-id-from-hid_dg_transd.patch
+hid-multitouch-support-getting-the-tip-state-from-hi.patch
+hid-multitouch-take-cls-maxcontacts-into-account-for.patch
+hid-multitouch-specify-that-apple-touch-bar-is-direc.patch
+alsa-usb-audio-convert-comma-to-semicolon.patch
+alsa-hda-realtek-add-support-for-asus-nuc-using-cs35.patch
+alsa-usb-audio-fix-build-with-config_input-n.patch
+usb-core-add-0x-prefix-to-quirks-debug-output.patch
+net-fec-rename-struct-fec_devinfo-fec_imx6x_info-fec.patch
+net-sfp-add-quirk-for-potron-sfp-xgspon-onu-stick.patch
+drm-panfrost-drop-duplicated-mediatek-supplies-array.patch
+drm-panfrost-commonize-mediatek-power-domain-array-d.patch
+drm-panfrost-add-support-for-mali-on-the-mt8370-soc.patch
+mmc-sdhci-cadence-add-mobileye-eyeq-support.patch
+i2c-designware-add-quirk-for-intel-xe.patch
+asoc-intel-soc-acpi-add-entry-for-sof_es8336-in-ptl-.patch
+asoc-intel-soc-acpi-add-entry-for-hdmi_in-capture-su.patch
+asoc-intel-sof_rt5682-add-hdmi-in-capture-with-rt568.patch
+platform-x86-oxpec-add-support-for-onexplayer-x1-min.patch
+alsa-usb-audio-add-dsd-support-for-comtrue-usb-audio.patch
+gpiolib-acpi-add-quirk-for-asus-proart-px13.patch
+alsa-usb-audio-move-mixer_quirks-min_mute-into-commo.patch
+alsa-usb-audio-add-mute-tlv-for-playback-volumes-on-.patch
+net-sfp-add-quirk-for-flypro-copper-sfp-module.patch
+ib-mlx5-fix-obj_type-mismatch-for-srq-event-subscrip.patch
+hid-cp2112-fix-setter-callbacks-return-value.patch
+hid-amd_sfh-add-sync-across-amd-sfh-work-functions.patch
--- /dev/null
+From 63942b2e7a7b4bd93ccdbfa72ebe567f322c22e1 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 3 Jun 2025 15:10:45 +0800
+Subject: usb: core: Add 0x prefix to quirks debug output
+
+From: Jiayi Li <lijiayi@kylinos.cn>
+
+[ Upstream commit 47c428fce0b41b15ab321d8ede871f780ccd038f ]
+
+Use "0x%x" format for quirks debug print to clarify it's a hexadecimal
+value. Improves readability and consistency with other hex outputs.
+
+Signed-off-by: Jiayi Li <lijiayi@kylinos.cn>
+Link: https://lore.kernel.org/r/20250603071045.3243699-1-lijiayi@kylinos.cn
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/usb/core/quirks.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/usb/core/quirks.c b/drivers/usb/core/quirks.c
+index d6daad39491b7..f5bc538753301 100644
+--- a/drivers/usb/core/quirks.c
++++ b/drivers/usb/core/quirks.c
+@@ -737,7 +737,7 @@ void usb_detect_quirks(struct usb_device *udev)
+ udev->quirks ^= usb_detect_dynamic_quirks(udev);
+
+ if (udev->quirks)
+- dev_dbg(&udev->dev, "USB quirks for this device: %x\n",
++ dev_dbg(&udev->dev, "USB quirks for this device: 0x%x\n",
+ udev->quirks);
+
+ #ifdef CONFIG_USB_DEFAULT_PERSIST
+--
+2.51.0
+
--- /dev/null
+From 8dfeb6aa2489eaf36546d7f85967566a1193cf47 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 31 Jul 2025 19:06:14 +0800
+Subject: ALSA: usb-audio: Add DSD support for Comtrue USB Audio device
+
+From: noble.yang <noble.yang@comtrue-inc.com>
+
+[ Upstream commit e9df1755485dd90a89656e8a21ec4d71c909fa30 ]
+
+The vendor Comtrue Inc. (0x2fc6) produces USB audio chipsets like
+the CT7601 which are capable of Native DSD playback.
+
+This patch adds QUIRK_FLAG_DSD_RAW for Comtrue (VID 0x2fc6), which enables
+native DSD playback (DSD_U32_LE) on their USB Audio device. This has been
+verified under Ubuntu 25.04 with JRiver.
+
+Signed-off-by: noble.yang <noble.yang@comtrue-inc.com>
+Link: https://patch.msgid.link/20250731110614.4070-1-noble228@gmail.com
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/quirks.c | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/sound/usb/quirks.c b/sound/usb/quirks.c
+index f19c808444c97..def326ddef267 100644
+--- a/sound/usb/quirks.c
++++ b/sound/usb/quirks.c
+@@ -2305,6 +2305,8 @@ static const struct usb_audio_quirk_flags_table quirk_flags_table[] = {
+ QUIRK_FLAG_DSD_RAW),
+ VENDOR_FLG(0x2d87, /* Cayin device */
+ QUIRK_FLAG_DSD_RAW),
++ VENDOR_FLG(0x2fc6, /* Comture-inc devices */
++ QUIRK_FLAG_DSD_RAW),
+ VENDOR_FLG(0x3336, /* HEM devices */
+ QUIRK_FLAG_DSD_RAW),
+ VENDOR_FLG(0x3353, /* Khadas devices */
+--
+2.51.0
+
--- /dev/null
+From bc842689fe59b1cf346821417d1d94fe2081815f Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 26 May 2025 17:07:48 +0300
+Subject: ALSA: usb-audio: Add mixer quirk for Sony DualSense PS5
+
+From: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+
+[ Upstream commit 79d561c4ec0497669f19a9550cfb74812f60938b ]
+
+The Sony DualSense wireless controller (PS5) features an internal mono
+speaker, but it also provides a 3.5mm jack socket for headphone output
+and headset microphone input.
+
+Since this is a UAC1 device, it doesn't advertise any jack detection
+capability. However, the controller is able to report HP & MIC insert
+events via HID, i.e. through a dedicated input device managed by the
+hid-playstation driver.
+
+Add a quirk to create the jack controls for headphone and headset mic,
+respectively, and setup an input handler for each of them in order to
+intercept the related hotplug events.
+
+Signed-off-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Link: https://patch.msgid.link/20250526-dualsense-alsa-jack-v1-9-1a821463b632@collabora.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/mixer_quirks.c | 263 +++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 263 insertions(+)
+
+diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
+index e5252167d6a40..95fa1c31ae550 100644
+--- a/sound/usb/mixer_quirks.c
++++ b/sound/usb/mixer_quirks.c
+@@ -16,6 +16,7 @@
+
+ #include <linux/hid.h>
+ #include <linux/init.h>
++#include <linux/input.h>
+ #include <linux/math64.h>
+ #include <linux/slab.h>
+ #include <linux/usb.h>
+@@ -527,6 +528,263 @@ static int snd_emu0204_controls_create(struct usb_mixer_interface *mixer)
+ &snd_emu0204_control, NULL);
+ }
+
++/*
++ * Sony DualSense controller (PS5) jack detection
++ *
++ * Since this is an UAC 1 device, it doesn't support jack detection.
++ * However, the controller hid-playstation driver reports HP & MIC
++ * insert events through a dedicated input device.
++ */
++
++#define SND_DUALSENSE_JACK_OUT_TERM_ID 3
++#define SND_DUALSENSE_JACK_IN_TERM_ID 4
++
++struct dualsense_mixer_elem_info {
++ struct usb_mixer_elem_info info;
++ struct input_handler ih;
++ struct input_device_id id_table[2];
++ bool connected;
++};
++
++static void snd_dualsense_ih_event(struct input_handle *handle,
++ unsigned int type, unsigned int code,
++ int value)
++{
++ struct dualsense_mixer_elem_info *mei;
++ struct usb_mixer_elem_list *me;
++
++ if (type != EV_SW)
++ return;
++
++ mei = container_of(handle->handler, struct dualsense_mixer_elem_info, ih);
++ me = &mei->info.head;
++
++ if ((me->id == SND_DUALSENSE_JACK_OUT_TERM_ID && code == SW_HEADPHONE_INSERT) ||
++ (me->id == SND_DUALSENSE_JACK_IN_TERM_ID && code == SW_MICROPHONE_INSERT)) {
++ mei->connected = !!value;
++ snd_ctl_notify(me->mixer->chip->card, SNDRV_CTL_EVENT_MASK_VALUE,
++ &me->kctl->id);
++ }
++}
++
++static bool snd_dualsense_ih_match(struct input_handler *handler,
++ struct input_dev *dev)
++{
++ struct dualsense_mixer_elem_info *mei;
++ struct usb_device *snd_dev;
++ char *input_dev_path, *usb_dev_path;
++ size_t usb_dev_path_len;
++ bool match = false;
++
++ mei = container_of(handler, struct dualsense_mixer_elem_info, ih);
++ snd_dev = mei->info.head.mixer->chip->dev;
++
++ input_dev_path = kobject_get_path(&dev->dev.kobj, GFP_KERNEL);
++ if (!input_dev_path) {
++ dev_warn(&snd_dev->dev, "Failed to get input dev path\n");
++ return false;
++ }
++
++ usb_dev_path = kobject_get_path(&snd_dev->dev.kobj, GFP_KERNEL);
++ if (!usb_dev_path) {
++ dev_warn(&snd_dev->dev, "Failed to get USB dev path\n");
++ goto free_paths;
++ }
++
++ /*
++ * Ensure the VID:PID matched input device supposedly owned by the
++ * hid-playstation driver belongs to the actual hardware handled by
++ * the current USB audio device, which implies input_dev_path being
++ * a subpath of usb_dev_path.
++ *
++ * This verification is necessary when there is more than one identical
++ * controller attached to the host system.
++ */
++ usb_dev_path_len = strlen(usb_dev_path);
++ if (usb_dev_path_len >= strlen(input_dev_path))
++ goto free_paths;
++
++ usb_dev_path[usb_dev_path_len] = '/';
++ match = !memcmp(input_dev_path, usb_dev_path, usb_dev_path_len + 1);
++
++free_paths:
++ kfree(input_dev_path);
++ kfree(usb_dev_path);
++
++ return match;
++}
++
++static int snd_dualsense_ih_connect(struct input_handler *handler,
++ struct input_dev *dev,
++ const struct input_device_id *id)
++{
++ struct input_handle *handle;
++ int err;
++
++ handle = kzalloc(sizeof(*handle), GFP_KERNEL);
++ if (!handle)
++ return -ENOMEM;
++
++ handle->dev = dev;
++ handle->handler = handler;
++ handle->name = handler->name;
++
++ err = input_register_handle(handle);
++ if (err)
++ goto err_free;
++
++ err = input_open_device(handle);
++ if (err)
++ goto err_unregister;
++
++ return 0;
++
++err_unregister:
++ input_unregister_handle(handle);
++err_free:
++ kfree(handle);
++ return err;
++}
++
++static void snd_dualsense_ih_disconnect(struct input_handle *handle)
++{
++ input_close_device(handle);
++ input_unregister_handle(handle);
++ kfree(handle);
++}
++
++static void snd_dualsense_ih_start(struct input_handle *handle)
++{
++ struct dualsense_mixer_elem_info *mei;
++ struct usb_mixer_elem_list *me;
++ int status = -1;
++
++ mei = container_of(handle->handler, struct dualsense_mixer_elem_info, ih);
++ me = &mei->info.head;
++
++ if (me->id == SND_DUALSENSE_JACK_OUT_TERM_ID &&
++ test_bit(SW_HEADPHONE_INSERT, handle->dev->swbit))
++ status = test_bit(SW_HEADPHONE_INSERT, handle->dev->sw);
++ else if (me->id == SND_DUALSENSE_JACK_IN_TERM_ID &&
++ test_bit(SW_MICROPHONE_INSERT, handle->dev->swbit))
++ status = test_bit(SW_MICROPHONE_INSERT, handle->dev->sw);
++
++ if (status >= 0) {
++ mei->connected = !!status;
++ snd_ctl_notify(me->mixer->chip->card, SNDRV_CTL_EVENT_MASK_VALUE,
++ &me->kctl->id);
++ }
++}
++
++static int snd_dualsense_jack_get(struct snd_kcontrol *kctl,
++ struct snd_ctl_elem_value *ucontrol)
++{
++ struct dualsense_mixer_elem_info *mei = snd_kcontrol_chip(kctl);
++
++ ucontrol->value.integer.value[0] = mei->connected;
++
++ return 0;
++}
++
++static const struct snd_kcontrol_new snd_dualsense_jack_control = {
++ .iface = SNDRV_CTL_ELEM_IFACE_CARD,
++ .access = SNDRV_CTL_ELEM_ACCESS_READ,
++ .info = snd_ctl_boolean_mono_info,
++ .get = snd_dualsense_jack_get,
++};
++
++static int snd_dualsense_resume_jack(struct usb_mixer_elem_list *list)
++{
++ snd_ctl_notify(list->mixer->chip->card, SNDRV_CTL_EVENT_MASK_VALUE,
++ &list->kctl->id);
++ return 0;
++}
++
++static void snd_dualsense_mixer_elem_free(struct snd_kcontrol *kctl)
++{
++ struct dualsense_mixer_elem_info *mei = snd_kcontrol_chip(kctl);
++
++ if (mei->ih.event)
++ input_unregister_handler(&mei->ih);
++
++ snd_usb_mixer_elem_free(kctl);
++}
++
++static int snd_dualsense_jack_create(struct usb_mixer_interface *mixer,
++ const char *name, bool is_output)
++{
++ struct dualsense_mixer_elem_info *mei;
++ struct input_device_id *idev_id;
++ struct snd_kcontrol *kctl;
++ int err;
++
++ mei = kzalloc(sizeof(*mei), GFP_KERNEL);
++ if (!mei)
++ return -ENOMEM;
++
++ snd_usb_mixer_elem_init_std(&mei->info.head, mixer,
++ is_output ? SND_DUALSENSE_JACK_OUT_TERM_ID :
++ SND_DUALSENSE_JACK_IN_TERM_ID);
++
++ mei->info.head.resume = snd_dualsense_resume_jack;
++ mei->info.val_type = USB_MIXER_BOOLEAN;
++ mei->info.channels = 1;
++ mei->info.min = 0;
++ mei->info.max = 1;
++
++ kctl = snd_ctl_new1(&snd_dualsense_jack_control, mei);
++ if (!kctl) {
++ kfree(mei);
++ return -ENOMEM;
++ }
++
++ strscpy(kctl->id.name, name, sizeof(kctl->id.name));
++ kctl->private_free = snd_dualsense_mixer_elem_free;
++
++ err = snd_usb_mixer_add_control(&mei->info.head, kctl);
++ if (err)
++ return err;
++
++ idev_id = &mei->id_table[0];
++ idev_id->flags = INPUT_DEVICE_ID_MATCH_VENDOR | INPUT_DEVICE_ID_MATCH_PRODUCT |
++ INPUT_DEVICE_ID_MATCH_EVBIT | INPUT_DEVICE_ID_MATCH_SWBIT;
++ idev_id->vendor = USB_ID_VENDOR(mixer->chip->usb_id);
++ idev_id->product = USB_ID_PRODUCT(mixer->chip->usb_id);
++ idev_id->evbit[BIT_WORD(EV_SW)] = BIT_MASK(EV_SW);
++ if (is_output)
++ idev_id->swbit[BIT_WORD(SW_HEADPHONE_INSERT)] = BIT_MASK(SW_HEADPHONE_INSERT);
++ else
++ idev_id->swbit[BIT_WORD(SW_MICROPHONE_INSERT)] = BIT_MASK(SW_MICROPHONE_INSERT);
++
++ mei->ih.event = snd_dualsense_ih_event;
++ mei->ih.match = snd_dualsense_ih_match;
++ mei->ih.connect = snd_dualsense_ih_connect,
++ mei->ih.disconnect = snd_dualsense_ih_disconnect,
++ mei->ih.start = snd_dualsense_ih_start,
++ mei->ih.name = name;
++ mei->ih.id_table = mei->id_table;
++
++ err = input_register_handler(&mei->ih);
++ if (err) {
++ dev_warn(&mixer->chip->dev->dev,
++ "Could not register input handler: %d\n", err);
++ mei->ih.event = NULL;
++ }
++
++ return 0;
++}
++
++static int snd_dualsense_controls_create(struct usb_mixer_interface *mixer)
++{
++ int err;
++
++ err = snd_dualsense_jack_create(mixer, "Headphone Jack", true);
++ if (err < 0)
++ return err;
++
++ return snd_dualsense_jack_create(mixer, "Headset Mic Jack", false);
++}
++
+ /* ASUS Xonar U1 / U3 controls */
+
+ static int snd_xonar_u1_switch_get(struct snd_kcontrol *kcontrol,
+@@ -3390,6 +3648,11 @@ int snd_usb_mixer_apply_create_quirk(struct usb_mixer_interface *mixer)
+ err = snd_emu0204_controls_create(mixer);
+ break;
+
++ case USB_ID(0x054c, 0x0ce6): /* Sony DualSense controller (PS5) */
++ case USB_ID(0x054c, 0x0df2): /* Sony DualSense Edge controller (PS5) */
++ err = snd_dualsense_controls_create(mixer);
++ break;
++
+ case USB_ID(0x0763, 0x2030): /* M-Audio Fast Track C400 */
+ case USB_ID(0x0763, 0x2031): /* M-Audio Fast Track C400 */
+ err = snd_c400_create_mixer(mixer);
+--
+2.51.0
+
--- /dev/null
+From 635ae24e61094a5b79d7a045b626d423b3c836c0 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 29 Aug 2025 14:40:48 +0800
+Subject: ALSA: usb-audio: Add mute TLV for playback volumes on more devices
+
+From: qaqland <anguoli@uniontech.com>
+
+[ Upstream commit 2cbe4ac193ed7172cfd825c0cc46ce4a41be4ba1 ]
+
+Applying the quirk of that, the lowest Playback mixer volume setting
+mutes the audio output, on more devices.
+
+Suggested-by: Cryolitia PukNgae <cryolitia@uniontech.com>
+Signed-off-by: qaqland <anguoli@uniontech.com>
+Link: https://patch.msgid.link/20250829-sound_quirk-v1-1-745529b44440@uniontech.com
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/quirks.c | 10 ++++++++++
+ 1 file changed, 10 insertions(+)
+
+diff --git a/sound/usb/quirks.c b/sound/usb/quirks.c
+index 3444c5735d756..7d747677b58da 100644
+--- a/sound/usb/quirks.c
++++ b/sound/usb/quirks.c
+@@ -2096,6 +2096,8 @@ static const struct usb_audio_quirk_flags_table quirk_flags_table[] = {
+ QUIRK_FLAG_SET_IFACE_FIRST),
+ DEVICE_FLG(0x0556, 0x0014, /* Phoenix Audio TMX320VC */
+ QUIRK_FLAG_GET_SAMPLE_RATE),
++ DEVICE_FLG(0x0572, 0x1b08, /* Conexant Systems (Rockwell), Inc. */
++ QUIRK_FLAG_MIXER_MIN_MUTE),
+ DEVICE_FLG(0x0572, 0x1b09, /* Conexant Systems (Rockwell), Inc. */
+ QUIRK_FLAG_MIXER_MIN_MUTE),
+ DEVICE_FLG(0x05a3, 0x9420, /* ELP HD USB Camera */
+@@ -2140,6 +2142,8 @@ static const struct usb_audio_quirk_flags_table quirk_flags_table[] = {
+ QUIRK_FLAG_CTL_MSG_DELAY_1M),
+ DEVICE_FLG(0x0b0e, 0x0349, /* Jabra 550a */
+ QUIRK_FLAG_CTL_MSG_DELAY_1M),
++ DEVICE_FLG(0x0bda, 0x498a, /* Realtek Semiconductor Corp. */
++ QUIRK_FLAG_MIXER_MIN_MUTE),
+ DEVICE_FLG(0x0c45, 0x6340, /* Sonix HD USB Camera */
+ QUIRK_FLAG_GET_SAMPLE_RATE),
+ DEVICE_FLG(0x0c45, 0x636b, /* Microdia JP001 USB Camera */
+@@ -2156,6 +2160,8 @@ static const struct usb_audio_quirk_flags_table quirk_flags_table[] = {
+ QUIRK_FLAG_SHARE_MEDIA_DEVICE | QUIRK_FLAG_ALIGN_TRANSFER),
+ DEVICE_FLG(0x1101, 0x0003, /* Audioengine D1 */
+ QUIRK_FLAG_GET_SAMPLE_RATE),
++ DEVICE_FLG(0x12d1, 0x3a07, /* Huawei Technologies Co., Ltd. */
++ QUIRK_FLAG_MIXER_MIN_MUTE),
+ DEVICE_FLG(0x1224, 0x2a25, /* Jieli Technology USB PHY 2.0 */
+ QUIRK_FLAG_GET_SAMPLE_RATE | QUIRK_FLAG_MIC_RES_16),
+ DEVICE_FLG(0x1395, 0x740a, /* Sennheiser DECT */
+@@ -2246,6 +2252,8 @@ static const struct usb_audio_quirk_flags_table quirk_flags_table[] = {
+ QUIRK_FLAG_IGNORE_CTL_ERROR),
+ DEVICE_FLG(0x2912, 0x30c8, /* Audioengine D1 */
+ QUIRK_FLAG_GET_SAMPLE_RATE),
++ DEVICE_FLG(0x2a70, 0x1881, /* OnePlus Technology (Shenzhen) Co., Ltd. BE02T */
++ QUIRK_FLAG_MIXER_MIN_MUTE),
+ DEVICE_FLG(0x2b53, 0x0023, /* Fiero SC-01 (firmware v1.0.0 @ 48 kHz) */
+ QUIRK_FLAG_GENERIC_IMPLICIT_FB),
+ DEVICE_FLG(0x2b53, 0x0024, /* Fiero SC-01 (firmware v1.0.0 @ 96 kHz) */
+@@ -2262,6 +2270,8 @@ static const struct usb_audio_quirk_flags_table quirk_flags_table[] = {
+ QUIRK_FLAG_CTL_MSG_DELAY_1M),
+ DEVICE_FLG(0x30be, 0x0101, /* Schiit Hel */
+ QUIRK_FLAG_IGNORE_CTL_ERROR),
++ DEVICE_FLG(0x339b, 0x3a07, /* Synaptics HONOR USB-C HEADSET */
++ QUIRK_FLAG_MIXER_MIN_MUTE),
+ DEVICE_FLG(0x413c, 0xa506, /* Dell AE515 sound bar */
+ QUIRK_FLAG_GET_SAMPLE_RATE),
+ DEVICE_FLG(0x534d, 0x0021, /* MacroSilicon MS2100/MS2106 */
+--
+2.51.0
+
--- /dev/null
+From ce6c03e06ace31d5f6ce6d89d26478afe54ebcc3 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 26 May 2025 17:07:45 +0300
+Subject: ALSA: usb-audio: Avoid multiple assignments in mixer_quirks
+
+From: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+
+[ Upstream commit 03ddd3bdb94df3edb1f2408b57cfb00b3d92a208 ]
+
+Handle report from checkpatch.pl:
+
+ CHECK: multiple assignments should be avoided
+
+Signed-off-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Link: https://patch.msgid.link/20250526-dualsense-alsa-jack-v1-6-1a821463b632@collabora.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/mixer_quirks.c | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
+index a1ab517e26b36..f91dbc9255f12 100644
+--- a/sound/usb/mixer_quirks.c
++++ b/sound/usb/mixer_quirks.c
+@@ -1734,7 +1734,8 @@ static int snd_microii_spdif_default_put(struct snd_kcontrol *kcontrol,
+ unsigned int pval, pval_old;
+ int err;
+
+- pval = pval_old = kcontrol->private_value;
++ pval = kcontrol->private_value;
++ pval_old = pval;
+ pval &= 0xfffff0f0;
+ pval |= (ucontrol->value.iec958.status[1] & 0x0f) << 8;
+ pval |= (ucontrol->value.iec958.status[0] & 0x0f);
+--
+2.51.0
+
--- /dev/null
+From 09523443393b2ff18c53d811f4722ee54cd917e1 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 12 Jun 2025 14:02:28 +0800
+Subject: ALSA: usb-audio: Convert comma to semicolon
+
+From: Chen Ni <nichen@iscas.ac.cn>
+
+[ Upstream commit 9ca30a1b007d5fefb5752428f852a2d8d7219c1c ]
+
+Replace comma between expressions with semicolons.
+
+Using a ',' in place of a ';' can have unintended side effects.
+Although that is not the case here, it is seems best to use ';'
+unless ',' is intended.
+
+Found by inspection.
+No functional change intended.
+Compile tested only.
+
+Fixes: 79d561c4ec04 ("ALSA: usb-audio: Add mixer quirk for Sony DualSense PS5")
+Signed-off-by: Chen Ni <nichen@iscas.ac.cn>
+Reviewed-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+Link: https://patch.msgid.link/20250612060228.1518028-1-nichen@iscas.ac.cn
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/mixer_quirks.c | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
+index 95fa1c31ae550..f1b663a05f295 100644
+--- a/sound/usb/mixer_quirks.c
++++ b/sound/usb/mixer_quirks.c
+@@ -758,9 +758,9 @@ static int snd_dualsense_jack_create(struct usb_mixer_interface *mixer,
+
+ mei->ih.event = snd_dualsense_ih_event;
+ mei->ih.match = snd_dualsense_ih_match;
+- mei->ih.connect = snd_dualsense_ih_connect,
+- mei->ih.disconnect = snd_dualsense_ih_disconnect,
+- mei->ih.start = snd_dualsense_ih_start,
++ mei->ih.connect = snd_dualsense_ih_connect;
++ mei->ih.disconnect = snd_dualsense_ih_disconnect;
++ mei->ih.start = snd_dualsense_ih_start;
+ mei->ih.name = name;
+ mei->ih.id_table = mei->id_table;
+
+--
+2.51.0
+
--- /dev/null
+From 57939ada9ef0cdcf66646d261bfa92e89ab1fa8f Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 26 May 2025 17:07:44 +0300
+Subject: ALSA: usb-audio: Drop unnecessary parentheses in mixer_quirks
+
+From: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+
+[ Upstream commit c0495cef8b43ad61efbd4019e3573742e0e63c67 ]
+
+Fix multiple 'CHECK: Unnecessary parentheses around ...' reports from
+checkpatch.pl.
+
+Signed-off-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Link: https://patch.msgid.link/20250526-dualsense-alsa-jack-v1-5-1a821463b632@collabora.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/mixer_quirks.c | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
+index 4ce470e291b25..a1ab517e26b36 100644
+--- a/sound/usb/mixer_quirks.c
++++ b/sound/usb/mixer_quirks.c
+@@ -376,10 +376,10 @@ static int snd_audigy2nx_controls_create(struct usb_mixer_interface *mixer)
+ struct snd_kcontrol_new knew;
+
+ /* USB X-Fi S51 doesn't have a CMSS LED */
+- if ((mixer->chip->usb_id == USB_ID(0x041e, 0x3042)) && i == 0)
++ if (mixer->chip->usb_id == USB_ID(0x041e, 0x3042) && i == 0)
+ continue;
+ /* USB X-Fi S51 Pro doesn't have one either */
+- if ((mixer->chip->usb_id == USB_ID(0x041e, 0x30df)) && i == 0)
++ if (mixer->chip->usb_id == USB_ID(0x041e, 0x30df) && i == 0)
+ continue;
+ if (i > 1 && /* Live24ext has 2 LEDs only */
+ (mixer->chip->usb_id == USB_ID(0x041e, 0x3040) ||
+@@ -3272,7 +3272,7 @@ static int snd_djm_controls_update(struct usb_mixer_interface *mixer,
+ int err;
+ const struct snd_djm_device *device = &snd_djm_devices[device_idx];
+
+- if ((group >= device->ncontrols) || value >= device->controls[group].noptions)
++ if (group >= device->ncontrols || value >= device->controls[group].noptions)
+ return -EINVAL;
+
+ err = snd_usb_lock_shutdown(mixer->chip);
+--
+2.51.0
+
--- /dev/null
+From 15c5b27f4d97fb3c8ed08709ce607206fb2655ba Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 26 May 2025 17:07:43 +0300
+Subject: ALSA: usb-audio: Fix block comments in mixer_quirks
+
+From: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+
+[ Upstream commit 231225d8a20f8668b4fd6601d54a2fac0e0ab7a5 ]
+
+Address a couple of comment formatting issues indicated by
+checkpatch.pl:
+
+ WARNING: Block comments use a trailing */ on a separate line
+
+Signed-off-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Link: https://patch.msgid.link/20250526-dualsense-alsa-jack-v1-4-1a821463b632@collabora.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/mixer_quirks.c | 6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
+
+diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
+index 68c82e344d3ba..4ce470e291b25 100644
+--- a/sound/usb/mixer_quirks.c
++++ b/sound/usb/mixer_quirks.c
+@@ -76,7 +76,8 @@ static int snd_create_std_mono_ctl_offset(struct usb_mixer_interface *mixer,
+ cval->idx_off = idx_off;
+
+ /* get_min_max() is called only for integer volumes later,
+- * so provide a short-cut for booleans */
++ * so provide a short-cut for booleans
++ */
+ cval->min = 0;
+ cval->max = 1;
+ cval->res = 0;
+@@ -3546,7 +3547,8 @@ static void snd_dragonfly_quirk_db_scale(struct usb_mixer_interface *mixer,
+ struct snd_kcontrol *kctl)
+ {
+ /* Approximation using 10 ranges based on output measurement on hw v1.2.
+- * This seems close to the cubic mapping e.g. alsamixer uses. */
++ * This seems close to the cubic mapping e.g. alsamixer uses.
++ */
+ static const DECLARE_TLV_DB_RANGE(scale,
+ 0, 1, TLV_DB_MINMAX_ITEM(-5300, -4970),
+ 2, 5, TLV_DB_MINMAX_ITEM(-4710, -4160),
+--
+2.51.0
+
--- /dev/null
+From 63a0a0907e8b01d74cfd445e066c46ebbdff58e6 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 13 Jun 2025 10:15:30 +0200
+Subject: ALSA: usb-audio: Fix build with CONFIG_INPUT=n
+
+From: Takashi Iwai <tiwai@suse.de>
+
+[ Upstream commit d0630a0b80c08530857146e3bf183a7d6b743847 ]
+
+The recent addition of DualSense mixer quirk relies on the input
+device handle, and the build can fail if CONFIG_INPUT isn't set.
+Put (rather ugly) workarounds to wrap with IS_REACHABLE() for avoiding
+the build error.
+
+Fixes: 79d561c4ec04 ("ALSA: usb-audio: Add mixer quirk for Sony DualSense PS5")
+Reported-by: kernel test robot <lkp@intel.com>
+Closes: https://lore.kernel.org/oe-kbuild-all/202506130733.gnPKw2l3-lkp@intel.com/
+Reviewed-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+Link: https://patch.msgid.link/20250613081543.7404-1-tiwai@suse.de
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/mixer_quirks.c | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
+index f1b663a05f295..8c0b8383abe1e 100644
+--- a/sound/usb/mixer_quirks.c
++++ b/sound/usb/mixer_quirks.c
+@@ -528,6 +528,7 @@ static int snd_emu0204_controls_create(struct usb_mixer_interface *mixer)
+ &snd_emu0204_control, NULL);
+ }
+
++#if IS_REACHABLE(CONFIG_INPUT)
+ /*
+ * Sony DualSense controller (PS5) jack detection
+ *
+@@ -784,6 +785,7 @@ static int snd_dualsense_controls_create(struct usb_mixer_interface *mixer)
+
+ return snd_dualsense_jack_create(mixer, "Headset Mic Jack", false);
+ }
++#endif /* IS_REACHABLE(CONFIG_INPUT) */
+
+ /* ASUS Xonar U1 / U3 controls */
+
+@@ -3648,10 +3650,12 @@ int snd_usb_mixer_apply_create_quirk(struct usb_mixer_interface *mixer)
+ err = snd_emu0204_controls_create(mixer);
+ break;
+
++#if IS_REACHABLE(CONFIG_INPUT)
+ case USB_ID(0x054c, 0x0ce6): /* Sony DualSense controller (PS5) */
+ case USB_ID(0x054c, 0x0df2): /* Sony DualSense Edge controller (PS5) */
+ err = snd_dualsense_controls_create(mixer);
+ break;
++#endif /* IS_REACHABLE(CONFIG_INPUT) */
+
+ case USB_ID(0x0763, 0x2030): /* M-Audio Fast Track C400 */
+ case USB_ID(0x0763, 0x2031): /* M-Audio Fast Track C400 */
+--
+2.51.0
+
--- /dev/null
+From 56ccd0ab3ca59606c139da7a8e713253d3870c8e Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 27 Aug 2025 11:29:02 +0800
+Subject: ALSA: usb-audio: move mixer_quirks' min_mute into common quirk
+
+From: Cryolitia PukNgae <cryolitia@uniontech.com>
+
+[ Upstream commit 2c3ca8cc55a3afc7a4fa99ed8f5f5d05dd2e65b3 ]
+
+We have found more and more devices that have the same problem, that
+the mixer's minimum value is muted. Accroding to pipewire's MR[1]
+and Arch Linux wiki[2], this should be a very common problem in USB
+audio devices. Move the quirk into common quirk,as a preparation of
+more devices' quirk's patch coming on the road[3].
+
+1. https://gitlab.freedesktop.org/pipewire/pipewire/-/merge_requests/2514
+2. https://wiki.archlinux.org/index.php?title=PipeWire&oldid=804138#No_sound_from_USB_DAC_until_30%_volume
+3. On the road, in the physical sense. We have been buying ton of
+ these devices for testing the problem.
+
+Tested-by: Guoli An <anguoli@uniontech.com>
+Signed-off-by: Cryolitia PukNgae <cryolitia@uniontech.com>
+Link: https://patch.msgid.link/20250827-sound-quirk-min-mute-v1-1-4717aa8a4f6a@uniontech.com
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/mixer_quirks.c | 10 +++-------
+ sound/usb/quirks.c | 12 ++++++++++--
+ sound/usb/usbaudio.h | 4 ++++
+ 3 files changed, 17 insertions(+), 9 deletions(-)
+
+diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
+index 8c0b8383abe1e..270a0be672b7e 100644
+--- a/sound/usb/mixer_quirks.c
++++ b/sound/usb/mixer_quirks.c
+@@ -3899,16 +3899,12 @@ void snd_usb_mixer_fu_apply_quirk(struct usb_mixer_interface *mixer,
+ if (unitid == 7 && cval->control == UAC_FU_VOLUME)
+ snd_dragonfly_quirk_db_scale(mixer, cval, kctl);
+ break;
++ }
++
+ /* lowest playback value is muted on some devices */
+- case USB_ID(0x0572, 0x1b09): /* Conexant Systems (Rockwell), Inc. */
+- case USB_ID(0x0d8c, 0x000c): /* C-Media */
+- case USB_ID(0x0d8c, 0x0014): /* C-Media */
+- case USB_ID(0x19f7, 0x0003): /* RODE NT-USB */
+- case USB_ID(0x2d99, 0x0026): /* HECATE G2 GAMING HEADSET */
++ if (mixer->chip->quirk_flags & QUIRK_FLAG_MIXER_MIN_MUTE)
+ if (strstr(kctl->id.name, "Playback"))
+ cval->min_mute = 1;
+- break;
+- }
+
+ /* ALSA-ify some Plantronics headset control names */
+ if (USB_ID_VENDOR(mixer->chip->usb_id) == 0x047f &&
+diff --git a/sound/usb/quirks.c b/sound/usb/quirks.c
+index def326ddef267..3444c5735d756 100644
+--- a/sound/usb/quirks.c
++++ b/sound/usb/quirks.c
+@@ -2096,6 +2096,8 @@ static const struct usb_audio_quirk_flags_table quirk_flags_table[] = {
+ QUIRK_FLAG_SET_IFACE_FIRST),
+ DEVICE_FLG(0x0556, 0x0014, /* Phoenix Audio TMX320VC */
+ QUIRK_FLAG_GET_SAMPLE_RATE),
++ DEVICE_FLG(0x0572, 0x1b09, /* Conexant Systems (Rockwell), Inc. */
++ QUIRK_FLAG_MIXER_MIN_MUTE),
+ DEVICE_FLG(0x05a3, 0x9420, /* ELP HD USB Camera */
+ QUIRK_FLAG_GET_SAMPLE_RATE),
+ DEVICE_FLG(0x05a7, 0x1020, /* Bose Companion 5 */
+@@ -2142,8 +2144,10 @@ static const struct usb_audio_quirk_flags_table quirk_flags_table[] = {
+ QUIRK_FLAG_GET_SAMPLE_RATE),
+ DEVICE_FLG(0x0c45, 0x636b, /* Microdia JP001 USB Camera */
+ QUIRK_FLAG_GET_SAMPLE_RATE),
+- DEVICE_FLG(0x0d8c, 0x0014, /* USB Audio Device */
+- QUIRK_FLAG_CTL_MSG_DELAY_1M),
++ DEVICE_FLG(0x0d8c, 0x000c, /* C-Media */
++ QUIRK_FLAG_MIXER_MIN_MUTE),
++ DEVICE_FLG(0x0d8c, 0x0014, /* C-Media */
++ QUIRK_FLAG_CTL_MSG_DELAY_1M | QUIRK_FLAG_MIXER_MIN_MUTE),
+ DEVICE_FLG(0x0ecb, 0x205c, /* JBL Quantum610 Wireless */
+ QUIRK_FLAG_FIXED_RATE),
+ DEVICE_FLG(0x0ecb, 0x2069, /* JBL Quantum810 Wireless */
+@@ -2190,6 +2194,8 @@ static const struct usb_audio_quirk_flags_table quirk_flags_table[] = {
+ QUIRK_FLAG_ITF_USB_DSD_DAC | QUIRK_FLAG_CTL_MSG_DELAY),
+ DEVICE_FLG(0x1901, 0x0191, /* GE B850V3 CP2114 audio interface */
+ QUIRK_FLAG_GET_SAMPLE_RATE),
++ DEVICE_FLG(0x19f7, 0x0003, /* RODE NT-USB */
++ QUIRK_FLAG_MIXER_MIN_MUTE),
+ DEVICE_FLG(0x19f7, 0x0035, /* RODE NT-USB+ */
+ QUIRK_FLAG_GET_SAMPLE_RATE),
+ DEVICE_FLG(0x1bcf, 0x2281, /* HD Webcam */
+@@ -2250,6 +2256,8 @@ static const struct usb_audio_quirk_flags_table quirk_flags_table[] = {
+ QUIRK_FLAG_CTL_MSG_DELAY_1M),
+ DEVICE_FLG(0x2d95, 0x8021, /* VIVO USB-C-XE710 HEADSET */
+ QUIRK_FLAG_CTL_MSG_DELAY_1M),
++ DEVICE_FLG(0x2d99, 0x0026, /* HECATE G2 GAMING HEADSET */
++ QUIRK_FLAG_MIXER_MIN_MUTE),
+ DEVICE_FLG(0x2fc6, 0xf0b7, /* iBasso DC07 Pro */
+ QUIRK_FLAG_CTL_MSG_DELAY_1M),
+ DEVICE_FLG(0x30be, 0x0101, /* Schiit Hel */
+diff --git a/sound/usb/usbaudio.h b/sound/usb/usbaudio.h
+index ddfbe045e7a94..3c927316bc992 100644
+--- a/sound/usb/usbaudio.h
++++ b/sound/usb/usbaudio.h
+@@ -184,6 +184,9 @@ extern bool snd_usb_skip_validation;
+ * for the given endpoint.
+ * QUIRK_FLAG_MIC_RES_16 and QUIRK_FLAG_MIC_RES_384
+ * Set the fixed resolution for Mic Capture Volume (mostly for webcams)
++ * QUIRK_FLAG_MIXER_MIN_MUTE
++ * Set minimum volume control value as mute for devices where the lowest
++ * playback value represents muted state instead of minimum audible volume
+ */
+
+ #define QUIRK_FLAG_GET_SAMPLE_RATE (1U << 0)
+@@ -210,5 +213,6 @@ extern bool snd_usb_skip_validation;
+ #define QUIRK_FLAG_FIXED_RATE (1U << 21)
+ #define QUIRK_FLAG_MIC_RES_16 (1U << 22)
+ #define QUIRK_FLAG_MIC_RES_384 (1U << 23)
++#define QUIRK_FLAG_MIXER_MIN_MUTE (1U << 24)
+
+ #endif /* __USBAUDIO_H */
+--
+2.51.0
+
--- /dev/null
+From a16d5dcd032f911ad169d9c017a110a8fe7bbabc Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 26 May 2025 17:07:47 +0300
+Subject: ALSA: usb-audio: Remove unneeded wmb() in mixer_quirks
+
+From: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+
+[ Upstream commit 9cea7425595697802e8d55a322a251999554b8b1 ]
+
+Adding a memory barrier before wake_up() in
+snd_usb_soundblaster_remote_complete() is supposed to ensure the write
+to mixer->rc_code is visible in wait_event_interruptible() from
+snd_usb_sbrc_hwdep_read().
+
+However, this is not really necessary, since wake_up() is just a wrapper
+over __wake_up() which already executes a full memory barrier before
+accessing the state of the task to be waken up.
+
+Drop the redundant call to wmb() and implicitly fix the checkpatch
+complaint:
+
+ WARNING: memory barrier without comment
+
+Signed-off-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Link: https://patch.msgid.link/20250526-dualsense-alsa-jack-v1-8-1a821463b632@collabora.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/mixer_quirks.c | 1 -
+ 1 file changed, 1 deletion(-)
+
+diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
+index 9a5e8c47ce0d2..e5252167d6a40 100644
+--- a/sound/usb/mixer_quirks.c
++++ b/sound/usb/mixer_quirks.c
+@@ -208,7 +208,6 @@ static void snd_usb_soundblaster_remote_complete(struct urb *urb)
+ if (code == rc->mute_code)
+ snd_usb_mixer_notify_id(mixer, rc->mute_mixer_id);
+ mixer->rc_code = code;
+- wmb();
+ wake_up(&mixer->rc_waitq);
+ }
+
+--
+2.51.0
+
--- /dev/null
+From 4462ff893bc6816bba5830eabcd764a1210c9f1c Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 26 May 2025 17:07:46 +0300
+Subject: ALSA: usb-audio: Simplify NULL comparison in mixer_quirks
+
+From: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+
+[ Upstream commit f2d6d660e8fd5f4467e80743f82119201e67fa9c ]
+
+Handle report from checkpatch.pl:
+
+ CHECK: Comparison to NULL could be written "t->name"
+
+Signed-off-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Link: https://patch.msgid.link/20250526-dualsense-alsa-jack-v1-7-1a821463b632@collabora.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/mixer_quirks.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
+index f91dbc9255f12..9a5e8c47ce0d2 100644
+--- a/sound/usb/mixer_quirks.c
++++ b/sound/usb/mixer_quirks.c
+@@ -126,7 +126,7 @@ static int snd_create_std_mono_table(struct usb_mixer_interface *mixer,
+ {
+ int err;
+
+- while (t->name != NULL) {
++ while (t->name) {
+ err = snd_create_std_mono_ctl(mixer, t->unitid, t->control,
+ t->cmask, t->val_type, t->name, t->tlv_callback);
+ if (err < 0)
+--
+2.51.0
+
--- /dev/null
+From 0a8dd222dcca459c2dcfa6b4312b3688444319bd Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sat, 20 Sep 2025 11:51:48 +0900
+Subject: firewire: core: fix overlooked update of subsystem ABI version
+
+From: Takashi Sakamoto <o-takashi@sakamocchi.jp>
+
+[ Upstream commit 853a57ba263adfecf4430b936d6862bc475b4bb5 ]
+
+In kernel v6.5, several functions were added to the cdev layer. This
+required updating the default version of subsystem ABI up to 6, but
+this requirement was overlooked.
+
+This commit updates the version accordingly.
+
+Fixes: 6add87e9764d ("firewire: cdev: add new version of ABI to notify time stamp at request/response subaction of transaction#")
+Link: https://lore.kernel.org/r/20250920025148.163402-1-o-takashi@sakamocchi.jp
+Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/firewire/core-cdev.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/firewire/core-cdev.c b/drivers/firewire/core-cdev.c
+index 73cc2f2dcbf92..bdf4b035325e9 100644
+--- a/drivers/firewire/core-cdev.c
++++ b/drivers/firewire/core-cdev.c
+@@ -39,7 +39,7 @@
+ /*
+ * ABI version history is documented in linux/firewire-cdev.h.
+ */
+-#define FW_CDEV_KERNEL_VERSION 5
++#define FW_CDEV_KERNEL_VERSION 6
+ #define FW_CDEV_VERSION_EVENT_REQUEST2 4
+ #define FW_CDEV_VERSION_ALLOCATE_REGION_END 4
+ #define FW_CDEV_VERSION_AUTO_FLUSH_ISO_OVERFLOW 5
+--
+2.51.0
+
--- /dev/null
+From efea291f3e4a120426265a362e69a2d828086c87 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 27 May 2025 22:13:13 +0530
+Subject: HID: multitouch: Get the contact ID from HID_DG_TRANSDUCER_INDEX
+ fields in case of Apple Touch Bar
+
+From: Kerem Karabay <kekrby@gmail.com>
+
+[ Upstream commit f41d736acc039d86512951f4e874b0f5e666babf ]
+
+In Apple Touch Bar, the contact ID is contained in fields with the
+HID_DG_TRANSDUCER_INDEX usage rather than HID_DG_CONTACTID, thus differing
+from the HID spec. Add a quirk for the same.
+
+Acked-by: Benjamin Tissoires <bentiss@kernel.org>
+Signed-off-by: Kerem Karabay <kekrby@gmail.com>
+Co-developed-by: Aditya Garg <gargaditya08@live.com>
+Signed-off-by: Aditya Garg <gargaditya08@live.com>
+Signed-off-by: Jiri Kosina <jkosina@suse.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/hid/hid-multitouch.c | 16 +++++++++++++++-
+ 1 file changed, 15 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/hid/hid-multitouch.c b/drivers/hid/hid-multitouch.c
+index a85581cd511fd..35426e702b301 100644
+--- a/drivers/hid/hid-multitouch.c
++++ b/drivers/hid/hid-multitouch.c
+@@ -72,6 +72,7 @@ MODULE_LICENSE("GPL");
+ #define MT_QUIRK_FORCE_MULTI_INPUT BIT(20)
+ #define MT_QUIRK_DISABLE_WAKEUP BIT(21)
+ #define MT_QUIRK_ORIENTATION_INVERT BIT(22)
++#define MT_QUIRK_APPLE_TOUCHBAR BIT(23)
+
+ #define MT_INPUTMODE_TOUCHSCREEN 0x02
+ #define MT_INPUTMODE_TOUCHPAD 0x03
+@@ -612,6 +613,7 @@ static struct mt_application *mt_find_application(struct mt_device *td,
+ static struct mt_report_data *mt_allocate_report_data(struct mt_device *td,
+ struct hid_report *report)
+ {
++ struct mt_class *cls = &td->mtclass;
+ struct mt_report_data *rdata;
+ struct hid_field *field;
+ int r, n;
+@@ -636,7 +638,11 @@ static struct mt_report_data *mt_allocate_report_data(struct mt_device *td,
+
+ if (field->logical == HID_DG_FINGER || td->hdev->group != HID_GROUP_MULTITOUCH_WIN_8) {
+ for (n = 0; n < field->report_count; n++) {
+- if (field->usage[n].hid == HID_DG_CONTACTID) {
++ unsigned int hid = field->usage[n].hid;
++
++ if (hid == HID_DG_CONTACTID ||
++ (cls->quirks & MT_QUIRK_APPLE_TOUCHBAR &&
++ hid == HID_DG_TRANSDUCER_INDEX)) {
+ rdata->is_mt_collection = true;
+ break;
+ }
+@@ -814,6 +820,14 @@ static int mt_touch_input_mapping(struct hid_device *hdev, struct hid_input *hi,
+ EV_KEY, BTN_TOUCH);
+ MT_STORE_FIELD(tip_state);
+ return 1;
++ case HID_DG_TRANSDUCER_INDEX:
++ /*
++ * Contact ID in case of Apple Touch Bars is contained
++ * in fields with HID_DG_TRANSDUCER_INDEX usage.
++ */
++ if (!(cls->quirks & MT_QUIRK_APPLE_TOUCHBAR))
++ return 0;
++ fallthrough;
+ case HID_DG_CONTACTID:
+ MT_STORE_FIELD(contactid);
+ app->touches_by_report++;
+--
+2.51.0
+
--- /dev/null
+From 8d978b8739618dd418d99968c175d5c865e0b384 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 27 May 2025 22:13:16 +0530
+Subject: HID: multitouch: specify that Apple Touch Bar is direct
+
+From: Kerem Karabay <kekrby@gmail.com>
+
+[ Upstream commit 45ca23c5ee8b2b3074377fecc92fa72aa595f7c9 ]
+
+Currently the driver determines the device type based on the
+application, but this value is not reliable on Apple Touch Bar, where
+the application is HID_DG_TOUCHPAD even though this device is direct,
+so add a quirk for the same.
+
+Acked-by: Benjamin Tissoires <bentiss@kernel.org>
+Signed-off-by: Kerem Karabay <kekrby@gmail.com>
+Co-developed-by: Aditya Garg <gargaditya08@live.com>
+Signed-off-by: Aditya Garg <gargaditya08@live.com>
+Signed-off-by: Jiri Kosina <jkosina@suse.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/hid/hid-multitouch.c | 7 +++++++
+ 1 file changed, 7 insertions(+)
+
+diff --git a/drivers/hid/hid-multitouch.c b/drivers/hid/hid-multitouch.c
+index 8e9f71e69dd8c..d8fee341c096e 100644
+--- a/drivers/hid/hid-multitouch.c
++++ b/drivers/hid/hid-multitouch.c
+@@ -1336,6 +1336,13 @@ static int mt_touch_input_configured(struct hid_device *hdev,
+ if (td->serial_maybe)
+ mt_post_parse_default_settings(td, app);
+
++ /*
++ * The application for Apple Touch Bars is HID_DG_TOUCHPAD,
++ * but these devices are direct.
++ */
++ if (cls->quirks & MT_QUIRK_APPLE_TOUCHBAR)
++ app->mt_flags |= INPUT_MT_DIRECT;
++
+ if (cls->is_indirect)
+ app->mt_flags |= INPUT_MT_POINTER;
+
+--
+2.51.0
+
--- /dev/null
+From 350ed4a05e4f857a5f1e8c80e499f3cce702eda1 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 27 May 2025 22:13:14 +0530
+Subject: HID: multitouch: support getting the tip state from HID_DG_TOUCH
+ fields in Apple Touch Bar
+
+From: Kerem Karabay <kekrby@gmail.com>
+
+[ Upstream commit e0976a61a543b5e03bc0d08030a0ea036ee3751d ]
+
+In Apple Touch Bar, the tip state is contained in fields with the
+HID_DG_TOUCH usage. This feature is gated by a quirk in order to
+prevent breaking other devices, see commit c2ef8f21ea8f
+("HID: multitouch: add support for trackpads").
+
+Acked-by: Benjamin Tissoires <bentiss@kernel.org>
+Signed-off-by: Kerem Karabay <kekrby@gmail.com>
+Co-developed-by: Aditya Garg <gargaditya08@live.com>
+Signed-off-by: Aditya Garg <gargaditya08@live.com>
+Signed-off-by: Jiri Kosina <jkosina@suse.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/hid/hid-multitouch.c | 15 +++++++++++----
+ 1 file changed, 11 insertions(+), 4 deletions(-)
+
+diff --git a/drivers/hid/hid-multitouch.c b/drivers/hid/hid-multitouch.c
+index 35426e702b301..d0b2e866dadaf 100644
+--- a/drivers/hid/hid-multitouch.c
++++ b/drivers/hid/hid-multitouch.c
+@@ -814,6 +814,17 @@ static int mt_touch_input_mapping(struct hid_device *hdev, struct hid_input *hi,
+
+ MT_STORE_FIELD(confidence_state);
+ return 1;
++ case HID_DG_TOUCH:
++ /*
++ * Legacy devices use TIPSWITCH and not TOUCH.
++ * One special case here is of the Apple Touch Bars.
++ * In these devices, the tip state is contained in
++ * fields with the HID_DG_TOUCH usage.
++ * Let's just ignore this field for other devices.
++ */
++ if (!(cls->quirks & MT_QUIRK_APPLE_TOUCHBAR))
++ return -1;
++ fallthrough;
+ case HID_DG_TIPSWITCH:
+ if (field->application != HID_GD_SYSTEM_MULTIAXIS)
+ input_set_capability(hi->input,
+@@ -884,10 +895,6 @@ static int mt_touch_input_mapping(struct hid_device *hdev, struct hid_input *hi,
+ case HID_DG_CONTACTMAX:
+ /* contact max are global to the report */
+ return -1;
+- case HID_DG_TOUCH:
+- /* Legacy devices use TIPSWITCH and not TOUCH.
+- * Let's just ignore this field. */
+- return -1;
+ }
+ /* let hid-input decide for the others */
+ return 0;
+--
+2.51.0
+
--- /dev/null
+From 805659a3435f0a0793abec6d58dca903a96e287c Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 27 May 2025 22:13:15 +0530
+Subject: HID: multitouch: take cls->maxcontacts into account for Apple Touch
+ Bar even without a HID_DG_CONTACTMAX field
+
+From: Kerem Karabay <kekrby@gmail.com>
+
+[ Upstream commit 7dfe48bdc9d38db46283f2e0281bc1626277b8bf ]
+
+In Apple Touch Bar, the HID_DG_CONTACTMAX is not present, but the maximum
+contact count is still greater than the default. Add quirks for the same.
+
+Acked-by: Benjamin Tissoires <bentiss@kernel.org>
+Signed-off-by: Kerem Karabay <kekrby@gmail.com>
+Co-developed-by: Aditya Garg <gargaditya08@live.com>
+Signed-off-by: Aditya Garg <gargaditya08@live.com>
+Signed-off-by: Jiri Kosina <jkosina@suse.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/hid/hid-multitouch.c | 7 +++++++
+ 1 file changed, 7 insertions(+)
+
+diff --git a/drivers/hid/hid-multitouch.c b/drivers/hid/hid-multitouch.c
+index d0b2e866dadaf..8e9f71e69dd8c 100644
+--- a/drivers/hid/hid-multitouch.c
++++ b/drivers/hid/hid-multitouch.c
+@@ -1322,6 +1322,13 @@ static int mt_touch_input_configured(struct hid_device *hdev,
+ struct input_dev *input = hi->input;
+ int ret;
+
++ /*
++ * HID_DG_CONTACTMAX field is not present on Apple Touch Bars,
++ * but the maximum contact count is greater than the default.
++ */
++ if (cls->quirks & MT_QUIRK_APPLE_TOUCHBAR && cls->maxcontacts)
++ td->maxcontacts = cls->maxcontacts;
++
+ if (!td->maxcontacts)
+ td->maxcontacts = MT_DEFAULT_MAXCONTACT;
+
+--
+2.51.0
+
--- /dev/null
+From 09b340cd294dfaa1583009bb779d077bcbcf94e4 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 1 Jul 2025 15:22:49 +0300
+Subject: i2c: designware: Add quirk for Intel Xe
+
+From: Heikki Krogerus <heikki.krogerus@linux.intel.com>
+
+[ Upstream commit f6a8e9f3de4567c71ef9f5f13719df69a8b96081 ]
+
+The regmap is coming from the parent also in case of Xe
+GPUs. Reusing the Wangxun quirk for that.
+
+Acked-by: Jarkko Nikula <jarkko.nikula@linux.intel.com>
+Co-developed-by: Michael J. Ruhl <michael.j.ruhl@intel.com>
+Signed-off-by: Michael J. Ruhl <michael.j.ruhl@intel.com>
+Signed-off-by: Heikki Krogerus <heikki.krogerus@linux.intel.com>
+Reviewed-by: Andi Shyti <andi.shyti@kernel.org>
+Link: https://lore.kernel.org/r/20250701122252.2590230-3-heikki.krogerus@linux.intel.com
+Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
+[Rodrigo fixed the co-developed tags while merging]
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/i2c/busses/i2c-designware-platdrv.c | 7 +++++--
+ 1 file changed, 5 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/i2c/busses/i2c-designware-platdrv.c b/drivers/i2c/busses/i2c-designware-platdrv.c
+index f3245a6856309..1ebcf5673a06b 100644
+--- a/drivers/i2c/busses/i2c-designware-platdrv.c
++++ b/drivers/i2c/busses/i2c-designware-platdrv.c
+@@ -168,7 +168,7 @@ static inline int dw_i2c_of_configure(struct platform_device *pdev)
+ }
+ #endif
+
+-static int txgbe_i2c_request_regs(struct dw_i2c_dev *dev)
++static int dw_i2c_get_parent_regmap(struct dw_i2c_dev *dev)
+ {
+ dev->map = dev_get_regmap(dev->dev->parent, NULL);
+ if (!dev->map)
+@@ -190,12 +190,15 @@ static int dw_i2c_plat_request_regs(struct dw_i2c_dev *dev)
+ struct platform_device *pdev = to_platform_device(dev->dev);
+ int ret;
+
++ if (device_is_compatible(dev->dev, "intel,xe-i2c"))
++ return dw_i2c_get_parent_regmap(dev);
++
+ switch (dev->flags & MODEL_MASK) {
+ case MODEL_BAIKAL_BT1:
+ ret = bt1_i2c_request_regs(dev);
+ break;
+ case MODEL_WANGXUN_SP:
+- ret = txgbe_i2c_request_regs(dev);
++ ret = dw_i2c_get_parent_regmap(dev);
+ break;
+ default:
+ dev->base = devm_platform_ioremap_resource(pdev, 0);
+--
+2.51.0
+
--- /dev/null
+From 59281cf0dcecd0d8716db481540952060d86d5c6 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 13 Aug 2025 15:43:20 +0300
+Subject: IB/mlx5: Fix obj_type mismatch for SRQ event subscriptions
+
+From: Or Har-Toov <ohartoov@nvidia.com>
+
+[ Upstream commit 85fe9f565d2d5af95ac2bbaa5082b8ce62b039f5 ]
+
+Fix a bug where the driver's event subscription logic for SRQ-related
+events incorrectly sets obj_type for RMP objects.
+
+When subscribing to SRQ events, get_legacy_obj_type() did not handle
+the MLX5_CMD_OP_CREATE_RMP case, which caused obj_type to be 0
+(default).
+This led to a mismatch between the obj_type used during subscription
+(0) and the value used during notification (1, taken from the event's
+type field). As a result, event mapping for SRQ objects could fail and
+event notification would not be delivered correctly.
+
+This fix adds handling for MLX5_CMD_OP_CREATE_RMP in get_legacy_obj_type,
+returning MLX5_EVENT_QUEUE_TYPE_RQ so obj_type is consistent between
+subscription and notification.
+
+Fixes: 759738537142 ("IB/mlx5: Enable subscription for device events over DEVX")
+Link: https://patch.msgid.link/r/8f1048e3fdd1fde6b90607ce0ed251afaf8a148c.1755088962.git.leon@kernel.org
+Signed-off-by: Or Har-Toov <ohartoov@nvidia.com>
+Reviewed-by: Edward Srouji <edwards@nvidia.com>
+Signed-off-by: Leon Romanovsky <leonro@nvidia.com>
+Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/infiniband/hw/mlx5/devx.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/drivers/infiniband/hw/mlx5/devx.c b/drivers/infiniband/hw/mlx5/devx.c
+index 3f1fa45d93682..388c95562a927 100644
+--- a/drivers/infiniband/hw/mlx5/devx.c
++++ b/drivers/infiniband/hw/mlx5/devx.c
+@@ -191,6 +191,7 @@ static u16 get_legacy_obj_type(u16 opcode)
+ {
+ switch (opcode) {
+ case MLX5_CMD_OP_CREATE_RQ:
++ case MLX5_CMD_OP_CREATE_RMP:
+ return MLX5_EVENT_QUEUE_TYPE_RQ;
+ case MLX5_CMD_OP_CREATE_QP:
+ return MLX5_EVENT_QUEUE_TYPE_QP;
+--
+2.51.0
+
--- /dev/null
+From 56d94660c3e8de98cc04255cf7c9693a13a8e4c4 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 17 Jun 2025 15:25:52 +0200
+Subject: mmc: sdhci-cadence: add Mobileye eyeQ support
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Benoît Monin <benoit.monin@bootlin.com>
+
+[ Upstream commit 120ffe250dd95b5089d032f582c5be9e3a04b94b ]
+
+The MMC/SDHCI controller implemented by Mobileye needs the preset value
+quirks to configure the clock properly at speed slower than HS200.
+It otherwise works as a standard sd4hc controller.
+
+Signed-off-by: Benoît Monin <benoit.monin@bootlin.com>
+Link: https://lore.kernel.org/r/e97f409650495791e07484589e1666ead570fa12.1750156323.git.benoit.monin@bootlin.com
+Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/mmc/host/sdhci-cadence.c | 11 +++++++++++
+ 1 file changed, 11 insertions(+)
+
+diff --git a/drivers/mmc/host/sdhci-cadence.c b/drivers/mmc/host/sdhci-cadence.c
+index be1505e8c536e..7759531ccca70 100644
+--- a/drivers/mmc/host/sdhci-cadence.c
++++ b/drivers/mmc/host/sdhci-cadence.c
+@@ -433,6 +433,13 @@ static const struct sdhci_cdns_drv_data sdhci_elba_drv_data = {
+ },
+ };
+
++static const struct sdhci_cdns_drv_data sdhci_eyeq_drv_data = {
++ .pltfm_data = {
++ .ops = &sdhci_cdns_ops,
++ .quirks2 = SDHCI_QUIRK2_PRESET_VALUE_BROKEN,
++ },
++};
++
+ static const struct sdhci_cdns_drv_data sdhci_cdns_drv_data = {
+ .pltfm_data = {
+ .ops = &sdhci_cdns_ops,
+@@ -595,6 +602,10 @@ static const struct of_device_id sdhci_cdns_match[] = {
+ .compatible = "amd,pensando-elba-sd4hc",
+ .data = &sdhci_elba_drv_data,
+ },
++ {
++ .compatible = "mobileye,eyeq-sd4hc",
++ .data = &sdhci_eyeq_drv_data,
++ },
+ { .compatible = "cdns,sd4hc" },
+ { /* sentinel */ }
+ };
+--
+2.51.0
+
--- /dev/null
+From 053a8a54007380998c92a1c12dfd92746097745e Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sun, 7 Sep 2025 12:40:16 -0700
+Subject: scsi: ufs: mcq: Fix memory allocation checks for SQE and CQE
+
+From: Alok Tiwari <alok.a.tiwari@oracle.com>
+
+[ Upstream commit 5cb782ff3c62c837e4984b6ae9f5d9a423cd5088 ]
+
+Previous checks incorrectly tested the DMA addresses (dma_handle) for
+NULL. Since dma_alloc_coherent() returns the CPU (virtual) address, the
+NULL check should be performed on the *_base_addr pointer to correctly
+detect allocation failures.
+
+Update the checks to validate sqe_base_addr and cqe_base_addr instead of
+sqe_dma_addr and cqe_dma_addr.
+
+Fixes: 4682abfae2eb ("scsi: ufs: core: mcq: Allocate memory for MCQ mode")
+Signed-off-by: Alok Tiwari <alok.a.tiwari@oracle.com>
+Reviewed-by: Alim Akhtar <alim.akhtar@samsung.com>
+Reviewed-by: Manivannan Sadhasivam <mani@kernel.org>
+Reviewed-by: Peter Wang <peter.wang@mediatek.com>
+Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/ufs/core/ufs-mcq.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/ufs/core/ufs-mcq.c b/drivers/ufs/core/ufs-mcq.c
+index 14864cfc24223..cb8f0652a4bee 100644
+--- a/drivers/ufs/core/ufs-mcq.c
++++ b/drivers/ufs/core/ufs-mcq.c
+@@ -209,7 +209,7 @@ int ufshcd_mcq_memory_alloc(struct ufs_hba *hba)
+ hwq->sqe_base_addr = dmam_alloc_coherent(hba->dev, utrdl_size,
+ &hwq->sqe_dma_addr,
+ GFP_KERNEL);
+- if (!hwq->sqe_dma_addr) {
++ if (!hwq->sqe_base_addr) {
+ dev_err(hba->dev, "SQE allocation failed\n");
+ return -ENOMEM;
+ }
+@@ -218,7 +218,7 @@ int ufshcd_mcq_memory_alloc(struct ufs_hba *hba)
+ hwq->cqe_base_addr = dmam_alloc_coherent(hba->dev, cqe_size,
+ &hwq->cqe_dma_addr,
+ GFP_KERNEL);
+- if (!hwq->cqe_dma_addr) {
++ if (!hwq->cqe_base_addr) {
+ dev_err(hba->dev, "CQE allocation failed\n");
+ return -ENOMEM;
+ }
+--
+2.51.0
+
--- /dev/null
+scsi-ufs-mcq-fix-memory-allocation-checks-for-sqe-an.patch
+firewire-core-fix-overlooked-update-of-subsystem-abi.patch
+alsa-usb-audio-fix-block-comments-in-mixer_quirks.patch
+alsa-usb-audio-drop-unnecessary-parentheses-in-mixer.patch
+alsa-usb-audio-avoid-multiple-assignments-in-mixer_q.patch
+alsa-usb-audio-simplify-null-comparison-in-mixer_qui.patch
+alsa-usb-audio-remove-unneeded-wmb-in-mixer_quirks.patch
+alsa-usb-audio-add-mixer-quirk-for-sony-dualsense-ps.patch
+hid-multitouch-get-the-contact-id-from-hid_dg_transd.patch
+hid-multitouch-support-getting-the-tip-state-from-hi.patch
+hid-multitouch-take-cls-maxcontacts-into-account-for.patch
+hid-multitouch-specify-that-apple-touch-bar-is-direc.patch
+alsa-usb-audio-convert-comma-to-semicolon.patch
+alsa-usb-audio-fix-build-with-config_input-n.patch
+usb-core-add-0x-prefix-to-quirks-debug-output.patch
+mmc-sdhci-cadence-add-mobileye-eyeq-support.patch
+i2c-designware-add-quirk-for-intel-xe.patch
+alsa-usb-audio-add-dsd-support-for-comtrue-usb-audio.patch
+alsa-usb-audio-move-mixer_quirks-min_mute-into-commo.patch
+alsa-usb-audio-add-mute-tlv-for-playback-volumes-on-.patch
+ib-mlx5-fix-obj_type-mismatch-for-srq-event-subscrip.patch
--- /dev/null
+From 023b1249fbb069dae08191b3d6f9d195f139cfee Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 3 Jun 2025 15:10:45 +0800
+Subject: usb: core: Add 0x prefix to quirks debug output
+
+From: Jiayi Li <lijiayi@kylinos.cn>
+
+[ Upstream commit 47c428fce0b41b15ab321d8ede871f780ccd038f ]
+
+Use "0x%x" format for quirks debug print to clarify it's a hexadecimal
+value. Improves readability and consistency with other hex outputs.
+
+Signed-off-by: Jiayi Li <lijiayi@kylinos.cn>
+Link: https://lore.kernel.org/r/20250603071045.3243699-1-lijiayi@kylinos.cn
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/usb/core/quirks.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/usb/core/quirks.c b/drivers/usb/core/quirks.c
+index bfd97cad8aa4d..c0fd8ab3fe8fc 100644
+--- a/drivers/usb/core/quirks.c
++++ b/drivers/usb/core/quirks.c
+@@ -734,7 +734,7 @@ void usb_detect_quirks(struct usb_device *udev)
+ udev->quirks ^= usb_detect_dynamic_quirks(udev);
+
+ if (udev->quirks)
+- dev_dbg(&udev->dev, "USB quirks for this device: %x\n",
++ dev_dbg(&udev->dev, "USB quirks for this device: 0x%x\n",
+ udev->quirks);
+
+ #ifdef CONFIG_USB_DEFAULT_PERSIST
+--
+2.51.0
+