From nobody Mon Jun 15 07:39:55 2026 Received: from sender4-op-o15.zoho.com (sender4-op-o15.zoho.com [136.143.188.15]) (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 5628D3B19A3; Wed, 8 Apr 2026 18:33:21 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=pass smtp.client-ip=136.143.188.15 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775673202; cv=pass; b=MMxf5UXPA9M8DDMkRG6mX91PA8KkmLg8DjAKO9IibeHhvJmpL7ojDYwECmahCEM0tY1zhFhMQc83IvbmKmv+Fp5x62Q/eeA956lblg4vUPrjKDpBlCh11SfQRYifcloWXU9AgKAavdfkKmKD0l4elvF13nLtDGRS0d50EO+z/sk= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775673202; c=relaxed/simple; bh=quliLQjJM2E2OgYvwCE4l8TgBV4DWvVexcm8vy8EjP0=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=JZ10MthSwyPz6ZJV6zIU9xFOD1Jg+ohW2VUF/PDzX48PrkMrhMGw8PSO07VsNrxXUiTZllgnNVcObep9Cjhl4Tfe+dbYnZU3qpJeMzj4wRG+658EJvEDEgP5iek5fzx58J1OLSU6IuyiRlmzMj080Gxg15j71/9Mv5Ccsi3LhMA= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none 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=qpew1LW+; arc=pass smtp.client-ip=136.143.188.15 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none 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="qpew1LW+" ARC-Seal: i=1; a=rsa-sha256; t=1775673197; cv=none; d=zohomail.com; s=zohoarc; b=TDgZPksp48XaLaYe7lp5jTmDDiV9JnffSCjfNTNks3jGsLnfkug8Bbqn6yk9lrbh6lISsKni1gRMc/8aLxEG+yYFUhHXAyV9Zo0pWNGM9pRMxDso5HQDhdbfSS8kP62h/xx3R/y+VsUeSVM+5B+ucejbnqEt/sstaliBIHhDmLg= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1775673197; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:MIME-Version:Message-ID:References:Subject:Subject:To:To:Message-Id:Reply-To; bh=l6nJmgHs0o3+4wbNwQhPjKEkvbobXBer1IjDZIve/BI=; b=cKaD1ricYVYTcdx6fOhj8L456FtlsDjlx7HFnxK5nLms2ZpgPP4PRFgl3fgPyXZTzZ+IimnyZvxvwQgOO+gfGrwCqVM44WBQ3IcQfIwB879LvTGYyIbXyuOU1g2hPfqugK8oj8bOt/KlGenaddF5izpeFIzdorj4qOM/ig7byXQ= 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=1775673197; 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:References:In-Reply-To:To:To:Cc:Cc:Reply-To; bh=l6nJmgHs0o3+4wbNwQhPjKEkvbobXBer1IjDZIve/BI=; b=qpew1LW+0+Z0bMFG4JqDVc+tdMvC8Sj4SKJ//Zzewmb293NRtzG6h+v4jpDcS/YT jTjzZmH5lIxtJ/fReRt29i6p6JXXWXgnTpxSpilASWg3doCljrVuCYmsbzgKvdA6KfL 8f6QsO9R8Szf5kdoigicMVtHQlNJyI69bWiL0mS1biuuiA68rwEZM3stjZ5A1J93H7w KlVj0HXhpNh/PWWpPXkqx8RbnPP3I2mFE16aFySdgq61dAJzn3scNNrJq0kJfcMtyqz SSak1Mn0IDSu9Gke8/KUcIcPYXzU3XChYv0oGWfFMVzeKKHZTPSzIFRoBpbvYGTS1FJ 5clqjtdyjA== Received: by mx.zohomail.com with SMTPS id 1775673196898370.7490234954432; Wed, 8 Apr 2026 11:33:16 -0700 (PDT) From: Rong Zhang Date: Thu, 09 Apr 2026 02:33:05 +0800 Subject: [PATCH 1/2] ALSA: usb-audio: Add quirk flags for Feaulle Rainbow 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: <20260409-feaulle-rainbow-v1-1-09179e09000d@rong.moe> References: <20260409-feaulle-rainbow-v1-0-09179e09000d@rong.moe> In-Reply-To: <20260409-feaulle-rainbow-v1-0-09179e09000d@rong.moe> To: Jaroslav Kysela , Takashi Iwai Cc: linux-sound@vger.kernel.org, linux-kernel@vger.kernel.org, Icenowy Zheng , Rong Zhang X-Mailer: b4 0.16-dev-7777e X-ZohoMailClient: External Feaulle Rainbow is a wired USB-C dynamic in-ear monitor (IEM) featuring active noise cancellation (ANC). The supported sample rates are 48000Hz and 96000Hz at 16bit or 24bit, but it does not support reading the current sample rate and results in an error message printed to kmsg. Set QUIRK_FLAG_GET_SAMPLE_RATE to skip the sample rate check. Its playback mixer reports val =3D -15360/0/128. Setting -15360 (-60dB) mutes the playback, so QUIRK_FLAG_MIXER_PLAYBACK_MIN_MUTE is needed. Add a quirk table entry matching VID/PID=3D0x0e0b/0xfa01 and applying the mentioned quirk flags, so that it can work properly. Quirky device sample: usb 7-1: New USB device found, idVendor=3D0e0b, idProduct=3Dfa01, bcdDevi= ce=3D 1.00 usb 7-1: New USB device strings: Mfr=3D1, Product=3D2, SerialNumber=3D3 usb 7-1: Product: Feaulle Rainbow usb 7-1: Manufacturer: Generic usb 7-1: SerialNumber: 20210726905926 Signed-off-by: Rong Zhang --- sound/usb/quirks.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sound/usb/quirks.c b/sound/usb/quirks.c index 48acd8dac689..f73d5d01726e 100644 --- a/sound/usb/quirks.c +++ b/sound/usb/quirks.c @@ -2337,6 +2337,8 @@ static const struct usb_audio_quirk_flags_table quirk= _flags_table[] =3D { QUIRK_FLAG_MIXER_PLAYBACK_MIN_MUTE), DEVICE_FLG(0x0d8c, 0x0014, /* C-Media */ QUIRK_FLAG_CTL_MSG_DELAY_1M | QUIRK_FLAG_MIXER_PLAYBACK_MIN_MUTE), + DEVICE_FLG(0x0e0b, 0xfa01, /* Feaulle Rainbow */ + QUIRK_FLAG_GET_SAMPLE_RATE | QUIRK_FLAG_MIXER_PLAYBACK_MIN_MUTE), DEVICE_FLG(0x0ecb, 0x205c, /* JBL Quantum610 Wireless */ QUIRK_FLAG_FIXED_RATE), DEVICE_FLG(0x0ecb, 0x2069, /* JBL Quantum810 Wireless */ --=20 2.53.0 From nobody Mon Jun 15 07:39:55 2026 Received: from sender4-op-o15.zoho.com (sender4-op-o15.zoho.com [136.143.188.15]) (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 CE07228C87C; Wed, 8 Apr 2026 18:33:22 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=pass smtp.client-ip=136.143.188.15 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775673204; cv=pass; b=em7AmARuPvyg9pYP8WxCNr0GWhe1ldmdzLOJK47j84FgKEudTyd6n3V/BIQPiUqJWIdYvhmS/aFyFmQW+vjXdXJ6GGK/3T+5zc9LzKVbtnvJUVqV2CRUbPNKAYwVZe0hYonZAoPDAU5PJNfDd+wshrOfyYkboUwQIj/kj8MoXKI= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775673204; c=relaxed/simple; bh=xxNFhyT7IqOzBtMkW0QGHNOtyIrF1vPhEYVEZyOy/QQ=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=D5vpFHZ4/EvnY+kQ6nT8FRfVS/FJdlqri02K9sa6eO9GWzGDOdI0Udj0FfUcFijw1OUwwUHon6L0IlSgdXYdf6ytFCRxC3W5mmtggZnpotA2l6JwcEI7MIBcXX9XHF8qgPC161DNYaJB+Ly/J6qV8crbjAoAFGpwOsqyfKivT8o= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none 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=Os8U1POi; arc=pass smtp.client-ip=136.143.188.15 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none 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="Os8U1POi" ARC-Seal: i=1; a=rsa-sha256; t=1775673199; cv=none; d=zohomail.com; s=zohoarc; b=dvwBCTQKjPmCe+V782a7RTPAsmCLV1GXL4JvANDzykBDnGqWxWZSiZTdsyXKnWQWXngR4R47oX2ltpyuzXmr4Nh05uyKs/nnTCgsMs9elJTUB5ySbTAURbcKEP+z5GudfXBAf1hRVfsjQgHtlVVPJbJ81q+URXZqjUsKJ0kYrRA= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1775673199; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:MIME-Version:Message-ID:References:Subject:Subject:To:To:Message-Id:Reply-To; bh=RFy27SApvqF3icQnyxWXdS+v7DCve4qkFZw7zq5B/XA=; b=ejUI8h5Z2SeDixVuCjaIj7/9+wlKw+2a0uQgrIaYf068fSDG2kxLQLTbO4dEmOiQ8flASBgX58xxj0WmFDpXldQ9iHYIakCuTvaFOCc51bKj4Y5s/PrOgUJ77Nk728xkUTbcYFCziYMDANkQlqR+qtCDAlflRcMl++NraFyzMOo= 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=1775673199; 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:References:In-Reply-To:To:To:Cc:Cc:Reply-To; bh=RFy27SApvqF3icQnyxWXdS+v7DCve4qkFZw7zq5B/XA=; b=Os8U1POiV65p8fSW9JRMWp0km8wWmn2jYTNlRD2FfiaodWX7HPB1CXONWCxWt5K+ B8nnV8HOG70zfykLU5otIKM9KNkas0lFoUHn4JoBI1LL8lWealPWbgkZUo6T5R831lU sCgtJlWwrwXjqlKgsDdJweKUcwuS36g2w8OrLMFRcyvXVMq5Y9+AHYvENUJnFQFJk44 IwUS3yheaOovsZ3TsP1VKteXnLIU7kbieO8Im/KR9jmfCP6gGkNPx5A0w3vxMXK2RHT mVliWoEpfRoAZSPTholhWk42O1EUXBdl9N8jZBEErxtXIa36uUcC4M50mWT7qCTP1Fw bF8QWg9Rew== Received: by mx.zohomail.com with SMTPS id 1775673198829885.1559668373858; Wed, 8 Apr 2026 11:33:18 -0700 (PDT) From: Rong Zhang Date: Thu, 09 Apr 2026 02:33:06 +0800 Subject: [PATCH 2/2] ALSA: usb-audio: Do not expose sticky volume control mixers 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: <20260409-feaulle-rainbow-v1-2-09179e09000d@rong.moe> References: <20260409-feaulle-rainbow-v1-0-09179e09000d@rong.moe> In-Reply-To: <20260409-feaulle-rainbow-v1-0-09179e09000d@rong.moe> To: Jaroslav Kysela , Takashi Iwai Cc: linux-sound@vger.kernel.org, linux-kernel@vger.kernel.org, Icenowy Zheng , Rong Zhang X-Mailer: b4 0.16-dev-7777e X-ZohoMailClient: External Some devices expose sticky mixers that accept SET_CUR but do absolutely nothing. Registering mixers for them confuses userspace and results in ineffective volume control. Check if the volume control is sticky by setting the volume to the maximum or minimum value, and prevent the mixer from being registered accordingly. Quirky device sample: usb 7-1: New USB device found, idVendor=3D0e0b, idProduct=3Dfa01, bcdDevi= ce=3D 1.00 usb 7-1: New USB device strings: Mfr=3D1, Product=3D2, SerialNumber=3D3 usb 7-1: Product: Feaulle Rainbow usb 7-1: Manufacturer: Generic usb 7-1: SerialNumber: 20210726905926 (Mic Capture Volume) Signed-off-by: Rong Zhang --- sound/usb/mixer.c | 37 +++++++++++++++++++++++++++++++++++-- 1 file changed, 35 insertions(+), 2 deletions(-) diff --git a/sound/usb/mixer.c b/sound/usb/mixer.c index a25e8145af67..9f0aed36e27d 100644 --- a/sound/usb/mixer.c +++ b/sound/usb/mixer.c @@ -27,6 +27,7 @@ * - parse available sample rates again when clock sources changed */ =20 +#include #include #include #include @@ -1287,17 +1288,49 @@ static int get_min_max_with_quirks(struct usb_mixer= _elem_info *cval, if (cval->res =3D=3D 0) cval->res =3D 1; =20 - /* Additional checks for the proper resolution + /* Additional checks + * + * Some devices expose sticky mixers that accept SET_CUR + * but do absolutely nothing. * * Some devices report smaller resolutions than actually * reacting. They don't return errors but simply clip * to the lower aligned value. */ - if (cval->min + cval->res < cval->max) { + if (cval->min < cval->max) { + int sticky_test_values[] =3D { cval->min, cval->max }; int last_valid_res =3D cval->res; int saved, test, check; + bool effective =3D false; + if (get_cur_mix_raw(cval, minchn, &saved) < 0) goto no_res_check; + + for (i =3D 0; i < ARRAY_SIZE(sticky_test_values); i++) { + test =3D sticky_test_values[i]; + if (test =3D=3D saved) + continue; + /* Assume non-sticky on failure. */ + if (snd_usb_set_cur_mix_value(cval, minchn, 0, test) || + get_cur_mix_raw(cval, minchn, &check) || + check !=3D saved) { /* SET_CUR effective, non-sticky. */ + effective =3D true; + break; + } + } + if (!effective) { + usb_audio_warn(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); + + cval->initialized =3D 1; + cval->min =3D cval->max =3D cval->res =3D 0; + return -ENODEV; + } + + if (cval->min + cval->res >=3D cval->max) + goto no_res_check; for (;;) { test =3D saved; if (test < cval->max) --=20 2.53.0