]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
Fixes for all trees
authorSasha Levin <sashal@kernel.org>
Thu, 25 Sep 2025 11:29:27 +0000 (07:29 -0400)
committerSasha Levin <sashal@kernel.org>
Thu, 25 Sep 2025 11:29:27 +0000 (07:29 -0400)
Signed-off-by: Sasha Levin <sashal@kernel.org>
142 files changed:
queue-5.10/alsa-usb-audio-add-mixer-quirk-for-sony-dualsense-ps.patch [new file with mode: 0644]
queue-5.10/alsa-usb-audio-avoid-multiple-assignments-in-mixer_q.patch [new file with mode: 0644]
queue-5.10/alsa-usb-audio-convert-comma-to-semicolon.patch [new file with mode: 0644]
queue-5.10/alsa-usb-audio-drop-unnecessary-parentheses-in-mixer.patch [new file with mode: 0644]
queue-5.10/alsa-usb-audio-fix-block-comments-in-mixer_quirks.patch [new file with mode: 0644]
queue-5.10/alsa-usb-audio-fix-build-with-config_input-n.patch [new file with mode: 0644]
queue-5.10/alsa-usb-audio-remove-unneeded-wmb-in-mixer_quirks.patch [new file with mode: 0644]
queue-5.10/alsa-usb-audio-simplify-null-comparison-in-mixer_qui.patch [new file with mode: 0644]
queue-5.10/firewire-core-fix-overlooked-update-of-subsystem-abi.patch [new file with mode: 0644]
queue-5.10/ib-mlx5-fix-obj_type-mismatch-for-srq-event-subscrip.patch [new file with mode: 0644]
queue-5.10/series
queue-5.10/usb-core-add-0x-prefix-to-quirks-debug-output.patch [new file with mode: 0644]
queue-5.15/alsa-usb-audio-add-mixer-quirk-for-sony-dualsense-ps.patch [new file with mode: 0644]
queue-5.15/alsa-usb-audio-avoid-multiple-assignments-in-mixer_q.patch [new file with mode: 0644]
queue-5.15/alsa-usb-audio-convert-comma-to-semicolon.patch [new file with mode: 0644]
queue-5.15/alsa-usb-audio-drop-unnecessary-parentheses-in-mixer.patch [new file with mode: 0644]
queue-5.15/alsa-usb-audio-fix-block-comments-in-mixer_quirks.patch [new file with mode: 0644]
queue-5.15/alsa-usb-audio-fix-build-with-config_input-n.patch [new file with mode: 0644]
queue-5.15/alsa-usb-audio-remove-unneeded-wmb-in-mixer_quirks.patch [new file with mode: 0644]
queue-5.15/alsa-usb-audio-simplify-null-comparison-in-mixer_qui.patch [new file with mode: 0644]
queue-5.15/firewire-core-fix-overlooked-update-of-subsystem-abi.patch [new file with mode: 0644]
queue-5.15/ib-mlx5-fix-obj_type-mismatch-for-srq-event-subscrip.patch [new file with mode: 0644]
queue-5.15/series
queue-5.15/usb-core-add-0x-prefix-to-quirks-debug-output.patch [new file with mode: 0644]
queue-5.4/alsa-usb-audio-add-mixer-quirk-for-sony-dualsense-ps.patch [new file with mode: 0644]
queue-5.4/alsa-usb-audio-avoid-multiple-assignments-in-mixer_q.patch [new file with mode: 0644]
queue-5.4/alsa-usb-audio-convert-comma-to-semicolon.patch [new file with mode: 0644]
queue-5.4/alsa-usb-audio-fix-block-comments-in-mixer_quirks.patch [new file with mode: 0644]
queue-5.4/alsa-usb-audio-fix-build-with-config_input-n.patch [new file with mode: 0644]
queue-5.4/alsa-usb-audio-remove-unneeded-wmb-in-mixer_quirks.patch [new file with mode: 0644]
queue-5.4/alsa-usb-audio-simplify-null-comparison-in-mixer_qui.patch [new file with mode: 0644]
queue-5.4/firewire-core-fix-overlooked-update-of-subsystem-abi.patch [new file with mode: 0644]
queue-5.4/ib-mlx5-fix-obj_type-mismatch-for-srq-event-subscrip.patch [new file with mode: 0644]
queue-5.4/series
queue-5.4/usb-core-add-0x-prefix-to-quirks-debug-output.patch [new file with mode: 0644]
queue-6.1/alsa-usb-audio-add-dsd-support-for-comtrue-usb-audio.patch [new file with mode: 0644]
queue-6.1/alsa-usb-audio-add-mixer-quirk-for-sony-dualsense-ps.patch [new file with mode: 0644]
queue-6.1/alsa-usb-audio-add-mute-tlv-for-playback-volumes-on-.patch [new file with mode: 0644]
queue-6.1/alsa-usb-audio-avoid-multiple-assignments-in-mixer_q.patch [new file with mode: 0644]
queue-6.1/alsa-usb-audio-convert-comma-to-semicolon.patch [new file with mode: 0644]
queue-6.1/alsa-usb-audio-drop-unnecessary-parentheses-in-mixer.patch [new file with mode: 0644]
queue-6.1/alsa-usb-audio-fix-block-comments-in-mixer_quirks.patch [new file with mode: 0644]
queue-6.1/alsa-usb-audio-fix-build-with-config_input-n.patch [new file with mode: 0644]
queue-6.1/alsa-usb-audio-move-mixer_quirks-min_mute-into-commo.patch [new file with mode: 0644]
queue-6.1/alsa-usb-audio-remove-unneeded-wmb-in-mixer_quirks.patch [new file with mode: 0644]
queue-6.1/alsa-usb-audio-simplify-null-comparison-in-mixer_qui.patch [new file with mode: 0644]
queue-6.1/firewire-core-fix-overlooked-update-of-subsystem-abi.patch [new file with mode: 0644]
queue-6.1/hid-multitouch-get-the-contact-id-from-hid_dg_transd.patch [new file with mode: 0644]
queue-6.1/hid-multitouch-specify-that-apple-touch-bar-is-direc.patch [new file with mode: 0644]
queue-6.1/hid-multitouch-support-getting-the-tip-state-from-hi.patch [new file with mode: 0644]
queue-6.1/hid-multitouch-take-cls-maxcontacts-into-account-for.patch [new file with mode: 0644]
queue-6.1/ib-mlx5-fix-obj_type-mismatch-for-srq-event-subscrip.patch [new file with mode: 0644]
queue-6.1/series [new file with mode: 0644]
queue-6.1/usb-core-add-0x-prefix-to-quirks-debug-output.patch [new file with mode: 0644]
queue-6.12/alsa-hda-realtek-add-support-for-asus-nuc-using-cs35.patch [new file with mode: 0644]
queue-6.12/alsa-usb-audio-add-dsd-support-for-comtrue-usb-audio.patch [new file with mode: 0644]
queue-6.12/alsa-usb-audio-add-mixer-quirk-for-sony-dualsense-ps.patch [new file with mode: 0644]
queue-6.12/alsa-usb-audio-add-mute-tlv-for-playback-volumes-on-.patch [new file with mode: 0644]
queue-6.12/alsa-usb-audio-avoid-multiple-assignments-in-mixer_q.patch [new file with mode: 0644]
queue-6.12/alsa-usb-audio-convert-comma-to-semicolon.patch [new file with mode: 0644]
queue-6.12/alsa-usb-audio-drop-unnecessary-parentheses-in-mixer.patch [new file with mode: 0644]
queue-6.12/alsa-usb-audio-fix-block-comments-in-mixer_quirks.patch [new file with mode: 0644]
queue-6.12/alsa-usb-audio-fix-build-with-config_input-n.patch [new file with mode: 0644]
queue-6.12/alsa-usb-audio-fix-code-alignment-in-mixer_quirks.patch [new file with mode: 0644]
queue-6.12/alsa-usb-audio-move-mixer_quirks-min_mute-into-commo.patch [new file with mode: 0644]
queue-6.12/alsa-usb-audio-remove-unneeded-wmb-in-mixer_quirks.patch [new file with mode: 0644]
queue-6.12/alsa-usb-audio-simplify-null-comparison-in-mixer_qui.patch [new file with mode: 0644]
queue-6.12/firewire-core-fix-overlooked-update-of-subsystem-abi.patch [new file with mode: 0644]
queue-6.12/hid-amd_sfh-add-sync-across-amd-sfh-work-functions.patch [new file with mode: 0644]
queue-6.12/hid-multitouch-get-the-contact-id-from-hid_dg_transd.patch [new file with mode: 0644]
queue-6.12/hid-multitouch-specify-that-apple-touch-bar-is-direc.patch [new file with mode: 0644]
queue-6.12/hid-multitouch-support-getting-the-tip-state-from-hi.patch [new file with mode: 0644]
queue-6.12/hid-multitouch-take-cls-maxcontacts-into-account-for.patch [new file with mode: 0644]
queue-6.12/i2c-designware-add-quirk-for-intel-xe.patch [new file with mode: 0644]
queue-6.12/ib-mlx5-fix-obj_type-mismatch-for-srq-event-subscrip.patch [new file with mode: 0644]
queue-6.12/mmc-sdhci-cadence-add-mobileye-eyeq-support.patch [new file with mode: 0644]
queue-6.12/net-fec-rename-struct-fec_devinfo-fec_imx6x_info-fec.patch [new file with mode: 0644]
queue-6.12/net-sfp-add-quirk-for-flypro-copper-sfp-module.patch [new file with mode: 0644]
queue-6.12/net-sfp-add-quirk-for-potron-sfp-xgspon-onu-stick.patch [new file with mode: 0644]
queue-6.12/scsi-ufs-mcq-fix-memory-allocation-checks-for-sqe-an.patch [new file with mode: 0644]
queue-6.12/series [new file with mode: 0644]
queue-6.12/usb-core-add-0x-prefix-to-quirks-debug-output.patch [new file with mode: 0644]
queue-6.16/alsa-hda-realtek-add-support-for-asus-nuc-using-cs35.patch [new file with mode: 0644]
queue-6.16/alsa-usb-audio-add-dsd-support-for-comtrue-usb-audio.patch [new file with mode: 0644]
queue-6.16/alsa-usb-audio-add-mixer-quirk-for-sony-dualsense-ps.patch [new file with mode: 0644]
queue-6.16/alsa-usb-audio-add-mute-tlv-for-playback-volumes-on-.patch [new file with mode: 0644]
queue-6.16/alsa-usb-audio-avoid-multiple-assignments-in-mixer_q.patch [new file with mode: 0644]
queue-6.16/alsa-usb-audio-convert-comma-to-semicolon.patch [new file with mode: 0644]
queue-6.16/alsa-usb-audio-drop-unnecessary-parentheses-in-mixer.patch [new file with mode: 0644]
queue-6.16/alsa-usb-audio-fix-block-comments-in-mixer_quirks.patch [new file with mode: 0644]
queue-6.16/alsa-usb-audio-fix-build-with-config_input-n.patch [new file with mode: 0644]
queue-6.16/alsa-usb-audio-fix-code-alignment-in-mixer_quirks.patch [new file with mode: 0644]
queue-6.16/alsa-usb-audio-fix-whitespace-blank-line-issues-in-m.patch [new file with mode: 0644]
queue-6.16/alsa-usb-audio-move-mixer_quirks-min_mute-into-commo.patch [new file with mode: 0644]
queue-6.16/alsa-usb-audio-remove-unneeded-wmb-in-mixer_quirks.patch [new file with mode: 0644]
queue-6.16/alsa-usb-audio-simplify-null-comparison-in-mixer_qui.patch [new file with mode: 0644]
queue-6.16/asoc-intel-soc-acpi-add-entry-for-hdmi_in-capture-su.patch [new file with mode: 0644]
queue-6.16/asoc-intel-soc-acpi-add-entry-for-sof_es8336-in-ptl-.patch [new file with mode: 0644]
queue-6.16/asoc-intel-sof_rt5682-add-hdmi-in-capture-with-rt568.patch [new file with mode: 0644]
queue-6.16/drm-panfrost-add-support-for-mali-on-the-mt8370-soc.patch [new file with mode: 0644]
queue-6.16/drm-panfrost-commonize-mediatek-power-domain-array-d.patch [new file with mode: 0644]
queue-6.16/drm-panfrost-drop-duplicated-mediatek-supplies-array.patch [new file with mode: 0644]
queue-6.16/firewire-core-fix-overlooked-update-of-subsystem-abi.patch [new file with mode: 0644]
queue-6.16/gpiolib-acpi-add-quirk-for-asus-proart-px13.patch [new file with mode: 0644]
queue-6.16/hid-amd_sfh-add-sync-across-amd-sfh-work-functions.patch [new file with mode: 0644]
queue-6.16/hid-cp2112-fix-setter-callbacks-return-value.patch [new file with mode: 0644]
queue-6.16/hid-multitouch-get-the-contact-id-from-hid_dg_transd.patch [new file with mode: 0644]
queue-6.16/hid-multitouch-specify-that-apple-touch-bar-is-direc.patch [new file with mode: 0644]
queue-6.16/hid-multitouch-support-getting-the-tip-state-from-hi.patch [new file with mode: 0644]
queue-6.16/hid-multitouch-take-cls-maxcontacts-into-account-for.patch [new file with mode: 0644]
queue-6.16/i2c-designware-add-quirk-for-intel-xe.patch [new file with mode: 0644]
queue-6.16/ib-mlx5-fix-obj_type-mismatch-for-srq-event-subscrip.patch [new file with mode: 0644]
queue-6.16/mmc-sdhci-cadence-add-mobileye-eyeq-support.patch [new file with mode: 0644]
queue-6.16/net-fec-rename-struct-fec_devinfo-fec_imx6x_info-fec.patch [new file with mode: 0644]
queue-6.16/net-sfp-add-quirk-for-flypro-copper-sfp-module.patch [new file with mode: 0644]
queue-6.16/net-sfp-add-quirk-for-potron-sfp-xgspon-onu-stick.patch [new file with mode: 0644]
queue-6.16/platform-x86-oxpec-add-support-for-onexplayer-x1-min.patch [new file with mode: 0644]
queue-6.16/scsi-ufs-mcq-fix-memory-allocation-checks-for-sqe-an.patch [new file with mode: 0644]
queue-6.16/series [new file with mode: 0644]
queue-6.16/usb-core-add-0x-prefix-to-quirks-debug-output.patch [new file with mode: 0644]
queue-6.6/alsa-usb-audio-add-dsd-support-for-comtrue-usb-audio.patch [new file with mode: 0644]
queue-6.6/alsa-usb-audio-add-mixer-quirk-for-sony-dualsense-ps.patch [new file with mode: 0644]
queue-6.6/alsa-usb-audio-add-mute-tlv-for-playback-volumes-on-.patch [new file with mode: 0644]
queue-6.6/alsa-usb-audio-avoid-multiple-assignments-in-mixer_q.patch [new file with mode: 0644]
queue-6.6/alsa-usb-audio-convert-comma-to-semicolon.patch [new file with mode: 0644]
queue-6.6/alsa-usb-audio-drop-unnecessary-parentheses-in-mixer.patch [new file with mode: 0644]
queue-6.6/alsa-usb-audio-fix-block-comments-in-mixer_quirks.patch [new file with mode: 0644]
queue-6.6/alsa-usb-audio-fix-build-with-config_input-n.patch [new file with mode: 0644]
queue-6.6/alsa-usb-audio-move-mixer_quirks-min_mute-into-commo.patch [new file with mode: 0644]
queue-6.6/alsa-usb-audio-remove-unneeded-wmb-in-mixer_quirks.patch [new file with mode: 0644]
queue-6.6/alsa-usb-audio-simplify-null-comparison-in-mixer_qui.patch [new file with mode: 0644]
queue-6.6/firewire-core-fix-overlooked-update-of-subsystem-abi.patch [new file with mode: 0644]
queue-6.6/hid-multitouch-get-the-contact-id-from-hid_dg_transd.patch [new file with mode: 0644]
queue-6.6/hid-multitouch-specify-that-apple-touch-bar-is-direc.patch [new file with mode: 0644]
queue-6.6/hid-multitouch-support-getting-the-tip-state-from-hi.patch [new file with mode: 0644]
queue-6.6/hid-multitouch-take-cls-maxcontacts-into-account-for.patch [new file with mode: 0644]
queue-6.6/i2c-designware-add-quirk-for-intel-xe.patch [new file with mode: 0644]
queue-6.6/ib-mlx5-fix-obj_type-mismatch-for-srq-event-subscrip.patch [new file with mode: 0644]
queue-6.6/mmc-sdhci-cadence-add-mobileye-eyeq-support.patch [new file with mode: 0644]
queue-6.6/scsi-ufs-mcq-fix-memory-allocation-checks-for-sqe-an.patch [new file with mode: 0644]
queue-6.6/series [new file with mode: 0644]
queue-6.6/usb-core-add-0x-prefix-to-quirks-debug-output.patch [new file with mode: 0644]

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 (file)
index 0000000..8d27719
--- /dev/null
@@ -0,0 +1,321 @@
+From aae7c4a48d7ec0086c5d0b0cd843ca8b039937fa Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 26 May 2025 17:07:48 +0300
+Subject: ALSA: usb-audio: Add mixer quirk for Sony DualSense PS5
+
+From: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+
+[ Upstream commit 79d561c4ec0497669f19a9550cfb74812f60938b ]
+
+The Sony DualSense wireless controller (PS5) features an internal mono
+speaker, but it also provides a 3.5mm jack socket for headphone output
+and headset microphone input.
+
+Since this is a UAC1 device, it doesn't advertise any jack detection
+capability.  However, the controller is able to report HP & MIC insert
+events via HID, i.e. through a dedicated input device managed by the
+hid-playstation driver.
+
+Add a quirk to create the jack controls for headphone and headset mic,
+respectively, and setup an input handler for each of them in order to
+intercept the related hotplug events.
+
+Signed-off-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Link: https://patch.msgid.link/20250526-dualsense-alsa-jack-v1-9-1a821463b632@collabora.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/mixer_quirks.c | 263 +++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 263 insertions(+)
+
+diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
+index 29ef56323a7a2..ec338a85f3ec4 100644
+--- a/sound/usb/mixer_quirks.c
++++ b/sound/usb/mixer_quirks.c
+@@ -16,6 +16,7 @@
+ #include <linux/hid.h>
+ #include <linux/init.h>
++#include <linux/input.h>
+ #include <linux/math64.h>
+ #include <linux/slab.h>
+ #include <linux/usb.h>
+@@ -527,6 +528,263 @@ static int snd_emu0204_controls_create(struct usb_mixer_interface *mixer)
+                                         &snd_emu0204_control, NULL);
+ }
++/*
++ * Sony DualSense controller (PS5) jack detection
++ *
++ * Since this is an UAC 1 device, it doesn't support jack detection.
++ * However, the controller hid-playstation driver reports HP & MIC
++ * insert events through a dedicated input device.
++ */
++
++#define SND_DUALSENSE_JACK_OUT_TERM_ID 3
++#define SND_DUALSENSE_JACK_IN_TERM_ID 4
++
++struct dualsense_mixer_elem_info {
++      struct usb_mixer_elem_info info;
++      struct input_handler ih;
++      struct input_device_id id_table[2];
++      bool connected;
++};
++
++static void snd_dualsense_ih_event(struct input_handle *handle,
++                                 unsigned int type, unsigned int code,
++                                 int value)
++{
++      struct dualsense_mixer_elem_info *mei;
++      struct usb_mixer_elem_list *me;
++
++      if (type != EV_SW)
++              return;
++
++      mei = container_of(handle->handler, struct dualsense_mixer_elem_info, ih);
++      me = &mei->info.head;
++
++      if ((me->id == SND_DUALSENSE_JACK_OUT_TERM_ID && code == SW_HEADPHONE_INSERT) ||
++          (me->id == SND_DUALSENSE_JACK_IN_TERM_ID && code == SW_MICROPHONE_INSERT)) {
++              mei->connected = !!value;
++              snd_ctl_notify(me->mixer->chip->card, SNDRV_CTL_EVENT_MASK_VALUE,
++                             &me->kctl->id);
++      }
++}
++
++static bool snd_dualsense_ih_match(struct input_handler *handler,
++                                 struct input_dev *dev)
++{
++      struct dualsense_mixer_elem_info *mei;
++      struct usb_device *snd_dev;
++      char *input_dev_path, *usb_dev_path;
++      size_t usb_dev_path_len;
++      bool match = false;
++
++      mei = container_of(handler, struct dualsense_mixer_elem_info, ih);
++      snd_dev = mei->info.head.mixer->chip->dev;
++
++      input_dev_path = kobject_get_path(&dev->dev.kobj, GFP_KERNEL);
++      if (!input_dev_path) {
++              dev_warn(&snd_dev->dev, "Failed to get input dev path\n");
++              return false;
++      }
++
++      usb_dev_path = kobject_get_path(&snd_dev->dev.kobj, GFP_KERNEL);
++      if (!usb_dev_path) {
++              dev_warn(&snd_dev->dev, "Failed to get USB dev path\n");
++              goto free_paths;
++      }
++
++      /*
++       * Ensure the VID:PID matched input device supposedly owned by the
++       * hid-playstation driver belongs to the actual hardware handled by
++       * the current USB audio device, which implies input_dev_path being
++       * a subpath of usb_dev_path.
++       *
++       * This verification is necessary when there is more than one identical
++       * controller attached to the host system.
++       */
++      usb_dev_path_len = strlen(usb_dev_path);
++      if (usb_dev_path_len >= strlen(input_dev_path))
++              goto free_paths;
++
++      usb_dev_path[usb_dev_path_len] = '/';
++      match = !memcmp(input_dev_path, usb_dev_path, usb_dev_path_len + 1);
++
++free_paths:
++      kfree(input_dev_path);
++      kfree(usb_dev_path);
++
++      return match;
++}
++
++static int snd_dualsense_ih_connect(struct input_handler *handler,
++                                  struct input_dev *dev,
++                                  const struct input_device_id *id)
++{
++      struct input_handle *handle;
++      int err;
++
++      handle = kzalloc(sizeof(*handle), GFP_KERNEL);
++      if (!handle)
++              return -ENOMEM;
++
++      handle->dev = dev;
++      handle->handler = handler;
++      handle->name = handler->name;
++
++      err = input_register_handle(handle);
++      if (err)
++              goto err_free;
++
++      err = input_open_device(handle);
++      if (err)
++              goto err_unregister;
++
++      return 0;
++
++err_unregister:
++      input_unregister_handle(handle);
++err_free:
++      kfree(handle);
++      return err;
++}
++
++static void snd_dualsense_ih_disconnect(struct input_handle *handle)
++{
++      input_close_device(handle);
++      input_unregister_handle(handle);
++      kfree(handle);
++}
++
++static void snd_dualsense_ih_start(struct input_handle *handle)
++{
++      struct dualsense_mixer_elem_info *mei;
++      struct usb_mixer_elem_list *me;
++      int status = -1;
++
++      mei = container_of(handle->handler, struct dualsense_mixer_elem_info, ih);
++      me = &mei->info.head;
++
++      if (me->id == SND_DUALSENSE_JACK_OUT_TERM_ID &&
++          test_bit(SW_HEADPHONE_INSERT, handle->dev->swbit))
++              status = test_bit(SW_HEADPHONE_INSERT, handle->dev->sw);
++      else if (me->id == SND_DUALSENSE_JACK_IN_TERM_ID &&
++               test_bit(SW_MICROPHONE_INSERT, handle->dev->swbit))
++              status = test_bit(SW_MICROPHONE_INSERT, handle->dev->sw);
++
++      if (status >= 0) {
++              mei->connected = !!status;
++              snd_ctl_notify(me->mixer->chip->card, SNDRV_CTL_EVENT_MASK_VALUE,
++                             &me->kctl->id);
++      }
++}
++
++static int snd_dualsense_jack_get(struct snd_kcontrol *kctl,
++                                struct snd_ctl_elem_value *ucontrol)
++{
++      struct dualsense_mixer_elem_info *mei = snd_kcontrol_chip(kctl);
++
++      ucontrol->value.integer.value[0] = mei->connected;
++
++      return 0;
++}
++
++static const struct snd_kcontrol_new snd_dualsense_jack_control = {
++      .iface = SNDRV_CTL_ELEM_IFACE_CARD,
++      .access = SNDRV_CTL_ELEM_ACCESS_READ,
++      .info = snd_ctl_boolean_mono_info,
++      .get = snd_dualsense_jack_get,
++};
++
++static int snd_dualsense_resume_jack(struct usb_mixer_elem_list *list)
++{
++      snd_ctl_notify(list->mixer->chip->card, SNDRV_CTL_EVENT_MASK_VALUE,
++                     &list->kctl->id);
++      return 0;
++}
++
++static void snd_dualsense_mixer_elem_free(struct snd_kcontrol *kctl)
++{
++      struct dualsense_mixer_elem_info *mei = snd_kcontrol_chip(kctl);
++
++      if (mei->ih.event)
++              input_unregister_handler(&mei->ih);
++
++      snd_usb_mixer_elem_free(kctl);
++}
++
++static int snd_dualsense_jack_create(struct usb_mixer_interface *mixer,
++                                   const char *name, bool is_output)
++{
++      struct dualsense_mixer_elem_info *mei;
++      struct input_device_id *idev_id;
++      struct snd_kcontrol *kctl;
++      int err;
++
++      mei = kzalloc(sizeof(*mei), GFP_KERNEL);
++      if (!mei)
++              return -ENOMEM;
++
++      snd_usb_mixer_elem_init_std(&mei->info.head, mixer,
++                                  is_output ? SND_DUALSENSE_JACK_OUT_TERM_ID :
++                                              SND_DUALSENSE_JACK_IN_TERM_ID);
++
++      mei->info.head.resume = snd_dualsense_resume_jack;
++      mei->info.val_type = USB_MIXER_BOOLEAN;
++      mei->info.channels = 1;
++      mei->info.min = 0;
++      mei->info.max = 1;
++
++      kctl = snd_ctl_new1(&snd_dualsense_jack_control, mei);
++      if (!kctl) {
++              kfree(mei);
++              return -ENOMEM;
++      }
++
++      strscpy(kctl->id.name, name, sizeof(kctl->id.name));
++      kctl->private_free = snd_dualsense_mixer_elem_free;
++
++      err = snd_usb_mixer_add_control(&mei->info.head, kctl);
++      if (err)
++              return err;
++
++      idev_id = &mei->id_table[0];
++      idev_id->flags = INPUT_DEVICE_ID_MATCH_VENDOR | INPUT_DEVICE_ID_MATCH_PRODUCT |
++                       INPUT_DEVICE_ID_MATCH_EVBIT | INPUT_DEVICE_ID_MATCH_SWBIT;
++      idev_id->vendor = USB_ID_VENDOR(mixer->chip->usb_id);
++      idev_id->product = USB_ID_PRODUCT(mixer->chip->usb_id);
++      idev_id->evbit[BIT_WORD(EV_SW)] = BIT_MASK(EV_SW);
++      if (is_output)
++              idev_id->swbit[BIT_WORD(SW_HEADPHONE_INSERT)] = BIT_MASK(SW_HEADPHONE_INSERT);
++      else
++              idev_id->swbit[BIT_WORD(SW_MICROPHONE_INSERT)] = BIT_MASK(SW_MICROPHONE_INSERT);
++
++      mei->ih.event = snd_dualsense_ih_event;
++      mei->ih.match = snd_dualsense_ih_match;
++      mei->ih.connect = snd_dualsense_ih_connect,
++      mei->ih.disconnect = snd_dualsense_ih_disconnect,
++      mei->ih.start = snd_dualsense_ih_start,
++      mei->ih.name = name;
++      mei->ih.id_table = mei->id_table;
++
++      err = input_register_handler(&mei->ih);
++      if (err) {
++              dev_warn(&mixer->chip->dev->dev,
++                       "Could not register input handler: %d\n", err);
++              mei->ih.event = NULL;
++      }
++
++      return 0;
++}
++
++static int snd_dualsense_controls_create(struct usb_mixer_interface *mixer)
++{
++      int err;
++
++      err = snd_dualsense_jack_create(mixer, "Headphone Jack", true);
++      if (err < 0)
++              return err;
++
++      return snd_dualsense_jack_create(mixer, "Headset Mic Jack", false);
++}
++
+ /* ASUS Xonar U1 / U3 controls */
+ static int snd_xonar_u1_switch_get(struct snd_kcontrol *kcontrol,
+@@ -3130,6 +3388,11 @@ int snd_usb_mixer_apply_create_quirk(struct usb_mixer_interface *mixer)
+               err = snd_emu0204_controls_create(mixer);
+               break;
++      case USB_ID(0x054c, 0x0ce6): /* Sony DualSense controller (PS5) */
++      case USB_ID(0x054c, 0x0df2): /* Sony DualSense Edge controller (PS5) */
++              err = snd_dualsense_controls_create(mixer);
++              break;
++
+       case USB_ID(0x0763, 0x2030): /* M-Audio Fast Track C400 */
+       case USB_ID(0x0763, 0x2031): /* M-Audio Fast Track C400 */
+               err = snd_c400_create_mixer(mixer);
+-- 
+2.51.0
+
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 (file)
index 0000000..e9889a9
--- /dev/null
@@ -0,0 +1,38 @@
+From 2ebef1c6f533eec70e0322bf794d211d4436903d Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 26 May 2025 17:07:45 +0300
+Subject: ALSA: usb-audio: Avoid multiple assignments in mixer_quirks
+
+From: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+
+[ Upstream commit 03ddd3bdb94df3edb1f2408b57cfb00b3d92a208 ]
+
+Handle report from checkpatch.pl:
+
+  CHECK: multiple assignments should be avoided
+
+Signed-off-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Link: https://patch.msgid.link/20250526-dualsense-alsa-jack-v1-6-1a821463b632@collabora.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/mixer_quirks.c | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
+index 8a84e89890772..715b0922243c1 100644
+--- a/sound/usb/mixer_quirks.c
++++ b/sound/usb/mixer_quirks.c
+@@ -1593,7 +1593,8 @@ static int snd_microii_spdif_default_put(struct snd_kcontrol *kcontrol,
+       unsigned int pval, pval_old;
+       int err;
+-      pval = pval_old = kcontrol->private_value;
++      pval = kcontrol->private_value;
++      pval_old = pval;
+       pval &= 0xfffff0f0;
+       pval |= (ucontrol->value.iec958.status[1] & 0x0f) << 8;
+       pval |= (ucontrol->value.iec958.status[0] & 0x0f);
+-- 
+2.51.0
+
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 (file)
index 0000000..e4a6a99
--- /dev/null
@@ -0,0 +1,49 @@
+From 6006635713f5f390520b3cd45d2a08019562c6d6 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 12 Jun 2025 14:02:28 +0800
+Subject: ALSA: usb-audio: Convert comma to semicolon
+
+From: Chen Ni <nichen@iscas.ac.cn>
+
+[ Upstream commit 9ca30a1b007d5fefb5752428f852a2d8d7219c1c ]
+
+Replace comma between expressions with semicolons.
+
+Using a ',' in place of a ';' can have unintended side effects.
+Although that is not the case here, it is seems best to use ';'
+unless ',' is intended.
+
+Found by inspection.
+No functional change intended.
+Compile tested only.
+
+Fixes: 79d561c4ec04 ("ALSA: usb-audio: Add mixer quirk for Sony DualSense PS5")
+Signed-off-by: Chen Ni <nichen@iscas.ac.cn>
+Reviewed-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+Link: https://patch.msgid.link/20250612060228.1518028-1-nichen@iscas.ac.cn
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/mixer_quirks.c | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
+index ec338a85f3ec4..b3afa7b26b9cd 100644
+--- a/sound/usb/mixer_quirks.c
++++ b/sound/usb/mixer_quirks.c
+@@ -758,9 +758,9 @@ static int snd_dualsense_jack_create(struct usb_mixer_interface *mixer,
+       mei->ih.event = snd_dualsense_ih_event;
+       mei->ih.match = snd_dualsense_ih_match;
+-      mei->ih.connect = snd_dualsense_ih_connect,
+-      mei->ih.disconnect = snd_dualsense_ih_disconnect,
+-      mei->ih.start = snd_dualsense_ih_start,
++      mei->ih.connect = snd_dualsense_ih_connect;
++      mei->ih.disconnect = snd_dualsense_ih_disconnect;
++      mei->ih.start = snd_dualsense_ih_start;
+       mei->ih.name = name;
+       mei->ih.id_table = mei->id_table;
+-- 
+2.51.0
+
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 (file)
index 0000000..5952e60
--- /dev/null
@@ -0,0 +1,49 @@
+From bb184cf188384db8adb08b80725688e5c20866b2 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 26 May 2025 17:07:44 +0300
+Subject: ALSA: usb-audio: Drop unnecessary parentheses in mixer_quirks
+
+From: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+
+[ Upstream commit c0495cef8b43ad61efbd4019e3573742e0e63c67 ]
+
+Fix multiple 'CHECK: Unnecessary parentheses around ...' reports from
+checkpatch.pl.
+
+Signed-off-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Link: https://patch.msgid.link/20250526-dualsense-alsa-jack-v1-5-1a821463b632@collabora.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/mixer_quirks.c | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
+index 14b0a91c19d34..8a84e89890772 100644
+--- a/sound/usb/mixer_quirks.c
++++ b/sound/usb/mixer_quirks.c
+@@ -376,10 +376,10 @@ static int snd_audigy2nx_controls_create(struct usb_mixer_interface *mixer)
+               struct snd_kcontrol_new knew;
+               /* USB X-Fi S51 doesn't have a CMSS LED */
+-              if ((mixer->chip->usb_id == USB_ID(0x041e, 0x3042)) && i == 0)
++              if (mixer->chip->usb_id == USB_ID(0x041e, 0x3042) && i == 0)
+                       continue;
+               /* USB X-Fi S51 Pro doesn't have one either */
+-              if ((mixer->chip->usb_id == USB_ID(0x041e, 0x30df)) && i == 0)
++              if (mixer->chip->usb_id == USB_ID(0x041e, 0x30df) && i == 0)
+                       continue;
+               if (i > 1 && /* Live24ext has 2 LEDs only */
+                       (mixer->chip->usb_id == USB_ID(0x041e, 0x3040) ||
+@@ -3012,7 +3012,7 @@ static int snd_djm_controls_update(struct usb_mixer_interface *mixer,
+       int err;
+       const struct snd_djm_device *device = &snd_djm_devices[device_idx];
+-      if ((group >= device->ncontrols) || value >= device->controls[group].noptions)
++      if (group >= device->ncontrols || value >= device->controls[group].noptions)
+               return -EINVAL;
+       err = snd_usb_lock_shutdown(mixer->chip);
+-- 
+2.51.0
+
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 (file)
index 0000000..751ced0
--- /dev/null
@@ -0,0 +1,49 @@
+From 9c97f4c5d9d4f471f95b7e82fb7e15fd73a467c1 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 26 May 2025 17:07:43 +0300
+Subject: ALSA: usb-audio: Fix block comments in mixer_quirks
+
+From: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+
+[ Upstream commit 231225d8a20f8668b4fd6601d54a2fac0e0ab7a5 ]
+
+Address a couple of comment formatting issues indicated by
+checkpatch.pl:
+
+  WARNING: Block comments use a trailing */ on a separate line
+
+Signed-off-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Link: https://patch.msgid.link/20250526-dualsense-alsa-jack-v1-4-1a821463b632@collabora.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/mixer_quirks.c | 6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
+
+diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
+index 866b5470f84bd..14b0a91c19d34 100644
+--- a/sound/usb/mixer_quirks.c
++++ b/sound/usb/mixer_quirks.c
+@@ -76,7 +76,8 @@ static int snd_create_std_mono_ctl_offset(struct usb_mixer_interface *mixer,
+       cval->idx_off = idx_off;
+       /* get_min_max() is called only for integer volumes later,
+-       * so provide a short-cut for booleans */
++       * so provide a short-cut for booleans
++       */
+       cval->min = 0;
+       cval->max = 1;
+       cval->res = 0;
+@@ -3267,7 +3268,8 @@ static void snd_dragonfly_quirk_db_scale(struct usb_mixer_interface *mixer,
+                                        struct snd_kcontrol *kctl)
+ {
+       /* Approximation using 10 ranges based on output measurement on hw v1.2.
+-       * This seems close to the cubic mapping e.g. alsamixer uses. */
++       * This seems close to the cubic mapping e.g. alsamixer uses.
++       */
+       static const DECLARE_TLV_DB_RANGE(scale,
+                0,  1, TLV_DB_MINMAX_ITEM(-5300, -4970),
+                2,  5, TLV_DB_MINMAX_ITEM(-4710, -4160),
+-- 
+2.51.0
+
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 (file)
index 0000000..171ce13
--- /dev/null
@@ -0,0 +1,61 @@
+From 82ea2e8dbf99058ffb3fbe7176aa07ef135ec718 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 13 Jun 2025 10:15:30 +0200
+Subject: ALSA: usb-audio: Fix build with CONFIG_INPUT=n
+
+From: Takashi Iwai <tiwai@suse.de>
+
+[ Upstream commit d0630a0b80c08530857146e3bf183a7d6b743847 ]
+
+The recent addition of DualSense mixer quirk relies on the input
+device handle, and the build can fail if CONFIG_INPUT isn't set.
+Put (rather ugly) workarounds to wrap with IS_REACHABLE() for avoiding
+the build error.
+
+Fixes: 79d561c4ec04 ("ALSA: usb-audio: Add mixer quirk for Sony DualSense PS5")
+Reported-by: kernel test robot <lkp@intel.com>
+Closes: https://lore.kernel.org/oe-kbuild-all/202506130733.gnPKw2l3-lkp@intel.com/
+Reviewed-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+Link: https://patch.msgid.link/20250613081543.7404-1-tiwai@suse.de
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/mixer_quirks.c | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
+index b3afa7b26b9cd..7a4d449182d65 100644
+--- a/sound/usb/mixer_quirks.c
++++ b/sound/usb/mixer_quirks.c
+@@ -528,6 +528,7 @@ static int snd_emu0204_controls_create(struct usb_mixer_interface *mixer)
+                                         &snd_emu0204_control, NULL);
+ }
++#if IS_REACHABLE(CONFIG_INPUT)
+ /*
+  * Sony DualSense controller (PS5) jack detection
+  *
+@@ -784,6 +785,7 @@ static int snd_dualsense_controls_create(struct usb_mixer_interface *mixer)
+       return snd_dualsense_jack_create(mixer, "Headset Mic Jack", false);
+ }
++#endif /* IS_REACHABLE(CONFIG_INPUT) */
+ /* ASUS Xonar U1 / U3 controls */
+@@ -3388,10 +3390,12 @@ int snd_usb_mixer_apply_create_quirk(struct usb_mixer_interface *mixer)
+               err = snd_emu0204_controls_create(mixer);
+               break;
++#if IS_REACHABLE(CONFIG_INPUT)
+       case USB_ID(0x054c, 0x0ce6): /* Sony DualSense controller (PS5) */
+       case USB_ID(0x054c, 0x0df2): /* Sony DualSense Edge controller (PS5) */
+               err = snd_dualsense_controls_create(mixer);
+               break;
++#endif /* IS_REACHABLE(CONFIG_INPUT) */
+       case USB_ID(0x0763, 0x2030): /* M-Audio Fast Track C400 */
+       case USB_ID(0x0763, 0x2031): /* M-Audio Fast Track C400 */
+-- 
+2.51.0
+
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 (file)
index 0000000..8f04a3f
--- /dev/null
@@ -0,0 +1,46 @@
+From f253476ca1dd3adb48f94816681f306eff7409dc Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 26 May 2025 17:07:47 +0300
+Subject: ALSA: usb-audio: Remove unneeded wmb() in mixer_quirks
+
+From: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+
+[ Upstream commit 9cea7425595697802e8d55a322a251999554b8b1 ]
+
+Adding a memory barrier before wake_up() in
+snd_usb_soundblaster_remote_complete() is supposed to ensure the write
+to mixer->rc_code is visible in wait_event_interruptible() from
+snd_usb_sbrc_hwdep_read().
+
+However, this is not really necessary, since wake_up() is just a wrapper
+over __wake_up() which already executes a full memory barrier before
+accessing the state of the task to be waken up.
+
+Drop the redundant call to wmb() and implicitly fix the checkpatch
+complaint:
+
+  WARNING: memory barrier without comment
+
+Signed-off-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Link: https://patch.msgid.link/20250526-dualsense-alsa-jack-v1-8-1a821463b632@collabora.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/mixer_quirks.c | 1 -
+ 1 file changed, 1 deletion(-)
+
+diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
+index 9243094cc0637..29ef56323a7a2 100644
+--- a/sound/usb/mixer_quirks.c
++++ b/sound/usb/mixer_quirks.c
+@@ -208,7 +208,6 @@ static void snd_usb_soundblaster_remote_complete(struct urb *urb)
+       if (code == rc->mute_code)
+               snd_usb_mixer_notify_id(mixer, rc->mute_mixer_id);
+       mixer->rc_code = code;
+-      wmb();
+       wake_up(&mixer->rc_waitq);
+ }
+-- 
+2.51.0
+
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 (file)
index 0000000..b743679
--- /dev/null
@@ -0,0 +1,37 @@
+From 6ce582331bc9e2977da2c43540a3a3b721c39ea4 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 26 May 2025 17:07:46 +0300
+Subject: ALSA: usb-audio: Simplify NULL comparison in mixer_quirks
+
+From: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+
+[ Upstream commit f2d6d660e8fd5f4467e80743f82119201e67fa9c ]
+
+Handle report from checkpatch.pl:
+
+  CHECK: Comparison to NULL could be written "t->name"
+
+Signed-off-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Link: https://patch.msgid.link/20250526-dualsense-alsa-jack-v1-7-1a821463b632@collabora.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/mixer_quirks.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
+index 715b0922243c1..9243094cc0637 100644
+--- a/sound/usb/mixer_quirks.c
++++ b/sound/usb/mixer_quirks.c
+@@ -126,7 +126,7 @@ static int snd_create_std_mono_table(struct usb_mixer_interface *mixer,
+ {
+       int err;
+-      while (t->name != NULL) {
++      while (t->name) {
+               err = snd_create_std_mono_ctl(mixer, t->unitid, t->control,
+                               t->cmask, t->val_type, t->name, t->tlv_callback);
+               if (err < 0)
+-- 
+2.51.0
+
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 (file)
index 0000000..6c5c683
--- /dev/null
@@ -0,0 +1,39 @@
+From 8c5093e9e68a59ea8a60ff2fc602fad3ec5b50a0 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sat, 20 Sep 2025 11:51:48 +0900
+Subject: firewire: core: fix overlooked update of subsystem ABI version
+
+From: Takashi Sakamoto <o-takashi@sakamocchi.jp>
+
+[ Upstream commit 853a57ba263adfecf4430b936d6862bc475b4bb5 ]
+
+In kernel v6.5, several functions were added to the cdev layer. This
+required updating the default version of subsystem ABI up to 6, but
+this requirement was overlooked.
+
+This commit updates the version accordingly.
+
+Fixes: 6add87e9764d ("firewire: cdev: add new version of ABI to notify time stamp at request/response subaction of transaction#")
+Link: https://lore.kernel.org/r/20250920025148.163402-1-o-takashi@sakamocchi.jp
+Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/firewire/core-cdev.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/firewire/core-cdev.c b/drivers/firewire/core-cdev.c
+index 16ea847ade5fd..3ca9d1c38fef8 100644
+--- a/drivers/firewire/core-cdev.c
++++ b/drivers/firewire/core-cdev.c
+@@ -38,7 +38,7 @@
+ /*
+  * ABI version history is documented in linux/firewire-cdev.h.
+  */
+-#define FW_CDEV_KERNEL_VERSION                        5
++#define FW_CDEV_KERNEL_VERSION                        6
+ #define FW_CDEV_VERSION_EVENT_REQUEST2                4
+ #define FW_CDEV_VERSION_ALLOCATE_REGION_END   4
+ #define FW_CDEV_VERSION_AUTO_FLUSH_ISO_OVERFLOW       5
+-- 
+2.51.0
+
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 (file)
index 0000000..c380f3a
--- /dev/null
@@ -0,0 +1,50 @@
+From b38fcefa59785767651c8315e4a4096026933874 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 13 Aug 2025 15:43:20 +0300
+Subject: IB/mlx5: Fix obj_type mismatch for SRQ event subscriptions
+
+From: Or Har-Toov <ohartoov@nvidia.com>
+
+[ Upstream commit 85fe9f565d2d5af95ac2bbaa5082b8ce62b039f5 ]
+
+Fix a bug where the driver's event subscription logic for SRQ-related
+events incorrectly sets obj_type for RMP objects.
+
+When subscribing to SRQ events, get_legacy_obj_type() did not handle
+the MLX5_CMD_OP_CREATE_RMP case, which caused obj_type to be 0
+(default).
+This led to a mismatch between the obj_type used during subscription
+(0) and the value used during notification (1, taken from the event's
+type field). As a result, event mapping for SRQ objects could fail and
+event notification would not be delivered correctly.
+
+This fix adds handling for MLX5_CMD_OP_CREATE_RMP in get_legacy_obj_type,
+returning MLX5_EVENT_QUEUE_TYPE_RQ so obj_type is consistent between
+subscription and notification.
+
+Fixes: 759738537142 ("IB/mlx5: Enable subscription for device events over DEVX")
+Link: https://patch.msgid.link/r/8f1048e3fdd1fde6b90607ce0ed251afaf8a148c.1755088962.git.leon@kernel.org
+Signed-off-by: Or Har-Toov <ohartoov@nvidia.com>
+Reviewed-by: Edward Srouji <edwards@nvidia.com>
+Signed-off-by: Leon Romanovsky <leonro@nvidia.com>
+Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/infiniband/hw/mlx5/devx.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/drivers/infiniband/hw/mlx5/devx.c b/drivers/infiniband/hw/mlx5/devx.c
+index 301c061bb3190..679d85db26f4f 100644
+--- a/drivers/infiniband/hw/mlx5/devx.c
++++ b/drivers/infiniband/hw/mlx5/devx.c
+@@ -194,6 +194,7 @@ static u16 get_legacy_obj_type(u16 opcode)
+ {
+       switch (opcode) {
+       case MLX5_CMD_OP_CREATE_RQ:
++      case MLX5_CMD_OP_CREATE_RMP:
+               return MLX5_EVENT_QUEUE_TYPE_RQ;
+       case MLX5_CMD_OP_CREATE_QP:
+               return MLX5_EVENT_QUEUE_TYPE_QP;
+-- 
+2.51.0
+
index e16eca41d124046eca827de8ae52a2b2b56a367f..0add3a6fd88535d7ab34dc2f15a4f741ecf32305 100644 (file)
@@ -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 (file)
index 0000000..dd2c172
--- /dev/null
@@ -0,0 +1,36 @@
+From d9c9d67082d57f7be3052736a2c04d2cfde2b019 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 3 Jun 2025 15:10:45 +0800
+Subject: usb: core: Add 0x prefix to quirks debug output
+
+From: Jiayi Li <lijiayi@kylinos.cn>
+
+[ Upstream commit 47c428fce0b41b15ab321d8ede871f780ccd038f ]
+
+Use "0x%x" format for quirks debug print to clarify it's a hexadecimal
+value. Improves readability and consistency with other hex outputs.
+
+Signed-off-by: Jiayi Li <lijiayi@kylinos.cn>
+Link: https://lore.kernel.org/r/20250603071045.3243699-1-lijiayi@kylinos.cn
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/usb/core/quirks.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/usb/core/quirks.c b/drivers/usb/core/quirks.c
+index f5894cb166867..55efefc5d702a 100644
+--- a/drivers/usb/core/quirks.c
++++ b/drivers/usb/core/quirks.c
+@@ -728,7 +728,7 @@ void usb_detect_quirks(struct usb_device *udev)
+       udev->quirks ^= usb_detect_dynamic_quirks(udev);
+       if (udev->quirks)
+-              dev_dbg(&udev->dev, "USB quirks for this device: %x\n",
++              dev_dbg(&udev->dev, "USB quirks for this device: 0x%x\n",
+                       udev->quirks);
+ #ifdef CONFIG_USB_DEFAULT_PERSIST
+-- 
+2.51.0
+
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 (file)
index 0000000..1c4d27e
--- /dev/null
@@ -0,0 +1,321 @@
+From 12fb8832c10c265d2b1dea59ecfeda0eb4cf3d66 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 26 May 2025 17:07:48 +0300
+Subject: ALSA: usb-audio: Add mixer quirk for Sony DualSense PS5
+
+From: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+
+[ Upstream commit 79d561c4ec0497669f19a9550cfb74812f60938b ]
+
+The Sony DualSense wireless controller (PS5) features an internal mono
+speaker, but it also provides a 3.5mm jack socket for headphone output
+and headset microphone input.
+
+Since this is a UAC1 device, it doesn't advertise any jack detection
+capability.  However, the controller is able to report HP & MIC insert
+events via HID, i.e. through a dedicated input device managed by the
+hid-playstation driver.
+
+Add a quirk to create the jack controls for headphone and headset mic,
+respectively, and setup an input handler for each of them in order to
+intercept the related hotplug events.
+
+Signed-off-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Link: https://patch.msgid.link/20250526-dualsense-alsa-jack-v1-9-1a821463b632@collabora.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/mixer_quirks.c | 263 +++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 263 insertions(+)
+
+diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
+index d50cd771356f8..fc62ad4c8ef11 100644
+--- a/sound/usb/mixer_quirks.c
++++ b/sound/usb/mixer_quirks.c
+@@ -16,6 +16,7 @@
+ #include <linux/hid.h>
+ #include <linux/init.h>
++#include <linux/input.h>
+ #include <linux/math64.h>
+ #include <linux/slab.h>
+ #include <linux/usb.h>
+@@ -527,6 +528,263 @@ static int snd_emu0204_controls_create(struct usb_mixer_interface *mixer)
+                                         &snd_emu0204_control, NULL);
+ }
++/*
++ * Sony DualSense controller (PS5) jack detection
++ *
++ * Since this is an UAC 1 device, it doesn't support jack detection.
++ * However, the controller hid-playstation driver reports HP & MIC
++ * insert events through a dedicated input device.
++ */
++
++#define SND_DUALSENSE_JACK_OUT_TERM_ID 3
++#define SND_DUALSENSE_JACK_IN_TERM_ID 4
++
++struct dualsense_mixer_elem_info {
++      struct usb_mixer_elem_info info;
++      struct input_handler ih;
++      struct input_device_id id_table[2];
++      bool connected;
++};
++
++static void snd_dualsense_ih_event(struct input_handle *handle,
++                                 unsigned int type, unsigned int code,
++                                 int value)
++{
++      struct dualsense_mixer_elem_info *mei;
++      struct usb_mixer_elem_list *me;
++
++      if (type != EV_SW)
++              return;
++
++      mei = container_of(handle->handler, struct dualsense_mixer_elem_info, ih);
++      me = &mei->info.head;
++
++      if ((me->id == SND_DUALSENSE_JACK_OUT_TERM_ID && code == SW_HEADPHONE_INSERT) ||
++          (me->id == SND_DUALSENSE_JACK_IN_TERM_ID && code == SW_MICROPHONE_INSERT)) {
++              mei->connected = !!value;
++              snd_ctl_notify(me->mixer->chip->card, SNDRV_CTL_EVENT_MASK_VALUE,
++                             &me->kctl->id);
++      }
++}
++
++static bool snd_dualsense_ih_match(struct input_handler *handler,
++                                 struct input_dev *dev)
++{
++      struct dualsense_mixer_elem_info *mei;
++      struct usb_device *snd_dev;
++      char *input_dev_path, *usb_dev_path;
++      size_t usb_dev_path_len;
++      bool match = false;
++
++      mei = container_of(handler, struct dualsense_mixer_elem_info, ih);
++      snd_dev = mei->info.head.mixer->chip->dev;
++
++      input_dev_path = kobject_get_path(&dev->dev.kobj, GFP_KERNEL);
++      if (!input_dev_path) {
++              dev_warn(&snd_dev->dev, "Failed to get input dev path\n");
++              return false;
++      }
++
++      usb_dev_path = kobject_get_path(&snd_dev->dev.kobj, GFP_KERNEL);
++      if (!usb_dev_path) {
++              dev_warn(&snd_dev->dev, "Failed to get USB dev path\n");
++              goto free_paths;
++      }
++
++      /*
++       * Ensure the VID:PID matched input device supposedly owned by the
++       * hid-playstation driver belongs to the actual hardware handled by
++       * the current USB audio device, which implies input_dev_path being
++       * a subpath of usb_dev_path.
++       *
++       * This verification is necessary when there is more than one identical
++       * controller attached to the host system.
++       */
++      usb_dev_path_len = strlen(usb_dev_path);
++      if (usb_dev_path_len >= strlen(input_dev_path))
++              goto free_paths;
++
++      usb_dev_path[usb_dev_path_len] = '/';
++      match = !memcmp(input_dev_path, usb_dev_path, usb_dev_path_len + 1);
++
++free_paths:
++      kfree(input_dev_path);
++      kfree(usb_dev_path);
++
++      return match;
++}
++
++static int snd_dualsense_ih_connect(struct input_handler *handler,
++                                  struct input_dev *dev,
++                                  const struct input_device_id *id)
++{
++      struct input_handle *handle;
++      int err;
++
++      handle = kzalloc(sizeof(*handle), GFP_KERNEL);
++      if (!handle)
++              return -ENOMEM;
++
++      handle->dev = dev;
++      handle->handler = handler;
++      handle->name = handler->name;
++
++      err = input_register_handle(handle);
++      if (err)
++              goto err_free;
++
++      err = input_open_device(handle);
++      if (err)
++              goto err_unregister;
++
++      return 0;
++
++err_unregister:
++      input_unregister_handle(handle);
++err_free:
++      kfree(handle);
++      return err;
++}
++
++static void snd_dualsense_ih_disconnect(struct input_handle *handle)
++{
++      input_close_device(handle);
++      input_unregister_handle(handle);
++      kfree(handle);
++}
++
++static void snd_dualsense_ih_start(struct input_handle *handle)
++{
++      struct dualsense_mixer_elem_info *mei;
++      struct usb_mixer_elem_list *me;
++      int status = -1;
++
++      mei = container_of(handle->handler, struct dualsense_mixer_elem_info, ih);
++      me = &mei->info.head;
++
++      if (me->id == SND_DUALSENSE_JACK_OUT_TERM_ID &&
++          test_bit(SW_HEADPHONE_INSERT, handle->dev->swbit))
++              status = test_bit(SW_HEADPHONE_INSERT, handle->dev->sw);
++      else if (me->id == SND_DUALSENSE_JACK_IN_TERM_ID &&
++               test_bit(SW_MICROPHONE_INSERT, handle->dev->swbit))
++              status = test_bit(SW_MICROPHONE_INSERT, handle->dev->sw);
++
++      if (status >= 0) {
++              mei->connected = !!status;
++              snd_ctl_notify(me->mixer->chip->card, SNDRV_CTL_EVENT_MASK_VALUE,
++                             &me->kctl->id);
++      }
++}
++
++static int snd_dualsense_jack_get(struct snd_kcontrol *kctl,
++                                struct snd_ctl_elem_value *ucontrol)
++{
++      struct dualsense_mixer_elem_info *mei = snd_kcontrol_chip(kctl);
++
++      ucontrol->value.integer.value[0] = mei->connected;
++
++      return 0;
++}
++
++static const struct snd_kcontrol_new snd_dualsense_jack_control = {
++      .iface = SNDRV_CTL_ELEM_IFACE_CARD,
++      .access = SNDRV_CTL_ELEM_ACCESS_READ,
++      .info = snd_ctl_boolean_mono_info,
++      .get = snd_dualsense_jack_get,
++};
++
++static int snd_dualsense_resume_jack(struct usb_mixer_elem_list *list)
++{
++      snd_ctl_notify(list->mixer->chip->card, SNDRV_CTL_EVENT_MASK_VALUE,
++                     &list->kctl->id);
++      return 0;
++}
++
++static void snd_dualsense_mixer_elem_free(struct snd_kcontrol *kctl)
++{
++      struct dualsense_mixer_elem_info *mei = snd_kcontrol_chip(kctl);
++
++      if (mei->ih.event)
++              input_unregister_handler(&mei->ih);
++
++      snd_usb_mixer_elem_free(kctl);
++}
++
++static int snd_dualsense_jack_create(struct usb_mixer_interface *mixer,
++                                   const char *name, bool is_output)
++{
++      struct dualsense_mixer_elem_info *mei;
++      struct input_device_id *idev_id;
++      struct snd_kcontrol *kctl;
++      int err;
++
++      mei = kzalloc(sizeof(*mei), GFP_KERNEL);
++      if (!mei)
++              return -ENOMEM;
++
++      snd_usb_mixer_elem_init_std(&mei->info.head, mixer,
++                                  is_output ? SND_DUALSENSE_JACK_OUT_TERM_ID :
++                                              SND_DUALSENSE_JACK_IN_TERM_ID);
++
++      mei->info.head.resume = snd_dualsense_resume_jack;
++      mei->info.val_type = USB_MIXER_BOOLEAN;
++      mei->info.channels = 1;
++      mei->info.min = 0;
++      mei->info.max = 1;
++
++      kctl = snd_ctl_new1(&snd_dualsense_jack_control, mei);
++      if (!kctl) {
++              kfree(mei);
++              return -ENOMEM;
++      }
++
++      strscpy(kctl->id.name, name, sizeof(kctl->id.name));
++      kctl->private_free = snd_dualsense_mixer_elem_free;
++
++      err = snd_usb_mixer_add_control(&mei->info.head, kctl);
++      if (err)
++              return err;
++
++      idev_id = &mei->id_table[0];
++      idev_id->flags = INPUT_DEVICE_ID_MATCH_VENDOR | INPUT_DEVICE_ID_MATCH_PRODUCT |
++                       INPUT_DEVICE_ID_MATCH_EVBIT | INPUT_DEVICE_ID_MATCH_SWBIT;
++      idev_id->vendor = USB_ID_VENDOR(mixer->chip->usb_id);
++      idev_id->product = USB_ID_PRODUCT(mixer->chip->usb_id);
++      idev_id->evbit[BIT_WORD(EV_SW)] = BIT_MASK(EV_SW);
++      if (is_output)
++              idev_id->swbit[BIT_WORD(SW_HEADPHONE_INSERT)] = BIT_MASK(SW_HEADPHONE_INSERT);
++      else
++              idev_id->swbit[BIT_WORD(SW_MICROPHONE_INSERT)] = BIT_MASK(SW_MICROPHONE_INSERT);
++
++      mei->ih.event = snd_dualsense_ih_event;
++      mei->ih.match = snd_dualsense_ih_match;
++      mei->ih.connect = snd_dualsense_ih_connect,
++      mei->ih.disconnect = snd_dualsense_ih_disconnect,
++      mei->ih.start = snd_dualsense_ih_start,
++      mei->ih.name = name;
++      mei->ih.id_table = mei->id_table;
++
++      err = input_register_handler(&mei->ih);
++      if (err) {
++              dev_warn(&mixer->chip->dev->dev,
++                       "Could not register input handler: %d\n", err);
++              mei->ih.event = NULL;
++      }
++
++      return 0;
++}
++
++static int snd_dualsense_controls_create(struct usb_mixer_interface *mixer)
++{
++      int err;
++
++      err = snd_dualsense_jack_create(mixer, "Headphone Jack", true);
++      if (err < 0)
++              return err;
++
++      return snd_dualsense_jack_create(mixer, "Headset Mic Jack", false);
++}
++
+ /* ASUS Xonar U1 / U3 controls */
+ static int snd_xonar_u1_switch_get(struct snd_kcontrol *kcontrol,
+@@ -3372,6 +3630,11 @@ int snd_usb_mixer_apply_create_quirk(struct usb_mixer_interface *mixer)
+               err = snd_emu0204_controls_create(mixer);
+               break;
++      case USB_ID(0x054c, 0x0ce6): /* Sony DualSense controller (PS5) */
++      case USB_ID(0x054c, 0x0df2): /* Sony DualSense Edge controller (PS5) */
++              err = snd_dualsense_controls_create(mixer);
++              break;
++
+       case USB_ID(0x0763, 0x2030): /* M-Audio Fast Track C400 */
+       case USB_ID(0x0763, 0x2031): /* M-Audio Fast Track C400 */
+               err = snd_c400_create_mixer(mixer);
+-- 
+2.51.0
+
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 (file)
index 0000000..8fbfd9f
--- /dev/null
@@ -0,0 +1,38 @@
+From 8384af7d46a666fb0b1143d8e4ceea30a082b3f7 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 26 May 2025 17:07:45 +0300
+Subject: ALSA: usb-audio: Avoid multiple assignments in mixer_quirks
+
+From: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+
+[ Upstream commit 03ddd3bdb94df3edb1f2408b57cfb00b3d92a208 ]
+
+Handle report from checkpatch.pl:
+
+  CHECK: multiple assignments should be avoided
+
+Signed-off-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Link: https://patch.msgid.link/20250526-dualsense-alsa-jack-v1-6-1a821463b632@collabora.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/mixer_quirks.c | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
+index 866d309454aa3..4ab57ef56330d 100644
+--- a/sound/usb/mixer_quirks.c
++++ b/sound/usb/mixer_quirks.c
+@@ -1734,7 +1734,8 @@ static int snd_microii_spdif_default_put(struct snd_kcontrol *kcontrol,
+       unsigned int pval, pval_old;
+       int err;
+-      pval = pval_old = kcontrol->private_value;
++      pval = kcontrol->private_value;
++      pval_old = pval;
+       pval &= 0xfffff0f0;
+       pval |= (ucontrol->value.iec958.status[1] & 0x0f) << 8;
+       pval |= (ucontrol->value.iec958.status[0] & 0x0f);
+-- 
+2.51.0
+
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 (file)
index 0000000..8b8f46a
--- /dev/null
@@ -0,0 +1,49 @@
+From f3052688acdc59fc9d118721d033519f711b7fe8 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 12 Jun 2025 14:02:28 +0800
+Subject: ALSA: usb-audio: Convert comma to semicolon
+
+From: Chen Ni <nichen@iscas.ac.cn>
+
+[ Upstream commit 9ca30a1b007d5fefb5752428f852a2d8d7219c1c ]
+
+Replace comma between expressions with semicolons.
+
+Using a ',' in place of a ';' can have unintended side effects.
+Although that is not the case here, it is seems best to use ';'
+unless ',' is intended.
+
+Found by inspection.
+No functional change intended.
+Compile tested only.
+
+Fixes: 79d561c4ec04 ("ALSA: usb-audio: Add mixer quirk for Sony DualSense PS5")
+Signed-off-by: Chen Ni <nichen@iscas.ac.cn>
+Reviewed-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+Link: https://patch.msgid.link/20250612060228.1518028-1-nichen@iscas.ac.cn
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/mixer_quirks.c | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
+index fc62ad4c8ef11..9b59d90ab8ca5 100644
+--- a/sound/usb/mixer_quirks.c
++++ b/sound/usb/mixer_quirks.c
+@@ -758,9 +758,9 @@ static int snd_dualsense_jack_create(struct usb_mixer_interface *mixer,
+       mei->ih.event = snd_dualsense_ih_event;
+       mei->ih.match = snd_dualsense_ih_match;
+-      mei->ih.connect = snd_dualsense_ih_connect,
+-      mei->ih.disconnect = snd_dualsense_ih_disconnect,
+-      mei->ih.start = snd_dualsense_ih_start,
++      mei->ih.connect = snd_dualsense_ih_connect;
++      mei->ih.disconnect = snd_dualsense_ih_disconnect;
++      mei->ih.start = snd_dualsense_ih_start;
+       mei->ih.name = name;
+       mei->ih.id_table = mei->id_table;
+-- 
+2.51.0
+
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 (file)
index 0000000..3d6253d
--- /dev/null
@@ -0,0 +1,49 @@
+From c73cf6bb37df2d1c41632050d689c9344c7d36d0 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 26 May 2025 17:07:44 +0300
+Subject: ALSA: usb-audio: Drop unnecessary parentheses in mixer_quirks
+
+From: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+
+[ Upstream commit c0495cef8b43ad61efbd4019e3573742e0e63c67 ]
+
+Fix multiple 'CHECK: Unnecessary parentheses around ...' reports from
+checkpatch.pl.
+
+Signed-off-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Link: https://patch.msgid.link/20250526-dualsense-alsa-jack-v1-5-1a821463b632@collabora.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/mixer_quirks.c | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
+index 0e8cf8b06b8ad..866d309454aa3 100644
+--- a/sound/usb/mixer_quirks.c
++++ b/sound/usb/mixer_quirks.c
+@@ -376,10 +376,10 @@ static int snd_audigy2nx_controls_create(struct usb_mixer_interface *mixer)
+               struct snd_kcontrol_new knew;
+               /* USB X-Fi S51 doesn't have a CMSS LED */
+-              if ((mixer->chip->usb_id == USB_ID(0x041e, 0x3042)) && i == 0)
++              if (mixer->chip->usb_id == USB_ID(0x041e, 0x3042) && i == 0)
+                       continue;
+               /* USB X-Fi S51 Pro doesn't have one either */
+-              if ((mixer->chip->usb_id == USB_ID(0x041e, 0x30df)) && i == 0)
++              if (mixer->chip->usb_id == USB_ID(0x041e, 0x30df) && i == 0)
+                       continue;
+               if (i > 1 && /* Live24ext has 2 LEDs only */
+                       (mixer->chip->usb_id == USB_ID(0x041e, 0x3040) ||
+@@ -3254,7 +3254,7 @@ static int snd_djm_controls_update(struct usb_mixer_interface *mixer,
+       int err;
+       const struct snd_djm_device *device = &snd_djm_devices[device_idx];
+-      if ((group >= device->ncontrols) || value >= device->controls[group].noptions)
++      if (group >= device->ncontrols || value >= device->controls[group].noptions)
+               return -EINVAL;
+       err = snd_usb_lock_shutdown(mixer->chip);
+-- 
+2.51.0
+
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 (file)
index 0000000..4d79b95
--- /dev/null
@@ -0,0 +1,49 @@
+From 214058846afe05b5006310fb5a3fcda407da42d8 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 26 May 2025 17:07:43 +0300
+Subject: ALSA: usb-audio: Fix block comments in mixer_quirks
+
+From: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+
+[ Upstream commit 231225d8a20f8668b4fd6601d54a2fac0e0ab7a5 ]
+
+Address a couple of comment formatting issues indicated by
+checkpatch.pl:
+
+  WARNING: Block comments use a trailing */ on a separate line
+
+Signed-off-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Link: https://patch.msgid.link/20250526-dualsense-alsa-jack-v1-4-1a821463b632@collabora.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/mixer_quirks.c | 6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
+
+diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
+index 60269535eb554..0e8cf8b06b8ad 100644
+--- a/sound/usb/mixer_quirks.c
++++ b/sound/usb/mixer_quirks.c
+@@ -76,7 +76,8 @@ static int snd_create_std_mono_ctl_offset(struct usb_mixer_interface *mixer,
+       cval->idx_off = idx_off;
+       /* get_min_max() is called only for integer volumes later,
+-       * so provide a short-cut for booleans */
++       * so provide a short-cut for booleans
++       */
+       cval->min = 0;
+       cval->max = 1;
+       cval->res = 0;
+@@ -3524,7 +3525,8 @@ static void snd_dragonfly_quirk_db_scale(struct usb_mixer_interface *mixer,
+                                        struct snd_kcontrol *kctl)
+ {
+       /* Approximation using 10 ranges based on output measurement on hw v1.2.
+-       * This seems close to the cubic mapping e.g. alsamixer uses. */
++       * This seems close to the cubic mapping e.g. alsamixer uses.
++       */
+       static const DECLARE_TLV_DB_RANGE(scale,
+                0,  1, TLV_DB_MINMAX_ITEM(-5300, -4970),
+                2,  5, TLV_DB_MINMAX_ITEM(-4710, -4160),
+-- 
+2.51.0
+
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 (file)
index 0000000..44a1541
--- /dev/null
@@ -0,0 +1,61 @@
+From 8d09d38339c3772d61c618193eb78f18af85ba5a Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 13 Jun 2025 10:15:30 +0200
+Subject: ALSA: usb-audio: Fix build with CONFIG_INPUT=n
+
+From: Takashi Iwai <tiwai@suse.de>
+
+[ Upstream commit d0630a0b80c08530857146e3bf183a7d6b743847 ]
+
+The recent addition of DualSense mixer quirk relies on the input
+device handle, and the build can fail if CONFIG_INPUT isn't set.
+Put (rather ugly) workarounds to wrap with IS_REACHABLE() for avoiding
+the build error.
+
+Fixes: 79d561c4ec04 ("ALSA: usb-audio: Add mixer quirk for Sony DualSense PS5")
+Reported-by: kernel test robot <lkp@intel.com>
+Closes: https://lore.kernel.org/oe-kbuild-all/202506130733.gnPKw2l3-lkp@intel.com/
+Reviewed-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+Link: https://patch.msgid.link/20250613081543.7404-1-tiwai@suse.de
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/mixer_quirks.c | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
+index 9b59d90ab8ca5..177f64107bb1e 100644
+--- a/sound/usb/mixer_quirks.c
++++ b/sound/usb/mixer_quirks.c
+@@ -528,6 +528,7 @@ static int snd_emu0204_controls_create(struct usb_mixer_interface *mixer)
+                                         &snd_emu0204_control, NULL);
+ }
++#if IS_REACHABLE(CONFIG_INPUT)
+ /*
+  * Sony DualSense controller (PS5) jack detection
+  *
+@@ -784,6 +785,7 @@ static int snd_dualsense_controls_create(struct usb_mixer_interface *mixer)
+       return snd_dualsense_jack_create(mixer, "Headset Mic Jack", false);
+ }
++#endif /* IS_REACHABLE(CONFIG_INPUT) */
+ /* ASUS Xonar U1 / U3 controls */
+@@ -3630,10 +3632,12 @@ int snd_usb_mixer_apply_create_quirk(struct usb_mixer_interface *mixer)
+               err = snd_emu0204_controls_create(mixer);
+               break;
++#if IS_REACHABLE(CONFIG_INPUT)
+       case USB_ID(0x054c, 0x0ce6): /* Sony DualSense controller (PS5) */
+       case USB_ID(0x054c, 0x0df2): /* Sony DualSense Edge controller (PS5) */
+               err = snd_dualsense_controls_create(mixer);
+               break;
++#endif /* IS_REACHABLE(CONFIG_INPUT) */
+       case USB_ID(0x0763, 0x2030): /* M-Audio Fast Track C400 */
+       case USB_ID(0x0763, 0x2031): /* M-Audio Fast Track C400 */
+-- 
+2.51.0
+
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 (file)
index 0000000..5b90716
--- /dev/null
@@ -0,0 +1,46 @@
+From 4cfee87dca7ee02e5186386d78944a84ebbd744e Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 26 May 2025 17:07:47 +0300
+Subject: ALSA: usb-audio: Remove unneeded wmb() in mixer_quirks
+
+From: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+
+[ Upstream commit 9cea7425595697802e8d55a322a251999554b8b1 ]
+
+Adding a memory barrier before wake_up() in
+snd_usb_soundblaster_remote_complete() is supposed to ensure the write
+to mixer->rc_code is visible in wait_event_interruptible() from
+snd_usb_sbrc_hwdep_read().
+
+However, this is not really necessary, since wake_up() is just a wrapper
+over __wake_up() which already executes a full memory barrier before
+accessing the state of the task to be waken up.
+
+Drop the redundant call to wmb() and implicitly fix the checkpatch
+complaint:
+
+  WARNING: memory barrier without comment
+
+Signed-off-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Link: https://patch.msgid.link/20250526-dualsense-alsa-jack-v1-8-1a821463b632@collabora.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/mixer_quirks.c | 1 -
+ 1 file changed, 1 deletion(-)
+
+diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
+index 3156bb50f9ff6..d50cd771356f8 100644
+--- a/sound/usb/mixer_quirks.c
++++ b/sound/usb/mixer_quirks.c
+@@ -208,7 +208,6 @@ static void snd_usb_soundblaster_remote_complete(struct urb *urb)
+       if (code == rc->mute_code)
+               snd_usb_mixer_notify_id(mixer, rc->mute_mixer_id);
+       mixer->rc_code = code;
+-      wmb();
+       wake_up(&mixer->rc_waitq);
+ }
+-- 
+2.51.0
+
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 (file)
index 0000000..558f158
--- /dev/null
@@ -0,0 +1,37 @@
+From 8753adcb709f9740038d32339aa624391c9530ba Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 26 May 2025 17:07:46 +0300
+Subject: ALSA: usb-audio: Simplify NULL comparison in mixer_quirks
+
+From: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+
+[ Upstream commit f2d6d660e8fd5f4467e80743f82119201e67fa9c ]
+
+Handle report from checkpatch.pl:
+
+  CHECK: Comparison to NULL could be written "t->name"
+
+Signed-off-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Link: https://patch.msgid.link/20250526-dualsense-alsa-jack-v1-7-1a821463b632@collabora.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/mixer_quirks.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
+index 4ab57ef56330d..3156bb50f9ff6 100644
+--- a/sound/usb/mixer_quirks.c
++++ b/sound/usb/mixer_quirks.c
+@@ -126,7 +126,7 @@ static int snd_create_std_mono_table(struct usb_mixer_interface *mixer,
+ {
+       int err;
+-      while (t->name != NULL) {
++      while (t->name) {
+               err = snd_create_std_mono_ctl(mixer, t->unitid, t->control,
+                               t->cmask, t->val_type, t->name, t->tlv_callback);
+               if (err < 0)
+-- 
+2.51.0
+
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 (file)
index 0000000..d2a11c3
--- /dev/null
@@ -0,0 +1,39 @@
+From 6df51ff6e19b1a32deb89eda387fc3d0e4dd6081 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sat, 20 Sep 2025 11:51:48 +0900
+Subject: firewire: core: fix overlooked update of subsystem ABI version
+
+From: Takashi Sakamoto <o-takashi@sakamocchi.jp>
+
+[ Upstream commit 853a57ba263adfecf4430b936d6862bc475b4bb5 ]
+
+In kernel v6.5, several functions were added to the cdev layer. This
+required updating the default version of subsystem ABI up to 6, but
+this requirement was overlooked.
+
+This commit updates the version accordingly.
+
+Fixes: 6add87e9764d ("firewire: cdev: add new version of ABI to notify time stamp at request/response subaction of transaction#")
+Link: https://lore.kernel.org/r/20250920025148.163402-1-o-takashi@sakamocchi.jp
+Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/firewire/core-cdev.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/firewire/core-cdev.c b/drivers/firewire/core-cdev.c
+index 16ea847ade5fd..3ca9d1c38fef8 100644
+--- a/drivers/firewire/core-cdev.c
++++ b/drivers/firewire/core-cdev.c
+@@ -38,7 +38,7 @@
+ /*
+  * ABI version history is documented in linux/firewire-cdev.h.
+  */
+-#define FW_CDEV_KERNEL_VERSION                        5
++#define FW_CDEV_KERNEL_VERSION                        6
+ #define FW_CDEV_VERSION_EVENT_REQUEST2                4
+ #define FW_CDEV_VERSION_ALLOCATE_REGION_END   4
+ #define FW_CDEV_VERSION_AUTO_FLUSH_ISO_OVERFLOW       5
+-- 
+2.51.0
+
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 (file)
index 0000000..ded938f
--- /dev/null
@@ -0,0 +1,50 @@
+From 2376806b6718a40547d4feafecd41e053ffbf0e2 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 13 Aug 2025 15:43:20 +0300
+Subject: IB/mlx5: Fix obj_type mismatch for SRQ event subscriptions
+
+From: Or Har-Toov <ohartoov@nvidia.com>
+
+[ Upstream commit 85fe9f565d2d5af95ac2bbaa5082b8ce62b039f5 ]
+
+Fix a bug where the driver's event subscription logic for SRQ-related
+events incorrectly sets obj_type for RMP objects.
+
+When subscribing to SRQ events, get_legacy_obj_type() did not handle
+the MLX5_CMD_OP_CREATE_RMP case, which caused obj_type to be 0
+(default).
+This led to a mismatch between the obj_type used during subscription
+(0) and the value used during notification (1, taken from the event's
+type field). As a result, event mapping for SRQ objects could fail and
+event notification would not be delivered correctly.
+
+This fix adds handling for MLX5_CMD_OP_CREATE_RMP in get_legacy_obj_type,
+returning MLX5_EVENT_QUEUE_TYPE_RQ so obj_type is consistent between
+subscription and notification.
+
+Fixes: 759738537142 ("IB/mlx5: Enable subscription for device events over DEVX")
+Link: https://patch.msgid.link/r/8f1048e3fdd1fde6b90607ce0ed251afaf8a148c.1755088962.git.leon@kernel.org
+Signed-off-by: Or Har-Toov <ohartoov@nvidia.com>
+Reviewed-by: Edward Srouji <edwards@nvidia.com>
+Signed-off-by: Leon Romanovsky <leonro@nvidia.com>
+Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/infiniband/hw/mlx5/devx.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/drivers/infiniband/hw/mlx5/devx.c b/drivers/infiniband/hw/mlx5/devx.c
+index cc351390b568c..b2d5e21dba26c 100644
+--- a/drivers/infiniband/hw/mlx5/devx.c
++++ b/drivers/infiniband/hw/mlx5/devx.c
+@@ -191,6 +191,7 @@ static u16 get_legacy_obj_type(u16 opcode)
+ {
+       switch (opcode) {
+       case MLX5_CMD_OP_CREATE_RQ:
++      case MLX5_CMD_OP_CREATE_RMP:
+               return MLX5_EVENT_QUEUE_TYPE_RQ;
+       case MLX5_CMD_OP_CREATE_QP:
+               return MLX5_EVENT_QUEUE_TYPE_QP;
+-- 
+2.51.0
+
index 8c89d1d5bea69ae63d360e1bfb5fd3537fcefc10..dfae519d23ee7873daa4019b4f68ce6f1046e634 100644 (file)
@@ -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 (file)
index 0000000..649124d
--- /dev/null
@@ -0,0 +1,36 @@
+From 7182632669297365e9302b4e353956788cc9e870 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 3 Jun 2025 15:10:45 +0800
+Subject: usb: core: Add 0x prefix to quirks debug output
+
+From: Jiayi Li <lijiayi@kylinos.cn>
+
+[ Upstream commit 47c428fce0b41b15ab321d8ede871f780ccd038f ]
+
+Use "0x%x" format for quirks debug print to clarify it's a hexadecimal
+value. Improves readability and consistency with other hex outputs.
+
+Signed-off-by: Jiayi Li <lijiayi@kylinos.cn>
+Link: https://lore.kernel.org/r/20250603071045.3243699-1-lijiayi@kylinos.cn
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/usb/core/quirks.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/usb/core/quirks.c b/drivers/usb/core/quirks.c
+index 5935ab39bf8d8..f7747524be6dc 100644
+--- a/drivers/usb/core/quirks.c
++++ b/drivers/usb/core/quirks.c
+@@ -727,7 +727,7 @@ void usb_detect_quirks(struct usb_device *udev)
+       udev->quirks ^= usb_detect_dynamic_quirks(udev);
+       if (udev->quirks)
+-              dev_dbg(&udev->dev, "USB quirks for this device: %x\n",
++              dev_dbg(&udev->dev, "USB quirks for this device: 0x%x\n",
+                       udev->quirks);
+ #ifdef CONFIG_USB_DEFAULT_PERSIST
+-- 
+2.51.0
+
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 (file)
index 0000000..b807f4d
--- /dev/null
@@ -0,0 +1,321 @@
+From 6e9f8482c48870b45b89948251b95a3700f48c30 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 26 May 2025 17:07:48 +0300
+Subject: ALSA: usb-audio: Add mixer quirk for Sony DualSense PS5
+
+From: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+
+[ Upstream commit 79d561c4ec0497669f19a9550cfb74812f60938b ]
+
+The Sony DualSense wireless controller (PS5) features an internal mono
+speaker, but it also provides a 3.5mm jack socket for headphone output
+and headset microphone input.
+
+Since this is a UAC1 device, it doesn't advertise any jack detection
+capability.  However, the controller is able to report HP & MIC insert
+events via HID, i.e. through a dedicated input device managed by the
+hid-playstation driver.
+
+Add a quirk to create the jack controls for headphone and headset mic,
+respectively, and setup an input handler for each of them in order to
+intercept the related hotplug events.
+
+Signed-off-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Link: https://patch.msgid.link/20250526-dualsense-alsa-jack-v1-9-1a821463b632@collabora.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/mixer_quirks.c | 263 +++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 263 insertions(+)
+
+diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
+index 03d49d4c5141d..cea1c970359c1 100644
+--- a/sound/usb/mixer_quirks.c
++++ b/sound/usb/mixer_quirks.c
+@@ -16,6 +16,7 @@
+ #include <linux/hid.h>
+ #include <linux/init.h>
++#include <linux/input.h>
+ #include <linux/math64.h>
+ #include <linux/slab.h>
+ #include <linux/usb.h>
+@@ -526,6 +527,263 @@ static int snd_emu0204_controls_create(struct usb_mixer_interface *mixer)
+                                         &snd_emu0204_control, NULL);
+ }
++/*
++ * Sony DualSense controller (PS5) jack detection
++ *
++ * Since this is an UAC 1 device, it doesn't support jack detection.
++ * However, the controller hid-playstation driver reports HP & MIC
++ * insert events through a dedicated input device.
++ */
++
++#define SND_DUALSENSE_JACK_OUT_TERM_ID 3
++#define SND_DUALSENSE_JACK_IN_TERM_ID 4
++
++struct dualsense_mixer_elem_info {
++      struct usb_mixer_elem_info info;
++      struct input_handler ih;
++      struct input_device_id id_table[2];
++      bool connected;
++};
++
++static void snd_dualsense_ih_event(struct input_handle *handle,
++                                 unsigned int type, unsigned int code,
++                                 int value)
++{
++      struct dualsense_mixer_elem_info *mei;
++      struct usb_mixer_elem_list *me;
++
++      if (type != EV_SW)
++              return;
++
++      mei = container_of(handle->handler, struct dualsense_mixer_elem_info, ih);
++      me = &mei->info.head;
++
++      if ((me->id == SND_DUALSENSE_JACK_OUT_TERM_ID && code == SW_HEADPHONE_INSERT) ||
++          (me->id == SND_DUALSENSE_JACK_IN_TERM_ID && code == SW_MICROPHONE_INSERT)) {
++              mei->connected = !!value;
++              snd_ctl_notify(me->mixer->chip->card, SNDRV_CTL_EVENT_MASK_VALUE,
++                             &me->kctl->id);
++      }
++}
++
++static bool snd_dualsense_ih_match(struct input_handler *handler,
++                                 struct input_dev *dev)
++{
++      struct dualsense_mixer_elem_info *mei;
++      struct usb_device *snd_dev;
++      char *input_dev_path, *usb_dev_path;
++      size_t usb_dev_path_len;
++      bool match = false;
++
++      mei = container_of(handler, struct dualsense_mixer_elem_info, ih);
++      snd_dev = mei->info.head.mixer->chip->dev;
++
++      input_dev_path = kobject_get_path(&dev->dev.kobj, GFP_KERNEL);
++      if (!input_dev_path) {
++              dev_warn(&snd_dev->dev, "Failed to get input dev path\n");
++              return false;
++      }
++
++      usb_dev_path = kobject_get_path(&snd_dev->dev.kobj, GFP_KERNEL);
++      if (!usb_dev_path) {
++              dev_warn(&snd_dev->dev, "Failed to get USB dev path\n");
++              goto free_paths;
++      }
++
++      /*
++       * Ensure the VID:PID matched input device supposedly owned by the
++       * hid-playstation driver belongs to the actual hardware handled by
++       * the current USB audio device, which implies input_dev_path being
++       * a subpath of usb_dev_path.
++       *
++       * This verification is necessary when there is more than one identical
++       * controller attached to the host system.
++       */
++      usb_dev_path_len = strlen(usb_dev_path);
++      if (usb_dev_path_len >= strlen(input_dev_path))
++              goto free_paths;
++
++      usb_dev_path[usb_dev_path_len] = '/';
++      match = !memcmp(input_dev_path, usb_dev_path, usb_dev_path_len + 1);
++
++free_paths:
++      kfree(input_dev_path);
++      kfree(usb_dev_path);
++
++      return match;
++}
++
++static int snd_dualsense_ih_connect(struct input_handler *handler,
++                                  struct input_dev *dev,
++                                  const struct input_device_id *id)
++{
++      struct input_handle *handle;
++      int err;
++
++      handle = kzalloc(sizeof(*handle), GFP_KERNEL);
++      if (!handle)
++              return -ENOMEM;
++
++      handle->dev = dev;
++      handle->handler = handler;
++      handle->name = handler->name;
++
++      err = input_register_handle(handle);
++      if (err)
++              goto err_free;
++
++      err = input_open_device(handle);
++      if (err)
++              goto err_unregister;
++
++      return 0;
++
++err_unregister:
++      input_unregister_handle(handle);
++err_free:
++      kfree(handle);
++      return err;
++}
++
++static void snd_dualsense_ih_disconnect(struct input_handle *handle)
++{
++      input_close_device(handle);
++      input_unregister_handle(handle);
++      kfree(handle);
++}
++
++static void snd_dualsense_ih_start(struct input_handle *handle)
++{
++      struct dualsense_mixer_elem_info *mei;
++      struct usb_mixer_elem_list *me;
++      int status = -1;
++
++      mei = container_of(handle->handler, struct dualsense_mixer_elem_info, ih);
++      me = &mei->info.head;
++
++      if (me->id == SND_DUALSENSE_JACK_OUT_TERM_ID &&
++          test_bit(SW_HEADPHONE_INSERT, handle->dev->swbit))
++              status = test_bit(SW_HEADPHONE_INSERT, handle->dev->sw);
++      else if (me->id == SND_DUALSENSE_JACK_IN_TERM_ID &&
++               test_bit(SW_MICROPHONE_INSERT, handle->dev->swbit))
++              status = test_bit(SW_MICROPHONE_INSERT, handle->dev->sw);
++
++      if (status >= 0) {
++              mei->connected = !!status;
++              snd_ctl_notify(me->mixer->chip->card, SNDRV_CTL_EVENT_MASK_VALUE,
++                             &me->kctl->id);
++      }
++}
++
++static int snd_dualsense_jack_get(struct snd_kcontrol *kctl,
++                                struct snd_ctl_elem_value *ucontrol)
++{
++      struct dualsense_mixer_elem_info *mei = snd_kcontrol_chip(kctl);
++
++      ucontrol->value.integer.value[0] = mei->connected;
++
++      return 0;
++}
++
++static const struct snd_kcontrol_new snd_dualsense_jack_control = {
++      .iface = SNDRV_CTL_ELEM_IFACE_CARD,
++      .access = SNDRV_CTL_ELEM_ACCESS_READ,
++      .info = snd_ctl_boolean_mono_info,
++      .get = snd_dualsense_jack_get,
++};
++
++static int snd_dualsense_resume_jack(struct usb_mixer_elem_list *list)
++{
++      snd_ctl_notify(list->mixer->chip->card, SNDRV_CTL_EVENT_MASK_VALUE,
++                     &list->kctl->id);
++      return 0;
++}
++
++static void snd_dualsense_mixer_elem_free(struct snd_kcontrol *kctl)
++{
++      struct dualsense_mixer_elem_info *mei = snd_kcontrol_chip(kctl);
++
++      if (mei->ih.event)
++              input_unregister_handler(&mei->ih);
++
++      snd_usb_mixer_elem_free(kctl);
++}
++
++static int snd_dualsense_jack_create(struct usb_mixer_interface *mixer,
++                                   const char *name, bool is_output)
++{
++      struct dualsense_mixer_elem_info *mei;
++      struct input_device_id *idev_id;
++      struct snd_kcontrol *kctl;
++      int err;
++
++      mei = kzalloc(sizeof(*mei), GFP_KERNEL);
++      if (!mei)
++              return -ENOMEM;
++
++      snd_usb_mixer_elem_init_std(&mei->info.head, mixer,
++                                  is_output ? SND_DUALSENSE_JACK_OUT_TERM_ID :
++                                              SND_DUALSENSE_JACK_IN_TERM_ID);
++
++      mei->info.head.resume = snd_dualsense_resume_jack;
++      mei->info.val_type = USB_MIXER_BOOLEAN;
++      mei->info.channels = 1;
++      mei->info.min = 0;
++      mei->info.max = 1;
++
++      kctl = snd_ctl_new1(&snd_dualsense_jack_control, mei);
++      if (!kctl) {
++              kfree(mei);
++              return -ENOMEM;
++      }
++
++      strscpy(kctl->id.name, name, sizeof(kctl->id.name));
++      kctl->private_free = snd_dualsense_mixer_elem_free;
++
++      err = snd_usb_mixer_add_control(&mei->info.head, kctl);
++      if (err)
++              return err;
++
++      idev_id = &mei->id_table[0];
++      idev_id->flags = INPUT_DEVICE_ID_MATCH_VENDOR | INPUT_DEVICE_ID_MATCH_PRODUCT |
++                       INPUT_DEVICE_ID_MATCH_EVBIT | INPUT_DEVICE_ID_MATCH_SWBIT;
++      idev_id->vendor = USB_ID_VENDOR(mixer->chip->usb_id);
++      idev_id->product = USB_ID_PRODUCT(mixer->chip->usb_id);
++      idev_id->evbit[BIT_WORD(EV_SW)] = BIT_MASK(EV_SW);
++      if (is_output)
++              idev_id->swbit[BIT_WORD(SW_HEADPHONE_INSERT)] = BIT_MASK(SW_HEADPHONE_INSERT);
++      else
++              idev_id->swbit[BIT_WORD(SW_MICROPHONE_INSERT)] = BIT_MASK(SW_MICROPHONE_INSERT);
++
++      mei->ih.event = snd_dualsense_ih_event;
++      mei->ih.match = snd_dualsense_ih_match;
++      mei->ih.connect = snd_dualsense_ih_connect,
++      mei->ih.disconnect = snd_dualsense_ih_disconnect,
++      mei->ih.start = snd_dualsense_ih_start,
++      mei->ih.name = name;
++      mei->ih.id_table = mei->id_table;
++
++      err = input_register_handler(&mei->ih);
++      if (err) {
++              dev_warn(&mixer->chip->dev->dev,
++                       "Could not register input handler: %d\n", err);
++              mei->ih.event = NULL;
++      }
++
++      return 0;
++}
++
++static int snd_dualsense_controls_create(struct usb_mixer_interface *mixer)
++{
++      int err;
++
++      err = snd_dualsense_jack_create(mixer, "Headphone Jack", true);
++      if (err < 0)
++              return err;
++
++      return snd_dualsense_jack_create(mixer, "Headset Mic Jack", false);
++}
++
+ /* ASUS Xonar U1 / U3 controls */
+ static int snd_xonar_u1_switch_get(struct snd_kcontrol *kcontrol,
+@@ -2381,6 +2639,11 @@ int snd_usb_mixer_apply_create_quirk(struct usb_mixer_interface *mixer)
+               err = snd_emu0204_controls_create(mixer);
+               break;
++      case USB_ID(0x054c, 0x0ce6): /* Sony DualSense controller (PS5) */
++      case USB_ID(0x054c, 0x0df2): /* Sony DualSense Edge controller (PS5) */
++              err = snd_dualsense_controls_create(mixer);
++              break;
++
+       case USB_ID(0x0763, 0x2030): /* M-Audio Fast Track C400 */
+       case USB_ID(0x0763, 0x2031): /* M-Audio Fast Track C400 */
+               err = snd_c400_create_mixer(mixer);
+-- 
+2.51.0
+
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 (file)
index 0000000..150d369
--- /dev/null
@@ -0,0 +1,38 @@
+From 842952962e0b96d3bd7d6a2a836a524a0748a91f Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 26 May 2025 17:07:45 +0300
+Subject: ALSA: usb-audio: Avoid multiple assignments in mixer_quirks
+
+From: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+
+[ Upstream commit 03ddd3bdb94df3edb1f2408b57cfb00b3d92a208 ]
+
+Handle report from checkpatch.pl:
+
+  CHECK: multiple assignments should be avoided
+
+Signed-off-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Link: https://patch.msgid.link/20250526-dualsense-alsa-jack-v1-6-1a821463b632@collabora.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/mixer_quirks.c | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
+index 96397a4fdf873..22f483fee5f8c 100644
+--- a/sound/usb/mixer_quirks.c
++++ b/sound/usb/mixer_quirks.c
+@@ -1592,7 +1592,8 @@ static int snd_microii_spdif_default_put(struct snd_kcontrol *kcontrol,
+       unsigned int pval, pval_old;
+       int err;
+-      pval = pval_old = kcontrol->private_value;
++      pval = kcontrol->private_value;
++      pval_old = pval;
+       pval &= 0xfffff0f0;
+       pval |= (ucontrol->value.iec958.status[1] & 0x0f) << 8;
+       pval |= (ucontrol->value.iec958.status[0] & 0x0f);
+-- 
+2.51.0
+
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 (file)
index 0000000..5c4358b
--- /dev/null
@@ -0,0 +1,49 @@
+From c25cb2a2d7c5be595b76968b3b509ba09dbbb188 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 12 Jun 2025 14:02:28 +0800
+Subject: ALSA: usb-audio: Convert comma to semicolon
+
+From: Chen Ni <nichen@iscas.ac.cn>
+
+[ Upstream commit 9ca30a1b007d5fefb5752428f852a2d8d7219c1c ]
+
+Replace comma between expressions with semicolons.
+
+Using a ',' in place of a ';' can have unintended side effects.
+Although that is not the case here, it is seems best to use ';'
+unless ',' is intended.
+
+Found by inspection.
+No functional change intended.
+Compile tested only.
+
+Fixes: 79d561c4ec04 ("ALSA: usb-audio: Add mixer quirk for Sony DualSense PS5")
+Signed-off-by: Chen Ni <nichen@iscas.ac.cn>
+Reviewed-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+Link: https://patch.msgid.link/20250612060228.1518028-1-nichen@iscas.ac.cn
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/mixer_quirks.c | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
+index cea1c970359c1..833f894a692c7 100644
+--- a/sound/usb/mixer_quirks.c
++++ b/sound/usb/mixer_quirks.c
+@@ -757,9 +757,9 @@ static int snd_dualsense_jack_create(struct usb_mixer_interface *mixer,
+       mei->ih.event = snd_dualsense_ih_event;
+       mei->ih.match = snd_dualsense_ih_match;
+-      mei->ih.connect = snd_dualsense_ih_connect,
+-      mei->ih.disconnect = snd_dualsense_ih_disconnect,
+-      mei->ih.start = snd_dualsense_ih_start,
++      mei->ih.connect = snd_dualsense_ih_connect;
++      mei->ih.disconnect = snd_dualsense_ih_disconnect;
++      mei->ih.start = snd_dualsense_ih_start;
+       mei->ih.name = name;
+       mei->ih.id_table = mei->id_table;
+-- 
+2.51.0
+
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 (file)
index 0000000..fad70af
--- /dev/null
@@ -0,0 +1,49 @@
+From ce22a988ef225658f2555d443e36fa1ea5a91932 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 26 May 2025 17:07:43 +0300
+Subject: ALSA: usb-audio: Fix block comments in mixer_quirks
+
+From: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+
+[ Upstream commit 231225d8a20f8668b4fd6601d54a2fac0e0ab7a5 ]
+
+Address a couple of comment formatting issues indicated by
+checkpatch.pl:
+
+  WARNING: Block comments use a trailing */ on a separate line
+
+Signed-off-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Link: https://patch.msgid.link/20250526-dualsense-alsa-jack-v1-4-1a821463b632@collabora.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/mixer_quirks.c | 6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
+
+diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
+index bc065ec997f39..96397a4fdf873 100644
+--- a/sound/usb/mixer_quirks.c
++++ b/sound/usb/mixer_quirks.c
+@@ -75,7 +75,8 @@ static int snd_create_std_mono_ctl_offset(struct usb_mixer_interface *mixer,
+       cval->idx_off = idx_off;
+       /* get_min_max() is called only for integer volumes later,
+-       * so provide a short-cut for booleans */
++       * so provide a short-cut for booleans
++       */
+       cval->min = 0;
+       cval->max = 1;
+       cval->res = 0;
+@@ -2502,7 +2503,8 @@ static void snd_dragonfly_quirk_db_scale(struct usb_mixer_interface *mixer,
+                                        struct snd_kcontrol *kctl)
+ {
+       /* Approximation using 10 ranges based on output measurement on hw v1.2.
+-       * This seems close to the cubic mapping e.g. alsamixer uses. */
++       * This seems close to the cubic mapping e.g. alsamixer uses.
++       */
+       static const DECLARE_TLV_DB_RANGE(scale,
+                0,  1, TLV_DB_MINMAX_ITEM(-5300, -4970),
+                2,  5, TLV_DB_MINMAX_ITEM(-4710, -4160),
+-- 
+2.51.0
+
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 (file)
index 0000000..7018d5f
--- /dev/null
@@ -0,0 +1,61 @@
+From 9a538dc8bb5946599c7d20b2e917ec428e68a3be Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 13 Jun 2025 10:15:30 +0200
+Subject: ALSA: usb-audio: Fix build with CONFIG_INPUT=n
+
+From: Takashi Iwai <tiwai@suse.de>
+
+[ Upstream commit d0630a0b80c08530857146e3bf183a7d6b743847 ]
+
+The recent addition of DualSense mixer quirk relies on the input
+device handle, and the build can fail if CONFIG_INPUT isn't set.
+Put (rather ugly) workarounds to wrap with IS_REACHABLE() for avoiding
+the build error.
+
+Fixes: 79d561c4ec04 ("ALSA: usb-audio: Add mixer quirk for Sony DualSense PS5")
+Reported-by: kernel test robot <lkp@intel.com>
+Closes: https://lore.kernel.org/oe-kbuild-all/202506130733.gnPKw2l3-lkp@intel.com/
+Reviewed-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+Link: https://patch.msgid.link/20250613081543.7404-1-tiwai@suse.de
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/mixer_quirks.c | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
+index 833f894a692c7..974926d907c2f 100644
+--- a/sound/usb/mixer_quirks.c
++++ b/sound/usb/mixer_quirks.c
+@@ -527,6 +527,7 @@ static int snd_emu0204_controls_create(struct usb_mixer_interface *mixer)
+                                         &snd_emu0204_control, NULL);
+ }
++#if IS_REACHABLE(CONFIG_INPUT)
+ /*
+  * Sony DualSense controller (PS5) jack detection
+  *
+@@ -783,6 +784,7 @@ static int snd_dualsense_controls_create(struct usb_mixer_interface *mixer)
+       return snd_dualsense_jack_create(mixer, "Headset Mic Jack", false);
+ }
++#endif /* IS_REACHABLE(CONFIG_INPUT) */
+ /* ASUS Xonar U1 / U3 controls */
+@@ -2639,10 +2641,12 @@ int snd_usb_mixer_apply_create_quirk(struct usb_mixer_interface *mixer)
+               err = snd_emu0204_controls_create(mixer);
+               break;
++#if IS_REACHABLE(CONFIG_INPUT)
+       case USB_ID(0x054c, 0x0ce6): /* Sony DualSense controller (PS5) */
+       case USB_ID(0x054c, 0x0df2): /* Sony DualSense Edge controller (PS5) */
+               err = snd_dualsense_controls_create(mixer);
+               break;
++#endif /* IS_REACHABLE(CONFIG_INPUT) */
+       case USB_ID(0x0763, 0x2030): /* M-Audio Fast Track C400 */
+       case USB_ID(0x0763, 0x2031): /* M-Audio Fast Track C400 */
+-- 
+2.51.0
+
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 (file)
index 0000000..cbe87a6
--- /dev/null
@@ -0,0 +1,46 @@
+From 3614852efe3537eae8739e9dca2d8647f0a7b17e Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 26 May 2025 17:07:47 +0300
+Subject: ALSA: usb-audio: Remove unneeded wmb() in mixer_quirks
+
+From: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+
+[ Upstream commit 9cea7425595697802e8d55a322a251999554b8b1 ]
+
+Adding a memory barrier before wake_up() in
+snd_usb_soundblaster_remote_complete() is supposed to ensure the write
+to mixer->rc_code is visible in wait_event_interruptible() from
+snd_usb_sbrc_hwdep_read().
+
+However, this is not really necessary, since wake_up() is just a wrapper
+over __wake_up() which already executes a full memory barrier before
+accessing the state of the task to be waken up.
+
+Drop the redundant call to wmb() and implicitly fix the checkpatch
+complaint:
+
+  WARNING: memory barrier without comment
+
+Signed-off-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Link: https://patch.msgid.link/20250526-dualsense-alsa-jack-v1-8-1a821463b632@collabora.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/mixer_quirks.c | 1 -
+ 1 file changed, 1 deletion(-)
+
+diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
+index f318b80d646d5..03d49d4c5141d 100644
+--- a/sound/usb/mixer_quirks.c
++++ b/sound/usb/mixer_quirks.c
+@@ -207,7 +207,6 @@ static void snd_usb_soundblaster_remote_complete(struct urb *urb)
+       if (code == rc->mute_code)
+               snd_usb_mixer_notify_id(mixer, rc->mute_mixer_id);
+       mixer->rc_code = code;
+-      wmb();
+       wake_up(&mixer->rc_waitq);
+ }
+-- 
+2.51.0
+
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 (file)
index 0000000..c1d888d
--- /dev/null
@@ -0,0 +1,37 @@
+From 76c77107b9a92ca2915c09de59e9347d04bcad88 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 26 May 2025 17:07:46 +0300
+Subject: ALSA: usb-audio: Simplify NULL comparison in mixer_quirks
+
+From: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+
+[ Upstream commit f2d6d660e8fd5f4467e80743f82119201e67fa9c ]
+
+Handle report from checkpatch.pl:
+
+  CHECK: Comparison to NULL could be written "t->name"
+
+Signed-off-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Link: https://patch.msgid.link/20250526-dualsense-alsa-jack-v1-7-1a821463b632@collabora.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/mixer_quirks.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
+index 22f483fee5f8c..f318b80d646d5 100644
+--- a/sound/usb/mixer_quirks.c
++++ b/sound/usb/mixer_quirks.c
+@@ -125,7 +125,7 @@ static int snd_create_std_mono_table(struct usb_mixer_interface *mixer,
+ {
+       int err;
+-      while (t->name != NULL) {
++      while (t->name) {
+               err = snd_create_std_mono_ctl(mixer, t->unitid, t->control,
+                               t->cmask, t->val_type, t->name, t->tlv_callback);
+               if (err < 0)
+-- 
+2.51.0
+
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 (file)
index 0000000..60d3600
--- /dev/null
@@ -0,0 +1,39 @@
+From 401eb36971159200b5cb73c00f6412c54dfdcb1f Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sat, 20 Sep 2025 11:51:48 +0900
+Subject: firewire: core: fix overlooked update of subsystem ABI version
+
+From: Takashi Sakamoto <o-takashi@sakamocchi.jp>
+
+[ Upstream commit 853a57ba263adfecf4430b936d6862bc475b4bb5 ]
+
+In kernel v6.5, several functions were added to the cdev layer. This
+required updating the default version of subsystem ABI up to 6, but
+this requirement was overlooked.
+
+This commit updates the version accordingly.
+
+Fixes: 6add87e9764d ("firewire: cdev: add new version of ABI to notify time stamp at request/response subaction of transaction#")
+Link: https://lore.kernel.org/r/20250920025148.163402-1-o-takashi@sakamocchi.jp
+Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/firewire/core-cdev.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/firewire/core-cdev.c b/drivers/firewire/core-cdev.c
+index 4fe36d549d615..f3f2c8fa8463f 100644
+--- a/drivers/firewire/core-cdev.c
++++ b/drivers/firewire/core-cdev.c
+@@ -38,7 +38,7 @@
+ /*
+  * ABI version history is documented in linux/firewire-cdev.h.
+  */
+-#define FW_CDEV_KERNEL_VERSION                        5
++#define FW_CDEV_KERNEL_VERSION                        6
+ #define FW_CDEV_VERSION_EVENT_REQUEST2                4
+ #define FW_CDEV_VERSION_ALLOCATE_REGION_END   4
+ #define FW_CDEV_VERSION_AUTO_FLUSH_ISO_OVERFLOW       5
+-- 
+2.51.0
+
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 (file)
index 0000000..f4c263b
--- /dev/null
@@ -0,0 +1,50 @@
+From b868d928960547389f71b12f735be47fd96f884b Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 13 Aug 2025 15:43:20 +0300
+Subject: IB/mlx5: Fix obj_type mismatch for SRQ event subscriptions
+
+From: Or Har-Toov <ohartoov@nvidia.com>
+
+[ Upstream commit 85fe9f565d2d5af95ac2bbaa5082b8ce62b039f5 ]
+
+Fix a bug where the driver's event subscription logic for SRQ-related
+events incorrectly sets obj_type for RMP objects.
+
+When subscribing to SRQ events, get_legacy_obj_type() did not handle
+the MLX5_CMD_OP_CREATE_RMP case, which caused obj_type to be 0
+(default).
+This led to a mismatch between the obj_type used during subscription
+(0) and the value used during notification (1, taken from the event's
+type field). As a result, event mapping for SRQ objects could fail and
+event notification would not be delivered correctly.
+
+This fix adds handling for MLX5_CMD_OP_CREATE_RMP in get_legacy_obj_type,
+returning MLX5_EVENT_QUEUE_TYPE_RQ so obj_type is consistent between
+subscription and notification.
+
+Fixes: 759738537142 ("IB/mlx5: Enable subscription for device events over DEVX")
+Link: https://patch.msgid.link/r/8f1048e3fdd1fde6b90607ce0ed251afaf8a148c.1755088962.git.leon@kernel.org
+Signed-off-by: Or Har-Toov <ohartoov@nvidia.com>
+Reviewed-by: Edward Srouji <edwards@nvidia.com>
+Signed-off-by: Leon Romanovsky <leonro@nvidia.com>
+Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/infiniband/hw/mlx5/devx.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/drivers/infiniband/hw/mlx5/devx.c b/drivers/infiniband/hw/mlx5/devx.c
+index ad8057bfd0c8b..3d7e067fde099 100644
+--- a/drivers/infiniband/hw/mlx5/devx.c
++++ b/drivers/infiniband/hw/mlx5/devx.c
+@@ -245,6 +245,7 @@ static u16 get_legacy_obj_type(u16 opcode)
+ {
+       switch (opcode) {
+       case MLX5_CMD_OP_CREATE_RQ:
++      case MLX5_CMD_OP_CREATE_RMP:
+               return MLX5_EVENT_QUEUE_TYPE_RQ;
+       case MLX5_CMD_OP_CREATE_QP:
+               return MLX5_EVENT_QUEUE_TYPE_QP;
+-- 
+2.51.0
+
index 739abd4e128a9164da49256561bd058f3001ade2..4d5187b09c76d8abc52fdf5c5c1fd303973f40df 100644 (file)
@@ -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 (file)
index 0000000..0a4ded0
--- /dev/null
@@ -0,0 +1,36 @@
+From 65af9c23427d32d4952b16de47008f4d0440e5c0 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 3 Jun 2025 15:10:45 +0800
+Subject: usb: core: Add 0x prefix to quirks debug output
+
+From: Jiayi Li <lijiayi@kylinos.cn>
+
+[ Upstream commit 47c428fce0b41b15ab321d8ede871f780ccd038f ]
+
+Use "0x%x" format for quirks debug print to clarify it's a hexadecimal
+value. Improves readability and consistency with other hex outputs.
+
+Signed-off-by: Jiayi Li <lijiayi@kylinos.cn>
+Link: https://lore.kernel.org/r/20250603071045.3243699-1-lijiayi@kylinos.cn
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/usb/core/quirks.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/usb/core/quirks.c b/drivers/usb/core/quirks.c
+index 75a4d162c58b3..716bcf9f4d347 100644
+--- a/drivers/usb/core/quirks.c
++++ b/drivers/usb/core/quirks.c
+@@ -728,7 +728,7 @@ void usb_detect_quirks(struct usb_device *udev)
+       udev->quirks ^= usb_detect_dynamic_quirks(udev);
+       if (udev->quirks)
+-              dev_dbg(&udev->dev, "USB quirks for this device: %x\n",
++              dev_dbg(&udev->dev, "USB quirks for this device: 0x%x\n",
+                       udev->quirks);
+ #ifdef CONFIG_USB_DEFAULT_PERSIST
+-- 
+2.51.0
+
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 (file)
index 0000000..4d6f252
--- /dev/null
@@ -0,0 +1,40 @@
+From 3339871db55d720fa4f008d4d0f920ca15e30e5f Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 31 Jul 2025 19:06:14 +0800
+Subject: ALSA: usb-audio: Add DSD support for Comtrue USB Audio device
+
+From: noble.yang <noble.yang@comtrue-inc.com>
+
+[ Upstream commit e9df1755485dd90a89656e8a21ec4d71c909fa30 ]
+
+The vendor Comtrue Inc. (0x2fc6) produces USB audio chipsets like
+the CT7601 which are capable of Native DSD playback.
+
+This patch adds QUIRK_FLAG_DSD_RAW for Comtrue (VID 0x2fc6), which enables
+native DSD playback (DSD_U32_LE) on their USB Audio device. This has been
+verified under Ubuntu 25.04 with JRiver.
+
+Signed-off-by: noble.yang <noble.yang@comtrue-inc.com>
+Link: https://patch.msgid.link/20250731110614.4070-1-noble228@gmail.com
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/quirks.c | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/sound/usb/quirks.c b/sound/usb/quirks.c
+index ac43bdf6e9ca6..d4f4466b028c8 100644
+--- a/sound/usb/quirks.c
++++ b/sound/usb/quirks.c
+@@ -2303,6 +2303,8 @@ static const struct usb_audio_quirk_flags_table quirk_flags_table[] = {
+                  QUIRK_FLAG_DSD_RAW),
+       VENDOR_FLG(0x2d87, /* Cayin device */
+                  QUIRK_FLAG_DSD_RAW),
++      VENDOR_FLG(0x2fc6, /* Comture-inc devices */
++                 QUIRK_FLAG_DSD_RAW),
+       VENDOR_FLG(0x3336, /* HEM devices */
+                  QUIRK_FLAG_DSD_RAW),
+       VENDOR_FLG(0x3353, /* Khadas devices */
+-- 
+2.51.0
+
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 (file)
index 0000000..7fc46f7
--- /dev/null
@@ -0,0 +1,321 @@
+From b461a21e43fb1f5e0737a130fafa63e43e00fcfe Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 26 May 2025 17:07:48 +0300
+Subject: ALSA: usb-audio: Add mixer quirk for Sony DualSense PS5
+
+From: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+
+[ Upstream commit 79d561c4ec0497669f19a9550cfb74812f60938b ]
+
+The Sony DualSense wireless controller (PS5) features an internal mono
+speaker, but it also provides a 3.5mm jack socket for headphone output
+and headset microphone input.
+
+Since this is a UAC1 device, it doesn't advertise any jack detection
+capability.  However, the controller is able to report HP & MIC insert
+events via HID, i.e. through a dedicated input device managed by the
+hid-playstation driver.
+
+Add a quirk to create the jack controls for headphone and headset mic,
+respectively, and setup an input handler for each of them in order to
+intercept the related hotplug events.
+
+Signed-off-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Link: https://patch.msgid.link/20250526-dualsense-alsa-jack-v1-9-1a821463b632@collabora.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/mixer_quirks.c | 263 +++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 263 insertions(+)
+
+diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
+index e5252167d6a40..95fa1c31ae550 100644
+--- a/sound/usb/mixer_quirks.c
++++ b/sound/usb/mixer_quirks.c
+@@ -16,6 +16,7 @@
+ #include <linux/hid.h>
+ #include <linux/init.h>
++#include <linux/input.h>
+ #include <linux/math64.h>
+ #include <linux/slab.h>
+ #include <linux/usb.h>
+@@ -527,6 +528,263 @@ static int snd_emu0204_controls_create(struct usb_mixer_interface *mixer)
+                                         &snd_emu0204_control, NULL);
+ }
++/*
++ * Sony DualSense controller (PS5) jack detection
++ *
++ * Since this is an UAC 1 device, it doesn't support jack detection.
++ * However, the controller hid-playstation driver reports HP & MIC
++ * insert events through a dedicated input device.
++ */
++
++#define SND_DUALSENSE_JACK_OUT_TERM_ID 3
++#define SND_DUALSENSE_JACK_IN_TERM_ID 4
++
++struct dualsense_mixer_elem_info {
++      struct usb_mixer_elem_info info;
++      struct input_handler ih;
++      struct input_device_id id_table[2];
++      bool connected;
++};
++
++static void snd_dualsense_ih_event(struct input_handle *handle,
++                                 unsigned int type, unsigned int code,
++                                 int value)
++{
++      struct dualsense_mixer_elem_info *mei;
++      struct usb_mixer_elem_list *me;
++
++      if (type != EV_SW)
++              return;
++
++      mei = container_of(handle->handler, struct dualsense_mixer_elem_info, ih);
++      me = &mei->info.head;
++
++      if ((me->id == SND_DUALSENSE_JACK_OUT_TERM_ID && code == SW_HEADPHONE_INSERT) ||
++          (me->id == SND_DUALSENSE_JACK_IN_TERM_ID && code == SW_MICROPHONE_INSERT)) {
++              mei->connected = !!value;
++              snd_ctl_notify(me->mixer->chip->card, SNDRV_CTL_EVENT_MASK_VALUE,
++                             &me->kctl->id);
++      }
++}
++
++static bool snd_dualsense_ih_match(struct input_handler *handler,
++                                 struct input_dev *dev)
++{
++      struct dualsense_mixer_elem_info *mei;
++      struct usb_device *snd_dev;
++      char *input_dev_path, *usb_dev_path;
++      size_t usb_dev_path_len;
++      bool match = false;
++
++      mei = container_of(handler, struct dualsense_mixer_elem_info, ih);
++      snd_dev = mei->info.head.mixer->chip->dev;
++
++      input_dev_path = kobject_get_path(&dev->dev.kobj, GFP_KERNEL);
++      if (!input_dev_path) {
++              dev_warn(&snd_dev->dev, "Failed to get input dev path\n");
++              return false;
++      }
++
++      usb_dev_path = kobject_get_path(&snd_dev->dev.kobj, GFP_KERNEL);
++      if (!usb_dev_path) {
++              dev_warn(&snd_dev->dev, "Failed to get USB dev path\n");
++              goto free_paths;
++      }
++
++      /*
++       * Ensure the VID:PID matched input device supposedly owned by the
++       * hid-playstation driver belongs to the actual hardware handled by
++       * the current USB audio device, which implies input_dev_path being
++       * a subpath of usb_dev_path.
++       *
++       * This verification is necessary when there is more than one identical
++       * controller attached to the host system.
++       */
++      usb_dev_path_len = strlen(usb_dev_path);
++      if (usb_dev_path_len >= strlen(input_dev_path))
++              goto free_paths;
++
++      usb_dev_path[usb_dev_path_len] = '/';
++      match = !memcmp(input_dev_path, usb_dev_path, usb_dev_path_len + 1);
++
++free_paths:
++      kfree(input_dev_path);
++      kfree(usb_dev_path);
++
++      return match;
++}
++
++static int snd_dualsense_ih_connect(struct input_handler *handler,
++                                  struct input_dev *dev,
++                                  const struct input_device_id *id)
++{
++      struct input_handle *handle;
++      int err;
++
++      handle = kzalloc(sizeof(*handle), GFP_KERNEL);
++      if (!handle)
++              return -ENOMEM;
++
++      handle->dev = dev;
++      handle->handler = handler;
++      handle->name = handler->name;
++
++      err = input_register_handle(handle);
++      if (err)
++              goto err_free;
++
++      err = input_open_device(handle);
++      if (err)
++              goto err_unregister;
++
++      return 0;
++
++err_unregister:
++      input_unregister_handle(handle);
++err_free:
++      kfree(handle);
++      return err;
++}
++
++static void snd_dualsense_ih_disconnect(struct input_handle *handle)
++{
++      input_close_device(handle);
++      input_unregister_handle(handle);
++      kfree(handle);
++}
++
++static void snd_dualsense_ih_start(struct input_handle *handle)
++{
++      struct dualsense_mixer_elem_info *mei;
++      struct usb_mixer_elem_list *me;
++      int status = -1;
++
++      mei = container_of(handle->handler, struct dualsense_mixer_elem_info, ih);
++      me = &mei->info.head;
++
++      if (me->id == SND_DUALSENSE_JACK_OUT_TERM_ID &&
++          test_bit(SW_HEADPHONE_INSERT, handle->dev->swbit))
++              status = test_bit(SW_HEADPHONE_INSERT, handle->dev->sw);
++      else if (me->id == SND_DUALSENSE_JACK_IN_TERM_ID &&
++               test_bit(SW_MICROPHONE_INSERT, handle->dev->swbit))
++              status = test_bit(SW_MICROPHONE_INSERT, handle->dev->sw);
++
++      if (status >= 0) {
++              mei->connected = !!status;
++              snd_ctl_notify(me->mixer->chip->card, SNDRV_CTL_EVENT_MASK_VALUE,
++                             &me->kctl->id);
++      }
++}
++
++static int snd_dualsense_jack_get(struct snd_kcontrol *kctl,
++                                struct snd_ctl_elem_value *ucontrol)
++{
++      struct dualsense_mixer_elem_info *mei = snd_kcontrol_chip(kctl);
++
++      ucontrol->value.integer.value[0] = mei->connected;
++
++      return 0;
++}
++
++static const struct snd_kcontrol_new snd_dualsense_jack_control = {
++      .iface = SNDRV_CTL_ELEM_IFACE_CARD,
++      .access = SNDRV_CTL_ELEM_ACCESS_READ,
++      .info = snd_ctl_boolean_mono_info,
++      .get = snd_dualsense_jack_get,
++};
++
++static int snd_dualsense_resume_jack(struct usb_mixer_elem_list *list)
++{
++      snd_ctl_notify(list->mixer->chip->card, SNDRV_CTL_EVENT_MASK_VALUE,
++                     &list->kctl->id);
++      return 0;
++}
++
++static void snd_dualsense_mixer_elem_free(struct snd_kcontrol *kctl)
++{
++      struct dualsense_mixer_elem_info *mei = snd_kcontrol_chip(kctl);
++
++      if (mei->ih.event)
++              input_unregister_handler(&mei->ih);
++
++      snd_usb_mixer_elem_free(kctl);
++}
++
++static int snd_dualsense_jack_create(struct usb_mixer_interface *mixer,
++                                   const char *name, bool is_output)
++{
++      struct dualsense_mixer_elem_info *mei;
++      struct input_device_id *idev_id;
++      struct snd_kcontrol *kctl;
++      int err;
++
++      mei = kzalloc(sizeof(*mei), GFP_KERNEL);
++      if (!mei)
++              return -ENOMEM;
++
++      snd_usb_mixer_elem_init_std(&mei->info.head, mixer,
++                                  is_output ? SND_DUALSENSE_JACK_OUT_TERM_ID :
++                                              SND_DUALSENSE_JACK_IN_TERM_ID);
++
++      mei->info.head.resume = snd_dualsense_resume_jack;
++      mei->info.val_type = USB_MIXER_BOOLEAN;
++      mei->info.channels = 1;
++      mei->info.min = 0;
++      mei->info.max = 1;
++
++      kctl = snd_ctl_new1(&snd_dualsense_jack_control, mei);
++      if (!kctl) {
++              kfree(mei);
++              return -ENOMEM;
++      }
++
++      strscpy(kctl->id.name, name, sizeof(kctl->id.name));
++      kctl->private_free = snd_dualsense_mixer_elem_free;
++
++      err = snd_usb_mixer_add_control(&mei->info.head, kctl);
++      if (err)
++              return err;
++
++      idev_id = &mei->id_table[0];
++      idev_id->flags = INPUT_DEVICE_ID_MATCH_VENDOR | INPUT_DEVICE_ID_MATCH_PRODUCT |
++                       INPUT_DEVICE_ID_MATCH_EVBIT | INPUT_DEVICE_ID_MATCH_SWBIT;
++      idev_id->vendor = USB_ID_VENDOR(mixer->chip->usb_id);
++      idev_id->product = USB_ID_PRODUCT(mixer->chip->usb_id);
++      idev_id->evbit[BIT_WORD(EV_SW)] = BIT_MASK(EV_SW);
++      if (is_output)
++              idev_id->swbit[BIT_WORD(SW_HEADPHONE_INSERT)] = BIT_MASK(SW_HEADPHONE_INSERT);
++      else
++              idev_id->swbit[BIT_WORD(SW_MICROPHONE_INSERT)] = BIT_MASK(SW_MICROPHONE_INSERT);
++
++      mei->ih.event = snd_dualsense_ih_event;
++      mei->ih.match = snd_dualsense_ih_match;
++      mei->ih.connect = snd_dualsense_ih_connect,
++      mei->ih.disconnect = snd_dualsense_ih_disconnect,
++      mei->ih.start = snd_dualsense_ih_start,
++      mei->ih.name = name;
++      mei->ih.id_table = mei->id_table;
++
++      err = input_register_handler(&mei->ih);
++      if (err) {
++              dev_warn(&mixer->chip->dev->dev,
++                       "Could not register input handler: %d\n", err);
++              mei->ih.event = NULL;
++      }
++
++      return 0;
++}
++
++static int snd_dualsense_controls_create(struct usb_mixer_interface *mixer)
++{
++      int err;
++
++      err = snd_dualsense_jack_create(mixer, "Headphone Jack", true);
++      if (err < 0)
++              return err;
++
++      return snd_dualsense_jack_create(mixer, "Headset Mic Jack", false);
++}
++
+ /* ASUS Xonar U1 / U3 controls */
+ static int snd_xonar_u1_switch_get(struct snd_kcontrol *kcontrol,
+@@ -3390,6 +3648,11 @@ int snd_usb_mixer_apply_create_quirk(struct usb_mixer_interface *mixer)
+               err = snd_emu0204_controls_create(mixer);
+               break;
++      case USB_ID(0x054c, 0x0ce6): /* Sony DualSense controller (PS5) */
++      case USB_ID(0x054c, 0x0df2): /* Sony DualSense Edge controller (PS5) */
++              err = snd_dualsense_controls_create(mixer);
++              break;
++
+       case USB_ID(0x0763, 0x2030): /* M-Audio Fast Track C400 */
+       case USB_ID(0x0763, 0x2031): /* M-Audio Fast Track C400 */
+               err = snd_c400_create_mixer(mixer);
+-- 
+2.51.0
+
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 (file)
index 0000000..571f85f
--- /dev/null
@@ -0,0 +1,73 @@
+From 067794f0ba8a4e731ac23c997e29806495c6ebf7 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 29 Aug 2025 14:40:48 +0800
+Subject: ALSA: usb-audio: Add mute TLV for playback volumes on more devices
+
+From: qaqland <anguoli@uniontech.com>
+
+[ Upstream commit 2cbe4ac193ed7172cfd825c0cc46ce4a41be4ba1 ]
+
+Applying the quirk of that, the lowest Playback mixer volume setting
+mutes the audio output, on more devices.
+
+Suggested-by: Cryolitia PukNgae <cryolitia@uniontech.com>
+Signed-off-by: qaqland <anguoli@uniontech.com>
+Link: https://patch.msgid.link/20250829-sound_quirk-v1-1-745529b44440@uniontech.com
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/quirks.c | 10 ++++++++++
+ 1 file changed, 10 insertions(+)
+
+diff --git a/sound/usb/quirks.c b/sound/usb/quirks.c
+index 5b1aa5c418999..2a862785fd939 100644
+--- a/sound/usb/quirks.c
++++ b/sound/usb/quirks.c
+@@ -2094,6 +2094,8 @@ static const struct usb_audio_quirk_flags_table quirk_flags_table[] = {
+                  QUIRK_FLAG_SET_IFACE_FIRST),
+       DEVICE_FLG(0x0556, 0x0014, /* Phoenix Audio TMX320VC */
+                  QUIRK_FLAG_GET_SAMPLE_RATE),
++      DEVICE_FLG(0x0572, 0x1b08, /* Conexant Systems (Rockwell), Inc. */
++                 QUIRK_FLAG_MIXER_MIN_MUTE),
+       DEVICE_FLG(0x0572, 0x1b09, /* Conexant Systems (Rockwell), Inc. */
+                  QUIRK_FLAG_MIXER_MIN_MUTE),
+       DEVICE_FLG(0x05a3, 0x9420, /* ELP HD USB Camera */
+@@ -2138,6 +2140,8 @@ static const struct usb_audio_quirk_flags_table quirk_flags_table[] = {
+                  QUIRK_FLAG_CTL_MSG_DELAY_1M),
+       DEVICE_FLG(0x0b0e, 0x0349, /* Jabra 550a */
+                  QUIRK_FLAG_CTL_MSG_DELAY_1M),
++      DEVICE_FLG(0x0bda, 0x498a, /* Realtek Semiconductor Corp. */
++                 QUIRK_FLAG_MIXER_MIN_MUTE),
+       DEVICE_FLG(0x0c45, 0x6340, /* Sonix HD USB Camera */
+                  QUIRK_FLAG_GET_SAMPLE_RATE),
+       DEVICE_FLG(0x0c45, 0x636b, /* Microdia JP001 USB Camera */
+@@ -2154,6 +2158,8 @@ static const struct usb_audio_quirk_flags_table quirk_flags_table[] = {
+                  QUIRK_FLAG_SHARE_MEDIA_DEVICE | QUIRK_FLAG_ALIGN_TRANSFER),
+       DEVICE_FLG(0x1101, 0x0003, /* Audioengine D1 */
+                  QUIRK_FLAG_GET_SAMPLE_RATE),
++      DEVICE_FLG(0x12d1, 0x3a07, /* Huawei Technologies Co., Ltd. */
++                 QUIRK_FLAG_MIXER_MIN_MUTE),
+       DEVICE_FLG(0x1224, 0x2a25, /* Jieli Technology USB PHY 2.0 */
+                  QUIRK_FLAG_GET_SAMPLE_RATE | QUIRK_FLAG_MIC_RES_16),
+       DEVICE_FLG(0x1395, 0x740a, /* Sennheiser DECT */
+@@ -2244,6 +2250,8 @@ static const struct usb_audio_quirk_flags_table quirk_flags_table[] = {
+                  QUIRK_FLAG_IGNORE_CTL_ERROR),
+       DEVICE_FLG(0x2912, 0x30c8, /* Audioengine D1 */
+                  QUIRK_FLAG_GET_SAMPLE_RATE),
++      DEVICE_FLG(0x2a70, 0x1881, /* OnePlus Technology (Shenzhen) Co., Ltd. BE02T */
++                 QUIRK_FLAG_MIXER_MIN_MUTE),
+       DEVICE_FLG(0x2b53, 0x0023, /* Fiero SC-01 (firmware v1.0.0 @ 48 kHz) */
+                  QUIRK_FLAG_GENERIC_IMPLICIT_FB),
+       DEVICE_FLG(0x2b53, 0x0024, /* Fiero SC-01 (firmware v1.0.0 @ 96 kHz) */
+@@ -2260,6 +2268,8 @@ static const struct usb_audio_quirk_flags_table quirk_flags_table[] = {
+                  QUIRK_FLAG_CTL_MSG_DELAY_1M),
+       DEVICE_FLG(0x30be, 0x0101, /* Schiit Hel */
+                  QUIRK_FLAG_IGNORE_CTL_ERROR),
++      DEVICE_FLG(0x339b, 0x3a07, /* Synaptics HONOR USB-C HEADSET */
++                 QUIRK_FLAG_MIXER_MIN_MUTE),
+       DEVICE_FLG(0x413c, 0xa506, /* Dell AE515 sound bar */
+                  QUIRK_FLAG_GET_SAMPLE_RATE),
+       DEVICE_FLG(0x534d, 0x0021, /* MacroSilicon MS2100/MS2106 */
+-- 
+2.51.0
+
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 (file)
index 0000000..aa1a83d
--- /dev/null
@@ -0,0 +1,38 @@
+From ddc1d108cd14502709e1583e051cdd30464a4de2 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 26 May 2025 17:07:45 +0300
+Subject: ALSA: usb-audio: Avoid multiple assignments in mixer_quirks
+
+From: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+
+[ Upstream commit 03ddd3bdb94df3edb1f2408b57cfb00b3d92a208 ]
+
+Handle report from checkpatch.pl:
+
+  CHECK: multiple assignments should be avoided
+
+Signed-off-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Link: https://patch.msgid.link/20250526-dualsense-alsa-jack-v1-6-1a821463b632@collabora.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/mixer_quirks.c | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
+index a1ab517e26b36..f91dbc9255f12 100644
+--- a/sound/usb/mixer_quirks.c
++++ b/sound/usb/mixer_quirks.c
+@@ -1734,7 +1734,8 @@ static int snd_microii_spdif_default_put(struct snd_kcontrol *kcontrol,
+       unsigned int pval, pval_old;
+       int err;
+-      pval = pval_old = kcontrol->private_value;
++      pval = kcontrol->private_value;
++      pval_old = pval;
+       pval &= 0xfffff0f0;
+       pval |= (ucontrol->value.iec958.status[1] & 0x0f) << 8;
+       pval |= (ucontrol->value.iec958.status[0] & 0x0f);
+-- 
+2.51.0
+
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 (file)
index 0000000..b0af678
--- /dev/null
@@ -0,0 +1,49 @@
+From a35ad58bbcd63d97132722391732385429f3b07b Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 12 Jun 2025 14:02:28 +0800
+Subject: ALSA: usb-audio: Convert comma to semicolon
+
+From: Chen Ni <nichen@iscas.ac.cn>
+
+[ Upstream commit 9ca30a1b007d5fefb5752428f852a2d8d7219c1c ]
+
+Replace comma between expressions with semicolons.
+
+Using a ',' in place of a ';' can have unintended side effects.
+Although that is not the case here, it is seems best to use ';'
+unless ',' is intended.
+
+Found by inspection.
+No functional change intended.
+Compile tested only.
+
+Fixes: 79d561c4ec04 ("ALSA: usb-audio: Add mixer quirk for Sony DualSense PS5")
+Signed-off-by: Chen Ni <nichen@iscas.ac.cn>
+Reviewed-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+Link: https://patch.msgid.link/20250612060228.1518028-1-nichen@iscas.ac.cn
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/mixer_quirks.c | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
+index 95fa1c31ae550..f1b663a05f295 100644
+--- a/sound/usb/mixer_quirks.c
++++ b/sound/usb/mixer_quirks.c
+@@ -758,9 +758,9 @@ static int snd_dualsense_jack_create(struct usb_mixer_interface *mixer,
+       mei->ih.event = snd_dualsense_ih_event;
+       mei->ih.match = snd_dualsense_ih_match;
+-      mei->ih.connect = snd_dualsense_ih_connect,
+-      mei->ih.disconnect = snd_dualsense_ih_disconnect,
+-      mei->ih.start = snd_dualsense_ih_start,
++      mei->ih.connect = snd_dualsense_ih_connect;
++      mei->ih.disconnect = snd_dualsense_ih_disconnect;
++      mei->ih.start = snd_dualsense_ih_start;
+       mei->ih.name = name;
+       mei->ih.id_table = mei->id_table;
+-- 
+2.51.0
+
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 (file)
index 0000000..df3b30f
--- /dev/null
@@ -0,0 +1,49 @@
+From 43af9b5123efff5f9713e44766b9c0e7eefcc4a1 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 26 May 2025 17:07:44 +0300
+Subject: ALSA: usb-audio: Drop unnecessary parentheses in mixer_quirks
+
+From: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+
+[ Upstream commit c0495cef8b43ad61efbd4019e3573742e0e63c67 ]
+
+Fix multiple 'CHECK: Unnecessary parentheses around ...' reports from
+checkpatch.pl.
+
+Signed-off-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Link: https://patch.msgid.link/20250526-dualsense-alsa-jack-v1-5-1a821463b632@collabora.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/mixer_quirks.c | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
+index 4ce470e291b25..a1ab517e26b36 100644
+--- a/sound/usb/mixer_quirks.c
++++ b/sound/usb/mixer_quirks.c
+@@ -376,10 +376,10 @@ static int snd_audigy2nx_controls_create(struct usb_mixer_interface *mixer)
+               struct snd_kcontrol_new knew;
+               /* USB X-Fi S51 doesn't have a CMSS LED */
+-              if ((mixer->chip->usb_id == USB_ID(0x041e, 0x3042)) && i == 0)
++              if (mixer->chip->usb_id == USB_ID(0x041e, 0x3042) && i == 0)
+                       continue;
+               /* USB X-Fi S51 Pro doesn't have one either */
+-              if ((mixer->chip->usb_id == USB_ID(0x041e, 0x30df)) && i == 0)
++              if (mixer->chip->usb_id == USB_ID(0x041e, 0x30df) && i == 0)
+                       continue;
+               if (i > 1 && /* Live24ext has 2 LEDs only */
+                       (mixer->chip->usb_id == USB_ID(0x041e, 0x3040) ||
+@@ -3272,7 +3272,7 @@ static int snd_djm_controls_update(struct usb_mixer_interface *mixer,
+       int err;
+       const struct snd_djm_device *device = &snd_djm_devices[device_idx];
+-      if ((group >= device->ncontrols) || value >= device->controls[group].noptions)
++      if (group >= device->ncontrols || value >= device->controls[group].noptions)
+               return -EINVAL;
+       err = snd_usb_lock_shutdown(mixer->chip);
+-- 
+2.51.0
+
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 (file)
index 0000000..bd07359
--- /dev/null
@@ -0,0 +1,49 @@
+From c34c9eb1031578b4ab613bbc8be72fd4d942465e Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 26 May 2025 17:07:43 +0300
+Subject: ALSA: usb-audio: Fix block comments in mixer_quirks
+
+From: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+
+[ Upstream commit 231225d8a20f8668b4fd6601d54a2fac0e0ab7a5 ]
+
+Address a couple of comment formatting issues indicated by
+checkpatch.pl:
+
+  WARNING: Block comments use a trailing */ on a separate line
+
+Signed-off-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Link: https://patch.msgid.link/20250526-dualsense-alsa-jack-v1-4-1a821463b632@collabora.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/mixer_quirks.c | 6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
+
+diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
+index 68c82e344d3ba..4ce470e291b25 100644
+--- a/sound/usb/mixer_quirks.c
++++ b/sound/usb/mixer_quirks.c
+@@ -76,7 +76,8 @@ static int snd_create_std_mono_ctl_offset(struct usb_mixer_interface *mixer,
+       cval->idx_off = idx_off;
+       /* get_min_max() is called only for integer volumes later,
+-       * so provide a short-cut for booleans */
++       * so provide a short-cut for booleans
++       */
+       cval->min = 0;
+       cval->max = 1;
+       cval->res = 0;
+@@ -3546,7 +3547,8 @@ static void snd_dragonfly_quirk_db_scale(struct usb_mixer_interface *mixer,
+                                        struct snd_kcontrol *kctl)
+ {
+       /* Approximation using 10 ranges based on output measurement on hw v1.2.
+-       * This seems close to the cubic mapping e.g. alsamixer uses. */
++       * This seems close to the cubic mapping e.g. alsamixer uses.
++       */
+       static const DECLARE_TLV_DB_RANGE(scale,
+                0,  1, TLV_DB_MINMAX_ITEM(-5300, -4970),
+                2,  5, TLV_DB_MINMAX_ITEM(-4710, -4160),
+-- 
+2.51.0
+
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 (file)
index 0000000..0b08275
--- /dev/null
@@ -0,0 +1,61 @@
+From 26a701f863b3041c0d9c676d992922d90250f89c Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 13 Jun 2025 10:15:30 +0200
+Subject: ALSA: usb-audio: Fix build with CONFIG_INPUT=n
+
+From: Takashi Iwai <tiwai@suse.de>
+
+[ Upstream commit d0630a0b80c08530857146e3bf183a7d6b743847 ]
+
+The recent addition of DualSense mixer quirk relies on the input
+device handle, and the build can fail if CONFIG_INPUT isn't set.
+Put (rather ugly) workarounds to wrap with IS_REACHABLE() for avoiding
+the build error.
+
+Fixes: 79d561c4ec04 ("ALSA: usb-audio: Add mixer quirk for Sony DualSense PS5")
+Reported-by: kernel test robot <lkp@intel.com>
+Closes: https://lore.kernel.org/oe-kbuild-all/202506130733.gnPKw2l3-lkp@intel.com/
+Reviewed-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+Link: https://patch.msgid.link/20250613081543.7404-1-tiwai@suse.de
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/mixer_quirks.c | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
+index f1b663a05f295..8c0b8383abe1e 100644
+--- a/sound/usb/mixer_quirks.c
++++ b/sound/usb/mixer_quirks.c
+@@ -528,6 +528,7 @@ static int snd_emu0204_controls_create(struct usb_mixer_interface *mixer)
+                                         &snd_emu0204_control, NULL);
+ }
++#if IS_REACHABLE(CONFIG_INPUT)
+ /*
+  * Sony DualSense controller (PS5) jack detection
+  *
+@@ -784,6 +785,7 @@ static int snd_dualsense_controls_create(struct usb_mixer_interface *mixer)
+       return snd_dualsense_jack_create(mixer, "Headset Mic Jack", false);
+ }
++#endif /* IS_REACHABLE(CONFIG_INPUT) */
+ /* ASUS Xonar U1 / U3 controls */
+@@ -3648,10 +3650,12 @@ int snd_usb_mixer_apply_create_quirk(struct usb_mixer_interface *mixer)
+               err = snd_emu0204_controls_create(mixer);
+               break;
++#if IS_REACHABLE(CONFIG_INPUT)
+       case USB_ID(0x054c, 0x0ce6): /* Sony DualSense controller (PS5) */
+       case USB_ID(0x054c, 0x0df2): /* Sony DualSense Edge controller (PS5) */
+               err = snd_dualsense_controls_create(mixer);
+               break;
++#endif /* IS_REACHABLE(CONFIG_INPUT) */
+       case USB_ID(0x0763, 0x2030): /* M-Audio Fast Track C400 */
+       case USB_ID(0x0763, 0x2031): /* M-Audio Fast Track C400 */
+-- 
+2.51.0
+
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 (file)
index 0000000..e4c04a7
--- /dev/null
@@ -0,0 +1,123 @@
+From ce09659ac8c11712d9c52325ca5d71a1652f8da0 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 27 Aug 2025 11:29:02 +0800
+Subject: ALSA: usb-audio: move mixer_quirks' min_mute into common quirk
+
+From: Cryolitia PukNgae <cryolitia@uniontech.com>
+
+[ Upstream commit 2c3ca8cc55a3afc7a4fa99ed8f5f5d05dd2e65b3 ]
+
+We have found more and more devices that have the same problem, that
+the mixer's minimum value is muted. Accroding to pipewire's MR[1]
+and Arch Linux wiki[2], this should be a very common problem in USB
+audio devices. Move the quirk into common quirk,as a preparation of
+more devices' quirk's patch coming on the road[3].
+
+1. https://gitlab.freedesktop.org/pipewire/pipewire/-/merge_requests/2514
+2. https://wiki.archlinux.org/index.php?title=PipeWire&oldid=804138#No_sound_from_USB_DAC_until_30%_volume
+3. On the road, in the physical sense. We have been buying ton of
+   these devices for testing the problem.
+
+Tested-by: Guoli An <anguoli@uniontech.com>
+Signed-off-by: Cryolitia PukNgae <cryolitia@uniontech.com>
+Link: https://patch.msgid.link/20250827-sound-quirk-min-mute-v1-1-4717aa8a4f6a@uniontech.com
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/mixer_quirks.c | 10 +++-------
+ sound/usb/quirks.c       | 12 ++++++++++--
+ sound/usb/usbaudio.h     |  4 ++++
+ 3 files changed, 17 insertions(+), 9 deletions(-)
+
+diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
+index 8c0b8383abe1e..270a0be672b7e 100644
+--- a/sound/usb/mixer_quirks.c
++++ b/sound/usb/mixer_quirks.c
+@@ -3899,16 +3899,12 @@ void snd_usb_mixer_fu_apply_quirk(struct usb_mixer_interface *mixer,
+               if (unitid == 7 && cval->control == UAC_FU_VOLUME)
+                       snd_dragonfly_quirk_db_scale(mixer, cval, kctl);
+               break;
++      }
++
+       /* lowest playback value is muted on some devices */
+-      case USB_ID(0x0572, 0x1b09): /* Conexant Systems (Rockwell), Inc. */
+-      case USB_ID(0x0d8c, 0x000c): /* C-Media */
+-      case USB_ID(0x0d8c, 0x0014): /* C-Media */
+-      case USB_ID(0x19f7, 0x0003): /* RODE NT-USB */
+-      case USB_ID(0x2d99, 0x0026): /* HECATE G2 GAMING HEADSET */
++      if (mixer->chip->quirk_flags & QUIRK_FLAG_MIXER_MIN_MUTE)
+               if (strstr(kctl->id.name, "Playback"))
+                       cval->min_mute = 1;
+-              break;
+-      }
+       /* ALSA-ify some Plantronics headset control names */
+       if (USB_ID_VENDOR(mixer->chip->usb_id) == 0x047f &&
+diff --git a/sound/usb/quirks.c b/sound/usb/quirks.c
+index d4f4466b028c8..5b1aa5c418999 100644
+--- a/sound/usb/quirks.c
++++ b/sound/usb/quirks.c
+@@ -2094,6 +2094,8 @@ static const struct usb_audio_quirk_flags_table quirk_flags_table[] = {
+                  QUIRK_FLAG_SET_IFACE_FIRST),
+       DEVICE_FLG(0x0556, 0x0014, /* Phoenix Audio TMX320VC */
+                  QUIRK_FLAG_GET_SAMPLE_RATE),
++      DEVICE_FLG(0x0572, 0x1b09, /* Conexant Systems (Rockwell), Inc. */
++                 QUIRK_FLAG_MIXER_MIN_MUTE),
+       DEVICE_FLG(0x05a3, 0x9420, /* ELP HD USB Camera */
+                  QUIRK_FLAG_GET_SAMPLE_RATE),
+       DEVICE_FLG(0x05a7, 0x1020, /* Bose Companion 5 */
+@@ -2140,8 +2142,10 @@ static const struct usb_audio_quirk_flags_table quirk_flags_table[] = {
+                  QUIRK_FLAG_GET_SAMPLE_RATE),
+       DEVICE_FLG(0x0c45, 0x636b, /* Microdia JP001 USB Camera */
+                  QUIRK_FLAG_GET_SAMPLE_RATE),
+-      DEVICE_FLG(0x0d8c, 0x0014, /* USB Audio Device */
+-                 QUIRK_FLAG_CTL_MSG_DELAY_1M),
++      DEVICE_FLG(0x0d8c, 0x000c, /* C-Media */
++                 QUIRK_FLAG_MIXER_MIN_MUTE),
++      DEVICE_FLG(0x0d8c, 0x0014, /* C-Media */
++                 QUIRK_FLAG_CTL_MSG_DELAY_1M | QUIRK_FLAG_MIXER_MIN_MUTE),
+       DEVICE_FLG(0x0ecb, 0x205c, /* JBL Quantum610 Wireless */
+                  QUIRK_FLAG_FIXED_RATE),
+       DEVICE_FLG(0x0ecb, 0x2069, /* JBL Quantum810 Wireless */
+@@ -2188,6 +2192,8 @@ static const struct usb_audio_quirk_flags_table quirk_flags_table[] = {
+                  QUIRK_FLAG_ITF_USB_DSD_DAC | QUIRK_FLAG_CTL_MSG_DELAY),
+       DEVICE_FLG(0x1901, 0x0191, /* GE B850V3 CP2114 audio interface */
+                  QUIRK_FLAG_GET_SAMPLE_RATE),
++      DEVICE_FLG(0x19f7, 0x0003, /* RODE NT-USB */
++                 QUIRK_FLAG_MIXER_MIN_MUTE),
+       DEVICE_FLG(0x19f7, 0x0035, /* RODE NT-USB+ */
+                  QUIRK_FLAG_GET_SAMPLE_RATE),
+       DEVICE_FLG(0x1bcf, 0x2281, /* HD Webcam */
+@@ -2248,6 +2254,8 @@ static const struct usb_audio_quirk_flags_table quirk_flags_table[] = {
+                  QUIRK_FLAG_CTL_MSG_DELAY_1M),
+       DEVICE_FLG(0x2d95, 0x8021, /* VIVO USB-C-XE710 HEADSET */
+                  QUIRK_FLAG_CTL_MSG_DELAY_1M),
++      DEVICE_FLG(0x2d99, 0x0026, /* HECATE G2 GAMING HEADSET */
++                 QUIRK_FLAG_MIXER_MIN_MUTE),
+       DEVICE_FLG(0x2fc6, 0xf0b7, /* iBasso DC07 Pro */
+                  QUIRK_FLAG_CTL_MSG_DELAY_1M),
+       DEVICE_FLG(0x30be, 0x0101, /* Schiit Hel */
+diff --git a/sound/usb/usbaudio.h b/sound/usb/usbaudio.h
+index 65dcb1a02e976..17db6a7f3a844 100644
+--- a/sound/usb/usbaudio.h
++++ b/sound/usb/usbaudio.h
+@@ -180,6 +180,9 @@ extern bool snd_usb_skip_validation;
+  *  for the given endpoint.
+  * QUIRK_FLAG_MIC_RES_16 and QUIRK_FLAG_MIC_RES_384
+  *  Set the fixed resolution for Mic Capture Volume (mostly for webcams)
++ * QUIRK_FLAG_MIXER_MIN_MUTE
++ *  Set minimum volume control value as mute for devices where the lowest
++ *  playback value represents muted state instead of minimum audible volume
+  */
+ #define QUIRK_FLAG_GET_SAMPLE_RATE    (1U << 0)
+@@ -206,5 +209,6 @@ extern bool snd_usb_skip_validation;
+ #define QUIRK_FLAG_FIXED_RATE         (1U << 21)
+ #define QUIRK_FLAG_MIC_RES_16         (1U << 22)
+ #define QUIRK_FLAG_MIC_RES_384                (1U << 23)
++#define QUIRK_FLAG_MIXER_MIN_MUTE     (1U << 24)
+ #endif /* __USBAUDIO_H */
+-- 
+2.51.0
+
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 (file)
index 0000000..45b17b4
--- /dev/null
@@ -0,0 +1,46 @@
+From 38979066db6025a003832a425605e769086f2044 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 26 May 2025 17:07:47 +0300
+Subject: ALSA: usb-audio: Remove unneeded wmb() in mixer_quirks
+
+From: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+
+[ Upstream commit 9cea7425595697802e8d55a322a251999554b8b1 ]
+
+Adding a memory barrier before wake_up() in
+snd_usb_soundblaster_remote_complete() is supposed to ensure the write
+to mixer->rc_code is visible in wait_event_interruptible() from
+snd_usb_sbrc_hwdep_read().
+
+However, this is not really necessary, since wake_up() is just a wrapper
+over __wake_up() which already executes a full memory barrier before
+accessing the state of the task to be waken up.
+
+Drop the redundant call to wmb() and implicitly fix the checkpatch
+complaint:
+
+  WARNING: memory barrier without comment
+
+Signed-off-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Link: https://patch.msgid.link/20250526-dualsense-alsa-jack-v1-8-1a821463b632@collabora.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/mixer_quirks.c | 1 -
+ 1 file changed, 1 deletion(-)
+
+diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
+index 9a5e8c47ce0d2..e5252167d6a40 100644
+--- a/sound/usb/mixer_quirks.c
++++ b/sound/usb/mixer_quirks.c
+@@ -208,7 +208,6 @@ static void snd_usb_soundblaster_remote_complete(struct urb *urb)
+       if (code == rc->mute_code)
+               snd_usb_mixer_notify_id(mixer, rc->mute_mixer_id);
+       mixer->rc_code = code;
+-      wmb();
+       wake_up(&mixer->rc_waitq);
+ }
+-- 
+2.51.0
+
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 (file)
index 0000000..a01f0d5
--- /dev/null
@@ -0,0 +1,37 @@
+From 7c3f52358c57afbbb4c0759fd1d27969d5c7a494 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 26 May 2025 17:07:46 +0300
+Subject: ALSA: usb-audio: Simplify NULL comparison in mixer_quirks
+
+From: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+
+[ Upstream commit f2d6d660e8fd5f4467e80743f82119201e67fa9c ]
+
+Handle report from checkpatch.pl:
+
+  CHECK: Comparison to NULL could be written "t->name"
+
+Signed-off-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Link: https://patch.msgid.link/20250526-dualsense-alsa-jack-v1-7-1a821463b632@collabora.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/mixer_quirks.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
+index f91dbc9255f12..9a5e8c47ce0d2 100644
+--- a/sound/usb/mixer_quirks.c
++++ b/sound/usb/mixer_quirks.c
+@@ -126,7 +126,7 @@ static int snd_create_std_mono_table(struct usb_mixer_interface *mixer,
+ {
+       int err;
+-      while (t->name != NULL) {
++      while (t->name) {
+               err = snd_create_std_mono_ctl(mixer, t->unitid, t->control,
+                               t->cmask, t->val_type, t->name, t->tlv_callback);
+               if (err < 0)
+-- 
+2.51.0
+
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 (file)
index 0000000..cd501a6
--- /dev/null
@@ -0,0 +1,39 @@
+From bbb4ab1d7b1ad7fff7a85aa9144d0edc5a70bacc Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sat, 20 Sep 2025 11:51:48 +0900
+Subject: firewire: core: fix overlooked update of subsystem ABI version
+
+From: Takashi Sakamoto <o-takashi@sakamocchi.jp>
+
+[ Upstream commit 853a57ba263adfecf4430b936d6862bc475b4bb5 ]
+
+In kernel v6.5, several functions were added to the cdev layer. This
+required updating the default version of subsystem ABI up to 6, but
+this requirement was overlooked.
+
+This commit updates the version accordingly.
+
+Fixes: 6add87e9764d ("firewire: cdev: add new version of ABI to notify time stamp at request/response subaction of transaction#")
+Link: https://lore.kernel.org/r/20250920025148.163402-1-o-takashi@sakamocchi.jp
+Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/firewire/core-cdev.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/firewire/core-cdev.c b/drivers/firewire/core-cdev.c
+index 958aa4662ccb0..5cb0059f57e6b 100644
+--- a/drivers/firewire/core-cdev.c
++++ b/drivers/firewire/core-cdev.c
+@@ -39,7 +39,7 @@
+ /*
+  * ABI version history is documented in linux/firewire-cdev.h.
+  */
+-#define FW_CDEV_KERNEL_VERSION                        5
++#define FW_CDEV_KERNEL_VERSION                        6
+ #define FW_CDEV_VERSION_EVENT_REQUEST2                4
+ #define FW_CDEV_VERSION_ALLOCATE_REGION_END   4
+ #define FW_CDEV_VERSION_AUTO_FLUSH_ISO_OVERFLOW       5
+-- 
+2.51.0
+
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 (file)
index 0000000..717e9a1
--- /dev/null
@@ -0,0 +1,75 @@
+From 5afe8201f82e93e444ae5810da5d51e6c2a89f89 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 27 May 2025 22:13:13 +0530
+Subject: HID: multitouch: Get the contact ID from HID_DG_TRANSDUCER_INDEX
+ fields in case of Apple Touch Bar
+
+From: Kerem Karabay <kekrby@gmail.com>
+
+[ Upstream commit f41d736acc039d86512951f4e874b0f5e666babf ]
+
+In Apple Touch Bar, the contact ID is contained in fields with the
+HID_DG_TRANSDUCER_INDEX usage rather than HID_DG_CONTACTID, thus differing
+from the HID spec. Add a quirk for the same.
+
+Acked-by: Benjamin Tissoires <bentiss@kernel.org>
+Signed-off-by: Kerem Karabay <kekrby@gmail.com>
+Co-developed-by: Aditya Garg <gargaditya08@live.com>
+Signed-off-by: Aditya Garg <gargaditya08@live.com>
+Signed-off-by: Jiri Kosina <jkosina@suse.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/hid/hid-multitouch.c | 16 +++++++++++++++-
+ 1 file changed, 15 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/hid/hid-multitouch.c b/drivers/hid/hid-multitouch.c
+index a85581cd511fd..35426e702b301 100644
+--- a/drivers/hid/hid-multitouch.c
++++ b/drivers/hid/hid-multitouch.c
+@@ -72,6 +72,7 @@ MODULE_LICENSE("GPL");
+ #define MT_QUIRK_FORCE_MULTI_INPUT    BIT(20)
+ #define MT_QUIRK_DISABLE_WAKEUP               BIT(21)
+ #define MT_QUIRK_ORIENTATION_INVERT   BIT(22)
++#define MT_QUIRK_APPLE_TOUCHBAR               BIT(23)
+ #define MT_INPUTMODE_TOUCHSCREEN      0x02
+ #define MT_INPUTMODE_TOUCHPAD         0x03
+@@ -612,6 +613,7 @@ static struct mt_application *mt_find_application(struct mt_device *td,
+ static struct mt_report_data *mt_allocate_report_data(struct mt_device *td,
+                                                     struct hid_report *report)
+ {
++      struct mt_class *cls = &td->mtclass;
+       struct mt_report_data *rdata;
+       struct hid_field *field;
+       int r, n;
+@@ -636,7 +638,11 @@ static struct mt_report_data *mt_allocate_report_data(struct mt_device *td,
+               if (field->logical == HID_DG_FINGER || td->hdev->group != HID_GROUP_MULTITOUCH_WIN_8) {
+                       for (n = 0; n < field->report_count; n++) {
+-                              if (field->usage[n].hid == HID_DG_CONTACTID) {
++                              unsigned int hid = field->usage[n].hid;
++
++                              if (hid == HID_DG_CONTACTID ||
++                                 (cls->quirks & MT_QUIRK_APPLE_TOUCHBAR &&
++                                 hid == HID_DG_TRANSDUCER_INDEX)) {
+                                       rdata->is_mt_collection = true;
+                                       break;
+                               }
+@@ -814,6 +820,14 @@ static int mt_touch_input_mapping(struct hid_device *hdev, struct hid_input *hi,
+                                                    EV_KEY, BTN_TOUCH);
+                       MT_STORE_FIELD(tip_state);
+                       return 1;
++              case HID_DG_TRANSDUCER_INDEX:
++                      /*
++                       * Contact ID in case of Apple Touch Bars is contained
++                       * in fields with HID_DG_TRANSDUCER_INDEX usage.
++                       */
++                      if (!(cls->quirks & MT_QUIRK_APPLE_TOUCHBAR))
++                              return 0;
++                      fallthrough;
+               case HID_DG_CONTACTID:
+                       MT_STORE_FIELD(contactid);
+                       app->touches_by_report++;
+-- 
+2.51.0
+
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 (file)
index 0000000..822d7f3
--- /dev/null
@@ -0,0 +1,45 @@
+From f65f5948ad5665603d29403da0e42e876265c97b Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 27 May 2025 22:13:16 +0530
+Subject: HID: multitouch: specify that Apple Touch Bar is direct
+
+From: Kerem Karabay <kekrby@gmail.com>
+
+[ Upstream commit 45ca23c5ee8b2b3074377fecc92fa72aa595f7c9 ]
+
+Currently the driver determines the device type based on the
+application, but this value is not reliable on Apple Touch Bar, where
+the application is HID_DG_TOUCHPAD even though this device is direct,
+so add a quirk for the same.
+
+Acked-by: Benjamin Tissoires <bentiss@kernel.org>
+Signed-off-by: Kerem Karabay <kekrby@gmail.com>
+Co-developed-by: Aditya Garg <gargaditya08@live.com>
+Signed-off-by: Aditya Garg <gargaditya08@live.com>
+Signed-off-by: Jiri Kosina <jkosina@suse.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/hid/hid-multitouch.c | 7 +++++++
+ 1 file changed, 7 insertions(+)
+
+diff --git a/drivers/hid/hid-multitouch.c b/drivers/hid/hid-multitouch.c
+index 8e9f71e69dd8c..d8fee341c096e 100644
+--- a/drivers/hid/hid-multitouch.c
++++ b/drivers/hid/hid-multitouch.c
+@@ -1336,6 +1336,13 @@ static int mt_touch_input_configured(struct hid_device *hdev,
+       if (td->serial_maybe)
+               mt_post_parse_default_settings(td, app);
++      /*
++       * The application for Apple Touch Bars is HID_DG_TOUCHPAD,
++       * but these devices are direct.
++       */
++      if (cls->quirks & MT_QUIRK_APPLE_TOUCHBAR)
++              app->mt_flags |= INPUT_MT_DIRECT;
++
+       if (cls->is_indirect)
+               app->mt_flags |= INPUT_MT_POINTER;
+-- 
+2.51.0
+
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 (file)
index 0000000..44d122b
--- /dev/null
@@ -0,0 +1,61 @@
+From 71e885c6131bb4ef7c6a94c64ab3ecac2e6b88c6 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 27 May 2025 22:13:14 +0530
+Subject: HID: multitouch: support getting the tip state from HID_DG_TOUCH
+ fields in Apple Touch Bar
+
+From: Kerem Karabay <kekrby@gmail.com>
+
+[ Upstream commit e0976a61a543b5e03bc0d08030a0ea036ee3751d ]
+
+In Apple Touch Bar, the tip state is contained in fields with the
+HID_DG_TOUCH usage. This feature is gated by a quirk in order to
+prevent breaking other devices, see commit c2ef8f21ea8f
+("HID: multitouch: add support for trackpads").
+
+Acked-by: Benjamin Tissoires <bentiss@kernel.org>
+Signed-off-by: Kerem Karabay <kekrby@gmail.com>
+Co-developed-by: Aditya Garg <gargaditya08@live.com>
+Signed-off-by: Aditya Garg <gargaditya08@live.com>
+Signed-off-by: Jiri Kosina <jkosina@suse.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/hid/hid-multitouch.c | 15 +++++++++++----
+ 1 file changed, 11 insertions(+), 4 deletions(-)
+
+diff --git a/drivers/hid/hid-multitouch.c b/drivers/hid/hid-multitouch.c
+index 35426e702b301..d0b2e866dadaf 100644
+--- a/drivers/hid/hid-multitouch.c
++++ b/drivers/hid/hid-multitouch.c
+@@ -814,6 +814,17 @@ static int mt_touch_input_mapping(struct hid_device *hdev, struct hid_input *hi,
+                       MT_STORE_FIELD(confidence_state);
+                       return 1;
++              case HID_DG_TOUCH:
++                      /*
++                       * Legacy devices use TIPSWITCH and not TOUCH.
++                       * One special case here is of the Apple Touch Bars.
++                       * In these devices, the tip state is contained in
++                       * fields with the HID_DG_TOUCH usage.
++                       * Let's just ignore this field for other devices.
++                       */
++                      if (!(cls->quirks & MT_QUIRK_APPLE_TOUCHBAR))
++                              return -1;
++                      fallthrough;
+               case HID_DG_TIPSWITCH:
+                       if (field->application != HID_GD_SYSTEM_MULTIAXIS)
+                               input_set_capability(hi->input,
+@@ -884,10 +895,6 @@ static int mt_touch_input_mapping(struct hid_device *hdev, struct hid_input *hi,
+               case HID_DG_CONTACTMAX:
+                       /* contact max are global to the report */
+                       return -1;
+-              case HID_DG_TOUCH:
+-                      /* Legacy devices use TIPSWITCH and not TOUCH.
+-                       * Let's just ignore this field. */
+-                      return -1;
+               }
+               /* let hid-input decide for the others */
+               return 0;
+-- 
+2.51.0
+
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 (file)
index 0000000..03445ec
--- /dev/null
@@ -0,0 +1,44 @@
+From 22fc5906200564aa090085ab193d4808aec35152 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 27 May 2025 22:13:15 +0530
+Subject: HID: multitouch: take cls->maxcontacts into account for Apple Touch
+ Bar even without a HID_DG_CONTACTMAX field
+
+From: Kerem Karabay <kekrby@gmail.com>
+
+[ Upstream commit 7dfe48bdc9d38db46283f2e0281bc1626277b8bf ]
+
+In Apple Touch Bar, the HID_DG_CONTACTMAX is not present, but the maximum
+contact count is still greater than the default. Add quirks for the same.
+
+Acked-by: Benjamin Tissoires <bentiss@kernel.org>
+Signed-off-by: Kerem Karabay <kekrby@gmail.com>
+Co-developed-by: Aditya Garg <gargaditya08@live.com>
+Signed-off-by: Aditya Garg <gargaditya08@live.com>
+Signed-off-by: Jiri Kosina <jkosina@suse.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/hid/hid-multitouch.c | 7 +++++++
+ 1 file changed, 7 insertions(+)
+
+diff --git a/drivers/hid/hid-multitouch.c b/drivers/hid/hid-multitouch.c
+index d0b2e866dadaf..8e9f71e69dd8c 100644
+--- a/drivers/hid/hid-multitouch.c
++++ b/drivers/hid/hid-multitouch.c
+@@ -1322,6 +1322,13 @@ static int mt_touch_input_configured(struct hid_device *hdev,
+       struct input_dev *input = hi->input;
+       int ret;
++      /*
++       * HID_DG_CONTACTMAX field is not present on Apple Touch Bars,
++       * but the maximum contact count is greater than the default.
++       */
++      if (cls->quirks & MT_QUIRK_APPLE_TOUCHBAR && cls->maxcontacts)
++              td->maxcontacts = cls->maxcontacts;
++
+       if (!td->maxcontacts)
+               td->maxcontacts = MT_DEFAULT_MAXCONTACT;
+-- 
+2.51.0
+
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 (file)
index 0000000..ab499bc
--- /dev/null
@@ -0,0 +1,50 @@
+From ae7825d03c4c1d44697f581afae759af7a521fb8 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 13 Aug 2025 15:43:20 +0300
+Subject: IB/mlx5: Fix obj_type mismatch for SRQ event subscriptions
+
+From: Or Har-Toov <ohartoov@nvidia.com>
+
+[ Upstream commit 85fe9f565d2d5af95ac2bbaa5082b8ce62b039f5 ]
+
+Fix a bug where the driver's event subscription logic for SRQ-related
+events incorrectly sets obj_type for RMP objects.
+
+When subscribing to SRQ events, get_legacy_obj_type() did not handle
+the MLX5_CMD_OP_CREATE_RMP case, which caused obj_type to be 0
+(default).
+This led to a mismatch between the obj_type used during subscription
+(0) and the value used during notification (1, taken from the event's
+type field). As a result, event mapping for SRQ objects could fail and
+event notification would not be delivered correctly.
+
+This fix adds handling for MLX5_CMD_OP_CREATE_RMP in get_legacy_obj_type,
+returning MLX5_EVENT_QUEUE_TYPE_RQ so obj_type is consistent between
+subscription and notification.
+
+Fixes: 759738537142 ("IB/mlx5: Enable subscription for device events over DEVX")
+Link: https://patch.msgid.link/r/8f1048e3fdd1fde6b90607ce0ed251afaf8a148c.1755088962.git.leon@kernel.org
+Signed-off-by: Or Har-Toov <ohartoov@nvidia.com>
+Reviewed-by: Edward Srouji <edwards@nvidia.com>
+Signed-off-by: Leon Romanovsky <leonro@nvidia.com>
+Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/infiniband/hw/mlx5/devx.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/drivers/infiniband/hw/mlx5/devx.c b/drivers/infiniband/hw/mlx5/devx.c
+index cc126e62643a0..80c26551564fb 100644
+--- a/drivers/infiniband/hw/mlx5/devx.c
++++ b/drivers/infiniband/hw/mlx5/devx.c
+@@ -191,6 +191,7 @@ static u16 get_legacy_obj_type(u16 opcode)
+ {
+       switch (opcode) {
+       case MLX5_CMD_OP_CREATE_RQ:
++      case MLX5_CMD_OP_CREATE_RMP:
+               return MLX5_EVENT_QUEUE_TYPE_RQ;
+       case MLX5_CMD_OP_CREATE_QP:
+               return MLX5_EVENT_QUEUE_TYPE_QP;
+-- 
+2.51.0
+
diff --git a/queue-6.1/series b/queue-6.1/series
new file mode 100644 (file)
index 0000000..a38e88d
--- /dev/null
@@ -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 (file)
index 0000000..6bbb4ee
--- /dev/null
@@ -0,0 +1,36 @@
+From 50fc8faaee16759f5d09b39584bf59909eff37d4 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 3 Jun 2025 15:10:45 +0800
+Subject: usb: core: Add 0x prefix to quirks debug output
+
+From: Jiayi Li <lijiayi@kylinos.cn>
+
+[ Upstream commit 47c428fce0b41b15ab321d8ede871f780ccd038f ]
+
+Use "0x%x" format for quirks debug print to clarify it's a hexadecimal
+value. Improves readability and consistency with other hex outputs.
+
+Signed-off-by: Jiayi Li <lijiayi@kylinos.cn>
+Link: https://lore.kernel.org/r/20250603071045.3243699-1-lijiayi@kylinos.cn
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/usb/core/quirks.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/usb/core/quirks.c b/drivers/usb/core/quirks.c
+index bfd97cad8aa4d..c0fd8ab3fe8fc 100644
+--- a/drivers/usb/core/quirks.c
++++ b/drivers/usb/core/quirks.c
+@@ -734,7 +734,7 @@ void usb_detect_quirks(struct usb_device *udev)
+       udev->quirks ^= usb_detect_dynamic_quirks(udev);
+       if (udev->quirks)
+-              dev_dbg(&udev->dev, "USB quirks for this device: %x\n",
++              dev_dbg(&udev->dev, "USB quirks for this device: 0x%x\n",
+                       udev->quirks);
+ #ifdef CONFIG_USB_DEFAULT_PERSIST
+-- 
+2.51.0
+
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 (file)
index 0000000..375c0f0
--- /dev/null
@@ -0,0 +1,68 @@
+From 5d3c20a087e7efd77ea6d286e8c2dc44e40a1909 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 12 Jun 2025 17:00:23 +0100
+Subject: ALSA: hda/realtek: Add support for ASUS NUC using CS35L41 HDA
+
+From: Stefan Binding <sbinding@opensource.cirrus.com>
+
+[ Upstream commit 84fc8896f0d9d1c075e0e08a416faedbd73907fa ]
+
+Add support for ASUS NUC14LNS.
+
+This NUC uses a single CS35L41 Amp in using Internal Boost with SPI.
+To support the Single Amp, a new quirk is required.
+
+Signed-off-by: Stefan Binding <sbinding@opensource.cirrus.com>
+Link: https://patch.msgid.link/20250612160029.848104-3-sbinding@opensource.cirrus.com
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/pci/hda/patch_realtek.c | 11 +++++++++++
+ 1 file changed, 11 insertions(+)
+
+diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c
+index 5f061d2d9fc96..a41df821e15f7 100644
+--- a/sound/pci/hda/patch_realtek.c
++++ b/sound/pci/hda/patch_realtek.c
+@@ -7272,6 +7272,11 @@ static void cs35l41_fixup_spi_two(struct hda_codec *codec, const struct hda_fixu
+       comp_generic_fixup(codec, action, "spi", "CSC3551", "-%s:00-cs35l41-hda.%d", 2);
+ }
++static void cs35l41_fixup_spi_one(struct hda_codec *codec, const struct hda_fixup *fix, int action)
++{
++      comp_generic_fixup(codec, action, "spi", "CSC3551", "-%s:00-cs35l41-hda.%d", 1);
++}
++
+ static void cs35l41_fixup_spi_four(struct hda_codec *codec, const struct hda_fixup *fix, int action)
+ {
+       comp_generic_fixup(codec, action, "spi", "CSC3551", "-%s:00-cs35l41-hda.%d", 4);
+@@ -7956,6 +7961,7 @@ enum {
+       ALC287_FIXUP_CS35L41_I2C_2,
+       ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED,
+       ALC287_FIXUP_CS35L41_I2C_4,
++      ALC245_FIXUP_CS35L41_SPI_1,
+       ALC245_FIXUP_CS35L41_SPI_2,
+       ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED,
+       ALC245_FIXUP_CS35L41_SPI_4,
+@@ -10067,6 +10073,10 @@ static const struct hda_fixup alc269_fixups[] = {
+               .type = HDA_FIXUP_FUNC,
+               .v.func = cs35l41_fixup_spi_two,
+       },
++      [ALC245_FIXUP_CS35L41_SPI_1] = {
++              .type = HDA_FIXUP_FUNC,
++              .v.func = cs35l41_fixup_spi_one,
++      },
+       [ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED] = {
+               .type = HDA_FIXUP_FUNC,
+               .v.func = cs35l41_fixup_spi_two,
+@@ -11001,6 +11011,7 @@ static const struct hda_quirk alc269_fixup_tbl[] = {
+       SND_PCI_QUIRK(0x1043, 0x8398, "ASUS P1005", ALC269_FIXUP_STEREO_DMIC),
+       SND_PCI_QUIRK(0x1043, 0x83ce, "ASUS P1005", ALC269_FIXUP_STEREO_DMIC),
+       SND_PCI_QUIRK(0x1043, 0x8516, "ASUS X101CH", ALC269_FIXUP_ASUS_X101),
++      SND_PCI_QUIRK(0x1043, 0x88f4, "ASUS NUC14LNS", ALC245_FIXUP_CS35L41_SPI_1),
+       SND_PCI_QUIRK(0x104d, 0x9073, "Sony VAIO", ALC275_FIXUP_SONY_VAIO_GPIO2),
+       SND_PCI_QUIRK(0x104d, 0x907b, "Sony VAIO", ALC275_FIXUP_SONY_HWEQ),
+       SND_PCI_QUIRK(0x104d, 0x9084, "Sony VAIO", ALC275_FIXUP_SONY_HWEQ),
+-- 
+2.51.0
+
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 (file)
index 0000000..6d59212
--- /dev/null
@@ -0,0 +1,40 @@
+From a3f38fa4ee1b437d3687dd8390095911d2db6ae0 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 31 Jul 2025 19:06:14 +0800
+Subject: ALSA: usb-audio: Add DSD support for Comtrue USB Audio device
+
+From: noble.yang <noble.yang@comtrue-inc.com>
+
+[ Upstream commit e9df1755485dd90a89656e8a21ec4d71c909fa30 ]
+
+The vendor Comtrue Inc. (0x2fc6) produces USB audio chipsets like
+the CT7601 which are capable of Native DSD playback.
+
+This patch adds QUIRK_FLAG_DSD_RAW for Comtrue (VID 0x2fc6), which enables
+native DSD playback (DSD_U32_LE) on their USB Audio device. This has been
+verified under Ubuntu 25.04 with JRiver.
+
+Signed-off-by: noble.yang <noble.yang@comtrue-inc.com>
+Link: https://patch.msgid.link/20250731110614.4070-1-noble228@gmail.com
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/quirks.c | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/sound/usb/quirks.c b/sound/usb/quirks.c
+index 0da4ee9757c01..de57cf35d8258 100644
+--- a/sound/usb/quirks.c
++++ b/sound/usb/quirks.c
+@@ -2405,6 +2405,8 @@ static const struct usb_audio_quirk_flags_table quirk_flags_table[] = {
+                  QUIRK_FLAG_DSD_RAW),
+       VENDOR_FLG(0x2d87, /* Cayin device */
+                  QUIRK_FLAG_DSD_RAW),
++      VENDOR_FLG(0x2fc6, /* Comture-inc devices */
++                 QUIRK_FLAG_DSD_RAW),
+       VENDOR_FLG(0x3336, /* HEM devices */
+                  QUIRK_FLAG_DSD_RAW),
+       VENDOR_FLG(0x3353, /* Khadas devices */
+-- 
+2.51.0
+
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 (file)
index 0000000..59cfab5
--- /dev/null
@@ -0,0 +1,321 @@
+From 3f4aaaec3655e8f9d5e4bcabfb1b169c5c30b832 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 26 May 2025 17:07:48 +0300
+Subject: ALSA: usb-audio: Add mixer quirk for Sony DualSense PS5
+
+From: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+
+[ Upstream commit 79d561c4ec0497669f19a9550cfb74812f60938b ]
+
+The Sony DualSense wireless controller (PS5) features an internal mono
+speaker, but it also provides a 3.5mm jack socket for headphone output
+and headset microphone input.
+
+Since this is a UAC1 device, it doesn't advertise any jack detection
+capability.  However, the controller is able to report HP & MIC insert
+events via HID, i.e. through a dedicated input device managed by the
+hid-playstation driver.
+
+Add a quirk to create the jack controls for headphone and headset mic,
+respectively, and setup an input handler for each of them in order to
+intercept the related hotplug events.
+
+Signed-off-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Link: https://patch.msgid.link/20250526-dualsense-alsa-jack-v1-9-1a821463b632@collabora.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/mixer_quirks.c | 263 +++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 263 insertions(+)
+
+diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
+index 5f660c6933d2d..b495c9ccb56ca 100644
+--- a/sound/usb/mixer_quirks.c
++++ b/sound/usb/mixer_quirks.c
+@@ -17,6 +17,7 @@
+ #include <linux/bitfield.h>
+ #include <linux/hid.h>
+ #include <linux/init.h>
++#include <linux/input.h>
+ #include <linux/math64.h>
+ #include <linux/slab.h>
+ #include <linux/usb.h>
+@@ -530,6 +531,263 @@ static int snd_emu0204_controls_create(struct usb_mixer_interface *mixer)
+                                         &snd_emu0204_control, NULL);
+ }
++/*
++ * Sony DualSense controller (PS5) jack detection
++ *
++ * Since this is an UAC 1 device, it doesn't support jack detection.
++ * However, the controller hid-playstation driver reports HP & MIC
++ * insert events through a dedicated input device.
++ */
++
++#define SND_DUALSENSE_JACK_OUT_TERM_ID 3
++#define SND_DUALSENSE_JACK_IN_TERM_ID 4
++
++struct dualsense_mixer_elem_info {
++      struct usb_mixer_elem_info info;
++      struct input_handler ih;
++      struct input_device_id id_table[2];
++      bool connected;
++};
++
++static void snd_dualsense_ih_event(struct input_handle *handle,
++                                 unsigned int type, unsigned int code,
++                                 int value)
++{
++      struct dualsense_mixer_elem_info *mei;
++      struct usb_mixer_elem_list *me;
++
++      if (type != EV_SW)
++              return;
++
++      mei = container_of(handle->handler, struct dualsense_mixer_elem_info, ih);
++      me = &mei->info.head;
++
++      if ((me->id == SND_DUALSENSE_JACK_OUT_TERM_ID && code == SW_HEADPHONE_INSERT) ||
++          (me->id == SND_DUALSENSE_JACK_IN_TERM_ID && code == SW_MICROPHONE_INSERT)) {
++              mei->connected = !!value;
++              snd_ctl_notify(me->mixer->chip->card, SNDRV_CTL_EVENT_MASK_VALUE,
++                             &me->kctl->id);
++      }
++}
++
++static bool snd_dualsense_ih_match(struct input_handler *handler,
++                                 struct input_dev *dev)
++{
++      struct dualsense_mixer_elem_info *mei;
++      struct usb_device *snd_dev;
++      char *input_dev_path, *usb_dev_path;
++      size_t usb_dev_path_len;
++      bool match = false;
++
++      mei = container_of(handler, struct dualsense_mixer_elem_info, ih);
++      snd_dev = mei->info.head.mixer->chip->dev;
++
++      input_dev_path = kobject_get_path(&dev->dev.kobj, GFP_KERNEL);
++      if (!input_dev_path) {
++              dev_warn(&snd_dev->dev, "Failed to get input dev path\n");
++              return false;
++      }
++
++      usb_dev_path = kobject_get_path(&snd_dev->dev.kobj, GFP_KERNEL);
++      if (!usb_dev_path) {
++              dev_warn(&snd_dev->dev, "Failed to get USB dev path\n");
++              goto free_paths;
++      }
++
++      /*
++       * Ensure the VID:PID matched input device supposedly owned by the
++       * hid-playstation driver belongs to the actual hardware handled by
++       * the current USB audio device, which implies input_dev_path being
++       * a subpath of usb_dev_path.
++       *
++       * This verification is necessary when there is more than one identical
++       * controller attached to the host system.
++       */
++      usb_dev_path_len = strlen(usb_dev_path);
++      if (usb_dev_path_len >= strlen(input_dev_path))
++              goto free_paths;
++
++      usb_dev_path[usb_dev_path_len] = '/';
++      match = !memcmp(input_dev_path, usb_dev_path, usb_dev_path_len + 1);
++
++free_paths:
++      kfree(input_dev_path);
++      kfree(usb_dev_path);
++
++      return match;
++}
++
++static int snd_dualsense_ih_connect(struct input_handler *handler,
++                                  struct input_dev *dev,
++                                  const struct input_device_id *id)
++{
++      struct input_handle *handle;
++      int err;
++
++      handle = kzalloc(sizeof(*handle), GFP_KERNEL);
++      if (!handle)
++              return -ENOMEM;
++
++      handle->dev = dev;
++      handle->handler = handler;
++      handle->name = handler->name;
++
++      err = input_register_handle(handle);
++      if (err)
++              goto err_free;
++
++      err = input_open_device(handle);
++      if (err)
++              goto err_unregister;
++
++      return 0;
++
++err_unregister:
++      input_unregister_handle(handle);
++err_free:
++      kfree(handle);
++      return err;
++}
++
++static void snd_dualsense_ih_disconnect(struct input_handle *handle)
++{
++      input_close_device(handle);
++      input_unregister_handle(handle);
++      kfree(handle);
++}
++
++static void snd_dualsense_ih_start(struct input_handle *handle)
++{
++      struct dualsense_mixer_elem_info *mei;
++      struct usb_mixer_elem_list *me;
++      int status = -1;
++
++      mei = container_of(handle->handler, struct dualsense_mixer_elem_info, ih);
++      me = &mei->info.head;
++
++      if (me->id == SND_DUALSENSE_JACK_OUT_TERM_ID &&
++          test_bit(SW_HEADPHONE_INSERT, handle->dev->swbit))
++              status = test_bit(SW_HEADPHONE_INSERT, handle->dev->sw);
++      else if (me->id == SND_DUALSENSE_JACK_IN_TERM_ID &&
++               test_bit(SW_MICROPHONE_INSERT, handle->dev->swbit))
++              status = test_bit(SW_MICROPHONE_INSERT, handle->dev->sw);
++
++      if (status >= 0) {
++              mei->connected = !!status;
++              snd_ctl_notify(me->mixer->chip->card, SNDRV_CTL_EVENT_MASK_VALUE,
++                             &me->kctl->id);
++      }
++}
++
++static int snd_dualsense_jack_get(struct snd_kcontrol *kctl,
++                                struct snd_ctl_elem_value *ucontrol)
++{
++      struct dualsense_mixer_elem_info *mei = snd_kcontrol_chip(kctl);
++
++      ucontrol->value.integer.value[0] = mei->connected;
++
++      return 0;
++}
++
++static const struct snd_kcontrol_new snd_dualsense_jack_control = {
++      .iface = SNDRV_CTL_ELEM_IFACE_CARD,
++      .access = SNDRV_CTL_ELEM_ACCESS_READ,
++      .info = snd_ctl_boolean_mono_info,
++      .get = snd_dualsense_jack_get,
++};
++
++static int snd_dualsense_resume_jack(struct usb_mixer_elem_list *list)
++{
++      snd_ctl_notify(list->mixer->chip->card, SNDRV_CTL_EVENT_MASK_VALUE,
++                     &list->kctl->id);
++      return 0;
++}
++
++static void snd_dualsense_mixer_elem_free(struct snd_kcontrol *kctl)
++{
++      struct dualsense_mixer_elem_info *mei = snd_kcontrol_chip(kctl);
++
++      if (mei->ih.event)
++              input_unregister_handler(&mei->ih);
++
++      snd_usb_mixer_elem_free(kctl);
++}
++
++static int snd_dualsense_jack_create(struct usb_mixer_interface *mixer,
++                                   const char *name, bool is_output)
++{
++      struct dualsense_mixer_elem_info *mei;
++      struct input_device_id *idev_id;
++      struct snd_kcontrol *kctl;
++      int err;
++
++      mei = kzalloc(sizeof(*mei), GFP_KERNEL);
++      if (!mei)
++              return -ENOMEM;
++
++      snd_usb_mixer_elem_init_std(&mei->info.head, mixer,
++                                  is_output ? SND_DUALSENSE_JACK_OUT_TERM_ID :
++                                              SND_DUALSENSE_JACK_IN_TERM_ID);
++
++      mei->info.head.resume = snd_dualsense_resume_jack;
++      mei->info.val_type = USB_MIXER_BOOLEAN;
++      mei->info.channels = 1;
++      mei->info.min = 0;
++      mei->info.max = 1;
++
++      kctl = snd_ctl_new1(&snd_dualsense_jack_control, mei);
++      if (!kctl) {
++              kfree(mei);
++              return -ENOMEM;
++      }
++
++      strscpy(kctl->id.name, name, sizeof(kctl->id.name));
++      kctl->private_free = snd_dualsense_mixer_elem_free;
++
++      err = snd_usb_mixer_add_control(&mei->info.head, kctl);
++      if (err)
++              return err;
++
++      idev_id = &mei->id_table[0];
++      idev_id->flags = INPUT_DEVICE_ID_MATCH_VENDOR | INPUT_DEVICE_ID_MATCH_PRODUCT |
++                       INPUT_DEVICE_ID_MATCH_EVBIT | INPUT_DEVICE_ID_MATCH_SWBIT;
++      idev_id->vendor = USB_ID_VENDOR(mixer->chip->usb_id);
++      idev_id->product = USB_ID_PRODUCT(mixer->chip->usb_id);
++      idev_id->evbit[BIT_WORD(EV_SW)] = BIT_MASK(EV_SW);
++      if (is_output)
++              idev_id->swbit[BIT_WORD(SW_HEADPHONE_INSERT)] = BIT_MASK(SW_HEADPHONE_INSERT);
++      else
++              idev_id->swbit[BIT_WORD(SW_MICROPHONE_INSERT)] = BIT_MASK(SW_MICROPHONE_INSERT);
++
++      mei->ih.event = snd_dualsense_ih_event;
++      mei->ih.match = snd_dualsense_ih_match;
++      mei->ih.connect = snd_dualsense_ih_connect,
++      mei->ih.disconnect = snd_dualsense_ih_disconnect,
++      mei->ih.start = snd_dualsense_ih_start,
++      mei->ih.name = name;
++      mei->ih.id_table = mei->id_table;
++
++      err = input_register_handler(&mei->ih);
++      if (err) {
++              dev_warn(&mixer->chip->dev->dev,
++                       "Could not register input handler: %d\n", err);
++              mei->ih.event = NULL;
++      }
++
++      return 0;
++}
++
++static int snd_dualsense_controls_create(struct usb_mixer_interface *mixer)
++{
++      int err;
++
++      err = snd_dualsense_jack_create(mixer, "Headphone Jack", true);
++      if (err < 0)
++              return err;
++
++      return snd_dualsense_jack_create(mixer, "Headset Mic Jack", false);
++}
++
+ /* ASUS Xonar U1 / U3 controls */
+ static int snd_xonar_u1_switch_get(struct snd_kcontrol *kcontrol,
+@@ -3964,6 +4222,11 @@ int snd_usb_mixer_apply_create_quirk(struct usb_mixer_interface *mixer)
+               err = snd_emu0204_controls_create(mixer);
+               break;
++      case USB_ID(0x054c, 0x0ce6): /* Sony DualSense controller (PS5) */
++      case USB_ID(0x054c, 0x0df2): /* Sony DualSense Edge controller (PS5) */
++              err = snd_dualsense_controls_create(mixer);
++              break;
++
+       case USB_ID(0x0763, 0x2030): /* M-Audio Fast Track C400 */
+       case USB_ID(0x0763, 0x2031): /* M-Audio Fast Track C400 */
+               err = snd_c400_create_mixer(mixer);
+-- 
+2.51.0
+
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 (file)
index 0000000..a65f35c
--- /dev/null
@@ -0,0 +1,73 @@
+From 1fd3bf7ff290e474ef2ceab0c10da3b87a2cac88 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 29 Aug 2025 14:40:48 +0800
+Subject: ALSA: usb-audio: Add mute TLV for playback volumes on more devices
+
+From: qaqland <anguoli@uniontech.com>
+
+[ Upstream commit 2cbe4ac193ed7172cfd825c0cc46ce4a41be4ba1 ]
+
+Applying the quirk of that, the lowest Playback mixer volume setting
+mutes the audio output, on more devices.
+
+Suggested-by: Cryolitia PukNgae <cryolitia@uniontech.com>
+Signed-off-by: qaqland <anguoli@uniontech.com>
+Link: https://patch.msgid.link/20250829-sound_quirk-v1-1-745529b44440@uniontech.com
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/quirks.c | 10 ++++++++++
+ 1 file changed, 10 insertions(+)
+
+diff --git a/sound/usb/quirks.c b/sound/usb/quirks.c
+index 03962b3e3bd58..8a20508e055a3 100644
+--- a/sound/usb/quirks.c
++++ b/sound/usb/quirks.c
+@@ -2196,6 +2196,8 @@ static const struct usb_audio_quirk_flags_table quirk_flags_table[] = {
+                  QUIRK_FLAG_SET_IFACE_FIRST),
+       DEVICE_FLG(0x0556, 0x0014, /* Phoenix Audio TMX320VC */
+                  QUIRK_FLAG_GET_SAMPLE_RATE),
++      DEVICE_FLG(0x0572, 0x1b08, /* Conexant Systems (Rockwell), Inc. */
++                 QUIRK_FLAG_MIXER_MIN_MUTE),
+       DEVICE_FLG(0x0572, 0x1b09, /* Conexant Systems (Rockwell), Inc. */
+                  QUIRK_FLAG_MIXER_MIN_MUTE),
+       DEVICE_FLG(0x05a3, 0x9420, /* ELP HD USB Camera */
+@@ -2240,6 +2242,8 @@ static const struct usb_audio_quirk_flags_table quirk_flags_table[] = {
+                  QUIRK_FLAG_CTL_MSG_DELAY_1M),
+       DEVICE_FLG(0x0b0e, 0x0349, /* Jabra 550a */
+                  QUIRK_FLAG_CTL_MSG_DELAY_1M),
++      DEVICE_FLG(0x0bda, 0x498a, /* Realtek Semiconductor Corp. */
++                 QUIRK_FLAG_MIXER_MIN_MUTE),
+       DEVICE_FLG(0x0c45, 0x6340, /* Sonix HD USB Camera */
+                  QUIRK_FLAG_GET_SAMPLE_RATE),
+       DEVICE_FLG(0x0c45, 0x636b, /* Microdia JP001 USB Camera */
+@@ -2256,6 +2260,8 @@ static const struct usb_audio_quirk_flags_table quirk_flags_table[] = {
+                  QUIRK_FLAG_SHARE_MEDIA_DEVICE | QUIRK_FLAG_ALIGN_TRANSFER),
+       DEVICE_FLG(0x1101, 0x0003, /* Audioengine D1 */
+                  QUIRK_FLAG_GET_SAMPLE_RATE),
++      DEVICE_FLG(0x12d1, 0x3a07, /* Huawei Technologies Co., Ltd. */
++                 QUIRK_FLAG_MIXER_MIN_MUTE),
+       DEVICE_FLG(0x1224, 0x2a25, /* Jieli Technology USB PHY 2.0 */
+                  QUIRK_FLAG_GET_SAMPLE_RATE | QUIRK_FLAG_MIC_RES_16),
+       DEVICE_FLG(0x1395, 0x740a, /* Sennheiser DECT */
+@@ -2346,6 +2352,8 @@ static const struct usb_audio_quirk_flags_table quirk_flags_table[] = {
+                  QUIRK_FLAG_IGNORE_CTL_ERROR),
+       DEVICE_FLG(0x2912, 0x30c8, /* Audioengine D1 */
+                  QUIRK_FLAG_GET_SAMPLE_RATE),
++      DEVICE_FLG(0x2a70, 0x1881, /* OnePlus Technology (Shenzhen) Co., Ltd. BE02T */
++                 QUIRK_FLAG_MIXER_MIN_MUTE),
+       DEVICE_FLG(0x2b53, 0x0023, /* Fiero SC-01 (firmware v1.0.0 @ 48 kHz) */
+                  QUIRK_FLAG_GENERIC_IMPLICIT_FB),
+       DEVICE_FLG(0x2b53, 0x0024, /* Fiero SC-01 (firmware v1.0.0 @ 96 kHz) */
+@@ -2362,6 +2370,8 @@ static const struct usb_audio_quirk_flags_table quirk_flags_table[] = {
+                  QUIRK_FLAG_CTL_MSG_DELAY_1M),
+       DEVICE_FLG(0x30be, 0x0101, /* Schiit Hel */
+                  QUIRK_FLAG_IGNORE_CTL_ERROR),
++      DEVICE_FLG(0x339b, 0x3a07, /* Synaptics HONOR USB-C HEADSET */
++                 QUIRK_FLAG_MIXER_MIN_MUTE),
+       DEVICE_FLG(0x413c, 0xa506, /* Dell AE515 sound bar */
+                  QUIRK_FLAG_GET_SAMPLE_RATE),
+       DEVICE_FLG(0x534d, 0x0021, /* MacroSilicon MS2100/MS2106 */
+-- 
+2.51.0
+
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 (file)
index 0000000..7031d2a
--- /dev/null
@@ -0,0 +1,38 @@
+From c34e59de5575b651a50fa583f57a7450c7542233 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 26 May 2025 17:07:45 +0300
+Subject: ALSA: usb-audio: Avoid multiple assignments in mixer_quirks
+
+From: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+
+[ Upstream commit 03ddd3bdb94df3edb1f2408b57cfb00b3d92a208 ]
+
+Handle report from checkpatch.pl:
+
+  CHECK: multiple assignments should be avoided
+
+Signed-off-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Link: https://patch.msgid.link/20250526-dualsense-alsa-jack-v1-6-1a821463b632@collabora.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/mixer_quirks.c | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
+index 78c0feb7dcdb7..1eae6e83d0259 100644
+--- a/sound/usb/mixer_quirks.c
++++ b/sound/usb/mixer_quirks.c
+@@ -1737,7 +1737,8 @@ static int snd_microii_spdif_default_put(struct snd_kcontrol *kcontrol,
+       unsigned int pval, pval_old;
+       int err;
+-      pval = pval_old = kcontrol->private_value;
++      pval = kcontrol->private_value;
++      pval_old = pval;
+       pval &= 0xfffff0f0;
+       pval |= (ucontrol->value.iec958.status[1] & 0x0f) << 8;
+       pval |= (ucontrol->value.iec958.status[0] & 0x0f);
+-- 
+2.51.0
+
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 (file)
index 0000000..6d48ac7
--- /dev/null
@@ -0,0 +1,49 @@
+From c00bd8417cf95599e9b49f0000800e5eacd817ce Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 12 Jun 2025 14:02:28 +0800
+Subject: ALSA: usb-audio: Convert comma to semicolon
+
+From: Chen Ni <nichen@iscas.ac.cn>
+
+[ Upstream commit 9ca30a1b007d5fefb5752428f852a2d8d7219c1c ]
+
+Replace comma between expressions with semicolons.
+
+Using a ',' in place of a ';' can have unintended side effects.
+Although that is not the case here, it is seems best to use ';'
+unless ',' is intended.
+
+Found by inspection.
+No functional change intended.
+Compile tested only.
+
+Fixes: 79d561c4ec04 ("ALSA: usb-audio: Add mixer quirk for Sony DualSense PS5")
+Signed-off-by: Chen Ni <nichen@iscas.ac.cn>
+Reviewed-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+Link: https://patch.msgid.link/20250612060228.1518028-1-nichen@iscas.ac.cn
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/mixer_quirks.c | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
+index b495c9ccb56ca..2ee91469e6f73 100644
+--- a/sound/usb/mixer_quirks.c
++++ b/sound/usb/mixer_quirks.c
+@@ -761,9 +761,9 @@ static int snd_dualsense_jack_create(struct usb_mixer_interface *mixer,
+       mei->ih.event = snd_dualsense_ih_event;
+       mei->ih.match = snd_dualsense_ih_match;
+-      mei->ih.connect = snd_dualsense_ih_connect,
+-      mei->ih.disconnect = snd_dualsense_ih_disconnect,
+-      mei->ih.start = snd_dualsense_ih_start,
++      mei->ih.connect = snd_dualsense_ih_connect;
++      mei->ih.disconnect = snd_dualsense_ih_disconnect;
++      mei->ih.start = snd_dualsense_ih_start;
+       mei->ih.name = name;
+       mei->ih.id_table = mei->id_table;
+-- 
+2.51.0
+
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 (file)
index 0000000..cd60637
--- /dev/null
@@ -0,0 +1,49 @@
+From 93a5973dc1432f399b38572a197c41e726e8ed48 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 26 May 2025 17:07:44 +0300
+Subject: ALSA: usb-audio: Drop unnecessary parentheses in mixer_quirks
+
+From: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+
+[ Upstream commit c0495cef8b43ad61efbd4019e3573742e0e63c67 ]
+
+Fix multiple 'CHECK: Unnecessary parentheses around ...' reports from
+checkpatch.pl.
+
+Signed-off-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Link: https://patch.msgid.link/20250526-dualsense-alsa-jack-v1-5-1a821463b632@collabora.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/mixer_quirks.c | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
+index a97d1ca8443ca..78c0feb7dcdb7 100644
+--- a/sound/usb/mixer_quirks.c
++++ b/sound/usb/mixer_quirks.c
+@@ -379,10 +379,10 @@ static int snd_audigy2nx_controls_create(struct usb_mixer_interface *mixer)
+               struct snd_kcontrol_new knew;
+               /* USB X-Fi S51 doesn't have a CMSS LED */
+-              if ((mixer->chip->usb_id == USB_ID(0x041e, 0x3042)) && i == 0)
++              if (mixer->chip->usb_id == USB_ID(0x041e, 0x3042) && i == 0)
+                       continue;
+               /* USB X-Fi S51 Pro doesn't have one either */
+-              if ((mixer->chip->usb_id == USB_ID(0x041e, 0x30df)) && i == 0)
++              if (mixer->chip->usb_id == USB_ID(0x041e, 0x30df) && i == 0)
+                       continue;
+               if (i > 1 && /* Live24ext has 2 LEDs only */
+                       (mixer->chip->usb_id == USB_ID(0x041e, 0x3040) ||
+@@ -3846,7 +3846,7 @@ static int snd_djm_controls_update(struct usb_mixer_interface *mixer,
+       int err;
+       const struct snd_djm_device *device = &snd_djm_devices[device_idx];
+-      if ((group >= device->ncontrols) || value >= device->controls[group].noptions)
++      if (group >= device->ncontrols || value >= device->controls[group].noptions)
+               return -EINVAL;
+       err = snd_usb_lock_shutdown(mixer->chip);
+-- 
+2.51.0
+
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 (file)
index 0000000..873b473
--- /dev/null
@@ -0,0 +1,49 @@
+From 558388d7d2a5037867cf1f6b65ac52725545c13e Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 26 May 2025 17:07:43 +0300
+Subject: ALSA: usb-audio: Fix block comments in mixer_quirks
+
+From: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+
+[ Upstream commit 231225d8a20f8668b4fd6601d54a2fac0e0ab7a5 ]
+
+Address a couple of comment formatting issues indicated by
+checkpatch.pl:
+
+  WARNING: Block comments use a trailing */ on a separate line
+
+Signed-off-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Link: https://patch.msgid.link/20250526-dualsense-alsa-jack-v1-4-1a821463b632@collabora.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/mixer_quirks.c | 6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
+
+diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
+index 4d2232bef600d..a97d1ca8443ca 100644
+--- a/sound/usb/mixer_quirks.c
++++ b/sound/usb/mixer_quirks.c
+@@ -77,7 +77,8 @@ static int snd_create_std_mono_ctl_offset(struct usb_mixer_interface *mixer,
+       cval->idx_off = idx_off;
+       /* get_min_max() is called only for integer volumes later,
+-       * so provide a short-cut for booleans */
++       * so provide a short-cut for booleans
++       */
+       cval->min = 0;
+       cval->max = 1;
+       cval->res = 0;
+@@ -4131,7 +4132,8 @@ static void snd_dragonfly_quirk_db_scale(struct usb_mixer_interface *mixer,
+                                        struct snd_kcontrol *kctl)
+ {
+       /* Approximation using 10 ranges based on output measurement on hw v1.2.
+-       * This seems close to the cubic mapping e.g. alsamixer uses. */
++       * This seems close to the cubic mapping e.g. alsamixer uses.
++       */
+       static const DECLARE_TLV_DB_RANGE(scale,
+                0,  1, TLV_DB_MINMAX_ITEM(-5300, -4970),
+                2,  5, TLV_DB_MINMAX_ITEM(-4710, -4160),
+-- 
+2.51.0
+
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 (file)
index 0000000..99168e5
--- /dev/null
@@ -0,0 +1,61 @@
+From 7665dbf10583fc45a1d223bc0e32e1c1640e1b28 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 13 Jun 2025 10:15:30 +0200
+Subject: ALSA: usb-audio: Fix build with CONFIG_INPUT=n
+
+From: Takashi Iwai <tiwai@suse.de>
+
+[ Upstream commit d0630a0b80c08530857146e3bf183a7d6b743847 ]
+
+The recent addition of DualSense mixer quirk relies on the input
+device handle, and the build can fail if CONFIG_INPUT isn't set.
+Put (rather ugly) workarounds to wrap with IS_REACHABLE() for avoiding
+the build error.
+
+Fixes: 79d561c4ec04 ("ALSA: usb-audio: Add mixer quirk for Sony DualSense PS5")
+Reported-by: kernel test robot <lkp@intel.com>
+Closes: https://lore.kernel.org/oe-kbuild-all/202506130733.gnPKw2l3-lkp@intel.com/
+Reviewed-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+Link: https://patch.msgid.link/20250613081543.7404-1-tiwai@suse.de
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/mixer_quirks.c | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
+index 2ee91469e6f73..8d7fc6edc8c79 100644
+--- a/sound/usb/mixer_quirks.c
++++ b/sound/usb/mixer_quirks.c
+@@ -531,6 +531,7 @@ static int snd_emu0204_controls_create(struct usb_mixer_interface *mixer)
+                                         &snd_emu0204_control, NULL);
+ }
++#if IS_REACHABLE(CONFIG_INPUT)
+ /*
+  * Sony DualSense controller (PS5) jack detection
+  *
+@@ -787,6 +788,7 @@ static int snd_dualsense_controls_create(struct usb_mixer_interface *mixer)
+       return snd_dualsense_jack_create(mixer, "Headset Mic Jack", false);
+ }
++#endif /* IS_REACHABLE(CONFIG_INPUT) */
+ /* ASUS Xonar U1 / U3 controls */
+@@ -4222,10 +4224,12 @@ int snd_usb_mixer_apply_create_quirk(struct usb_mixer_interface *mixer)
+               err = snd_emu0204_controls_create(mixer);
+               break;
++#if IS_REACHABLE(CONFIG_INPUT)
+       case USB_ID(0x054c, 0x0ce6): /* Sony DualSense controller (PS5) */
+       case USB_ID(0x054c, 0x0df2): /* Sony DualSense Edge controller (PS5) */
+               err = snd_dualsense_controls_create(mixer);
+               break;
++#endif /* IS_REACHABLE(CONFIG_INPUT) */
+       case USB_ID(0x0763, 0x2030): /* M-Audio Fast Track C400 */
+       case USB_ID(0x0763, 0x2031): /* M-Audio Fast Track C400 */
+-- 
+2.51.0
+
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 (file)
index 0000000..386077c
--- /dev/null
@@ -0,0 +1,597 @@
+From bec753a2b38ebeba0f89a23fd94063d141e3350e Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 26 May 2025 17:07:40 +0300
+Subject: ALSA: usb-audio: Fix code alignment in mixer_quirks
+
+From: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+
+[ Upstream commit bca638aa737d13749a871d1a0d2ed276501ffc54 ]
+
+Format code to fix all alignment issues reported by checkpatch.pl:
+
+  CHECK: Alignment should match open parenthesis
+
+Signed-off-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Link: https://patch.msgid.link/20250526-dualsense-alsa-jack-v1-1-1a821463b632@collabora.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/mixer_quirks.c | 250 ++++++++++++++++++++-------------------
+ 1 file changed, 127 insertions(+), 123 deletions(-)
+
+diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
+index 7bd87193c6177..4d2232bef600d 100644
+--- a/sound/usb/mixer_quirks.c
++++ b/sound/usb/mixer_quirks.c
+@@ -54,13 +54,13 @@ struct std_mono_table {
+  * version, we keep it mono for simplicity.
+  */
+ static int snd_create_std_mono_ctl_offset(struct usb_mixer_interface *mixer,
+-                              unsigned int unitid,
+-                              unsigned int control,
+-                              unsigned int cmask,
+-                              int val_type,
+-                              unsigned int idx_off,
+-                              const char *name,
+-                              snd_kcontrol_tlv_rw_t *tlv_callback)
++                                        unsigned int unitid,
++                                        unsigned int control,
++                                        unsigned int cmask,
++                                        int val_type,
++                                        unsigned int idx_off,
++                                        const char *name,
++                                        snd_kcontrol_tlv_rw_t *tlv_callback)
+ {
+       struct usb_mixer_elem_info *cval;
+       struct snd_kcontrol *kctl;
+@@ -107,15 +107,16 @@ static int snd_create_std_mono_ctl_offset(struct usb_mixer_interface *mixer,
+ }
+ static int snd_create_std_mono_ctl(struct usb_mixer_interface *mixer,
+-                              unsigned int unitid,
+-                              unsigned int control,
+-                              unsigned int cmask,
+-                              int val_type,
+-                              const char *name,
+-                              snd_kcontrol_tlv_rw_t *tlv_callback)
++                                 unsigned int unitid,
++                                 unsigned int control,
++                                 unsigned int cmask,
++                                 int val_type,
++                                 const char *name,
++                                 snd_kcontrol_tlv_rw_t *tlv_callback)
+ {
+       return snd_create_std_mono_ctl_offset(mixer, unitid, control, cmask,
+-              val_type, 0 /* Offset */, name, tlv_callback);
++                                            val_type, 0 /* Offset */,
++                                            name, tlv_callback);
+ }
+ /*
+@@ -128,7 +129,8 @@ static int snd_create_std_mono_table(struct usb_mixer_interface *mixer,
+       while (t->name != NULL) {
+               err = snd_create_std_mono_ctl(mixer, t->unitid, t->control,
+-                              t->cmask, t->val_type, t->name, t->tlv_callback);
++                                            t->cmask, t->val_type, t->name,
++                                            t->tlv_callback);
+               if (err < 0)
+                       return err;
+               t++;
+@@ -213,7 +215,7 @@ static void snd_usb_soundblaster_remote_complete(struct urb *urb)
+ }
+ static long snd_usb_sbrc_hwdep_read(struct snd_hwdep *hw, char __user *buf,
+-                                   long count, loff_t *offset)
++                                  long count, loff_t *offset)
+ {
+       struct usb_mixer_interface *mixer = hw->private_data;
+       int err;
+@@ -233,7 +235,7 @@ static long snd_usb_sbrc_hwdep_read(struct snd_hwdep *hw, char __user *buf,
+ }
+ static __poll_t snd_usb_sbrc_hwdep_poll(struct snd_hwdep *hw, struct file *file,
+-                                          poll_table *wait)
++                                      poll_table *wait)
+ {
+       struct usb_mixer_interface *mixer = hw->private_data;
+@@ -309,20 +311,20 @@ static int snd_audigy2nx_led_update(struct usb_mixer_interface *mixer,
+       if (chip->usb_id == USB_ID(0x041e, 0x3042))
+               err = snd_usb_ctl_msg(chip->dev,
+-                            usb_sndctrlpipe(chip->dev, 0), 0x24,
+-                            USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_OTHER,
+-                            !value, 0, NULL, 0);
++                                    usb_sndctrlpipe(chip->dev, 0), 0x24,
++                                    USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_OTHER,
++                                    !value, 0, NULL, 0);
+       /* USB X-Fi S51 Pro */
+       if (chip->usb_id == USB_ID(0x041e, 0x30df))
+               err = snd_usb_ctl_msg(chip->dev,
+-                            usb_sndctrlpipe(chip->dev, 0), 0x24,
+-                            USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_OTHER,
+-                            !value, 0, NULL, 0);
++                                    usb_sndctrlpipe(chip->dev, 0), 0x24,
++                                    USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_OTHER,
++                                    !value, 0, NULL, 0);
+       else
+               err = snd_usb_ctl_msg(chip->dev,
+-                            usb_sndctrlpipe(chip->dev, 0), 0x24,
+-                            USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_OTHER,
+-                            value, index + 2, NULL, 0);
++                                    usb_sndctrlpipe(chip->dev, 0), 0x24,
++                                    USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_OTHER,
++                                    value, index + 2, NULL, 0);
+       snd_usb_unlock_shutdown(chip);
+       return err;
+ }
+@@ -480,9 +482,9 @@ static int snd_emu0204_ch_switch_update(struct usb_mixer_interface *mixer,
+       buf[0] = 0x01;
+       buf[1] = value ? 0x02 : 0x01;
+       err = snd_usb_ctl_msg(chip->dev,
+-                    usb_sndctrlpipe(chip->dev, 0), UAC_SET_CUR,
+-                    USB_RECIP_INTERFACE | USB_TYPE_CLASS | USB_DIR_OUT,
+-                    0x0400, 0x0e00, buf, 2);
++                            usb_sndctrlpipe(chip->dev, 0), UAC_SET_CUR,
++                            USB_RECIP_INTERFACE | USB_TYPE_CLASS | USB_DIR_OUT,
++                            0x0400, 0x0e00, buf, 2);
+       snd_usb_unlock_shutdown(chip);
+       return err;
+ }
+@@ -1020,7 +1022,7 @@ static int snd_nativeinstruments_create_mixer(struct usb_mixer_interface *mixer,
+ /* M-Audio FastTrack Ultra quirks */
+ /* FTU Effect switch (also used by C400/C600) */
+ static int snd_ftu_eff_switch_info(struct snd_kcontrol *kcontrol,
+-                                      struct snd_ctl_elem_info *uinfo)
++                                 struct snd_ctl_elem_info *uinfo)
+ {
+       static const char *const texts[8] = {
+               "Room 1", "Room 2", "Room 3", "Hall 1",
+@@ -1054,7 +1056,7 @@ static int snd_ftu_eff_switch_init(struct usb_mixer_interface *mixer,
+ }
+ static int snd_ftu_eff_switch_get(struct snd_kcontrol *kctl,
+-                                      struct snd_ctl_elem_value *ucontrol)
++                                struct snd_ctl_elem_value *ucontrol)
+ {
+       ucontrol->value.enumerated.item[0] = kctl->private_value >> 24;
+       return 0;
+@@ -1085,7 +1087,7 @@ static int snd_ftu_eff_switch_update(struct usb_mixer_elem_list *list)
+ }
+ static int snd_ftu_eff_switch_put(struct snd_kcontrol *kctl,
+-                                      struct snd_ctl_elem_value *ucontrol)
++                                struct snd_ctl_elem_value *ucontrol)
+ {
+       struct usb_mixer_elem_list *list = snd_kcontrol_chip(kctl);
+       unsigned int pval = list->kctl->private_value;
+@@ -1103,7 +1105,7 @@ static int snd_ftu_eff_switch_put(struct snd_kcontrol *kctl,
+ }
+ static int snd_ftu_create_effect_switch(struct usb_mixer_interface *mixer,
+-      int validx, int bUnitID)
++                                      int validx, int bUnitID)
+ {
+       static struct snd_kcontrol_new template = {
+               .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
+@@ -1142,22 +1144,22 @@ static int snd_ftu_create_volume_ctls(struct usb_mixer_interface *mixer)
+               for (in = 0; in < 8; in++) {
+                       cmask = BIT(in);
+                       snprintf(name, sizeof(name),
+-                              "AIn%d - Out%d Capture Volume",
+-                              in  + 1, out + 1);
++                               "AIn%d - Out%d Capture Volume",
++                               in  + 1, out + 1);
+                       err = snd_create_std_mono_ctl(mixer, id, control,
+-                                                      cmask, val_type, name,
+-                                                      &snd_usb_mixer_vol_tlv);
++                                                    cmask, val_type, name,
++                                                    &snd_usb_mixer_vol_tlv);
+                       if (err < 0)
+                               return err;
+               }
+               for (in = 8; in < 16; in++) {
+                       cmask = BIT(in);
+                       snprintf(name, sizeof(name),
+-                              "DIn%d - Out%d Playback Volume",
+-                              in - 7, out + 1);
++                               "DIn%d - Out%d Playback Volume",
++                               in - 7, out + 1);
+                       err = snd_create_std_mono_ctl(mixer, id, control,
+-                                                      cmask, val_type, name,
+-                                                      &snd_usb_mixer_vol_tlv);
++                                                    cmask, val_type, name,
++                                                    &snd_usb_mixer_vol_tlv);
+                       if (err < 0)
+                               return err;
+               }
+@@ -1218,10 +1220,10 @@ static int snd_ftu_create_effect_return_ctls(struct usb_mixer_interface *mixer)
+       for (ch = 0; ch < 4; ++ch) {
+               cmask = BIT(ch);
+               snprintf(name, sizeof(name),
+-                      "Effect Return %d Volume", ch + 1);
++                       "Effect Return %d Volume", ch + 1);
+               err = snd_create_std_mono_ctl(mixer, id, control,
+-                                              cmask, val_type, name,
+-                                              snd_usb_mixer_vol_tlv);
++                                            cmask, val_type, name,
++                                            snd_usb_mixer_vol_tlv);
+               if (err < 0)
+                       return err;
+       }
+@@ -1242,20 +1244,20 @@ static int snd_ftu_create_effect_send_ctls(struct usb_mixer_interface *mixer)
+       for (ch = 0; ch < 8; ++ch) {
+               cmask = BIT(ch);
+               snprintf(name, sizeof(name),
+-                      "Effect Send AIn%d Volume", ch + 1);
++                       "Effect Send AIn%d Volume", ch + 1);
+               err = snd_create_std_mono_ctl(mixer, id, control, cmask,
+-                                              val_type, name,
+-                                              snd_usb_mixer_vol_tlv);
++                                            val_type, name,
++                                            snd_usb_mixer_vol_tlv);
+               if (err < 0)
+                       return err;
+       }
+       for (ch = 8; ch < 16; ++ch) {
+               cmask = BIT(ch);
+               snprintf(name, sizeof(name),
+-                      "Effect Send DIn%d Volume", ch - 7);
++                       "Effect Send DIn%d Volume", ch - 7);
+               err = snd_create_std_mono_ctl(mixer, id, control, cmask,
+-                                              val_type, name,
+-                                              snd_usb_mixer_vol_tlv);
++                                            val_type, name,
++                                            snd_usb_mixer_vol_tlv);
+               if (err < 0)
+                       return err;
+       }
+@@ -1345,19 +1347,19 @@ static int snd_c400_create_vol_ctls(struct usb_mixer_interface *mixer)
+               for (out = 0; out < num_outs; out++) {
+                       if (chan < num_outs) {
+                               snprintf(name, sizeof(name),
+-                                      "PCM%d-Out%d Playback Volume",
+-                                      chan + 1, out + 1);
++                                       "PCM%d-Out%d Playback Volume",
++                                       chan + 1, out + 1);
+                       } else {
+                               snprintf(name, sizeof(name),
+-                                      "In%d-Out%d Playback Volume",
+-                                      chan - num_outs + 1, out + 1);
++                                       "In%d-Out%d Playback Volume",
++                                       chan - num_outs + 1, out + 1);
+                       }
+                       cmask = (out == 0) ? 0 : BIT(out - 1);
+                       offset = chan * num_outs;
+                       err = snd_create_std_mono_ctl_offset(mixer, id, control,
+-                                              cmask, val_type, offset, name,
+-                                              &snd_usb_mixer_vol_tlv);
++                                                           cmask, val_type, offset, name,
++                                                           &snd_usb_mixer_vol_tlv);
+                       if (err < 0)
+                               return err;
+               }
+@@ -1376,7 +1378,7 @@ static int snd_c400_create_effect_volume_ctl(struct usb_mixer_interface *mixer)
+       const unsigned int cmask = 0;
+       return snd_create_std_mono_ctl(mixer, id, control, cmask, val_type,
+-                                      name, snd_usb_mixer_vol_tlv);
++                                     name, snd_usb_mixer_vol_tlv);
+ }
+ /* This control needs a volume quirk, see mixer.c */
+@@ -1389,7 +1391,7 @@ static int snd_c400_create_effect_duration_ctl(struct usb_mixer_interface *mixer
+       const unsigned int cmask = 0;
+       return snd_create_std_mono_ctl(mixer, id, control, cmask, val_type,
+-                                      name, snd_usb_mixer_vol_tlv);
++                                     name, snd_usb_mixer_vol_tlv);
+ }
+ /* This control needs a volume quirk, see mixer.c */
+@@ -1402,7 +1404,7 @@ static int snd_c400_create_effect_feedback_ctl(struct usb_mixer_interface *mixer
+       const unsigned int cmask = 0;
+       return snd_create_std_mono_ctl(mixer, id, control, cmask, val_type,
+-                                      name, NULL);
++                                     name, NULL);
+ }
+ static int snd_c400_create_effect_vol_ctls(struct usb_mixer_interface *mixer)
+@@ -1431,18 +1433,18 @@ static int snd_c400_create_effect_vol_ctls(struct usb_mixer_interface *mixer)
+       for (chan = 0; chan < num_outs + num_ins; chan++) {
+               if (chan < num_outs) {
+                       snprintf(name, sizeof(name),
+-                              "Effect Send DOut%d",
+-                              chan + 1);
++                               "Effect Send DOut%d",
++                               chan + 1);
+               } else {
+                       snprintf(name, sizeof(name),
+-                              "Effect Send AIn%d",
+-                              chan - num_outs + 1);
++                               "Effect Send AIn%d",
++                               chan - num_outs + 1);
+               }
+               cmask = (chan == 0) ? 0 : BIT(chan - 1);
+               err = snd_create_std_mono_ctl(mixer, id, control,
+-                                              cmask, val_type, name,
+-                                              &snd_usb_mixer_vol_tlv);
++                                            cmask, val_type, name,
++                                            &snd_usb_mixer_vol_tlv);
+               if (err < 0)
+                       return err;
+       }
+@@ -1477,14 +1479,14 @@ static int snd_c400_create_effect_ret_vol_ctls(struct usb_mixer_interface *mixer
+       for (chan = 0; chan < num_outs; chan++) {
+               snprintf(name, sizeof(name),
+-                      "Effect Return %d",
+-                      chan + 1);
++                       "Effect Return %d",
++                       chan + 1);
+               cmask = (chan == 0) ? 0 :
+                       BIT(chan + (chan % 2) * num_outs - 1);
+               err = snd_create_std_mono_ctl_offset(mixer, id, control,
+-                                              cmask, val_type, offset, name,
+-                                              &snd_usb_mixer_vol_tlv);
++                                                   cmask, val_type, offset, name,
++                                                   &snd_usb_mixer_vol_tlv);
+               if (err < 0)
+                       return err;
+       }
+@@ -1625,7 +1627,7 @@ static const struct std_mono_table ebox44_table[] = {
+  *
+  */
+ static int snd_microii_spdif_info(struct snd_kcontrol *kcontrol,
+-      struct snd_ctl_elem_info *uinfo)
++                                struct snd_ctl_elem_info *uinfo)
+ {
+       uinfo->type = SNDRV_CTL_ELEM_TYPE_IEC958;
+       uinfo->count = 1;
+@@ -1633,7 +1635,7 @@ static int snd_microii_spdif_info(struct snd_kcontrol *kcontrol,
+ }
+ static int snd_microii_spdif_default_get(struct snd_kcontrol *kcontrol,
+-      struct snd_ctl_elem_value *ucontrol)
++                                       struct snd_ctl_elem_value *ucontrol)
+ {
+       struct usb_mixer_elem_list *list = snd_kcontrol_chip(kcontrol);
+       struct snd_usb_audio *chip = list->mixer->chip;
+@@ -1666,13 +1668,13 @@ static int snd_microii_spdif_default_get(struct snd_kcontrol *kcontrol,
+       ep = get_endpoint(alts, 0)->bEndpointAddress;
+       err = snd_usb_ctl_msg(chip->dev,
+-                      usb_rcvctrlpipe(chip->dev, 0),
+-                      UAC_GET_CUR,
+-                      USB_TYPE_CLASS | USB_RECIP_ENDPOINT | USB_DIR_IN,
+-                      UAC_EP_CS_ATTR_SAMPLE_RATE << 8,
+-                      ep,
+-                      data,
+-                      sizeof(data));
++                            usb_rcvctrlpipe(chip->dev, 0),
++                            UAC_GET_CUR,
++                            USB_TYPE_CLASS | USB_RECIP_ENDPOINT | USB_DIR_IN,
++                            UAC_EP_CS_ATTR_SAMPLE_RATE << 8,
++                            ep,
++                            data,
++                            sizeof(data));
+       if (err < 0)
+               goto end;
+@@ -1699,26 +1701,26 @@ static int snd_microii_spdif_default_update(struct usb_mixer_elem_list *list)
+       reg = ((pval >> 4) & 0xf0) | (pval & 0x0f);
+       err = snd_usb_ctl_msg(chip->dev,
+-                      usb_sndctrlpipe(chip->dev, 0),
+-                      UAC_SET_CUR,
+-                      USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_OTHER,
+-                      reg,
+-                      2,
+-                      NULL,
+-                      0);
++                            usb_sndctrlpipe(chip->dev, 0),
++                            UAC_SET_CUR,
++                            USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_OTHER,
++                            reg,
++                            2,
++                            NULL,
++                            0);
+       if (err < 0)
+               goto end;
+       reg = (pval & IEC958_AES0_NONAUDIO) ? 0xa0 : 0x20;
+       reg |= (pval >> 12) & 0x0f;
+       err = snd_usb_ctl_msg(chip->dev,
+-                      usb_sndctrlpipe(chip->dev, 0),
+-                      UAC_SET_CUR,
+-                      USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_OTHER,
+-                      reg,
+-                      3,
+-                      NULL,
+-                      0);
++                            usb_sndctrlpipe(chip->dev, 0),
++                            UAC_SET_CUR,
++                            USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_OTHER,
++                            reg,
++                            3,
++                            NULL,
++                            0);
+       if (err < 0)
+               goto end;
+@@ -1728,7 +1730,7 @@ static int snd_microii_spdif_default_update(struct usb_mixer_elem_list *list)
+ }
+ static int snd_microii_spdif_default_put(struct snd_kcontrol *kcontrol,
+-      struct snd_ctl_elem_value *ucontrol)
++                                       struct snd_ctl_elem_value *ucontrol)
+ {
+       struct usb_mixer_elem_list *list = snd_kcontrol_chip(kcontrol);
+       unsigned int pval, pval_old;
+@@ -1755,7 +1757,7 @@ static int snd_microii_spdif_default_put(struct snd_kcontrol *kcontrol,
+ }
+ static int snd_microii_spdif_mask_get(struct snd_kcontrol *kcontrol,
+-      struct snd_ctl_elem_value *ucontrol)
++                                    struct snd_ctl_elem_value *ucontrol)
+ {
+       ucontrol->value.iec958.status[0] = 0x0f;
+       ucontrol->value.iec958.status[1] = 0xff;
+@@ -1766,7 +1768,7 @@ static int snd_microii_spdif_mask_get(struct snd_kcontrol *kcontrol,
+ }
+ static int snd_microii_spdif_switch_get(struct snd_kcontrol *kcontrol,
+-      struct snd_ctl_elem_value *ucontrol)
++                                      struct snd_ctl_elem_value *ucontrol)
+ {
+       ucontrol->value.integer.value[0] = !(kcontrol->private_value & 0x02);
+@@ -1784,20 +1786,20 @@ static int snd_microii_spdif_switch_update(struct usb_mixer_elem_list *list)
+               return err;
+       err = snd_usb_ctl_msg(chip->dev,
+-                      usb_sndctrlpipe(chip->dev, 0),
+-                      UAC_SET_CUR,
+-                      USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_OTHER,
+-                      reg,
+-                      9,
+-                      NULL,
+-                      0);
++                            usb_sndctrlpipe(chip->dev, 0),
++                            UAC_SET_CUR,
++                            USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_OTHER,
++                            reg,
++                            9,
++                            NULL,
++                            0);
+       snd_usb_unlock_shutdown(chip);
+       return err;
+ }
+ static int snd_microii_spdif_switch_put(struct snd_kcontrol *kcontrol,
+-      struct snd_ctl_elem_value *ucontrol)
++                                      struct snd_ctl_elem_value *ucontrol)
+ {
+       struct usb_mixer_elem_list *list = snd_kcontrol_chip(kcontrol);
+       u8 reg;
+@@ -1882,9 +1884,9 @@ static int snd_soundblaster_e1_switch_update(struct usb_mixer_interface *mixer,
+       if (err < 0)
+               return err;
+       err = snd_usb_ctl_msg(chip->dev,
+-                      usb_sndctrlpipe(chip->dev, 0), HID_REQ_SET_REPORT,
+-                      USB_TYPE_CLASS | USB_RECIP_INTERFACE | USB_DIR_OUT,
+-                      0x0202, 3, buff, 2);
++                            usb_sndctrlpipe(chip->dev, 0), HID_REQ_SET_REPORT,
++                            USB_TYPE_CLASS | USB_RECIP_INTERFACE | USB_DIR_OUT,
++                            0x0202, 3, buff, 2);
+       snd_usb_unlock_shutdown(chip);
+       return err;
+ }
+@@ -3234,7 +3236,7 @@ static int snd_rme_digiface_enum_put(struct snd_kcontrol *kcontrol,
+ }
+ static int snd_rme_digiface_current_sync_get(struct snd_kcontrol *kcontrol,
+-                                   struct snd_ctl_elem_value *ucontrol)
++                                           struct snd_ctl_elem_value *ucontrol)
+ {
+       int ret = snd_rme_digiface_enum_get(kcontrol, ucontrol);
+@@ -3806,7 +3808,7 @@ static const struct snd_djm_device snd_djm_devices[] = {
+ static int snd_djm_controls_info(struct snd_kcontrol *kctl,
+-                              struct snd_ctl_elem_info *info)
++                               struct snd_ctl_elem_info *info)
+ {
+       unsigned long private_value = kctl->private_value;
+       u8 device_idx = (private_value & SND_DJM_DEVICE_MASK) >> SND_DJM_DEVICE_SHIFT;
+@@ -3825,8 +3827,8 @@ static int snd_djm_controls_info(struct snd_kcontrol *kctl,
+               info->value.enumerated.item = noptions - 1;
+       name = snd_djm_get_label(device_idx,
+-                              ctl->options[info->value.enumerated.item],
+-                              ctl->wIndex);
++                               ctl->options[info->value.enumerated.item],
++                               ctl->wIndex);
+       if (!name)
+               return -EINVAL;
+@@ -3838,7 +3840,7 @@ static int snd_djm_controls_info(struct snd_kcontrol *kctl,
+ }
+ static int snd_djm_controls_update(struct usb_mixer_interface *mixer,
+-                              u8 device_idx, u8 group, u16 value)
++                                 u8 device_idx, u8 group, u16 value)
+ {
+       int err;
+       const struct snd_djm_device *device = &snd_djm_devices[device_idx];
+@@ -3850,13 +3852,13 @@ static int snd_djm_controls_update(struct usb_mixer_interface *mixer,
+       if (err)
+               return err;
+-      err = snd_usb_ctl_msg(
+-              mixer->chip->dev, usb_sndctrlpipe(mixer->chip->dev, 0),
+-              USB_REQ_SET_FEATURE,
+-              USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
+-              device->controls[group].options[value],
+-              device->controls[group].wIndex,
+-              NULL, 0);
++      err = snd_usb_ctl_msg(mixer->chip->dev,
++                            usb_sndctrlpipe(mixer->chip->dev, 0),
++                            USB_REQ_SET_FEATURE,
++                            USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
++                            device->controls[group].options[value],
++                            device->controls[group].wIndex,
++                            NULL, 0);
+       snd_usb_unlock_shutdown(mixer->chip);
+       return err;
+@@ -3897,7 +3899,7 @@ static int snd_djm_controls_resume(struct usb_mixer_elem_list *list)
+ }
+ static int snd_djm_controls_create(struct usb_mixer_interface *mixer,
+-              const u8 device_idx)
++                                 const u8 device_idx)
+ {
+       int err, i;
+       u16 value;
+@@ -3916,10 +3918,10 @@ static int snd_djm_controls_create(struct usb_mixer_interface *mixer,
+       for (i = 0; i < device->ncontrols; i++) {
+               value = device->controls[i].default_value;
+               knew.name = device->controls[i].name;
+-              knew.private_value = (
++              knew.private_value =
+                       ((unsigned long)device_idx << SND_DJM_DEVICE_SHIFT) |
+                       (i << SND_DJM_GROUP_SHIFT) |
+-                      value);
++                      value;
+               err = snd_djm_controls_update(mixer, device_idx, i, value);
+               if (err)
+                       return err;
+@@ -3986,13 +3988,15 @@ int snd_usb_mixer_apply_create_quirk(struct usb_mixer_interface *mixer)
+               break;
+       case USB_ID(0x17cc, 0x1011): /* Traktor Audio 6 */
+-              err = snd_nativeinstruments_create_mixer(mixer,
++              err = snd_nativeinstruments_create_mixer(/* checkpatch hack */
++                              mixer,
+                               snd_nativeinstruments_ta6_mixers,
+                               ARRAY_SIZE(snd_nativeinstruments_ta6_mixers));
+               break;
+       case USB_ID(0x17cc, 0x1021): /* Traktor Audio 10 */
+-              err = snd_nativeinstruments_create_mixer(mixer,
++              err = snd_nativeinstruments_create_mixer(/* checkpatch hack */
++                              mixer,
+                               snd_nativeinstruments_ta10_mixers,
+                               ARRAY_SIZE(snd_nativeinstruments_ta10_mixers));
+               break;
+-- 
+2.51.0
+
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 (file)
index 0000000..c021549
--- /dev/null
@@ -0,0 +1,123 @@
+From 6546ef4333172120bf5a5e875cc1ec792c54482e Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 27 Aug 2025 11:29:02 +0800
+Subject: ALSA: usb-audio: move mixer_quirks' min_mute into common quirk
+
+From: Cryolitia PukNgae <cryolitia@uniontech.com>
+
+[ Upstream commit 2c3ca8cc55a3afc7a4fa99ed8f5f5d05dd2e65b3 ]
+
+We have found more and more devices that have the same problem, that
+the mixer's minimum value is muted. Accroding to pipewire's MR[1]
+and Arch Linux wiki[2], this should be a very common problem in USB
+audio devices. Move the quirk into common quirk,as a preparation of
+more devices' quirk's patch coming on the road[3].
+
+1. https://gitlab.freedesktop.org/pipewire/pipewire/-/merge_requests/2514
+2. https://wiki.archlinux.org/index.php?title=PipeWire&oldid=804138#No_sound_from_USB_DAC_until_30%_volume
+3. On the road, in the physical sense. We have been buying ton of
+   these devices for testing the problem.
+
+Tested-by: Guoli An <anguoli@uniontech.com>
+Signed-off-by: Cryolitia PukNgae <cryolitia@uniontech.com>
+Link: https://patch.msgid.link/20250827-sound-quirk-min-mute-v1-1-4717aa8a4f6a@uniontech.com
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/mixer_quirks.c | 10 +++-------
+ sound/usb/quirks.c       | 12 ++++++++++--
+ sound/usb/usbaudio.h     |  4 ++++
+ 3 files changed, 17 insertions(+), 9 deletions(-)
+
+diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
+index 8d7fc6edc8c79..b663764644cd8 100644
+--- a/sound/usb/mixer_quirks.c
++++ b/sound/usb/mixer_quirks.c
+@@ -4484,16 +4484,12 @@ void snd_usb_mixer_fu_apply_quirk(struct usb_mixer_interface *mixer,
+               if (unitid == 7 && cval->control == UAC_FU_VOLUME)
+                       snd_dragonfly_quirk_db_scale(mixer, cval, kctl);
+               break;
++      }
++
+       /* lowest playback value is muted on some devices */
+-      case USB_ID(0x0572, 0x1b09): /* Conexant Systems (Rockwell), Inc. */
+-      case USB_ID(0x0d8c, 0x000c): /* C-Media */
+-      case USB_ID(0x0d8c, 0x0014): /* C-Media */
+-      case USB_ID(0x19f7, 0x0003): /* RODE NT-USB */
+-      case USB_ID(0x2d99, 0x0026): /* HECATE G2 GAMING HEADSET */
++      if (mixer->chip->quirk_flags & QUIRK_FLAG_MIXER_MIN_MUTE)
+               if (strstr(kctl->id.name, "Playback"))
+                       cval->min_mute = 1;
+-              break;
+-      }
+       /* ALSA-ify some Plantronics headset control names */
+       if (USB_ID_VENDOR(mixer->chip->usb_id) == 0x047f &&
+diff --git a/sound/usb/quirks.c b/sound/usb/quirks.c
+index de57cf35d8258..03962b3e3bd58 100644
+--- a/sound/usb/quirks.c
++++ b/sound/usb/quirks.c
+@@ -2196,6 +2196,8 @@ static const struct usb_audio_quirk_flags_table quirk_flags_table[] = {
+                  QUIRK_FLAG_SET_IFACE_FIRST),
+       DEVICE_FLG(0x0556, 0x0014, /* Phoenix Audio TMX320VC */
+                  QUIRK_FLAG_GET_SAMPLE_RATE),
++      DEVICE_FLG(0x0572, 0x1b09, /* Conexant Systems (Rockwell), Inc. */
++                 QUIRK_FLAG_MIXER_MIN_MUTE),
+       DEVICE_FLG(0x05a3, 0x9420, /* ELP HD USB Camera */
+                  QUIRK_FLAG_GET_SAMPLE_RATE),
+       DEVICE_FLG(0x05a7, 0x1020, /* Bose Companion 5 */
+@@ -2242,8 +2244,10 @@ static const struct usb_audio_quirk_flags_table quirk_flags_table[] = {
+                  QUIRK_FLAG_GET_SAMPLE_RATE),
+       DEVICE_FLG(0x0c45, 0x636b, /* Microdia JP001 USB Camera */
+                  QUIRK_FLAG_GET_SAMPLE_RATE),
+-      DEVICE_FLG(0x0d8c, 0x0014, /* USB Audio Device */
+-                 QUIRK_FLAG_CTL_MSG_DELAY_1M),
++      DEVICE_FLG(0x0d8c, 0x000c, /* C-Media */
++                 QUIRK_FLAG_MIXER_MIN_MUTE),
++      DEVICE_FLG(0x0d8c, 0x0014, /* C-Media */
++                 QUIRK_FLAG_CTL_MSG_DELAY_1M | QUIRK_FLAG_MIXER_MIN_MUTE),
+       DEVICE_FLG(0x0ecb, 0x205c, /* JBL Quantum610 Wireless */
+                  QUIRK_FLAG_FIXED_RATE),
+       DEVICE_FLG(0x0ecb, 0x2069, /* JBL Quantum810 Wireless */
+@@ -2290,6 +2294,8 @@ static const struct usb_audio_quirk_flags_table quirk_flags_table[] = {
+                  QUIRK_FLAG_ITF_USB_DSD_DAC | QUIRK_FLAG_CTL_MSG_DELAY),
+       DEVICE_FLG(0x1901, 0x0191, /* GE B850V3 CP2114 audio interface */
+                  QUIRK_FLAG_GET_SAMPLE_RATE),
++      DEVICE_FLG(0x19f7, 0x0003, /* RODE NT-USB */
++                 QUIRK_FLAG_MIXER_MIN_MUTE),
+       DEVICE_FLG(0x19f7, 0x0035, /* RODE NT-USB+ */
+                  QUIRK_FLAG_GET_SAMPLE_RATE),
+       DEVICE_FLG(0x1bcf, 0x2281, /* HD Webcam */
+@@ -2350,6 +2356,8 @@ static const struct usb_audio_quirk_flags_table quirk_flags_table[] = {
+                  QUIRK_FLAG_CTL_MSG_DELAY_1M),
+       DEVICE_FLG(0x2d95, 0x8021, /* VIVO USB-C-XE710 HEADSET */
+                  QUIRK_FLAG_CTL_MSG_DELAY_1M),
++      DEVICE_FLG(0x2d99, 0x0026, /* HECATE G2 GAMING HEADSET */
++                 QUIRK_FLAG_MIXER_MIN_MUTE),
+       DEVICE_FLG(0x2fc6, 0xf0b7, /* iBasso DC07 Pro */
+                  QUIRK_FLAG_CTL_MSG_DELAY_1M),
+       DEVICE_FLG(0x30be, 0x0101, /* Schiit Hel */
+diff --git a/sound/usb/usbaudio.h b/sound/usb/usbaudio.h
+index 158ec053dc44d..1ef4d39978df3 100644
+--- a/sound/usb/usbaudio.h
++++ b/sound/usb/usbaudio.h
+@@ -196,6 +196,9 @@ extern bool snd_usb_skip_validation;
+  *  for the given endpoint.
+  * QUIRK_FLAG_MIC_RES_16 and QUIRK_FLAG_MIC_RES_384
+  *  Set the fixed resolution for Mic Capture Volume (mostly for webcams)
++ * QUIRK_FLAG_MIXER_MIN_MUTE
++ *  Set minimum volume control value as mute for devices where the lowest
++ *  playback value represents muted state instead of minimum audible volume
+  */
+ #define QUIRK_FLAG_GET_SAMPLE_RATE    (1U << 0)
+@@ -222,5 +225,6 @@ extern bool snd_usb_skip_validation;
+ #define QUIRK_FLAG_FIXED_RATE         (1U << 21)
+ #define QUIRK_FLAG_MIC_RES_16         (1U << 22)
+ #define QUIRK_FLAG_MIC_RES_384                (1U << 23)
++#define QUIRK_FLAG_MIXER_MIN_MUTE     (1U << 24)
+ #endif /* __USBAUDIO_H */
+-- 
+2.51.0
+
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 (file)
index 0000000..f58b9e6
--- /dev/null
@@ -0,0 +1,46 @@
+From 18a47bcf8606c3a4ce9c8f4fcfc9666cba9f8f06 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 26 May 2025 17:07:47 +0300
+Subject: ALSA: usb-audio: Remove unneeded wmb() in mixer_quirks
+
+From: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+
+[ Upstream commit 9cea7425595697802e8d55a322a251999554b8b1 ]
+
+Adding a memory barrier before wake_up() in
+snd_usb_soundblaster_remote_complete() is supposed to ensure the write
+to mixer->rc_code is visible in wait_event_interruptible() from
+snd_usb_sbrc_hwdep_read().
+
+However, this is not really necessary, since wake_up() is just a wrapper
+over __wake_up() which already executes a full memory barrier before
+accessing the state of the task to be waken up.
+
+Drop the redundant call to wmb() and implicitly fix the checkpatch
+complaint:
+
+  WARNING: memory barrier without comment
+
+Signed-off-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Link: https://patch.msgid.link/20250526-dualsense-alsa-jack-v1-8-1a821463b632@collabora.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/mixer_quirks.c | 1 -
+ 1 file changed, 1 deletion(-)
+
+diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
+index 3bd2daba8ecac..5f660c6933d2d 100644
+--- a/sound/usb/mixer_quirks.c
++++ b/sound/usb/mixer_quirks.c
+@@ -211,7 +211,6 @@ static void snd_usb_soundblaster_remote_complete(struct urb *urb)
+       if (code == rc->mute_code)
+               snd_usb_mixer_notify_id(mixer, rc->mute_mixer_id);
+       mixer->rc_code = code;
+-      wmb();
+       wake_up(&mixer->rc_waitq);
+ }
+-- 
+2.51.0
+
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 (file)
index 0000000..979eb8c
--- /dev/null
@@ -0,0 +1,37 @@
+From 1325f86d8ad91a2f9a796f6124db1a39cb4745db Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 26 May 2025 17:07:46 +0300
+Subject: ALSA: usb-audio: Simplify NULL comparison in mixer_quirks
+
+From: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+
+[ Upstream commit f2d6d660e8fd5f4467e80743f82119201e67fa9c ]
+
+Handle report from checkpatch.pl:
+
+  CHECK: Comparison to NULL could be written "t->name"
+
+Signed-off-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Link: https://patch.msgid.link/20250526-dualsense-alsa-jack-v1-7-1a821463b632@collabora.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/mixer_quirks.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
+index 1eae6e83d0259..3bd2daba8ecac 100644
+--- a/sound/usb/mixer_quirks.c
++++ b/sound/usb/mixer_quirks.c
+@@ -128,7 +128,7 @@ static int snd_create_std_mono_table(struct usb_mixer_interface *mixer,
+ {
+       int err;
+-      while (t->name != NULL) {
++      while (t->name) {
+               err = snd_create_std_mono_ctl(mixer, t->unitid, t->control,
+                                             t->cmask, t->val_type, t->name,
+                                             t->tlv_callback);
+-- 
+2.51.0
+
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 (file)
index 0000000..d4a3572
--- /dev/null
@@ -0,0 +1,39 @@
+From 78be8f8bc5843b250eb181403815ec1552e4e1f8 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sat, 20 Sep 2025 11:51:48 +0900
+Subject: firewire: core: fix overlooked update of subsystem ABI version
+
+From: Takashi Sakamoto <o-takashi@sakamocchi.jp>
+
+[ Upstream commit 853a57ba263adfecf4430b936d6862bc475b4bb5 ]
+
+In kernel v6.5, several functions were added to the cdev layer. This
+required updating the default version of subsystem ABI up to 6, but
+this requirement was overlooked.
+
+This commit updates the version accordingly.
+
+Fixes: 6add87e9764d ("firewire: cdev: add new version of ABI to notify time stamp at request/response subaction of transaction#")
+Link: https://lore.kernel.org/r/20250920025148.163402-1-o-takashi@sakamocchi.jp
+Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/firewire/core-cdev.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/firewire/core-cdev.c b/drivers/firewire/core-cdev.c
+index b360dca2c69e8..cc9731c3616c1 100644
+--- a/drivers/firewire/core-cdev.c
++++ b/drivers/firewire/core-cdev.c
+@@ -41,7 +41,7 @@
+ /*
+  * ABI version history is documented in linux/firewire-cdev.h.
+  */
+-#define FW_CDEV_KERNEL_VERSION                        5
++#define FW_CDEV_KERNEL_VERSION                        6
+ #define FW_CDEV_VERSION_EVENT_REQUEST2                4
+ #define FW_CDEV_VERSION_ALLOCATE_REGION_END   4
+ #define FW_CDEV_VERSION_AUTO_FLUSH_ISO_OVERFLOW       5
+-- 
+2.51.0
+
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 (file)
index 0000000..17b9fe0
--- /dev/null
@@ -0,0 +1,122 @@
+From 8186d94bba187509fd59a944aafed98527a58456 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 18 Sep 2025 18:02:02 +0530
+Subject: HID: amd_sfh: Add sync across amd sfh work functions
+
+From: Basavaraj Natikar <Basavaraj.Natikar@amd.com>
+
+[ Upstream commit bba920e6f803138587248079de47ad3464a396f6 ]
+
+The process of the report is delegated across different work functions.
+Hence, add a sync mechanism to protect SFH work data across functions.
+
+Fixes: 4b2c53d93a4b ("SFH:Transport Driver to add support of AMD Sensor Fusion Hub (SFH)")
+Reported-by: Matthew Schwartz <matthew.schwartz@linux.dev>
+Closes: https://lore.kernel.org/all/a21abca5-4268-449d-95f1-bdd7a25894a5@linux.dev/
+Tested-by: Prakruthi SP <Prakruthi.SP@amd.com>
+Co-developed-by: Akshata MukundShetty <akshata.mukundshetty@amd.com>
+Signed-off-by: Akshata MukundShetty <akshata.mukundshetty@amd.com>
+Signed-off-by: Basavaraj Natikar <Basavaraj.Natikar@amd.com>
+Reviewed-by: Mario Limonciello (AMD) <superm1@kernel.org>
+Signed-off-by: Jiri Kosina <jkosina@suse.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/hid/amd-sfh-hid/amd_sfh_client.c | 12 ++++++++++--
+ drivers/hid/amd-sfh-hid/amd_sfh_common.h |  3 +++
+ drivers/hid/amd-sfh-hid/amd_sfh_pcie.c   |  4 ++++
+ 3 files changed, 17 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/hid/amd-sfh-hid/amd_sfh_client.c b/drivers/hid/amd-sfh-hid/amd_sfh_client.c
+index 3438d392920fa..8dae9a7766853 100644
+--- a/drivers/hid/amd-sfh-hid/amd_sfh_client.c
++++ b/drivers/hid/amd-sfh-hid/amd_sfh_client.c
+@@ -39,8 +39,12 @@ int amd_sfh_get_report(struct hid_device *hid, int report_id, int report_type)
+       struct amdtp_hid_data *hid_data = hid->driver_data;
+       struct amdtp_cl_data *cli_data = hid_data->cli_data;
+       struct request_list *req_list = &cli_data->req_list;
++      struct amd_input_data *in_data = cli_data->in_data;
++      struct amd_mp2_dev *mp2;
+       int i;
++      mp2 = container_of(in_data, struct amd_mp2_dev, in_data);
++      guard(mutex)(&mp2->lock);
+       for (i = 0; i < cli_data->num_hid_devices; i++) {
+               if (cli_data->hid_sensor_hubs[i] == hid) {
+                       struct request_list *new = kzalloc(sizeof(*new), GFP_KERNEL);
+@@ -75,6 +79,8 @@ void amd_sfh_work(struct work_struct *work)
+       u8 report_id, node_type;
+       u8 report_size = 0;
++      mp2 = container_of(in_data, struct amd_mp2_dev, in_data);
++      guard(mutex)(&mp2->lock);
+       req_node = list_last_entry(&req_list->list, struct request_list, list);
+       list_del(&req_node->list);
+       current_index = req_node->current_index;
+@@ -83,7 +89,6 @@ void amd_sfh_work(struct work_struct *work)
+       node_type = req_node->report_type;
+       kfree(req_node);
+-      mp2 = container_of(in_data, struct amd_mp2_dev, in_data);
+       mp2_ops = mp2->mp2_ops;
+       if (node_type == HID_FEATURE_REPORT) {
+               report_size = mp2_ops->get_feat_rep(sensor_index, report_id,
+@@ -107,6 +112,8 @@ void amd_sfh_work(struct work_struct *work)
+       cli_data->cur_hid_dev = current_index;
+       cli_data->sensor_requested_cnt[current_index] = 0;
+       amdtp_hid_wakeup(cli_data->hid_sensor_hubs[current_index]);
++      if (!list_empty(&req_list->list))
++              schedule_delayed_work(&cli_data->work, 0);
+ }
+ void amd_sfh_work_buffer(struct work_struct *work)
+@@ -117,9 +124,10 @@ void amd_sfh_work_buffer(struct work_struct *work)
+       u8 report_size;
+       int i;
++      mp2 = container_of(in_data, struct amd_mp2_dev, in_data);
++      guard(mutex)(&mp2->lock);
+       for (i = 0; i < cli_data->num_hid_devices; i++) {
+               if (cli_data->sensor_sts[i] == SENSOR_ENABLED) {
+-                      mp2 = container_of(in_data, struct amd_mp2_dev, in_data);
+                       report_size = mp2->mp2_ops->get_in_rep(i, cli_data->sensor_idx[i],
+                                                              cli_data->report_id[i], in_data);
+                       hid_input_report(cli_data->hid_sensor_hubs[i], HID_INPUT_REPORT,
+diff --git a/drivers/hid/amd-sfh-hid/amd_sfh_common.h b/drivers/hid/amd-sfh-hid/amd_sfh_common.h
+index e5620d7db5690..00308d8998d4d 100644
+--- a/drivers/hid/amd-sfh-hid/amd_sfh_common.h
++++ b/drivers/hid/amd-sfh-hid/amd_sfh_common.h
+@@ -10,6 +10,7 @@
+ #ifndef AMD_SFH_COMMON_H
+ #define AMD_SFH_COMMON_H
++#include <linux/mutex.h>
+ #include <linux/pci.h>
+ #include "amd_sfh_hid.h"
+@@ -57,6 +58,8 @@ struct amd_mp2_dev {
+       u32 mp2_acs;
+       struct sfh_dev_status dev_en;
+       struct work_struct work;
++      /* mp2 to protect data */
++      struct mutex lock;
+       u8 init_done;
+       u8 rver;
+ };
+diff --git a/drivers/hid/amd-sfh-hid/amd_sfh_pcie.c b/drivers/hid/amd-sfh-hid/amd_sfh_pcie.c
+index 0c28ca349bcd3..9739f66e925c0 100644
+--- a/drivers/hid/amd-sfh-hid/amd_sfh_pcie.c
++++ b/drivers/hid/amd-sfh-hid/amd_sfh_pcie.c
+@@ -405,6 +405,10 @@ static int amd_mp2_pci_probe(struct pci_dev *pdev, const struct pci_device_id *i
+       if (!privdata->cl_data)
+               return -ENOMEM;
++      rc = devm_mutex_init(&pdev->dev, &privdata->lock);
++      if (rc)
++              return rc;
++
+       privdata->sfh1_1_ops = (const struct amd_sfh1_1_ops *)id->driver_data;
+       if (privdata->sfh1_1_ops) {
+               if (boot_cpu_data.x86 >= 0x1A)
+-- 
+2.51.0
+
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 (file)
index 0000000..11012e5
--- /dev/null
@@ -0,0 +1,75 @@
+From 4dd91ed501915ea23f94f24b5a0318903bbe2d7c Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 27 May 2025 22:13:13 +0530
+Subject: HID: multitouch: Get the contact ID from HID_DG_TRANSDUCER_INDEX
+ fields in case of Apple Touch Bar
+
+From: Kerem Karabay <kekrby@gmail.com>
+
+[ Upstream commit f41d736acc039d86512951f4e874b0f5e666babf ]
+
+In Apple Touch Bar, the contact ID is contained in fields with the
+HID_DG_TRANSDUCER_INDEX usage rather than HID_DG_CONTACTID, thus differing
+from the HID spec. Add a quirk for the same.
+
+Acked-by: Benjamin Tissoires <bentiss@kernel.org>
+Signed-off-by: Kerem Karabay <kekrby@gmail.com>
+Co-developed-by: Aditya Garg <gargaditya08@live.com>
+Signed-off-by: Aditya Garg <gargaditya08@live.com>
+Signed-off-by: Jiri Kosina <jkosina@suse.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/hid/hid-multitouch.c | 16 +++++++++++++++-
+ 1 file changed, 15 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/hid/hid-multitouch.c b/drivers/hid/hid-multitouch.c
+index 5c424010bc025..be2bbce25b3df 100644
+--- a/drivers/hid/hid-multitouch.c
++++ b/drivers/hid/hid-multitouch.c
+@@ -72,6 +72,7 @@ MODULE_LICENSE("GPL");
+ #define MT_QUIRK_FORCE_MULTI_INPUT    BIT(20)
+ #define MT_QUIRK_DISABLE_WAKEUP               BIT(21)
+ #define MT_QUIRK_ORIENTATION_INVERT   BIT(22)
++#define MT_QUIRK_APPLE_TOUCHBAR               BIT(23)
+ #define MT_INPUTMODE_TOUCHSCREEN      0x02
+ #define MT_INPUTMODE_TOUCHPAD         0x03
+@@ -617,6 +618,7 @@ static struct mt_application *mt_find_application(struct mt_device *td,
+ static struct mt_report_data *mt_allocate_report_data(struct mt_device *td,
+                                                     struct hid_report *report)
+ {
++      struct mt_class *cls = &td->mtclass;
+       struct mt_report_data *rdata;
+       struct hid_field *field;
+       int r, n;
+@@ -641,7 +643,11 @@ static struct mt_report_data *mt_allocate_report_data(struct mt_device *td,
+               if (field->logical == HID_DG_FINGER || td->hdev->group != HID_GROUP_MULTITOUCH_WIN_8) {
+                       for (n = 0; n < field->report_count; n++) {
+-                              if (field->usage[n].hid == HID_DG_CONTACTID) {
++                              unsigned int hid = field->usage[n].hid;
++
++                              if (hid == HID_DG_CONTACTID ||
++                                 (cls->quirks & MT_QUIRK_APPLE_TOUCHBAR &&
++                                 hid == HID_DG_TRANSDUCER_INDEX)) {
+                                       rdata->is_mt_collection = true;
+                                       break;
+                               }
+@@ -819,6 +825,14 @@ static int mt_touch_input_mapping(struct hid_device *hdev, struct hid_input *hi,
+                                                    EV_KEY, BTN_TOUCH);
+                       MT_STORE_FIELD(tip_state);
+                       return 1;
++              case HID_DG_TRANSDUCER_INDEX:
++                      /*
++                       * Contact ID in case of Apple Touch Bars is contained
++                       * in fields with HID_DG_TRANSDUCER_INDEX usage.
++                       */
++                      if (!(cls->quirks & MT_QUIRK_APPLE_TOUCHBAR))
++                              return 0;
++                      fallthrough;
+               case HID_DG_CONTACTID:
+                       MT_STORE_FIELD(contactid);
+                       app->touches_by_report++;
+-- 
+2.51.0
+
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 (file)
index 0000000..288d815
--- /dev/null
@@ -0,0 +1,45 @@
+From 7d95678cea9d56d1b33d42525d44321f1dad308b Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 27 May 2025 22:13:16 +0530
+Subject: HID: multitouch: specify that Apple Touch Bar is direct
+
+From: Kerem Karabay <kekrby@gmail.com>
+
+[ Upstream commit 45ca23c5ee8b2b3074377fecc92fa72aa595f7c9 ]
+
+Currently the driver determines the device type based on the
+application, but this value is not reliable on Apple Touch Bar, where
+the application is HID_DG_TOUCHPAD even though this device is direct,
+so add a quirk for the same.
+
+Acked-by: Benjamin Tissoires <bentiss@kernel.org>
+Signed-off-by: Kerem Karabay <kekrby@gmail.com>
+Co-developed-by: Aditya Garg <gargaditya08@live.com>
+Signed-off-by: Aditya Garg <gargaditya08@live.com>
+Signed-off-by: Jiri Kosina <jkosina@suse.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/hid/hid-multitouch.c | 7 +++++++
+ 1 file changed, 7 insertions(+)
+
+diff --git a/drivers/hid/hid-multitouch.c b/drivers/hid/hid-multitouch.c
+index ec676f26800ea..09a56adf619b7 100644
+--- a/drivers/hid/hid-multitouch.c
++++ b/drivers/hid/hid-multitouch.c
+@@ -1341,6 +1341,13 @@ static int mt_touch_input_configured(struct hid_device *hdev,
+       if (td->serial_maybe)
+               mt_post_parse_default_settings(td, app);
++      /*
++       * The application for Apple Touch Bars is HID_DG_TOUCHPAD,
++       * but these devices are direct.
++       */
++      if (cls->quirks & MT_QUIRK_APPLE_TOUCHBAR)
++              app->mt_flags |= INPUT_MT_DIRECT;
++
+       if (cls->is_indirect)
+               app->mt_flags |= INPUT_MT_POINTER;
+-- 
+2.51.0
+
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 (file)
index 0000000..369993d
--- /dev/null
@@ -0,0 +1,61 @@
+From d99d0f667e7db683abddcad7b94fe59a28866299 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 27 May 2025 22:13:14 +0530
+Subject: HID: multitouch: support getting the tip state from HID_DG_TOUCH
+ fields in Apple Touch Bar
+
+From: Kerem Karabay <kekrby@gmail.com>
+
+[ Upstream commit e0976a61a543b5e03bc0d08030a0ea036ee3751d ]
+
+In Apple Touch Bar, the tip state is contained in fields with the
+HID_DG_TOUCH usage. This feature is gated by a quirk in order to
+prevent breaking other devices, see commit c2ef8f21ea8f
+("HID: multitouch: add support for trackpads").
+
+Acked-by: Benjamin Tissoires <bentiss@kernel.org>
+Signed-off-by: Kerem Karabay <kekrby@gmail.com>
+Co-developed-by: Aditya Garg <gargaditya08@live.com>
+Signed-off-by: Aditya Garg <gargaditya08@live.com>
+Signed-off-by: Jiri Kosina <jkosina@suse.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/hid/hid-multitouch.c | 15 +++++++++++----
+ 1 file changed, 11 insertions(+), 4 deletions(-)
+
+diff --git a/drivers/hid/hid-multitouch.c b/drivers/hid/hid-multitouch.c
+index be2bbce25b3df..39a8c6619876b 100644
+--- a/drivers/hid/hid-multitouch.c
++++ b/drivers/hid/hid-multitouch.c
+@@ -819,6 +819,17 @@ static int mt_touch_input_mapping(struct hid_device *hdev, struct hid_input *hi,
+                       MT_STORE_FIELD(confidence_state);
+                       return 1;
++              case HID_DG_TOUCH:
++                      /*
++                       * Legacy devices use TIPSWITCH and not TOUCH.
++                       * One special case here is of the Apple Touch Bars.
++                       * In these devices, the tip state is contained in
++                       * fields with the HID_DG_TOUCH usage.
++                       * Let's just ignore this field for other devices.
++                       */
++                      if (!(cls->quirks & MT_QUIRK_APPLE_TOUCHBAR))
++                              return -1;
++                      fallthrough;
+               case HID_DG_TIPSWITCH:
+                       if (field->application != HID_GD_SYSTEM_MULTIAXIS)
+                               input_set_capability(hi->input,
+@@ -889,10 +900,6 @@ static int mt_touch_input_mapping(struct hid_device *hdev, struct hid_input *hi,
+               case HID_DG_CONTACTMAX:
+                       /* contact max are global to the report */
+                       return -1;
+-              case HID_DG_TOUCH:
+-                      /* Legacy devices use TIPSWITCH and not TOUCH.
+-                       * Let's just ignore this field. */
+-                      return -1;
+               }
+               /* let hid-input decide for the others */
+               return 0;
+-- 
+2.51.0
+
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 (file)
index 0000000..2f60aa8
--- /dev/null
@@ -0,0 +1,44 @@
+From c820a09485b828fbd040e764a222d777b27e946d Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 27 May 2025 22:13:15 +0530
+Subject: HID: multitouch: take cls->maxcontacts into account for Apple Touch
+ Bar even without a HID_DG_CONTACTMAX field
+
+From: Kerem Karabay <kekrby@gmail.com>
+
+[ Upstream commit 7dfe48bdc9d38db46283f2e0281bc1626277b8bf ]
+
+In Apple Touch Bar, the HID_DG_CONTACTMAX is not present, but the maximum
+contact count is still greater than the default. Add quirks for the same.
+
+Acked-by: Benjamin Tissoires <bentiss@kernel.org>
+Signed-off-by: Kerem Karabay <kekrby@gmail.com>
+Co-developed-by: Aditya Garg <gargaditya08@live.com>
+Signed-off-by: Aditya Garg <gargaditya08@live.com>
+Signed-off-by: Jiri Kosina <jkosina@suse.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/hid/hid-multitouch.c | 7 +++++++
+ 1 file changed, 7 insertions(+)
+
+diff --git a/drivers/hid/hid-multitouch.c b/drivers/hid/hid-multitouch.c
+index 39a8c6619876b..ec676f26800ea 100644
+--- a/drivers/hid/hid-multitouch.c
++++ b/drivers/hid/hid-multitouch.c
+@@ -1327,6 +1327,13 @@ static int mt_touch_input_configured(struct hid_device *hdev,
+       struct input_dev *input = hi->input;
+       int ret;
++      /*
++       * HID_DG_CONTACTMAX field is not present on Apple Touch Bars,
++       * but the maximum contact count is greater than the default.
++       */
++      if (cls->quirks & MT_QUIRK_APPLE_TOUCHBAR && cls->maxcontacts)
++              td->maxcontacts = cls->maxcontacts;
++
+       if (!td->maxcontacts)
+               td->maxcontacts = MT_DEFAULT_MAXCONTACT;
+-- 
+2.51.0
+
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 (file)
index 0000000..8cb732a
--- /dev/null
@@ -0,0 +1,58 @@
+From f34f191e10a96d92ad3ed6c2a0c66e81aeb0fd20 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 1 Jul 2025 15:22:49 +0300
+Subject: i2c: designware: Add quirk for Intel Xe
+
+From: Heikki Krogerus <heikki.krogerus@linux.intel.com>
+
+[ Upstream commit f6a8e9f3de4567c71ef9f5f13719df69a8b96081 ]
+
+The regmap is coming from the parent also in case of Xe
+GPUs. Reusing the Wangxun quirk for that.
+
+Acked-by: Jarkko Nikula <jarkko.nikula@linux.intel.com>
+Co-developed-by: Michael J. Ruhl <michael.j.ruhl@intel.com>
+Signed-off-by: Michael J. Ruhl <michael.j.ruhl@intel.com>
+Signed-off-by: Heikki Krogerus <heikki.krogerus@linux.intel.com>
+Reviewed-by: Andi Shyti <andi.shyti@kernel.org>
+Link: https://lore.kernel.org/r/20250701122252.2590230-3-heikki.krogerus@linux.intel.com
+Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
+[Rodrigo fixed the co-developed tags while merging]
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/i2c/busses/i2c-designware-platdrv.c | 7 +++++--
+ 1 file changed, 5 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/i2c/busses/i2c-designware-platdrv.c b/drivers/i2c/busses/i2c-designware-platdrv.c
+index a3e86930bf418..ef9bed2f2dccb 100644
+--- a/drivers/i2c/busses/i2c-designware-platdrv.c
++++ b/drivers/i2c/busses/i2c-designware-platdrv.c
+@@ -101,7 +101,7 @@ static int bt1_i2c_request_regs(struct dw_i2c_dev *dev)
+ }
+ #endif
+-static int txgbe_i2c_request_regs(struct dw_i2c_dev *dev)
++static int dw_i2c_get_parent_regmap(struct dw_i2c_dev *dev)
+ {
+       dev->map = dev_get_regmap(dev->dev->parent, NULL);
+       if (!dev->map)
+@@ -123,12 +123,15 @@ static int dw_i2c_plat_request_regs(struct dw_i2c_dev *dev)
+       struct platform_device *pdev = to_platform_device(dev->dev);
+       int ret;
++      if (device_is_compatible(dev->dev, "intel,xe-i2c"))
++              return dw_i2c_get_parent_regmap(dev);
++
+       switch (dev->flags & MODEL_MASK) {
+       case MODEL_BAIKAL_BT1:
+               ret = bt1_i2c_request_regs(dev);
+               break;
+       case MODEL_WANGXUN_SP:
+-              ret = txgbe_i2c_request_regs(dev);
++              ret = dw_i2c_get_parent_regmap(dev);
+               break;
+       default:
+               dev->base = devm_platform_ioremap_resource(pdev, 0);
+-- 
+2.51.0
+
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 (file)
index 0000000..22d41ca
--- /dev/null
@@ -0,0 +1,50 @@
+From 264cbbd1e602b59bfe58dd324a936b3ea2ffd469 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 13 Aug 2025 15:43:20 +0300
+Subject: IB/mlx5: Fix obj_type mismatch for SRQ event subscriptions
+
+From: Or Har-Toov <ohartoov@nvidia.com>
+
+[ Upstream commit 85fe9f565d2d5af95ac2bbaa5082b8ce62b039f5 ]
+
+Fix a bug where the driver's event subscription logic for SRQ-related
+events incorrectly sets obj_type for RMP objects.
+
+When subscribing to SRQ events, get_legacy_obj_type() did not handle
+the MLX5_CMD_OP_CREATE_RMP case, which caused obj_type to be 0
+(default).
+This led to a mismatch between the obj_type used during subscription
+(0) and the value used during notification (1, taken from the event's
+type field). As a result, event mapping for SRQ objects could fail and
+event notification would not be delivered correctly.
+
+This fix adds handling for MLX5_CMD_OP_CREATE_RMP in get_legacy_obj_type,
+returning MLX5_EVENT_QUEUE_TYPE_RQ so obj_type is consistent between
+subscription and notification.
+
+Fixes: 759738537142 ("IB/mlx5: Enable subscription for device events over DEVX")
+Link: https://patch.msgid.link/r/8f1048e3fdd1fde6b90607ce0ed251afaf8a148c.1755088962.git.leon@kernel.org
+Signed-off-by: Or Har-Toov <ohartoov@nvidia.com>
+Reviewed-by: Edward Srouji <edwards@nvidia.com>
+Signed-off-by: Leon Romanovsky <leonro@nvidia.com>
+Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/infiniband/hw/mlx5/devx.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/drivers/infiniband/hw/mlx5/devx.c b/drivers/infiniband/hw/mlx5/devx.c
+index f49f78b69ab9c..e74273bc078be 100644
+--- a/drivers/infiniband/hw/mlx5/devx.c
++++ b/drivers/infiniband/hw/mlx5/devx.c
+@@ -191,6 +191,7 @@ static u16 get_legacy_obj_type(u16 opcode)
+ {
+       switch (opcode) {
+       case MLX5_CMD_OP_CREATE_RQ:
++      case MLX5_CMD_OP_CREATE_RMP:
+               return MLX5_EVENT_QUEUE_TYPE_RQ;
+       case MLX5_CMD_OP_CREATE_QP:
+               return MLX5_EVENT_QUEUE_TYPE_QP;
+-- 
+2.51.0
+
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 (file)
index 0000000..2c4ecc6
--- /dev/null
@@ -0,0 +1,56 @@
+From d1bc7a167103caf4d1752c5479321b01b3e28ea5 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 17 Jun 2025 15:25:52 +0200
+Subject: mmc: sdhci-cadence: add Mobileye eyeQ support
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Benoît Monin <benoit.monin@bootlin.com>
+
+[ Upstream commit 120ffe250dd95b5089d032f582c5be9e3a04b94b ]
+
+The MMC/SDHCI controller implemented by Mobileye needs the preset value
+quirks to configure the clock properly at speed slower than HS200.
+It otherwise works as a standard sd4hc controller.
+
+Signed-off-by: Benoît Monin <benoit.monin@bootlin.com>
+Link: https://lore.kernel.org/r/e97f409650495791e07484589e1666ead570fa12.1750156323.git.benoit.monin@bootlin.com
+Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/mmc/host/sdhci-cadence.c | 11 +++++++++++
+ 1 file changed, 11 insertions(+)
+
+diff --git a/drivers/mmc/host/sdhci-cadence.c b/drivers/mmc/host/sdhci-cadence.c
+index be1505e8c536e..7759531ccca70 100644
+--- a/drivers/mmc/host/sdhci-cadence.c
++++ b/drivers/mmc/host/sdhci-cadence.c
+@@ -433,6 +433,13 @@ static const struct sdhci_cdns_drv_data sdhci_elba_drv_data = {
+       },
+ };
++static const struct sdhci_cdns_drv_data sdhci_eyeq_drv_data = {
++      .pltfm_data = {
++              .ops = &sdhci_cdns_ops,
++              .quirks2 = SDHCI_QUIRK2_PRESET_VALUE_BROKEN,
++      },
++};
++
+ static const struct sdhci_cdns_drv_data sdhci_cdns_drv_data = {
+       .pltfm_data = {
+               .ops = &sdhci_cdns_ops,
+@@ -595,6 +602,10 @@ static const struct of_device_id sdhci_cdns_match[] = {
+               .compatible = "amd,pensando-elba-sd4hc",
+               .data = &sdhci_elba_drv_data,
+       },
++      {
++              .compatible = "mobileye,eyeq-sd4hc",
++              .data = &sdhci_eyeq_drv_data,
++      },
+       { .compatible = "cdns,sd4hc" },
+       { /* sentinel */ }
+ };
+-- 
+2.51.0
+
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 (file)
index 0000000..6ded591
--- /dev/null
@@ -0,0 +1,54 @@
+From 6f8d1edd75c01703cfe815415e180f4f41e3e649 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 18 Jun 2025 14:00:05 +0200
+Subject: net: fec: rename struct fec_devinfo fec_imx6x_info -> fec_imx6sx_info
+
+From: Marc Kleine-Budde <mkl@pengutronix.de>
+
+[ Upstream commit 4e8594a88656fa86a9d2b1e72770432470b6dc0c ]
+
+In da722186f654 ("net: fec: set GPR bit on suspend by DT
+configuration.") the platform_device_id fec_devtype::driver_data was
+converted from holding the quirks to a pointing to struct fec_devinfo.
+
+The struct fec_devinfo holding the information for the i.MX6SX was
+named fec_imx6x_info.
+
+Rename fec_imx6x_info to fec_imx6sx_info to align with the SoC's name.
+
+Reviewed-by: Wei Fang <wei.fang@nxp.com>
+Reviewed-by: Frank Li <Frank.Li@nxp.com>
+Reviewed-by: Andrew Lunn <andrew@lunn.ch>
+Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
+Link: https://patch.msgid.link/20250618-fec-cleanups-v4-5-c16f9a1af124@pengutronix.de
+Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/ethernet/freescale/fec_main.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/net/ethernet/freescale/fec_main.c b/drivers/net/ethernet/freescale/fec_main.c
+index 0bd814251d56e..d144494f97e91 100644
+--- a/drivers/net/ethernet/freescale/fec_main.c
++++ b/drivers/net/ethernet/freescale/fec_main.c
+@@ -131,7 +131,7 @@ static const struct fec_devinfo fec_mvf600_info = {
+                 FEC_QUIRK_HAS_MDIO_C45,
+ };
+-static const struct fec_devinfo fec_imx6x_info = {
++static const struct fec_devinfo fec_imx6sx_info = {
+       .quirks = FEC_QUIRK_ENET_MAC | FEC_QUIRK_HAS_GBIT |
+                 FEC_QUIRK_HAS_BUFDESC_EX | FEC_QUIRK_HAS_CSUM |
+                 FEC_QUIRK_HAS_VLAN | FEC_QUIRK_HAS_AVB |
+@@ -196,7 +196,7 @@ static const struct of_device_id fec_dt_ids[] = {
+       { .compatible = "fsl,imx28-fec", .data = &fec_imx28_info, },
+       { .compatible = "fsl,imx6q-fec", .data = &fec_imx6q_info, },
+       { .compatible = "fsl,mvf600-fec", .data = &fec_mvf600_info, },
+-      { .compatible = "fsl,imx6sx-fec", .data = &fec_imx6x_info, },
++      { .compatible = "fsl,imx6sx-fec", .data = &fec_imx6sx_info, },
+       { .compatible = "fsl,imx6ul-fec", .data = &fec_imx6ul_info, },
+       { .compatible = "fsl,imx8mq-fec", .data = &fec_imx8mq_info, },
+       { .compatible = "fsl,imx8qm-fec", .data = &fec_imx8qm_info, },
+-- 
+2.51.0
+
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 (file)
index 0000000..9712c70
--- /dev/null
@@ -0,0 +1,38 @@
+From 8e8da1bf4065a2c463d8fcb31ffdb19ba772b021 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sun, 31 Aug 2025 12:59:07 +0200
+Subject: net: sfp: add quirk for FLYPRO copper SFP+ module
+
+From: Aleksander Jan Bajkowski <olek2@wp.pl>
+
+[ Upstream commit ddbf0e78a8b20ec18d314d31336a0230fdc9b394 ]
+
+Add quirk for a copper SFP that identifies itself as "FLYPRO"
+"SFP-10GT-CS-30M". It uses RollBall protocol to talk to the PHY.
+
+Signed-off-by: Aleksander Jan Bajkowski <olek2@wp.pl>
+Reviewed-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
+Link: https://patch.msgid.link/20250831105910.3174-1-olek2@wp.pl
+Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/phy/sfp.c | 3 +++
+ 1 file changed, 3 insertions(+)
+
+diff --git a/drivers/net/phy/sfp.c b/drivers/net/phy/sfp.c
+index e8670249d32c1..f1827a1bd7a59 100644
+--- a/drivers/net/phy/sfp.c
++++ b/drivers/net/phy/sfp.c
+@@ -491,6 +491,9 @@ static const struct sfp_quirk sfp_quirks[] = {
+       SFP_QUIRK("ALCATELLUCENT", "3FE46541AA", sfp_quirk_2500basex,
+                 sfp_fixup_nokia),
++      // FLYPRO SFP-10GT-CS-30M uses Rollball protocol to talk to the PHY.
++      SFP_QUIRK_F("FLYPRO", "SFP-10GT-CS-30M", sfp_fixup_rollball),
++
+       // Fiberstore SFP-10G-T doesn't identify as copper, uses the Rollball
+       // protocol to talk to the PHY and needs 4 sec wait before probing the
+       // PHY.
+-- 
+2.51.0
+
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 (file)
index 0000000..5bfd427
--- /dev/null
@@ -0,0 +1,76 @@
+From 35d4e83935f6c63b195f591b1382e4291a5ab16f Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 17 Jun 2025 13:03:24 -0500
+Subject: net: sfp: add quirk for Potron SFP+ XGSPON ONU Stick
+
+From: Chris Morgan <macromorgan@hotmail.com>
+
+[ Upstream commit dfec1c14aecee6813f9bafc7b560cc3a31d24079 ]
+
+Add quirk for Potron SFP+ XGSPON ONU Stick (YV SFP+ONT-XGSPON).
+
+This device uses pins 2 and 7 for UART communication, so disable
+TX_FAULT and LOS. Additionally as it is an embedded system in an
+SFP+ form factor provide it enough time to fully boot before we
+attempt to use it.
+
+https://www.potrontec.com/index/index/list/cat_id/2.html#11-83
+https://pon.wiki/xgs-pon/ont/potron-technology/x-onu-sfpp/
+
+Signed-off-by: Chris Morgan <macromorgan@hotmail.com>
+Link: https://patch.msgid.link/20250617180324.229487-1-macroalpha82@gmail.com
+Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/phy/sfp.c | 21 ++++++++++++++++++++-
+ 1 file changed, 20 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/net/phy/sfp.c b/drivers/net/phy/sfp.c
+index 7b33993f7001e..e8670249d32c1 100644
+--- a/drivers/net/phy/sfp.c
++++ b/drivers/net/phy/sfp.c
+@@ -360,6 +360,11 @@ static void sfp_fixup_ignore_tx_fault(struct sfp *sfp)
+       sfp->state_ignore_mask |= SFP_F_TX_FAULT;
+ }
++static void sfp_fixup_ignore_hw(struct sfp *sfp, unsigned int mask)
++{
++      sfp->state_hw_mask &= ~mask;
++}
++
+ static void sfp_fixup_nokia(struct sfp *sfp)
+ {
+       sfp_fixup_long_startup(sfp);
+@@ -408,7 +413,19 @@ static void sfp_fixup_halny_gsfp(struct sfp *sfp)
+        * these are possibly used for other purposes on this
+        * module, e.g. a serial port.
+        */
+-      sfp->state_hw_mask &= ~(SFP_F_TX_FAULT | SFP_F_LOS);
++      sfp_fixup_ignore_hw(sfp, SFP_F_TX_FAULT | SFP_F_LOS);
++}
++
++static void sfp_fixup_potron(struct sfp *sfp)
++{
++      /*
++       * The TX_FAULT and LOS pins on this device are used for serial
++       * communication, so ignore them. Additionally, provide extra
++       * time for this device to fully start up.
++       */
++
++      sfp_fixup_long_startup(sfp);
++      sfp_fixup_ignore_hw(sfp, SFP_F_TX_FAULT | SFP_F_LOS);
+ }
+ static void sfp_fixup_rollball_cc(struct sfp *sfp)
+@@ -511,6 +528,8 @@ static const struct sfp_quirk sfp_quirks[] = {
+       SFP_QUIRK_F("Walsun", "HXSX-ATRC-1", sfp_fixup_fs_10gt),
+       SFP_QUIRK_F("Walsun", "HXSX-ATRI-1", sfp_fixup_fs_10gt),
++      SFP_QUIRK_F("YV", "SFP+ONU-XGSPON", sfp_fixup_potron),
++
+       // OEM SFP-GE-T is a 1000Base-T module with broken TX_FAULT indicator
+       SFP_QUIRK_F("OEM", "SFP-GE-T", sfp_fixup_ignore_tx_fault),
+-- 
+2.51.0
+
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 (file)
index 0000000..2bc05fc
--- /dev/null
@@ -0,0 +1,53 @@
+From 69b99296cbed1582878ec5b0bf59a62debbe59c5 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sun, 7 Sep 2025 12:40:16 -0700
+Subject: scsi: ufs: mcq: Fix memory allocation checks for SQE and CQE
+
+From: Alok Tiwari <alok.a.tiwari@oracle.com>
+
+[ Upstream commit 5cb782ff3c62c837e4984b6ae9f5d9a423cd5088 ]
+
+Previous checks incorrectly tested the DMA addresses (dma_handle) for
+NULL. Since dma_alloc_coherent() returns the CPU (virtual) address, the
+NULL check should be performed on the *_base_addr pointer to correctly
+detect allocation failures.
+
+Update the checks to validate sqe_base_addr and cqe_base_addr instead of
+sqe_dma_addr and cqe_dma_addr.
+
+Fixes: 4682abfae2eb ("scsi: ufs: core: mcq: Allocate memory for MCQ mode")
+Signed-off-by: Alok Tiwari <alok.a.tiwari@oracle.com>
+Reviewed-by: Alim Akhtar <alim.akhtar@samsung.com>
+Reviewed-by: Manivannan Sadhasivam <mani@kernel.org>
+Reviewed-by: Peter Wang <peter.wang@mediatek.com>
+Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/ufs/core/ufs-mcq.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/ufs/core/ufs-mcq.c b/drivers/ufs/core/ufs-mcq.c
+index 420e943bb73a7..5e6197a6af5e2 100644
+--- a/drivers/ufs/core/ufs-mcq.c
++++ b/drivers/ufs/core/ufs-mcq.c
+@@ -243,7 +243,7 @@ int ufshcd_mcq_memory_alloc(struct ufs_hba *hba)
+               hwq->sqe_base_addr = dmam_alloc_coherent(hba->dev, utrdl_size,
+                                                        &hwq->sqe_dma_addr,
+                                                        GFP_KERNEL);
+-              if (!hwq->sqe_dma_addr) {
++              if (!hwq->sqe_base_addr) {
+                       dev_err(hba->dev, "SQE allocation failed\n");
+                       return -ENOMEM;
+               }
+@@ -252,7 +252,7 @@ int ufshcd_mcq_memory_alloc(struct ufs_hba *hba)
+               hwq->cqe_base_addr = dmam_alloc_coherent(hba->dev, cqe_size,
+                                                        &hwq->cqe_dma_addr,
+                                                        GFP_KERNEL);
+-              if (!hwq->cqe_dma_addr) {
++              if (!hwq->cqe_base_addr) {
+                       dev_err(hba->dev, "CQE allocation failed\n");
+                       return -ENOMEM;
+               }
+-- 
+2.51.0
+
diff --git a/queue-6.12/series b/queue-6.12/series
new file mode 100644 (file)
index 0000000..df670d8
--- /dev/null
@@ -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 (file)
index 0000000..c65af40
--- /dev/null
@@ -0,0 +1,36 @@
+From 9751aca54e163844a18dea59c65cd787fb3e79c0 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 3 Jun 2025 15:10:45 +0800
+Subject: usb: core: Add 0x prefix to quirks debug output
+
+From: Jiayi Li <lijiayi@kylinos.cn>
+
+[ Upstream commit 47c428fce0b41b15ab321d8ede871f780ccd038f ]
+
+Use "0x%x" format for quirks debug print to clarify it's a hexadecimal
+value. Improves readability and consistency with other hex outputs.
+
+Signed-off-by: Jiayi Li <lijiayi@kylinos.cn>
+Link: https://lore.kernel.org/r/20250603071045.3243699-1-lijiayi@kylinos.cn
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/usb/core/quirks.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/usb/core/quirks.c b/drivers/usb/core/quirks.c
+index bfd97cad8aa4d..c0fd8ab3fe8fc 100644
+--- a/drivers/usb/core/quirks.c
++++ b/drivers/usb/core/quirks.c
+@@ -734,7 +734,7 @@ void usb_detect_quirks(struct usb_device *udev)
+       udev->quirks ^= usb_detect_dynamic_quirks(udev);
+       if (udev->quirks)
+-              dev_dbg(&udev->dev, "USB quirks for this device: %x\n",
++              dev_dbg(&udev->dev, "USB quirks for this device: 0x%x\n",
+                       udev->quirks);
+ #ifdef CONFIG_USB_DEFAULT_PERSIST
+-- 
+2.51.0
+
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 (file)
index 0000000..bd54bfa
--- /dev/null
@@ -0,0 +1,68 @@
+From 89062c2302a3e327ce53cce4281360ce356dce91 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 12 Jun 2025 17:00:23 +0100
+Subject: ALSA: hda/realtek: Add support for ASUS NUC using CS35L41 HDA
+
+From: Stefan Binding <sbinding@opensource.cirrus.com>
+
+[ Upstream commit 84fc8896f0d9d1c075e0e08a416faedbd73907fa ]
+
+Add support for ASUS NUC14LNS.
+
+This NUC uses a single CS35L41 Amp in using Internal Boost with SPI.
+To support the Single Amp, a new quirk is required.
+
+Signed-off-by: Stefan Binding <sbinding@opensource.cirrus.com>
+Link: https://patch.msgid.link/20250612160029.848104-3-sbinding@opensource.cirrus.com
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/pci/hda/patch_realtek.c | 11 +++++++++++
+ 1 file changed, 11 insertions(+)
+
+diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c
+index 4819bd332f039..fa28e3e85861c 100644
+--- a/sound/pci/hda/patch_realtek.c
++++ b/sound/pci/hda/patch_realtek.c
+@@ -7298,6 +7298,11 @@ static void cs35l41_fixup_spi_two(struct hda_codec *codec, const struct hda_fixu
+       comp_generic_fixup(codec, action, "spi", "CSC3551", "-%s:00-cs35l41-hda.%d", 2);
+ }
++static void cs35l41_fixup_spi_one(struct hda_codec *codec, const struct hda_fixup *fix, int action)
++{
++      comp_generic_fixup(codec, action, "spi", "CSC3551", "-%s:00-cs35l41-hda.%d", 1);
++}
++
+ static void cs35l41_fixup_spi_four(struct hda_codec *codec, const struct hda_fixup *fix, int action)
+ {
+       comp_generic_fixup(codec, action, "spi", "CSC3551", "-%s:00-cs35l41-hda.%d", 4);
+@@ -7991,6 +7996,7 @@ enum {
+       ALC287_FIXUP_CS35L41_I2C_2,
+       ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED,
+       ALC287_FIXUP_CS35L41_I2C_4,
++      ALC245_FIXUP_CS35L41_SPI_1,
+       ALC245_FIXUP_CS35L41_SPI_2,
+       ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED,
+       ALC245_FIXUP_CS35L41_SPI_4,
+@@ -10120,6 +10126,10 @@ static const struct hda_fixup alc269_fixups[] = {
+               .type = HDA_FIXUP_FUNC,
+               .v.func = cs35l41_fixup_spi_two,
+       },
++      [ALC245_FIXUP_CS35L41_SPI_1] = {
++              .type = HDA_FIXUP_FUNC,
++              .v.func = cs35l41_fixup_spi_one,
++      },
+       [ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED] = {
+               .type = HDA_FIXUP_FUNC,
+               .v.func = cs35l41_fixup_spi_two,
+@@ -11099,6 +11109,7 @@ static const struct hda_quirk alc269_fixup_tbl[] = {
+       SND_PCI_QUIRK(0x1043, 0x8398, "ASUS P1005", ALC269_FIXUP_STEREO_DMIC),
+       SND_PCI_QUIRK(0x1043, 0x83ce, "ASUS P1005", ALC269_FIXUP_STEREO_DMIC),
+       SND_PCI_QUIRK(0x1043, 0x8516, "ASUS X101CH", ALC269_FIXUP_ASUS_X101),
++      SND_PCI_QUIRK(0x1043, 0x88f4, "ASUS NUC14LNS", ALC245_FIXUP_CS35L41_SPI_1),
+       SND_PCI_QUIRK(0x104d, 0x9073, "Sony VAIO", ALC275_FIXUP_SONY_VAIO_GPIO2),
+       SND_PCI_QUIRK(0x104d, 0x907b, "Sony VAIO", ALC275_FIXUP_SONY_HWEQ),
+       SND_PCI_QUIRK(0x104d, 0x9084, "Sony VAIO", ALC275_FIXUP_SONY_HWEQ),
+-- 
+2.51.0
+
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 (file)
index 0000000..24ba901
--- /dev/null
@@ -0,0 +1,40 @@
+From decc4cd1c2823816111fed796d8a8aaf7bce62f1 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 31 Jul 2025 19:06:14 +0800
+Subject: ALSA: usb-audio: Add DSD support for Comtrue USB Audio device
+
+From: noble.yang <noble.yang@comtrue-inc.com>
+
+[ Upstream commit e9df1755485dd90a89656e8a21ec4d71c909fa30 ]
+
+The vendor Comtrue Inc. (0x2fc6) produces USB audio chipsets like
+the CT7601 which are capable of Native DSD playback.
+
+This patch adds QUIRK_FLAG_DSD_RAW for Comtrue (VID 0x2fc6), which enables
+native DSD playback (DSD_U32_LE) on their USB Audio device. This has been
+verified under Ubuntu 25.04 with JRiver.
+
+Signed-off-by: noble.yang <noble.yang@comtrue-inc.com>
+Link: https://patch.msgid.link/20250731110614.4070-1-noble228@gmail.com
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/quirks.c | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/sound/usb/quirks.c b/sound/usb/quirks.c
+index bd24f3a78ea9d..e75b0b1df6eb2 100644
+--- a/sound/usb/quirks.c
++++ b/sound/usb/quirks.c
+@@ -2408,6 +2408,8 @@ static const struct usb_audio_quirk_flags_table quirk_flags_table[] = {
+                  QUIRK_FLAG_DSD_RAW),
+       VENDOR_FLG(0x2d87, /* Cayin device */
+                  QUIRK_FLAG_DSD_RAW),
++      VENDOR_FLG(0x2fc6, /* Comture-inc devices */
++                 QUIRK_FLAG_DSD_RAW),
+       VENDOR_FLG(0x3336, /* HEM devices */
+                  QUIRK_FLAG_DSD_RAW),
+       VENDOR_FLG(0x3353, /* Khadas devices */
+-- 
+2.51.0
+
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 (file)
index 0000000..fccda5a
--- /dev/null
@@ -0,0 +1,321 @@
+From 3384e9d7e13293e641c4a2a343654f9ad33d15bb Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 26 May 2025 17:07:48 +0300
+Subject: ALSA: usb-audio: Add mixer quirk for Sony DualSense PS5
+
+From: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+
+[ Upstream commit 79d561c4ec0497669f19a9550cfb74812f60938b ]
+
+The Sony DualSense wireless controller (PS5) features an internal mono
+speaker, but it also provides a 3.5mm jack socket for headphone output
+and headset microphone input.
+
+Since this is a UAC1 device, it doesn't advertise any jack detection
+capability.  However, the controller is able to report HP & MIC insert
+events via HID, i.e. through a dedicated input device managed by the
+hid-playstation driver.
+
+Add a quirk to create the jack controls for headphone and headset mic,
+respectively, and setup an input handler for each of them in order to
+intercept the related hotplug events.
+
+Signed-off-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Link: https://patch.msgid.link/20250526-dualsense-alsa-jack-v1-9-1a821463b632@collabora.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/mixer_quirks.c | 263 +++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 263 insertions(+)
+
+diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
+index 5507340a7723e..28842e49700d8 100644
+--- a/sound/usb/mixer_quirks.c
++++ b/sound/usb/mixer_quirks.c
+@@ -17,6 +17,7 @@
+ #include <linux/bitfield.h>
+ #include <linux/hid.h>
+ #include <linux/init.h>
++#include <linux/input.h>
+ #include <linux/math64.h>
+ #include <linux/slab.h>
+ #include <linux/usb.h>
+@@ -531,6 +532,263 @@ static int snd_emu0204_controls_create(struct usb_mixer_interface *mixer)
+                                         &snd_emu0204_control, NULL);
+ }
++/*
++ * Sony DualSense controller (PS5) jack detection
++ *
++ * Since this is an UAC 1 device, it doesn't support jack detection.
++ * However, the controller hid-playstation driver reports HP & MIC
++ * insert events through a dedicated input device.
++ */
++
++#define SND_DUALSENSE_JACK_OUT_TERM_ID 3
++#define SND_DUALSENSE_JACK_IN_TERM_ID 4
++
++struct dualsense_mixer_elem_info {
++      struct usb_mixer_elem_info info;
++      struct input_handler ih;
++      struct input_device_id id_table[2];
++      bool connected;
++};
++
++static void snd_dualsense_ih_event(struct input_handle *handle,
++                                 unsigned int type, unsigned int code,
++                                 int value)
++{
++      struct dualsense_mixer_elem_info *mei;
++      struct usb_mixer_elem_list *me;
++
++      if (type != EV_SW)
++              return;
++
++      mei = container_of(handle->handler, struct dualsense_mixer_elem_info, ih);
++      me = &mei->info.head;
++
++      if ((me->id == SND_DUALSENSE_JACK_OUT_TERM_ID && code == SW_HEADPHONE_INSERT) ||
++          (me->id == SND_DUALSENSE_JACK_IN_TERM_ID && code == SW_MICROPHONE_INSERT)) {
++              mei->connected = !!value;
++              snd_ctl_notify(me->mixer->chip->card, SNDRV_CTL_EVENT_MASK_VALUE,
++                             &me->kctl->id);
++      }
++}
++
++static bool snd_dualsense_ih_match(struct input_handler *handler,
++                                 struct input_dev *dev)
++{
++      struct dualsense_mixer_elem_info *mei;
++      struct usb_device *snd_dev;
++      char *input_dev_path, *usb_dev_path;
++      size_t usb_dev_path_len;
++      bool match = false;
++
++      mei = container_of(handler, struct dualsense_mixer_elem_info, ih);
++      snd_dev = mei->info.head.mixer->chip->dev;
++
++      input_dev_path = kobject_get_path(&dev->dev.kobj, GFP_KERNEL);
++      if (!input_dev_path) {
++              dev_warn(&snd_dev->dev, "Failed to get input dev path\n");
++              return false;
++      }
++
++      usb_dev_path = kobject_get_path(&snd_dev->dev.kobj, GFP_KERNEL);
++      if (!usb_dev_path) {
++              dev_warn(&snd_dev->dev, "Failed to get USB dev path\n");
++              goto free_paths;
++      }
++
++      /*
++       * Ensure the VID:PID matched input device supposedly owned by the
++       * hid-playstation driver belongs to the actual hardware handled by
++       * the current USB audio device, which implies input_dev_path being
++       * a subpath of usb_dev_path.
++       *
++       * This verification is necessary when there is more than one identical
++       * controller attached to the host system.
++       */
++      usb_dev_path_len = strlen(usb_dev_path);
++      if (usb_dev_path_len >= strlen(input_dev_path))
++              goto free_paths;
++
++      usb_dev_path[usb_dev_path_len] = '/';
++      match = !memcmp(input_dev_path, usb_dev_path, usb_dev_path_len + 1);
++
++free_paths:
++      kfree(input_dev_path);
++      kfree(usb_dev_path);
++
++      return match;
++}
++
++static int snd_dualsense_ih_connect(struct input_handler *handler,
++                                  struct input_dev *dev,
++                                  const struct input_device_id *id)
++{
++      struct input_handle *handle;
++      int err;
++
++      handle = kzalloc(sizeof(*handle), GFP_KERNEL);
++      if (!handle)
++              return -ENOMEM;
++
++      handle->dev = dev;
++      handle->handler = handler;
++      handle->name = handler->name;
++
++      err = input_register_handle(handle);
++      if (err)
++              goto err_free;
++
++      err = input_open_device(handle);
++      if (err)
++              goto err_unregister;
++
++      return 0;
++
++err_unregister:
++      input_unregister_handle(handle);
++err_free:
++      kfree(handle);
++      return err;
++}
++
++static void snd_dualsense_ih_disconnect(struct input_handle *handle)
++{
++      input_close_device(handle);
++      input_unregister_handle(handle);
++      kfree(handle);
++}
++
++static void snd_dualsense_ih_start(struct input_handle *handle)
++{
++      struct dualsense_mixer_elem_info *mei;
++      struct usb_mixer_elem_list *me;
++      int status = -1;
++
++      mei = container_of(handle->handler, struct dualsense_mixer_elem_info, ih);
++      me = &mei->info.head;
++
++      if (me->id == SND_DUALSENSE_JACK_OUT_TERM_ID &&
++          test_bit(SW_HEADPHONE_INSERT, handle->dev->swbit))
++              status = test_bit(SW_HEADPHONE_INSERT, handle->dev->sw);
++      else if (me->id == SND_DUALSENSE_JACK_IN_TERM_ID &&
++               test_bit(SW_MICROPHONE_INSERT, handle->dev->swbit))
++              status = test_bit(SW_MICROPHONE_INSERT, handle->dev->sw);
++
++      if (status >= 0) {
++              mei->connected = !!status;
++              snd_ctl_notify(me->mixer->chip->card, SNDRV_CTL_EVENT_MASK_VALUE,
++                             &me->kctl->id);
++      }
++}
++
++static int snd_dualsense_jack_get(struct snd_kcontrol *kctl,
++                                struct snd_ctl_elem_value *ucontrol)
++{
++      struct dualsense_mixer_elem_info *mei = snd_kcontrol_chip(kctl);
++
++      ucontrol->value.integer.value[0] = mei->connected;
++
++      return 0;
++}
++
++static const struct snd_kcontrol_new snd_dualsense_jack_control = {
++      .iface = SNDRV_CTL_ELEM_IFACE_CARD,
++      .access = SNDRV_CTL_ELEM_ACCESS_READ,
++      .info = snd_ctl_boolean_mono_info,
++      .get = snd_dualsense_jack_get,
++};
++
++static int snd_dualsense_resume_jack(struct usb_mixer_elem_list *list)
++{
++      snd_ctl_notify(list->mixer->chip->card, SNDRV_CTL_EVENT_MASK_VALUE,
++                     &list->kctl->id);
++      return 0;
++}
++
++static void snd_dualsense_mixer_elem_free(struct snd_kcontrol *kctl)
++{
++      struct dualsense_mixer_elem_info *mei = snd_kcontrol_chip(kctl);
++
++      if (mei->ih.event)
++              input_unregister_handler(&mei->ih);
++
++      snd_usb_mixer_elem_free(kctl);
++}
++
++static int snd_dualsense_jack_create(struct usb_mixer_interface *mixer,
++                                   const char *name, bool is_output)
++{
++      struct dualsense_mixer_elem_info *mei;
++      struct input_device_id *idev_id;
++      struct snd_kcontrol *kctl;
++      int err;
++
++      mei = kzalloc(sizeof(*mei), GFP_KERNEL);
++      if (!mei)
++              return -ENOMEM;
++
++      snd_usb_mixer_elem_init_std(&mei->info.head, mixer,
++                                  is_output ? SND_DUALSENSE_JACK_OUT_TERM_ID :
++                                              SND_DUALSENSE_JACK_IN_TERM_ID);
++
++      mei->info.head.resume = snd_dualsense_resume_jack;
++      mei->info.val_type = USB_MIXER_BOOLEAN;
++      mei->info.channels = 1;
++      mei->info.min = 0;
++      mei->info.max = 1;
++
++      kctl = snd_ctl_new1(&snd_dualsense_jack_control, mei);
++      if (!kctl) {
++              kfree(mei);
++              return -ENOMEM;
++      }
++
++      strscpy(kctl->id.name, name, sizeof(kctl->id.name));
++      kctl->private_free = snd_dualsense_mixer_elem_free;
++
++      err = snd_usb_mixer_add_control(&mei->info.head, kctl);
++      if (err)
++              return err;
++
++      idev_id = &mei->id_table[0];
++      idev_id->flags = INPUT_DEVICE_ID_MATCH_VENDOR | INPUT_DEVICE_ID_MATCH_PRODUCT |
++                       INPUT_DEVICE_ID_MATCH_EVBIT | INPUT_DEVICE_ID_MATCH_SWBIT;
++      idev_id->vendor = USB_ID_VENDOR(mixer->chip->usb_id);
++      idev_id->product = USB_ID_PRODUCT(mixer->chip->usb_id);
++      idev_id->evbit[BIT_WORD(EV_SW)] = BIT_MASK(EV_SW);
++      if (is_output)
++              idev_id->swbit[BIT_WORD(SW_HEADPHONE_INSERT)] = BIT_MASK(SW_HEADPHONE_INSERT);
++      else
++              idev_id->swbit[BIT_WORD(SW_MICROPHONE_INSERT)] = BIT_MASK(SW_MICROPHONE_INSERT);
++
++      mei->ih.event = snd_dualsense_ih_event;
++      mei->ih.match = snd_dualsense_ih_match;
++      mei->ih.connect = snd_dualsense_ih_connect,
++      mei->ih.disconnect = snd_dualsense_ih_disconnect,
++      mei->ih.start = snd_dualsense_ih_start,
++      mei->ih.name = name;
++      mei->ih.id_table = mei->id_table;
++
++      err = input_register_handler(&mei->ih);
++      if (err) {
++              dev_warn(&mixer->chip->dev->dev,
++                       "Could not register input handler: %d\n", err);
++              mei->ih.event = NULL;
++      }
++
++      return 0;
++}
++
++static int snd_dualsense_controls_create(struct usb_mixer_interface *mixer)
++{
++      int err;
++
++      err = snd_dualsense_jack_create(mixer, "Headphone Jack", true);
++      if (err < 0)
++              return err;
++
++      return snd_dualsense_jack_create(mixer, "Headset Mic Jack", false);
++}
++
+ /* ASUS Xonar U1 / U3 controls */
+ static int snd_xonar_u1_switch_get(struct snd_kcontrol *kcontrol,
+@@ -4073,6 +4331,11 @@ int snd_usb_mixer_apply_create_quirk(struct usb_mixer_interface *mixer)
+               err = snd_emu0204_controls_create(mixer);
+               break;
++      case USB_ID(0x054c, 0x0ce6): /* Sony DualSense controller (PS5) */
++      case USB_ID(0x054c, 0x0df2): /* Sony DualSense Edge controller (PS5) */
++              err = snd_dualsense_controls_create(mixer);
++              break;
++
+       case USB_ID(0x0763, 0x2030): /* M-Audio Fast Track C400 */
+       case USB_ID(0x0763, 0x2031): /* M-Audio Fast Track C400 */
+               err = snd_c400_create_mixer(mixer);
+-- 
+2.51.0
+
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 (file)
index 0000000..a3eb9b0
--- /dev/null
@@ -0,0 +1,73 @@
+From e025cc0e24b72a15c0906f8f8c16843272c4a352 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 29 Aug 2025 14:40:48 +0800
+Subject: ALSA: usb-audio: Add mute TLV for playback volumes on more devices
+
+From: qaqland <anguoli@uniontech.com>
+
+[ Upstream commit 2cbe4ac193ed7172cfd825c0cc46ce4a41be4ba1 ]
+
+Applying the quirk of that, the lowest Playback mixer volume setting
+mutes the audio output, on more devices.
+
+Suggested-by: Cryolitia PukNgae <cryolitia@uniontech.com>
+Signed-off-by: qaqland <anguoli@uniontech.com>
+Link: https://patch.msgid.link/20250829-sound_quirk-v1-1-745529b44440@uniontech.com
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/quirks.c | 10 ++++++++++
+ 1 file changed, 10 insertions(+)
+
+diff --git a/sound/usb/quirks.c b/sound/usb/quirks.c
+index 8bc1e247cdf1a..766db7d00cbc9 100644
+--- a/sound/usb/quirks.c
++++ b/sound/usb/quirks.c
+@@ -2199,6 +2199,8 @@ static const struct usb_audio_quirk_flags_table quirk_flags_table[] = {
+                  QUIRK_FLAG_SET_IFACE_FIRST),
+       DEVICE_FLG(0x0556, 0x0014, /* Phoenix Audio TMX320VC */
+                  QUIRK_FLAG_GET_SAMPLE_RATE),
++      DEVICE_FLG(0x0572, 0x1b08, /* Conexant Systems (Rockwell), Inc. */
++                 QUIRK_FLAG_MIXER_MIN_MUTE),
+       DEVICE_FLG(0x0572, 0x1b09, /* Conexant Systems (Rockwell), Inc. */
+                  QUIRK_FLAG_MIXER_MIN_MUTE),
+       DEVICE_FLG(0x05a3, 0x9420, /* ELP HD USB Camera */
+@@ -2243,6 +2245,8 @@ static const struct usb_audio_quirk_flags_table quirk_flags_table[] = {
+                  QUIRK_FLAG_CTL_MSG_DELAY_1M),
+       DEVICE_FLG(0x0b0e, 0x0349, /* Jabra 550a */
+                  QUIRK_FLAG_CTL_MSG_DELAY_1M),
++      DEVICE_FLG(0x0bda, 0x498a, /* Realtek Semiconductor Corp. */
++                 QUIRK_FLAG_MIXER_MIN_MUTE),
+       DEVICE_FLG(0x0c45, 0x6340, /* Sonix HD USB Camera */
+                  QUIRK_FLAG_GET_SAMPLE_RATE),
+       DEVICE_FLG(0x0c45, 0x636b, /* Microdia JP001 USB Camera */
+@@ -2259,6 +2263,8 @@ static const struct usb_audio_quirk_flags_table quirk_flags_table[] = {
+                  QUIRK_FLAG_SHARE_MEDIA_DEVICE | QUIRK_FLAG_ALIGN_TRANSFER),
+       DEVICE_FLG(0x1101, 0x0003, /* Audioengine D1 */
+                  QUIRK_FLAG_GET_SAMPLE_RATE),
++      DEVICE_FLG(0x12d1, 0x3a07, /* Huawei Technologies Co., Ltd. */
++                 QUIRK_FLAG_MIXER_MIN_MUTE),
+       DEVICE_FLG(0x1224, 0x2a25, /* Jieli Technology USB PHY 2.0 */
+                  QUIRK_FLAG_GET_SAMPLE_RATE | QUIRK_FLAG_MIC_RES_16),
+       DEVICE_FLG(0x1395, 0x740a, /* Sennheiser DECT */
+@@ -2349,6 +2355,8 @@ static const struct usb_audio_quirk_flags_table quirk_flags_table[] = {
+                  QUIRK_FLAG_IGNORE_CTL_ERROR),
+       DEVICE_FLG(0x2912, 0x30c8, /* Audioengine D1 */
+                  QUIRK_FLAG_GET_SAMPLE_RATE),
++      DEVICE_FLG(0x2a70, 0x1881, /* OnePlus Technology (Shenzhen) Co., Ltd. BE02T */
++                 QUIRK_FLAG_MIXER_MIN_MUTE),
+       DEVICE_FLG(0x2b53, 0x0023, /* Fiero SC-01 (firmware v1.0.0 @ 48 kHz) */
+                  QUIRK_FLAG_GENERIC_IMPLICIT_FB),
+       DEVICE_FLG(0x2b53, 0x0024, /* Fiero SC-01 (firmware v1.0.0 @ 96 kHz) */
+@@ -2365,6 +2373,8 @@ static const struct usb_audio_quirk_flags_table quirk_flags_table[] = {
+                  QUIRK_FLAG_CTL_MSG_DELAY_1M),
+       DEVICE_FLG(0x30be, 0x0101, /* Schiit Hel */
+                  QUIRK_FLAG_IGNORE_CTL_ERROR),
++      DEVICE_FLG(0x339b, 0x3a07, /* Synaptics HONOR USB-C HEADSET */
++                 QUIRK_FLAG_MIXER_MIN_MUTE),
+       DEVICE_FLG(0x413c, 0xa506, /* Dell AE515 sound bar */
+                  QUIRK_FLAG_GET_SAMPLE_RATE),
+       DEVICE_FLG(0x534d, 0x0021, /* MacroSilicon MS2100/MS2106 */
+-- 
+2.51.0
+
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 (file)
index 0000000..e1d019e
--- /dev/null
@@ -0,0 +1,38 @@
+From 1eb785168edc6468059db12223f2e77c9dbc5981 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 26 May 2025 17:07:45 +0300
+Subject: ALSA: usb-audio: Avoid multiple assignments in mixer_quirks
+
+From: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+
+[ Upstream commit 03ddd3bdb94df3edb1f2408b57cfb00b3d92a208 ]
+
+Handle report from checkpatch.pl:
+
+  CHECK: multiple assignments should be avoided
+
+Signed-off-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Link: https://patch.msgid.link/20250526-dualsense-alsa-jack-v1-6-1a821463b632@collabora.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/mixer_quirks.c | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
+index eb245272f123a..741a70d0816cc 100644
+--- a/sound/usb/mixer_quirks.c
++++ b/sound/usb/mixer_quirks.c
+@@ -1739,7 +1739,8 @@ static int snd_microii_spdif_default_put(struct snd_kcontrol *kcontrol,
+       unsigned int pval, pval_old;
+       int err;
+-      pval = pval_old = kcontrol->private_value;
++      pval = kcontrol->private_value;
++      pval_old = pval;
+       pval &= 0xfffff0f0;
+       pval |= (ucontrol->value.iec958.status[1] & 0x0f) << 8;
+       pval |= (ucontrol->value.iec958.status[0] & 0x0f);
+-- 
+2.51.0
+
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 (file)
index 0000000..a8c167b
--- /dev/null
@@ -0,0 +1,49 @@
+From c4d797fdb36594ea83b93a261f245b8942819b02 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 12 Jun 2025 14:02:28 +0800
+Subject: ALSA: usb-audio: Convert comma to semicolon
+
+From: Chen Ni <nichen@iscas.ac.cn>
+
+[ Upstream commit 9ca30a1b007d5fefb5752428f852a2d8d7219c1c ]
+
+Replace comma between expressions with semicolons.
+
+Using a ',' in place of a ';' can have unintended side effects.
+Although that is not the case here, it is seems best to use ';'
+unless ',' is intended.
+
+Found by inspection.
+No functional change intended.
+Compile tested only.
+
+Fixes: 79d561c4ec04 ("ALSA: usb-audio: Add mixer quirk for Sony DualSense PS5")
+Signed-off-by: Chen Ni <nichen@iscas.ac.cn>
+Reviewed-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+Link: https://patch.msgid.link/20250612060228.1518028-1-nichen@iscas.ac.cn
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/mixer_quirks.c | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
+index 28842e49700d8..8cb98b5d31124 100644
+--- a/sound/usb/mixer_quirks.c
++++ b/sound/usb/mixer_quirks.c
+@@ -762,9 +762,9 @@ static int snd_dualsense_jack_create(struct usb_mixer_interface *mixer,
+       mei->ih.event = snd_dualsense_ih_event;
+       mei->ih.match = snd_dualsense_ih_match;
+-      mei->ih.connect = snd_dualsense_ih_connect,
+-      mei->ih.disconnect = snd_dualsense_ih_disconnect,
+-      mei->ih.start = snd_dualsense_ih_start,
++      mei->ih.connect = snd_dualsense_ih_connect;
++      mei->ih.disconnect = snd_dualsense_ih_disconnect;
++      mei->ih.start = snd_dualsense_ih_start;
+       mei->ih.name = name;
+       mei->ih.id_table = mei->id_table;
+-- 
+2.51.0
+
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 (file)
index 0000000..266c6c1
--- /dev/null
@@ -0,0 +1,49 @@
+From 8712eff9fbf533b4d2e1f3df04d4b06fcd6064cc Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 26 May 2025 17:07:44 +0300
+Subject: ALSA: usb-audio: Drop unnecessary parentheses in mixer_quirks
+
+From: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+
+[ Upstream commit c0495cef8b43ad61efbd4019e3573742e0e63c67 ]
+
+Fix multiple 'CHECK: Unnecessary parentheses around ...' reports from
+checkpatch.pl.
+
+Signed-off-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Link: https://patch.msgid.link/20250526-dualsense-alsa-jack-v1-5-1a821463b632@collabora.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/mixer_quirks.c | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
+index c4d79a9ce2baa..eb245272f123a 100644
+--- a/sound/usb/mixer_quirks.c
++++ b/sound/usb/mixer_quirks.c
+@@ -380,10 +380,10 @@ static int snd_audigy2nx_controls_create(struct usb_mixer_interface *mixer)
+               struct snd_kcontrol_new knew;
+               /* USB X-Fi S51 doesn't have a CMSS LED */
+-              if ((mixer->chip->usb_id == USB_ID(0x041e, 0x3042)) && i == 0)
++              if (mixer->chip->usb_id == USB_ID(0x041e, 0x3042) && i == 0)
+                       continue;
+               /* USB X-Fi S51 Pro doesn't have one either */
+-              if ((mixer->chip->usb_id == USB_ID(0x041e, 0x30df)) && i == 0)
++              if (mixer->chip->usb_id == USB_ID(0x041e, 0x30df) && i == 0)
+                       continue;
+               if (i > 1 && /* Live24ext has 2 LEDs only */
+                       (mixer->chip->usb_id == USB_ID(0x041e, 0x3040) ||
+@@ -3955,7 +3955,7 @@ static int snd_djm_controls_update(struct usb_mixer_interface *mixer,
+       int err;
+       const struct snd_djm_device *device = &snd_djm_devices[device_idx];
+-      if ((group >= device->ncontrols) || value >= device->controls[group].noptions)
++      if (group >= device->ncontrols || value >= device->controls[group].noptions)
+               return -EINVAL;
+       err = snd_usb_lock_shutdown(mixer->chip);
+-- 
+2.51.0
+
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 (file)
index 0000000..fbece0b
--- /dev/null
@@ -0,0 +1,49 @@
+From c5e37cf0f4779f6245f07b6b10764c6ee3345cf3 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 26 May 2025 17:07:43 +0300
+Subject: ALSA: usb-audio: Fix block comments in mixer_quirks
+
+From: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+
+[ Upstream commit 231225d8a20f8668b4fd6601d54a2fac0e0ab7a5 ]
+
+Address a couple of comment formatting issues indicated by
+checkpatch.pl:
+
+  WARNING: Block comments use a trailing */ on a separate line
+
+Signed-off-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Link: https://patch.msgid.link/20250526-dualsense-alsa-jack-v1-4-1a821463b632@collabora.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/mixer_quirks.c | 6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
+
+diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
+index 0aad92cb33276..c4d79a9ce2baa 100644
+--- a/sound/usb/mixer_quirks.c
++++ b/sound/usb/mixer_quirks.c
+@@ -78,7 +78,8 @@ static int snd_create_std_mono_ctl_offset(struct usb_mixer_interface *mixer,
+       cval->idx_off = idx_off;
+       /* get_min_max() is called only for integer volumes later,
+-       * so provide a short-cut for booleans */
++       * so provide a short-cut for booleans
++       */
+       cval->min = 0;
+       cval->max = 1;
+       cval->res = 0;
+@@ -4255,7 +4256,8 @@ static void snd_dragonfly_quirk_db_scale(struct usb_mixer_interface *mixer,
+                                        struct snd_kcontrol *kctl)
+ {
+       /* Approximation using 10 ranges based on output measurement on hw v1.2.
+-       * This seems close to the cubic mapping e.g. alsamixer uses. */
++       * This seems close to the cubic mapping e.g. alsamixer uses.
++       */
+       static const DECLARE_TLV_DB_RANGE(scale,
+                0,  1, TLV_DB_MINMAX_ITEM(-5300, -4970),
+                2,  5, TLV_DB_MINMAX_ITEM(-4710, -4160),
+-- 
+2.51.0
+
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 (file)
index 0000000..c148b20
--- /dev/null
@@ -0,0 +1,61 @@
+From a1909621ea9fd0a6e71f44a5e40331c15a63e450 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 13 Jun 2025 10:15:30 +0200
+Subject: ALSA: usb-audio: Fix build with CONFIG_INPUT=n
+
+From: Takashi Iwai <tiwai@suse.de>
+
+[ Upstream commit d0630a0b80c08530857146e3bf183a7d6b743847 ]
+
+The recent addition of DualSense mixer quirk relies on the input
+device handle, and the build can fail if CONFIG_INPUT isn't set.
+Put (rather ugly) workarounds to wrap with IS_REACHABLE() for avoiding
+the build error.
+
+Fixes: 79d561c4ec04 ("ALSA: usb-audio: Add mixer quirk for Sony DualSense PS5")
+Reported-by: kernel test robot <lkp@intel.com>
+Closes: https://lore.kernel.org/oe-kbuild-all/202506130733.gnPKw2l3-lkp@intel.com/
+Reviewed-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+Link: https://patch.msgid.link/20250613081543.7404-1-tiwai@suse.de
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/mixer_quirks.c | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
+index 8cb98b5d31124..6b47b3145d2cf 100644
+--- a/sound/usb/mixer_quirks.c
++++ b/sound/usb/mixer_quirks.c
+@@ -532,6 +532,7 @@ static int snd_emu0204_controls_create(struct usb_mixer_interface *mixer)
+                                         &snd_emu0204_control, NULL);
+ }
++#if IS_REACHABLE(CONFIG_INPUT)
+ /*
+  * Sony DualSense controller (PS5) jack detection
+  *
+@@ -788,6 +789,7 @@ static int snd_dualsense_controls_create(struct usb_mixer_interface *mixer)
+       return snd_dualsense_jack_create(mixer, "Headset Mic Jack", false);
+ }
++#endif /* IS_REACHABLE(CONFIG_INPUT) */
+ /* ASUS Xonar U1 / U3 controls */
+@@ -4331,10 +4333,12 @@ int snd_usb_mixer_apply_create_quirk(struct usb_mixer_interface *mixer)
+               err = snd_emu0204_controls_create(mixer);
+               break;
++#if IS_REACHABLE(CONFIG_INPUT)
+       case USB_ID(0x054c, 0x0ce6): /* Sony DualSense controller (PS5) */
+       case USB_ID(0x054c, 0x0df2): /* Sony DualSense Edge controller (PS5) */
+               err = snd_dualsense_controls_create(mixer);
+               break;
++#endif /* IS_REACHABLE(CONFIG_INPUT) */
+       case USB_ID(0x0763, 0x2030): /* M-Audio Fast Track C400 */
+       case USB_ID(0x0763, 0x2031): /* M-Audio Fast Track C400 */
+-- 
+2.51.0
+
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 (file)
index 0000000..72d9bde
--- /dev/null
@@ -0,0 +1,597 @@
+From b60d27fddea61ff6276b83f4f243e9c13ccb793c Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 26 May 2025 17:07:40 +0300
+Subject: ALSA: usb-audio: Fix code alignment in mixer_quirks
+
+From: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+
+[ Upstream commit bca638aa737d13749a871d1a0d2ed276501ffc54 ]
+
+Format code to fix all alignment issues reported by checkpatch.pl:
+
+  CHECK: Alignment should match open parenthesis
+
+Signed-off-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Link: https://patch.msgid.link/20250526-dualsense-alsa-jack-v1-1-1a821463b632@collabora.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/mixer_quirks.c | 250 ++++++++++++++++++++-------------------
+ 1 file changed, 127 insertions(+), 123 deletions(-)
+
+diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
+index 9530c59b3cf4c..7f1e7a5fe8f0a 100644
+--- a/sound/usb/mixer_quirks.c
++++ b/sound/usb/mixer_quirks.c
+@@ -55,13 +55,13 @@ struct std_mono_table {
+  * version, we keep it mono for simplicity.
+  */
+ static int snd_create_std_mono_ctl_offset(struct usb_mixer_interface *mixer,
+-                              unsigned int unitid,
+-                              unsigned int control,
+-                              unsigned int cmask,
+-                              int val_type,
+-                              unsigned int idx_off,
+-                              const char *name,
+-                              snd_kcontrol_tlv_rw_t *tlv_callback)
++                                        unsigned int unitid,
++                                        unsigned int control,
++                                        unsigned int cmask,
++                                        int val_type,
++                                        unsigned int idx_off,
++                                        const char *name,
++                                        snd_kcontrol_tlv_rw_t *tlv_callback)
+ {
+       struct usb_mixer_elem_info *cval;
+       struct snd_kcontrol *kctl;
+@@ -108,15 +108,16 @@ static int snd_create_std_mono_ctl_offset(struct usb_mixer_interface *mixer,
+ }
+ static int snd_create_std_mono_ctl(struct usb_mixer_interface *mixer,
+-                              unsigned int unitid,
+-                              unsigned int control,
+-                              unsigned int cmask,
+-                              int val_type,
+-                              const char *name,
+-                              snd_kcontrol_tlv_rw_t *tlv_callback)
++                                 unsigned int unitid,
++                                 unsigned int control,
++                                 unsigned int cmask,
++                                 int val_type,
++                                 const char *name,
++                                 snd_kcontrol_tlv_rw_t *tlv_callback)
+ {
+       return snd_create_std_mono_ctl_offset(mixer, unitid, control, cmask,
+-              val_type, 0 /* Offset */, name, tlv_callback);
++                                            val_type, 0 /* Offset */,
++                                            name, tlv_callback);
+ }
+ /*
+@@ -129,7 +130,8 @@ static int snd_create_std_mono_table(struct usb_mixer_interface *mixer,
+       while (t->name != NULL) {
+               err = snd_create_std_mono_ctl(mixer, t->unitid, t->control,
+-                              t->cmask, t->val_type, t->name, t->tlv_callback);
++                                            t->cmask, t->val_type, t->name,
++                                            t->tlv_callback);
+               if (err < 0)
+                       return err;
+               t++;
+@@ -214,7 +216,7 @@ static void snd_usb_soundblaster_remote_complete(struct urb *urb)
+ }
+ static long snd_usb_sbrc_hwdep_read(struct snd_hwdep *hw, char __user *buf,
+-                                   long count, loff_t *offset)
++                                  long count, loff_t *offset)
+ {
+       struct usb_mixer_interface *mixer = hw->private_data;
+       int err;
+@@ -234,7 +236,7 @@ static long snd_usb_sbrc_hwdep_read(struct snd_hwdep *hw, char __user *buf,
+ }
+ static __poll_t snd_usb_sbrc_hwdep_poll(struct snd_hwdep *hw, struct file *file,
+-                                          poll_table *wait)
++                                      poll_table *wait)
+ {
+       struct usb_mixer_interface *mixer = hw->private_data;
+@@ -310,20 +312,20 @@ static int snd_audigy2nx_led_update(struct usb_mixer_interface *mixer,
+       if (chip->usb_id == USB_ID(0x041e, 0x3042))
+               err = snd_usb_ctl_msg(chip->dev,
+-                            usb_sndctrlpipe(chip->dev, 0), 0x24,
+-                            USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_OTHER,
+-                            !value, 0, NULL, 0);
++                                    usb_sndctrlpipe(chip->dev, 0), 0x24,
++                                    USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_OTHER,
++                                    !value, 0, NULL, 0);
+       /* USB X-Fi S51 Pro */
+       if (chip->usb_id == USB_ID(0x041e, 0x30df))
+               err = snd_usb_ctl_msg(chip->dev,
+-                            usb_sndctrlpipe(chip->dev, 0), 0x24,
+-                            USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_OTHER,
+-                            !value, 0, NULL, 0);
++                                    usb_sndctrlpipe(chip->dev, 0), 0x24,
++                                    USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_OTHER,
++                                    !value, 0, NULL, 0);
+       else
+               err = snd_usb_ctl_msg(chip->dev,
+-                            usb_sndctrlpipe(chip->dev, 0), 0x24,
+-                            USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_OTHER,
+-                            value, index + 2, NULL, 0);
++                                    usb_sndctrlpipe(chip->dev, 0), 0x24,
++                                    USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_OTHER,
++                                    value, index + 2, NULL, 0);
+       snd_usb_unlock_shutdown(chip);
+       return err;
+ }
+@@ -481,9 +483,9 @@ static int snd_emu0204_ch_switch_update(struct usb_mixer_interface *mixer,
+       buf[0] = 0x01;
+       buf[1] = value ? 0x02 : 0x01;
+       err = snd_usb_ctl_msg(chip->dev,
+-                    usb_sndctrlpipe(chip->dev, 0), UAC_SET_CUR,
+-                    USB_RECIP_INTERFACE | USB_TYPE_CLASS | USB_DIR_OUT,
+-                    0x0400, 0x0e00, buf, 2);
++                            usb_sndctrlpipe(chip->dev, 0), UAC_SET_CUR,
++                            USB_RECIP_INTERFACE | USB_TYPE_CLASS | USB_DIR_OUT,
++                            0x0400, 0x0e00, buf, 2);
+       snd_usb_unlock_shutdown(chip);
+       return err;
+ }
+@@ -1021,7 +1023,7 @@ static int snd_nativeinstruments_create_mixer(struct usb_mixer_interface *mixer,
+ /* M-Audio FastTrack Ultra quirks */
+ /* FTU Effect switch (also used by C400/C600) */
+ static int snd_ftu_eff_switch_info(struct snd_kcontrol *kcontrol,
+-                                      struct snd_ctl_elem_info *uinfo)
++                                 struct snd_ctl_elem_info *uinfo)
+ {
+       static const char *const texts[8] = {
+               "Room 1", "Room 2", "Room 3", "Hall 1",
+@@ -1055,7 +1057,7 @@ static int snd_ftu_eff_switch_init(struct usb_mixer_interface *mixer,
+ }
+ static int snd_ftu_eff_switch_get(struct snd_kcontrol *kctl,
+-                                      struct snd_ctl_elem_value *ucontrol)
++                                struct snd_ctl_elem_value *ucontrol)
+ {
+       ucontrol->value.enumerated.item[0] = kctl->private_value >> 24;
+       return 0;
+@@ -1086,7 +1088,7 @@ static int snd_ftu_eff_switch_update(struct usb_mixer_elem_list *list)
+ }
+ static int snd_ftu_eff_switch_put(struct snd_kcontrol *kctl,
+-                                      struct snd_ctl_elem_value *ucontrol)
++                                struct snd_ctl_elem_value *ucontrol)
+ {
+       struct usb_mixer_elem_list *list = snd_kcontrol_chip(kctl);
+       unsigned int pval = list->kctl->private_value;
+@@ -1104,7 +1106,7 @@ static int snd_ftu_eff_switch_put(struct snd_kcontrol *kctl,
+ }
+ static int snd_ftu_create_effect_switch(struct usb_mixer_interface *mixer,
+-      int validx, int bUnitID)
++                                      int validx, int bUnitID)
+ {
+       static struct snd_kcontrol_new template = {
+               .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
+@@ -1143,22 +1145,22 @@ static int snd_ftu_create_volume_ctls(struct usb_mixer_interface *mixer)
+               for (in = 0; in < 8; in++) {
+                       cmask = BIT(in);
+                       snprintf(name, sizeof(name),
+-                              "AIn%d - Out%d Capture Volume",
+-                              in  + 1, out + 1);
++                               "AIn%d - Out%d Capture Volume",
++                               in  + 1, out + 1);
+                       err = snd_create_std_mono_ctl(mixer, id, control,
+-                                                      cmask, val_type, name,
+-                                                      &snd_usb_mixer_vol_tlv);
++                                                    cmask, val_type, name,
++                                                    &snd_usb_mixer_vol_tlv);
+                       if (err < 0)
+                               return err;
+               }
+               for (in = 8; in < 16; in++) {
+                       cmask = BIT(in);
+                       snprintf(name, sizeof(name),
+-                              "DIn%d - Out%d Playback Volume",
+-                              in - 7, out + 1);
++                               "DIn%d - Out%d Playback Volume",
++                               in - 7, out + 1);
+                       err = snd_create_std_mono_ctl(mixer, id, control,
+-                                                      cmask, val_type, name,
+-                                                      &snd_usb_mixer_vol_tlv);
++                                                    cmask, val_type, name,
++                                                    &snd_usb_mixer_vol_tlv);
+                       if (err < 0)
+                               return err;
+               }
+@@ -1219,10 +1221,10 @@ static int snd_ftu_create_effect_return_ctls(struct usb_mixer_interface *mixer)
+       for (ch = 0; ch < 4; ++ch) {
+               cmask = BIT(ch);
+               snprintf(name, sizeof(name),
+-                      "Effect Return %d Volume", ch + 1);
++                       "Effect Return %d Volume", ch + 1);
+               err = snd_create_std_mono_ctl(mixer, id, control,
+-                                              cmask, val_type, name,
+-                                              snd_usb_mixer_vol_tlv);
++                                            cmask, val_type, name,
++                                            snd_usb_mixer_vol_tlv);
+               if (err < 0)
+                       return err;
+       }
+@@ -1243,20 +1245,20 @@ static int snd_ftu_create_effect_send_ctls(struct usb_mixer_interface *mixer)
+       for (ch = 0; ch < 8; ++ch) {
+               cmask = BIT(ch);
+               snprintf(name, sizeof(name),
+-                      "Effect Send AIn%d Volume", ch + 1);
++                       "Effect Send AIn%d Volume", ch + 1);
+               err = snd_create_std_mono_ctl(mixer, id, control, cmask,
+-                                              val_type, name,
+-                                              snd_usb_mixer_vol_tlv);
++                                            val_type, name,
++                                            snd_usb_mixer_vol_tlv);
+               if (err < 0)
+                       return err;
+       }
+       for (ch = 8; ch < 16; ++ch) {
+               cmask = BIT(ch);
+               snprintf(name, sizeof(name),
+-                      "Effect Send DIn%d Volume", ch - 7);
++                       "Effect Send DIn%d Volume", ch - 7);
+               err = snd_create_std_mono_ctl(mixer, id, control, cmask,
+-                                              val_type, name,
+-                                              snd_usb_mixer_vol_tlv);
++                                            val_type, name,
++                                            snd_usb_mixer_vol_tlv);
+               if (err < 0)
+                       return err;
+       }
+@@ -1346,19 +1348,19 @@ static int snd_c400_create_vol_ctls(struct usb_mixer_interface *mixer)
+               for (out = 0; out < num_outs; out++) {
+                       if (chan < num_outs) {
+                               snprintf(name, sizeof(name),
+-                                      "PCM%d-Out%d Playback Volume",
+-                                      chan + 1, out + 1);
++                                       "PCM%d-Out%d Playback Volume",
++                                       chan + 1, out + 1);
+                       } else {
+                               snprintf(name, sizeof(name),
+-                                      "In%d-Out%d Playback Volume",
+-                                      chan - num_outs + 1, out + 1);
++                                       "In%d-Out%d Playback Volume",
++                                       chan - num_outs + 1, out + 1);
+                       }
+                       cmask = (out == 0) ? 0 : BIT(out - 1);
+                       offset = chan * num_outs;
+                       err = snd_create_std_mono_ctl_offset(mixer, id, control,
+-                                              cmask, val_type, offset, name,
+-                                              &snd_usb_mixer_vol_tlv);
++                                                           cmask, val_type, offset, name,
++                                                           &snd_usb_mixer_vol_tlv);
+                       if (err < 0)
+                               return err;
+               }
+@@ -1377,7 +1379,7 @@ static int snd_c400_create_effect_volume_ctl(struct usb_mixer_interface *mixer)
+       const unsigned int cmask = 0;
+       return snd_create_std_mono_ctl(mixer, id, control, cmask, val_type,
+-                                      name, snd_usb_mixer_vol_tlv);
++                                     name, snd_usb_mixer_vol_tlv);
+ }
+ /* This control needs a volume quirk, see mixer.c */
+@@ -1390,7 +1392,7 @@ static int snd_c400_create_effect_duration_ctl(struct usb_mixer_interface *mixer
+       const unsigned int cmask = 0;
+       return snd_create_std_mono_ctl(mixer, id, control, cmask, val_type,
+-                                      name, snd_usb_mixer_vol_tlv);
++                                     name, snd_usb_mixer_vol_tlv);
+ }
+ /* This control needs a volume quirk, see mixer.c */
+@@ -1403,7 +1405,7 @@ static int snd_c400_create_effect_feedback_ctl(struct usb_mixer_interface *mixer
+       const unsigned int cmask = 0;
+       return snd_create_std_mono_ctl(mixer, id, control, cmask, val_type,
+-                                      name, NULL);
++                                     name, NULL);
+ }
+ static int snd_c400_create_effect_vol_ctls(struct usb_mixer_interface *mixer)
+@@ -1432,18 +1434,18 @@ static int snd_c400_create_effect_vol_ctls(struct usb_mixer_interface *mixer)
+       for (chan = 0; chan < num_outs + num_ins; chan++) {
+               if (chan < num_outs) {
+                       snprintf(name, sizeof(name),
+-                              "Effect Send DOut%d",
+-                              chan + 1);
++                               "Effect Send DOut%d",
++                               chan + 1);
+               } else {
+                       snprintf(name, sizeof(name),
+-                              "Effect Send AIn%d",
+-                              chan - num_outs + 1);
++                               "Effect Send AIn%d",
++                               chan - num_outs + 1);
+               }
+               cmask = (chan == 0) ? 0 : BIT(chan - 1);
+               err = snd_create_std_mono_ctl(mixer, id, control,
+-                                              cmask, val_type, name,
+-                                              &snd_usb_mixer_vol_tlv);
++                                            cmask, val_type, name,
++                                            &snd_usb_mixer_vol_tlv);
+               if (err < 0)
+                       return err;
+       }
+@@ -1478,14 +1480,14 @@ static int snd_c400_create_effect_ret_vol_ctls(struct usb_mixer_interface *mixer
+       for (chan = 0; chan < num_outs; chan++) {
+               snprintf(name, sizeof(name),
+-                      "Effect Return %d",
+-                      chan + 1);
++                       "Effect Return %d",
++                       chan + 1);
+               cmask = (chan == 0) ? 0 :
+                       BIT(chan + (chan % 2) * num_outs - 1);
+               err = snd_create_std_mono_ctl_offset(mixer, id, control,
+-                                              cmask, val_type, offset, name,
+-                                              &snd_usb_mixer_vol_tlv);
++                                                   cmask, val_type, offset, name,
++                                                   &snd_usb_mixer_vol_tlv);
+               if (err < 0)
+                       return err;
+       }
+@@ -1626,7 +1628,7 @@ static const struct std_mono_table ebox44_table[] = {
+  *
+  */
+ static int snd_microii_spdif_info(struct snd_kcontrol *kcontrol,
+-      struct snd_ctl_elem_info *uinfo)
++                                struct snd_ctl_elem_info *uinfo)
+ {
+       uinfo->type = SNDRV_CTL_ELEM_TYPE_IEC958;
+       uinfo->count = 1;
+@@ -1634,7 +1636,7 @@ static int snd_microii_spdif_info(struct snd_kcontrol *kcontrol,
+ }
+ static int snd_microii_spdif_default_get(struct snd_kcontrol *kcontrol,
+-      struct snd_ctl_elem_value *ucontrol)
++                                       struct snd_ctl_elem_value *ucontrol)
+ {
+       struct usb_mixer_elem_list *list = snd_kcontrol_chip(kcontrol);
+       struct snd_usb_audio *chip = list->mixer->chip;
+@@ -1667,13 +1669,13 @@ static int snd_microii_spdif_default_get(struct snd_kcontrol *kcontrol,
+       ep = get_endpoint(alts, 0)->bEndpointAddress;
+       err = snd_usb_ctl_msg(chip->dev,
+-                      usb_rcvctrlpipe(chip->dev, 0),
+-                      UAC_GET_CUR,
+-                      USB_TYPE_CLASS | USB_RECIP_ENDPOINT | USB_DIR_IN,
+-                      UAC_EP_CS_ATTR_SAMPLE_RATE << 8,
+-                      ep,
+-                      data,
+-                      sizeof(data));
++                            usb_rcvctrlpipe(chip->dev, 0),
++                            UAC_GET_CUR,
++                            USB_TYPE_CLASS | USB_RECIP_ENDPOINT | USB_DIR_IN,
++                            UAC_EP_CS_ATTR_SAMPLE_RATE << 8,
++                            ep,
++                            data,
++                            sizeof(data));
+       if (err < 0)
+               goto end;
+@@ -1700,26 +1702,26 @@ static int snd_microii_spdif_default_update(struct usb_mixer_elem_list *list)
+       reg = ((pval >> 4) & 0xf0) | (pval & 0x0f);
+       err = snd_usb_ctl_msg(chip->dev,
+-                      usb_sndctrlpipe(chip->dev, 0),
+-                      UAC_SET_CUR,
+-                      USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_OTHER,
+-                      reg,
+-                      2,
+-                      NULL,
+-                      0);
++                            usb_sndctrlpipe(chip->dev, 0),
++                            UAC_SET_CUR,
++                            USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_OTHER,
++                            reg,
++                            2,
++                            NULL,
++                            0);
+       if (err < 0)
+               goto end;
+       reg = (pval & IEC958_AES0_NONAUDIO) ? 0xa0 : 0x20;
+       reg |= (pval >> 12) & 0x0f;
+       err = snd_usb_ctl_msg(chip->dev,
+-                      usb_sndctrlpipe(chip->dev, 0),
+-                      UAC_SET_CUR,
+-                      USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_OTHER,
+-                      reg,
+-                      3,
+-                      NULL,
+-                      0);
++                            usb_sndctrlpipe(chip->dev, 0),
++                            UAC_SET_CUR,
++                            USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_OTHER,
++                            reg,
++                            3,
++                            NULL,
++                            0);
+       if (err < 0)
+               goto end;
+@@ -1729,7 +1731,7 @@ static int snd_microii_spdif_default_update(struct usb_mixer_elem_list *list)
+ }
+ static int snd_microii_spdif_default_put(struct snd_kcontrol *kcontrol,
+-      struct snd_ctl_elem_value *ucontrol)
++                                       struct snd_ctl_elem_value *ucontrol)
+ {
+       struct usb_mixer_elem_list *list = snd_kcontrol_chip(kcontrol);
+       unsigned int pval, pval_old;
+@@ -1756,7 +1758,7 @@ static int snd_microii_spdif_default_put(struct snd_kcontrol *kcontrol,
+ }
+ static int snd_microii_spdif_mask_get(struct snd_kcontrol *kcontrol,
+-      struct snd_ctl_elem_value *ucontrol)
++                                    struct snd_ctl_elem_value *ucontrol)
+ {
+       ucontrol->value.iec958.status[0] = 0x0f;
+       ucontrol->value.iec958.status[1] = 0xff;
+@@ -1767,7 +1769,7 @@ static int snd_microii_spdif_mask_get(struct snd_kcontrol *kcontrol,
+ }
+ static int snd_microii_spdif_switch_get(struct snd_kcontrol *kcontrol,
+-      struct snd_ctl_elem_value *ucontrol)
++                                      struct snd_ctl_elem_value *ucontrol)
+ {
+       ucontrol->value.integer.value[0] = !(kcontrol->private_value & 0x02);
+@@ -1785,20 +1787,20 @@ static int snd_microii_spdif_switch_update(struct usb_mixer_elem_list *list)
+               return err;
+       err = snd_usb_ctl_msg(chip->dev,
+-                      usb_sndctrlpipe(chip->dev, 0),
+-                      UAC_SET_CUR,
+-                      USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_OTHER,
+-                      reg,
+-                      9,
+-                      NULL,
+-                      0);
++                            usb_sndctrlpipe(chip->dev, 0),
++                            UAC_SET_CUR,
++                            USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_OTHER,
++                            reg,
++                            9,
++                            NULL,
++                            0);
+       snd_usb_unlock_shutdown(chip);
+       return err;
+ }
+ static int snd_microii_spdif_switch_put(struct snd_kcontrol *kcontrol,
+-      struct snd_ctl_elem_value *ucontrol)
++                                      struct snd_ctl_elem_value *ucontrol)
+ {
+       struct usb_mixer_elem_list *list = snd_kcontrol_chip(kcontrol);
+       u8 reg;
+@@ -1883,9 +1885,9 @@ static int snd_soundblaster_e1_switch_update(struct usb_mixer_interface *mixer,
+       if (err < 0)
+               return err;
+       err = snd_usb_ctl_msg(chip->dev,
+-                      usb_sndctrlpipe(chip->dev, 0), HID_REQ_SET_REPORT,
+-                      USB_TYPE_CLASS | USB_RECIP_INTERFACE | USB_DIR_OUT,
+-                      0x0202, 3, buff, 2);
++                            usb_sndctrlpipe(chip->dev, 0), HID_REQ_SET_REPORT,
++                            USB_TYPE_CLASS | USB_RECIP_INTERFACE | USB_DIR_OUT,
++                            0x0202, 3, buff, 2);
+       snd_usb_unlock_shutdown(chip);
+       return err;
+ }
+@@ -3235,7 +3237,7 @@ static int snd_rme_digiface_enum_put(struct snd_kcontrol *kcontrol,
+ }
+ static int snd_rme_digiface_current_sync_get(struct snd_kcontrol *kcontrol,
+-                                   struct snd_ctl_elem_value *ucontrol)
++                                           struct snd_ctl_elem_value *ucontrol)
+ {
+       int ret = snd_rme_digiface_enum_get(kcontrol, ucontrol);
+@@ -3918,7 +3920,7 @@ static const struct snd_djm_device snd_djm_devices[] = {
+ static int snd_djm_controls_info(struct snd_kcontrol *kctl,
+-                              struct snd_ctl_elem_info *info)
++                               struct snd_ctl_elem_info *info)
+ {
+       unsigned long private_value = kctl->private_value;
+       u8 device_idx = (private_value & SND_DJM_DEVICE_MASK) >> SND_DJM_DEVICE_SHIFT;
+@@ -3937,8 +3939,8 @@ static int snd_djm_controls_info(struct snd_kcontrol *kctl,
+               info->value.enumerated.item = noptions - 1;
+       name = snd_djm_get_label(device_idx,
+-                              ctl->options[info->value.enumerated.item],
+-                              ctl->wIndex);
++                               ctl->options[info->value.enumerated.item],
++                               ctl->wIndex);
+       if (!name)
+               return -EINVAL;
+@@ -3950,7 +3952,7 @@ static int snd_djm_controls_info(struct snd_kcontrol *kctl,
+ }
+ static int snd_djm_controls_update(struct usb_mixer_interface *mixer,
+-                              u8 device_idx, u8 group, u16 value)
++                                 u8 device_idx, u8 group, u16 value)
+ {
+       int err;
+       const struct snd_djm_device *device = &snd_djm_devices[device_idx];
+@@ -3962,13 +3964,13 @@ static int snd_djm_controls_update(struct usb_mixer_interface *mixer,
+       if (err)
+               return err;
+-      err = snd_usb_ctl_msg(
+-              mixer->chip->dev, usb_sndctrlpipe(mixer->chip->dev, 0),
+-              USB_REQ_SET_FEATURE,
+-              USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
+-              device->controls[group].options[value],
+-              device->controls[group].wIndex,
+-              NULL, 0);
++      err = snd_usb_ctl_msg(mixer->chip->dev,
++                            usb_sndctrlpipe(mixer->chip->dev, 0),
++                            USB_REQ_SET_FEATURE,
++                            USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
++                            device->controls[group].options[value],
++                            device->controls[group].wIndex,
++                            NULL, 0);
+       snd_usb_unlock_shutdown(mixer->chip);
+       return err;
+@@ -4009,7 +4011,7 @@ static int snd_djm_controls_resume(struct usb_mixer_elem_list *list)
+ }
+ static int snd_djm_controls_create(struct usb_mixer_interface *mixer,
+-              const u8 device_idx)
++                                 const u8 device_idx)
+ {
+       int err, i;
+       u16 value;
+@@ -4028,10 +4030,10 @@ static int snd_djm_controls_create(struct usb_mixer_interface *mixer,
+       for (i = 0; i < device->ncontrols; i++) {
+               value = device->controls[i].default_value;
+               knew.name = device->controls[i].name;
+-              knew.private_value = (
++              knew.private_value =
+                       ((unsigned long)device_idx << SND_DJM_DEVICE_SHIFT) |
+                       (i << SND_DJM_GROUP_SHIFT) |
+-                      value);
++                      value;
+               err = snd_djm_controls_update(mixer, device_idx, i, value);
+               if (err)
+                       return err;
+@@ -4098,13 +4100,15 @@ int snd_usb_mixer_apply_create_quirk(struct usb_mixer_interface *mixer)
+               break;
+       case USB_ID(0x17cc, 0x1011): /* Traktor Audio 6 */
+-              err = snd_nativeinstruments_create_mixer(mixer,
++              err = snd_nativeinstruments_create_mixer(/* checkpatch hack */
++                              mixer,
+                               snd_nativeinstruments_ta6_mixers,
+                               ARRAY_SIZE(snd_nativeinstruments_ta6_mixers));
+               break;
+       case USB_ID(0x17cc, 0x1021): /* Traktor Audio 10 */
+-              err = snd_nativeinstruments_create_mixer(mixer,
++              err = snd_nativeinstruments_create_mixer(/* checkpatch hack */
++                              mixer,
+                               snd_nativeinstruments_ta10_mixers,
+                               ARRAY_SIZE(snd_nativeinstruments_ta10_mixers));
+               break;
+-- 
+2.51.0
+
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 (file)
index 0000000..84fcd20
--- /dev/null
@@ -0,0 +1,205 @@
+From 7d67689f522a9e71621af23028a80bc1240310bd Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 26 May 2025 17:07:41 +0300
+Subject: ALSA: usb-audio: Fix whitespace & blank line issues in mixer_quirks
+
+From: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+
+[ Upstream commit df6b4dcf2e2c3b4e34c3213a575c92d0c9415d0d ]
+
+Address all whitespace & blank line(s) related issues reported by
+checkpatch.pl:
+
+  ERROR: trailing whitespace
+  ERROR: space required after that ',' (ctx:VxV)
+  WARNING: Missing a blank line after declarations
+  CHECK: Please use a blank line after function/struct/union/enum declarations
+  CHECK: Please don't use multiple blank lines
+
+Signed-off-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Link: https://patch.msgid.link/20250526-dualsense-alsa-jack-v1-2-1a821463b632@collabora.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/mixer_quirks.c | 26 +++++++++++---------------
+ 1 file changed, 11 insertions(+), 15 deletions(-)
+
+diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
+index 7f1e7a5fe8f0a..0aad92cb33276 100644
+--- a/sound/usb/mixer_quirks.c
++++ b/sound/usb/mixer_quirks.c
+@@ -287,7 +287,7 @@ static int snd_usb_soundblaster_remote_init(struct usb_mixer_interface *mixer)
+       mixer->rc_setup_packet->wLength = cpu_to_le16(len);
+       usb_fill_control_urb(mixer->rc_urb, mixer->chip->dev,
+                            usb_rcvctrlpipe(mixer->chip->dev, 0),
+-                           (u8*)mixer->rc_setup_packet, mixer->rc_buffer, len,
++                           (u8 *)mixer->rc_setup_packet, mixer->rc_buffer, len,
+                            snd_usb_soundblaster_remote_complete, mixer);
+       return 0;
+ }
+@@ -389,7 +389,7 @@ static int snd_audigy2nx_controls_create(struct usb_mixer_interface *mixer)
+                        mixer->chip->usb_id == USB_ID(0x041e, 0x3042) ||
+                        mixer->chip->usb_id == USB_ID(0x041e, 0x30df) ||
+                        mixer->chip->usb_id == USB_ID(0x041e, 0x3048)))
+-                      break; 
++                      break;
+               knew = snd_audigy2nx_control;
+               knew.name = snd_audigy2nx_led_names[i];
+@@ -858,6 +858,7 @@ static const struct snd_kcontrol_new snd_mbox1_src_switch = {
+ static int snd_mbox1_controls_create(struct usb_mixer_interface *mixer)
+ {
+       int err;
++
+       err = add_single_ctl_with_resume(mixer, 0,
+                                        snd_mbox1_clk_switch_resume,
+                                        &snd_mbox1_clk_switch, NULL);
+@@ -871,7 +872,7 @@ static int snd_mbox1_controls_create(struct usb_mixer_interface *mixer)
+ /* Native Instruments device quirks */
+-#define _MAKE_NI_CONTROL(bRequest,wIndex) ((bRequest) << 16 | (wIndex))
++#define _MAKE_NI_CONTROL(bRequest, wIndex) ((bRequest) << 16 | (wIndex))
+ static int snd_ni_control_init_val(struct usb_mixer_interface *mixer,
+                                  struct snd_kcontrol *kctl)
+@@ -2183,6 +2184,7 @@ static const u32 snd_rme_rate_table[] = {
+       256000, 352800, 384000, 400000,
+       512000, 705600, 768000, 800000
+ };
++
+ /* maximum number of items for AES and S/PDIF rates for above table */
+ #define SND_RME_RATE_IDX_AES_SPDIF_NUM                12
+@@ -3271,7 +3273,6 @@ static int snd_rme_digiface_sync_state_get(struct snd_kcontrol *kcontrol,
+       return 0;
+ }
+-
+ static int snd_rme_digiface_format_info(struct snd_kcontrol *kcontrol,
+                                       struct snd_ctl_elem_info *uinfo)
+ {
+@@ -3283,7 +3284,6 @@ static int snd_rme_digiface_format_info(struct snd_kcontrol *kcontrol,
+                                ARRAY_SIZE(format), format);
+ }
+-
+ static int snd_rme_digiface_sync_source_info(struct snd_kcontrol *kcontrol,
+                                            struct snd_ctl_elem_info *uinfo)
+ {
+@@ -3566,7 +3566,6 @@ static int snd_rme_digiface_controls_create(struct usb_mixer_interface *mixer)
+ #define SND_DJM_A9_IDX                0x6
+ #define SND_DJM_V10_IDX       0x7
+-
+ #define SND_DJM_CTL(_name, suffix, _default_value, _windex) { \
+       .name = _name, \
+       .options = snd_djm_opts_##suffix, \
+@@ -3578,7 +3577,6 @@ static int snd_rme_digiface_controls_create(struct usb_mixer_interface *mixer)
+       .controls = snd_djm_ctls_##suffix, \
+       .ncontrols = ARRAY_SIZE(snd_djm_ctls_##suffix) }
+-
+ struct snd_djm_device {
+       const char *name;
+       const struct snd_djm_ctl *controls;
+@@ -3724,7 +3722,6 @@ static const struct snd_djm_ctl snd_djm_ctls_250mk2[] = {
+       SND_DJM_CTL("Output 3 Playback Switch", 250mk2_pb3, 2, SND_DJM_WINDEX_PB)
+ };
+-
+ // DJM-450
+ static const u16 snd_djm_opts_450_cap1[] = {
+       0x0103, 0x0100, 0x0106, 0x0107, 0x0108, 0x0109, 0x010d, 0x010a };
+@@ -3749,7 +3746,6 @@ static const struct snd_djm_ctl snd_djm_ctls_450[] = {
+       SND_DJM_CTL("Output 3 Playback Switch", 450_pb3, 2, SND_DJM_WINDEX_PB)
+ };
+-
+ // DJM-750
+ static const u16 snd_djm_opts_750_cap1[] = {
+       0x0101, 0x0103, 0x0106, 0x0107, 0x0108, 0x0109, 0x010a, 0x010f };
+@@ -3768,7 +3764,6 @@ static const struct snd_djm_ctl snd_djm_ctls_750[] = {
+       SND_DJM_CTL("Input 4 Capture Switch", 750_cap4, 0, SND_DJM_WINDEX_CAP)
+ };
+-
+ // DJM-850
+ static const u16 snd_djm_opts_850_cap1[] = {
+       0x0100, 0x0103, 0x0106, 0x0107, 0x0108, 0x0109, 0x010a, 0x010f };
+@@ -3787,7 +3782,6 @@ static const struct snd_djm_ctl snd_djm_ctls_850[] = {
+       SND_DJM_CTL("Input 4 Capture Switch", 850_cap4, 1, SND_DJM_WINDEX_CAP)
+ };
+-
+ // DJM-900NXS2
+ static const u16 snd_djm_opts_900nxs2_cap1[] = {
+       0x0100, 0x0102, 0x0103, 0x0106, 0x0107, 0x0108, 0x0109, 0x010a };
+@@ -3825,7 +3819,6 @@ static const u16 snd_djm_opts_750mk2_pb1[] = { 0x0100, 0x0101, 0x0104 };
+ static const u16 snd_djm_opts_750mk2_pb2[] = { 0x0200, 0x0201, 0x0204 };
+ static const u16 snd_djm_opts_750mk2_pb3[] = { 0x0300, 0x0301, 0x0304 };
+-
+ static const struct snd_djm_ctl snd_djm_ctls_750mk2[] = {
+       SND_DJM_CTL("Master Input Level Capture Switch", cap_level, 0, SND_DJM_WINDEX_CAPLVL),
+       SND_DJM_CTL("Input 1 Capture Switch",   750mk2_cap1, 2, SND_DJM_WINDEX_CAP),
+@@ -3838,7 +3831,6 @@ static const struct snd_djm_ctl snd_djm_ctls_750mk2[] = {
+       SND_DJM_CTL("Output 3 Playback Switch", 750mk2_pb3, 2, SND_DJM_WINDEX_PB)
+ };
+-
+ // DJM-A9
+ static const u16 snd_djm_opts_a9_cap_level[] = {
+       0x0000, 0x0100, 0x0200, 0x0300, 0x0400, 0x0500 };
+@@ -3867,29 +3859,35 @@ static const struct snd_djm_ctl snd_djm_ctls_a9[] = {
+ static const u16 snd_djm_opts_v10_cap_level[] = {
+       0x0000, 0x0100, 0x0200, 0x0300, 0x0400, 0x0500
+ };
++
+ static const u16 snd_djm_opts_v10_cap1[] = {
+       0x0103,
+       0x0100, 0x0102, 0x0106, 0x0110, 0x0107,
+       0x0108, 0x0109, 0x010a, 0x0121, 0x0122
+ };
++
+ static const u16 snd_djm_opts_v10_cap2[] = {
+       0x0200, 0x0202, 0x0206, 0x0210, 0x0207,
+       0x0208, 0x0209, 0x020a, 0x0221, 0x0222
+ };
++
+ static const u16 snd_djm_opts_v10_cap3[] = {
+       0x0303,
+       0x0300, 0x0302, 0x0306, 0x0310, 0x0307,
+       0x0308, 0x0309, 0x030a, 0x0321, 0x0322
+ };
++
+ static const u16 snd_djm_opts_v10_cap4[] = {
+       0x0403,
+       0x0400, 0x0402, 0x0406, 0x0410, 0x0407,
+       0x0408, 0x0409, 0x040a, 0x0421, 0x0422
+ };
++
+ static const u16 snd_djm_opts_v10_cap5[] = {
+       0x0500, 0x0502, 0x0506, 0x0510, 0x0507,
+       0x0508, 0x0509, 0x050a, 0x0521, 0x0522
+ };
++
+ static const u16 snd_djm_opts_v10_cap6[] = {
+       0x0603,
+       0x0600, 0x0602, 0x0606, 0x0610, 0x0607,
+@@ -3918,7 +3916,6 @@ static const struct snd_djm_device snd_djm_devices[] = {
+       [SND_DJM_V10_IDX] = SND_DJM_DEVICE(v10),
+ };
+-
+ static int snd_djm_controls_info(struct snd_kcontrol *kctl,
+                                struct snd_ctl_elem_info *info)
+ {
+@@ -4358,4 +4355,3 @@ void snd_usb_mixer_fu_apply_quirk(struct usb_mixer_interface *mixer,
+           (cval->control == UAC_FU_MUTE || cval->control == UAC_FU_VOLUME))
+               snd_fix_plt_name(mixer->chip, &kctl->id);
+ }
+-
+-- 
+2.51.0
+
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 (file)
index 0000000..f9dc1b9
--- /dev/null
@@ -0,0 +1,123 @@
+From e3088a152335039f8b9110412995a11082b3d6a4 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 27 Aug 2025 11:29:02 +0800
+Subject: ALSA: usb-audio: move mixer_quirks' min_mute into common quirk
+
+From: Cryolitia PukNgae <cryolitia@uniontech.com>
+
+[ Upstream commit 2c3ca8cc55a3afc7a4fa99ed8f5f5d05dd2e65b3 ]
+
+We have found more and more devices that have the same problem, that
+the mixer's minimum value is muted. Accroding to pipewire's MR[1]
+and Arch Linux wiki[2], this should be a very common problem in USB
+audio devices. Move the quirk into common quirk,as a preparation of
+more devices' quirk's patch coming on the road[3].
+
+1. https://gitlab.freedesktop.org/pipewire/pipewire/-/merge_requests/2514
+2. https://wiki.archlinux.org/index.php?title=PipeWire&oldid=804138#No_sound_from_USB_DAC_until_30%_volume
+3. On the road, in the physical sense. We have been buying ton of
+   these devices for testing the problem.
+
+Tested-by: Guoli An <anguoli@uniontech.com>
+Signed-off-by: Cryolitia PukNgae <cryolitia@uniontech.com>
+Link: https://patch.msgid.link/20250827-sound-quirk-min-mute-v1-1-4717aa8a4f6a@uniontech.com
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/mixer_quirks.c | 10 +++-------
+ sound/usb/quirks.c       | 12 ++++++++++--
+ sound/usb/usbaudio.h     |  4 ++++
+ 3 files changed, 17 insertions(+), 9 deletions(-)
+
+diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
+index 6b47b3145d2cf..3df537fdb9f1c 100644
+--- a/sound/usb/mixer_quirks.c
++++ b/sound/usb/mixer_quirks.c
+@@ -4608,16 +4608,12 @@ void snd_usb_mixer_fu_apply_quirk(struct usb_mixer_interface *mixer,
+               if (unitid == 7 && cval->control == UAC_FU_VOLUME)
+                       snd_dragonfly_quirk_db_scale(mixer, cval, kctl);
+               break;
++      }
++
+       /* lowest playback value is muted on some devices */
+-      case USB_ID(0x0572, 0x1b09): /* Conexant Systems (Rockwell), Inc. */
+-      case USB_ID(0x0d8c, 0x000c): /* C-Media */
+-      case USB_ID(0x0d8c, 0x0014): /* C-Media */
+-      case USB_ID(0x19f7, 0x0003): /* RODE NT-USB */
+-      case USB_ID(0x2d99, 0x0026): /* HECATE G2 GAMING HEADSET */
++      if (mixer->chip->quirk_flags & QUIRK_FLAG_MIXER_MIN_MUTE)
+               if (strstr(kctl->id.name, "Playback"))
+                       cval->min_mute = 1;
+-              break;
+-      }
+       /* ALSA-ify some Plantronics headset control names */
+       if (USB_ID_VENDOR(mixer->chip->usb_id) == 0x047f &&
+diff --git a/sound/usb/quirks.c b/sound/usb/quirks.c
+index e75b0b1df6eb2..8bc1e247cdf1a 100644
+--- a/sound/usb/quirks.c
++++ b/sound/usb/quirks.c
+@@ -2199,6 +2199,8 @@ static const struct usb_audio_quirk_flags_table quirk_flags_table[] = {
+                  QUIRK_FLAG_SET_IFACE_FIRST),
+       DEVICE_FLG(0x0556, 0x0014, /* Phoenix Audio TMX320VC */
+                  QUIRK_FLAG_GET_SAMPLE_RATE),
++      DEVICE_FLG(0x0572, 0x1b09, /* Conexant Systems (Rockwell), Inc. */
++                 QUIRK_FLAG_MIXER_MIN_MUTE),
+       DEVICE_FLG(0x05a3, 0x9420, /* ELP HD USB Camera */
+                  QUIRK_FLAG_GET_SAMPLE_RATE),
+       DEVICE_FLG(0x05a7, 0x1020, /* Bose Companion 5 */
+@@ -2245,8 +2247,10 @@ static const struct usb_audio_quirk_flags_table quirk_flags_table[] = {
+                  QUIRK_FLAG_GET_SAMPLE_RATE),
+       DEVICE_FLG(0x0c45, 0x636b, /* Microdia JP001 USB Camera */
+                  QUIRK_FLAG_GET_SAMPLE_RATE),
+-      DEVICE_FLG(0x0d8c, 0x0014, /* USB Audio Device */
+-                 QUIRK_FLAG_CTL_MSG_DELAY_1M),
++      DEVICE_FLG(0x0d8c, 0x000c, /* C-Media */
++                 QUIRK_FLAG_MIXER_MIN_MUTE),
++      DEVICE_FLG(0x0d8c, 0x0014, /* C-Media */
++                 QUIRK_FLAG_CTL_MSG_DELAY_1M | QUIRK_FLAG_MIXER_MIN_MUTE),
+       DEVICE_FLG(0x0ecb, 0x205c, /* JBL Quantum610 Wireless */
+                  QUIRK_FLAG_FIXED_RATE),
+       DEVICE_FLG(0x0ecb, 0x2069, /* JBL Quantum810 Wireless */
+@@ -2293,6 +2297,8 @@ static const struct usb_audio_quirk_flags_table quirk_flags_table[] = {
+                  QUIRK_FLAG_ITF_USB_DSD_DAC | QUIRK_FLAG_CTL_MSG_DELAY),
+       DEVICE_FLG(0x1901, 0x0191, /* GE B850V3 CP2114 audio interface */
+                  QUIRK_FLAG_GET_SAMPLE_RATE),
++      DEVICE_FLG(0x19f7, 0x0003, /* RODE NT-USB */
++                 QUIRK_FLAG_MIXER_MIN_MUTE),
+       DEVICE_FLG(0x19f7, 0x0035, /* RODE NT-USB+ */
+                  QUIRK_FLAG_GET_SAMPLE_RATE),
+       DEVICE_FLG(0x1bcf, 0x2281, /* HD Webcam */
+@@ -2353,6 +2359,8 @@ static const struct usb_audio_quirk_flags_table quirk_flags_table[] = {
+                  QUIRK_FLAG_CTL_MSG_DELAY_1M),
+       DEVICE_FLG(0x2d95, 0x8021, /* VIVO USB-C-XE710 HEADSET */
+                  QUIRK_FLAG_CTL_MSG_DELAY_1M),
++      DEVICE_FLG(0x2d99, 0x0026, /* HECATE G2 GAMING HEADSET */
++                 QUIRK_FLAG_MIXER_MIN_MUTE),
+       DEVICE_FLG(0x2fc6, 0xf0b7, /* iBasso DC07 Pro */
+                  QUIRK_FLAG_CTL_MSG_DELAY_1M),
+       DEVICE_FLG(0x30be, 0x0101, /* Schiit Hel */
+diff --git a/sound/usb/usbaudio.h b/sound/usb/usbaudio.h
+index 158ec053dc44d..1ef4d39978df3 100644
+--- a/sound/usb/usbaudio.h
++++ b/sound/usb/usbaudio.h
+@@ -196,6 +196,9 @@ extern bool snd_usb_skip_validation;
+  *  for the given endpoint.
+  * QUIRK_FLAG_MIC_RES_16 and QUIRK_FLAG_MIC_RES_384
+  *  Set the fixed resolution for Mic Capture Volume (mostly for webcams)
++ * QUIRK_FLAG_MIXER_MIN_MUTE
++ *  Set minimum volume control value as mute for devices where the lowest
++ *  playback value represents muted state instead of minimum audible volume
+  */
+ #define QUIRK_FLAG_GET_SAMPLE_RATE    (1U << 0)
+@@ -222,5 +225,6 @@ extern bool snd_usb_skip_validation;
+ #define QUIRK_FLAG_FIXED_RATE         (1U << 21)
+ #define QUIRK_FLAG_MIC_RES_16         (1U << 22)
+ #define QUIRK_FLAG_MIC_RES_384                (1U << 23)
++#define QUIRK_FLAG_MIXER_MIN_MUTE     (1U << 24)
+ #endif /* __USBAUDIO_H */
+-- 
+2.51.0
+
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 (file)
index 0000000..4678014
--- /dev/null
@@ -0,0 +1,46 @@
+From fab9ea2ce5ecbac45dc1fd6359dc1f963eb4d67f Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 26 May 2025 17:07:47 +0300
+Subject: ALSA: usb-audio: Remove unneeded wmb() in mixer_quirks
+
+From: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+
+[ Upstream commit 9cea7425595697802e8d55a322a251999554b8b1 ]
+
+Adding a memory barrier before wake_up() in
+snd_usb_soundblaster_remote_complete() is supposed to ensure the write
+to mixer->rc_code is visible in wait_event_interruptible() from
+snd_usb_sbrc_hwdep_read().
+
+However, this is not really necessary, since wake_up() is just a wrapper
+over __wake_up() which already executes a full memory barrier before
+accessing the state of the task to be waken up.
+
+Drop the redundant call to wmb() and implicitly fix the checkpatch
+complaint:
+
+  WARNING: memory barrier without comment
+
+Signed-off-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Link: https://patch.msgid.link/20250526-dualsense-alsa-jack-v1-8-1a821463b632@collabora.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/mixer_quirks.c | 1 -
+ 1 file changed, 1 deletion(-)
+
+diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
+index dab6d461cf8cd..5507340a7723e 100644
+--- a/sound/usb/mixer_quirks.c
++++ b/sound/usb/mixer_quirks.c
+@@ -212,7 +212,6 @@ static void snd_usb_soundblaster_remote_complete(struct urb *urb)
+       if (code == rc->mute_code)
+               snd_usb_mixer_notify_id(mixer, rc->mute_mixer_id);
+       mixer->rc_code = code;
+-      wmb();
+       wake_up(&mixer->rc_waitq);
+ }
+-- 
+2.51.0
+
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 (file)
index 0000000..b1cef23
--- /dev/null
@@ -0,0 +1,37 @@
+From 49f28fbe893563cc48b2cf31f1a5248d6f2c44de Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 26 May 2025 17:07:46 +0300
+Subject: ALSA: usb-audio: Simplify NULL comparison in mixer_quirks
+
+From: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+
+[ Upstream commit f2d6d660e8fd5f4467e80743f82119201e67fa9c ]
+
+Handle report from checkpatch.pl:
+
+  CHECK: Comparison to NULL could be written "t->name"
+
+Signed-off-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Link: https://patch.msgid.link/20250526-dualsense-alsa-jack-v1-7-1a821463b632@collabora.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/mixer_quirks.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
+index 741a70d0816cc..dab6d461cf8cd 100644
+--- a/sound/usb/mixer_quirks.c
++++ b/sound/usb/mixer_quirks.c
+@@ -129,7 +129,7 @@ static int snd_create_std_mono_table(struct usb_mixer_interface *mixer,
+ {
+       int err;
+-      while (t->name != NULL) {
++      while (t->name) {
+               err = snd_create_std_mono_ctl(mixer, t->unitid, t->control,
+                                             t->cmask, t->val_type, t->name,
+                                             t->tlv_callback);
+-- 
+2.51.0
+
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 (file)
index 0000000..9a8cced
--- /dev/null
@@ -0,0 +1,78 @@
+From ccd379cf477b3ef311a7e1df6f16301204ecf686 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 8 Jul 2025 16:00:27 +0800
+Subject: ASoC: Intel: soc-acpi: Add entry for HDMI_In capture support in PTL
+ match table
+
+From: Balamurugan C <balamurugan.c@intel.com>
+
+[ Upstream commit fb00ab1f39369e49d25c74f0d41e4c1ec2f12576 ]
+
+Adding HDMI-In capture via I2S feature support in PTL platform.
+
+Signed-off-by: Balamurugan C <balamurugan.c@intel.com>
+Reviewed-by: Liam Girdwood <liam.r.girdwood@intel.com>
+Signed-off-by: Bard Liao <yung-chuan.liao@linux.intel.com>
+Link: https://patch.msgid.link/20250708080030.1257790-3-yung-chuan.liao@linux.intel.com
+Signed-off-by: Mark Brown <broonie@kernel.org>
+Stable-dep-of: 03aa2ed9e187 ("ASoC: Intel: sof_rt5682: Add HDMI-In capture with rt5682 support for PTL.")
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/soc/intel/boards/sof_es8336.c               | 10 ++++++++++
+ sound/soc/intel/common/soc-acpi-intel-ptl-match.c | 12 ++++++++++++
+ 2 files changed, 22 insertions(+)
+
+diff --git a/sound/soc/intel/boards/sof_es8336.c b/sound/soc/intel/boards/sof_es8336.c
+index a0b3679b17b42..1211a2b8a2a2c 100644
+--- a/sound/soc/intel/boards/sof_es8336.c
++++ b/sound/soc/intel/boards/sof_es8336.c
+@@ -826,6 +826,16 @@ static const struct platform_device_id board_ids[] = {
+                                       SOF_ES8336_SPEAKERS_EN_GPIO1_QUIRK |
+                                       SOF_ES8336_JD_INVERTED),
+       },
++      {
++              .name = "ptl_es83x6_c1_h02",
++              .driver_data = (kernel_ulong_t)(SOF_ES8336_SSP_CODEC(1) |
++                                      SOF_NO_OF_HDMI_CAPTURE_SSP(2) |
++                                      SOF_HDMI_CAPTURE_1_SSP(0) |
++                                      SOF_HDMI_CAPTURE_2_SSP(2) |
++                                      SOF_SSP_HDMI_CAPTURE_PRESENT |
++                                      SOF_ES8336_SPEAKERS_EN_GPIO1_QUIRK |
++                                      SOF_ES8336_JD_INVERTED),
++      },
+       { }
+ };
+ MODULE_DEVICE_TABLE(platform, board_ids);
+diff --git a/sound/soc/intel/common/soc-acpi-intel-ptl-match.c b/sound/soc/intel/common/soc-acpi-intel-ptl-match.c
+index ff4f2fbf9271d..67f1091483dce 100644
+--- a/sound/soc/intel/common/soc-acpi-intel-ptl-match.c
++++ b/sound/soc/intel/common/soc-acpi-intel-ptl-match.c
+@@ -26,6 +26,11 @@ static const struct snd_soc_acpi_codecs ptl_essx_83x6 = {
+       .codecs = { "ESSX8316", "ESSX8326", "ESSX8336"},
+ };
++static const struct snd_soc_acpi_codecs ptl_lt6911_hdmi = {
++      .num_codecs = 1,
++      .codecs = {"INTC10B0"}
++};
++
+ struct snd_soc_acpi_mach snd_soc_acpi_intel_ptl_machines[] = {
+       {
+               .comp_ids = &ptl_rt5682_rt5682s_hp,
+@@ -34,6 +39,13 @@ struct snd_soc_acpi_mach snd_soc_acpi_intel_ptl_machines[] = {
+               .tplg_quirk_mask = SND_SOC_ACPI_TPLG_INTEL_AMP_NAME |
+                                       SND_SOC_ACPI_TPLG_INTEL_CODEC_NAME,
+       },
++      {
++              .comp_ids = &ptl_essx_83x6,
++              .drv_name = "ptl_es83x6_c1_h02",
++              .machine_quirk = snd_soc_acpi_codec_list,
++              .quirk_data = &ptl_lt6911_hdmi,
++              .sof_tplg_filename = "sof-ptl-es83x6-ssp1-hdmi-ssp02.tplg",
++      },
+       {
+               .comp_ids = &ptl_essx_83x6,
+               .drv_name = "sof-essx8336",
+-- 
+2.51.0
+
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 (file)
index 0000000..8ca7f83
--- /dev/null
@@ -0,0 +1,56 @@
+From 6fa39960d3447874390f33535f85ab240a81394b Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 8 Jul 2025 16:00:26 +0800
+Subject: ASoC: Intel: soc-acpi: Add entry for sof_es8336 in PTL match table.
+
+From: Balamurugan C <balamurugan.c@intel.com>
+
+[ Upstream commit 2813f535b5847771d9e56df678c523a7e64f860e ]
+
+Adding ES83x6 I2S codec support for PTL platforms and entry in match table.
+
+Signed-off-by: Balamurugan C <balamurugan.c@intel.com>
+Reviewed-by: Liam Girdwood <liam.r.girdwood@intel.com>
+Signed-off-by: Bard Liao <yung-chuan.liao@linux.intel.com>
+Link: https://patch.msgid.link/20250708080030.1257790-2-yung-chuan.liao@linux.intel.com
+Signed-off-by: Mark Brown <broonie@kernel.org>
+Stable-dep-of: 03aa2ed9e187 ("ASoC: Intel: sof_rt5682: Add HDMI-In capture with rt5682 support for PTL.")
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/soc/intel/common/soc-acpi-intel-ptl-match.c | 13 +++++++++++++
+ 1 file changed, 13 insertions(+)
+
+diff --git a/sound/soc/intel/common/soc-acpi-intel-ptl-match.c b/sound/soc/intel/common/soc-acpi-intel-ptl-match.c
+index eae75f3f0fa40..ff4f2fbf9271d 100644
+--- a/sound/soc/intel/common/soc-acpi-intel-ptl-match.c
++++ b/sound/soc/intel/common/soc-acpi-intel-ptl-match.c
+@@ -21,6 +21,11 @@ static const struct snd_soc_acpi_codecs ptl_rt5682_rt5682s_hp = {
+       .codecs = {RT5682_ACPI_HID, RT5682S_ACPI_HID},
+ };
++static const struct snd_soc_acpi_codecs ptl_essx_83x6 = {
++      .num_codecs = 3,
++      .codecs = { "ESSX8316", "ESSX8326", "ESSX8336"},
++};
++
+ struct snd_soc_acpi_mach snd_soc_acpi_intel_ptl_machines[] = {
+       {
+               .comp_ids = &ptl_rt5682_rt5682s_hp,
+@@ -29,6 +34,14 @@ struct snd_soc_acpi_mach snd_soc_acpi_intel_ptl_machines[] = {
+               .tplg_quirk_mask = SND_SOC_ACPI_TPLG_INTEL_AMP_NAME |
+                                       SND_SOC_ACPI_TPLG_INTEL_CODEC_NAME,
+       },
++      {
++              .comp_ids = &ptl_essx_83x6,
++              .drv_name = "sof-essx8336",
++              .sof_tplg_filename = "sof-ptl-es8336", /* the tplg suffix is added at run time */
++              .tplg_quirk_mask = SND_SOC_ACPI_TPLG_INTEL_SSP_NUMBER |
++                                      SND_SOC_ACPI_TPLG_INTEL_SSP_MSB |
++                                      SND_SOC_ACPI_TPLG_INTEL_DMIC_NUMBER,
++      },
+       {},
+ };
+ EXPORT_SYMBOL_GPL(snd_soc_acpi_intel_ptl_machines);
+-- 
+2.51.0
+
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 (file)
index 0000000..c7d092e
--- /dev/null
@@ -0,0 +1,63 @@
+From b091385f84e49447d27ad52d211229aee8bb6e92 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 16 Jul 2025 16:23:00 +0800
+Subject: ASoC: Intel: sof_rt5682: Add HDMI-In capture with rt5682 support for
+ PTL.
+
+From: Balamurugan C <balamurugan.c@intel.com>
+
+[ Upstream commit 03aa2ed9e187e42f25b3871b691d535fc19156c4 ]
+
+Added match table entry on ptl machines to support HDMI-In capture
+with rt5682 I2S audio codec. also added the respective quirk
+configuration in rt5682 machine driver.
+
+Signed-off-by: Balamurugan C <balamurugan.c@intel.com>
+Signed-off-by: Bard Liao <yung-chuan.liao@linux.intel.com>
+Link: https://patch.msgid.link/20250716082300.1810352-1-yung-chuan.liao@linux.intel.com
+Signed-off-by: Mark Brown <broonie@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/soc/intel/boards/sof_rt5682.c               | 7 +++++++
+ sound/soc/intel/common/soc-acpi-intel-ptl-match.c | 7 +++++++
+ 2 files changed, 14 insertions(+)
+
+diff --git a/sound/soc/intel/boards/sof_rt5682.c b/sound/soc/intel/boards/sof_rt5682.c
+index f5925bd0a3fc6..4994aaccc583a 100644
+--- a/sound/soc/intel/boards/sof_rt5682.c
++++ b/sound/soc/intel/boards/sof_rt5682.c
+@@ -892,6 +892,13 @@ static const struct platform_device_id board_ids[] = {
+                                       SOF_SSP_PORT_BT_OFFLOAD(2) |
+                                       SOF_BT_OFFLOAD_PRESENT),
+       },
++      {
++              .name = "ptl_rt5682_c1_h02",
++              .driver_data = (kernel_ulong_t)(SOF_RT5682_MCLK_EN |
++                                      SOF_SSP_PORT_CODEC(1) |
++                                      /* SSP 0 and SSP 2 are used for HDMI IN */
++                                      SOF_SSP_MASK_HDMI_CAPTURE(0x5)),
++      },
+       { }
+ };
+ MODULE_DEVICE_TABLE(platform, board_ids);
+diff --git a/sound/soc/intel/common/soc-acpi-intel-ptl-match.c b/sound/soc/intel/common/soc-acpi-intel-ptl-match.c
+index 67f1091483dce..d90d8672ab77d 100644
+--- a/sound/soc/intel/common/soc-acpi-intel-ptl-match.c
++++ b/sound/soc/intel/common/soc-acpi-intel-ptl-match.c
+@@ -32,6 +32,13 @@ static const struct snd_soc_acpi_codecs ptl_lt6911_hdmi = {
+ };
+ struct snd_soc_acpi_mach snd_soc_acpi_intel_ptl_machines[] = {
++      {
++              .comp_ids = &ptl_rt5682_rt5682s_hp,
++              .drv_name = "ptl_rt5682_c1_h02",
++              .machine_quirk = snd_soc_acpi_codec_list,
++              .quirk_data = &ptl_lt6911_hdmi,
++              .sof_tplg_filename = "sof-ptl-rt5682-ssp1-hdmi-ssp02.tplg",
++      },
+       {
+               .comp_ids = &ptl_rt5682_rt5682s_hp,
+               .drv_name = "ptl_rt5682_def",
+-- 
+2.51.0
+
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 (file)
index 0000000..bda17ac
--- /dev/null
@@ -0,0 +1,65 @@
+From ad62c26d2ac3c407a8c4d35dfa8669df5132f4bd Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 9 May 2025 12:12:50 +0200
+Subject: drm/panfrost: Add support for Mali on the MT8370 SoC
+
+From: Louis-Alexis Eyraud <louisalexis.eyraud@collabora.com>
+
+[ Upstream commit 81645377c231803389ab0f2d09df6622e32dd327 ]
+
+Add a compatible for the MediaTek MT8370 SoC, with an integrated ARM
+Mali G57 MC2 GPU (Valhall-JM, dual core), with new platform data for
+its support in the panfrost driver.
+It uses the same data as MT8186 for the power management features to
+describe power supplies, pm_domains and enablement (one regulator, two
+power domains) but also sets the FORCE_AARCH64_PGTABLE flag in the GPU
+configuration quirks bitfield to enable AARCH64 4K page table format
+mode.
+As MT8186 and MT8370 SoC have different GPU architecture (Mali G52 2EE
+MC2 for MT8186), making them not compatible, and this mode is only
+enabled for Mediatek SoC that are Mali G57 based (compatible with
+mediatek,mali-mt8188 or mediatek,mali-8192), having specific platform
+data allows to set this flag for MT8370 without modifying MT8186
+configuration and behaviour.
+
+Reviewed-by: Steven Price <steven.price@arm.com>
+Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
+Signed-off-by: Louis-Alexis Eyraud <louisalexis.eyraud@collabora.com>
+Signed-off-by: Steven Price <steven.price@arm.com>
+Link: https://lore.kernel.org/r/20250509-mt8370-enable-gpu-v6-4-2833888cb1d3@collabora.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/gpu/drm/panfrost/panfrost_drv.c | 10 ++++++++++
+ 1 file changed, 10 insertions(+)
+
+diff --git a/drivers/gpu/drm/panfrost/panfrost_drv.c b/drivers/gpu/drm/panfrost/panfrost_drv.c
+index 21b28bef84015..07cd67baa81bf 100644
+--- a/drivers/gpu/drm/panfrost/panfrost_drv.c
++++ b/drivers/gpu/drm/panfrost/panfrost_drv.c
+@@ -841,6 +841,15 @@ static const struct panfrost_compatible mediatek_mt8192_data = {
+       .gpu_quirks = BIT(GPU_QUIRK_FORCE_AARCH64_PGTABLE),
+ };
++static const struct panfrost_compatible mediatek_mt8370_data = {
++      .num_supplies = ARRAY_SIZE(default_supplies) - 1,
++      .supply_names = default_supplies,
++      .num_pm_domains = 2,
++      .pm_domain_names = mediatek_pm_domains,
++      .pm_features = BIT(GPU_PM_CLK_DIS) | BIT(GPU_PM_VREG_OFF),
++      .gpu_quirks = BIT(GPU_QUIRK_FORCE_AARCH64_PGTABLE),
++};
++
+ static const struct of_device_id dt_match[] = {
+       /* Set first to probe before the generic compatibles */
+       { .compatible = "amlogic,meson-gxm-mali",
+@@ -863,6 +872,7 @@ static const struct of_device_id dt_match[] = {
+       { .compatible = "mediatek,mt8186-mali", .data = &mediatek_mt8186_data },
+       { .compatible = "mediatek,mt8188-mali", .data = &mediatek_mt8188_data },
+       { .compatible = "mediatek,mt8192-mali", .data = &mediatek_mt8192_data },
++      { .compatible = "mediatek,mt8370-mali", .data = &mediatek_mt8370_data },
+       { .compatible = "allwinner,sun50i-h616-mali", .data = &allwinner_h616_data },
+       {}
+ };
+-- 
+2.51.0
+
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 (file)
index 0000000..d909578
--- /dev/null
@@ -0,0 +1,110 @@
+From d5956bf938dd402a3680bef657aaaeb51470e153 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 9 May 2025 12:12:49 +0200
+Subject: drm/panfrost: Commonize Mediatek power domain array definitions
+
+From: Louis-Alexis Eyraud <louisalexis.eyraud@collabora.com>
+
+[ Upstream commit bd77b870eb190c9cf5d9b7208625513e99e5be2d ]
+
+In the panfrost driver, the platform data of several Mediatek SoC
+declares and uses several different power domains arrays according to
+GPU core number present in the SoC:
+- mediatek_mt8186_pm_domains (2 cores)
+- mediatek_mt8183_pm_domains (3 cores)
+- mediatek_mt8192_pm_domains (5 cores)
+
+As they all are fixed arrays, starting with the same entries and the
+platform data also has a power domains array length field
+(num_pm_domains), they can be replaced by a single array, containing
+all entries, if the num_pm_domains field of the platform data is also
+set to the matching core number.
+
+So, create a generic power domain array (mediatek_pm_domains) and use
+it in the mt8183(b), mt8186, mt8188 and mt8192 platform data instead.
+
+Signed-off-by: Louis-Alexis Eyraud <louisalexis.eyraud@collabora.com>
+Reviewed-by: Steven Price <steven.price@arm.com>
+Signed-off-by: Steven Price <steven.price@arm.com>
+Link: https://lore.kernel.org/r/20250509-mt8370-enable-gpu-v6-3-2833888cb1d3@collabora.com
+Stable-dep-of: 81645377c231 ("drm/panfrost: Add support for Mali on the MT8370 SoC")
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/gpu/drm/panfrost/panfrost_drv.c | 27 +++++++++++--------------
+ 1 file changed, 12 insertions(+), 15 deletions(-)
+
+diff --git a/drivers/gpu/drm/panfrost/panfrost_drv.c b/drivers/gpu/drm/panfrost/panfrost_drv.c
+index 7b899a9b2120c..21b28bef84015 100644
+--- a/drivers/gpu/drm/panfrost/panfrost_drv.c
++++ b/drivers/gpu/drm/panfrost/panfrost_drv.c
+@@ -789,6 +789,8 @@ static const struct panfrost_compatible amlogic_data = {
+       .vendor_quirk = panfrost_gpu_amlogic_quirk,
+ };
++static const char * const mediatek_pm_domains[] = { "core0", "core1", "core2",
++                                                  "core3", "core4" };
+ /*
+  * The old data with two power supplies for MT8183 is here only to
+  * keep retro-compatibility with older devicetrees, as DVFS will
+@@ -798,48 +800,43 @@ static const struct panfrost_compatible amlogic_data = {
+  * coupled regulators instead.
+  */
+ static const char * const legacy_supplies[] = { "mali", "sram", NULL };
+-static const char * const mediatek_mt8183_pm_domains[] = { "core0", "core1", "core2" };
+ static const struct panfrost_compatible mediatek_mt8183_data = {
+       .num_supplies = ARRAY_SIZE(legacy_supplies) - 1,
+       .supply_names = legacy_supplies,
+-      .num_pm_domains = ARRAY_SIZE(mediatek_mt8183_pm_domains),
+-      .pm_domain_names = mediatek_mt8183_pm_domains,
++      .num_pm_domains = 3,
++      .pm_domain_names = mediatek_pm_domains,
+ };
+ static const struct panfrost_compatible mediatek_mt8183_b_data = {
+       .num_supplies = ARRAY_SIZE(default_supplies) - 1,
+       .supply_names = default_supplies,
+-      .num_pm_domains = ARRAY_SIZE(mediatek_mt8183_pm_domains),
+-      .pm_domain_names = mediatek_mt8183_pm_domains,
++      .num_pm_domains = 3,
++      .pm_domain_names = mediatek_pm_domains,
+       .pm_features = BIT(GPU_PM_CLK_DIS) | BIT(GPU_PM_VREG_OFF),
+ };
+-static const char * const mediatek_mt8186_pm_domains[] = { "core0", "core1" };
+ static const struct panfrost_compatible mediatek_mt8186_data = {
+       .num_supplies = ARRAY_SIZE(default_supplies) - 1,
+       .supply_names = default_supplies,
+-      .num_pm_domains = ARRAY_SIZE(mediatek_mt8186_pm_domains),
+-      .pm_domain_names = mediatek_mt8186_pm_domains,
++      .num_pm_domains = 2,
++      .pm_domain_names = mediatek_pm_domains,
+       .pm_features = BIT(GPU_PM_CLK_DIS) | BIT(GPU_PM_VREG_OFF),
+ };
+-/* MT8188 uses the same power domains and power supplies as MT8183 */
+ static const struct panfrost_compatible mediatek_mt8188_data = {
+       .num_supplies = ARRAY_SIZE(default_supplies) - 1,
+       .supply_names = default_supplies,
+-      .num_pm_domains = ARRAY_SIZE(mediatek_mt8183_pm_domains),
+-      .pm_domain_names = mediatek_mt8183_pm_domains,
++      .num_pm_domains = 3,
++      .pm_domain_names = mediatek_pm_domains,
+       .pm_features = BIT(GPU_PM_CLK_DIS) | BIT(GPU_PM_VREG_OFF),
+       .gpu_quirks = BIT(GPU_QUIRK_FORCE_AARCH64_PGTABLE),
+ };
+-static const char * const mediatek_mt8192_pm_domains[] = { "core0", "core1", "core2",
+-                                                         "core3", "core4" };
+ static const struct panfrost_compatible mediatek_mt8192_data = {
+       .num_supplies = ARRAY_SIZE(default_supplies) - 1,
+       .supply_names = default_supplies,
+-      .num_pm_domains = ARRAY_SIZE(mediatek_mt8192_pm_domains),
+-      .pm_domain_names = mediatek_mt8192_pm_domains,
++      .num_pm_domains = 5,
++      .pm_domain_names = mediatek_pm_domains,
+       .pm_features = BIT(GPU_PM_CLK_DIS) | BIT(GPU_PM_VREG_OFF),
+       .gpu_quirks = BIT(GPU_QUIRK_FORCE_AARCH64_PGTABLE),
+ };
+-- 
+2.51.0
+
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 (file)
index 0000000..98ed487
--- /dev/null
@@ -0,0 +1,96 @@
+From ba8a94b1728d25d446b95b52e2d2a52ff439ad84 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 9 May 2025 12:12:48 +0200
+Subject: drm/panfrost: Drop duplicated Mediatek supplies arrays
+
+From: Louis-Alexis Eyraud <louisalexis.eyraud@collabora.com>
+
+[ Upstream commit 6905b0d9813176087fc0f28bc5e4ee2b86e6ce13 ]
+
+In the panfrost driver, the platform data of several Mediatek SoC
+declares and uses custom supplies array definitions
+(mediatek_mt8192_supplies, mediatek_mt8183_b_supplies), that are the
+same as default_supplies (used by default platform data).
+
+So drop these duplicated definitions and use default_supplies instead.
+Also, rename mediatek_mt8183_supplies to a more generic name too
+(legacy_supplies).
+
+Signed-off-by: Louis-Alexis Eyraud <louisalexis.eyraud@collabora.com>
+Reviewed-by: Steven Price <steven.price@arm.com>
+Signed-off-by: Steven Price <steven.price@arm.com>
+Link: https://lore.kernel.org/r/20250509-mt8370-enable-gpu-v6-2-2833888cb1d3@collabora.com
+Stable-dep-of: 81645377c231 ("drm/panfrost: Add support for Mali on the MT8370 SoC")
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/gpu/drm/panfrost/panfrost_drv.c | 24 +++++++++++-------------
+ 1 file changed, 11 insertions(+), 13 deletions(-)
+
+diff --git a/drivers/gpu/drm/panfrost/panfrost_drv.c b/drivers/gpu/drm/panfrost/panfrost_drv.c
+index f1ec3b02f15a0..7b899a9b2120c 100644
+--- a/drivers/gpu/drm/panfrost/panfrost_drv.c
++++ b/drivers/gpu/drm/panfrost/panfrost_drv.c
+@@ -797,19 +797,18 @@ static const struct panfrost_compatible amlogic_data = {
+  * On new devicetrees please use the _b variant with a single and
+  * coupled regulators instead.
+  */
+-static const char * const mediatek_mt8183_supplies[] = { "mali", "sram", NULL };
++static const char * const legacy_supplies[] = { "mali", "sram", NULL };
+ static const char * const mediatek_mt8183_pm_domains[] = { "core0", "core1", "core2" };
+ static const struct panfrost_compatible mediatek_mt8183_data = {
+-      .num_supplies = ARRAY_SIZE(mediatek_mt8183_supplies) - 1,
+-      .supply_names = mediatek_mt8183_supplies,
++      .num_supplies = ARRAY_SIZE(legacy_supplies) - 1,
++      .supply_names = legacy_supplies,
+       .num_pm_domains = ARRAY_SIZE(mediatek_mt8183_pm_domains),
+       .pm_domain_names = mediatek_mt8183_pm_domains,
+ };
+-static const char * const mediatek_mt8183_b_supplies[] = { "mali", NULL };
+ static const struct panfrost_compatible mediatek_mt8183_b_data = {
+-      .num_supplies = ARRAY_SIZE(mediatek_mt8183_b_supplies) - 1,
+-      .supply_names = mediatek_mt8183_b_supplies,
++      .num_supplies = ARRAY_SIZE(default_supplies) - 1,
++      .supply_names = default_supplies,
+       .num_pm_domains = ARRAY_SIZE(mediatek_mt8183_pm_domains),
+       .pm_domain_names = mediatek_mt8183_pm_domains,
+       .pm_features = BIT(GPU_PM_CLK_DIS) | BIT(GPU_PM_VREG_OFF),
+@@ -817,8 +816,8 @@ static const struct panfrost_compatible mediatek_mt8183_b_data = {
+ static const char * const mediatek_mt8186_pm_domains[] = { "core0", "core1" };
+ static const struct panfrost_compatible mediatek_mt8186_data = {
+-      .num_supplies = ARRAY_SIZE(mediatek_mt8183_b_supplies) - 1,
+-      .supply_names = mediatek_mt8183_b_supplies,
++      .num_supplies = ARRAY_SIZE(default_supplies) - 1,
++      .supply_names = default_supplies,
+       .num_pm_domains = ARRAY_SIZE(mediatek_mt8186_pm_domains),
+       .pm_domain_names = mediatek_mt8186_pm_domains,
+       .pm_features = BIT(GPU_PM_CLK_DIS) | BIT(GPU_PM_VREG_OFF),
+@@ -826,20 +825,19 @@ static const struct panfrost_compatible mediatek_mt8186_data = {
+ /* MT8188 uses the same power domains and power supplies as MT8183 */
+ static const struct panfrost_compatible mediatek_mt8188_data = {
+-      .num_supplies = ARRAY_SIZE(mediatek_mt8183_b_supplies) - 1,
+-      .supply_names = mediatek_mt8183_b_supplies,
++      .num_supplies = ARRAY_SIZE(default_supplies) - 1,
++      .supply_names = default_supplies,
+       .num_pm_domains = ARRAY_SIZE(mediatek_mt8183_pm_domains),
+       .pm_domain_names = mediatek_mt8183_pm_domains,
+       .pm_features = BIT(GPU_PM_CLK_DIS) | BIT(GPU_PM_VREG_OFF),
+       .gpu_quirks = BIT(GPU_QUIRK_FORCE_AARCH64_PGTABLE),
+ };
+-static const char * const mediatek_mt8192_supplies[] = { "mali", NULL };
+ static const char * const mediatek_mt8192_pm_domains[] = { "core0", "core1", "core2",
+                                                          "core3", "core4" };
+ static const struct panfrost_compatible mediatek_mt8192_data = {
+-      .num_supplies = ARRAY_SIZE(mediatek_mt8192_supplies) - 1,
+-      .supply_names = mediatek_mt8192_supplies,
++      .num_supplies = ARRAY_SIZE(default_supplies) - 1,
++      .supply_names = default_supplies,
+       .num_pm_domains = ARRAY_SIZE(mediatek_mt8192_pm_domains),
+       .pm_domain_names = mediatek_mt8192_pm_domains,
+       .pm_features = BIT(GPU_PM_CLK_DIS) | BIT(GPU_PM_VREG_OFF),
+-- 
+2.51.0
+
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 (file)
index 0000000..03f61d1
--- /dev/null
@@ -0,0 +1,39 @@
+From 8e01c0e2e9aaf018d6a8b0b9d009775caf5bfae3 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sat, 20 Sep 2025 11:51:48 +0900
+Subject: firewire: core: fix overlooked update of subsystem ABI version
+
+From: Takashi Sakamoto <o-takashi@sakamocchi.jp>
+
+[ Upstream commit 853a57ba263adfecf4430b936d6862bc475b4bb5 ]
+
+In kernel v6.5, several functions were added to the cdev layer. This
+required updating the default version of subsystem ABI up to 6, but
+this requirement was overlooked.
+
+This commit updates the version accordingly.
+
+Fixes: 6add87e9764d ("firewire: cdev: add new version of ABI to notify time stamp at request/response subaction of transaction#")
+Link: https://lore.kernel.org/r/20250920025148.163402-1-o-takashi@sakamocchi.jp
+Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/firewire/core-cdev.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/firewire/core-cdev.c b/drivers/firewire/core-cdev.c
+index bd04980009a46..6a81c3fd4c860 100644
+--- a/drivers/firewire/core-cdev.c
++++ b/drivers/firewire/core-cdev.c
+@@ -41,7 +41,7 @@
+ /*
+  * ABI version history is documented in linux/firewire-cdev.h.
+  */
+-#define FW_CDEV_KERNEL_VERSION                        5
++#define FW_CDEV_KERNEL_VERSION                        6
+ #define FW_CDEV_VERSION_EVENT_REQUEST2                4
+ #define FW_CDEV_VERSION_ALLOCATE_REGION_END   4
+ #define FW_CDEV_VERSION_AUTO_FLUSH_ISO_OVERFLOW       5
+-- 
+2.51.0
+
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 (file)
index 0000000..b161221
--- /dev/null
@@ -0,0 +1,55 @@
+From c175c38a14919414e73f6de6f400163d0220ccf1 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 14 Aug 2025 13:34:29 -0500
+Subject: gpiolib: acpi: Add quirk for ASUS ProArt PX13
+
+From: Mario Limonciello (AMD) <superm1@kernel.org>
+
+[ Upstream commit 23800ad1265f10c2bc6f42154ce4d20e59f2900e ]
+
+The ASUS ProArt PX13 has a spurious wakeup event from the touchpad
+a few moments after entering hardware sleep.  This can be avoided
+by preventing the touchpad from being a wake source.
+
+Add to the wakeup ignore list.
+
+Reported-by: Amit Chaudhari <amitchaudhari@mac.com>
+Closes: https://gitlab.freedesktop.org/drm/amd/-/issues/4482
+Tested-by: Amit Chaudhari <amitchaudhari@mac.com>
+Signed-off-by: Mario Limonciello (AMD) <superm1@kernel.org>
+Reviewed-by: Mika Westerberg <mika.westerberg@linux.intel.com>
+Link: https://lore.kernel.org/20250814183430.3887973-1-superm1@kernel.org
+Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/gpio/gpiolib-acpi-quirks.c | 14 ++++++++++++++
+ 1 file changed, 14 insertions(+)
+
+diff --git a/drivers/gpio/gpiolib-acpi-quirks.c b/drivers/gpio/gpiolib-acpi-quirks.c
+index c13545dce3492..bfb04e67c4bc8 100644
+--- a/drivers/gpio/gpiolib-acpi-quirks.c
++++ b/drivers/gpio/gpiolib-acpi-quirks.c
+@@ -344,6 +344,20 @@ static const struct dmi_system_id gpiolib_acpi_quirks[] __initconst = {
+                       .ignore_interrupt = "AMDI0030:00@8",
+               },
+       },
++      {
++              /*
++               * Spurious wakeups from TP_ATTN# pin
++               * Found in BIOS 5.35
++               * https://gitlab.freedesktop.org/drm/amd/-/issues/4482
++               */
++              .matches = {
++                      DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
++                      DMI_MATCH(DMI_PRODUCT_FAMILY, "ProArt PX13"),
++              },
++              .driver_data = &(struct acpi_gpiolib_dmi_quirk) {
++                      .ignore_wake = "ASCP1A00:00@8",
++              },
++      },
+       {} /* Terminating entry */
+ };
+-- 
+2.51.0
+
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 (file)
index 0000000..108c622
--- /dev/null
@@ -0,0 +1,122 @@
+From bfaca0e9326e817fd5bff79f2676ccb98b4b27ff Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 18 Sep 2025 18:02:02 +0530
+Subject: HID: amd_sfh: Add sync across amd sfh work functions
+
+From: Basavaraj Natikar <Basavaraj.Natikar@amd.com>
+
+[ Upstream commit bba920e6f803138587248079de47ad3464a396f6 ]
+
+The process of the report is delegated across different work functions.
+Hence, add a sync mechanism to protect SFH work data across functions.
+
+Fixes: 4b2c53d93a4b ("SFH:Transport Driver to add support of AMD Sensor Fusion Hub (SFH)")
+Reported-by: Matthew Schwartz <matthew.schwartz@linux.dev>
+Closes: https://lore.kernel.org/all/a21abca5-4268-449d-95f1-bdd7a25894a5@linux.dev/
+Tested-by: Prakruthi SP <Prakruthi.SP@amd.com>
+Co-developed-by: Akshata MukundShetty <akshata.mukundshetty@amd.com>
+Signed-off-by: Akshata MukundShetty <akshata.mukundshetty@amd.com>
+Signed-off-by: Basavaraj Natikar <Basavaraj.Natikar@amd.com>
+Reviewed-by: Mario Limonciello (AMD) <superm1@kernel.org>
+Signed-off-by: Jiri Kosina <jkosina@suse.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/hid/amd-sfh-hid/amd_sfh_client.c | 12 ++++++++++--
+ drivers/hid/amd-sfh-hid/amd_sfh_common.h |  3 +++
+ drivers/hid/amd-sfh-hid/amd_sfh_pcie.c   |  4 ++++
+ 3 files changed, 17 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/hid/amd-sfh-hid/amd_sfh_client.c b/drivers/hid/amd-sfh-hid/amd_sfh_client.c
+index 3438d392920fa..8dae9a7766853 100644
+--- a/drivers/hid/amd-sfh-hid/amd_sfh_client.c
++++ b/drivers/hid/amd-sfh-hid/amd_sfh_client.c
+@@ -39,8 +39,12 @@ int amd_sfh_get_report(struct hid_device *hid, int report_id, int report_type)
+       struct amdtp_hid_data *hid_data = hid->driver_data;
+       struct amdtp_cl_data *cli_data = hid_data->cli_data;
+       struct request_list *req_list = &cli_data->req_list;
++      struct amd_input_data *in_data = cli_data->in_data;
++      struct amd_mp2_dev *mp2;
+       int i;
++      mp2 = container_of(in_data, struct amd_mp2_dev, in_data);
++      guard(mutex)(&mp2->lock);
+       for (i = 0; i < cli_data->num_hid_devices; i++) {
+               if (cli_data->hid_sensor_hubs[i] == hid) {
+                       struct request_list *new = kzalloc(sizeof(*new), GFP_KERNEL);
+@@ -75,6 +79,8 @@ void amd_sfh_work(struct work_struct *work)
+       u8 report_id, node_type;
+       u8 report_size = 0;
++      mp2 = container_of(in_data, struct amd_mp2_dev, in_data);
++      guard(mutex)(&mp2->lock);
+       req_node = list_last_entry(&req_list->list, struct request_list, list);
+       list_del(&req_node->list);
+       current_index = req_node->current_index;
+@@ -83,7 +89,6 @@ void amd_sfh_work(struct work_struct *work)
+       node_type = req_node->report_type;
+       kfree(req_node);
+-      mp2 = container_of(in_data, struct amd_mp2_dev, in_data);
+       mp2_ops = mp2->mp2_ops;
+       if (node_type == HID_FEATURE_REPORT) {
+               report_size = mp2_ops->get_feat_rep(sensor_index, report_id,
+@@ -107,6 +112,8 @@ void amd_sfh_work(struct work_struct *work)
+       cli_data->cur_hid_dev = current_index;
+       cli_data->sensor_requested_cnt[current_index] = 0;
+       amdtp_hid_wakeup(cli_data->hid_sensor_hubs[current_index]);
++      if (!list_empty(&req_list->list))
++              schedule_delayed_work(&cli_data->work, 0);
+ }
+ void amd_sfh_work_buffer(struct work_struct *work)
+@@ -117,9 +124,10 @@ void amd_sfh_work_buffer(struct work_struct *work)
+       u8 report_size;
+       int i;
++      mp2 = container_of(in_data, struct amd_mp2_dev, in_data);
++      guard(mutex)(&mp2->lock);
+       for (i = 0; i < cli_data->num_hid_devices; i++) {
+               if (cli_data->sensor_sts[i] == SENSOR_ENABLED) {
+-                      mp2 = container_of(in_data, struct amd_mp2_dev, in_data);
+                       report_size = mp2->mp2_ops->get_in_rep(i, cli_data->sensor_idx[i],
+                                                              cli_data->report_id[i], in_data);
+                       hid_input_report(cli_data->hid_sensor_hubs[i], HID_INPUT_REPORT,
+diff --git a/drivers/hid/amd-sfh-hid/amd_sfh_common.h b/drivers/hid/amd-sfh-hid/amd_sfh_common.h
+index f44a3bb2fbd4f..78f830c133e5c 100644
+--- a/drivers/hid/amd-sfh-hid/amd_sfh_common.h
++++ b/drivers/hid/amd-sfh-hid/amd_sfh_common.h
+@@ -10,6 +10,7 @@
+ #ifndef AMD_SFH_COMMON_H
+ #define AMD_SFH_COMMON_H
++#include <linux/mutex.h>
+ #include <linux/pci.h>
+ #include "amd_sfh_hid.h"
+@@ -59,6 +60,8 @@ struct amd_mp2_dev {
+       u32 mp2_acs;
+       struct sfh_dev_status dev_en;
+       struct work_struct work;
++      /* mp2 to protect data */
++      struct mutex lock;
+       u8 init_done;
+       u8 rver;
+ };
+diff --git a/drivers/hid/amd-sfh-hid/amd_sfh_pcie.c b/drivers/hid/amd-sfh-hid/amd_sfh_pcie.c
+index 1c1fd63330c93..9a669c18a132f 100644
+--- a/drivers/hid/amd-sfh-hid/amd_sfh_pcie.c
++++ b/drivers/hid/amd-sfh-hid/amd_sfh_pcie.c
+@@ -462,6 +462,10 @@ static int amd_mp2_pci_probe(struct pci_dev *pdev, const struct pci_device_id *i
+       if (!privdata->cl_data)
+               return -ENOMEM;
++      rc = devm_mutex_init(&pdev->dev, &privdata->lock);
++      if (rc)
++              return rc;
++
+       privdata->sfh1_1_ops = (const struct amd_sfh1_1_ops *)id->driver_data;
+       if (privdata->sfh1_1_ops) {
+               if (boot_cpu_data.x86 >= 0x1A)
+-- 
+2.51.0
+
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 (file)
index 0000000..f71bd5b
--- /dev/null
@@ -0,0 +1,69 @@
+From 0d34bdade971798913a9fbbd9b6b662c604198ca Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 4 Sep 2025 18:42:07 +0200
+Subject: HID: cp2112: fix setter callbacks return value
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Sébastien Szymanski <sebastien.szymanski@armadeus.com>
+
+[ Upstream commit 2a5e76b9a0efc44807ff0e6b141649fac65a55ac ]
+
+Since commit 6485543488a6 ("HID: cp2112: use new line value setter
+callbacks"), setting a GPIO value always fails with error -EBADE.
+
+That's because the returned value by the setter callbacks is the
+returned value by the hid_hw_raw_request() function which is the number of
+bytes sent on success or a negative value on error. The function
+gpiochip_set() returns -EBADE if the setter callbacks return a value >
+0.
+
+Fix this by making the setter callbacks return 0 on success or a negative
+value on error.
+
+While at it, use the returned value by cp2112_gpio_set_unlocked() in the
+direction_output callback.
+
+Fixes: 6485543488a6 ("HID: cp2112: use new line value setter callbacks")
+Signed-off-by: Sébastien Szymanski <sebastien.szymanski@armadeus.com>
+Reviewed-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
+Signed-off-by: Jiri Kosina <jkosina@suse.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/hid/hid-cp2112.c | 10 +++++-----
+ 1 file changed, 5 insertions(+), 5 deletions(-)
+
+diff --git a/drivers/hid/hid-cp2112.c b/drivers/hid/hid-cp2112.c
+index 234fa82eab079..b5f2b6356f512 100644
+--- a/drivers/hid/hid-cp2112.c
++++ b/drivers/hid/hid-cp2112.c
+@@ -229,10 +229,12 @@ static int cp2112_gpio_set_unlocked(struct cp2112_device *dev,
+       ret = hid_hw_raw_request(hdev, CP2112_GPIO_SET, buf,
+                                CP2112_GPIO_SET_LENGTH, HID_FEATURE_REPORT,
+                                HID_REQ_SET_REPORT);
+-      if (ret < 0)
++      if (ret != CP2112_GPIO_SET_LENGTH) {
+               hid_err(hdev, "error setting GPIO values: %d\n", ret);
++              return ret < 0 ? ret : -EIO;
++      }
+-      return ret;
++      return 0;
+ }
+ static int cp2112_gpio_set(struct gpio_chip *chip, unsigned int offset,
+@@ -309,9 +311,7 @@ static int cp2112_gpio_direction_output(struct gpio_chip *chip,
+        * Set gpio value when output direction is already set,
+        * as specified in AN495, Rev. 0.2, cpt. 4.4
+        */
+-      cp2112_gpio_set_unlocked(dev, offset, value);
+-
+-      return 0;
++      return cp2112_gpio_set_unlocked(dev, offset, value);
+ }
+ static int cp2112_hid_get(struct hid_device *hdev, unsigned char report_number,
+-- 
+2.51.0
+
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 (file)
index 0000000..6b80914
--- /dev/null
@@ -0,0 +1,75 @@
+From 2b4c2aa0ee0f045d788eac348125112de31d8154 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 27 May 2025 22:13:13 +0530
+Subject: HID: multitouch: Get the contact ID from HID_DG_TRANSDUCER_INDEX
+ fields in case of Apple Touch Bar
+
+From: Kerem Karabay <kekrby@gmail.com>
+
+[ Upstream commit f41d736acc039d86512951f4e874b0f5e666babf ]
+
+In Apple Touch Bar, the contact ID is contained in fields with the
+HID_DG_TRANSDUCER_INDEX usage rather than HID_DG_CONTACTID, thus differing
+from the HID spec. Add a quirk for the same.
+
+Acked-by: Benjamin Tissoires <bentiss@kernel.org>
+Signed-off-by: Kerem Karabay <kekrby@gmail.com>
+Co-developed-by: Aditya Garg <gargaditya08@live.com>
+Signed-off-by: Aditya Garg <gargaditya08@live.com>
+Signed-off-by: Jiri Kosina <jkosina@suse.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/hid/hid-multitouch.c | 16 +++++++++++++++-
+ 1 file changed, 15 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/hid/hid-multitouch.c b/drivers/hid/hid-multitouch.c
+index 4c22bd2ba1708..c1be2978c0987 100644
+--- a/drivers/hid/hid-multitouch.c
++++ b/drivers/hid/hid-multitouch.c
+@@ -73,6 +73,7 @@ MODULE_LICENSE("GPL");
+ #define MT_QUIRK_FORCE_MULTI_INPUT    BIT(20)
+ #define MT_QUIRK_DISABLE_WAKEUP               BIT(21)
+ #define MT_QUIRK_ORIENTATION_INVERT   BIT(22)
++#define MT_QUIRK_APPLE_TOUCHBAR               BIT(23)
+ #define MT_INPUTMODE_TOUCHSCREEN      0x02
+ #define MT_INPUTMODE_TOUCHPAD         0x03
+@@ -625,6 +626,7 @@ static struct mt_application *mt_find_application(struct mt_device *td,
+ static struct mt_report_data *mt_allocate_report_data(struct mt_device *td,
+                                                     struct hid_report *report)
+ {
++      struct mt_class *cls = &td->mtclass;
+       struct mt_report_data *rdata;
+       struct hid_field *field;
+       int r, n;
+@@ -649,7 +651,11 @@ static struct mt_report_data *mt_allocate_report_data(struct mt_device *td,
+               if (field->logical == HID_DG_FINGER || td->hdev->group != HID_GROUP_MULTITOUCH_WIN_8) {
+                       for (n = 0; n < field->report_count; n++) {
+-                              if (field->usage[n].hid == HID_DG_CONTACTID) {
++                              unsigned int hid = field->usage[n].hid;
++
++                              if (hid == HID_DG_CONTACTID ||
++                                 (cls->quirks & MT_QUIRK_APPLE_TOUCHBAR &&
++                                 hid == HID_DG_TRANSDUCER_INDEX)) {
+                                       rdata->is_mt_collection = true;
+                                       break;
+                               }
+@@ -827,6 +833,14 @@ static int mt_touch_input_mapping(struct hid_device *hdev, struct hid_input *hi,
+                                                    EV_KEY, BTN_TOUCH);
+                       MT_STORE_FIELD(tip_state);
+                       return 1;
++              case HID_DG_TRANSDUCER_INDEX:
++                      /*
++                       * Contact ID in case of Apple Touch Bars is contained
++                       * in fields with HID_DG_TRANSDUCER_INDEX usage.
++                       */
++                      if (!(cls->quirks & MT_QUIRK_APPLE_TOUCHBAR))
++                              return 0;
++                      fallthrough;
+               case HID_DG_CONTACTID:
+                       MT_STORE_FIELD(contactid);
+                       app->touches_by_report++;
+-- 
+2.51.0
+
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 (file)
index 0000000..7ebebd8
--- /dev/null
@@ -0,0 +1,45 @@
+From 73d04f08aaa905e59dd83e286f5a136b211c1e8c Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 27 May 2025 22:13:16 +0530
+Subject: HID: multitouch: specify that Apple Touch Bar is direct
+
+From: Kerem Karabay <kekrby@gmail.com>
+
+[ Upstream commit 45ca23c5ee8b2b3074377fecc92fa72aa595f7c9 ]
+
+Currently the driver determines the device type based on the
+application, but this value is not reliable on Apple Touch Bar, where
+the application is HID_DG_TOUCHPAD even though this device is direct,
+so add a quirk for the same.
+
+Acked-by: Benjamin Tissoires <bentiss@kernel.org>
+Signed-off-by: Kerem Karabay <kekrby@gmail.com>
+Co-developed-by: Aditya Garg <gargaditya08@live.com>
+Signed-off-by: Aditya Garg <gargaditya08@live.com>
+Signed-off-by: Jiri Kosina <jkosina@suse.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/hid/hid-multitouch.c | 7 +++++++
+ 1 file changed, 7 insertions(+)
+
+diff --git a/drivers/hid/hid-multitouch.c b/drivers/hid/hid-multitouch.c
+index c9f9f21a6ec6b..edb8da49d9167 100644
+--- a/drivers/hid/hid-multitouch.c
++++ b/drivers/hid/hid-multitouch.c
+@@ -1349,6 +1349,13 @@ static int mt_touch_input_configured(struct hid_device *hdev,
+       if (td->serial_maybe)
+               mt_post_parse_default_settings(td, app);
++      /*
++       * The application for Apple Touch Bars is HID_DG_TOUCHPAD,
++       * but these devices are direct.
++       */
++      if (cls->quirks & MT_QUIRK_APPLE_TOUCHBAR)
++              app->mt_flags |= INPUT_MT_DIRECT;
++
+       if (cls->is_indirect)
+               app->mt_flags |= INPUT_MT_POINTER;
+-- 
+2.51.0
+
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 (file)
index 0000000..18a579f
--- /dev/null
@@ -0,0 +1,61 @@
+From 16532132671468af37504e1bdb68288d5b01ed4e Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 27 May 2025 22:13:14 +0530
+Subject: HID: multitouch: support getting the tip state from HID_DG_TOUCH
+ fields in Apple Touch Bar
+
+From: Kerem Karabay <kekrby@gmail.com>
+
+[ Upstream commit e0976a61a543b5e03bc0d08030a0ea036ee3751d ]
+
+In Apple Touch Bar, the tip state is contained in fields with the
+HID_DG_TOUCH usage. This feature is gated by a quirk in order to
+prevent breaking other devices, see commit c2ef8f21ea8f
+("HID: multitouch: add support for trackpads").
+
+Acked-by: Benjamin Tissoires <bentiss@kernel.org>
+Signed-off-by: Kerem Karabay <kekrby@gmail.com>
+Co-developed-by: Aditya Garg <gargaditya08@live.com>
+Signed-off-by: Aditya Garg <gargaditya08@live.com>
+Signed-off-by: Jiri Kosina <jkosina@suse.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/hid/hid-multitouch.c | 15 +++++++++++----
+ 1 file changed, 11 insertions(+), 4 deletions(-)
+
+diff --git a/drivers/hid/hid-multitouch.c b/drivers/hid/hid-multitouch.c
+index c1be2978c0987..20e0958d0fa9f 100644
+--- a/drivers/hid/hid-multitouch.c
++++ b/drivers/hid/hid-multitouch.c
+@@ -827,6 +827,17 @@ static int mt_touch_input_mapping(struct hid_device *hdev, struct hid_input *hi,
+                       MT_STORE_FIELD(confidence_state);
+                       return 1;
++              case HID_DG_TOUCH:
++                      /*
++                       * Legacy devices use TIPSWITCH and not TOUCH.
++                       * One special case here is of the Apple Touch Bars.
++                       * In these devices, the tip state is contained in
++                       * fields with the HID_DG_TOUCH usage.
++                       * Let's just ignore this field for other devices.
++                       */
++                      if (!(cls->quirks & MT_QUIRK_APPLE_TOUCHBAR))
++                              return -1;
++                      fallthrough;
+               case HID_DG_TIPSWITCH:
+                       if (field->application != HID_GD_SYSTEM_MULTIAXIS)
+                               input_set_capability(hi->input,
+@@ -897,10 +908,6 @@ static int mt_touch_input_mapping(struct hid_device *hdev, struct hid_input *hi,
+               case HID_DG_CONTACTMAX:
+                       /* contact max are global to the report */
+                       return -1;
+-              case HID_DG_TOUCH:
+-                      /* Legacy devices use TIPSWITCH and not TOUCH.
+-                       * Let's just ignore this field. */
+-                      return -1;
+               }
+               /* let hid-input decide for the others */
+               return 0;
+-- 
+2.51.0
+
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 (file)
index 0000000..99930df
--- /dev/null
@@ -0,0 +1,44 @@
+From 4c1a276b705de6fddcbfc1a096ea869da02992e0 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 27 May 2025 22:13:15 +0530
+Subject: HID: multitouch: take cls->maxcontacts into account for Apple Touch
+ Bar even without a HID_DG_CONTACTMAX field
+
+From: Kerem Karabay <kekrby@gmail.com>
+
+[ Upstream commit 7dfe48bdc9d38db46283f2e0281bc1626277b8bf ]
+
+In Apple Touch Bar, the HID_DG_CONTACTMAX is not present, but the maximum
+contact count is still greater than the default. Add quirks for the same.
+
+Acked-by: Benjamin Tissoires <bentiss@kernel.org>
+Signed-off-by: Kerem Karabay <kekrby@gmail.com>
+Co-developed-by: Aditya Garg <gargaditya08@live.com>
+Signed-off-by: Aditya Garg <gargaditya08@live.com>
+Signed-off-by: Jiri Kosina <jkosina@suse.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/hid/hid-multitouch.c | 7 +++++++
+ 1 file changed, 7 insertions(+)
+
+diff --git a/drivers/hid/hid-multitouch.c b/drivers/hid/hid-multitouch.c
+index 20e0958d0fa9f..c9f9f21a6ec6b 100644
+--- a/drivers/hid/hid-multitouch.c
++++ b/drivers/hid/hid-multitouch.c
+@@ -1335,6 +1335,13 @@ static int mt_touch_input_configured(struct hid_device *hdev,
+       struct input_dev *input = hi->input;
+       int ret;
++      /*
++       * HID_DG_CONTACTMAX field is not present on Apple Touch Bars,
++       * but the maximum contact count is greater than the default.
++       */
++      if (cls->quirks & MT_QUIRK_APPLE_TOUCHBAR && cls->maxcontacts)
++              td->maxcontacts = cls->maxcontacts;
++
+       if (!td->maxcontacts)
+               td->maxcontacts = MT_DEFAULT_MAXCONTACT;
+-- 
+2.51.0
+
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 (file)
index 0000000..d13d85a
--- /dev/null
@@ -0,0 +1,58 @@
+From 065d51137325b35e03432850e97842bd682e478a Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 1 Jul 2025 15:22:49 +0300
+Subject: i2c: designware: Add quirk for Intel Xe
+
+From: Heikki Krogerus <heikki.krogerus@linux.intel.com>
+
+[ Upstream commit f6a8e9f3de4567c71ef9f5f13719df69a8b96081 ]
+
+The regmap is coming from the parent also in case of Xe
+GPUs. Reusing the Wangxun quirk for that.
+
+Acked-by: Jarkko Nikula <jarkko.nikula@linux.intel.com>
+Co-developed-by: Michael J. Ruhl <michael.j.ruhl@intel.com>
+Signed-off-by: Michael J. Ruhl <michael.j.ruhl@intel.com>
+Signed-off-by: Heikki Krogerus <heikki.krogerus@linux.intel.com>
+Reviewed-by: Andi Shyti <andi.shyti@kernel.org>
+Link: https://lore.kernel.org/r/20250701122252.2590230-3-heikki.krogerus@linux.intel.com
+Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
+[Rodrigo fixed the co-developed tags while merging]
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/i2c/busses/i2c-designware-platdrv.c | 7 +++++--
+ 1 file changed, 5 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/i2c/busses/i2c-designware-platdrv.c b/drivers/i2c/busses/i2c-designware-platdrv.c
+index 879719e91df2a..c1262df02cdb2 100644
+--- a/drivers/i2c/busses/i2c-designware-platdrv.c
++++ b/drivers/i2c/busses/i2c-designware-platdrv.c
+@@ -101,7 +101,7 @@ static int bt1_i2c_request_regs(struct dw_i2c_dev *dev)
+ }
+ #endif
+-static int txgbe_i2c_request_regs(struct dw_i2c_dev *dev)
++static int dw_i2c_get_parent_regmap(struct dw_i2c_dev *dev)
+ {
+       dev->map = dev_get_regmap(dev->dev->parent, NULL);
+       if (!dev->map)
+@@ -123,12 +123,15 @@ static int dw_i2c_plat_request_regs(struct dw_i2c_dev *dev)
+       struct platform_device *pdev = to_platform_device(dev->dev);
+       int ret;
++      if (device_is_compatible(dev->dev, "intel,xe-i2c"))
++              return dw_i2c_get_parent_regmap(dev);
++
+       switch (dev->flags & MODEL_MASK) {
+       case MODEL_BAIKAL_BT1:
+               ret = bt1_i2c_request_regs(dev);
+               break;
+       case MODEL_WANGXUN_SP:
+-              ret = txgbe_i2c_request_regs(dev);
++              ret = dw_i2c_get_parent_regmap(dev);
+               break;
+       default:
+               dev->base = devm_platform_ioremap_resource(pdev, 0);
+-- 
+2.51.0
+
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 (file)
index 0000000..ec23cd2
--- /dev/null
@@ -0,0 +1,50 @@
+From cd1edadf90b093fda95efd95930df7fe554520cc Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 13 Aug 2025 15:43:20 +0300
+Subject: IB/mlx5: Fix obj_type mismatch for SRQ event subscriptions
+
+From: Or Har-Toov <ohartoov@nvidia.com>
+
+[ Upstream commit 85fe9f565d2d5af95ac2bbaa5082b8ce62b039f5 ]
+
+Fix a bug where the driver's event subscription logic for SRQ-related
+events incorrectly sets obj_type for RMP objects.
+
+When subscribing to SRQ events, get_legacy_obj_type() did not handle
+the MLX5_CMD_OP_CREATE_RMP case, which caused obj_type to be 0
+(default).
+This led to a mismatch between the obj_type used during subscription
+(0) and the value used during notification (1, taken from the event's
+type field). As a result, event mapping for SRQ objects could fail and
+event notification would not be delivered correctly.
+
+This fix adds handling for MLX5_CMD_OP_CREATE_RMP in get_legacy_obj_type,
+returning MLX5_EVENT_QUEUE_TYPE_RQ so obj_type is consistent between
+subscription and notification.
+
+Fixes: 759738537142 ("IB/mlx5: Enable subscription for device events over DEVX")
+Link: https://patch.msgid.link/r/8f1048e3fdd1fde6b90607ce0ed251afaf8a148c.1755088962.git.leon@kernel.org
+Signed-off-by: Or Har-Toov <ohartoov@nvidia.com>
+Reviewed-by: Edward Srouji <edwards@nvidia.com>
+Signed-off-by: Leon Romanovsky <leonro@nvidia.com>
+Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/infiniband/hw/mlx5/devx.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/drivers/infiniband/hw/mlx5/devx.c b/drivers/infiniband/hw/mlx5/devx.c
+index c369fee335621..00727472c8738 100644
+--- a/drivers/infiniband/hw/mlx5/devx.c
++++ b/drivers/infiniband/hw/mlx5/devx.c
+@@ -233,6 +233,7 @@ static u16 get_legacy_obj_type(u16 opcode)
+ {
+       switch (opcode) {
+       case MLX5_CMD_OP_CREATE_RQ:
++      case MLX5_CMD_OP_CREATE_RMP:
+               return MLX5_EVENT_QUEUE_TYPE_RQ;
+       case MLX5_CMD_OP_CREATE_QP:
+               return MLX5_EVENT_QUEUE_TYPE_QP;
+-- 
+2.51.0
+
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 (file)
index 0000000..48215e9
--- /dev/null
@@ -0,0 +1,56 @@
+From 44d1ab5475078b5fc07110ea7b25bd4c34aca78b Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 17 Jun 2025 15:25:52 +0200
+Subject: mmc: sdhci-cadence: add Mobileye eyeQ support
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Benoît Monin <benoit.monin@bootlin.com>
+
+[ Upstream commit 120ffe250dd95b5089d032f582c5be9e3a04b94b ]
+
+The MMC/SDHCI controller implemented by Mobileye needs the preset value
+quirks to configure the clock properly at speed slower than HS200.
+It otherwise works as a standard sd4hc controller.
+
+Signed-off-by: Benoît Monin <benoit.monin@bootlin.com>
+Link: https://lore.kernel.org/r/e97f409650495791e07484589e1666ead570fa12.1750156323.git.benoit.monin@bootlin.com
+Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/mmc/host/sdhci-cadence.c | 11 +++++++++++
+ 1 file changed, 11 insertions(+)
+
+diff --git a/drivers/mmc/host/sdhci-cadence.c b/drivers/mmc/host/sdhci-cadence.c
+index a94b297fcf2a3..60ca09780da32 100644
+--- a/drivers/mmc/host/sdhci-cadence.c
++++ b/drivers/mmc/host/sdhci-cadence.c
+@@ -433,6 +433,13 @@ static const struct sdhci_cdns_drv_data sdhci_elba_drv_data = {
+       },
+ };
++static const struct sdhci_cdns_drv_data sdhci_eyeq_drv_data = {
++      .pltfm_data = {
++              .ops = &sdhci_cdns_ops,
++              .quirks2 = SDHCI_QUIRK2_PRESET_VALUE_BROKEN,
++      },
++};
++
+ static const struct sdhci_cdns_drv_data sdhci_cdns_drv_data = {
+       .pltfm_data = {
+               .ops = &sdhci_cdns_ops,
+@@ -595,6 +602,10 @@ static const struct of_device_id sdhci_cdns_match[] = {
+               .compatible = "amd,pensando-elba-sd4hc",
+               .data = &sdhci_elba_drv_data,
+       },
++      {
++              .compatible = "mobileye,eyeq-sd4hc",
++              .data = &sdhci_eyeq_drv_data,
++      },
+       { .compatible = "cdns,sd4hc" },
+       { /* sentinel */ }
+ };
+-- 
+2.51.0
+
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 (file)
index 0000000..6736b2a
--- /dev/null
@@ -0,0 +1,54 @@
+From ade2cc7270d961115a53eb68df51f8a8cc9b2fe6 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 18 Jun 2025 14:00:05 +0200
+Subject: net: fec: rename struct fec_devinfo fec_imx6x_info -> fec_imx6sx_info
+
+From: Marc Kleine-Budde <mkl@pengutronix.de>
+
+[ Upstream commit 4e8594a88656fa86a9d2b1e72770432470b6dc0c ]
+
+In da722186f654 ("net: fec: set GPR bit on suspend by DT
+configuration.") the platform_device_id fec_devtype::driver_data was
+converted from holding the quirks to a pointing to struct fec_devinfo.
+
+The struct fec_devinfo holding the information for the i.MX6SX was
+named fec_imx6x_info.
+
+Rename fec_imx6x_info to fec_imx6sx_info to align with the SoC's name.
+
+Reviewed-by: Wei Fang <wei.fang@nxp.com>
+Reviewed-by: Frank Li <Frank.Li@nxp.com>
+Reviewed-by: Andrew Lunn <andrew@lunn.ch>
+Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
+Link: https://patch.msgid.link/20250618-fec-cleanups-v4-5-c16f9a1af124@pengutronix.de
+Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/ethernet/freescale/fec_main.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/net/ethernet/freescale/fec_main.c b/drivers/net/ethernet/freescale/fec_main.c
+index 5f15f42070c53..e8b37dfd5cc1d 100644
+--- a/drivers/net/ethernet/freescale/fec_main.c
++++ b/drivers/net/ethernet/freescale/fec_main.c
+@@ -131,7 +131,7 @@ static const struct fec_devinfo fec_mvf600_info = {
+                 FEC_QUIRK_HAS_MDIO_C45,
+ };
+-static const struct fec_devinfo fec_imx6x_info = {
++static const struct fec_devinfo fec_imx6sx_info = {
+       .quirks = FEC_QUIRK_ENET_MAC | FEC_QUIRK_HAS_GBIT |
+                 FEC_QUIRK_HAS_BUFDESC_EX | FEC_QUIRK_HAS_CSUM |
+                 FEC_QUIRK_HAS_VLAN | FEC_QUIRK_HAS_AVB |
+@@ -196,7 +196,7 @@ static const struct of_device_id fec_dt_ids[] = {
+       { .compatible = "fsl,imx28-fec", .data = &fec_imx28_info, },
+       { .compatible = "fsl,imx6q-fec", .data = &fec_imx6q_info, },
+       { .compatible = "fsl,mvf600-fec", .data = &fec_mvf600_info, },
+-      { .compatible = "fsl,imx6sx-fec", .data = &fec_imx6x_info, },
++      { .compatible = "fsl,imx6sx-fec", .data = &fec_imx6sx_info, },
+       { .compatible = "fsl,imx6ul-fec", .data = &fec_imx6ul_info, },
+       { .compatible = "fsl,imx8mq-fec", .data = &fec_imx8mq_info, },
+       { .compatible = "fsl,imx8qm-fec", .data = &fec_imx8qm_info, },
+-- 
+2.51.0
+
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 (file)
index 0000000..dce1025
--- /dev/null
@@ -0,0 +1,38 @@
+From 16c2b13944194dc0cd1cd0006801ec6addb1c715 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sun, 31 Aug 2025 12:59:07 +0200
+Subject: net: sfp: add quirk for FLYPRO copper SFP+ module
+
+From: Aleksander Jan Bajkowski <olek2@wp.pl>
+
+[ Upstream commit ddbf0e78a8b20ec18d314d31336a0230fdc9b394 ]
+
+Add quirk for a copper SFP that identifies itself as "FLYPRO"
+"SFP-10GT-CS-30M". It uses RollBall protocol to talk to the PHY.
+
+Signed-off-by: Aleksander Jan Bajkowski <olek2@wp.pl>
+Reviewed-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
+Link: https://patch.msgid.link/20250831105910.3174-1-olek2@wp.pl
+Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/phy/sfp.c | 3 +++
+ 1 file changed, 3 insertions(+)
+
+diff --git a/drivers/net/phy/sfp.c b/drivers/net/phy/sfp.c
+index 5347c95d1e772..4cd1d6c51dc2a 100644
+--- a/drivers/net/phy/sfp.c
++++ b/drivers/net/phy/sfp.c
+@@ -492,6 +492,9 @@ static const struct sfp_quirk sfp_quirks[] = {
+       SFP_QUIRK("ALCATELLUCENT", "3FE46541AA", sfp_quirk_2500basex,
+                 sfp_fixup_nokia),
++      // FLYPRO SFP-10GT-CS-30M uses Rollball protocol to talk to the PHY.
++      SFP_QUIRK_F("FLYPRO", "SFP-10GT-CS-30M", sfp_fixup_rollball),
++
+       // Fiberstore SFP-10G-T doesn't identify as copper, uses the Rollball
+       // protocol to talk to the PHY and needs 4 sec wait before probing the
+       // PHY.
+-- 
+2.51.0
+
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 (file)
index 0000000..6a06a10
--- /dev/null
@@ -0,0 +1,76 @@
+From cdd2b98dc99825669d43ab26a0764500ff36a308 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 17 Jun 2025 13:03:24 -0500
+Subject: net: sfp: add quirk for Potron SFP+ XGSPON ONU Stick
+
+From: Chris Morgan <macromorgan@hotmail.com>
+
+[ Upstream commit dfec1c14aecee6813f9bafc7b560cc3a31d24079 ]
+
+Add quirk for Potron SFP+ XGSPON ONU Stick (YV SFP+ONT-XGSPON).
+
+This device uses pins 2 and 7 for UART communication, so disable
+TX_FAULT and LOS. Additionally as it is an embedded system in an
+SFP+ form factor provide it enough time to fully boot before we
+attempt to use it.
+
+https://www.potrontec.com/index/index/list/cat_id/2.html#11-83
+https://pon.wiki/xgs-pon/ont/potron-technology/x-onu-sfpp/
+
+Signed-off-by: Chris Morgan <macromorgan@hotmail.com>
+Link: https://patch.msgid.link/20250617180324.229487-1-macroalpha82@gmail.com
+Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/phy/sfp.c | 21 ++++++++++++++++++++-
+ 1 file changed, 20 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/net/phy/sfp.c b/drivers/net/phy/sfp.c
+index 347c1e0e94d95..5347c95d1e772 100644
+--- a/drivers/net/phy/sfp.c
++++ b/drivers/net/phy/sfp.c
+@@ -361,6 +361,11 @@ static void sfp_fixup_ignore_tx_fault(struct sfp *sfp)
+       sfp->state_ignore_mask |= SFP_F_TX_FAULT;
+ }
++static void sfp_fixup_ignore_hw(struct sfp *sfp, unsigned int mask)
++{
++      sfp->state_hw_mask &= ~mask;
++}
++
+ static void sfp_fixup_nokia(struct sfp *sfp)
+ {
+       sfp_fixup_long_startup(sfp);
+@@ -409,7 +414,19 @@ static void sfp_fixup_halny_gsfp(struct sfp *sfp)
+        * these are possibly used for other purposes on this
+        * module, e.g. a serial port.
+        */
+-      sfp->state_hw_mask &= ~(SFP_F_TX_FAULT | SFP_F_LOS);
++      sfp_fixup_ignore_hw(sfp, SFP_F_TX_FAULT | SFP_F_LOS);
++}
++
++static void sfp_fixup_potron(struct sfp *sfp)
++{
++      /*
++       * The TX_FAULT and LOS pins on this device are used for serial
++       * communication, so ignore them. Additionally, provide extra
++       * time for this device to fully start up.
++       */
++
++      sfp_fixup_long_startup(sfp);
++      sfp_fixup_ignore_hw(sfp, SFP_F_TX_FAULT | SFP_F_LOS);
+ }
+ static void sfp_fixup_rollball_cc(struct sfp *sfp)
+@@ -512,6 +529,8 @@ static const struct sfp_quirk sfp_quirks[] = {
+       SFP_QUIRK_F("Walsun", "HXSX-ATRC-1", sfp_fixup_fs_10gt),
+       SFP_QUIRK_F("Walsun", "HXSX-ATRI-1", sfp_fixup_fs_10gt),
++      SFP_QUIRK_F("YV", "SFP+ONU-XGSPON", sfp_fixup_potron),
++
+       // OEM SFP-GE-T is a 1000Base-T module with broken TX_FAULT indicator
+       SFP_QUIRK_F("OEM", "SFP-GE-T", sfp_fixup_ignore_tx_fault),
+-- 
+2.51.0
+
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 (file)
index 0000000..9bee781
--- /dev/null
@@ -0,0 +1,46 @@
+From 23a5c64fe65fa6f85b3f91656b7a4700e1a2959e Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 18 Jul 2025 18:33:05 +0200
+Subject: platform/x86: oxpec: Add support for OneXPlayer X1 Mini Pro (Strix
+ Point)
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Antheas Kapenekakis <lkml@antheas.dev>
+
+[ Upstream commit 1798561befd8be1e52feb54f850efcab5a595f43 ]
+
+The OneXPlayer X1 Mini Pro (which is the Strix Point variant of the Mini)
+uses the same registers as the X1 Mini, so re-use the quirk.
+
+Signed-off-by: Antheas Kapenekakis <lkml@antheas.dev>
+Link: https://lore.kernel.org/r/20250718163305.159232-2-lkml@antheas.dev
+Reviewed-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
+Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/platform/x86/oxpec.c | 7 +++++++
+ 1 file changed, 7 insertions(+)
+
+diff --git a/drivers/platform/x86/oxpec.c b/drivers/platform/x86/oxpec.c
+index 9839e8cb82ce4..eb076bb4099be 100644
+--- a/drivers/platform/x86/oxpec.c
++++ b/drivers/platform/x86/oxpec.c
+@@ -292,6 +292,13 @@ static const struct dmi_system_id dmi_table[] = {
+               },
+               .driver_data = (void *)oxp_x1,
+       },
++      {
++              .matches = {
++                      DMI_MATCH(DMI_BOARD_VENDOR, "ONE-NETBOOK"),
++                      DMI_EXACT_MATCH(DMI_BOARD_NAME, "ONEXPLAYER X1Mini Pro"),
++              },
++              .driver_data = (void *)oxp_x1,
++      },
+       {
+               .matches = {
+                       DMI_MATCH(DMI_BOARD_VENDOR, "ONE-NETBOOK"),
+-- 
+2.51.0
+
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 (file)
index 0000000..06383a0
--- /dev/null
@@ -0,0 +1,53 @@
+From 084956e2ad776015771204067591d0e2514e77d7 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sun, 7 Sep 2025 12:40:16 -0700
+Subject: scsi: ufs: mcq: Fix memory allocation checks for SQE and CQE
+
+From: Alok Tiwari <alok.a.tiwari@oracle.com>
+
+[ Upstream commit 5cb782ff3c62c837e4984b6ae9f5d9a423cd5088 ]
+
+Previous checks incorrectly tested the DMA addresses (dma_handle) for
+NULL. Since dma_alloc_coherent() returns the CPU (virtual) address, the
+NULL check should be performed on the *_base_addr pointer to correctly
+detect allocation failures.
+
+Update the checks to validate sqe_base_addr and cqe_base_addr instead of
+sqe_dma_addr and cqe_dma_addr.
+
+Fixes: 4682abfae2eb ("scsi: ufs: core: mcq: Allocate memory for MCQ mode")
+Signed-off-by: Alok Tiwari <alok.a.tiwari@oracle.com>
+Reviewed-by: Alim Akhtar <alim.akhtar@samsung.com>
+Reviewed-by: Manivannan Sadhasivam <mani@kernel.org>
+Reviewed-by: Peter Wang <peter.wang@mediatek.com>
+Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/ufs/core/ufs-mcq.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/ufs/core/ufs-mcq.c b/drivers/ufs/core/ufs-mcq.c
+index 1e50675772feb..cc88aaa106da3 100644
+--- a/drivers/ufs/core/ufs-mcq.c
++++ b/drivers/ufs/core/ufs-mcq.c
+@@ -243,7 +243,7 @@ int ufshcd_mcq_memory_alloc(struct ufs_hba *hba)
+               hwq->sqe_base_addr = dmam_alloc_coherent(hba->dev, utrdl_size,
+                                                        &hwq->sqe_dma_addr,
+                                                        GFP_KERNEL);
+-              if (!hwq->sqe_dma_addr) {
++              if (!hwq->sqe_base_addr) {
+                       dev_err(hba->dev, "SQE allocation failed\n");
+                       return -ENOMEM;
+               }
+@@ -252,7 +252,7 @@ int ufshcd_mcq_memory_alloc(struct ufs_hba *hba)
+               hwq->cqe_base_addr = dmam_alloc_coherent(hba->dev, cqe_size,
+                                                        &hwq->cqe_dma_addr,
+                                                        GFP_KERNEL);
+-              if (!hwq->cqe_dma_addr) {
++              if (!hwq->cqe_base_addr) {
+                       dev_err(hba->dev, "CQE allocation failed\n");
+                       return -ENOMEM;
+               }
+-- 
+2.51.0
+
diff --git a/queue-6.16/series b/queue-6.16/series
new file mode 100644 (file)
index 0000000..bcea188
--- /dev/null
@@ -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 (file)
index 0000000..a4aa9e1
--- /dev/null
@@ -0,0 +1,36 @@
+From 63942b2e7a7b4bd93ccdbfa72ebe567f322c22e1 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 3 Jun 2025 15:10:45 +0800
+Subject: usb: core: Add 0x prefix to quirks debug output
+
+From: Jiayi Li <lijiayi@kylinos.cn>
+
+[ Upstream commit 47c428fce0b41b15ab321d8ede871f780ccd038f ]
+
+Use "0x%x" format for quirks debug print to clarify it's a hexadecimal
+value. Improves readability and consistency with other hex outputs.
+
+Signed-off-by: Jiayi Li <lijiayi@kylinos.cn>
+Link: https://lore.kernel.org/r/20250603071045.3243699-1-lijiayi@kylinos.cn
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/usb/core/quirks.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/usb/core/quirks.c b/drivers/usb/core/quirks.c
+index d6daad39491b7..f5bc538753301 100644
+--- a/drivers/usb/core/quirks.c
++++ b/drivers/usb/core/quirks.c
+@@ -737,7 +737,7 @@ void usb_detect_quirks(struct usb_device *udev)
+       udev->quirks ^= usb_detect_dynamic_quirks(udev);
+       if (udev->quirks)
+-              dev_dbg(&udev->dev, "USB quirks for this device: %x\n",
++              dev_dbg(&udev->dev, "USB quirks for this device: 0x%x\n",
+                       udev->quirks);
+ #ifdef CONFIG_USB_DEFAULT_PERSIST
+-- 
+2.51.0
+
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 (file)
index 0000000..9557212
--- /dev/null
@@ -0,0 +1,40 @@
+From 8dfeb6aa2489eaf36546d7f85967566a1193cf47 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 31 Jul 2025 19:06:14 +0800
+Subject: ALSA: usb-audio: Add DSD support for Comtrue USB Audio device
+
+From: noble.yang <noble.yang@comtrue-inc.com>
+
+[ Upstream commit e9df1755485dd90a89656e8a21ec4d71c909fa30 ]
+
+The vendor Comtrue Inc. (0x2fc6) produces USB audio chipsets like
+the CT7601 which are capable of Native DSD playback.
+
+This patch adds QUIRK_FLAG_DSD_RAW for Comtrue (VID 0x2fc6), which enables
+native DSD playback (DSD_U32_LE) on their USB Audio device. This has been
+verified under Ubuntu 25.04 with JRiver.
+
+Signed-off-by: noble.yang <noble.yang@comtrue-inc.com>
+Link: https://patch.msgid.link/20250731110614.4070-1-noble228@gmail.com
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/quirks.c | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/sound/usb/quirks.c b/sound/usb/quirks.c
+index f19c808444c97..def326ddef267 100644
+--- a/sound/usb/quirks.c
++++ b/sound/usb/quirks.c
+@@ -2305,6 +2305,8 @@ static const struct usb_audio_quirk_flags_table quirk_flags_table[] = {
+                  QUIRK_FLAG_DSD_RAW),
+       VENDOR_FLG(0x2d87, /* Cayin device */
+                  QUIRK_FLAG_DSD_RAW),
++      VENDOR_FLG(0x2fc6, /* Comture-inc devices */
++                 QUIRK_FLAG_DSD_RAW),
+       VENDOR_FLG(0x3336, /* HEM devices */
+                  QUIRK_FLAG_DSD_RAW),
+       VENDOR_FLG(0x3353, /* Khadas devices */
+-- 
+2.51.0
+
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 (file)
index 0000000..86617e7
--- /dev/null
@@ -0,0 +1,321 @@
+From bc842689fe59b1cf346821417d1d94fe2081815f Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 26 May 2025 17:07:48 +0300
+Subject: ALSA: usb-audio: Add mixer quirk for Sony DualSense PS5
+
+From: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+
+[ Upstream commit 79d561c4ec0497669f19a9550cfb74812f60938b ]
+
+The Sony DualSense wireless controller (PS5) features an internal mono
+speaker, but it also provides a 3.5mm jack socket for headphone output
+and headset microphone input.
+
+Since this is a UAC1 device, it doesn't advertise any jack detection
+capability.  However, the controller is able to report HP & MIC insert
+events via HID, i.e. through a dedicated input device managed by the
+hid-playstation driver.
+
+Add a quirk to create the jack controls for headphone and headset mic,
+respectively, and setup an input handler for each of them in order to
+intercept the related hotplug events.
+
+Signed-off-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Link: https://patch.msgid.link/20250526-dualsense-alsa-jack-v1-9-1a821463b632@collabora.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/mixer_quirks.c | 263 +++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 263 insertions(+)
+
+diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
+index e5252167d6a40..95fa1c31ae550 100644
+--- a/sound/usb/mixer_quirks.c
++++ b/sound/usb/mixer_quirks.c
+@@ -16,6 +16,7 @@
+ #include <linux/hid.h>
+ #include <linux/init.h>
++#include <linux/input.h>
+ #include <linux/math64.h>
+ #include <linux/slab.h>
+ #include <linux/usb.h>
+@@ -527,6 +528,263 @@ static int snd_emu0204_controls_create(struct usb_mixer_interface *mixer)
+                                         &snd_emu0204_control, NULL);
+ }
++/*
++ * Sony DualSense controller (PS5) jack detection
++ *
++ * Since this is an UAC 1 device, it doesn't support jack detection.
++ * However, the controller hid-playstation driver reports HP & MIC
++ * insert events through a dedicated input device.
++ */
++
++#define SND_DUALSENSE_JACK_OUT_TERM_ID 3
++#define SND_DUALSENSE_JACK_IN_TERM_ID 4
++
++struct dualsense_mixer_elem_info {
++      struct usb_mixer_elem_info info;
++      struct input_handler ih;
++      struct input_device_id id_table[2];
++      bool connected;
++};
++
++static void snd_dualsense_ih_event(struct input_handle *handle,
++                                 unsigned int type, unsigned int code,
++                                 int value)
++{
++      struct dualsense_mixer_elem_info *mei;
++      struct usb_mixer_elem_list *me;
++
++      if (type != EV_SW)
++              return;
++
++      mei = container_of(handle->handler, struct dualsense_mixer_elem_info, ih);
++      me = &mei->info.head;
++
++      if ((me->id == SND_DUALSENSE_JACK_OUT_TERM_ID && code == SW_HEADPHONE_INSERT) ||
++          (me->id == SND_DUALSENSE_JACK_IN_TERM_ID && code == SW_MICROPHONE_INSERT)) {
++              mei->connected = !!value;
++              snd_ctl_notify(me->mixer->chip->card, SNDRV_CTL_EVENT_MASK_VALUE,
++                             &me->kctl->id);
++      }
++}
++
++static bool snd_dualsense_ih_match(struct input_handler *handler,
++                                 struct input_dev *dev)
++{
++      struct dualsense_mixer_elem_info *mei;
++      struct usb_device *snd_dev;
++      char *input_dev_path, *usb_dev_path;
++      size_t usb_dev_path_len;
++      bool match = false;
++
++      mei = container_of(handler, struct dualsense_mixer_elem_info, ih);
++      snd_dev = mei->info.head.mixer->chip->dev;
++
++      input_dev_path = kobject_get_path(&dev->dev.kobj, GFP_KERNEL);
++      if (!input_dev_path) {
++              dev_warn(&snd_dev->dev, "Failed to get input dev path\n");
++              return false;
++      }
++
++      usb_dev_path = kobject_get_path(&snd_dev->dev.kobj, GFP_KERNEL);
++      if (!usb_dev_path) {
++              dev_warn(&snd_dev->dev, "Failed to get USB dev path\n");
++              goto free_paths;
++      }
++
++      /*
++       * Ensure the VID:PID matched input device supposedly owned by the
++       * hid-playstation driver belongs to the actual hardware handled by
++       * the current USB audio device, which implies input_dev_path being
++       * a subpath of usb_dev_path.
++       *
++       * This verification is necessary when there is more than one identical
++       * controller attached to the host system.
++       */
++      usb_dev_path_len = strlen(usb_dev_path);
++      if (usb_dev_path_len >= strlen(input_dev_path))
++              goto free_paths;
++
++      usb_dev_path[usb_dev_path_len] = '/';
++      match = !memcmp(input_dev_path, usb_dev_path, usb_dev_path_len + 1);
++
++free_paths:
++      kfree(input_dev_path);
++      kfree(usb_dev_path);
++
++      return match;
++}
++
++static int snd_dualsense_ih_connect(struct input_handler *handler,
++                                  struct input_dev *dev,
++                                  const struct input_device_id *id)
++{
++      struct input_handle *handle;
++      int err;
++
++      handle = kzalloc(sizeof(*handle), GFP_KERNEL);
++      if (!handle)
++              return -ENOMEM;
++
++      handle->dev = dev;
++      handle->handler = handler;
++      handle->name = handler->name;
++
++      err = input_register_handle(handle);
++      if (err)
++              goto err_free;
++
++      err = input_open_device(handle);
++      if (err)
++              goto err_unregister;
++
++      return 0;
++
++err_unregister:
++      input_unregister_handle(handle);
++err_free:
++      kfree(handle);
++      return err;
++}
++
++static void snd_dualsense_ih_disconnect(struct input_handle *handle)
++{
++      input_close_device(handle);
++      input_unregister_handle(handle);
++      kfree(handle);
++}
++
++static void snd_dualsense_ih_start(struct input_handle *handle)
++{
++      struct dualsense_mixer_elem_info *mei;
++      struct usb_mixer_elem_list *me;
++      int status = -1;
++
++      mei = container_of(handle->handler, struct dualsense_mixer_elem_info, ih);
++      me = &mei->info.head;
++
++      if (me->id == SND_DUALSENSE_JACK_OUT_TERM_ID &&
++          test_bit(SW_HEADPHONE_INSERT, handle->dev->swbit))
++              status = test_bit(SW_HEADPHONE_INSERT, handle->dev->sw);
++      else if (me->id == SND_DUALSENSE_JACK_IN_TERM_ID &&
++               test_bit(SW_MICROPHONE_INSERT, handle->dev->swbit))
++              status = test_bit(SW_MICROPHONE_INSERT, handle->dev->sw);
++
++      if (status >= 0) {
++              mei->connected = !!status;
++              snd_ctl_notify(me->mixer->chip->card, SNDRV_CTL_EVENT_MASK_VALUE,
++                             &me->kctl->id);
++      }
++}
++
++static int snd_dualsense_jack_get(struct snd_kcontrol *kctl,
++                                struct snd_ctl_elem_value *ucontrol)
++{
++      struct dualsense_mixer_elem_info *mei = snd_kcontrol_chip(kctl);
++
++      ucontrol->value.integer.value[0] = mei->connected;
++
++      return 0;
++}
++
++static const struct snd_kcontrol_new snd_dualsense_jack_control = {
++      .iface = SNDRV_CTL_ELEM_IFACE_CARD,
++      .access = SNDRV_CTL_ELEM_ACCESS_READ,
++      .info = snd_ctl_boolean_mono_info,
++      .get = snd_dualsense_jack_get,
++};
++
++static int snd_dualsense_resume_jack(struct usb_mixer_elem_list *list)
++{
++      snd_ctl_notify(list->mixer->chip->card, SNDRV_CTL_EVENT_MASK_VALUE,
++                     &list->kctl->id);
++      return 0;
++}
++
++static void snd_dualsense_mixer_elem_free(struct snd_kcontrol *kctl)
++{
++      struct dualsense_mixer_elem_info *mei = snd_kcontrol_chip(kctl);
++
++      if (mei->ih.event)
++              input_unregister_handler(&mei->ih);
++
++      snd_usb_mixer_elem_free(kctl);
++}
++
++static int snd_dualsense_jack_create(struct usb_mixer_interface *mixer,
++                                   const char *name, bool is_output)
++{
++      struct dualsense_mixer_elem_info *mei;
++      struct input_device_id *idev_id;
++      struct snd_kcontrol *kctl;
++      int err;
++
++      mei = kzalloc(sizeof(*mei), GFP_KERNEL);
++      if (!mei)
++              return -ENOMEM;
++
++      snd_usb_mixer_elem_init_std(&mei->info.head, mixer,
++                                  is_output ? SND_DUALSENSE_JACK_OUT_TERM_ID :
++                                              SND_DUALSENSE_JACK_IN_TERM_ID);
++
++      mei->info.head.resume = snd_dualsense_resume_jack;
++      mei->info.val_type = USB_MIXER_BOOLEAN;
++      mei->info.channels = 1;
++      mei->info.min = 0;
++      mei->info.max = 1;
++
++      kctl = snd_ctl_new1(&snd_dualsense_jack_control, mei);
++      if (!kctl) {
++              kfree(mei);
++              return -ENOMEM;
++      }
++
++      strscpy(kctl->id.name, name, sizeof(kctl->id.name));
++      kctl->private_free = snd_dualsense_mixer_elem_free;
++
++      err = snd_usb_mixer_add_control(&mei->info.head, kctl);
++      if (err)
++              return err;
++
++      idev_id = &mei->id_table[0];
++      idev_id->flags = INPUT_DEVICE_ID_MATCH_VENDOR | INPUT_DEVICE_ID_MATCH_PRODUCT |
++                       INPUT_DEVICE_ID_MATCH_EVBIT | INPUT_DEVICE_ID_MATCH_SWBIT;
++      idev_id->vendor = USB_ID_VENDOR(mixer->chip->usb_id);
++      idev_id->product = USB_ID_PRODUCT(mixer->chip->usb_id);
++      idev_id->evbit[BIT_WORD(EV_SW)] = BIT_MASK(EV_SW);
++      if (is_output)
++              idev_id->swbit[BIT_WORD(SW_HEADPHONE_INSERT)] = BIT_MASK(SW_HEADPHONE_INSERT);
++      else
++              idev_id->swbit[BIT_WORD(SW_MICROPHONE_INSERT)] = BIT_MASK(SW_MICROPHONE_INSERT);
++
++      mei->ih.event = snd_dualsense_ih_event;
++      mei->ih.match = snd_dualsense_ih_match;
++      mei->ih.connect = snd_dualsense_ih_connect,
++      mei->ih.disconnect = snd_dualsense_ih_disconnect,
++      mei->ih.start = snd_dualsense_ih_start,
++      mei->ih.name = name;
++      mei->ih.id_table = mei->id_table;
++
++      err = input_register_handler(&mei->ih);
++      if (err) {
++              dev_warn(&mixer->chip->dev->dev,
++                       "Could not register input handler: %d\n", err);
++              mei->ih.event = NULL;
++      }
++
++      return 0;
++}
++
++static int snd_dualsense_controls_create(struct usb_mixer_interface *mixer)
++{
++      int err;
++
++      err = snd_dualsense_jack_create(mixer, "Headphone Jack", true);
++      if (err < 0)
++              return err;
++
++      return snd_dualsense_jack_create(mixer, "Headset Mic Jack", false);
++}
++
+ /* ASUS Xonar U1 / U3 controls */
+ static int snd_xonar_u1_switch_get(struct snd_kcontrol *kcontrol,
+@@ -3390,6 +3648,11 @@ int snd_usb_mixer_apply_create_quirk(struct usb_mixer_interface *mixer)
+               err = snd_emu0204_controls_create(mixer);
+               break;
++      case USB_ID(0x054c, 0x0ce6): /* Sony DualSense controller (PS5) */
++      case USB_ID(0x054c, 0x0df2): /* Sony DualSense Edge controller (PS5) */
++              err = snd_dualsense_controls_create(mixer);
++              break;
++
+       case USB_ID(0x0763, 0x2030): /* M-Audio Fast Track C400 */
+       case USB_ID(0x0763, 0x2031): /* M-Audio Fast Track C400 */
+               err = snd_c400_create_mixer(mixer);
+-- 
+2.51.0
+
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 (file)
index 0000000..a868663
--- /dev/null
@@ -0,0 +1,73 @@
+From 635ae24e61094a5b79d7a045b626d423b3c836c0 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 29 Aug 2025 14:40:48 +0800
+Subject: ALSA: usb-audio: Add mute TLV for playback volumes on more devices
+
+From: qaqland <anguoli@uniontech.com>
+
+[ Upstream commit 2cbe4ac193ed7172cfd825c0cc46ce4a41be4ba1 ]
+
+Applying the quirk of that, the lowest Playback mixer volume setting
+mutes the audio output, on more devices.
+
+Suggested-by: Cryolitia PukNgae <cryolitia@uniontech.com>
+Signed-off-by: qaqland <anguoli@uniontech.com>
+Link: https://patch.msgid.link/20250829-sound_quirk-v1-1-745529b44440@uniontech.com
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/quirks.c | 10 ++++++++++
+ 1 file changed, 10 insertions(+)
+
+diff --git a/sound/usb/quirks.c b/sound/usb/quirks.c
+index 3444c5735d756..7d747677b58da 100644
+--- a/sound/usb/quirks.c
++++ b/sound/usb/quirks.c
+@@ -2096,6 +2096,8 @@ static const struct usb_audio_quirk_flags_table quirk_flags_table[] = {
+                  QUIRK_FLAG_SET_IFACE_FIRST),
+       DEVICE_FLG(0x0556, 0x0014, /* Phoenix Audio TMX320VC */
+                  QUIRK_FLAG_GET_SAMPLE_RATE),
++      DEVICE_FLG(0x0572, 0x1b08, /* Conexant Systems (Rockwell), Inc. */
++                 QUIRK_FLAG_MIXER_MIN_MUTE),
+       DEVICE_FLG(0x0572, 0x1b09, /* Conexant Systems (Rockwell), Inc. */
+                  QUIRK_FLAG_MIXER_MIN_MUTE),
+       DEVICE_FLG(0x05a3, 0x9420, /* ELP HD USB Camera */
+@@ -2140,6 +2142,8 @@ static const struct usb_audio_quirk_flags_table quirk_flags_table[] = {
+                  QUIRK_FLAG_CTL_MSG_DELAY_1M),
+       DEVICE_FLG(0x0b0e, 0x0349, /* Jabra 550a */
+                  QUIRK_FLAG_CTL_MSG_DELAY_1M),
++      DEVICE_FLG(0x0bda, 0x498a, /* Realtek Semiconductor Corp. */
++                 QUIRK_FLAG_MIXER_MIN_MUTE),
+       DEVICE_FLG(0x0c45, 0x6340, /* Sonix HD USB Camera */
+                  QUIRK_FLAG_GET_SAMPLE_RATE),
+       DEVICE_FLG(0x0c45, 0x636b, /* Microdia JP001 USB Camera */
+@@ -2156,6 +2160,8 @@ static const struct usb_audio_quirk_flags_table quirk_flags_table[] = {
+                  QUIRK_FLAG_SHARE_MEDIA_DEVICE | QUIRK_FLAG_ALIGN_TRANSFER),
+       DEVICE_FLG(0x1101, 0x0003, /* Audioengine D1 */
+                  QUIRK_FLAG_GET_SAMPLE_RATE),
++      DEVICE_FLG(0x12d1, 0x3a07, /* Huawei Technologies Co., Ltd. */
++                 QUIRK_FLAG_MIXER_MIN_MUTE),
+       DEVICE_FLG(0x1224, 0x2a25, /* Jieli Technology USB PHY 2.0 */
+                  QUIRK_FLAG_GET_SAMPLE_RATE | QUIRK_FLAG_MIC_RES_16),
+       DEVICE_FLG(0x1395, 0x740a, /* Sennheiser DECT */
+@@ -2246,6 +2252,8 @@ static const struct usb_audio_quirk_flags_table quirk_flags_table[] = {
+                  QUIRK_FLAG_IGNORE_CTL_ERROR),
+       DEVICE_FLG(0x2912, 0x30c8, /* Audioengine D1 */
+                  QUIRK_FLAG_GET_SAMPLE_RATE),
++      DEVICE_FLG(0x2a70, 0x1881, /* OnePlus Technology (Shenzhen) Co., Ltd. BE02T */
++                 QUIRK_FLAG_MIXER_MIN_MUTE),
+       DEVICE_FLG(0x2b53, 0x0023, /* Fiero SC-01 (firmware v1.0.0 @ 48 kHz) */
+                  QUIRK_FLAG_GENERIC_IMPLICIT_FB),
+       DEVICE_FLG(0x2b53, 0x0024, /* Fiero SC-01 (firmware v1.0.0 @ 96 kHz) */
+@@ -2262,6 +2270,8 @@ static const struct usb_audio_quirk_flags_table quirk_flags_table[] = {
+                  QUIRK_FLAG_CTL_MSG_DELAY_1M),
+       DEVICE_FLG(0x30be, 0x0101, /* Schiit Hel */
+                  QUIRK_FLAG_IGNORE_CTL_ERROR),
++      DEVICE_FLG(0x339b, 0x3a07, /* Synaptics HONOR USB-C HEADSET */
++                 QUIRK_FLAG_MIXER_MIN_MUTE),
+       DEVICE_FLG(0x413c, 0xa506, /* Dell AE515 sound bar */
+                  QUIRK_FLAG_GET_SAMPLE_RATE),
+       DEVICE_FLG(0x534d, 0x0021, /* MacroSilicon MS2100/MS2106 */
+-- 
+2.51.0
+
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 (file)
index 0000000..d2f0d18
--- /dev/null
@@ -0,0 +1,38 @@
+From ce6c03e06ace31d5f6ce6d89d26478afe54ebcc3 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 26 May 2025 17:07:45 +0300
+Subject: ALSA: usb-audio: Avoid multiple assignments in mixer_quirks
+
+From: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+
+[ Upstream commit 03ddd3bdb94df3edb1f2408b57cfb00b3d92a208 ]
+
+Handle report from checkpatch.pl:
+
+  CHECK: multiple assignments should be avoided
+
+Signed-off-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Link: https://patch.msgid.link/20250526-dualsense-alsa-jack-v1-6-1a821463b632@collabora.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/mixer_quirks.c | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
+index a1ab517e26b36..f91dbc9255f12 100644
+--- a/sound/usb/mixer_quirks.c
++++ b/sound/usb/mixer_quirks.c
+@@ -1734,7 +1734,8 @@ static int snd_microii_spdif_default_put(struct snd_kcontrol *kcontrol,
+       unsigned int pval, pval_old;
+       int err;
+-      pval = pval_old = kcontrol->private_value;
++      pval = kcontrol->private_value;
++      pval_old = pval;
+       pval &= 0xfffff0f0;
+       pval |= (ucontrol->value.iec958.status[1] & 0x0f) << 8;
+       pval |= (ucontrol->value.iec958.status[0] & 0x0f);
+-- 
+2.51.0
+
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 (file)
index 0000000..5073c71
--- /dev/null
@@ -0,0 +1,49 @@
+From 09523443393b2ff18c53d811f4722ee54cd917e1 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 12 Jun 2025 14:02:28 +0800
+Subject: ALSA: usb-audio: Convert comma to semicolon
+
+From: Chen Ni <nichen@iscas.ac.cn>
+
+[ Upstream commit 9ca30a1b007d5fefb5752428f852a2d8d7219c1c ]
+
+Replace comma between expressions with semicolons.
+
+Using a ',' in place of a ';' can have unintended side effects.
+Although that is not the case here, it is seems best to use ';'
+unless ',' is intended.
+
+Found by inspection.
+No functional change intended.
+Compile tested only.
+
+Fixes: 79d561c4ec04 ("ALSA: usb-audio: Add mixer quirk for Sony DualSense PS5")
+Signed-off-by: Chen Ni <nichen@iscas.ac.cn>
+Reviewed-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+Link: https://patch.msgid.link/20250612060228.1518028-1-nichen@iscas.ac.cn
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/mixer_quirks.c | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
+index 95fa1c31ae550..f1b663a05f295 100644
+--- a/sound/usb/mixer_quirks.c
++++ b/sound/usb/mixer_quirks.c
+@@ -758,9 +758,9 @@ static int snd_dualsense_jack_create(struct usb_mixer_interface *mixer,
+       mei->ih.event = snd_dualsense_ih_event;
+       mei->ih.match = snd_dualsense_ih_match;
+-      mei->ih.connect = snd_dualsense_ih_connect,
+-      mei->ih.disconnect = snd_dualsense_ih_disconnect,
+-      mei->ih.start = snd_dualsense_ih_start,
++      mei->ih.connect = snd_dualsense_ih_connect;
++      mei->ih.disconnect = snd_dualsense_ih_disconnect;
++      mei->ih.start = snd_dualsense_ih_start;
+       mei->ih.name = name;
+       mei->ih.id_table = mei->id_table;
+-- 
+2.51.0
+
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 (file)
index 0000000..2c44055
--- /dev/null
@@ -0,0 +1,49 @@
+From 57939ada9ef0cdcf66646d261bfa92e89ab1fa8f Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 26 May 2025 17:07:44 +0300
+Subject: ALSA: usb-audio: Drop unnecessary parentheses in mixer_quirks
+
+From: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+
+[ Upstream commit c0495cef8b43ad61efbd4019e3573742e0e63c67 ]
+
+Fix multiple 'CHECK: Unnecessary parentheses around ...' reports from
+checkpatch.pl.
+
+Signed-off-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Link: https://patch.msgid.link/20250526-dualsense-alsa-jack-v1-5-1a821463b632@collabora.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/mixer_quirks.c | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
+index 4ce470e291b25..a1ab517e26b36 100644
+--- a/sound/usb/mixer_quirks.c
++++ b/sound/usb/mixer_quirks.c
+@@ -376,10 +376,10 @@ static int snd_audigy2nx_controls_create(struct usb_mixer_interface *mixer)
+               struct snd_kcontrol_new knew;
+               /* USB X-Fi S51 doesn't have a CMSS LED */
+-              if ((mixer->chip->usb_id == USB_ID(0x041e, 0x3042)) && i == 0)
++              if (mixer->chip->usb_id == USB_ID(0x041e, 0x3042) && i == 0)
+                       continue;
+               /* USB X-Fi S51 Pro doesn't have one either */
+-              if ((mixer->chip->usb_id == USB_ID(0x041e, 0x30df)) && i == 0)
++              if (mixer->chip->usb_id == USB_ID(0x041e, 0x30df) && i == 0)
+                       continue;
+               if (i > 1 && /* Live24ext has 2 LEDs only */
+                       (mixer->chip->usb_id == USB_ID(0x041e, 0x3040) ||
+@@ -3272,7 +3272,7 @@ static int snd_djm_controls_update(struct usb_mixer_interface *mixer,
+       int err;
+       const struct snd_djm_device *device = &snd_djm_devices[device_idx];
+-      if ((group >= device->ncontrols) || value >= device->controls[group].noptions)
++      if (group >= device->ncontrols || value >= device->controls[group].noptions)
+               return -EINVAL;
+       err = snd_usb_lock_shutdown(mixer->chip);
+-- 
+2.51.0
+
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 (file)
index 0000000..7d6618f
--- /dev/null
@@ -0,0 +1,49 @@
+From 15c5b27f4d97fb3c8ed08709ce607206fb2655ba Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 26 May 2025 17:07:43 +0300
+Subject: ALSA: usb-audio: Fix block comments in mixer_quirks
+
+From: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+
+[ Upstream commit 231225d8a20f8668b4fd6601d54a2fac0e0ab7a5 ]
+
+Address a couple of comment formatting issues indicated by
+checkpatch.pl:
+
+  WARNING: Block comments use a trailing */ on a separate line
+
+Signed-off-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Link: https://patch.msgid.link/20250526-dualsense-alsa-jack-v1-4-1a821463b632@collabora.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/mixer_quirks.c | 6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
+
+diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
+index 68c82e344d3ba..4ce470e291b25 100644
+--- a/sound/usb/mixer_quirks.c
++++ b/sound/usb/mixer_quirks.c
+@@ -76,7 +76,8 @@ static int snd_create_std_mono_ctl_offset(struct usb_mixer_interface *mixer,
+       cval->idx_off = idx_off;
+       /* get_min_max() is called only for integer volumes later,
+-       * so provide a short-cut for booleans */
++       * so provide a short-cut for booleans
++       */
+       cval->min = 0;
+       cval->max = 1;
+       cval->res = 0;
+@@ -3546,7 +3547,8 @@ static void snd_dragonfly_quirk_db_scale(struct usb_mixer_interface *mixer,
+                                        struct snd_kcontrol *kctl)
+ {
+       /* Approximation using 10 ranges based on output measurement on hw v1.2.
+-       * This seems close to the cubic mapping e.g. alsamixer uses. */
++       * This seems close to the cubic mapping e.g. alsamixer uses.
++       */
+       static const DECLARE_TLV_DB_RANGE(scale,
+                0,  1, TLV_DB_MINMAX_ITEM(-5300, -4970),
+                2,  5, TLV_DB_MINMAX_ITEM(-4710, -4160),
+-- 
+2.51.0
+
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 (file)
index 0000000..25ab46d
--- /dev/null
@@ -0,0 +1,61 @@
+From 63a0a0907e8b01d74cfd445e066c46ebbdff58e6 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 13 Jun 2025 10:15:30 +0200
+Subject: ALSA: usb-audio: Fix build with CONFIG_INPUT=n
+
+From: Takashi Iwai <tiwai@suse.de>
+
+[ Upstream commit d0630a0b80c08530857146e3bf183a7d6b743847 ]
+
+The recent addition of DualSense mixer quirk relies on the input
+device handle, and the build can fail if CONFIG_INPUT isn't set.
+Put (rather ugly) workarounds to wrap with IS_REACHABLE() for avoiding
+the build error.
+
+Fixes: 79d561c4ec04 ("ALSA: usb-audio: Add mixer quirk for Sony DualSense PS5")
+Reported-by: kernel test robot <lkp@intel.com>
+Closes: https://lore.kernel.org/oe-kbuild-all/202506130733.gnPKw2l3-lkp@intel.com/
+Reviewed-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+Link: https://patch.msgid.link/20250613081543.7404-1-tiwai@suse.de
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/mixer_quirks.c | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
+index f1b663a05f295..8c0b8383abe1e 100644
+--- a/sound/usb/mixer_quirks.c
++++ b/sound/usb/mixer_quirks.c
+@@ -528,6 +528,7 @@ static int snd_emu0204_controls_create(struct usb_mixer_interface *mixer)
+                                         &snd_emu0204_control, NULL);
+ }
++#if IS_REACHABLE(CONFIG_INPUT)
+ /*
+  * Sony DualSense controller (PS5) jack detection
+  *
+@@ -784,6 +785,7 @@ static int snd_dualsense_controls_create(struct usb_mixer_interface *mixer)
+       return snd_dualsense_jack_create(mixer, "Headset Mic Jack", false);
+ }
++#endif /* IS_REACHABLE(CONFIG_INPUT) */
+ /* ASUS Xonar U1 / U3 controls */
+@@ -3648,10 +3650,12 @@ int snd_usb_mixer_apply_create_quirk(struct usb_mixer_interface *mixer)
+               err = snd_emu0204_controls_create(mixer);
+               break;
++#if IS_REACHABLE(CONFIG_INPUT)
+       case USB_ID(0x054c, 0x0ce6): /* Sony DualSense controller (PS5) */
+       case USB_ID(0x054c, 0x0df2): /* Sony DualSense Edge controller (PS5) */
+               err = snd_dualsense_controls_create(mixer);
+               break;
++#endif /* IS_REACHABLE(CONFIG_INPUT) */
+       case USB_ID(0x0763, 0x2030): /* M-Audio Fast Track C400 */
+       case USB_ID(0x0763, 0x2031): /* M-Audio Fast Track C400 */
+-- 
+2.51.0
+
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 (file)
index 0000000..07e6a40
--- /dev/null
@@ -0,0 +1,123 @@
+From 56ccd0ab3ca59606c139da7a8e713253d3870c8e Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 27 Aug 2025 11:29:02 +0800
+Subject: ALSA: usb-audio: move mixer_quirks' min_mute into common quirk
+
+From: Cryolitia PukNgae <cryolitia@uniontech.com>
+
+[ Upstream commit 2c3ca8cc55a3afc7a4fa99ed8f5f5d05dd2e65b3 ]
+
+We have found more and more devices that have the same problem, that
+the mixer's minimum value is muted. Accroding to pipewire's MR[1]
+and Arch Linux wiki[2], this should be a very common problem in USB
+audio devices. Move the quirk into common quirk,as a preparation of
+more devices' quirk's patch coming on the road[3].
+
+1. https://gitlab.freedesktop.org/pipewire/pipewire/-/merge_requests/2514
+2. https://wiki.archlinux.org/index.php?title=PipeWire&oldid=804138#No_sound_from_USB_DAC_until_30%_volume
+3. On the road, in the physical sense. We have been buying ton of
+   these devices for testing the problem.
+
+Tested-by: Guoli An <anguoli@uniontech.com>
+Signed-off-by: Cryolitia PukNgae <cryolitia@uniontech.com>
+Link: https://patch.msgid.link/20250827-sound-quirk-min-mute-v1-1-4717aa8a4f6a@uniontech.com
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/mixer_quirks.c | 10 +++-------
+ sound/usb/quirks.c       | 12 ++++++++++--
+ sound/usb/usbaudio.h     |  4 ++++
+ 3 files changed, 17 insertions(+), 9 deletions(-)
+
+diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
+index 8c0b8383abe1e..270a0be672b7e 100644
+--- a/sound/usb/mixer_quirks.c
++++ b/sound/usb/mixer_quirks.c
+@@ -3899,16 +3899,12 @@ void snd_usb_mixer_fu_apply_quirk(struct usb_mixer_interface *mixer,
+               if (unitid == 7 && cval->control == UAC_FU_VOLUME)
+                       snd_dragonfly_quirk_db_scale(mixer, cval, kctl);
+               break;
++      }
++
+       /* lowest playback value is muted on some devices */
+-      case USB_ID(0x0572, 0x1b09): /* Conexant Systems (Rockwell), Inc. */
+-      case USB_ID(0x0d8c, 0x000c): /* C-Media */
+-      case USB_ID(0x0d8c, 0x0014): /* C-Media */
+-      case USB_ID(0x19f7, 0x0003): /* RODE NT-USB */
+-      case USB_ID(0x2d99, 0x0026): /* HECATE G2 GAMING HEADSET */
++      if (mixer->chip->quirk_flags & QUIRK_FLAG_MIXER_MIN_MUTE)
+               if (strstr(kctl->id.name, "Playback"))
+                       cval->min_mute = 1;
+-              break;
+-      }
+       /* ALSA-ify some Plantronics headset control names */
+       if (USB_ID_VENDOR(mixer->chip->usb_id) == 0x047f &&
+diff --git a/sound/usb/quirks.c b/sound/usb/quirks.c
+index def326ddef267..3444c5735d756 100644
+--- a/sound/usb/quirks.c
++++ b/sound/usb/quirks.c
+@@ -2096,6 +2096,8 @@ static const struct usb_audio_quirk_flags_table quirk_flags_table[] = {
+                  QUIRK_FLAG_SET_IFACE_FIRST),
+       DEVICE_FLG(0x0556, 0x0014, /* Phoenix Audio TMX320VC */
+                  QUIRK_FLAG_GET_SAMPLE_RATE),
++      DEVICE_FLG(0x0572, 0x1b09, /* Conexant Systems (Rockwell), Inc. */
++                 QUIRK_FLAG_MIXER_MIN_MUTE),
+       DEVICE_FLG(0x05a3, 0x9420, /* ELP HD USB Camera */
+                  QUIRK_FLAG_GET_SAMPLE_RATE),
+       DEVICE_FLG(0x05a7, 0x1020, /* Bose Companion 5 */
+@@ -2142,8 +2144,10 @@ static const struct usb_audio_quirk_flags_table quirk_flags_table[] = {
+                  QUIRK_FLAG_GET_SAMPLE_RATE),
+       DEVICE_FLG(0x0c45, 0x636b, /* Microdia JP001 USB Camera */
+                  QUIRK_FLAG_GET_SAMPLE_RATE),
+-      DEVICE_FLG(0x0d8c, 0x0014, /* USB Audio Device */
+-                 QUIRK_FLAG_CTL_MSG_DELAY_1M),
++      DEVICE_FLG(0x0d8c, 0x000c, /* C-Media */
++                 QUIRK_FLAG_MIXER_MIN_MUTE),
++      DEVICE_FLG(0x0d8c, 0x0014, /* C-Media */
++                 QUIRK_FLAG_CTL_MSG_DELAY_1M | QUIRK_FLAG_MIXER_MIN_MUTE),
+       DEVICE_FLG(0x0ecb, 0x205c, /* JBL Quantum610 Wireless */
+                  QUIRK_FLAG_FIXED_RATE),
+       DEVICE_FLG(0x0ecb, 0x2069, /* JBL Quantum810 Wireless */
+@@ -2190,6 +2194,8 @@ static const struct usb_audio_quirk_flags_table quirk_flags_table[] = {
+                  QUIRK_FLAG_ITF_USB_DSD_DAC | QUIRK_FLAG_CTL_MSG_DELAY),
+       DEVICE_FLG(0x1901, 0x0191, /* GE B850V3 CP2114 audio interface */
+                  QUIRK_FLAG_GET_SAMPLE_RATE),
++      DEVICE_FLG(0x19f7, 0x0003, /* RODE NT-USB */
++                 QUIRK_FLAG_MIXER_MIN_MUTE),
+       DEVICE_FLG(0x19f7, 0x0035, /* RODE NT-USB+ */
+                  QUIRK_FLAG_GET_SAMPLE_RATE),
+       DEVICE_FLG(0x1bcf, 0x2281, /* HD Webcam */
+@@ -2250,6 +2256,8 @@ static const struct usb_audio_quirk_flags_table quirk_flags_table[] = {
+                  QUIRK_FLAG_CTL_MSG_DELAY_1M),
+       DEVICE_FLG(0x2d95, 0x8021, /* VIVO USB-C-XE710 HEADSET */
+                  QUIRK_FLAG_CTL_MSG_DELAY_1M),
++      DEVICE_FLG(0x2d99, 0x0026, /* HECATE G2 GAMING HEADSET */
++                 QUIRK_FLAG_MIXER_MIN_MUTE),
+       DEVICE_FLG(0x2fc6, 0xf0b7, /* iBasso DC07 Pro */
+                  QUIRK_FLAG_CTL_MSG_DELAY_1M),
+       DEVICE_FLG(0x30be, 0x0101, /* Schiit Hel */
+diff --git a/sound/usb/usbaudio.h b/sound/usb/usbaudio.h
+index ddfbe045e7a94..3c927316bc992 100644
+--- a/sound/usb/usbaudio.h
++++ b/sound/usb/usbaudio.h
+@@ -184,6 +184,9 @@ extern bool snd_usb_skip_validation;
+  *  for the given endpoint.
+  * QUIRK_FLAG_MIC_RES_16 and QUIRK_FLAG_MIC_RES_384
+  *  Set the fixed resolution for Mic Capture Volume (mostly for webcams)
++ * QUIRK_FLAG_MIXER_MIN_MUTE
++ *  Set minimum volume control value as mute for devices where the lowest
++ *  playback value represents muted state instead of minimum audible volume
+  */
+ #define QUIRK_FLAG_GET_SAMPLE_RATE    (1U << 0)
+@@ -210,5 +213,6 @@ extern bool snd_usb_skip_validation;
+ #define QUIRK_FLAG_FIXED_RATE         (1U << 21)
+ #define QUIRK_FLAG_MIC_RES_16         (1U << 22)
+ #define QUIRK_FLAG_MIC_RES_384                (1U << 23)
++#define QUIRK_FLAG_MIXER_MIN_MUTE     (1U << 24)
+ #endif /* __USBAUDIO_H */
+-- 
+2.51.0
+
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 (file)
index 0000000..f18738a
--- /dev/null
@@ -0,0 +1,46 @@
+From a16d5dcd032f911ad169d9c017a110a8fe7bbabc Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 26 May 2025 17:07:47 +0300
+Subject: ALSA: usb-audio: Remove unneeded wmb() in mixer_quirks
+
+From: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+
+[ Upstream commit 9cea7425595697802e8d55a322a251999554b8b1 ]
+
+Adding a memory barrier before wake_up() in
+snd_usb_soundblaster_remote_complete() is supposed to ensure the write
+to mixer->rc_code is visible in wait_event_interruptible() from
+snd_usb_sbrc_hwdep_read().
+
+However, this is not really necessary, since wake_up() is just a wrapper
+over __wake_up() which already executes a full memory barrier before
+accessing the state of the task to be waken up.
+
+Drop the redundant call to wmb() and implicitly fix the checkpatch
+complaint:
+
+  WARNING: memory barrier without comment
+
+Signed-off-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Link: https://patch.msgid.link/20250526-dualsense-alsa-jack-v1-8-1a821463b632@collabora.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/mixer_quirks.c | 1 -
+ 1 file changed, 1 deletion(-)
+
+diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
+index 9a5e8c47ce0d2..e5252167d6a40 100644
+--- a/sound/usb/mixer_quirks.c
++++ b/sound/usb/mixer_quirks.c
+@@ -208,7 +208,6 @@ static void snd_usb_soundblaster_remote_complete(struct urb *urb)
+       if (code == rc->mute_code)
+               snd_usb_mixer_notify_id(mixer, rc->mute_mixer_id);
+       mixer->rc_code = code;
+-      wmb();
+       wake_up(&mixer->rc_waitq);
+ }
+-- 
+2.51.0
+
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 (file)
index 0000000..80ad23c
--- /dev/null
@@ -0,0 +1,37 @@
+From 4462ff893bc6816bba5830eabcd764a1210c9f1c Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 26 May 2025 17:07:46 +0300
+Subject: ALSA: usb-audio: Simplify NULL comparison in mixer_quirks
+
+From: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+
+[ Upstream commit f2d6d660e8fd5f4467e80743f82119201e67fa9c ]
+
+Handle report from checkpatch.pl:
+
+  CHECK: Comparison to NULL could be written "t->name"
+
+Signed-off-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Link: https://patch.msgid.link/20250526-dualsense-alsa-jack-v1-7-1a821463b632@collabora.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/mixer_quirks.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
+index f91dbc9255f12..9a5e8c47ce0d2 100644
+--- a/sound/usb/mixer_quirks.c
++++ b/sound/usb/mixer_quirks.c
+@@ -126,7 +126,7 @@ static int snd_create_std_mono_table(struct usb_mixer_interface *mixer,
+ {
+       int err;
+-      while (t->name != NULL) {
++      while (t->name) {
+               err = snd_create_std_mono_ctl(mixer, t->unitid, t->control,
+                               t->cmask, t->val_type, t->name, t->tlv_callback);
+               if (err < 0)
+-- 
+2.51.0
+
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 (file)
index 0000000..0742076
--- /dev/null
@@ -0,0 +1,39 @@
+From 0a8dd222dcca459c2dcfa6b4312b3688444319bd Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sat, 20 Sep 2025 11:51:48 +0900
+Subject: firewire: core: fix overlooked update of subsystem ABI version
+
+From: Takashi Sakamoto <o-takashi@sakamocchi.jp>
+
+[ Upstream commit 853a57ba263adfecf4430b936d6862bc475b4bb5 ]
+
+In kernel v6.5, several functions were added to the cdev layer. This
+required updating the default version of subsystem ABI up to 6, but
+this requirement was overlooked.
+
+This commit updates the version accordingly.
+
+Fixes: 6add87e9764d ("firewire: cdev: add new version of ABI to notify time stamp at request/response subaction of transaction#")
+Link: https://lore.kernel.org/r/20250920025148.163402-1-o-takashi@sakamocchi.jp
+Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/firewire/core-cdev.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/firewire/core-cdev.c b/drivers/firewire/core-cdev.c
+index 73cc2f2dcbf92..bdf4b035325e9 100644
+--- a/drivers/firewire/core-cdev.c
++++ b/drivers/firewire/core-cdev.c
+@@ -39,7 +39,7 @@
+ /*
+  * ABI version history is documented in linux/firewire-cdev.h.
+  */
+-#define FW_CDEV_KERNEL_VERSION                        5
++#define FW_CDEV_KERNEL_VERSION                        6
+ #define FW_CDEV_VERSION_EVENT_REQUEST2                4
+ #define FW_CDEV_VERSION_ALLOCATE_REGION_END   4
+ #define FW_CDEV_VERSION_AUTO_FLUSH_ISO_OVERFLOW       5
+-- 
+2.51.0
+
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 (file)
index 0000000..4822aaa
--- /dev/null
@@ -0,0 +1,75 @@
+From efea291f3e4a120426265a362e69a2d828086c87 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 27 May 2025 22:13:13 +0530
+Subject: HID: multitouch: Get the contact ID from HID_DG_TRANSDUCER_INDEX
+ fields in case of Apple Touch Bar
+
+From: Kerem Karabay <kekrby@gmail.com>
+
+[ Upstream commit f41d736acc039d86512951f4e874b0f5e666babf ]
+
+In Apple Touch Bar, the contact ID is contained in fields with the
+HID_DG_TRANSDUCER_INDEX usage rather than HID_DG_CONTACTID, thus differing
+from the HID spec. Add a quirk for the same.
+
+Acked-by: Benjamin Tissoires <bentiss@kernel.org>
+Signed-off-by: Kerem Karabay <kekrby@gmail.com>
+Co-developed-by: Aditya Garg <gargaditya08@live.com>
+Signed-off-by: Aditya Garg <gargaditya08@live.com>
+Signed-off-by: Jiri Kosina <jkosina@suse.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/hid/hid-multitouch.c | 16 +++++++++++++++-
+ 1 file changed, 15 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/hid/hid-multitouch.c b/drivers/hid/hid-multitouch.c
+index a85581cd511fd..35426e702b301 100644
+--- a/drivers/hid/hid-multitouch.c
++++ b/drivers/hid/hid-multitouch.c
+@@ -72,6 +72,7 @@ MODULE_LICENSE("GPL");
+ #define MT_QUIRK_FORCE_MULTI_INPUT    BIT(20)
+ #define MT_QUIRK_DISABLE_WAKEUP               BIT(21)
+ #define MT_QUIRK_ORIENTATION_INVERT   BIT(22)
++#define MT_QUIRK_APPLE_TOUCHBAR               BIT(23)
+ #define MT_INPUTMODE_TOUCHSCREEN      0x02
+ #define MT_INPUTMODE_TOUCHPAD         0x03
+@@ -612,6 +613,7 @@ static struct mt_application *mt_find_application(struct mt_device *td,
+ static struct mt_report_data *mt_allocate_report_data(struct mt_device *td,
+                                                     struct hid_report *report)
+ {
++      struct mt_class *cls = &td->mtclass;
+       struct mt_report_data *rdata;
+       struct hid_field *field;
+       int r, n;
+@@ -636,7 +638,11 @@ static struct mt_report_data *mt_allocate_report_data(struct mt_device *td,
+               if (field->logical == HID_DG_FINGER || td->hdev->group != HID_GROUP_MULTITOUCH_WIN_8) {
+                       for (n = 0; n < field->report_count; n++) {
+-                              if (field->usage[n].hid == HID_DG_CONTACTID) {
++                              unsigned int hid = field->usage[n].hid;
++
++                              if (hid == HID_DG_CONTACTID ||
++                                 (cls->quirks & MT_QUIRK_APPLE_TOUCHBAR &&
++                                 hid == HID_DG_TRANSDUCER_INDEX)) {
+                                       rdata->is_mt_collection = true;
+                                       break;
+                               }
+@@ -814,6 +820,14 @@ static int mt_touch_input_mapping(struct hid_device *hdev, struct hid_input *hi,
+                                                    EV_KEY, BTN_TOUCH);
+                       MT_STORE_FIELD(tip_state);
+                       return 1;
++              case HID_DG_TRANSDUCER_INDEX:
++                      /*
++                       * Contact ID in case of Apple Touch Bars is contained
++                       * in fields with HID_DG_TRANSDUCER_INDEX usage.
++                       */
++                      if (!(cls->quirks & MT_QUIRK_APPLE_TOUCHBAR))
++                              return 0;
++                      fallthrough;
+               case HID_DG_CONTACTID:
+                       MT_STORE_FIELD(contactid);
+                       app->touches_by_report++;
+-- 
+2.51.0
+
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 (file)
index 0000000..805f49a
--- /dev/null
@@ -0,0 +1,45 @@
+From 8d978b8739618dd418d99968c175d5c865e0b384 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 27 May 2025 22:13:16 +0530
+Subject: HID: multitouch: specify that Apple Touch Bar is direct
+
+From: Kerem Karabay <kekrby@gmail.com>
+
+[ Upstream commit 45ca23c5ee8b2b3074377fecc92fa72aa595f7c9 ]
+
+Currently the driver determines the device type based on the
+application, but this value is not reliable on Apple Touch Bar, where
+the application is HID_DG_TOUCHPAD even though this device is direct,
+so add a quirk for the same.
+
+Acked-by: Benjamin Tissoires <bentiss@kernel.org>
+Signed-off-by: Kerem Karabay <kekrby@gmail.com>
+Co-developed-by: Aditya Garg <gargaditya08@live.com>
+Signed-off-by: Aditya Garg <gargaditya08@live.com>
+Signed-off-by: Jiri Kosina <jkosina@suse.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/hid/hid-multitouch.c | 7 +++++++
+ 1 file changed, 7 insertions(+)
+
+diff --git a/drivers/hid/hid-multitouch.c b/drivers/hid/hid-multitouch.c
+index 8e9f71e69dd8c..d8fee341c096e 100644
+--- a/drivers/hid/hid-multitouch.c
++++ b/drivers/hid/hid-multitouch.c
+@@ -1336,6 +1336,13 @@ static int mt_touch_input_configured(struct hid_device *hdev,
+       if (td->serial_maybe)
+               mt_post_parse_default_settings(td, app);
++      /*
++       * The application for Apple Touch Bars is HID_DG_TOUCHPAD,
++       * but these devices are direct.
++       */
++      if (cls->quirks & MT_QUIRK_APPLE_TOUCHBAR)
++              app->mt_flags |= INPUT_MT_DIRECT;
++
+       if (cls->is_indirect)
+               app->mt_flags |= INPUT_MT_POINTER;
+-- 
+2.51.0
+
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 (file)
index 0000000..3ae51cf
--- /dev/null
@@ -0,0 +1,61 @@
+From 350ed4a05e4f857a5f1e8c80e499f3cce702eda1 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 27 May 2025 22:13:14 +0530
+Subject: HID: multitouch: support getting the tip state from HID_DG_TOUCH
+ fields in Apple Touch Bar
+
+From: Kerem Karabay <kekrby@gmail.com>
+
+[ Upstream commit e0976a61a543b5e03bc0d08030a0ea036ee3751d ]
+
+In Apple Touch Bar, the tip state is contained in fields with the
+HID_DG_TOUCH usage. This feature is gated by a quirk in order to
+prevent breaking other devices, see commit c2ef8f21ea8f
+("HID: multitouch: add support for trackpads").
+
+Acked-by: Benjamin Tissoires <bentiss@kernel.org>
+Signed-off-by: Kerem Karabay <kekrby@gmail.com>
+Co-developed-by: Aditya Garg <gargaditya08@live.com>
+Signed-off-by: Aditya Garg <gargaditya08@live.com>
+Signed-off-by: Jiri Kosina <jkosina@suse.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/hid/hid-multitouch.c | 15 +++++++++++----
+ 1 file changed, 11 insertions(+), 4 deletions(-)
+
+diff --git a/drivers/hid/hid-multitouch.c b/drivers/hid/hid-multitouch.c
+index 35426e702b301..d0b2e866dadaf 100644
+--- a/drivers/hid/hid-multitouch.c
++++ b/drivers/hid/hid-multitouch.c
+@@ -814,6 +814,17 @@ static int mt_touch_input_mapping(struct hid_device *hdev, struct hid_input *hi,
+                       MT_STORE_FIELD(confidence_state);
+                       return 1;
++              case HID_DG_TOUCH:
++                      /*
++                       * Legacy devices use TIPSWITCH and not TOUCH.
++                       * One special case here is of the Apple Touch Bars.
++                       * In these devices, the tip state is contained in
++                       * fields with the HID_DG_TOUCH usage.
++                       * Let's just ignore this field for other devices.
++                       */
++                      if (!(cls->quirks & MT_QUIRK_APPLE_TOUCHBAR))
++                              return -1;
++                      fallthrough;
+               case HID_DG_TIPSWITCH:
+                       if (field->application != HID_GD_SYSTEM_MULTIAXIS)
+                               input_set_capability(hi->input,
+@@ -884,10 +895,6 @@ static int mt_touch_input_mapping(struct hid_device *hdev, struct hid_input *hi,
+               case HID_DG_CONTACTMAX:
+                       /* contact max are global to the report */
+                       return -1;
+-              case HID_DG_TOUCH:
+-                      /* Legacy devices use TIPSWITCH and not TOUCH.
+-                       * Let's just ignore this field. */
+-                      return -1;
+               }
+               /* let hid-input decide for the others */
+               return 0;
+-- 
+2.51.0
+
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 (file)
index 0000000..c779bd9
--- /dev/null
@@ -0,0 +1,44 @@
+From 805659a3435f0a0793abec6d58dca903a96e287c Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 27 May 2025 22:13:15 +0530
+Subject: HID: multitouch: take cls->maxcontacts into account for Apple Touch
+ Bar even without a HID_DG_CONTACTMAX field
+
+From: Kerem Karabay <kekrby@gmail.com>
+
+[ Upstream commit 7dfe48bdc9d38db46283f2e0281bc1626277b8bf ]
+
+In Apple Touch Bar, the HID_DG_CONTACTMAX is not present, but the maximum
+contact count is still greater than the default. Add quirks for the same.
+
+Acked-by: Benjamin Tissoires <bentiss@kernel.org>
+Signed-off-by: Kerem Karabay <kekrby@gmail.com>
+Co-developed-by: Aditya Garg <gargaditya08@live.com>
+Signed-off-by: Aditya Garg <gargaditya08@live.com>
+Signed-off-by: Jiri Kosina <jkosina@suse.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/hid/hid-multitouch.c | 7 +++++++
+ 1 file changed, 7 insertions(+)
+
+diff --git a/drivers/hid/hid-multitouch.c b/drivers/hid/hid-multitouch.c
+index d0b2e866dadaf..8e9f71e69dd8c 100644
+--- a/drivers/hid/hid-multitouch.c
++++ b/drivers/hid/hid-multitouch.c
+@@ -1322,6 +1322,13 @@ static int mt_touch_input_configured(struct hid_device *hdev,
+       struct input_dev *input = hi->input;
+       int ret;
++      /*
++       * HID_DG_CONTACTMAX field is not present on Apple Touch Bars,
++       * but the maximum contact count is greater than the default.
++       */
++      if (cls->quirks & MT_QUIRK_APPLE_TOUCHBAR && cls->maxcontacts)
++              td->maxcontacts = cls->maxcontacts;
++
+       if (!td->maxcontacts)
+               td->maxcontacts = MT_DEFAULT_MAXCONTACT;
+-- 
+2.51.0
+
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 (file)
index 0000000..9b9a32b
--- /dev/null
@@ -0,0 +1,58 @@
+From 09b340cd294dfaa1583009bb779d077bcbcf94e4 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 1 Jul 2025 15:22:49 +0300
+Subject: i2c: designware: Add quirk for Intel Xe
+
+From: Heikki Krogerus <heikki.krogerus@linux.intel.com>
+
+[ Upstream commit f6a8e9f3de4567c71ef9f5f13719df69a8b96081 ]
+
+The regmap is coming from the parent also in case of Xe
+GPUs. Reusing the Wangxun quirk for that.
+
+Acked-by: Jarkko Nikula <jarkko.nikula@linux.intel.com>
+Co-developed-by: Michael J. Ruhl <michael.j.ruhl@intel.com>
+Signed-off-by: Michael J. Ruhl <michael.j.ruhl@intel.com>
+Signed-off-by: Heikki Krogerus <heikki.krogerus@linux.intel.com>
+Reviewed-by: Andi Shyti <andi.shyti@kernel.org>
+Link: https://lore.kernel.org/r/20250701122252.2590230-3-heikki.krogerus@linux.intel.com
+Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
+[Rodrigo fixed the co-developed tags while merging]
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/i2c/busses/i2c-designware-platdrv.c | 7 +++++--
+ 1 file changed, 5 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/i2c/busses/i2c-designware-platdrv.c b/drivers/i2c/busses/i2c-designware-platdrv.c
+index f3245a6856309..1ebcf5673a06b 100644
+--- a/drivers/i2c/busses/i2c-designware-platdrv.c
++++ b/drivers/i2c/busses/i2c-designware-platdrv.c
+@@ -168,7 +168,7 @@ static inline int dw_i2c_of_configure(struct platform_device *pdev)
+ }
+ #endif
+-static int txgbe_i2c_request_regs(struct dw_i2c_dev *dev)
++static int dw_i2c_get_parent_regmap(struct dw_i2c_dev *dev)
+ {
+       dev->map = dev_get_regmap(dev->dev->parent, NULL);
+       if (!dev->map)
+@@ -190,12 +190,15 @@ static int dw_i2c_plat_request_regs(struct dw_i2c_dev *dev)
+       struct platform_device *pdev = to_platform_device(dev->dev);
+       int ret;
++      if (device_is_compatible(dev->dev, "intel,xe-i2c"))
++              return dw_i2c_get_parent_regmap(dev);
++
+       switch (dev->flags & MODEL_MASK) {
+       case MODEL_BAIKAL_BT1:
+               ret = bt1_i2c_request_regs(dev);
+               break;
+       case MODEL_WANGXUN_SP:
+-              ret = txgbe_i2c_request_regs(dev);
++              ret = dw_i2c_get_parent_regmap(dev);
+               break;
+       default:
+               dev->base = devm_platform_ioremap_resource(pdev, 0);
+-- 
+2.51.0
+
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 (file)
index 0000000..a54afba
--- /dev/null
@@ -0,0 +1,50 @@
+From 59281cf0dcecd0d8716db481540952060d86d5c6 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 13 Aug 2025 15:43:20 +0300
+Subject: IB/mlx5: Fix obj_type mismatch for SRQ event subscriptions
+
+From: Or Har-Toov <ohartoov@nvidia.com>
+
+[ Upstream commit 85fe9f565d2d5af95ac2bbaa5082b8ce62b039f5 ]
+
+Fix a bug where the driver's event subscription logic for SRQ-related
+events incorrectly sets obj_type for RMP objects.
+
+When subscribing to SRQ events, get_legacy_obj_type() did not handle
+the MLX5_CMD_OP_CREATE_RMP case, which caused obj_type to be 0
+(default).
+This led to a mismatch between the obj_type used during subscription
+(0) and the value used during notification (1, taken from the event's
+type field). As a result, event mapping for SRQ objects could fail and
+event notification would not be delivered correctly.
+
+This fix adds handling for MLX5_CMD_OP_CREATE_RMP in get_legacy_obj_type,
+returning MLX5_EVENT_QUEUE_TYPE_RQ so obj_type is consistent between
+subscription and notification.
+
+Fixes: 759738537142 ("IB/mlx5: Enable subscription for device events over DEVX")
+Link: https://patch.msgid.link/r/8f1048e3fdd1fde6b90607ce0ed251afaf8a148c.1755088962.git.leon@kernel.org
+Signed-off-by: Or Har-Toov <ohartoov@nvidia.com>
+Reviewed-by: Edward Srouji <edwards@nvidia.com>
+Signed-off-by: Leon Romanovsky <leonro@nvidia.com>
+Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/infiniband/hw/mlx5/devx.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/drivers/infiniband/hw/mlx5/devx.c b/drivers/infiniband/hw/mlx5/devx.c
+index 3f1fa45d93682..388c95562a927 100644
+--- a/drivers/infiniband/hw/mlx5/devx.c
++++ b/drivers/infiniband/hw/mlx5/devx.c
+@@ -191,6 +191,7 @@ static u16 get_legacy_obj_type(u16 opcode)
+ {
+       switch (opcode) {
+       case MLX5_CMD_OP_CREATE_RQ:
++      case MLX5_CMD_OP_CREATE_RMP:
+               return MLX5_EVENT_QUEUE_TYPE_RQ;
+       case MLX5_CMD_OP_CREATE_QP:
+               return MLX5_EVENT_QUEUE_TYPE_QP;
+-- 
+2.51.0
+
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 (file)
index 0000000..1aa22fd
--- /dev/null
@@ -0,0 +1,56 @@
+From 56d94660c3e8de98cc04255cf7c9693a13a8e4c4 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 17 Jun 2025 15:25:52 +0200
+Subject: mmc: sdhci-cadence: add Mobileye eyeQ support
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Benoît Monin <benoit.monin@bootlin.com>
+
+[ Upstream commit 120ffe250dd95b5089d032f582c5be9e3a04b94b ]
+
+The MMC/SDHCI controller implemented by Mobileye needs the preset value
+quirks to configure the clock properly at speed slower than HS200.
+It otherwise works as a standard sd4hc controller.
+
+Signed-off-by: Benoît Monin <benoit.monin@bootlin.com>
+Link: https://lore.kernel.org/r/e97f409650495791e07484589e1666ead570fa12.1750156323.git.benoit.monin@bootlin.com
+Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/mmc/host/sdhci-cadence.c | 11 +++++++++++
+ 1 file changed, 11 insertions(+)
+
+diff --git a/drivers/mmc/host/sdhci-cadence.c b/drivers/mmc/host/sdhci-cadence.c
+index be1505e8c536e..7759531ccca70 100644
+--- a/drivers/mmc/host/sdhci-cadence.c
++++ b/drivers/mmc/host/sdhci-cadence.c
+@@ -433,6 +433,13 @@ static const struct sdhci_cdns_drv_data sdhci_elba_drv_data = {
+       },
+ };
++static const struct sdhci_cdns_drv_data sdhci_eyeq_drv_data = {
++      .pltfm_data = {
++              .ops = &sdhci_cdns_ops,
++              .quirks2 = SDHCI_QUIRK2_PRESET_VALUE_BROKEN,
++      },
++};
++
+ static const struct sdhci_cdns_drv_data sdhci_cdns_drv_data = {
+       .pltfm_data = {
+               .ops = &sdhci_cdns_ops,
+@@ -595,6 +602,10 @@ static const struct of_device_id sdhci_cdns_match[] = {
+               .compatible = "amd,pensando-elba-sd4hc",
+               .data = &sdhci_elba_drv_data,
+       },
++      {
++              .compatible = "mobileye,eyeq-sd4hc",
++              .data = &sdhci_eyeq_drv_data,
++      },
+       { .compatible = "cdns,sd4hc" },
+       { /* sentinel */ }
+ };
+-- 
+2.51.0
+
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 (file)
index 0000000..e561b68
--- /dev/null
@@ -0,0 +1,53 @@
+From 053a8a54007380998c92a1c12dfd92746097745e Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sun, 7 Sep 2025 12:40:16 -0700
+Subject: scsi: ufs: mcq: Fix memory allocation checks for SQE and CQE
+
+From: Alok Tiwari <alok.a.tiwari@oracle.com>
+
+[ Upstream commit 5cb782ff3c62c837e4984b6ae9f5d9a423cd5088 ]
+
+Previous checks incorrectly tested the DMA addresses (dma_handle) for
+NULL. Since dma_alloc_coherent() returns the CPU (virtual) address, the
+NULL check should be performed on the *_base_addr pointer to correctly
+detect allocation failures.
+
+Update the checks to validate sqe_base_addr and cqe_base_addr instead of
+sqe_dma_addr and cqe_dma_addr.
+
+Fixes: 4682abfae2eb ("scsi: ufs: core: mcq: Allocate memory for MCQ mode")
+Signed-off-by: Alok Tiwari <alok.a.tiwari@oracle.com>
+Reviewed-by: Alim Akhtar <alim.akhtar@samsung.com>
+Reviewed-by: Manivannan Sadhasivam <mani@kernel.org>
+Reviewed-by: Peter Wang <peter.wang@mediatek.com>
+Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/ufs/core/ufs-mcq.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/ufs/core/ufs-mcq.c b/drivers/ufs/core/ufs-mcq.c
+index 14864cfc24223..cb8f0652a4bee 100644
+--- a/drivers/ufs/core/ufs-mcq.c
++++ b/drivers/ufs/core/ufs-mcq.c
+@@ -209,7 +209,7 @@ int ufshcd_mcq_memory_alloc(struct ufs_hba *hba)
+               hwq->sqe_base_addr = dmam_alloc_coherent(hba->dev, utrdl_size,
+                                                        &hwq->sqe_dma_addr,
+                                                        GFP_KERNEL);
+-              if (!hwq->sqe_dma_addr) {
++              if (!hwq->sqe_base_addr) {
+                       dev_err(hba->dev, "SQE allocation failed\n");
+                       return -ENOMEM;
+               }
+@@ -218,7 +218,7 @@ int ufshcd_mcq_memory_alloc(struct ufs_hba *hba)
+               hwq->cqe_base_addr = dmam_alloc_coherent(hba->dev, cqe_size,
+                                                        &hwq->cqe_dma_addr,
+                                                        GFP_KERNEL);
+-              if (!hwq->cqe_dma_addr) {
++              if (!hwq->cqe_base_addr) {
+                       dev_err(hba->dev, "CQE allocation failed\n");
+                       return -ENOMEM;
+               }
+-- 
+2.51.0
+
diff --git a/queue-6.6/series b/queue-6.6/series
new file mode 100644 (file)
index 0000000..a341579
--- /dev/null
@@ -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 (file)
index 0000000..18a83d4
--- /dev/null
@@ -0,0 +1,36 @@
+From 023b1249fbb069dae08191b3d6f9d195f139cfee Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 3 Jun 2025 15:10:45 +0800
+Subject: usb: core: Add 0x prefix to quirks debug output
+
+From: Jiayi Li <lijiayi@kylinos.cn>
+
+[ Upstream commit 47c428fce0b41b15ab321d8ede871f780ccd038f ]
+
+Use "0x%x" format for quirks debug print to clarify it's a hexadecimal
+value. Improves readability and consistency with other hex outputs.
+
+Signed-off-by: Jiayi Li <lijiayi@kylinos.cn>
+Link: https://lore.kernel.org/r/20250603071045.3243699-1-lijiayi@kylinos.cn
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/usb/core/quirks.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/usb/core/quirks.c b/drivers/usb/core/quirks.c
+index bfd97cad8aa4d..c0fd8ab3fe8fc 100644
+--- a/drivers/usb/core/quirks.c
++++ b/drivers/usb/core/quirks.c
+@@ -734,7 +734,7 @@ void usb_detect_quirks(struct usb_device *udev)
+       udev->quirks ^= usb_detect_dynamic_quirks(udev);
+       if (udev->quirks)
+-              dev_dbg(&udev->dev, "USB quirks for this device: %x\n",
++              dev_dbg(&udev->dev, "USB quirks for this device: 0x%x\n",
+                       udev->quirks);
+ #ifdef CONFIG_USB_DEFAULT_PERSIST
+-- 
+2.51.0
+