From: Sasha Levin Date: Thu, 25 Sep 2025 11:29:27 +0000 (-0400) Subject: Fixes for all trees X-Git-Tag: v5.4.300~48 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=229de620300d388ea373b3055f1bd8b01781a264;p=thirdparty%2Fkernel%2Fstable-queue.git Fixes for all trees Signed-off-by: Sasha Levin --- diff --git a/queue-5.10/alsa-usb-audio-add-mixer-quirk-for-sony-dualsense-ps.patch b/queue-5.10/alsa-usb-audio-add-mixer-quirk-for-sony-dualsense-ps.patch new file mode 100644 index 0000000000..8d277196f0 --- /dev/null +++ b/queue-5.10/alsa-usb-audio-add-mixer-quirk-for-sony-dualsense-ps.patch @@ -0,0 +1,321 @@ +From aae7c4a48d7ec0086c5d0b0cd843ca8b039937fa Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 26 May 2025 17:07:48 +0300 +Subject: ALSA: usb-audio: Add mixer quirk for Sony DualSense PS5 + +From: Cristian Ciocaltea + +[ 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 +Signed-off-by: Takashi Iwai +Link: https://patch.msgid.link/20250526-dualsense-alsa-jack-v1-9-1a821463b632@collabora.com +Signed-off-by: Sasha Levin +--- + 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 + #include ++#include + #include + #include + #include +@@ -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 + diff --git a/queue-5.10/alsa-usb-audio-avoid-multiple-assignments-in-mixer_q.patch b/queue-5.10/alsa-usb-audio-avoid-multiple-assignments-in-mixer_q.patch new file mode 100644 index 0000000000..e9889a9870 --- /dev/null +++ b/queue-5.10/alsa-usb-audio-avoid-multiple-assignments-in-mixer_q.patch @@ -0,0 +1,38 @@ +From 2ebef1c6f533eec70e0322bf794d211d4436903d Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 26 May 2025 17:07:45 +0300 +Subject: ALSA: usb-audio: Avoid multiple assignments in mixer_quirks + +From: Cristian Ciocaltea + +[ Upstream commit 03ddd3bdb94df3edb1f2408b57cfb00b3d92a208 ] + +Handle report from checkpatch.pl: + + CHECK: multiple assignments should be avoided + +Signed-off-by: Cristian Ciocaltea +Signed-off-by: Takashi Iwai +Link: https://patch.msgid.link/20250526-dualsense-alsa-jack-v1-6-1a821463b632@collabora.com +Signed-off-by: Sasha Levin +--- + 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 + diff --git a/queue-5.10/alsa-usb-audio-convert-comma-to-semicolon.patch b/queue-5.10/alsa-usb-audio-convert-comma-to-semicolon.patch new file mode 100644 index 0000000000..e4a6a99b99 --- /dev/null +++ b/queue-5.10/alsa-usb-audio-convert-comma-to-semicolon.patch @@ -0,0 +1,49 @@ +From 6006635713f5f390520b3cd45d2a08019562c6d6 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 12 Jun 2025 14:02:28 +0800 +Subject: ALSA: usb-audio: Convert comma to semicolon + +From: Chen Ni + +[ 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 +Reviewed-by: Cristian Ciocaltea +Link: https://patch.msgid.link/20250612060228.1518028-1-nichen@iscas.ac.cn +Signed-off-by: Takashi Iwai +Signed-off-by: Sasha Levin +--- + 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 + diff --git a/queue-5.10/alsa-usb-audio-drop-unnecessary-parentheses-in-mixer.patch b/queue-5.10/alsa-usb-audio-drop-unnecessary-parentheses-in-mixer.patch new file mode 100644 index 0000000000..5952e607a8 --- /dev/null +++ b/queue-5.10/alsa-usb-audio-drop-unnecessary-parentheses-in-mixer.patch @@ -0,0 +1,49 @@ +From bb184cf188384db8adb08b80725688e5c20866b2 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 26 May 2025 17:07:44 +0300 +Subject: ALSA: usb-audio: Drop unnecessary parentheses in mixer_quirks + +From: Cristian Ciocaltea + +[ Upstream commit c0495cef8b43ad61efbd4019e3573742e0e63c67 ] + +Fix multiple 'CHECK: Unnecessary parentheses around ...' reports from +checkpatch.pl. + +Signed-off-by: Cristian Ciocaltea +Signed-off-by: Takashi Iwai +Link: https://patch.msgid.link/20250526-dualsense-alsa-jack-v1-5-1a821463b632@collabora.com +Signed-off-by: Sasha Levin +--- + 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 + diff --git a/queue-5.10/alsa-usb-audio-fix-block-comments-in-mixer_quirks.patch b/queue-5.10/alsa-usb-audio-fix-block-comments-in-mixer_quirks.patch new file mode 100644 index 0000000000..751ced099f --- /dev/null +++ b/queue-5.10/alsa-usb-audio-fix-block-comments-in-mixer_quirks.patch @@ -0,0 +1,49 @@ +From 9c97f4c5d9d4f471f95b7e82fb7e15fd73a467c1 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 26 May 2025 17:07:43 +0300 +Subject: ALSA: usb-audio: Fix block comments in mixer_quirks + +From: Cristian Ciocaltea + +[ 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 +Signed-off-by: Takashi Iwai +Link: https://patch.msgid.link/20250526-dualsense-alsa-jack-v1-4-1a821463b632@collabora.com +Signed-off-by: Sasha Levin +--- + 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 + diff --git a/queue-5.10/alsa-usb-audio-fix-build-with-config_input-n.patch b/queue-5.10/alsa-usb-audio-fix-build-with-config_input-n.patch new file mode 100644 index 0000000000..171ce13b1f --- /dev/null +++ b/queue-5.10/alsa-usb-audio-fix-build-with-config_input-n.patch @@ -0,0 +1,61 @@ +From 82ea2e8dbf99058ffb3fbe7176aa07ef135ec718 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 13 Jun 2025 10:15:30 +0200 +Subject: ALSA: usb-audio: Fix build with CONFIG_INPUT=n + +From: Takashi Iwai + +[ 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 +Closes: https://lore.kernel.org/oe-kbuild-all/202506130733.gnPKw2l3-lkp@intel.com/ +Reviewed-by: Cristian Ciocaltea +Link: https://patch.msgid.link/20250613081543.7404-1-tiwai@suse.de +Signed-off-by: Takashi Iwai +Signed-off-by: Sasha Levin +--- + 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 + diff --git a/queue-5.10/alsa-usb-audio-remove-unneeded-wmb-in-mixer_quirks.patch b/queue-5.10/alsa-usb-audio-remove-unneeded-wmb-in-mixer_quirks.patch new file mode 100644 index 0000000000..8f04a3f00e --- /dev/null +++ b/queue-5.10/alsa-usb-audio-remove-unneeded-wmb-in-mixer_quirks.patch @@ -0,0 +1,46 @@ +From f253476ca1dd3adb48f94816681f306eff7409dc Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 26 May 2025 17:07:47 +0300 +Subject: ALSA: usb-audio: Remove unneeded wmb() in mixer_quirks + +From: Cristian Ciocaltea + +[ 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 +Signed-off-by: Takashi Iwai +Link: https://patch.msgid.link/20250526-dualsense-alsa-jack-v1-8-1a821463b632@collabora.com +Signed-off-by: Sasha Levin +--- + 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 + diff --git a/queue-5.10/alsa-usb-audio-simplify-null-comparison-in-mixer_qui.patch b/queue-5.10/alsa-usb-audio-simplify-null-comparison-in-mixer_qui.patch new file mode 100644 index 0000000000..b74367992c --- /dev/null +++ b/queue-5.10/alsa-usb-audio-simplify-null-comparison-in-mixer_qui.patch @@ -0,0 +1,37 @@ +From 6ce582331bc9e2977da2c43540a3a3b721c39ea4 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 26 May 2025 17:07:46 +0300 +Subject: ALSA: usb-audio: Simplify NULL comparison in mixer_quirks + +From: Cristian Ciocaltea + +[ Upstream commit f2d6d660e8fd5f4467e80743f82119201e67fa9c ] + +Handle report from checkpatch.pl: + + CHECK: Comparison to NULL could be written "t->name" + +Signed-off-by: Cristian Ciocaltea +Signed-off-by: Takashi Iwai +Link: https://patch.msgid.link/20250526-dualsense-alsa-jack-v1-7-1a821463b632@collabora.com +Signed-off-by: Sasha Levin +--- + 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 + diff --git a/queue-5.10/firewire-core-fix-overlooked-update-of-subsystem-abi.patch b/queue-5.10/firewire-core-fix-overlooked-update-of-subsystem-abi.patch new file mode 100644 index 0000000000..6c5c683a83 --- /dev/null +++ b/queue-5.10/firewire-core-fix-overlooked-update-of-subsystem-abi.patch @@ -0,0 +1,39 @@ +From 8c5093e9e68a59ea8a60ff2fc602fad3ec5b50a0 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sat, 20 Sep 2025 11:51:48 +0900 +Subject: firewire: core: fix overlooked update of subsystem ABI version + +From: Takashi Sakamoto + +[ 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 +Signed-off-by: Sasha Levin +--- + 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 + diff --git a/queue-5.10/ib-mlx5-fix-obj_type-mismatch-for-srq-event-subscrip.patch b/queue-5.10/ib-mlx5-fix-obj_type-mismatch-for-srq-event-subscrip.patch new file mode 100644 index 0000000000..c380f3aaee --- /dev/null +++ b/queue-5.10/ib-mlx5-fix-obj_type-mismatch-for-srq-event-subscrip.patch @@ -0,0 +1,50 @@ +From b38fcefa59785767651c8315e4a4096026933874 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 13 Aug 2025 15:43:20 +0300 +Subject: IB/mlx5: Fix obj_type mismatch for SRQ event subscriptions + +From: Or Har-Toov + +[ 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 +Reviewed-by: Edward Srouji +Signed-off-by: Leon Romanovsky +Signed-off-by: Jason Gunthorpe +Signed-off-by: Sasha Levin +--- + 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 + diff --git a/queue-5.10/series b/queue-5.10/series index e16eca41d1..0add3a6fd8 100644 --- a/queue-5.10/series +++ b/queue-5.10/series @@ -81,3 +81,14 @@ net-rfkill-gpio-add-dt-support.patch 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 diff --git a/queue-5.10/usb-core-add-0x-prefix-to-quirks-debug-output.patch b/queue-5.10/usb-core-add-0x-prefix-to-quirks-debug-output.patch new file mode 100644 index 0000000000..dd2c172037 --- /dev/null +++ b/queue-5.10/usb-core-add-0x-prefix-to-quirks-debug-output.patch @@ -0,0 +1,36 @@ +From d9c9d67082d57f7be3052736a2c04d2cfde2b019 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 3 Jun 2025 15:10:45 +0800 +Subject: usb: core: Add 0x prefix to quirks debug output + +From: Jiayi Li + +[ 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 +Link: https://lore.kernel.org/r/20250603071045.3243699-1-lijiayi@kylinos.cn +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Sasha Levin +--- + 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 + diff --git a/queue-5.15/alsa-usb-audio-add-mixer-quirk-for-sony-dualsense-ps.patch b/queue-5.15/alsa-usb-audio-add-mixer-quirk-for-sony-dualsense-ps.patch new file mode 100644 index 0000000000..1c4d27ee93 --- /dev/null +++ b/queue-5.15/alsa-usb-audio-add-mixer-quirk-for-sony-dualsense-ps.patch @@ -0,0 +1,321 @@ +From 12fb8832c10c265d2b1dea59ecfeda0eb4cf3d66 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 26 May 2025 17:07:48 +0300 +Subject: ALSA: usb-audio: Add mixer quirk for Sony DualSense PS5 + +From: Cristian Ciocaltea + +[ 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 +Signed-off-by: Takashi Iwai +Link: https://patch.msgid.link/20250526-dualsense-alsa-jack-v1-9-1a821463b632@collabora.com +Signed-off-by: Sasha Levin +--- + 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 + #include ++#include + #include + #include + #include +@@ -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 + diff --git a/queue-5.15/alsa-usb-audio-avoid-multiple-assignments-in-mixer_q.patch b/queue-5.15/alsa-usb-audio-avoid-multiple-assignments-in-mixer_q.patch new file mode 100644 index 0000000000..8fbfd9f96c --- /dev/null +++ b/queue-5.15/alsa-usb-audio-avoid-multiple-assignments-in-mixer_q.patch @@ -0,0 +1,38 @@ +From 8384af7d46a666fb0b1143d8e4ceea30a082b3f7 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 26 May 2025 17:07:45 +0300 +Subject: ALSA: usb-audio: Avoid multiple assignments in mixer_quirks + +From: Cristian Ciocaltea + +[ Upstream commit 03ddd3bdb94df3edb1f2408b57cfb00b3d92a208 ] + +Handle report from checkpatch.pl: + + CHECK: multiple assignments should be avoided + +Signed-off-by: Cristian Ciocaltea +Signed-off-by: Takashi Iwai +Link: https://patch.msgid.link/20250526-dualsense-alsa-jack-v1-6-1a821463b632@collabora.com +Signed-off-by: Sasha Levin +--- + 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 + diff --git a/queue-5.15/alsa-usb-audio-convert-comma-to-semicolon.patch b/queue-5.15/alsa-usb-audio-convert-comma-to-semicolon.patch new file mode 100644 index 0000000000..8b8f46a255 --- /dev/null +++ b/queue-5.15/alsa-usb-audio-convert-comma-to-semicolon.patch @@ -0,0 +1,49 @@ +From f3052688acdc59fc9d118721d033519f711b7fe8 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 12 Jun 2025 14:02:28 +0800 +Subject: ALSA: usb-audio: Convert comma to semicolon + +From: Chen Ni + +[ 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 +Reviewed-by: Cristian Ciocaltea +Link: https://patch.msgid.link/20250612060228.1518028-1-nichen@iscas.ac.cn +Signed-off-by: Takashi Iwai +Signed-off-by: Sasha Levin +--- + 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 + diff --git a/queue-5.15/alsa-usb-audio-drop-unnecessary-parentheses-in-mixer.patch b/queue-5.15/alsa-usb-audio-drop-unnecessary-parentheses-in-mixer.patch new file mode 100644 index 0000000000..3d6253df1a --- /dev/null +++ b/queue-5.15/alsa-usb-audio-drop-unnecessary-parentheses-in-mixer.patch @@ -0,0 +1,49 @@ +From c73cf6bb37df2d1c41632050d689c9344c7d36d0 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 26 May 2025 17:07:44 +0300 +Subject: ALSA: usb-audio: Drop unnecessary parentheses in mixer_quirks + +From: Cristian Ciocaltea + +[ Upstream commit c0495cef8b43ad61efbd4019e3573742e0e63c67 ] + +Fix multiple 'CHECK: Unnecessary parentheses around ...' reports from +checkpatch.pl. + +Signed-off-by: Cristian Ciocaltea +Signed-off-by: Takashi Iwai +Link: https://patch.msgid.link/20250526-dualsense-alsa-jack-v1-5-1a821463b632@collabora.com +Signed-off-by: Sasha Levin +--- + 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 + diff --git a/queue-5.15/alsa-usb-audio-fix-block-comments-in-mixer_quirks.patch b/queue-5.15/alsa-usb-audio-fix-block-comments-in-mixer_quirks.patch new file mode 100644 index 0000000000..4d79b95ebc --- /dev/null +++ b/queue-5.15/alsa-usb-audio-fix-block-comments-in-mixer_quirks.patch @@ -0,0 +1,49 @@ +From 214058846afe05b5006310fb5a3fcda407da42d8 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 26 May 2025 17:07:43 +0300 +Subject: ALSA: usb-audio: Fix block comments in mixer_quirks + +From: Cristian Ciocaltea + +[ 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 +Signed-off-by: Takashi Iwai +Link: https://patch.msgid.link/20250526-dualsense-alsa-jack-v1-4-1a821463b632@collabora.com +Signed-off-by: Sasha Levin +--- + 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 + diff --git a/queue-5.15/alsa-usb-audio-fix-build-with-config_input-n.patch b/queue-5.15/alsa-usb-audio-fix-build-with-config_input-n.patch new file mode 100644 index 0000000000..44a15419e1 --- /dev/null +++ b/queue-5.15/alsa-usb-audio-fix-build-with-config_input-n.patch @@ -0,0 +1,61 @@ +From 8d09d38339c3772d61c618193eb78f18af85ba5a Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 13 Jun 2025 10:15:30 +0200 +Subject: ALSA: usb-audio: Fix build with CONFIG_INPUT=n + +From: Takashi Iwai + +[ 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 +Closes: https://lore.kernel.org/oe-kbuild-all/202506130733.gnPKw2l3-lkp@intel.com/ +Reviewed-by: Cristian Ciocaltea +Link: https://patch.msgid.link/20250613081543.7404-1-tiwai@suse.de +Signed-off-by: Takashi Iwai +Signed-off-by: Sasha Levin +--- + 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 + diff --git a/queue-5.15/alsa-usb-audio-remove-unneeded-wmb-in-mixer_quirks.patch b/queue-5.15/alsa-usb-audio-remove-unneeded-wmb-in-mixer_quirks.patch new file mode 100644 index 0000000000..5b90716acd --- /dev/null +++ b/queue-5.15/alsa-usb-audio-remove-unneeded-wmb-in-mixer_quirks.patch @@ -0,0 +1,46 @@ +From 4cfee87dca7ee02e5186386d78944a84ebbd744e Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 26 May 2025 17:07:47 +0300 +Subject: ALSA: usb-audio: Remove unneeded wmb() in mixer_quirks + +From: Cristian Ciocaltea + +[ 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 +Signed-off-by: Takashi Iwai +Link: https://patch.msgid.link/20250526-dualsense-alsa-jack-v1-8-1a821463b632@collabora.com +Signed-off-by: Sasha Levin +--- + 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 + diff --git a/queue-5.15/alsa-usb-audio-simplify-null-comparison-in-mixer_qui.patch b/queue-5.15/alsa-usb-audio-simplify-null-comparison-in-mixer_qui.patch new file mode 100644 index 0000000000..558f15821a --- /dev/null +++ b/queue-5.15/alsa-usb-audio-simplify-null-comparison-in-mixer_qui.patch @@ -0,0 +1,37 @@ +From 8753adcb709f9740038d32339aa624391c9530ba Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 26 May 2025 17:07:46 +0300 +Subject: ALSA: usb-audio: Simplify NULL comparison in mixer_quirks + +From: Cristian Ciocaltea + +[ Upstream commit f2d6d660e8fd5f4467e80743f82119201e67fa9c ] + +Handle report from checkpatch.pl: + + CHECK: Comparison to NULL could be written "t->name" + +Signed-off-by: Cristian Ciocaltea +Signed-off-by: Takashi Iwai +Link: https://patch.msgid.link/20250526-dualsense-alsa-jack-v1-7-1a821463b632@collabora.com +Signed-off-by: Sasha Levin +--- + 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 + diff --git a/queue-5.15/firewire-core-fix-overlooked-update-of-subsystem-abi.patch b/queue-5.15/firewire-core-fix-overlooked-update-of-subsystem-abi.patch new file mode 100644 index 0000000000..d2a11c378e --- /dev/null +++ b/queue-5.15/firewire-core-fix-overlooked-update-of-subsystem-abi.patch @@ -0,0 +1,39 @@ +From 6df51ff6e19b1a32deb89eda387fc3d0e4dd6081 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sat, 20 Sep 2025 11:51:48 +0900 +Subject: firewire: core: fix overlooked update of subsystem ABI version + +From: Takashi Sakamoto + +[ 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 +Signed-off-by: Sasha Levin +--- + 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 + diff --git a/queue-5.15/ib-mlx5-fix-obj_type-mismatch-for-srq-event-subscrip.patch b/queue-5.15/ib-mlx5-fix-obj_type-mismatch-for-srq-event-subscrip.patch new file mode 100644 index 0000000000..ded938f5e3 --- /dev/null +++ b/queue-5.15/ib-mlx5-fix-obj_type-mismatch-for-srq-event-subscrip.patch @@ -0,0 +1,50 @@ +From 2376806b6718a40547d4feafecd41e053ffbf0e2 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 13 Aug 2025 15:43:20 +0300 +Subject: IB/mlx5: Fix obj_type mismatch for SRQ event subscriptions + +From: Or Har-Toov + +[ 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 +Reviewed-by: Edward Srouji +Signed-off-by: Leon Romanovsky +Signed-off-by: Jason Gunthorpe +Signed-off-by: Sasha Levin +--- + 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 + diff --git a/queue-5.15/series b/queue-5.15/series index 8c89d1d5be..dfae519d23 100644 --- a/queue-5.15/series +++ b/queue-5.15/series @@ -100,3 +100,14 @@ ksmbd-smbdirect-validate-data_offset-and-data_length-field-of-smb_direct_data_tr 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 diff --git a/queue-5.15/usb-core-add-0x-prefix-to-quirks-debug-output.patch b/queue-5.15/usb-core-add-0x-prefix-to-quirks-debug-output.patch new file mode 100644 index 0000000000..649124d211 --- /dev/null +++ b/queue-5.15/usb-core-add-0x-prefix-to-quirks-debug-output.patch @@ -0,0 +1,36 @@ +From 7182632669297365e9302b4e353956788cc9e870 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 3 Jun 2025 15:10:45 +0800 +Subject: usb: core: Add 0x prefix to quirks debug output + +From: Jiayi Li + +[ 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 +Link: https://lore.kernel.org/r/20250603071045.3243699-1-lijiayi@kylinos.cn +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Sasha Levin +--- + 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 + diff --git a/queue-5.4/alsa-usb-audio-add-mixer-quirk-for-sony-dualsense-ps.patch b/queue-5.4/alsa-usb-audio-add-mixer-quirk-for-sony-dualsense-ps.patch new file mode 100644 index 0000000000..b807f4d045 --- /dev/null +++ b/queue-5.4/alsa-usb-audio-add-mixer-quirk-for-sony-dualsense-ps.patch @@ -0,0 +1,321 @@ +From 6e9f8482c48870b45b89948251b95a3700f48c30 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 26 May 2025 17:07:48 +0300 +Subject: ALSA: usb-audio: Add mixer quirk for Sony DualSense PS5 + +From: Cristian Ciocaltea + +[ 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 +Signed-off-by: Takashi Iwai +Link: https://patch.msgid.link/20250526-dualsense-alsa-jack-v1-9-1a821463b632@collabora.com +Signed-off-by: Sasha Levin +--- + 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 + #include ++#include + #include + #include + #include +@@ -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 + diff --git a/queue-5.4/alsa-usb-audio-avoid-multiple-assignments-in-mixer_q.patch b/queue-5.4/alsa-usb-audio-avoid-multiple-assignments-in-mixer_q.patch new file mode 100644 index 0000000000..150d369c59 --- /dev/null +++ b/queue-5.4/alsa-usb-audio-avoid-multiple-assignments-in-mixer_q.patch @@ -0,0 +1,38 @@ +From 842952962e0b96d3bd7d6a2a836a524a0748a91f Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 26 May 2025 17:07:45 +0300 +Subject: ALSA: usb-audio: Avoid multiple assignments in mixer_quirks + +From: Cristian Ciocaltea + +[ Upstream commit 03ddd3bdb94df3edb1f2408b57cfb00b3d92a208 ] + +Handle report from checkpatch.pl: + + CHECK: multiple assignments should be avoided + +Signed-off-by: Cristian Ciocaltea +Signed-off-by: Takashi Iwai +Link: https://patch.msgid.link/20250526-dualsense-alsa-jack-v1-6-1a821463b632@collabora.com +Signed-off-by: Sasha Levin +--- + 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 + diff --git a/queue-5.4/alsa-usb-audio-convert-comma-to-semicolon.patch b/queue-5.4/alsa-usb-audio-convert-comma-to-semicolon.patch new file mode 100644 index 0000000000..5c4358bbda --- /dev/null +++ b/queue-5.4/alsa-usb-audio-convert-comma-to-semicolon.patch @@ -0,0 +1,49 @@ +From c25cb2a2d7c5be595b76968b3b509ba09dbbb188 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 12 Jun 2025 14:02:28 +0800 +Subject: ALSA: usb-audio: Convert comma to semicolon + +From: Chen Ni + +[ 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 +Reviewed-by: Cristian Ciocaltea +Link: https://patch.msgid.link/20250612060228.1518028-1-nichen@iscas.ac.cn +Signed-off-by: Takashi Iwai +Signed-off-by: Sasha Levin +--- + 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 + diff --git a/queue-5.4/alsa-usb-audio-fix-block-comments-in-mixer_quirks.patch b/queue-5.4/alsa-usb-audio-fix-block-comments-in-mixer_quirks.patch new file mode 100644 index 0000000000..fad70afd35 --- /dev/null +++ b/queue-5.4/alsa-usb-audio-fix-block-comments-in-mixer_quirks.patch @@ -0,0 +1,49 @@ +From ce22a988ef225658f2555d443e36fa1ea5a91932 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 26 May 2025 17:07:43 +0300 +Subject: ALSA: usb-audio: Fix block comments in mixer_quirks + +From: Cristian Ciocaltea + +[ 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 +Signed-off-by: Takashi Iwai +Link: https://patch.msgid.link/20250526-dualsense-alsa-jack-v1-4-1a821463b632@collabora.com +Signed-off-by: Sasha Levin +--- + 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 + diff --git a/queue-5.4/alsa-usb-audio-fix-build-with-config_input-n.patch b/queue-5.4/alsa-usb-audio-fix-build-with-config_input-n.patch new file mode 100644 index 0000000000..7018d5f732 --- /dev/null +++ b/queue-5.4/alsa-usb-audio-fix-build-with-config_input-n.patch @@ -0,0 +1,61 @@ +From 9a538dc8bb5946599c7d20b2e917ec428e68a3be Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 13 Jun 2025 10:15:30 +0200 +Subject: ALSA: usb-audio: Fix build with CONFIG_INPUT=n + +From: Takashi Iwai + +[ 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 +Closes: https://lore.kernel.org/oe-kbuild-all/202506130733.gnPKw2l3-lkp@intel.com/ +Reviewed-by: Cristian Ciocaltea +Link: https://patch.msgid.link/20250613081543.7404-1-tiwai@suse.de +Signed-off-by: Takashi Iwai +Signed-off-by: Sasha Levin +--- + 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 + diff --git a/queue-5.4/alsa-usb-audio-remove-unneeded-wmb-in-mixer_quirks.patch b/queue-5.4/alsa-usb-audio-remove-unneeded-wmb-in-mixer_quirks.patch new file mode 100644 index 0000000000..cbe87a62aa --- /dev/null +++ b/queue-5.4/alsa-usb-audio-remove-unneeded-wmb-in-mixer_quirks.patch @@ -0,0 +1,46 @@ +From 3614852efe3537eae8739e9dca2d8647f0a7b17e Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 26 May 2025 17:07:47 +0300 +Subject: ALSA: usb-audio: Remove unneeded wmb() in mixer_quirks + +From: Cristian Ciocaltea + +[ 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 +Signed-off-by: Takashi Iwai +Link: https://patch.msgid.link/20250526-dualsense-alsa-jack-v1-8-1a821463b632@collabora.com +Signed-off-by: Sasha Levin +--- + 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 + diff --git a/queue-5.4/alsa-usb-audio-simplify-null-comparison-in-mixer_qui.patch b/queue-5.4/alsa-usb-audio-simplify-null-comparison-in-mixer_qui.patch new file mode 100644 index 0000000000..c1d888d98a --- /dev/null +++ b/queue-5.4/alsa-usb-audio-simplify-null-comparison-in-mixer_qui.patch @@ -0,0 +1,37 @@ +From 76c77107b9a92ca2915c09de59e9347d04bcad88 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 26 May 2025 17:07:46 +0300 +Subject: ALSA: usb-audio: Simplify NULL comparison in mixer_quirks + +From: Cristian Ciocaltea + +[ Upstream commit f2d6d660e8fd5f4467e80743f82119201e67fa9c ] + +Handle report from checkpatch.pl: + + CHECK: Comparison to NULL could be written "t->name" + +Signed-off-by: Cristian Ciocaltea +Signed-off-by: Takashi Iwai +Link: https://patch.msgid.link/20250526-dualsense-alsa-jack-v1-7-1a821463b632@collabora.com +Signed-off-by: Sasha Levin +--- + 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 + diff --git a/queue-5.4/firewire-core-fix-overlooked-update-of-subsystem-abi.patch b/queue-5.4/firewire-core-fix-overlooked-update-of-subsystem-abi.patch new file mode 100644 index 0000000000..60d360028b --- /dev/null +++ b/queue-5.4/firewire-core-fix-overlooked-update-of-subsystem-abi.patch @@ -0,0 +1,39 @@ +From 401eb36971159200b5cb73c00f6412c54dfdcb1f Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sat, 20 Sep 2025 11:51:48 +0900 +Subject: firewire: core: fix overlooked update of subsystem ABI version + +From: Takashi Sakamoto + +[ 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 +Signed-off-by: Sasha Levin +--- + 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 + diff --git a/queue-5.4/ib-mlx5-fix-obj_type-mismatch-for-srq-event-subscrip.patch b/queue-5.4/ib-mlx5-fix-obj_type-mismatch-for-srq-event-subscrip.patch new file mode 100644 index 0000000000..f4c263bf78 --- /dev/null +++ b/queue-5.4/ib-mlx5-fix-obj_type-mismatch-for-srq-event-subscrip.patch @@ -0,0 +1,50 @@ +From b868d928960547389f71b12f735be47fd96f884b Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 13 Aug 2025 15:43:20 +0300 +Subject: IB/mlx5: Fix obj_type mismatch for SRQ event subscriptions + +From: Or Har-Toov + +[ 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 +Reviewed-by: Edward Srouji +Signed-off-by: Leon Romanovsky +Signed-off-by: Jason Gunthorpe +Signed-off-by: Sasha Levin +--- + 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 + diff --git a/queue-5.4/series b/queue-5.4/series index 739abd4e12..4d5187b09c 100644 --- a/queue-5.4/series +++ b/queue-5.4/series @@ -52,3 +52,13 @@ serial-sc16is7xx-fix-bug-in-flow-control-levels-init.patch 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 diff --git a/queue-5.4/usb-core-add-0x-prefix-to-quirks-debug-output.patch b/queue-5.4/usb-core-add-0x-prefix-to-quirks-debug-output.patch new file mode 100644 index 0000000000..0a4ded0580 --- /dev/null +++ b/queue-5.4/usb-core-add-0x-prefix-to-quirks-debug-output.patch @@ -0,0 +1,36 @@ +From 65af9c23427d32d4952b16de47008f4d0440e5c0 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 3 Jun 2025 15:10:45 +0800 +Subject: usb: core: Add 0x prefix to quirks debug output + +From: Jiayi Li + +[ 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 +Link: https://lore.kernel.org/r/20250603071045.3243699-1-lijiayi@kylinos.cn +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Sasha Levin +--- + 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 + diff --git a/queue-6.1/alsa-usb-audio-add-dsd-support-for-comtrue-usb-audio.patch b/queue-6.1/alsa-usb-audio-add-dsd-support-for-comtrue-usb-audio.patch new file mode 100644 index 0000000000..4d6f2523e5 --- /dev/null +++ b/queue-6.1/alsa-usb-audio-add-dsd-support-for-comtrue-usb-audio.patch @@ -0,0 +1,40 @@ +From 3339871db55d720fa4f008d4d0f920ca15e30e5f Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 31 Jul 2025 19:06:14 +0800 +Subject: ALSA: usb-audio: Add DSD support for Comtrue USB Audio device + +From: noble.yang + +[ 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 +Link: https://patch.msgid.link/20250731110614.4070-1-noble228@gmail.com +Signed-off-by: Takashi Iwai +Signed-off-by: Sasha Levin +--- + 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 + diff --git a/queue-6.1/alsa-usb-audio-add-mixer-quirk-for-sony-dualsense-ps.patch b/queue-6.1/alsa-usb-audio-add-mixer-quirk-for-sony-dualsense-ps.patch new file mode 100644 index 0000000000..7fc46f7845 --- /dev/null +++ b/queue-6.1/alsa-usb-audio-add-mixer-quirk-for-sony-dualsense-ps.patch @@ -0,0 +1,321 @@ +From b461a21e43fb1f5e0737a130fafa63e43e00fcfe Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 26 May 2025 17:07:48 +0300 +Subject: ALSA: usb-audio: Add mixer quirk for Sony DualSense PS5 + +From: Cristian Ciocaltea + +[ 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 +Signed-off-by: Takashi Iwai +Link: https://patch.msgid.link/20250526-dualsense-alsa-jack-v1-9-1a821463b632@collabora.com +Signed-off-by: Sasha Levin +--- + 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 + #include ++#include + #include + #include + #include +@@ -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 + diff --git a/queue-6.1/alsa-usb-audio-add-mute-tlv-for-playback-volumes-on-.patch b/queue-6.1/alsa-usb-audio-add-mute-tlv-for-playback-volumes-on-.patch new file mode 100644 index 0000000000..571f85f00e --- /dev/null +++ b/queue-6.1/alsa-usb-audio-add-mute-tlv-for-playback-volumes-on-.patch @@ -0,0 +1,73 @@ +From 067794f0ba8a4e731ac23c997e29806495c6ebf7 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 29 Aug 2025 14:40:48 +0800 +Subject: ALSA: usb-audio: Add mute TLV for playback volumes on more devices + +From: qaqland + +[ 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 +Signed-off-by: qaqland +Link: https://patch.msgid.link/20250829-sound_quirk-v1-1-745529b44440@uniontech.com +Signed-off-by: Takashi Iwai +Signed-off-by: Sasha Levin +--- + 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 + diff --git a/queue-6.1/alsa-usb-audio-avoid-multiple-assignments-in-mixer_q.patch b/queue-6.1/alsa-usb-audio-avoid-multiple-assignments-in-mixer_q.patch new file mode 100644 index 0000000000..aa1a83d0ef --- /dev/null +++ b/queue-6.1/alsa-usb-audio-avoid-multiple-assignments-in-mixer_q.patch @@ -0,0 +1,38 @@ +From ddc1d108cd14502709e1583e051cdd30464a4de2 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 26 May 2025 17:07:45 +0300 +Subject: ALSA: usb-audio: Avoid multiple assignments in mixer_quirks + +From: Cristian Ciocaltea + +[ Upstream commit 03ddd3bdb94df3edb1f2408b57cfb00b3d92a208 ] + +Handle report from checkpatch.pl: + + CHECK: multiple assignments should be avoided + +Signed-off-by: Cristian Ciocaltea +Signed-off-by: Takashi Iwai +Link: https://patch.msgid.link/20250526-dualsense-alsa-jack-v1-6-1a821463b632@collabora.com +Signed-off-by: Sasha Levin +--- + 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 + diff --git a/queue-6.1/alsa-usb-audio-convert-comma-to-semicolon.patch b/queue-6.1/alsa-usb-audio-convert-comma-to-semicolon.patch new file mode 100644 index 0000000000..b0af678b60 --- /dev/null +++ b/queue-6.1/alsa-usb-audio-convert-comma-to-semicolon.patch @@ -0,0 +1,49 @@ +From a35ad58bbcd63d97132722391732385429f3b07b Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 12 Jun 2025 14:02:28 +0800 +Subject: ALSA: usb-audio: Convert comma to semicolon + +From: Chen Ni + +[ 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 +Reviewed-by: Cristian Ciocaltea +Link: https://patch.msgid.link/20250612060228.1518028-1-nichen@iscas.ac.cn +Signed-off-by: Takashi Iwai +Signed-off-by: Sasha Levin +--- + 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 + diff --git a/queue-6.1/alsa-usb-audio-drop-unnecessary-parentheses-in-mixer.patch b/queue-6.1/alsa-usb-audio-drop-unnecessary-parentheses-in-mixer.patch new file mode 100644 index 0000000000..df3b30fa53 --- /dev/null +++ b/queue-6.1/alsa-usb-audio-drop-unnecessary-parentheses-in-mixer.patch @@ -0,0 +1,49 @@ +From 43af9b5123efff5f9713e44766b9c0e7eefcc4a1 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 26 May 2025 17:07:44 +0300 +Subject: ALSA: usb-audio: Drop unnecessary parentheses in mixer_quirks + +From: Cristian Ciocaltea + +[ Upstream commit c0495cef8b43ad61efbd4019e3573742e0e63c67 ] + +Fix multiple 'CHECK: Unnecessary parentheses around ...' reports from +checkpatch.pl. + +Signed-off-by: Cristian Ciocaltea +Signed-off-by: Takashi Iwai +Link: https://patch.msgid.link/20250526-dualsense-alsa-jack-v1-5-1a821463b632@collabora.com +Signed-off-by: Sasha Levin +--- + 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 + diff --git a/queue-6.1/alsa-usb-audio-fix-block-comments-in-mixer_quirks.patch b/queue-6.1/alsa-usb-audio-fix-block-comments-in-mixer_quirks.patch new file mode 100644 index 0000000000..bd07359e7e --- /dev/null +++ b/queue-6.1/alsa-usb-audio-fix-block-comments-in-mixer_quirks.patch @@ -0,0 +1,49 @@ +From c34c9eb1031578b4ab613bbc8be72fd4d942465e Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 26 May 2025 17:07:43 +0300 +Subject: ALSA: usb-audio: Fix block comments in mixer_quirks + +From: Cristian Ciocaltea + +[ 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 +Signed-off-by: Takashi Iwai +Link: https://patch.msgid.link/20250526-dualsense-alsa-jack-v1-4-1a821463b632@collabora.com +Signed-off-by: Sasha Levin +--- + 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 + diff --git a/queue-6.1/alsa-usb-audio-fix-build-with-config_input-n.patch b/queue-6.1/alsa-usb-audio-fix-build-with-config_input-n.patch new file mode 100644 index 0000000000..0b0827532c --- /dev/null +++ b/queue-6.1/alsa-usb-audio-fix-build-with-config_input-n.patch @@ -0,0 +1,61 @@ +From 26a701f863b3041c0d9c676d992922d90250f89c Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 13 Jun 2025 10:15:30 +0200 +Subject: ALSA: usb-audio: Fix build with CONFIG_INPUT=n + +From: Takashi Iwai + +[ 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 +Closes: https://lore.kernel.org/oe-kbuild-all/202506130733.gnPKw2l3-lkp@intel.com/ +Reviewed-by: Cristian Ciocaltea +Link: https://patch.msgid.link/20250613081543.7404-1-tiwai@suse.de +Signed-off-by: Takashi Iwai +Signed-off-by: Sasha Levin +--- + 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 + diff --git a/queue-6.1/alsa-usb-audio-move-mixer_quirks-min_mute-into-commo.patch b/queue-6.1/alsa-usb-audio-move-mixer_quirks-min_mute-into-commo.patch new file mode 100644 index 0000000000..e4c04a7a02 --- /dev/null +++ b/queue-6.1/alsa-usb-audio-move-mixer_quirks-min_mute-into-commo.patch @@ -0,0 +1,123 @@ +From ce09659ac8c11712d9c52325ca5d71a1652f8da0 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 27 Aug 2025 11:29:02 +0800 +Subject: ALSA: usb-audio: move mixer_quirks' min_mute into common quirk + +From: Cryolitia PukNgae + +[ 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 +Signed-off-by: Cryolitia PukNgae +Link: https://patch.msgid.link/20250827-sound-quirk-min-mute-v1-1-4717aa8a4f6a@uniontech.com +Signed-off-by: Takashi Iwai +Signed-off-by: Sasha Levin +--- + 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 + diff --git a/queue-6.1/alsa-usb-audio-remove-unneeded-wmb-in-mixer_quirks.patch b/queue-6.1/alsa-usb-audio-remove-unneeded-wmb-in-mixer_quirks.patch new file mode 100644 index 0000000000..45b17b4f47 --- /dev/null +++ b/queue-6.1/alsa-usb-audio-remove-unneeded-wmb-in-mixer_quirks.patch @@ -0,0 +1,46 @@ +From 38979066db6025a003832a425605e769086f2044 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 26 May 2025 17:07:47 +0300 +Subject: ALSA: usb-audio: Remove unneeded wmb() in mixer_quirks + +From: Cristian Ciocaltea + +[ 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 +Signed-off-by: Takashi Iwai +Link: https://patch.msgid.link/20250526-dualsense-alsa-jack-v1-8-1a821463b632@collabora.com +Signed-off-by: Sasha Levin +--- + 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 + diff --git a/queue-6.1/alsa-usb-audio-simplify-null-comparison-in-mixer_qui.patch b/queue-6.1/alsa-usb-audio-simplify-null-comparison-in-mixer_qui.patch new file mode 100644 index 0000000000..a01f0d59ae --- /dev/null +++ b/queue-6.1/alsa-usb-audio-simplify-null-comparison-in-mixer_qui.patch @@ -0,0 +1,37 @@ +From 7c3f52358c57afbbb4c0759fd1d27969d5c7a494 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 26 May 2025 17:07:46 +0300 +Subject: ALSA: usb-audio: Simplify NULL comparison in mixer_quirks + +From: Cristian Ciocaltea + +[ Upstream commit f2d6d660e8fd5f4467e80743f82119201e67fa9c ] + +Handle report from checkpatch.pl: + + CHECK: Comparison to NULL could be written "t->name" + +Signed-off-by: Cristian Ciocaltea +Signed-off-by: Takashi Iwai +Link: https://patch.msgid.link/20250526-dualsense-alsa-jack-v1-7-1a821463b632@collabora.com +Signed-off-by: Sasha Levin +--- + 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 + diff --git a/queue-6.1/firewire-core-fix-overlooked-update-of-subsystem-abi.patch b/queue-6.1/firewire-core-fix-overlooked-update-of-subsystem-abi.patch new file mode 100644 index 0000000000..cd501a6612 --- /dev/null +++ b/queue-6.1/firewire-core-fix-overlooked-update-of-subsystem-abi.patch @@ -0,0 +1,39 @@ +From bbb4ab1d7b1ad7fff7a85aa9144d0edc5a70bacc Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sat, 20 Sep 2025 11:51:48 +0900 +Subject: firewire: core: fix overlooked update of subsystem ABI version + +From: Takashi Sakamoto + +[ 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 +Signed-off-by: Sasha Levin +--- + 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 + diff --git a/queue-6.1/hid-multitouch-get-the-contact-id-from-hid_dg_transd.patch b/queue-6.1/hid-multitouch-get-the-contact-id-from-hid_dg_transd.patch new file mode 100644 index 0000000000..717e9a182c --- /dev/null +++ b/queue-6.1/hid-multitouch-get-the-contact-id-from-hid_dg_transd.patch @@ -0,0 +1,75 @@ +From 5afe8201f82e93e444ae5810da5d51e6c2a89f89 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +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 + +[ 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 +Signed-off-by: Kerem Karabay +Co-developed-by: Aditya Garg +Signed-off-by: Aditya Garg +Signed-off-by: Jiri Kosina +Signed-off-by: Sasha Levin +--- + 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 + diff --git a/queue-6.1/hid-multitouch-specify-that-apple-touch-bar-is-direc.patch b/queue-6.1/hid-multitouch-specify-that-apple-touch-bar-is-direc.patch new file mode 100644 index 0000000000..822d7f39e0 --- /dev/null +++ b/queue-6.1/hid-multitouch-specify-that-apple-touch-bar-is-direc.patch @@ -0,0 +1,45 @@ +From f65f5948ad5665603d29403da0e42e876265c97b Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 27 May 2025 22:13:16 +0530 +Subject: HID: multitouch: specify that Apple Touch Bar is direct + +From: Kerem Karabay + +[ 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 +Signed-off-by: Kerem Karabay +Co-developed-by: Aditya Garg +Signed-off-by: Aditya Garg +Signed-off-by: Jiri Kosina +Signed-off-by: Sasha Levin +--- + 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 + diff --git a/queue-6.1/hid-multitouch-support-getting-the-tip-state-from-hi.patch b/queue-6.1/hid-multitouch-support-getting-the-tip-state-from-hi.patch new file mode 100644 index 0000000000..44d122bd9d --- /dev/null +++ b/queue-6.1/hid-multitouch-support-getting-the-tip-state-from-hi.patch @@ -0,0 +1,61 @@ +From 71e885c6131bb4ef7c6a94c64ab3ecac2e6b88c6 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +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 + +[ 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 +Signed-off-by: Kerem Karabay +Co-developed-by: Aditya Garg +Signed-off-by: Aditya Garg +Signed-off-by: Jiri Kosina +Signed-off-by: Sasha Levin +--- + 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 + diff --git a/queue-6.1/hid-multitouch-take-cls-maxcontacts-into-account-for.patch b/queue-6.1/hid-multitouch-take-cls-maxcontacts-into-account-for.patch new file mode 100644 index 0000000000..03445ecc1c --- /dev/null +++ b/queue-6.1/hid-multitouch-take-cls-maxcontacts-into-account-for.patch @@ -0,0 +1,44 @@ +From 22fc5906200564aa090085ab193d4808aec35152 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +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 + +[ 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 +Signed-off-by: Kerem Karabay +Co-developed-by: Aditya Garg +Signed-off-by: Aditya Garg +Signed-off-by: Jiri Kosina +Signed-off-by: Sasha Levin +--- + 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 + diff --git a/queue-6.1/ib-mlx5-fix-obj_type-mismatch-for-srq-event-subscrip.patch b/queue-6.1/ib-mlx5-fix-obj_type-mismatch-for-srq-event-subscrip.patch new file mode 100644 index 0000000000..ab499bc9df --- /dev/null +++ b/queue-6.1/ib-mlx5-fix-obj_type-mismatch-for-srq-event-subscrip.patch @@ -0,0 +1,50 @@ +From ae7825d03c4c1d44697f581afae759af7a521fb8 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 13 Aug 2025 15:43:20 +0300 +Subject: IB/mlx5: Fix obj_type mismatch for SRQ event subscriptions + +From: Or Har-Toov + +[ 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 +Reviewed-by: Edward Srouji +Signed-off-by: Leon Romanovsky +Signed-off-by: Jason Gunthorpe +Signed-off-by: Sasha Levin +--- + 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 + diff --git a/queue-6.1/series b/queue-6.1/series new file mode 100644 index 0000000000..a38e88d7b0 --- /dev/null +++ b/queue-6.1/series @@ -0,0 +1,18 @@ +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 diff --git a/queue-6.1/usb-core-add-0x-prefix-to-quirks-debug-output.patch b/queue-6.1/usb-core-add-0x-prefix-to-quirks-debug-output.patch new file mode 100644 index 0000000000..6bbb4eecd0 --- /dev/null +++ b/queue-6.1/usb-core-add-0x-prefix-to-quirks-debug-output.patch @@ -0,0 +1,36 @@ +From 50fc8faaee16759f5d09b39584bf59909eff37d4 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 3 Jun 2025 15:10:45 +0800 +Subject: usb: core: Add 0x prefix to quirks debug output + +From: Jiayi Li + +[ 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 +Link: https://lore.kernel.org/r/20250603071045.3243699-1-lijiayi@kylinos.cn +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Sasha Levin +--- + 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 + diff --git a/queue-6.12/alsa-hda-realtek-add-support-for-asus-nuc-using-cs35.patch b/queue-6.12/alsa-hda-realtek-add-support-for-asus-nuc-using-cs35.patch new file mode 100644 index 0000000000..375c0f0354 --- /dev/null +++ b/queue-6.12/alsa-hda-realtek-add-support-for-asus-nuc-using-cs35.patch @@ -0,0 +1,68 @@ +From 5d3c20a087e7efd77ea6d286e8c2dc44e40a1909 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 12 Jun 2025 17:00:23 +0100 +Subject: ALSA: hda/realtek: Add support for ASUS NUC using CS35L41 HDA + +From: Stefan Binding + +[ 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 +Link: https://patch.msgid.link/20250612160029.848104-3-sbinding@opensource.cirrus.com +Signed-off-by: Takashi Iwai +Signed-off-by: Sasha Levin +--- + 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 + diff --git a/queue-6.12/alsa-usb-audio-add-dsd-support-for-comtrue-usb-audio.patch b/queue-6.12/alsa-usb-audio-add-dsd-support-for-comtrue-usb-audio.patch new file mode 100644 index 0000000000..6d5921245f --- /dev/null +++ b/queue-6.12/alsa-usb-audio-add-dsd-support-for-comtrue-usb-audio.patch @@ -0,0 +1,40 @@ +From a3f38fa4ee1b437d3687dd8390095911d2db6ae0 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 31 Jul 2025 19:06:14 +0800 +Subject: ALSA: usb-audio: Add DSD support for Comtrue USB Audio device + +From: noble.yang + +[ 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 +Link: https://patch.msgid.link/20250731110614.4070-1-noble228@gmail.com +Signed-off-by: Takashi Iwai +Signed-off-by: Sasha Levin +--- + 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 + diff --git a/queue-6.12/alsa-usb-audio-add-mixer-quirk-for-sony-dualsense-ps.patch b/queue-6.12/alsa-usb-audio-add-mixer-quirk-for-sony-dualsense-ps.patch new file mode 100644 index 0000000000..59cfab5da1 --- /dev/null +++ b/queue-6.12/alsa-usb-audio-add-mixer-quirk-for-sony-dualsense-ps.patch @@ -0,0 +1,321 @@ +From 3f4aaaec3655e8f9d5e4bcabfb1b169c5c30b832 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 26 May 2025 17:07:48 +0300 +Subject: ALSA: usb-audio: Add mixer quirk for Sony DualSense PS5 + +From: Cristian Ciocaltea + +[ 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 +Signed-off-by: Takashi Iwai +Link: https://patch.msgid.link/20250526-dualsense-alsa-jack-v1-9-1a821463b632@collabora.com +Signed-off-by: Sasha Levin +--- + 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 + #include + #include ++#include + #include + #include + #include +@@ -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 + diff --git a/queue-6.12/alsa-usb-audio-add-mute-tlv-for-playback-volumes-on-.patch b/queue-6.12/alsa-usb-audio-add-mute-tlv-for-playback-volumes-on-.patch new file mode 100644 index 0000000000..a65f35c658 --- /dev/null +++ b/queue-6.12/alsa-usb-audio-add-mute-tlv-for-playback-volumes-on-.patch @@ -0,0 +1,73 @@ +From 1fd3bf7ff290e474ef2ceab0c10da3b87a2cac88 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 29 Aug 2025 14:40:48 +0800 +Subject: ALSA: usb-audio: Add mute TLV for playback volumes on more devices + +From: qaqland + +[ 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 +Signed-off-by: qaqland +Link: https://patch.msgid.link/20250829-sound_quirk-v1-1-745529b44440@uniontech.com +Signed-off-by: Takashi Iwai +Signed-off-by: Sasha Levin +--- + 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 + diff --git a/queue-6.12/alsa-usb-audio-avoid-multiple-assignments-in-mixer_q.patch b/queue-6.12/alsa-usb-audio-avoid-multiple-assignments-in-mixer_q.patch new file mode 100644 index 0000000000..7031d2aba2 --- /dev/null +++ b/queue-6.12/alsa-usb-audio-avoid-multiple-assignments-in-mixer_q.patch @@ -0,0 +1,38 @@ +From c34e59de5575b651a50fa583f57a7450c7542233 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 26 May 2025 17:07:45 +0300 +Subject: ALSA: usb-audio: Avoid multiple assignments in mixer_quirks + +From: Cristian Ciocaltea + +[ Upstream commit 03ddd3bdb94df3edb1f2408b57cfb00b3d92a208 ] + +Handle report from checkpatch.pl: + + CHECK: multiple assignments should be avoided + +Signed-off-by: Cristian Ciocaltea +Signed-off-by: Takashi Iwai +Link: https://patch.msgid.link/20250526-dualsense-alsa-jack-v1-6-1a821463b632@collabora.com +Signed-off-by: Sasha Levin +--- + 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 + diff --git a/queue-6.12/alsa-usb-audio-convert-comma-to-semicolon.patch b/queue-6.12/alsa-usb-audio-convert-comma-to-semicolon.patch new file mode 100644 index 0000000000..6d48ac7a7d --- /dev/null +++ b/queue-6.12/alsa-usb-audio-convert-comma-to-semicolon.patch @@ -0,0 +1,49 @@ +From c00bd8417cf95599e9b49f0000800e5eacd817ce Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 12 Jun 2025 14:02:28 +0800 +Subject: ALSA: usb-audio: Convert comma to semicolon + +From: Chen Ni + +[ 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 +Reviewed-by: Cristian Ciocaltea +Link: https://patch.msgid.link/20250612060228.1518028-1-nichen@iscas.ac.cn +Signed-off-by: Takashi Iwai +Signed-off-by: Sasha Levin +--- + 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 + diff --git a/queue-6.12/alsa-usb-audio-drop-unnecessary-parentheses-in-mixer.patch b/queue-6.12/alsa-usb-audio-drop-unnecessary-parentheses-in-mixer.patch new file mode 100644 index 0000000000..cd60637e9a --- /dev/null +++ b/queue-6.12/alsa-usb-audio-drop-unnecessary-parentheses-in-mixer.patch @@ -0,0 +1,49 @@ +From 93a5973dc1432f399b38572a197c41e726e8ed48 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 26 May 2025 17:07:44 +0300 +Subject: ALSA: usb-audio: Drop unnecessary parentheses in mixer_quirks + +From: Cristian Ciocaltea + +[ Upstream commit c0495cef8b43ad61efbd4019e3573742e0e63c67 ] + +Fix multiple 'CHECK: Unnecessary parentheses around ...' reports from +checkpatch.pl. + +Signed-off-by: Cristian Ciocaltea +Signed-off-by: Takashi Iwai +Link: https://patch.msgid.link/20250526-dualsense-alsa-jack-v1-5-1a821463b632@collabora.com +Signed-off-by: Sasha Levin +--- + 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 + diff --git a/queue-6.12/alsa-usb-audio-fix-block-comments-in-mixer_quirks.patch b/queue-6.12/alsa-usb-audio-fix-block-comments-in-mixer_quirks.patch new file mode 100644 index 0000000000..873b4736ad --- /dev/null +++ b/queue-6.12/alsa-usb-audio-fix-block-comments-in-mixer_quirks.patch @@ -0,0 +1,49 @@ +From 558388d7d2a5037867cf1f6b65ac52725545c13e Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 26 May 2025 17:07:43 +0300 +Subject: ALSA: usb-audio: Fix block comments in mixer_quirks + +From: Cristian Ciocaltea + +[ 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 +Signed-off-by: Takashi Iwai +Link: https://patch.msgid.link/20250526-dualsense-alsa-jack-v1-4-1a821463b632@collabora.com +Signed-off-by: Sasha Levin +--- + 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 + diff --git a/queue-6.12/alsa-usb-audio-fix-build-with-config_input-n.patch b/queue-6.12/alsa-usb-audio-fix-build-with-config_input-n.patch new file mode 100644 index 0000000000..99168e5f5a --- /dev/null +++ b/queue-6.12/alsa-usb-audio-fix-build-with-config_input-n.patch @@ -0,0 +1,61 @@ +From 7665dbf10583fc45a1d223bc0e32e1c1640e1b28 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 13 Jun 2025 10:15:30 +0200 +Subject: ALSA: usb-audio: Fix build with CONFIG_INPUT=n + +From: Takashi Iwai + +[ 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 +Closes: https://lore.kernel.org/oe-kbuild-all/202506130733.gnPKw2l3-lkp@intel.com/ +Reviewed-by: Cristian Ciocaltea +Link: https://patch.msgid.link/20250613081543.7404-1-tiwai@suse.de +Signed-off-by: Takashi Iwai +Signed-off-by: Sasha Levin +--- + 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 + diff --git a/queue-6.12/alsa-usb-audio-fix-code-alignment-in-mixer_quirks.patch b/queue-6.12/alsa-usb-audio-fix-code-alignment-in-mixer_quirks.patch new file mode 100644 index 0000000000..386077c264 --- /dev/null +++ b/queue-6.12/alsa-usb-audio-fix-code-alignment-in-mixer_quirks.patch @@ -0,0 +1,597 @@ +From bec753a2b38ebeba0f89a23fd94063d141e3350e Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 26 May 2025 17:07:40 +0300 +Subject: ALSA: usb-audio: Fix code alignment in mixer_quirks + +From: Cristian Ciocaltea + +[ 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 +Signed-off-by: Takashi Iwai +Link: https://patch.msgid.link/20250526-dualsense-alsa-jack-v1-1-1a821463b632@collabora.com +Signed-off-by: Sasha Levin +--- + 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 + diff --git a/queue-6.12/alsa-usb-audio-move-mixer_quirks-min_mute-into-commo.patch b/queue-6.12/alsa-usb-audio-move-mixer_quirks-min_mute-into-commo.patch new file mode 100644 index 0000000000..c02154984d --- /dev/null +++ b/queue-6.12/alsa-usb-audio-move-mixer_quirks-min_mute-into-commo.patch @@ -0,0 +1,123 @@ +From 6546ef4333172120bf5a5e875cc1ec792c54482e Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 27 Aug 2025 11:29:02 +0800 +Subject: ALSA: usb-audio: move mixer_quirks' min_mute into common quirk + +From: Cryolitia PukNgae + +[ 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 +Signed-off-by: Cryolitia PukNgae +Link: https://patch.msgid.link/20250827-sound-quirk-min-mute-v1-1-4717aa8a4f6a@uniontech.com +Signed-off-by: Takashi Iwai +Signed-off-by: Sasha Levin +--- + 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 + diff --git a/queue-6.12/alsa-usb-audio-remove-unneeded-wmb-in-mixer_quirks.patch b/queue-6.12/alsa-usb-audio-remove-unneeded-wmb-in-mixer_quirks.patch new file mode 100644 index 0000000000..f58b9e60f5 --- /dev/null +++ b/queue-6.12/alsa-usb-audio-remove-unneeded-wmb-in-mixer_quirks.patch @@ -0,0 +1,46 @@ +From 18a47bcf8606c3a4ce9c8f4fcfc9666cba9f8f06 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 26 May 2025 17:07:47 +0300 +Subject: ALSA: usb-audio: Remove unneeded wmb() in mixer_quirks + +From: Cristian Ciocaltea + +[ 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 +Signed-off-by: Takashi Iwai +Link: https://patch.msgid.link/20250526-dualsense-alsa-jack-v1-8-1a821463b632@collabora.com +Signed-off-by: Sasha Levin +--- + 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 + diff --git a/queue-6.12/alsa-usb-audio-simplify-null-comparison-in-mixer_qui.patch b/queue-6.12/alsa-usb-audio-simplify-null-comparison-in-mixer_qui.patch new file mode 100644 index 0000000000..979eb8c95e --- /dev/null +++ b/queue-6.12/alsa-usb-audio-simplify-null-comparison-in-mixer_qui.patch @@ -0,0 +1,37 @@ +From 1325f86d8ad91a2f9a796f6124db1a39cb4745db Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 26 May 2025 17:07:46 +0300 +Subject: ALSA: usb-audio: Simplify NULL comparison in mixer_quirks + +From: Cristian Ciocaltea + +[ Upstream commit f2d6d660e8fd5f4467e80743f82119201e67fa9c ] + +Handle report from checkpatch.pl: + + CHECK: Comparison to NULL could be written "t->name" + +Signed-off-by: Cristian Ciocaltea +Signed-off-by: Takashi Iwai +Link: https://patch.msgid.link/20250526-dualsense-alsa-jack-v1-7-1a821463b632@collabora.com +Signed-off-by: Sasha Levin +--- + 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 + diff --git a/queue-6.12/firewire-core-fix-overlooked-update-of-subsystem-abi.patch b/queue-6.12/firewire-core-fix-overlooked-update-of-subsystem-abi.patch new file mode 100644 index 0000000000..d4a3572794 --- /dev/null +++ b/queue-6.12/firewire-core-fix-overlooked-update-of-subsystem-abi.patch @@ -0,0 +1,39 @@ +From 78be8f8bc5843b250eb181403815ec1552e4e1f8 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sat, 20 Sep 2025 11:51:48 +0900 +Subject: firewire: core: fix overlooked update of subsystem ABI version + +From: Takashi Sakamoto + +[ 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 +Signed-off-by: Sasha Levin +--- + 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 + diff --git a/queue-6.12/hid-amd_sfh-add-sync-across-amd-sfh-work-functions.patch b/queue-6.12/hid-amd_sfh-add-sync-across-amd-sfh-work-functions.patch new file mode 100644 index 0000000000..17b9fe060a --- /dev/null +++ b/queue-6.12/hid-amd_sfh-add-sync-across-amd-sfh-work-functions.patch @@ -0,0 +1,122 @@ +From 8186d94bba187509fd59a944aafed98527a58456 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 18 Sep 2025 18:02:02 +0530 +Subject: HID: amd_sfh: Add sync across amd sfh work functions + +From: Basavaraj Natikar + +[ 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 +Closes: https://lore.kernel.org/all/a21abca5-4268-449d-95f1-bdd7a25894a5@linux.dev/ +Tested-by: Prakruthi SP +Co-developed-by: Akshata MukundShetty +Signed-off-by: Akshata MukundShetty +Signed-off-by: Basavaraj Natikar +Reviewed-by: Mario Limonciello (AMD) +Signed-off-by: Jiri Kosina +Signed-off-by: Sasha Levin +--- + 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 + #include + #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 + diff --git a/queue-6.12/hid-multitouch-get-the-contact-id-from-hid_dg_transd.patch b/queue-6.12/hid-multitouch-get-the-contact-id-from-hid_dg_transd.patch new file mode 100644 index 0000000000..11012e5685 --- /dev/null +++ b/queue-6.12/hid-multitouch-get-the-contact-id-from-hid_dg_transd.patch @@ -0,0 +1,75 @@ +From 4dd91ed501915ea23f94f24b5a0318903bbe2d7c Mon Sep 17 00:00:00 2001 +From: Sasha Levin +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 + +[ 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 +Signed-off-by: Kerem Karabay +Co-developed-by: Aditya Garg +Signed-off-by: Aditya Garg +Signed-off-by: Jiri Kosina +Signed-off-by: Sasha Levin +--- + 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 + diff --git a/queue-6.12/hid-multitouch-specify-that-apple-touch-bar-is-direc.patch b/queue-6.12/hid-multitouch-specify-that-apple-touch-bar-is-direc.patch new file mode 100644 index 0000000000..288d815834 --- /dev/null +++ b/queue-6.12/hid-multitouch-specify-that-apple-touch-bar-is-direc.patch @@ -0,0 +1,45 @@ +From 7d95678cea9d56d1b33d42525d44321f1dad308b Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 27 May 2025 22:13:16 +0530 +Subject: HID: multitouch: specify that Apple Touch Bar is direct + +From: Kerem Karabay + +[ 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 +Signed-off-by: Kerem Karabay +Co-developed-by: Aditya Garg +Signed-off-by: Aditya Garg +Signed-off-by: Jiri Kosina +Signed-off-by: Sasha Levin +--- + 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 + diff --git a/queue-6.12/hid-multitouch-support-getting-the-tip-state-from-hi.patch b/queue-6.12/hid-multitouch-support-getting-the-tip-state-from-hi.patch new file mode 100644 index 0000000000..369993d983 --- /dev/null +++ b/queue-6.12/hid-multitouch-support-getting-the-tip-state-from-hi.patch @@ -0,0 +1,61 @@ +From d99d0f667e7db683abddcad7b94fe59a28866299 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +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 + +[ 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 +Signed-off-by: Kerem Karabay +Co-developed-by: Aditya Garg +Signed-off-by: Aditya Garg +Signed-off-by: Jiri Kosina +Signed-off-by: Sasha Levin +--- + 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 + diff --git a/queue-6.12/hid-multitouch-take-cls-maxcontacts-into-account-for.patch b/queue-6.12/hid-multitouch-take-cls-maxcontacts-into-account-for.patch new file mode 100644 index 0000000000..2f60aa8f00 --- /dev/null +++ b/queue-6.12/hid-multitouch-take-cls-maxcontacts-into-account-for.patch @@ -0,0 +1,44 @@ +From c820a09485b828fbd040e764a222d777b27e946d Mon Sep 17 00:00:00 2001 +From: Sasha Levin +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 + +[ 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 +Signed-off-by: Kerem Karabay +Co-developed-by: Aditya Garg +Signed-off-by: Aditya Garg +Signed-off-by: Jiri Kosina +Signed-off-by: Sasha Levin +--- + 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 + diff --git a/queue-6.12/i2c-designware-add-quirk-for-intel-xe.patch b/queue-6.12/i2c-designware-add-quirk-for-intel-xe.patch new file mode 100644 index 0000000000..8cb732a1e5 --- /dev/null +++ b/queue-6.12/i2c-designware-add-quirk-for-intel-xe.patch @@ -0,0 +1,58 @@ +From f34f191e10a96d92ad3ed6c2a0c66e81aeb0fd20 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 1 Jul 2025 15:22:49 +0300 +Subject: i2c: designware: Add quirk for Intel Xe + +From: Heikki Krogerus + +[ 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 +Co-developed-by: Michael J. Ruhl +Signed-off-by: Michael J. Ruhl +Signed-off-by: Heikki Krogerus +Reviewed-by: Andi Shyti +Link: https://lore.kernel.org/r/20250701122252.2590230-3-heikki.krogerus@linux.intel.com +Signed-off-by: Rodrigo Vivi +[Rodrigo fixed the co-developed tags while merging] +Signed-off-by: Sasha Levin +--- + 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 + diff --git a/queue-6.12/ib-mlx5-fix-obj_type-mismatch-for-srq-event-subscrip.patch b/queue-6.12/ib-mlx5-fix-obj_type-mismatch-for-srq-event-subscrip.patch new file mode 100644 index 0000000000..22d41cabfa --- /dev/null +++ b/queue-6.12/ib-mlx5-fix-obj_type-mismatch-for-srq-event-subscrip.patch @@ -0,0 +1,50 @@ +From 264cbbd1e602b59bfe58dd324a936b3ea2ffd469 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 13 Aug 2025 15:43:20 +0300 +Subject: IB/mlx5: Fix obj_type mismatch for SRQ event subscriptions + +From: Or Har-Toov + +[ 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 +Reviewed-by: Edward Srouji +Signed-off-by: Leon Romanovsky +Signed-off-by: Jason Gunthorpe +Signed-off-by: Sasha Levin +--- + 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 + diff --git a/queue-6.12/mmc-sdhci-cadence-add-mobileye-eyeq-support.patch b/queue-6.12/mmc-sdhci-cadence-add-mobileye-eyeq-support.patch new file mode 100644 index 0000000000..2c4ecc65c1 --- /dev/null +++ b/queue-6.12/mmc-sdhci-cadence-add-mobileye-eyeq-support.patch @@ -0,0 +1,56 @@ +From d1bc7a167103caf4d1752c5479321b01b3e28ea5 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +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 + +[ 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 +Link: https://lore.kernel.org/r/e97f409650495791e07484589e1666ead570fa12.1750156323.git.benoit.monin@bootlin.com +Signed-off-by: Ulf Hansson +Signed-off-by: Sasha Levin +--- + 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 + diff --git a/queue-6.12/net-fec-rename-struct-fec_devinfo-fec_imx6x_info-fec.patch b/queue-6.12/net-fec-rename-struct-fec_devinfo-fec_imx6x_info-fec.patch new file mode 100644 index 0000000000..6ded5919d0 --- /dev/null +++ b/queue-6.12/net-fec-rename-struct-fec_devinfo-fec_imx6x_info-fec.patch @@ -0,0 +1,54 @@ +From 6f8d1edd75c01703cfe815415e180f4f41e3e649 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +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 + +[ 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 +Reviewed-by: Frank Li +Reviewed-by: Andrew Lunn +Signed-off-by: Marc Kleine-Budde +Link: https://patch.msgid.link/20250618-fec-cleanups-v4-5-c16f9a1af124@pengutronix.de +Signed-off-by: Jakub Kicinski +Signed-off-by: Sasha Levin +--- + 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 + diff --git a/queue-6.12/net-sfp-add-quirk-for-flypro-copper-sfp-module.patch b/queue-6.12/net-sfp-add-quirk-for-flypro-copper-sfp-module.patch new file mode 100644 index 0000000000..9712c70d08 --- /dev/null +++ b/queue-6.12/net-sfp-add-quirk-for-flypro-copper-sfp-module.patch @@ -0,0 +1,38 @@ +From 8e8da1bf4065a2c463d8fcb31ffdb19ba772b021 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sun, 31 Aug 2025 12:59:07 +0200 +Subject: net: sfp: add quirk for FLYPRO copper SFP+ module + +From: Aleksander Jan Bajkowski + +[ 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 +Reviewed-by: Russell King (Oracle) +Link: https://patch.msgid.link/20250831105910.3174-1-olek2@wp.pl +Signed-off-by: Jakub Kicinski +Signed-off-by: Sasha Levin +--- + 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 + diff --git a/queue-6.12/net-sfp-add-quirk-for-potron-sfp-xgspon-onu-stick.patch b/queue-6.12/net-sfp-add-quirk-for-potron-sfp-xgspon-onu-stick.patch new file mode 100644 index 0000000000..5bfd427deb --- /dev/null +++ b/queue-6.12/net-sfp-add-quirk-for-potron-sfp-xgspon-onu-stick.patch @@ -0,0 +1,76 @@ +From 35d4e83935f6c63b195f591b1382e4291a5ab16f Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 17 Jun 2025 13:03:24 -0500 +Subject: net: sfp: add quirk for Potron SFP+ XGSPON ONU Stick + +From: Chris Morgan + +[ 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 +Link: https://patch.msgid.link/20250617180324.229487-1-macroalpha82@gmail.com +Signed-off-by: Jakub Kicinski +Signed-off-by: Sasha Levin +--- + 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 + diff --git a/queue-6.12/scsi-ufs-mcq-fix-memory-allocation-checks-for-sqe-an.patch b/queue-6.12/scsi-ufs-mcq-fix-memory-allocation-checks-for-sqe-an.patch new file mode 100644 index 0000000000..2bc05fc686 --- /dev/null +++ b/queue-6.12/scsi-ufs-mcq-fix-memory-allocation-checks-for-sqe-an.patch @@ -0,0 +1,53 @@ +From 69b99296cbed1582878ec5b0bf59a62debbe59c5 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sun, 7 Sep 2025 12:40:16 -0700 +Subject: scsi: ufs: mcq: Fix memory allocation checks for SQE and CQE + +From: Alok Tiwari + +[ 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 +Reviewed-by: Alim Akhtar +Reviewed-by: Manivannan Sadhasivam +Reviewed-by: Peter Wang +Signed-off-by: Martin K. Petersen +Signed-off-by: Sasha Levin +--- + 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 + diff --git a/queue-6.12/series b/queue-6.12/series new file mode 100644 index 0000000000..df670d801f --- /dev/null +++ b/queue-6.12/series @@ -0,0 +1,27 @@ +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 diff --git a/queue-6.12/usb-core-add-0x-prefix-to-quirks-debug-output.patch b/queue-6.12/usb-core-add-0x-prefix-to-quirks-debug-output.patch new file mode 100644 index 0000000000..c65af40013 --- /dev/null +++ b/queue-6.12/usb-core-add-0x-prefix-to-quirks-debug-output.patch @@ -0,0 +1,36 @@ +From 9751aca54e163844a18dea59c65cd787fb3e79c0 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 3 Jun 2025 15:10:45 +0800 +Subject: usb: core: Add 0x prefix to quirks debug output + +From: Jiayi Li + +[ 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 +Link: https://lore.kernel.org/r/20250603071045.3243699-1-lijiayi@kylinos.cn +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Sasha Levin +--- + 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 + diff --git a/queue-6.16/alsa-hda-realtek-add-support-for-asus-nuc-using-cs35.patch b/queue-6.16/alsa-hda-realtek-add-support-for-asus-nuc-using-cs35.patch new file mode 100644 index 0000000000..bd54bfa6e4 --- /dev/null +++ b/queue-6.16/alsa-hda-realtek-add-support-for-asus-nuc-using-cs35.patch @@ -0,0 +1,68 @@ +From 89062c2302a3e327ce53cce4281360ce356dce91 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 12 Jun 2025 17:00:23 +0100 +Subject: ALSA: hda/realtek: Add support for ASUS NUC using CS35L41 HDA + +From: Stefan Binding + +[ 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 +Link: https://patch.msgid.link/20250612160029.848104-3-sbinding@opensource.cirrus.com +Signed-off-by: Takashi Iwai +Signed-off-by: Sasha Levin +--- + 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 + diff --git a/queue-6.16/alsa-usb-audio-add-dsd-support-for-comtrue-usb-audio.patch b/queue-6.16/alsa-usb-audio-add-dsd-support-for-comtrue-usb-audio.patch new file mode 100644 index 0000000000..24ba901f5f --- /dev/null +++ b/queue-6.16/alsa-usb-audio-add-dsd-support-for-comtrue-usb-audio.patch @@ -0,0 +1,40 @@ +From decc4cd1c2823816111fed796d8a8aaf7bce62f1 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 31 Jul 2025 19:06:14 +0800 +Subject: ALSA: usb-audio: Add DSD support for Comtrue USB Audio device + +From: noble.yang + +[ 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 +Link: https://patch.msgid.link/20250731110614.4070-1-noble228@gmail.com +Signed-off-by: Takashi Iwai +Signed-off-by: Sasha Levin +--- + 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 + diff --git a/queue-6.16/alsa-usb-audio-add-mixer-quirk-for-sony-dualsense-ps.patch b/queue-6.16/alsa-usb-audio-add-mixer-quirk-for-sony-dualsense-ps.patch new file mode 100644 index 0000000000..fccda5aad9 --- /dev/null +++ b/queue-6.16/alsa-usb-audio-add-mixer-quirk-for-sony-dualsense-ps.patch @@ -0,0 +1,321 @@ +From 3384e9d7e13293e641c4a2a343654f9ad33d15bb Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 26 May 2025 17:07:48 +0300 +Subject: ALSA: usb-audio: Add mixer quirk for Sony DualSense PS5 + +From: Cristian Ciocaltea + +[ 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 +Signed-off-by: Takashi Iwai +Link: https://patch.msgid.link/20250526-dualsense-alsa-jack-v1-9-1a821463b632@collabora.com +Signed-off-by: Sasha Levin +--- + 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 + #include + #include ++#include + #include + #include + #include +@@ -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 + diff --git a/queue-6.16/alsa-usb-audio-add-mute-tlv-for-playback-volumes-on-.patch b/queue-6.16/alsa-usb-audio-add-mute-tlv-for-playback-volumes-on-.patch new file mode 100644 index 0000000000..a3eb9b0775 --- /dev/null +++ b/queue-6.16/alsa-usb-audio-add-mute-tlv-for-playback-volumes-on-.patch @@ -0,0 +1,73 @@ +From e025cc0e24b72a15c0906f8f8c16843272c4a352 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 29 Aug 2025 14:40:48 +0800 +Subject: ALSA: usb-audio: Add mute TLV for playback volumes on more devices + +From: qaqland + +[ 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 +Signed-off-by: qaqland +Link: https://patch.msgid.link/20250829-sound_quirk-v1-1-745529b44440@uniontech.com +Signed-off-by: Takashi Iwai +Signed-off-by: Sasha Levin +--- + 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 + diff --git a/queue-6.16/alsa-usb-audio-avoid-multiple-assignments-in-mixer_q.patch b/queue-6.16/alsa-usb-audio-avoid-multiple-assignments-in-mixer_q.patch new file mode 100644 index 0000000000..e1d019ef0f --- /dev/null +++ b/queue-6.16/alsa-usb-audio-avoid-multiple-assignments-in-mixer_q.patch @@ -0,0 +1,38 @@ +From 1eb785168edc6468059db12223f2e77c9dbc5981 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 26 May 2025 17:07:45 +0300 +Subject: ALSA: usb-audio: Avoid multiple assignments in mixer_quirks + +From: Cristian Ciocaltea + +[ Upstream commit 03ddd3bdb94df3edb1f2408b57cfb00b3d92a208 ] + +Handle report from checkpatch.pl: + + CHECK: multiple assignments should be avoided + +Signed-off-by: Cristian Ciocaltea +Signed-off-by: Takashi Iwai +Link: https://patch.msgid.link/20250526-dualsense-alsa-jack-v1-6-1a821463b632@collabora.com +Signed-off-by: Sasha Levin +--- + 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 + diff --git a/queue-6.16/alsa-usb-audio-convert-comma-to-semicolon.patch b/queue-6.16/alsa-usb-audio-convert-comma-to-semicolon.patch new file mode 100644 index 0000000000..a8c167b86e --- /dev/null +++ b/queue-6.16/alsa-usb-audio-convert-comma-to-semicolon.patch @@ -0,0 +1,49 @@ +From c4d797fdb36594ea83b93a261f245b8942819b02 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 12 Jun 2025 14:02:28 +0800 +Subject: ALSA: usb-audio: Convert comma to semicolon + +From: Chen Ni + +[ 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 +Reviewed-by: Cristian Ciocaltea +Link: https://patch.msgid.link/20250612060228.1518028-1-nichen@iscas.ac.cn +Signed-off-by: Takashi Iwai +Signed-off-by: Sasha Levin +--- + 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 + diff --git a/queue-6.16/alsa-usb-audio-drop-unnecessary-parentheses-in-mixer.patch b/queue-6.16/alsa-usb-audio-drop-unnecessary-parentheses-in-mixer.patch new file mode 100644 index 0000000000..266c6c1763 --- /dev/null +++ b/queue-6.16/alsa-usb-audio-drop-unnecessary-parentheses-in-mixer.patch @@ -0,0 +1,49 @@ +From 8712eff9fbf533b4d2e1f3df04d4b06fcd6064cc Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 26 May 2025 17:07:44 +0300 +Subject: ALSA: usb-audio: Drop unnecessary parentheses in mixer_quirks + +From: Cristian Ciocaltea + +[ Upstream commit c0495cef8b43ad61efbd4019e3573742e0e63c67 ] + +Fix multiple 'CHECK: Unnecessary parentheses around ...' reports from +checkpatch.pl. + +Signed-off-by: Cristian Ciocaltea +Signed-off-by: Takashi Iwai +Link: https://patch.msgid.link/20250526-dualsense-alsa-jack-v1-5-1a821463b632@collabora.com +Signed-off-by: Sasha Levin +--- + 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 + diff --git a/queue-6.16/alsa-usb-audio-fix-block-comments-in-mixer_quirks.patch b/queue-6.16/alsa-usb-audio-fix-block-comments-in-mixer_quirks.patch new file mode 100644 index 0000000000..fbece0bded --- /dev/null +++ b/queue-6.16/alsa-usb-audio-fix-block-comments-in-mixer_quirks.patch @@ -0,0 +1,49 @@ +From c5e37cf0f4779f6245f07b6b10764c6ee3345cf3 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 26 May 2025 17:07:43 +0300 +Subject: ALSA: usb-audio: Fix block comments in mixer_quirks + +From: Cristian Ciocaltea + +[ 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 +Signed-off-by: Takashi Iwai +Link: https://patch.msgid.link/20250526-dualsense-alsa-jack-v1-4-1a821463b632@collabora.com +Signed-off-by: Sasha Levin +--- + 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 + diff --git a/queue-6.16/alsa-usb-audio-fix-build-with-config_input-n.patch b/queue-6.16/alsa-usb-audio-fix-build-with-config_input-n.patch new file mode 100644 index 0000000000..c148b2003e --- /dev/null +++ b/queue-6.16/alsa-usb-audio-fix-build-with-config_input-n.patch @@ -0,0 +1,61 @@ +From a1909621ea9fd0a6e71f44a5e40331c15a63e450 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 13 Jun 2025 10:15:30 +0200 +Subject: ALSA: usb-audio: Fix build with CONFIG_INPUT=n + +From: Takashi Iwai + +[ 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 +Closes: https://lore.kernel.org/oe-kbuild-all/202506130733.gnPKw2l3-lkp@intel.com/ +Reviewed-by: Cristian Ciocaltea +Link: https://patch.msgid.link/20250613081543.7404-1-tiwai@suse.de +Signed-off-by: Takashi Iwai +Signed-off-by: Sasha Levin +--- + 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 + diff --git a/queue-6.16/alsa-usb-audio-fix-code-alignment-in-mixer_quirks.patch b/queue-6.16/alsa-usb-audio-fix-code-alignment-in-mixer_quirks.patch new file mode 100644 index 0000000000..72d9bdeb0f --- /dev/null +++ b/queue-6.16/alsa-usb-audio-fix-code-alignment-in-mixer_quirks.patch @@ -0,0 +1,597 @@ +From b60d27fddea61ff6276b83f4f243e9c13ccb793c Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 26 May 2025 17:07:40 +0300 +Subject: ALSA: usb-audio: Fix code alignment in mixer_quirks + +From: Cristian Ciocaltea + +[ 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 +Signed-off-by: Takashi Iwai +Link: https://patch.msgid.link/20250526-dualsense-alsa-jack-v1-1-1a821463b632@collabora.com +Signed-off-by: Sasha Levin +--- + 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 + diff --git a/queue-6.16/alsa-usb-audio-fix-whitespace-blank-line-issues-in-m.patch b/queue-6.16/alsa-usb-audio-fix-whitespace-blank-line-issues-in-m.patch new file mode 100644 index 0000000000..84fcd20d53 --- /dev/null +++ b/queue-6.16/alsa-usb-audio-fix-whitespace-blank-line-issues-in-m.patch @@ -0,0 +1,205 @@ +From 7d67689f522a9e71621af23028a80bc1240310bd Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 26 May 2025 17:07:41 +0300 +Subject: ALSA: usb-audio: Fix whitespace & blank line issues in mixer_quirks + +From: Cristian Ciocaltea + +[ 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 +Signed-off-by: Takashi Iwai +Link: https://patch.msgid.link/20250526-dualsense-alsa-jack-v1-2-1a821463b632@collabora.com +Signed-off-by: Sasha Levin +--- + 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 + diff --git a/queue-6.16/alsa-usb-audio-move-mixer_quirks-min_mute-into-commo.patch b/queue-6.16/alsa-usb-audio-move-mixer_quirks-min_mute-into-commo.patch new file mode 100644 index 0000000000..f9dc1b9439 --- /dev/null +++ b/queue-6.16/alsa-usb-audio-move-mixer_quirks-min_mute-into-commo.patch @@ -0,0 +1,123 @@ +From e3088a152335039f8b9110412995a11082b3d6a4 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 27 Aug 2025 11:29:02 +0800 +Subject: ALSA: usb-audio: move mixer_quirks' min_mute into common quirk + +From: Cryolitia PukNgae + +[ 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 +Signed-off-by: Cryolitia PukNgae +Link: https://patch.msgid.link/20250827-sound-quirk-min-mute-v1-1-4717aa8a4f6a@uniontech.com +Signed-off-by: Takashi Iwai +Signed-off-by: Sasha Levin +--- + 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 + diff --git a/queue-6.16/alsa-usb-audio-remove-unneeded-wmb-in-mixer_quirks.patch b/queue-6.16/alsa-usb-audio-remove-unneeded-wmb-in-mixer_quirks.patch new file mode 100644 index 0000000000..467801428f --- /dev/null +++ b/queue-6.16/alsa-usb-audio-remove-unneeded-wmb-in-mixer_quirks.patch @@ -0,0 +1,46 @@ +From fab9ea2ce5ecbac45dc1fd6359dc1f963eb4d67f Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 26 May 2025 17:07:47 +0300 +Subject: ALSA: usb-audio: Remove unneeded wmb() in mixer_quirks + +From: Cristian Ciocaltea + +[ 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 +Signed-off-by: Takashi Iwai +Link: https://patch.msgid.link/20250526-dualsense-alsa-jack-v1-8-1a821463b632@collabora.com +Signed-off-by: Sasha Levin +--- + 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 + diff --git a/queue-6.16/alsa-usb-audio-simplify-null-comparison-in-mixer_qui.patch b/queue-6.16/alsa-usb-audio-simplify-null-comparison-in-mixer_qui.patch new file mode 100644 index 0000000000..b1cef2393e --- /dev/null +++ b/queue-6.16/alsa-usb-audio-simplify-null-comparison-in-mixer_qui.patch @@ -0,0 +1,37 @@ +From 49f28fbe893563cc48b2cf31f1a5248d6f2c44de Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 26 May 2025 17:07:46 +0300 +Subject: ALSA: usb-audio: Simplify NULL comparison in mixer_quirks + +From: Cristian Ciocaltea + +[ Upstream commit f2d6d660e8fd5f4467e80743f82119201e67fa9c ] + +Handle report from checkpatch.pl: + + CHECK: Comparison to NULL could be written "t->name" + +Signed-off-by: Cristian Ciocaltea +Signed-off-by: Takashi Iwai +Link: https://patch.msgid.link/20250526-dualsense-alsa-jack-v1-7-1a821463b632@collabora.com +Signed-off-by: Sasha Levin +--- + 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 + diff --git a/queue-6.16/asoc-intel-soc-acpi-add-entry-for-hdmi_in-capture-su.patch b/queue-6.16/asoc-intel-soc-acpi-add-entry-for-hdmi_in-capture-su.patch new file mode 100644 index 0000000000..9a8ccedae5 --- /dev/null +++ b/queue-6.16/asoc-intel-soc-acpi-add-entry-for-hdmi_in-capture-su.patch @@ -0,0 +1,78 @@ +From ccd379cf477b3ef311a7e1df6f16301204ecf686 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +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 + +[ Upstream commit fb00ab1f39369e49d25c74f0d41e4c1ec2f12576 ] + +Adding HDMI-In capture via I2S feature support in PTL platform. + +Signed-off-by: Balamurugan C +Reviewed-by: Liam Girdwood +Signed-off-by: Bard Liao +Link: https://patch.msgid.link/20250708080030.1257790-3-yung-chuan.liao@linux.intel.com +Signed-off-by: Mark Brown +Stable-dep-of: 03aa2ed9e187 ("ASoC: Intel: sof_rt5682: Add HDMI-In capture with rt5682 support for PTL.") +Signed-off-by: Sasha Levin +--- + 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 + diff --git a/queue-6.16/asoc-intel-soc-acpi-add-entry-for-sof_es8336-in-ptl-.patch b/queue-6.16/asoc-intel-soc-acpi-add-entry-for-sof_es8336-in-ptl-.patch new file mode 100644 index 0000000000..8ca7f831dd --- /dev/null +++ b/queue-6.16/asoc-intel-soc-acpi-add-entry-for-sof_es8336-in-ptl-.patch @@ -0,0 +1,56 @@ +From 6fa39960d3447874390f33535f85ab240a81394b Mon Sep 17 00:00:00 2001 +From: Sasha Levin +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 + +[ Upstream commit 2813f535b5847771d9e56df678c523a7e64f860e ] + +Adding ES83x6 I2S codec support for PTL platforms and entry in match table. + +Signed-off-by: Balamurugan C +Reviewed-by: Liam Girdwood +Signed-off-by: Bard Liao +Link: https://patch.msgid.link/20250708080030.1257790-2-yung-chuan.liao@linux.intel.com +Signed-off-by: Mark Brown +Stable-dep-of: 03aa2ed9e187 ("ASoC: Intel: sof_rt5682: Add HDMI-In capture with rt5682 support for PTL.") +Signed-off-by: Sasha Levin +--- + 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 + diff --git a/queue-6.16/asoc-intel-sof_rt5682-add-hdmi-in-capture-with-rt568.patch b/queue-6.16/asoc-intel-sof_rt5682-add-hdmi-in-capture-with-rt568.patch new file mode 100644 index 0000000000..c7d092e64d --- /dev/null +++ b/queue-6.16/asoc-intel-sof_rt5682-add-hdmi-in-capture-with-rt568.patch @@ -0,0 +1,63 @@ +From b091385f84e49447d27ad52d211229aee8bb6e92 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +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 + +[ 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 +Signed-off-by: Bard Liao +Link: https://patch.msgid.link/20250716082300.1810352-1-yung-chuan.liao@linux.intel.com +Signed-off-by: Mark Brown +Signed-off-by: Sasha Levin +--- + 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 + diff --git a/queue-6.16/drm-panfrost-add-support-for-mali-on-the-mt8370-soc.patch b/queue-6.16/drm-panfrost-add-support-for-mali-on-the-mt8370-soc.patch new file mode 100644 index 0000000000..bda17ac076 --- /dev/null +++ b/queue-6.16/drm-panfrost-add-support-for-mali-on-the-mt8370-soc.patch @@ -0,0 +1,65 @@ +From ad62c26d2ac3c407a8c4d35dfa8669df5132f4bd Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 9 May 2025 12:12:50 +0200 +Subject: drm/panfrost: Add support for Mali on the MT8370 SoC + +From: Louis-Alexis Eyraud + +[ 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 +Reviewed-by: AngeloGioacchino Del Regno +Signed-off-by: Louis-Alexis Eyraud +Signed-off-by: Steven Price +Link: https://lore.kernel.org/r/20250509-mt8370-enable-gpu-v6-4-2833888cb1d3@collabora.com +Signed-off-by: Sasha Levin +--- + 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 + diff --git a/queue-6.16/drm-panfrost-commonize-mediatek-power-domain-array-d.patch b/queue-6.16/drm-panfrost-commonize-mediatek-power-domain-array-d.patch new file mode 100644 index 0000000000..d9095787c8 --- /dev/null +++ b/queue-6.16/drm-panfrost-commonize-mediatek-power-domain-array-d.patch @@ -0,0 +1,110 @@ +From d5956bf938dd402a3680bef657aaaeb51470e153 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 9 May 2025 12:12:49 +0200 +Subject: drm/panfrost: Commonize Mediatek power domain array definitions + +From: Louis-Alexis Eyraud + +[ 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 +Reviewed-by: Steven Price +Signed-off-by: Steven Price +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 +--- + 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 + diff --git a/queue-6.16/drm-panfrost-drop-duplicated-mediatek-supplies-array.patch b/queue-6.16/drm-panfrost-drop-duplicated-mediatek-supplies-array.patch new file mode 100644 index 0000000000..98ed487207 --- /dev/null +++ b/queue-6.16/drm-panfrost-drop-duplicated-mediatek-supplies-array.patch @@ -0,0 +1,96 @@ +From ba8a94b1728d25d446b95b52e2d2a52ff439ad84 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 9 May 2025 12:12:48 +0200 +Subject: drm/panfrost: Drop duplicated Mediatek supplies arrays + +From: Louis-Alexis Eyraud + +[ 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 +Reviewed-by: Steven Price +Signed-off-by: Steven Price +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 +--- + 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 + diff --git a/queue-6.16/firewire-core-fix-overlooked-update-of-subsystem-abi.patch b/queue-6.16/firewire-core-fix-overlooked-update-of-subsystem-abi.patch new file mode 100644 index 0000000000..03f61d1c1f --- /dev/null +++ b/queue-6.16/firewire-core-fix-overlooked-update-of-subsystem-abi.patch @@ -0,0 +1,39 @@ +From 8e01c0e2e9aaf018d6a8b0b9d009775caf5bfae3 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sat, 20 Sep 2025 11:51:48 +0900 +Subject: firewire: core: fix overlooked update of subsystem ABI version + +From: Takashi Sakamoto + +[ 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 +Signed-off-by: Sasha Levin +--- + 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 + diff --git a/queue-6.16/gpiolib-acpi-add-quirk-for-asus-proart-px13.patch b/queue-6.16/gpiolib-acpi-add-quirk-for-asus-proart-px13.patch new file mode 100644 index 0000000000..b16122145a --- /dev/null +++ b/queue-6.16/gpiolib-acpi-add-quirk-for-asus-proart-px13.patch @@ -0,0 +1,55 @@ +From c175c38a14919414e73f6de6f400163d0220ccf1 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 14 Aug 2025 13:34:29 -0500 +Subject: gpiolib: acpi: Add quirk for ASUS ProArt PX13 + +From: Mario Limonciello (AMD) + +[ 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 +Closes: https://gitlab.freedesktop.org/drm/amd/-/issues/4482 +Tested-by: Amit Chaudhari +Signed-off-by: Mario Limonciello (AMD) +Reviewed-by: Mika Westerberg +Link: https://lore.kernel.org/20250814183430.3887973-1-superm1@kernel.org +Signed-off-by: Linus Walleij +Signed-off-by: Sasha Levin +--- + 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 + diff --git a/queue-6.16/hid-amd_sfh-add-sync-across-amd-sfh-work-functions.patch b/queue-6.16/hid-amd_sfh-add-sync-across-amd-sfh-work-functions.patch new file mode 100644 index 0000000000..108c62251b --- /dev/null +++ b/queue-6.16/hid-amd_sfh-add-sync-across-amd-sfh-work-functions.patch @@ -0,0 +1,122 @@ +From bfaca0e9326e817fd5bff79f2676ccb98b4b27ff Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 18 Sep 2025 18:02:02 +0530 +Subject: HID: amd_sfh: Add sync across amd sfh work functions + +From: Basavaraj Natikar + +[ 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 +Closes: https://lore.kernel.org/all/a21abca5-4268-449d-95f1-bdd7a25894a5@linux.dev/ +Tested-by: Prakruthi SP +Co-developed-by: Akshata MukundShetty +Signed-off-by: Akshata MukundShetty +Signed-off-by: Basavaraj Natikar +Reviewed-by: Mario Limonciello (AMD) +Signed-off-by: Jiri Kosina +Signed-off-by: Sasha Levin +--- + 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 + #include + #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 + diff --git a/queue-6.16/hid-cp2112-fix-setter-callbacks-return-value.patch b/queue-6.16/hid-cp2112-fix-setter-callbacks-return-value.patch new file mode 100644 index 0000000000..f71bd5b134 --- /dev/null +++ b/queue-6.16/hid-cp2112-fix-setter-callbacks-return-value.patch @@ -0,0 +1,69 @@ +From 0d34bdade971798913a9fbbd9b6b662c604198ca Mon Sep 17 00:00:00 2001 +From: Sasha Levin +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 + +[ 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 +Reviewed-by: Bartosz Golaszewski +Signed-off-by: Jiri Kosina +Signed-off-by: Sasha Levin +--- + 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 + diff --git a/queue-6.16/hid-multitouch-get-the-contact-id-from-hid_dg_transd.patch b/queue-6.16/hid-multitouch-get-the-contact-id-from-hid_dg_transd.patch new file mode 100644 index 0000000000..6b80914202 --- /dev/null +++ b/queue-6.16/hid-multitouch-get-the-contact-id-from-hid_dg_transd.patch @@ -0,0 +1,75 @@ +From 2b4c2aa0ee0f045d788eac348125112de31d8154 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +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 + +[ 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 +Signed-off-by: Kerem Karabay +Co-developed-by: Aditya Garg +Signed-off-by: Aditya Garg +Signed-off-by: Jiri Kosina +Signed-off-by: Sasha Levin +--- + 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 + diff --git a/queue-6.16/hid-multitouch-specify-that-apple-touch-bar-is-direc.patch b/queue-6.16/hid-multitouch-specify-that-apple-touch-bar-is-direc.patch new file mode 100644 index 0000000000..7ebebd8710 --- /dev/null +++ b/queue-6.16/hid-multitouch-specify-that-apple-touch-bar-is-direc.patch @@ -0,0 +1,45 @@ +From 73d04f08aaa905e59dd83e286f5a136b211c1e8c Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 27 May 2025 22:13:16 +0530 +Subject: HID: multitouch: specify that Apple Touch Bar is direct + +From: Kerem Karabay + +[ 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 +Signed-off-by: Kerem Karabay +Co-developed-by: Aditya Garg +Signed-off-by: Aditya Garg +Signed-off-by: Jiri Kosina +Signed-off-by: Sasha Levin +--- + 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 + diff --git a/queue-6.16/hid-multitouch-support-getting-the-tip-state-from-hi.patch b/queue-6.16/hid-multitouch-support-getting-the-tip-state-from-hi.patch new file mode 100644 index 0000000000..18a579facc --- /dev/null +++ b/queue-6.16/hid-multitouch-support-getting-the-tip-state-from-hi.patch @@ -0,0 +1,61 @@ +From 16532132671468af37504e1bdb68288d5b01ed4e Mon Sep 17 00:00:00 2001 +From: Sasha Levin +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 + +[ 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 +Signed-off-by: Kerem Karabay +Co-developed-by: Aditya Garg +Signed-off-by: Aditya Garg +Signed-off-by: Jiri Kosina +Signed-off-by: Sasha Levin +--- + 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 + diff --git a/queue-6.16/hid-multitouch-take-cls-maxcontacts-into-account-for.patch b/queue-6.16/hid-multitouch-take-cls-maxcontacts-into-account-for.patch new file mode 100644 index 0000000000..99930df9ee --- /dev/null +++ b/queue-6.16/hid-multitouch-take-cls-maxcontacts-into-account-for.patch @@ -0,0 +1,44 @@ +From 4c1a276b705de6fddcbfc1a096ea869da02992e0 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +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 + +[ 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 +Signed-off-by: Kerem Karabay +Co-developed-by: Aditya Garg +Signed-off-by: Aditya Garg +Signed-off-by: Jiri Kosina +Signed-off-by: Sasha Levin +--- + 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 + diff --git a/queue-6.16/i2c-designware-add-quirk-for-intel-xe.patch b/queue-6.16/i2c-designware-add-quirk-for-intel-xe.patch new file mode 100644 index 0000000000..d13d85af08 --- /dev/null +++ b/queue-6.16/i2c-designware-add-quirk-for-intel-xe.patch @@ -0,0 +1,58 @@ +From 065d51137325b35e03432850e97842bd682e478a Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 1 Jul 2025 15:22:49 +0300 +Subject: i2c: designware: Add quirk for Intel Xe + +From: Heikki Krogerus + +[ 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 +Co-developed-by: Michael J. Ruhl +Signed-off-by: Michael J. Ruhl +Signed-off-by: Heikki Krogerus +Reviewed-by: Andi Shyti +Link: https://lore.kernel.org/r/20250701122252.2590230-3-heikki.krogerus@linux.intel.com +Signed-off-by: Rodrigo Vivi +[Rodrigo fixed the co-developed tags while merging] +Signed-off-by: Sasha Levin +--- + 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 + diff --git a/queue-6.16/ib-mlx5-fix-obj_type-mismatch-for-srq-event-subscrip.patch b/queue-6.16/ib-mlx5-fix-obj_type-mismatch-for-srq-event-subscrip.patch new file mode 100644 index 0000000000..ec23cd2c25 --- /dev/null +++ b/queue-6.16/ib-mlx5-fix-obj_type-mismatch-for-srq-event-subscrip.patch @@ -0,0 +1,50 @@ +From cd1edadf90b093fda95efd95930df7fe554520cc Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 13 Aug 2025 15:43:20 +0300 +Subject: IB/mlx5: Fix obj_type mismatch for SRQ event subscriptions + +From: Or Har-Toov + +[ 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 +Reviewed-by: Edward Srouji +Signed-off-by: Leon Romanovsky +Signed-off-by: Jason Gunthorpe +Signed-off-by: Sasha Levin +--- + 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 + diff --git a/queue-6.16/mmc-sdhci-cadence-add-mobileye-eyeq-support.patch b/queue-6.16/mmc-sdhci-cadence-add-mobileye-eyeq-support.patch new file mode 100644 index 0000000000..48215e919c --- /dev/null +++ b/queue-6.16/mmc-sdhci-cadence-add-mobileye-eyeq-support.patch @@ -0,0 +1,56 @@ +From 44d1ab5475078b5fc07110ea7b25bd4c34aca78b Mon Sep 17 00:00:00 2001 +From: Sasha Levin +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 + +[ 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 +Link: https://lore.kernel.org/r/e97f409650495791e07484589e1666ead570fa12.1750156323.git.benoit.monin@bootlin.com +Signed-off-by: Ulf Hansson +Signed-off-by: Sasha Levin +--- + 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 + diff --git a/queue-6.16/net-fec-rename-struct-fec_devinfo-fec_imx6x_info-fec.patch b/queue-6.16/net-fec-rename-struct-fec_devinfo-fec_imx6x_info-fec.patch new file mode 100644 index 0000000000..6736b2a62e --- /dev/null +++ b/queue-6.16/net-fec-rename-struct-fec_devinfo-fec_imx6x_info-fec.patch @@ -0,0 +1,54 @@ +From ade2cc7270d961115a53eb68df51f8a8cc9b2fe6 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +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 + +[ 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 +Reviewed-by: Frank Li +Reviewed-by: Andrew Lunn +Signed-off-by: Marc Kleine-Budde +Link: https://patch.msgid.link/20250618-fec-cleanups-v4-5-c16f9a1af124@pengutronix.de +Signed-off-by: Jakub Kicinski +Signed-off-by: Sasha Levin +--- + 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 + diff --git a/queue-6.16/net-sfp-add-quirk-for-flypro-copper-sfp-module.patch b/queue-6.16/net-sfp-add-quirk-for-flypro-copper-sfp-module.patch new file mode 100644 index 0000000000..dce1025bbb --- /dev/null +++ b/queue-6.16/net-sfp-add-quirk-for-flypro-copper-sfp-module.patch @@ -0,0 +1,38 @@ +From 16c2b13944194dc0cd1cd0006801ec6addb1c715 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sun, 31 Aug 2025 12:59:07 +0200 +Subject: net: sfp: add quirk for FLYPRO copper SFP+ module + +From: Aleksander Jan Bajkowski + +[ 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 +Reviewed-by: Russell King (Oracle) +Link: https://patch.msgid.link/20250831105910.3174-1-olek2@wp.pl +Signed-off-by: Jakub Kicinski +Signed-off-by: Sasha Levin +--- + 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 + diff --git a/queue-6.16/net-sfp-add-quirk-for-potron-sfp-xgspon-onu-stick.patch b/queue-6.16/net-sfp-add-quirk-for-potron-sfp-xgspon-onu-stick.patch new file mode 100644 index 0000000000..6a06a10aef --- /dev/null +++ b/queue-6.16/net-sfp-add-quirk-for-potron-sfp-xgspon-onu-stick.patch @@ -0,0 +1,76 @@ +From cdd2b98dc99825669d43ab26a0764500ff36a308 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 17 Jun 2025 13:03:24 -0500 +Subject: net: sfp: add quirk for Potron SFP+ XGSPON ONU Stick + +From: Chris Morgan + +[ 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 +Link: https://patch.msgid.link/20250617180324.229487-1-macroalpha82@gmail.com +Signed-off-by: Jakub Kicinski +Signed-off-by: Sasha Levin +--- + 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 + diff --git a/queue-6.16/platform-x86-oxpec-add-support-for-onexplayer-x1-min.patch b/queue-6.16/platform-x86-oxpec-add-support-for-onexplayer-x1-min.patch new file mode 100644 index 0000000000..9bee781ea0 --- /dev/null +++ b/queue-6.16/platform-x86-oxpec-add-support-for-onexplayer-x1-min.patch @@ -0,0 +1,46 @@ +From 23a5c64fe65fa6f85b3f91656b7a4700e1a2959e Mon Sep 17 00:00:00 2001 +From: Sasha Levin +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 + +[ 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 +Link: https://lore.kernel.org/r/20250718163305.159232-2-lkml@antheas.dev +Reviewed-by: Ilpo Järvinen +Signed-off-by: Ilpo Järvinen +Signed-off-by: Sasha Levin +--- + 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 + diff --git a/queue-6.16/scsi-ufs-mcq-fix-memory-allocation-checks-for-sqe-an.patch b/queue-6.16/scsi-ufs-mcq-fix-memory-allocation-checks-for-sqe-an.patch new file mode 100644 index 0000000000..06383a0a03 --- /dev/null +++ b/queue-6.16/scsi-ufs-mcq-fix-memory-allocation-checks-for-sqe-an.patch @@ -0,0 +1,53 @@ +From 084956e2ad776015771204067591d0e2514e77d7 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sun, 7 Sep 2025 12:40:16 -0700 +Subject: scsi: ufs: mcq: Fix memory allocation checks for SQE and CQE + +From: Alok Tiwari + +[ 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 +Reviewed-by: Alim Akhtar +Reviewed-by: Manivannan Sadhasivam +Reviewed-by: Peter Wang +Signed-off-by: Martin K. Petersen +Signed-off-by: Sasha Levin +--- + 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 + diff --git a/queue-6.16/series b/queue-6.16/series new file mode 100644 index 0000000000..bcea188ea0 --- /dev/null +++ b/queue-6.16/series @@ -0,0 +1,37 @@ +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 diff --git a/queue-6.16/usb-core-add-0x-prefix-to-quirks-debug-output.patch b/queue-6.16/usb-core-add-0x-prefix-to-quirks-debug-output.patch new file mode 100644 index 0000000000..a4aa9e1fcd --- /dev/null +++ b/queue-6.16/usb-core-add-0x-prefix-to-quirks-debug-output.patch @@ -0,0 +1,36 @@ +From 63942b2e7a7b4bd93ccdbfa72ebe567f322c22e1 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 3 Jun 2025 15:10:45 +0800 +Subject: usb: core: Add 0x prefix to quirks debug output + +From: Jiayi Li + +[ 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 +Link: https://lore.kernel.org/r/20250603071045.3243699-1-lijiayi@kylinos.cn +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Sasha Levin +--- + 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 + diff --git a/queue-6.6/alsa-usb-audio-add-dsd-support-for-comtrue-usb-audio.patch b/queue-6.6/alsa-usb-audio-add-dsd-support-for-comtrue-usb-audio.patch new file mode 100644 index 0000000000..9557212777 --- /dev/null +++ b/queue-6.6/alsa-usb-audio-add-dsd-support-for-comtrue-usb-audio.patch @@ -0,0 +1,40 @@ +From 8dfeb6aa2489eaf36546d7f85967566a1193cf47 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 31 Jul 2025 19:06:14 +0800 +Subject: ALSA: usb-audio: Add DSD support for Comtrue USB Audio device + +From: noble.yang + +[ 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 +Link: https://patch.msgid.link/20250731110614.4070-1-noble228@gmail.com +Signed-off-by: Takashi Iwai +Signed-off-by: Sasha Levin +--- + 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 + diff --git a/queue-6.6/alsa-usb-audio-add-mixer-quirk-for-sony-dualsense-ps.patch b/queue-6.6/alsa-usb-audio-add-mixer-quirk-for-sony-dualsense-ps.patch new file mode 100644 index 0000000000..86617e7087 --- /dev/null +++ b/queue-6.6/alsa-usb-audio-add-mixer-quirk-for-sony-dualsense-ps.patch @@ -0,0 +1,321 @@ +From bc842689fe59b1cf346821417d1d94fe2081815f Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 26 May 2025 17:07:48 +0300 +Subject: ALSA: usb-audio: Add mixer quirk for Sony DualSense PS5 + +From: Cristian Ciocaltea + +[ 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 +Signed-off-by: Takashi Iwai +Link: https://patch.msgid.link/20250526-dualsense-alsa-jack-v1-9-1a821463b632@collabora.com +Signed-off-by: Sasha Levin +--- + 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 + #include ++#include + #include + #include + #include +@@ -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 + diff --git a/queue-6.6/alsa-usb-audio-add-mute-tlv-for-playback-volumes-on-.patch b/queue-6.6/alsa-usb-audio-add-mute-tlv-for-playback-volumes-on-.patch new file mode 100644 index 0000000000..a8686635d7 --- /dev/null +++ b/queue-6.6/alsa-usb-audio-add-mute-tlv-for-playback-volumes-on-.patch @@ -0,0 +1,73 @@ +From 635ae24e61094a5b79d7a045b626d423b3c836c0 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 29 Aug 2025 14:40:48 +0800 +Subject: ALSA: usb-audio: Add mute TLV for playback volumes on more devices + +From: qaqland + +[ 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 +Signed-off-by: qaqland +Link: https://patch.msgid.link/20250829-sound_quirk-v1-1-745529b44440@uniontech.com +Signed-off-by: Takashi Iwai +Signed-off-by: Sasha Levin +--- + 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 + diff --git a/queue-6.6/alsa-usb-audio-avoid-multiple-assignments-in-mixer_q.patch b/queue-6.6/alsa-usb-audio-avoid-multiple-assignments-in-mixer_q.patch new file mode 100644 index 0000000000..d2f0d183d3 --- /dev/null +++ b/queue-6.6/alsa-usb-audio-avoid-multiple-assignments-in-mixer_q.patch @@ -0,0 +1,38 @@ +From ce6c03e06ace31d5f6ce6d89d26478afe54ebcc3 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 26 May 2025 17:07:45 +0300 +Subject: ALSA: usb-audio: Avoid multiple assignments in mixer_quirks + +From: Cristian Ciocaltea + +[ Upstream commit 03ddd3bdb94df3edb1f2408b57cfb00b3d92a208 ] + +Handle report from checkpatch.pl: + + CHECK: multiple assignments should be avoided + +Signed-off-by: Cristian Ciocaltea +Signed-off-by: Takashi Iwai +Link: https://patch.msgid.link/20250526-dualsense-alsa-jack-v1-6-1a821463b632@collabora.com +Signed-off-by: Sasha Levin +--- + 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 + diff --git a/queue-6.6/alsa-usb-audio-convert-comma-to-semicolon.patch b/queue-6.6/alsa-usb-audio-convert-comma-to-semicolon.patch new file mode 100644 index 0000000000..5073c71e56 --- /dev/null +++ b/queue-6.6/alsa-usb-audio-convert-comma-to-semicolon.patch @@ -0,0 +1,49 @@ +From 09523443393b2ff18c53d811f4722ee54cd917e1 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 12 Jun 2025 14:02:28 +0800 +Subject: ALSA: usb-audio: Convert comma to semicolon + +From: Chen Ni + +[ 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 +Reviewed-by: Cristian Ciocaltea +Link: https://patch.msgid.link/20250612060228.1518028-1-nichen@iscas.ac.cn +Signed-off-by: Takashi Iwai +Signed-off-by: Sasha Levin +--- + 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 + diff --git a/queue-6.6/alsa-usb-audio-drop-unnecessary-parentheses-in-mixer.patch b/queue-6.6/alsa-usb-audio-drop-unnecessary-parentheses-in-mixer.patch new file mode 100644 index 0000000000..2c44055b95 --- /dev/null +++ b/queue-6.6/alsa-usb-audio-drop-unnecessary-parentheses-in-mixer.patch @@ -0,0 +1,49 @@ +From 57939ada9ef0cdcf66646d261bfa92e89ab1fa8f Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 26 May 2025 17:07:44 +0300 +Subject: ALSA: usb-audio: Drop unnecessary parentheses in mixer_quirks + +From: Cristian Ciocaltea + +[ Upstream commit c0495cef8b43ad61efbd4019e3573742e0e63c67 ] + +Fix multiple 'CHECK: Unnecessary parentheses around ...' reports from +checkpatch.pl. + +Signed-off-by: Cristian Ciocaltea +Signed-off-by: Takashi Iwai +Link: https://patch.msgid.link/20250526-dualsense-alsa-jack-v1-5-1a821463b632@collabora.com +Signed-off-by: Sasha Levin +--- + 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 + diff --git a/queue-6.6/alsa-usb-audio-fix-block-comments-in-mixer_quirks.patch b/queue-6.6/alsa-usb-audio-fix-block-comments-in-mixer_quirks.patch new file mode 100644 index 0000000000..7d6618f5d0 --- /dev/null +++ b/queue-6.6/alsa-usb-audio-fix-block-comments-in-mixer_quirks.patch @@ -0,0 +1,49 @@ +From 15c5b27f4d97fb3c8ed08709ce607206fb2655ba Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 26 May 2025 17:07:43 +0300 +Subject: ALSA: usb-audio: Fix block comments in mixer_quirks + +From: Cristian Ciocaltea + +[ 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 +Signed-off-by: Takashi Iwai +Link: https://patch.msgid.link/20250526-dualsense-alsa-jack-v1-4-1a821463b632@collabora.com +Signed-off-by: Sasha Levin +--- + 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 + diff --git a/queue-6.6/alsa-usb-audio-fix-build-with-config_input-n.patch b/queue-6.6/alsa-usb-audio-fix-build-with-config_input-n.patch new file mode 100644 index 0000000000..25ab46deba --- /dev/null +++ b/queue-6.6/alsa-usb-audio-fix-build-with-config_input-n.patch @@ -0,0 +1,61 @@ +From 63a0a0907e8b01d74cfd445e066c46ebbdff58e6 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 13 Jun 2025 10:15:30 +0200 +Subject: ALSA: usb-audio: Fix build with CONFIG_INPUT=n + +From: Takashi Iwai + +[ 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 +Closes: https://lore.kernel.org/oe-kbuild-all/202506130733.gnPKw2l3-lkp@intel.com/ +Reviewed-by: Cristian Ciocaltea +Link: https://patch.msgid.link/20250613081543.7404-1-tiwai@suse.de +Signed-off-by: Takashi Iwai +Signed-off-by: Sasha Levin +--- + 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 + diff --git a/queue-6.6/alsa-usb-audio-move-mixer_quirks-min_mute-into-commo.patch b/queue-6.6/alsa-usb-audio-move-mixer_quirks-min_mute-into-commo.patch new file mode 100644 index 0000000000..07e6a40b32 --- /dev/null +++ b/queue-6.6/alsa-usb-audio-move-mixer_quirks-min_mute-into-commo.patch @@ -0,0 +1,123 @@ +From 56ccd0ab3ca59606c139da7a8e713253d3870c8e Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 27 Aug 2025 11:29:02 +0800 +Subject: ALSA: usb-audio: move mixer_quirks' min_mute into common quirk + +From: Cryolitia PukNgae + +[ 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 +Signed-off-by: Cryolitia PukNgae +Link: https://patch.msgid.link/20250827-sound-quirk-min-mute-v1-1-4717aa8a4f6a@uniontech.com +Signed-off-by: Takashi Iwai +Signed-off-by: Sasha Levin +--- + 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 + diff --git a/queue-6.6/alsa-usb-audio-remove-unneeded-wmb-in-mixer_quirks.patch b/queue-6.6/alsa-usb-audio-remove-unneeded-wmb-in-mixer_quirks.patch new file mode 100644 index 0000000000..f18738a2ff --- /dev/null +++ b/queue-6.6/alsa-usb-audio-remove-unneeded-wmb-in-mixer_quirks.patch @@ -0,0 +1,46 @@ +From a16d5dcd032f911ad169d9c017a110a8fe7bbabc Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 26 May 2025 17:07:47 +0300 +Subject: ALSA: usb-audio: Remove unneeded wmb() in mixer_quirks + +From: Cristian Ciocaltea + +[ 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 +Signed-off-by: Takashi Iwai +Link: https://patch.msgid.link/20250526-dualsense-alsa-jack-v1-8-1a821463b632@collabora.com +Signed-off-by: Sasha Levin +--- + 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 + diff --git a/queue-6.6/alsa-usb-audio-simplify-null-comparison-in-mixer_qui.patch b/queue-6.6/alsa-usb-audio-simplify-null-comparison-in-mixer_qui.patch new file mode 100644 index 0000000000..80ad23c704 --- /dev/null +++ b/queue-6.6/alsa-usb-audio-simplify-null-comparison-in-mixer_qui.patch @@ -0,0 +1,37 @@ +From 4462ff893bc6816bba5830eabcd764a1210c9f1c Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 26 May 2025 17:07:46 +0300 +Subject: ALSA: usb-audio: Simplify NULL comparison in mixer_quirks + +From: Cristian Ciocaltea + +[ Upstream commit f2d6d660e8fd5f4467e80743f82119201e67fa9c ] + +Handle report from checkpatch.pl: + + CHECK: Comparison to NULL could be written "t->name" + +Signed-off-by: Cristian Ciocaltea +Signed-off-by: Takashi Iwai +Link: https://patch.msgid.link/20250526-dualsense-alsa-jack-v1-7-1a821463b632@collabora.com +Signed-off-by: Sasha Levin +--- + 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 + diff --git a/queue-6.6/firewire-core-fix-overlooked-update-of-subsystem-abi.patch b/queue-6.6/firewire-core-fix-overlooked-update-of-subsystem-abi.patch new file mode 100644 index 0000000000..07420760e8 --- /dev/null +++ b/queue-6.6/firewire-core-fix-overlooked-update-of-subsystem-abi.patch @@ -0,0 +1,39 @@ +From 0a8dd222dcca459c2dcfa6b4312b3688444319bd Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sat, 20 Sep 2025 11:51:48 +0900 +Subject: firewire: core: fix overlooked update of subsystem ABI version + +From: Takashi Sakamoto + +[ 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 +Signed-off-by: Sasha Levin +--- + 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 + diff --git a/queue-6.6/hid-multitouch-get-the-contact-id-from-hid_dg_transd.patch b/queue-6.6/hid-multitouch-get-the-contact-id-from-hid_dg_transd.patch new file mode 100644 index 0000000000..4822aaaab4 --- /dev/null +++ b/queue-6.6/hid-multitouch-get-the-contact-id-from-hid_dg_transd.patch @@ -0,0 +1,75 @@ +From efea291f3e4a120426265a362e69a2d828086c87 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +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 + +[ 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 +Signed-off-by: Kerem Karabay +Co-developed-by: Aditya Garg +Signed-off-by: Aditya Garg +Signed-off-by: Jiri Kosina +Signed-off-by: Sasha Levin +--- + 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 + diff --git a/queue-6.6/hid-multitouch-specify-that-apple-touch-bar-is-direc.patch b/queue-6.6/hid-multitouch-specify-that-apple-touch-bar-is-direc.patch new file mode 100644 index 0000000000..805f49a7ff --- /dev/null +++ b/queue-6.6/hid-multitouch-specify-that-apple-touch-bar-is-direc.patch @@ -0,0 +1,45 @@ +From 8d978b8739618dd418d99968c175d5c865e0b384 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 27 May 2025 22:13:16 +0530 +Subject: HID: multitouch: specify that Apple Touch Bar is direct + +From: Kerem Karabay + +[ 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 +Signed-off-by: Kerem Karabay +Co-developed-by: Aditya Garg +Signed-off-by: Aditya Garg +Signed-off-by: Jiri Kosina +Signed-off-by: Sasha Levin +--- + 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 + diff --git a/queue-6.6/hid-multitouch-support-getting-the-tip-state-from-hi.patch b/queue-6.6/hid-multitouch-support-getting-the-tip-state-from-hi.patch new file mode 100644 index 0000000000..3ae51cf98c --- /dev/null +++ b/queue-6.6/hid-multitouch-support-getting-the-tip-state-from-hi.patch @@ -0,0 +1,61 @@ +From 350ed4a05e4f857a5f1e8c80e499f3cce702eda1 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +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 + +[ 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 +Signed-off-by: Kerem Karabay +Co-developed-by: Aditya Garg +Signed-off-by: Aditya Garg +Signed-off-by: Jiri Kosina +Signed-off-by: Sasha Levin +--- + 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 + diff --git a/queue-6.6/hid-multitouch-take-cls-maxcontacts-into-account-for.patch b/queue-6.6/hid-multitouch-take-cls-maxcontacts-into-account-for.patch new file mode 100644 index 0000000000..c779bd9cb8 --- /dev/null +++ b/queue-6.6/hid-multitouch-take-cls-maxcontacts-into-account-for.patch @@ -0,0 +1,44 @@ +From 805659a3435f0a0793abec6d58dca903a96e287c Mon Sep 17 00:00:00 2001 +From: Sasha Levin +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 + +[ 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 +Signed-off-by: Kerem Karabay +Co-developed-by: Aditya Garg +Signed-off-by: Aditya Garg +Signed-off-by: Jiri Kosina +Signed-off-by: Sasha Levin +--- + 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 + diff --git a/queue-6.6/i2c-designware-add-quirk-for-intel-xe.patch b/queue-6.6/i2c-designware-add-quirk-for-intel-xe.patch new file mode 100644 index 0000000000..9b9a32be83 --- /dev/null +++ b/queue-6.6/i2c-designware-add-quirk-for-intel-xe.patch @@ -0,0 +1,58 @@ +From 09b340cd294dfaa1583009bb779d077bcbcf94e4 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 1 Jul 2025 15:22:49 +0300 +Subject: i2c: designware: Add quirk for Intel Xe + +From: Heikki Krogerus + +[ 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 +Co-developed-by: Michael J. Ruhl +Signed-off-by: Michael J. Ruhl +Signed-off-by: Heikki Krogerus +Reviewed-by: Andi Shyti +Link: https://lore.kernel.org/r/20250701122252.2590230-3-heikki.krogerus@linux.intel.com +Signed-off-by: Rodrigo Vivi +[Rodrigo fixed the co-developed tags while merging] +Signed-off-by: Sasha Levin +--- + 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 + diff --git a/queue-6.6/ib-mlx5-fix-obj_type-mismatch-for-srq-event-subscrip.patch b/queue-6.6/ib-mlx5-fix-obj_type-mismatch-for-srq-event-subscrip.patch new file mode 100644 index 0000000000..a54afba812 --- /dev/null +++ b/queue-6.6/ib-mlx5-fix-obj_type-mismatch-for-srq-event-subscrip.patch @@ -0,0 +1,50 @@ +From 59281cf0dcecd0d8716db481540952060d86d5c6 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 13 Aug 2025 15:43:20 +0300 +Subject: IB/mlx5: Fix obj_type mismatch for SRQ event subscriptions + +From: Or Har-Toov + +[ 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 +Reviewed-by: Edward Srouji +Signed-off-by: Leon Romanovsky +Signed-off-by: Jason Gunthorpe +Signed-off-by: Sasha Levin +--- + 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 + diff --git a/queue-6.6/mmc-sdhci-cadence-add-mobileye-eyeq-support.patch b/queue-6.6/mmc-sdhci-cadence-add-mobileye-eyeq-support.patch new file mode 100644 index 0000000000..1aa22fd73c --- /dev/null +++ b/queue-6.6/mmc-sdhci-cadence-add-mobileye-eyeq-support.patch @@ -0,0 +1,56 @@ +From 56d94660c3e8de98cc04255cf7c9693a13a8e4c4 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +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 + +[ 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 +Link: https://lore.kernel.org/r/e97f409650495791e07484589e1666ead570fa12.1750156323.git.benoit.monin@bootlin.com +Signed-off-by: Ulf Hansson +Signed-off-by: Sasha Levin +--- + 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 + diff --git a/queue-6.6/scsi-ufs-mcq-fix-memory-allocation-checks-for-sqe-an.patch b/queue-6.6/scsi-ufs-mcq-fix-memory-allocation-checks-for-sqe-an.patch new file mode 100644 index 0000000000..e561b683db --- /dev/null +++ b/queue-6.6/scsi-ufs-mcq-fix-memory-allocation-checks-for-sqe-an.patch @@ -0,0 +1,53 @@ +From 053a8a54007380998c92a1c12dfd92746097745e Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sun, 7 Sep 2025 12:40:16 -0700 +Subject: scsi: ufs: mcq: Fix memory allocation checks for SQE and CQE + +From: Alok Tiwari + +[ 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 +Reviewed-by: Alim Akhtar +Reviewed-by: Manivannan Sadhasivam +Reviewed-by: Peter Wang +Signed-off-by: Martin K. Petersen +Signed-off-by: Sasha Levin +--- + 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 + diff --git a/queue-6.6/series b/queue-6.6/series new file mode 100644 index 0000000000..a341579cab --- /dev/null +++ b/queue-6.6/series @@ -0,0 +1,21 @@ +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 diff --git a/queue-6.6/usb-core-add-0x-prefix-to-quirks-debug-output.patch b/queue-6.6/usb-core-add-0x-prefix-to-quirks-debug-output.patch new file mode 100644 index 0000000000..18a83d4552 --- /dev/null +++ b/queue-6.6/usb-core-add-0x-prefix-to-quirks-debug-output.patch @@ -0,0 +1,36 @@ +From 023b1249fbb069dae08191b3d6f9d195f139cfee Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 3 Jun 2025 15:10:45 +0800 +Subject: usb: core: Add 0x prefix to quirks debug output + +From: Jiayi Li + +[ 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 +Link: https://lore.kernel.org/r/20250603071045.3243699-1-lijiayi@kylinos.cn +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Sasha Levin +--- + 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 +