From nobody Mon Sep 28 10:56:06 2026 Received: from sender5-op-o12.zoho.com (sender5-op-o12.zoho.com [165.173.182.12]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 2A2F52D5436; Sat, 22 Aug 2026 18:54:05 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=pass smtp.client-ip=165.173.182.12 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787424847; cv=pass; b=P14mcThMVwwTnXlYl4XTj1LcUJ/F5h18VE2yKjSv68F/foI/Hl0wbTCvbJVKOORDSJgzaYbED/ZLTYJ6ovff3FQQU2foA6t1umOvHLx+jUpB5F7FlHU3zoIIS7Oux/jmqHZX4kRYefIFrbQ/6OH+F6BIOVVwwuv22qu3NpV2Gas= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787424847; c=relaxed/simple; bh=vp73JAFJfvYEdEdNHkA9mu3yG0xAcRU/EH2Z3zmIa/o=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=ngoCc/BcKmyaDfJALAbHHBnJWdIuo18Up5VDYfQZzJzrHW0czw5XJdJmn/L2V7wqSJX/c42Sz7ZBrKjQgzeibF4Lr6stjlBcxl3CRYpH6mZWylwcbpfx/5bFsI6Oq6Tc3r6MoENEZa0CsXZdGSJZqLx2cODP2yCMJthpfzJSxiM= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=rong.moe; spf=pass smtp.mailfrom=rong.moe; dkim=pass (2048-bit key) header.d=rong.moe header.i=i@rong.moe header.b=HQ4YLwSy; arc=pass smtp.client-ip=165.173.182.12 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=rong.moe Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=rong.moe Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=rong.moe header.i=i@rong.moe header.b="HQ4YLwSy" ARC-Seal: i=1; a=rsa-sha256; t=1787424778; cv=none; d=zohomail.com; s=zohoarc; b=nutZaZ9k9DvxShthnlxXQuI1WAjn39hAWwRaDEBWtAv2JNMXORPTYypisuipd8qJQYlH19tF0Dl7ATrMAKNUT5aD2uNoehDouBafPIuiXkYKwpjwLupjGv1dgVhiOII1NhvtqpwslwVoJeZ/JY+oQXgmLgG71Ru/2/xKnNmyC6c= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1787424778; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:MIME-Version:Message-ID:Subject:Subject:To:To:Message-Id:Reply-To; bh=Z71ZUpT6ZJIEHaxndlECyET5Ejc5UasrVwg8mjiyOYE=; b=R3CHe5lhgImWAE+7kWsSbrnKqV2ANZo8D+uz9YPst99DeSnRJyld5oeFYIDkOX8mvtucABGX1WaCzbdoi1cNpAh6LdiODIGZEl2bMuC3bY8tnVPMG8nOdNrGfmdQK5BONUunQAnpVYUl/di4gdX3pYE9gomVEX1FpLKpU1atGZI= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass header.i=rong.moe; spf=pass smtp.mailfrom=i@rong.moe; dmarc=pass header.from= DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; t=1787424778; s=zmail2048; d=rong.moe; i=i@rong.moe; h=From:From:Date:Date:Subject:Subject:MIME-Version:Content-Type:Content-Transfer-Encoding:Message-Id:Message-Id:In-Reply-To:To:To:Cc:Cc:Reply-To; bh=Z71ZUpT6ZJIEHaxndlECyET5Ejc5UasrVwg8mjiyOYE=; b=HQ4YLwSyQ1xoC6bfKTW+w+7l3y0lDiblNeT1fYMFTyJzciikIkXUhtcUnV4P106Q NN7IivQe4TZ6zSFpQK99+KOZurBVWLWw8bSOe+pYtY4J7b9QiER/kt4hdDOJbRWnTKg xwOWtKWNf8IC+K5HPwfnBS9gVd1TXxPnLI0ZKD88pw/5R4UYk2rqmhAFFdaY+dmHmVZ +TykmY6VdHqk3Gg31R+47pushnL1+DIOs8MuIfb7PxveUuCH6TdSnKGjJ7Sm4dOHAJs FFx1GXJttFZjTkF5VzARrO1N9HS5dmk+cfY5HMm7Vn6+lWEPRcN54/sXAtJLUQfvXPk nyzyq42flg== Received: by mx.zohomail.com with SMTPS id 17874247761771009.1466001832524; Sat, 22 Aug 2026 11:52:56 -0700 (PDT) From: Rong Zhang Date: Sun, 23 Aug 2026 02:52:28 +0800 Subject: [PATCH 1/4] ALSA: doc: usb-audio: Add doc for QUIRK_FLAG_ALWAYS_SET_RATE Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260823-uac-demote-sticky-check-v1-1-a8cbe572edff@rong.moe> References: <20260823-uac-demote-sticky-check-v1-0-a8cbe572edff@rong.moe> In-Reply-To: <20260823-uac-demote-sticky-check-v1-0-a8cbe572edff@rong.moe> To: Jaroslav Kysela , Takashi Iwai , Jonathan Corbet , Shuah Khan , Randy Dunlap Cc: Takashi Iwai , linux-sound@vger.kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, Alexander Niemeyer , Rong Zhang X-Mailer: b4 0.17-dev-1f2f7 X-ZohoMailClient: External QUIRK_FLAG_ALWAYS_SET_RATE was introduced into usb-audio before without appropriate documentation, so add it. There is an odd colon in its comments, so remove it too. As this is often forgotten, also add a reminder to the end of the enumeration. Fixes: 786f91da8535 ("ALSA: usb-audio: add QUIRK_FLAG_ALWAYS_SET_RATE for M= ackie DLZ Creator XS") Signed-off-by: Rong Zhang Reported-by: Alexander Niemeyer --- Documentation/sound/alsa-configuration.rst | 5 +++++ sound/usb/usbaudio.h | 4 ++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/Documentation/sound/alsa-configuration.rst b/Documentation/sou= nd/alsa-configuration.rst index b2171472e6cb..71733e807a7c 100644 --- a/Documentation/sound/alsa-configuration.rst +++ b/Documentation/sound/alsa-configuration.rst @@ -2406,6 +2406,11 @@ quirk_flags works around it by enforcing the fixed max URBs (12) instead of the dynamic calculation from the buffer size, and passing the `URB_ISO_ASAP` URB flag. + * bit 32: ``always_set_rate`` + Issue SET_CUR for the sample rate even when the clock already re= ports + the requested rate. A device advertising a single rate is other= wise + never sent the request at all, and some require it before stream= ing + will start. =20 This module supports multiple devices, autoprobe and hotplugging. =20 diff --git a/sound/usb/usbaudio.h b/sound/usb/usbaudio.h index c49709d7ad25..abc2d7e579de 100644 --- a/sound/usb/usbaudio.h +++ b/sound/usb/usbaudio.h @@ -260,7 +260,7 @@ extern bool snd_usb_skip_validation; * to insufficient buffer depth combined with xHCI scheduling variability. * The larger buffer (MAX_URBS =3D 12, ~64ms) absorbs system scheduling * jitter during boot, while URB_ISO_ASAP ensures consistent xHCI schedul= ing. - * QUIRK_FLAG_ALWAYS_SET_RATE: + * QUIRK_FLAG_ALWAYS_SET_RATE * Issue SET_CUR for the sample rate even when the clock already reports = the * requested rate. A device advertising a single rate is otherwise never= sent * the request at all, and some require it before streaming will start. @@ -300,7 +300,7 @@ enum { QUIRK_TYPE_MIXER_GET_CUR_BROKEN =3D 30, QUIRK_TYPE_PLAYBACK_URB_FIXUP =3D 31, QUIRK_TYPE_ALWAYS_SET_RATE =3D 32, -/* Please also edit snd_usb_audio_quirk_flag_names */ +/* Please also edit snd_usb_audio_quirk_flag_names and alsa-configuration.= rst */ }; =20 #define QUIRK_FLAG(x) BIT_U64(QUIRK_TYPE_ ## x) --=20 2.55.0 From nobody Mon Sep 28 10:56:06 2026 Received: from sender4-op-o12.zoho.com (sender4-op-o12.zoho.com [136.143.188.12]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id DE26232B10A; Sat, 22 Aug 2026 18:54:37 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=pass smtp.client-ip=136.143.188.12 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787424879; cv=pass; b=fUffg8RwW/+SPXfQp2GwNLgFEXkiKGB/BbbVvXGa7G4SsqLmyI54n82Hsg1wHtO2OimniizdlGnkg2RIENJrnVIOJO/Ri8fLWwao8Mtw0k+t8fHsbqv3R7Te4R+L3TXMs4/kH0t2rZpz2awKlDdIGc+b8iwtGmjbaqnJP8vru+E= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787424879; c=relaxed/simple; bh=cIdsi16KYfmArbHlwos2XlaIozotTu1XUWVT5/kBi2Y=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Va+KOB+Akudm5YtK31txtD5dN2D+2AqnPp4eTu8G44BPjDBNxsCKM+j61dTOWAZYD8hDbqDH8KK/giSo0f/6MM9Ql5l4Jcouz+b93c89qNPxxqlF+AmjeHXqZYiTdMgqYJ8gyCHZEy2+optvQ3vkeC6T6aPodPDrhcqpmRUnLK4= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=rong.moe; spf=pass smtp.mailfrom=rong.moe; dkim=pass (2048-bit key) header.d=rong.moe header.i=i@rong.moe header.b=Le+9owVn; arc=pass smtp.client-ip=136.143.188.12 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=rong.moe Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=rong.moe Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=rong.moe header.i=i@rong.moe header.b="Le+9owVn" ARC-Seal: i=1; a=rsa-sha256; t=1787424780; cv=none; d=zohomail.com; s=zohoarc; b=keNiYFhLF5qhKOlE3TT2LPr0jBEoZ6LWBujWXWZ4ULVYXJpnEpqSF5G/PuoRWXihQ42LxxMkN6ExN9Q4hzWO1A3NSTVMyXg4sorAY+XQUEojLucVfLZgaI9j0BeW2KSNVwqEs8hcUQUqXSb2RzaOqHTnWHsXLK9VIsQG89dAv34= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1787424780; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:MIME-Version:Message-ID:Subject:Subject:To:To:Message-Id:Reply-To; bh=n4skxt1W9Q/KTVkKzt52x0YjIHLTwff6q1FoVcG/OaA=; b=D80KQODLl8S3YP2zUscFnIRKKhk284lU7PNuhHb8VdjC8AsVtyj5XGQkVS3+yZJYKoLvK4fWs/oUsQ5GHLGDlEO22zrCED9hRjV7O0aWrKq26+N6B+w4ZDzZvWGqCACmx04z6wgg5a1Oic5/+XsCzuaz5fg2xO6544vbmQfb458= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass header.i=rong.moe; spf=pass smtp.mailfrom=i@rong.moe; dmarc=pass header.from= DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; t=1787424780; s=zmail2048; d=rong.moe; i=i@rong.moe; h=From:From:Date:Date:Subject:Subject:MIME-Version:Content-Type:Content-Transfer-Encoding:Message-Id:Message-Id:In-Reply-To:To:To:Cc:Cc:Reply-To; bh=n4skxt1W9Q/KTVkKzt52x0YjIHLTwff6q1FoVcG/OaA=; b=Le+9owVnOBO+FHUI9TkDTJW7L/XFLwQEgTsCPFcaRdouAb3QPLdhl1gxhFLTfQzF 5h2snmuCaVcFIC7EZdbhJAXGpjg+G4qFM6Sh0eDxRvU2shRjSZY4fSwzCumDRWqesGs jETG2ppc52ja/gxrEFl1d033tGlfugMmKmalCUroALRsLtjjmVj1rK67v+wCvh2RLsQ yzMglK6CylhKEoQesKHbJLs8ALL97BDkLm8wgFVFeIX3ksrAv3PQY66hl294/Yn9ytC ELlWsL+Hh9JyMrwjUjyJRPFCD+VZbRQeeXDlrzCkbWdqVqM+fDq5ehdcgKYchB+UAp8 HdKFJu+XsQ== Received: by mx.zohomail.com with SMTPS id 1787424779688245.1587139544588; Sat, 22 Aug 2026 11:52:59 -0700 (PDT) From: Rong Zhang Date: Sun, 23 Aug 2026 02:52:29 +0800 Subject: [PATCH 2/4] ALSA: usb-audio: Demote the severity of sticky GET_CUR Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260823-uac-demote-sticky-check-v1-2-a8cbe572edff@rong.moe> References: <20260823-uac-demote-sticky-check-v1-0-a8cbe572edff@rong.moe> In-Reply-To: <20260823-uac-demote-sticky-check-v1-0-a8cbe572edff@rong.moe> To: Jaroslav Kysela , Takashi Iwai , Jonathan Corbet , Shuah Khan , Randy Dunlap Cc: Takashi Iwai , linux-sound@vger.kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, Alexander Niemeyer , Rong Zhang X-Mailer: b4 0.17-dev-1f2f7 X-ZohoMailClient: External Currently, a mixer is disabled when its GET_CUR is sticky, causing userspace to fall back to soft mixers, unless QUIRK_FLAG_MIXER_GET_CUR_BROKEN is set. This leads to issues on some wireless headphones with broken GET_CUR but effective SET_CUR, which use poorly-performed lossy codecs and are prone to audible distortion at low volume. They have to set the quirk flag to reeanble the mixer. Considering that users can always opt into soft mixers if they need it, i.e., when SET_CUR is stubbed, demote the severity of sticky GET_CUR by marking GET_CUR as broken and only provide mixer values from the cache. The mixer itself is still registered. Signed-off-by: Rong Zhang Reported-by: Alexander Niemeyer --- sound/usb/mixer.c | 76 +++++++++++++++------------------------------------= ---- 1 file changed, 21 insertions(+), 55 deletions(-) diff --git a/sound/usb/mixer.c b/sound/usb/mixer.c index 5de182181ede..3aa9a9c12557 100644 --- a/sound/usb/mixer.c +++ b/sound/usb/mixer.c @@ -1237,21 +1237,27 @@ static void init_cur_mix_raw(struct usb_mixer_elem_= info *cval, int ch, int idx) } =20 /* - * Additional checks for sticky mixers + * Additional checks for sticky GET_CUR * - * Some devices' volume control mixers are sticky, which accept SET_CUR but - * do absolutely nothing. + * Some devices' volume control mixers have sticky GET_CUR, which implies = either + * stubbed SET_CUR or broken GET_CUR. For the former case, the mixer accep= ts + * SET_CUR but do absolutely nothing, so falling back to soft mixer is the= only + * way to control the volume. For the latter case, the mixer has effective + * SET_CUR despite GET_CUR being constant, and the mixer is usable as long= as we + * always provide mixer value from the ceche. * * Check the return values of GET_CUR with different SET_CUR values. Consi= der - * the mixer as sticky if GET_CUR always returns a constant value. + * GET_CUR as sticky if GET_CUR always returns a constant value. * - * Some devices have effective SET_CUR despite GET_CUR being constant. Do = not - * consider the mixer as sticky if a quirk flag indicates that. + * Unfortunately, we can't distinguish between stubbed SET_CUR and broken + * GET_CUR with simple read-back tests. Disabling the mixer regardless and + * forcing userspace to use soft mixer instead can lead to audible distort= ion at + * low volume on some wireless headphones, probably due to their poorly- + * performed lossy codec. * - * Gate the registration of sticky mixers to prevent confusing userspace, = so - * that they won't cause ineffective volume control. However, for mixers w= ith - * effective SET_CUR but broken GET_CUR, the registration can continue nor= mally - * but further GET_CUR requests will be gated. + * Instead, mark GET_CUR as broken regardless and only provide mixer value= from + * the cache. Users may opt into soft mixer in userspace audio stack if th= ey + * need it. */ static int check_sticky_volume_control(struct usb_mixer_elem_info *cval, int channel, int saved) @@ -1271,24 +1277,13 @@ static int check_sticky_volume_control(struct usb_m= ixer_elem_info *cval, return 0; } =20 - if (cval->head.mixer->chip->quirk_flags & QUIRK_FLAG_MIXER_GET_CUR_BROKEN= ) { - usb_audio_info(cval->head.mixer->chip, - "%d:%d: broken mixer GET_CUR (%d/%d/%d =3D> %d)\n", - cval->head.id, mixer_ctrl_intf(cval->head.mixer), - cval->min, cval->max, cval->res, saved); - - cval->get_cur_broken =3D 1; - return -ENXIO; - } - - usb_audio_err(cval->head.mixer->chip, - "%d:%d: sticky mixer values (%d/%d/%d =3D> %d), disabling\n", - cval->head.id, mixer_ctrl_intf(cval->head.mixer), - cval->min, cval->max, cval->res, saved); usb_audio_info(cval->head.mixer->chip, - "check MIXER_GET_CUR_BROKEN if you believe the mixer is non-stick= y"); + "%d:%d: broken mixer GET_CUR (%d/%d/%d =3D> %d)\n", + cval->head.id, mixer_ctrl_intf(cval->head.mixer), + cval->min, cval->max, cval->res, saved); =20 - return -ENODEV; + cval->get_cur_broken =3D 1; + return -ENXIO; } =20 /* @@ -1385,8 +1380,6 @@ static int get_min_max_with_quirks(struct usb_mixer_e= lem_info *cval, goto no_checks; =20 ret =3D check_sticky_volume_control(cval, minchn, saved); - if (ret =3D=3D -ENODEV) - goto sticky; if (ret) goto no_checks; =20 @@ -1455,33 +1448,6 @@ static int get_min_max_with_quirks(struct usb_mixer_= elem_info *cval, } =20 return 0; - -sticky: - /* - * It makes no sense to restore the saved value for a sticky mixer, - * since setting any value is a no-op. - * - * However, in some rare cases, SET_CUR is effective despite GET_CUR - * always returns a constant value. These mixers are not sticky, but - * there's no way to distinguish them. Without any additional - * information, the best thing we can do is to set the mixer value to - * the maximum before bailing out, so that a soft mixer can still reach - * the maximum hardware volume if the mixer turns out to be non-sticky. - * Meanwhile, all channels must be synchronized to prevent imbalance - * volume. - */ - if (!cval->cmask) { - snd_usb_set_cur_mix_value(cval, 0, 0, cval->max); - } else { - idx =3D 0; - for (i =3D 0; i < MAX_CHANNELS; i++) { - if (cval->cmask & BIT(i)) { - snd_usb_set_cur_mix_value(cval, i + 1, idx, cval->max); - idx++; - } - } - } - return ret; } =20 #define get_min_max(cval, def) get_min_max_with_quirks(cval, def, NULL) --=20 2.55.0 From nobody Mon Sep 28 10:56:06 2026 Received: from sender4-op-o12.zoho.com (sender4-op-o12.zoho.com [136.143.188.12]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 050E42D5436; Sat, 22 Aug 2026 18:55:03 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=pass smtp.client-ip=136.143.188.12 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787424905; cv=pass; b=PFk5IOdXftk4vzthLkWmhRTyOkGRtM53n3q2Dmyb6OqITWJw5rGWFwoWiliQV7eMzCDsNKC81GiBAdNVSl6o7NhfMQ1aV2soENYqa7LCqFr5ZToKqW0iP3jHfPR+CXVUusHpwDAGFpFfkTCeNO3V0cfPaRSbmjxYg/Cvif4WG1Q= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787424905; c=relaxed/simple; bh=dUo0bKFmk9T2t/O6uSmMJoI5/LWEx1j/ZExt8pOkB7E=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=kffMzSB6ya1SivVO/ZGO1cpQ41cyf1NWWE8Vodh4VqZX0UoS+fCPRcc5Q+GJAIou2xKJCq3PmZ6L9L1ocaZvs0aC/f59z0ShEXb4m8zykXVAKJcsLrkfxwg3D//035o5FKXDa8ndakwWgujGmzJquEdD7RD5D9B5nS3fHxTyqvM= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=rong.moe; spf=pass smtp.mailfrom=rong.moe; dkim=pass (2048-bit key) header.d=rong.moe header.i=i@rong.moe header.b=NwL1zEXq; arc=pass smtp.client-ip=136.143.188.12 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=rong.moe Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=rong.moe Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=rong.moe header.i=i@rong.moe header.b="NwL1zEXq" ARC-Seal: i=1; a=rsa-sha256; t=1787424789; cv=none; d=zohomail.com; s=zohoarc; b=Jzuwjg3A/HMIOVRVdm4mB887kKtR9XvA2nuoUadGzmcsMahud0ba3U7usOU4cZEGiDmF3PzSpy1Nt+E2+5E/9Vyitg/O3rty1Wu2h3WdWUgeSXIK3GQPDQe5y97OO/dWYKbb6gkUtUwEH7BOY33pTg55P8RGtiK9rceMHGgOSPs= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1787424789; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:MIME-Version:Message-ID:Subject:Subject:To:To:Message-Id:Reply-To; bh=0zqcpQXWOqNgq/eBKT5QR2wE1cQscPmDLlSWPN4tOps=; b=AfK02XePLUlncWQXNFw5eszqiIxU22jH5ZPx6WuCAzPUyCzo1bS6HELIw6V3aSvxnpKQRVLh90GwoAPWuaNC0Xb0EJIuCQ+AG2abm++O5QvJoyfMMxeW1bUZQDcWeymMkMbz3HpL0l+VrOMVtL+A7F7FxC6lWXxOxq2Jc2I/Uxo= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass header.i=rong.moe; spf=pass smtp.mailfrom=i@rong.moe; dmarc=pass header.from= DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; t=1787424789; s=zmail2048; d=rong.moe; i=i@rong.moe; h=From:From:Date:Date:Subject:Subject:MIME-Version:Content-Type:Content-Transfer-Encoding:Message-Id:Message-Id:In-Reply-To:To:To:Cc:Cc:Reply-To; bh=0zqcpQXWOqNgq/eBKT5QR2wE1cQscPmDLlSWPN4tOps=; b=NwL1zEXq/cTp2JoGQTH1coH/E37dHsO+tDz5nrVkdUdVBNbZFTBeg61mfdSx3LGG w6nLE6/LlQOEXxvTKYwCVtb4TPRtQ4VhYd2KKlMN+Nvsa4/I0ovIueAf4WvCjO//h+O XUS9FWOYU5Wqoh0VDiN0boopZZOQ2mKJKGgylTBkycb+FBrmijyhPNtMfwGtsSVHNdr Z3Iak9T/7041Q6U1aeclrnOgoaNpmcoVq6sY3ydThpeFkG7ApFgBSJge4hFtMZ27Q9z P05nmC1muWwSG0N851sXJBMIN3ISH51HDAWUcuP2lFnisidxfx43qI5BDtfblarsRHW 1/FDwsuWOA== Received: by mx.zohomail.com with SMTPS id 1787424787616699.4801107926021; Sat, 22 Aug 2026 11:53:07 -0700 (PDT) From: Rong Zhang Date: Sun, 23 Aug 2026 02:52:30 +0800 Subject: [PATCH 3/4] ALSA: usb-audio: Reverse MIXER_GET_CUR_BROKEN as MIXER_GET_CUR_OK Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260823-uac-demote-sticky-check-v1-3-a8cbe572edff@rong.moe> References: <20260823-uac-demote-sticky-check-v1-0-a8cbe572edff@rong.moe> In-Reply-To: <20260823-uac-demote-sticky-check-v1-0-a8cbe572edff@rong.moe> To: Jaroslav Kysela , Takashi Iwai , Jonathan Corbet , Shuah Khan , Randy Dunlap Cc: Takashi Iwai , linux-sound@vger.kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, Alexander Niemeyer , Rong Zhang X-Mailer: b4 0.17-dev-1f2f7 X-ZohoMailClient: External The default behavior of sticky check now becomes what QUIRK_FLAG_MIXER_GET_CUR_BROKEN originally does, so the quirk flag is no longer needed. On some devices, whether their GET_CUR being sticky depends on whether hotpluggable components are present. When the hotpluggable components are missing on probe, their GET_CUR behavior is classified as broken. Therefore, reverse QUIRK_FLAG_MIXER_GET_CUR_BROKEN as QUIRK_FLAG_MIXER_GET_CUR_OK, so that it can be set to prevent the heuristics from gating GET_CUR. Note that even if the quirk flag is set, init_cur_mix_raw() should still initialize the mixer value to cval->min, otherwise restoring the bogus saved value on the first channel could lead to unbalanced channels. Signed-off-by: Rong Zhang Reported-by: Alexander Niemeyer --- Documentation/sound/alsa-configuration.rst | 20 ++++++++------------ sound/usb/mixer.c | 8 ++++++++ sound/usb/quirks.c | 16 +++------------- sound/usb/usbaudio.h | 20 +++++++------------- 4 files changed, 26 insertions(+), 38 deletions(-) diff --git a/Documentation/sound/alsa-configuration.rst b/Documentation/sou= nd/alsa-configuration.rst index 71733e807a7c..e500ec84e3ef 100644 --- a/Documentation/sound/alsa-configuration.rst +++ b/Documentation/sound/alsa-configuration.rst @@ -2316,6 +2316,9 @@ quirk_flags applies the ``mixer_playback_min_mute`` flag and clears the ``ignore_ctl_error`` flag for the device 1234:abcd, and applies the ``skip_sample_rate`` flag for all devices. + New quirk flags may replace old ones by reusing the latter's bits, so = the + new usage is preferred. Despite that, depending on the order of probin= g is + fragile, so it'd better migrate to the new usage anyway. =20 * bit 0: ``get_sample_rate`` Skip reading sample rate for devices @@ -2389,18 +2392,11 @@ quirk_flags from snd_usb_handle_sync_urb. Instead fall through and enqueue a packet_info containing only size-0 packets, so the OUT ring keeps moving (emits silence). Needed by Behringer Flow 8 (1397:050c). - * bit 30: ``mixer_get_cur_broken`` - Some mixers are sticky, which means that setting their current v= olume - is a no-op, and reading the current volume returns a constant va= lue. - The sticky check disables these mixers to prevent confusing user= space. - However, some devices do have a tunable volume despite the repor= ted - current volume being constant. As the sticky check can't disting= uish - between the two categories, setting this flag tells that the dev= ice - should fall into the second category when GET_CUR returns a cons= tant - value, resulting in the sticky check being non-fatal and only - disabling GET_CUR instead of the whole mixer. The current volume= will - then be provided by the internal cache that stores the last set - volume + * bit 30: ``mixer_get_cur_ok`` + On some devices, whether their GET_CUR being sticky depends on w= hether + hotpluggable components are present. When the hotpluggable compo= nents + are missing on probe, their GET_CUR behavior is classified as br= oken. + Set the flag to prevent the heuristics from gating GET_CUR. * bit 31: ``playback_urb_fixup`` Some devices show the stuttering at playback, and this quirk works around it by enforcing the fixed max URBs (12) instead of diff --git a/sound/usb/mixer.c b/sound/usb/mixer.c index 3aa9a9c12557..ecaa8bc08d7c 100644 --- a/sound/usb/mixer.c +++ b/sound/usb/mixer.c @@ -1447,6 +1447,14 @@ static int get_min_max_with_quirks(struct usb_mixer_= elem_info *cval, } } =20 + /* + * When GET_CUR is sticky, the saved value is bogus, so mixer values set + * by the sanity checks must be discarded through init_cur_mix_raw(). + * After that, we can clear the flag as per QUIRK_FLAG_MIXER_GET_CUR_OK. + */ + if (cval->head.mixer->chip->quirk_flags & QUIRK_FLAG_MIXER_GET_CUR_OK) + cval->get_cur_broken =3D 0; + return 0; } =20 diff --git a/sound/usb/quirks.c b/sound/usb/quirks.c index eb1750def067..b62168a11e32 100644 --- a/sound/usb/quirks.c +++ b/sound/usb/quirks.c @@ -2215,8 +2215,6 @@ static const struct usb_audio_quirk_flags_table quirk= _flags_table[] =3D { QUIRK_FLAG_FORCE_IFACE_RESET | QUIRK_FLAG_IFACE_DELAY), DEVICE_FLG(0x03f0, 0x654a, /* HP 320 FHD Webcam */ QUIRK_FLAG_GET_SAMPLE_RATE | QUIRK_FLAG_MIC_RES_16), - DEVICE_FLG(0x040b, 0x0897, /* Weltrend Semiconductor, sold as Redragon H5= 10-PRO Wireless headset */ - QUIRK_FLAG_MIXER_GET_CUR_BROKEN), DEVICE_FLG(0x041e, 0x3000, /* Creative SB Extigy */ QUIRK_FLAG_IGNORE_CTL_ERROR), DEVICE_FLG(0x041e, 0x4080, /* Creative Live Cam VF0610 */ @@ -2256,8 +2254,6 @@ static const struct usb_audio_quirk_flags_table quirk= _flags_table[] =3D { DEVICE_FLG(0x046d, 0x0a8f, /* Logitech H390 headset */ QUIRK_FLAG_CTL_MSG_DELAY_1M | QUIRK_FLAG_MIXER_PLAYBACK_MIN_MUTE), - DEVICE_FLG(0x046d, 0x0af7, /* Logitech PRO X 2 LIGHTSPEED */ - QUIRK_FLAG_MIXER_GET_CUR_BROKEN), DEVICE_FLG(0x0499, 0x1506, /* Yamaha THR5 */ QUIRK_FLAG_GENERIC_IMPLICIT_FB), DEVICE_FLG(0x0499, 0x1509, /* Steinberg UR22 */ @@ -2329,9 +2325,9 @@ static const struct usb_audio_quirk_flags_table quirk= _flags_table[] =3D { DEVICE_FLG(0x0763, 0x2031, /* M-Audio Fast Track C600 */ QUIRK_FLAG_GENERIC_IMPLICIT_FB), DEVICE_FLG(0x0763, 0x2080, /* M-Audio Fast Track Ultra */ - QUIRK_FLAG_MIXER_GET_CUR_BROKEN | QUIRK_FLAG_GENERIC_IMPLICIT_FB), + QUIRK_FLAG_GENERIC_IMPLICIT_FB), DEVICE_FLG(0x0763, 0x2081, /* M-Audio Fast Track Ultra */ - QUIRK_FLAG_MIXER_GET_CUR_BROKEN | QUIRK_FLAG_GENERIC_IMPLICIT_FB), + QUIRK_FLAG_GENERIC_IMPLICIT_FB), DEVICE_FLG(0x07fd, 0x000b, /* MOTU M Series 2nd hardware revision */ QUIRK_FLAG_CTL_MSG_DELAY_1M), DEVICE_FLG(0x08bb, 0x2702, /* LineX FM Transmitter */ @@ -2370,8 +2366,6 @@ static const struct usb_audio_quirk_flags_table quirk= _flags_table[] =3D { QUIRK_FLAG_SHARE_MEDIA_DEVICE | QUIRK_FLAG_ALIGN_TRANSFER), DEVICE_FLG(0x1038, 0x1294, /* SteelSeries Arctis Pro Wireless */ QUIRK_FLAG_MIXER_PLAYBACK_MIN_MUTE), - DEVICE_FLG(0x1038, 0x2232, /* SteelSeries Arctis Nova 5 */ - QUIRK_FLAG_MIXER_GET_CUR_BROKEN), DEVICE_FLG(0x1101, 0x0003, /* Audioengine D1 */ QUIRK_FLAG_GET_SAMPLE_RATE), DEVICE_FLG(0x12d1, 0x3a07, /* HUAWEI USB-C HEADSET */ @@ -2379,8 +2373,6 @@ static const struct usb_audio_quirk_flags_table quirk= _flags_table[] =3D { QUIRK_FLAG_FORCE_IFACE_RESET | QUIRK_FLAG_IFACE_DELAY), DEVICE_FLG(0x1224, 0x2a25, /* Jieli Technology USB PHY 2.0 */ QUIRK_FLAG_GET_SAMPLE_RATE | QUIRK_FLAG_MIC_RES_16), - DEVICE_FLG(0x1377, 0x6004, /* Sennheiser MOMENTUM 3 */ - QUIRK_FLAG_MIXER_GET_CUR_BROKEN), DEVICE_FLG(0x1395, 0x740a, /* Sennheiser DECT */ QUIRK_FLAG_GET_SAMPLE_RATE), DEVICE_FLG(0x1397, 0x0507, /* Behringer UMC202HD */ @@ -2505,8 +2497,6 @@ static const struct usb_audio_quirk_flags_table quirk= _flags_table[] =3D { QUIRK_FLAG_CTL_MSG_DELAY_1M), DEVICE_FLG(0x2d99, 0x0026, /* HECATE G2 GAMING HEADSET */ QUIRK_FLAG_MIXER_PLAYBACK_MIN_MUTE), - DEVICE_FLG(0x2d99, 0xa024, /* Edifier MF200 */ - QUIRK_FLAG_MIXER_GET_CUR_BROKEN), DEVICE_FLG(0x2fc6, 0xf06b, /* MOONDROP Moonriver2 Ti */ QUIRK_FLAG_CTL_MSG_DELAY), DEVICE_FLG(0x2fc6, 0xf0b5, /* iBasso DC-Elite */ @@ -2647,7 +2637,7 @@ static const char *const snd_usb_audio_quirk_flag_nam= es[] =3D { QUIRK_STRING_ENTRY(MIXER_PLAYBACK_LINEAR_VOL), QUIRK_STRING_ENTRY(MIXER_CAPTURE_LINEAR_VOL), QUIRK_STRING_ENTRY(IFB_SILENCE_ON_EMPTY), - QUIRK_STRING_ENTRY(MIXER_GET_CUR_BROKEN), + QUIRK_STRING_ENTRY(MIXER_GET_CUR_OK), QUIRK_STRING_ENTRY(PLAYBACK_URB_FIXUP), QUIRK_STRING_ENTRY(ALWAYS_SET_RATE), NULL diff --git a/sound/usb/usbaudio.h b/sound/usb/usbaudio.h index abc2d7e579de..24436473931d 100644 --- a/sound/usb/usbaudio.h +++ b/sound/usb/usbaudio.h @@ -243,17 +243,11 @@ extern bool snd_usb_skip_validation; * from snd_usb_handle_sync_urb. Instead fall through and enqueue a * packet_info containing only size-0 packets, so the OUT ring keeps * moving (emits silence). Needed by Behringer Flow 8 (1397:050c). - * QUIRK_FLAG_MIXER_GET_CUR_BROKEN - * Some mixers are sticky, which means that setting their current volume = is a - * no-op, and reading the current volume returns a constant value. The st= icky - * check disables these mixers to prevent confusing userspace. However, s= ome - * devices do have a tunable volume despite the reported current volume b= eing - * constant. As the sticky check can't distinguish between the two catego= ries, - * setting this flag tells that the device should fall into the second - * category when GET_CUR returns a constant value, resulting in the sticky - * check being non-fatal and only disabling GET_CUR instead of the whole = mixer. - * The current volume will then be provided by the internal cache that st= ores - * the last set volume + * QUIRK_FLAG_MIXER_GET_CUR_OK + * On some devices, whether their GET_CUR being sticky depends on whether + * hotpluggable components are present. When the hotpluggable components = are + * missing on probe, their GET_CUR behavior is classified as broken. Set = the + * flag to prevent the heuristics from gating GET_CUR. * QUIRK_FLAG_PLAYBACK_URB_FIXUP * Set URB_ISO_ASAP flag for isochronous URBs and force nurbs to MAX_URBS. * This is needed for devices that exhibit boot-time audio stuttering due @@ -297,7 +291,7 @@ enum { QUIRK_TYPE_MIXER_PLAYBACK_LINEAR_VOL =3D 27, QUIRK_TYPE_MIXER_CAPTURE_LINEAR_VOL =3D 28, QUIRK_TYPE_IFB_SILENCE_ON_EMPTY =3D 29, - QUIRK_TYPE_MIXER_GET_CUR_BROKEN =3D 30, + QUIRK_TYPE_MIXER_GET_CUR_OK =3D 30, QUIRK_TYPE_PLAYBACK_URB_FIXUP =3D 31, QUIRK_TYPE_ALWAYS_SET_RATE =3D 32, /* Please also edit snd_usb_audio_quirk_flag_names and alsa-configuration.= rst */ @@ -335,7 +329,7 @@ enum { #define QUIRK_FLAG_MIXER_PLAYBACK_LINEAR_VOL QUIRK_FLAG(MIXER_PLAYBACK_LIN= EAR_VOL) #define QUIRK_FLAG_MIXER_CAPTURE_LINEAR_VOL QUIRK_FLAG(MIXER_CAPTURE_LINEA= R_VOL) #define QUIRK_FLAG_IFB_SILENCE_ON_EMPTY QUIRK_FLAG(IFB_SILENCE_ON_EMPTY) -#define QUIRK_FLAG_MIXER_GET_CUR_BROKEN QUIRK_FLAG(MIXER_GET_CUR_BROKEN) +#define QUIRK_FLAG_MIXER_GET_CUR_OK QUIRK_FLAG(MIXER_GET_CUR_OK) #define QUIRK_FLAG_PLAYBACK_URB_FIXUP QUIRK_FLAG(PLAYBACK_URB_FIXUP) #define QUIRK_FLAG_ALWAYS_SET_RATE QUIRK_FLAG(ALWAYS_SET_RATE) =20 --=20 2.55.0 From nobody Mon Sep 28 10:56:06 2026 Received: from sender5-op-o12.zoho.com (sender5-op-o12.zoho.com [165.173.182.12]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 29C332D5436; Sat, 22 Aug 2026 18:55:30 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=pass smtp.client-ip=165.173.182.12 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787424932; cv=pass; b=eI+DlKbNX1rPRV+h/5MvT2eI5DRbG58kwdR7HsXHlJqqW9nQqsnhujgeNnGggSEz4XpqzRyWzUy4wwMFXLe7XhYqYxtH7yx+tj0mEeLJPofE4HdUJpOOO2dL69CdP6ycv2b4fnc06nykIsoVPjrgFqaa0CPqvezepEXTO7ODrsk= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787424932; c=relaxed/simple; bh=DtUzewz4kPWCsaEI6F5G3C8sTFGQByZppVyaSTNJogI=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Mmp+ZSzt1IpunmwzBY4lANRagHSCj0sxl9HOHLIHDEkfTrN2EVZ0TKQ7YP+7yh85vswuanueSPiDytCF5tr7GwpOLnWdF5IfF7PBwv/0RJDJpVgTmnDjSyx84mS45uGEa/NtOLgzch0fppOiqzTAFhCrmRqxXxhAfovT5m6OufQ= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=rong.moe; spf=pass smtp.mailfrom=rong.moe; dkim=pass (2048-bit key) header.d=rong.moe header.i=i@rong.moe header.b=dxxV+VuU; arc=pass smtp.client-ip=165.173.182.12 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=rong.moe Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=rong.moe Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=rong.moe header.i=i@rong.moe header.b="dxxV+VuU" ARC-Seal: i=1; a=rsa-sha256; t=1787424797; cv=none; d=zohomail.com; s=zohoarc; b=NrOLy/73bsqy0rF0ewkTpbhm0fEKME1WuhJ6d4IznUreVjVnh68h6LF30mz6Ph1W8MXkvFdgHnqBt6mjsJwq4dUM3GujoMuUxJUb6HB92t86WAURp2v6VZz1bt9/iiRD6AnltFzXzIh70Cw2BGBZ2GZkISQ+Xx/uEwFv3Cuc96Y= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1787424797; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:MIME-Version:Message-ID:Subject:Subject:To:To:Message-Id:Reply-To; bh=q8+AIGPDn/JT1v8hFgnJvEM7aLOu5SjphAk6HaDD/Tw=; b=W2qHA33ZeT7Il3iu16IxpI6jFibcYzIcncOdyV8VkRcqZ4yhOe1Qa8fKly6AShUHNyi2HH4f3buIqx4oRjYemo+oplWkqjcDwe3lraDjchJajns7lsU6fRJ88WQAc3JaCPPdUj/TfJXGxNuX3WF+MKzdlNiegp8eXJkg8N42Dmo= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass header.i=rong.moe; spf=pass smtp.mailfrom=i@rong.moe; dmarc=pass header.from= DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; t=1787424796; s=zmail2048; d=rong.moe; i=i@rong.moe; h=From:From:Date:Date:Subject:Subject:MIME-Version:Content-Type:Content-Transfer-Encoding:Message-Id:Message-Id:In-Reply-To:To:To:Cc:Cc:Reply-To; bh=q8+AIGPDn/JT1v8hFgnJvEM7aLOu5SjphAk6HaDD/Tw=; b=dxxV+VuUFyiHqiQCeAOoT1fvPosqxyHragNEm8gsLZV14Ega0jewmh8nBM5zgvvF ZyLLhZv9yjmA4O+kK4KtK7U/hExLcla+U9DqmY7hzIEPGJiI83xrd4LUxQINhAhB52D KH4B281mqqJBvZogrWELlNGyt/h1FLN2i8VOFV3j5oZkzxIj9G5gJyYkr3WYOXpHk+B FL4WOmBLfMv6KQkQpPbj/l8Irl470txto+Fm4ienDisU6OXOuz01glvH2yChMyMZgnz LmIj8Y+Gr0n9RyqpJOmAC1gqB27RuOTbxJSwAb48o1fIkanv+Dlf14WxW0GM6xwsRNl Od0pFU9V9g== Received: by mx.zohomail.com with SMTPS id 1787424795955118.86889977473345; Sat, 22 Aug 2026 11:53:15 -0700 (PDT) From: Rong Zhang Date: Sun, 23 Aug 2026 02:52:31 +0800 Subject: [PATCH 4/4] ALSA: usb-audio: Add quirk flags for Logitech PRO X Wireless Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260823-uac-demote-sticky-check-v1-4-a8cbe572edff@rong.moe> References: <20260823-uac-demote-sticky-check-v1-0-a8cbe572edff@rong.moe> In-Reply-To: <20260823-uac-demote-sticky-check-v1-0-a8cbe572edff@rong.moe> To: Jaroslav Kysela , Takashi Iwai , Jonathan Corbet , Shuah Khan , Randy Dunlap Cc: Takashi Iwai , linux-sound@vger.kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, Alexander Niemeyer , Rong Zhang X-Mailer: b4 0.17-dev-1f2f7 X-ZohoMailClient: External The Logitech PRO X Wireless is a wireless headset with a hotpluggable microphone. Its Playback mixer's GET_CUR somehow becomes broken when the microphone is detached, so set QUIRK_FLAG_MIXER_GET_CUR_OK to prevent the mixer behavior from depending on whether the microphone is attached. Meanwhile, the Playback mixer's minimum value doesn't work properly, thus set QUIRK_FLAG_MIXER_PLAYBACK_MIN_MUTE to prevent userspace audio stack from using the minimum mixer value to tune volume (setting it when muted is OK). Reported-by: Alexander Niemeyer Closes: https://msgid.link/6262cbbd-d1f2-4c9d-a1c7-9c5d12636f4b@gmx.de Closes: https://msgid.link/7984832b-86f6-4934-bfc0-1ed70218973a@gmx.de Signed-off-by: Rong Zhang --- sound/usb/quirks.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/sound/usb/quirks.c b/sound/usb/quirks.c index b62168a11e32..1e5a261f9c10 100644 --- a/sound/usb/quirks.c +++ b/sound/usb/quirks.c @@ -2254,6 +2254,9 @@ static const struct usb_audio_quirk_flags_table quirk= _flags_table[] =3D { DEVICE_FLG(0x046d, 0x0a8f, /* Logitech H390 headset */ QUIRK_FLAG_CTL_MSG_DELAY_1M | QUIRK_FLAG_MIXER_PLAYBACK_MIN_MUTE), + DEVICE_FLG(0x046d, 0x0aba, /* Logitech PRO X Wireless */ + QUIRK_FLAG_MIXER_GET_CUR_OK | + QUIRK_FLAG_MIXER_PLAYBACK_MIN_MUTE), DEVICE_FLG(0x0499, 0x1506, /* Yamaha THR5 */ QUIRK_FLAG_GENERIC_IMPLICIT_FB), DEVICE_FLG(0x0499, 0x1509, /* Steinberg UR22 */ --=20 2.55.0