From nobody Thu Oct 2 10:39:59 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 E5ED731A7EE; Wed, 17 Sep 2025 12:46:42 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758113203; cv=none; b=ZGCqPJkKT3Rog2QvLwhCH8P+/foeWflhFZ+ywdjWrtiWasIGpwlTWY+oJ4XYmNZDQSShUhIR8d9JLGDWvaDTisx7OHQsPzYpzD2Y0Bt6FXPw84kNXDgAxduqKwRud0DOUYDgvTvVHUjnrfe8ADWRiE95MQhl/Qb9PaNyS0lZMRw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758113203; c=relaxed/simple; bh=AfD1lGXGhBJ72syghpA4tAQn0Om1/q15shkj744ZzgI=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=p4N3zksg6Tpjj0AXH6ePp6ja6B7wHcAJk8pEy4YepkCHdxnAgIoa0oIEUynurmZWbU6ATPPhU8BvFog/qOYS0nDpbznPneDruJwzKQxF3l4wdAbWkr2Pj/vVwvOO2P6fEhQU/HnWAJ92mVaYaZF0r6Ur/hN3zvWMrSkhwBXGc7I= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=Vj5k+Yph; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="Vj5k+Yph" Received: by smtp.kernel.org (Postfix) with ESMTPS id AC41CC4CEFA; Wed, 17 Sep 2025 12:46:42 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1758113202; bh=AfD1lGXGhBJ72syghpA4tAQn0Om1/q15shkj744ZzgI=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=Vj5k+Yphr56sNCHBXqT9esXR9AlESbBF0wxmoy7QsOYr+HhWg+GuireDB5tlwEJY4 nObl5tF5MVzPih897kPwXcxjtA/q7540njJoBBcdPWf64RFijIn+qIx3Q+rk7wHXXg Un99KdURDgxgMW4gyn2XhbdEqWPZBqDiKlNemjfkeLpgHJiZvJUG0Fzqb9sblSrNDZ ar3UtrI12yKFS/KiyZDpRYDyhUPLWrLdJUjT7e6RvyklQjy3KQuNG/zVSoWlrV2j4x 77J6Qjqc4Sb6VRfsvfLr+XrGEvQ1az8l5BDPkm5jdnmY6I4iePDC28hYozcuKK5RtA KmSTUc1b5UodQ== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 9B20DCAC59D; Wed, 17 Sep 2025 12:46:42 +0000 (UTC) From: Cryolitia PukNgae via B4 Relay Date: Wed, 17 Sep 2025 20:46:40 +0800 Subject: [PATCH v3 1/4] ALSA: usb-audio: add two-way convert between name and bit for QUIRK_FLAG_* 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: <20250917-sound-v3-1-92ebe9472a0a@uniontech.com> References: <20250917-sound-v3-0-92ebe9472a0a@uniontech.com> In-Reply-To: <20250917-sound-v3-0-92ebe9472a0a@uniontech.com> To: Jaroslav Kysela , Takashi Iwai , Jonathan Corbet , Luis Chamberlain , Petr Pavlu , Daniel Gomez , Sami Tolvanen Cc: linux-sound@vger.kernel.org, linux-usb@vger.kernel.org, linux-kernel@vger.kernel.org, linux-doc@vger.kernel.org, Mingcong Bai , Kexy Biscuit , Nie Cheng , Zhan Jun , Feng Yuan , qaqland , kernel@uniontech.com, linux-modules@vger.kernel.org, Cryolitia PukNgae X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1758113201; l=4063; i=cryolitia@uniontech.com; s=20250730; h=from:subject:message-id; bh=/BXquMWJMNiFdz+nh5s6GogPhAqR6jecE2iPTQLfG8w=; b=x6D1T0dnaqslqTNErkQUMW/JZzMZw/8g8eGhrt2N0pxTGEG8c0o26O5t8Ndzmhc7MF/b0gDYB pVQufyGHG3SC845VblraOLj0EsNrCDk3VuSfqWs2TtrWb0aHY7vqrWE X-Developer-Key: i=cryolitia@uniontech.com; a=ed25519; pk=tZ+U+kQkT45GRGewbMSB4VPmvpD+KkHC/Wv3rMOn/PU= X-Endpoint-Received: by B4 Relay for cryolitia@uniontech.com/20250730 with auth_id=474 X-Original-From: Cryolitia PukNgae Reply-To: cryolitia@uniontech.com From: Cryolitia PukNgae Also improve debug logs for applied quirks Signed-off-by: Cryolitia PukNgae --- sound/usb/quirks.c | 82 ++++++++++++++++++++++++++++++++++++++++++++++++= +--- sound/usb/quirks.h | 3 ++ sound/usb/usbaudio.h | 1 + 3 files changed, 82 insertions(+), 4 deletions(-) diff --git a/sound/usb/quirks.c b/sound/usb/quirks.c index d736a4750356597bfb0f9d5ab01cdaeaac0f907c..94854f352b1702b491e1bf3c8b7= 69f7088e03976 100644 --- a/sound/usb/quirks.c +++ b/sound/usb/quirks.c @@ -2446,6 +2446,62 @@ static const struct usb_audio_quirk_flags_table quir= k_flags_table[] =3D { {} /* terminator */ }; =20 +static const char *const snd_usb_audio_quirk_flag_names[] =3D { + "get_sample_rate", + "share_media_device", + "align_transfer", + "tx_length", + "playback_first", + "skip_clock_selector", + "ignore_clock_source", + "itf_usb_dsd_dac", + "ctl_msg_delay", + "ctl_msg_delay_1m", + "ctl_msg_delay_5m", + "iface_delay", + "validate_rates", + "disable_autosuspend", + "ignore_ctl_error", + "dsd_raw", + "set_iface_first", + "generic_implicit_fb", + "skip_implicit_fb", + "iface_skip_close", + "force_iface_reset", + "fixed_rate", + "mic_res_16", + "mic_res_384", + "mixer_playback_min_mute", + "mixer_capture_min_mute", + NULL +}; + +const char *snd_usb_quirk_flag_find_name(unsigned long index) +{ + if (index >=3D ARRAY_SIZE(snd_usb_audio_quirk_flag_names)) + return NULL; + + return snd_usb_audio_quirk_flag_names[index]; +} + +u32 snd_usb_quirk_flags_from_name(char *name) +{ + u32 flag =3D 0; + u32 i; + + if (!name || !*name) + return 0; + + for (i =3D 0; snd_usb_audio_quirk_flag_names[i]; i++) { + if (strcmp(name, snd_usb_audio_quirk_flag_names[i]) =3D=3D 0) { + flag =3D (1U << i); + break; + } + } + + return flag; +} + void snd_usb_init_quirk_flags(struct snd_usb_audio *chip) { const struct usb_audio_quirk_flags_table *p; @@ -2454,10 +2510,28 @@ void snd_usb_init_quirk_flags(struct snd_usb_audio = *chip) if (chip->usb_id =3D=3D p->id || (!USB_ID_PRODUCT(p->id) && USB_ID_VENDOR(chip->usb_id) =3D=3D USB_ID_VENDOR(p->id))) { - usb_audio_dbg(chip, - "Set quirk_flags 0x%x for device %04x:%04x\n", - p->flags, USB_ID_VENDOR(chip->usb_id), - USB_ID_PRODUCT(chip->usb_id)); + unsigned long flags =3D p->flags; + unsigned long bit; + + for_each_set_bit(bit, &flags, + BYTES_TO_BITS(sizeof(p->flags))) { + const char *name =3D + snd_usb_audio_quirk_flag_names[bit]; + + if (name) + usb_audio_dbg(chip, + "Set quirk flag %s for device %04x:%04x\n", + name, + USB_ID_VENDOR(chip->usb_id), + USB_ID_PRODUCT(chip->usb_id)); + else + usb_audio_warn(chip, + "Set unknown quirk flag 0x%lx for device %04x:%04x\n", + bit, + USB_ID_VENDOR(chip->usb_id), + USB_ID_PRODUCT(chip->usb_id)); + } + chip->quirk_flags |=3D p->flags; return; } diff --git a/sound/usb/quirks.h b/sound/usb/quirks.h index f9bfd5ac7bab01717de3a76227482a128bf73165..bd5baf2b193a1985f3a0e52bf4a= 77ca741364769 100644 --- a/sound/usb/quirks.h +++ b/sound/usb/quirks.h @@ -50,4 +50,7 @@ void snd_usb_audioformat_attributes_quirk(struct snd_usb_= audio *chip, =20 void snd_usb_init_quirk_flags(struct snd_usb_audio *chip); =20 +const char *snd_usb_quirk_flag_find_name(unsigned long flag); +u32 snd_usb_quirk_flags_from_name(char *name); + #endif /* __USBAUDIO_QUIRKS_H */ diff --git a/sound/usb/usbaudio.h b/sound/usb/usbaudio.h index 30b5102e3caed01eeb86d0075c41338104c58950..0a22cb4a02344b2dcf4009c560a= 759f2da25ca67 100644 --- a/sound/usb/usbaudio.h +++ b/sound/usb/usbaudio.h @@ -252,5 +252,6 @@ extern bool snd_usb_skip_validation; #define QUIRK_FLAG_MIC_RES_384 (1U << 23) #define QUIRK_FLAG_MIXER_PLAYBACK_MIN_MUTE (1U << 24) #define QUIRK_FLAG_MIXER_CAPTURE_MIN_MUTE (1U << 25) +/* Please also edit snd_usb_audio_quirk_flag_names */ =20 #endif /* __USBAUDIO_H */ --=20 2.51.0 From nobody Thu Oct 2 10:39:59 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 EDBE82F7ABF; Wed, 17 Sep 2025 12:46:42 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758113203; cv=none; b=u4cQXcwLqB6ZZ/1MI4en8Vj/aVo5IpmqXmOvtak3TuDAEncLx0Bruz8beFVOnNAvoGGqgakXA2LcFb6xedWewheo7bEkLdHjkPeisX7OdFAkEbeX7SJhsj77FrqDqQ8P6iWM4riGbKm+83qI95ggLmsstnAQ9DM1T5bTNAYPWRE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758113203; c=relaxed/simple; bh=0AYh4Kq94+K9Q9GhBTgVtjkUCdxvjg6DMvyhydU1efM=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=XnmOkcZZWAFYp0UWJ6vH4wHjeSA3/dYYEH/kIf2PQ0tXsJpladBy5qj1mD6/DYE6rrK72nLpEC2iv4D0obiA/OqzoTD7ZZh/kwXQyGBeJUxe0e9lngvVrKDErtyZrylYSffHYDxFyZIbI0DxyHdQI93oGzuXdXVefJxlBY5mOgE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=NWle+E5w; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="NWle+E5w" Received: by smtp.kernel.org (Postfix) with ESMTPS id BA498C4CEFB; Wed, 17 Sep 2025 12:46:42 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1758113202; bh=0AYh4Kq94+K9Q9GhBTgVtjkUCdxvjg6DMvyhydU1efM=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=NWle+E5wXetBRQRYLhnQzOhklLQx0VhOwzFXt9HFfNkVmenmQUe67VJem66I1rPVh daA01cICLzz0Yv47vXsTcSYvLz2cXxXlM4mINFARpLf0KH7W/f5oR6nuBHXbot9l+l QSOsr0NxQ8IMFfosK0/nGRKd9uQYS8DnVgg4z49QeOh82uRVh06uAACxB8bCu45bA/ +okrwlZJajoon0vCW20CK2nsBJ/NxzF9QziyRdyyp2JhM1+tJOH8O5xVdc+7aTq+sv ppC0PoM/kpTZW2SrkSt1h4jQX4QoDmdZ2JGZMYxWv+628dvVkFGO8TsVW1n8u0bGNB 9XZUk048We4wg== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id AC6B8CAC5A0; Wed, 17 Sep 2025 12:46:42 +0000 (UTC) From: Cryolitia PukNgae via B4 Relay Date: Wed, 17 Sep 2025 20:46:41 +0800 Subject: [PATCH v3 2/4] param: export param_array related functions 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: <20250917-sound-v3-2-92ebe9472a0a@uniontech.com> References: <20250917-sound-v3-0-92ebe9472a0a@uniontech.com> In-Reply-To: <20250917-sound-v3-0-92ebe9472a0a@uniontech.com> To: Jaroslav Kysela , Takashi Iwai , Jonathan Corbet , Luis Chamberlain , Petr Pavlu , Daniel Gomez , Sami Tolvanen Cc: linux-sound@vger.kernel.org, linux-usb@vger.kernel.org, linux-kernel@vger.kernel.org, linux-doc@vger.kernel.org, Mingcong Bai , Kexy Biscuit , Nie Cheng , Zhan Jun , Feng Yuan , qaqland , kernel@uniontech.com, linux-modules@vger.kernel.org, Cryolitia PukNgae X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1758113201; l=2799; i=cryolitia@uniontech.com; s=20250730; h=from:subject:message-id; bh=Iu09dllz6TNtY0M5KhKHic/tph0IN8w4KA3fww/CJfM=; b=xHObROBLoDrbEdXtHH8AJIwWIJ1HQ9WuXZhRlRJnP/H9QWTFWCK0FutgCIqkRq/slWPyyu8rJ jmJhyYrMp9EC0o3yyOy7Cuj65GSLy6YUpc8fSNy1zp9eey5XqDTpEd6 X-Developer-Key: i=cryolitia@uniontech.com; a=ed25519; pk=tZ+U+kQkT45GRGewbMSB4VPmvpD+KkHC/Wv3rMOn/PU= X-Endpoint-Received: by B4 Relay for cryolitia@uniontech.com/20250730 with auth_id=474 X-Original-From: Cryolitia PukNgae Reply-To: cryolitia@uniontech.com From: Cryolitia PukNgae - int param_array_set(const char *val, const struct kernel_param *kp); - int param_array_get(char *buffer, const struct kernel_param *kp); - void param_array_free(void *arg); It would be helpful for the new module param we designed in snd_usb_audio, in order to run additional custom codes when params are set in runtime, and re-use the extisted codes in param.c Signed-off-by: Cryolitia PukNgae --- include/linux/moduleparam.h | 3 +++ kernel/params.c | 9 ++++++--- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/include/linux/moduleparam.h b/include/linux/moduleparam.h index 3a25122d83e2802e6e6a1475a52816251498b26a..4ef09ad2004789855bd21783029= c653fac94b9dd 100644 --- a/include/linux/moduleparam.h +++ b/include/linux/moduleparam.h @@ -593,6 +593,9 @@ enum hwparam_type { =20 =20 extern const struct kernel_param_ops param_array_ops; +extern int param_array_set(const char *val, const struct kernel_param *kp); +extern int param_array_get(char *buffer, const struct kernel_param *kp); +extern void param_array_free(void *arg); =20 extern const struct kernel_param_ops param_ops_string; extern int param_set_copystring(const char *val, const struct kernel_param= *); diff --git a/kernel/params.c b/kernel/params.c index b96cfd693c9968012d42acb85611fee1acd47790..a936e018a1c6d0bf2b6b4566f80= 751840366f652 100644 --- a/kernel/params.c +++ b/kernel/params.c @@ -462,7 +462,7 @@ static int param_array(struct module *mod, return 0; } =20 -static int param_array_set(const char *val, const struct kernel_param *kp) +int param_array_set(const char *val, const struct kernel_param *kp) { const struct kparam_array *arr =3D kp->arr; unsigned int temp_num; @@ -471,8 +471,9 @@ static int param_array_set(const char *val, const struc= t kernel_param *kp) arr->elemsize, arr->ops->set, kp->level, arr->num ?: &temp_num); } +EXPORT_SYMBOL(param_array_set); =20 -static int param_array_get(char *buffer, const struct kernel_param *kp) +int param_array_get(char *buffer, const struct kernel_param *kp) { int i, off, ret; const struct kparam_array *arr =3D kp->arr; @@ -492,8 +493,9 @@ static int param_array_get(char *buffer, const struct k= ernel_param *kp) buffer[off] =3D '\0'; return off; } +EXPORT_SYMBOL(param_array_get); =20 -static void param_array_free(void *arg) +void param_array_free(void *arg) { unsigned int i; const struct kparam_array *arr =3D arg; @@ -502,6 +504,7 @@ static void param_array_free(void *arg) for (i =3D 0; i < (arr->num ? *arr->num : arr->max); i++) arr->ops->free(arr->elem + arr->elemsize * i); } +EXPORT_SYMBOL(param_array_free); =20 const struct kernel_param_ops param_array_ops =3D { .set =3D param_array_set, --=20 2.51.0 From nobody Thu Oct 2 10:39:59 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 0DDE131A818; Wed, 17 Sep 2025 12:46:42 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758113203; cv=none; b=B72EKGolLe46OtsHdFRnHRwzPMLN5gHEIDYHfZ1LsfP2Zp16ACGB5GbrZJgQixz5/dWpbMN7DUJ+KPR3rtNhGY359IDEbDEMnFFgPzxUsEc1/W3xGZ3CjAM1RFkUEBClR4E265mfwA1vcOjUM1lB18s63grDFMqkPOWxB/eg9JY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758113203; c=relaxed/simple; bh=QGfCj+hv3bpWcJg21PQm2lrKAx7uvxOezABFhsG8zWA=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=pLXYE1x/Gt4Juj1uhKfepZbihlILVRT9cM5tM28jT6PAVrJmPKeHopiwsvvscH/wO8LBvgIYGlN1p9PWGknSUztz9rr50cN/5S3V28EZifEnv81AxnEKRaT5TP3uwbBcmiFl4FUtNd1pjS2nwZrqN/u2fw/nB/K3c0WL9W9qu0k= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=bEETsYs/; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="bEETsYs/" Received: by smtp.kernel.org (Postfix) with ESMTPS id C4B13C4CEFD; Wed, 17 Sep 2025 12:46:42 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1758113202; bh=QGfCj+hv3bpWcJg21PQm2lrKAx7uvxOezABFhsG8zWA=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=bEETsYs/kY/4ngjlmDlI/IoVGPZELXlg2Pl2EF2gMm0uAnQ7CvSnnrK6JVwKe4WpX +N/6SM4ysONGXjrfP6X/DEz4N87vRSdaiD3OC8H3QZ+IH/OeF87PwPRSpEHdwc+6+Y kd2Fl5GigCjs8774vvmiTozX4p7HcFM/867DdSIyD+ERSA9kAhL9Bgc+BFgDJnGOJd /7uM22E5xSwE7pS317qmD0nKz584gtFE9OtVP+FB4syNo5LKmKcQmMHEWVWuecXy4F Ffzhn+ohu9OeghhxSbGYJDoVgvQzwcILjl1V27JYZTsdNUeEEwoqxwEw+L8X/nDk03 bcEibLuNhB3PQ== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id BB129CAC59A; Wed, 17 Sep 2025 12:46:42 +0000 (UTC) From: Cryolitia PukNgae via B4 Relay Date: Wed, 17 Sep 2025 20:46:42 +0800 Subject: [PATCH v3 3/4] ALSA: usb-audio: add module param device_quirk_flags 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: <20250917-sound-v3-3-92ebe9472a0a@uniontech.com> References: <20250917-sound-v3-0-92ebe9472a0a@uniontech.com> In-Reply-To: <20250917-sound-v3-0-92ebe9472a0a@uniontech.com> To: Jaroslav Kysela , Takashi Iwai , Jonathan Corbet , Luis Chamberlain , Petr Pavlu , Daniel Gomez , Sami Tolvanen Cc: linux-sound@vger.kernel.org, linux-usb@vger.kernel.org, linux-kernel@vger.kernel.org, linux-doc@vger.kernel.org, Mingcong Bai , Kexy Biscuit , Nie Cheng , Zhan Jun , Feng Yuan , qaqland , kernel@uniontech.com, linux-modules@vger.kernel.org, Cryolitia PukNgae , Takashi Iwai X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1758113201; l=9508; i=cryolitia@uniontech.com; s=20250730; h=from:subject:message-id; bh=/Z2DTz0F8Oc71Kb9EfIDDsfeAKHXwOPCabkVyFCDtuY=; b=VY0JsmOp90Ai7RzBnpH6c6n7l58BaGwbR7SCLHciQUzCyFH32yreslfuNCQg81sBkmlkoGMm/ ytgr8o0KWIdBP2uIxAswHak9bxc1/hUiWeRm//zzOx4xcGMtddBubAe X-Developer-Key: i=cryolitia@uniontech.com; a=ed25519; pk=tZ+U+kQkT45GRGewbMSB4VPmvpD+KkHC/Wv3rMOn/PU= X-Endpoint-Received: by B4 Relay for cryolitia@uniontech.com/20250730 with auth_id=474 X-Original-From: Cryolitia PukNgae Reply-To: cryolitia@uniontech.com From: Cryolitia PukNgae For apply and unapply quirk flags more flexibly though param and sysfs Co-developed-by: Takashi Iwai Signed-off-by: Cryolitia PukNgae --- sound/usb/card.c | 177 +++++++++++++++++++++++++++++++++++++++++++++++= +--- sound/usb/quirks.c | 41 ++++++++++++ sound/usb/quirks.h | 2 + sound/usb/usbaudio.h | 14 ++++ 4 files changed, 226 insertions(+), 8 deletions(-) diff --git a/sound/usb/card.c b/sound/usb/card.c index 0265206a8e8cf31133e8463c98fe0497d8ace89e..743aae910cfdf540c6677c68460= 61754f36a8c1b 100644 --- a/sound/usb/card.c +++ b/sound/usb/card.c @@ -73,8 +73,8 @@ static bool lowlatency =3D true; static char *quirk_alias[SNDRV_CARDS]; static char *delayed_register[SNDRV_CARDS]; static bool implicit_fb[SNDRV_CARDS]; -static unsigned int quirk_flags[SNDRV_CARDS]; =20 +char *quirk_flags[SNDRV_CARDS]; bool snd_usb_use_vmalloc =3D true; bool snd_usb_skip_validation; =20 @@ -103,13 +103,161 @@ module_param_array(delayed_register, charp, NULL, 04= 44); MODULE_PARM_DESC(delayed_register, "Quirk for delayed registration, given = by id:iface, e.g. 0123abcd:4."); module_param_array(implicit_fb, bool, NULL, 0444); MODULE_PARM_DESC(implicit_fb, "Apply generic implicit feedback sync mode."= ); -module_param_array(quirk_flags, uint, NULL, 0444); -MODULE_PARM_DESC(quirk_flags, "Driver quirk bit flags."); module_param_named(use_vmalloc, snd_usb_use_vmalloc, bool, 0444); MODULE_PARM_DESC(use_vmalloc, "Use vmalloc for PCM intermediate buffers (d= efault: yes)."); module_param_named(skip_validation, snd_usb_skip_validation, bool, 0444); MODULE_PARM_DESC(skip_validation, "Skip unit descriptor validation (defaul= t: no)."); =20 +DEFINE_MUTEX(device_quirk_mutex); /* protects quirk_flags && device_quirk_= list */ +LIST_HEAD(device_quirk_list); + +static void free_device_quirk_list(void) +{ + struct device_quirk_entry *pos, *tmp; + + list_for_each_entry_safe(pos, tmp, &device_quirk_list, list) { + list_del(&pos->list); + kfree(pos); + } +} + +static int device_quirks_param_set(const char *value, + const struct kernel_param *kp) +{ + u32 mask_flags, unmask_flags, bit; + struct device_quirk_entry *data; + char *val, *p, *field, *flag; + bool is_unmask; + u16 vid, pid; + int err =3D 0; + size_t i; + + mutex_lock(&device_quirk_mutex); + + memset(quirk_flags, 0, sizeof(quirk_flags)); + + err =3D param_array_set(value, kp); + if (err) + goto unlock; + + free_device_quirk_list(); + + for (i =3D 0; i < ARRAY_SIZE(quirk_flags); i++) { + if (!quirk_flags[i] || !*quirk_flags[i]) + break; + + val =3D kstrdup(quirk_flags[i], GFP_KERNEL); + + if (!val) { + err =3D -ENOMEM; + goto unlock; + } + + for (p =3D val; p && *p;) { + /* Each entry consists of VID:PID:flags */ + field =3D strsep(&p, ":"); + if (!field) + break; + + if (strcmp(field, "*") =3D=3D 0) + vid =3D 0; + else if (kstrtou16(field, 16, &vid)) + break; + + field =3D strsep(&p, ":"); + if (!field) + break; + + if (strcmp(field, "*") =3D=3D 0) + pid =3D 0; + else if (kstrtou16(field, 16, &pid)) + break; + + field =3D strsep(&p, ";"); + if (!field || !*field) + break; + + /* Collect the flags */ + mask_flags =3D 0; + unmask_flags =3D 0; + while (field && *field) { + flag =3D strsep(&field, "|"); + + if (!flag) + break; + + if (*flag =3D=3D '!') { + is_unmask =3D true; + flag++; + } else { + is_unmask =3D false; + } + + if (!kstrtou32(flag, 16, &bit)) { + if (is_unmask) + unmask_flags |=3D bit; + else + mask_flags |=3D bit; + + break; + } + + bit =3D snd_usb_quirk_flags_from_name(flag); + + if (bit) { + if (is_unmask) + unmask_flags |=3D bit; + else + mask_flags |=3D bit; + } else { + pr_warn("snd_usb_audio: unknown flag %s while parsing param device_qu= irk_flags\n", + field); + } + } + + data =3D kzalloc(sizeof(*data), GFP_KERNEL); + + if (!data) { + kfree(val); + err =3D -ENOMEM; + goto unlock; + } + + data->vid =3D vid; + data->pid =3D pid; + data->mask_flags =3D mask_flags; + data->unmask_flags =3D unmask_flags; + + INIT_LIST_HEAD(&data->list); + list_add(&data->list, &device_quirk_list); + } + + kfree(val); + } + +unlock: + mutex_unlock(&device_quirk_mutex); + return err; +} + +static const struct kernel_param_ops quirk_flags_param_ops =3D { + .set =3D device_quirks_param_set, + .get =3D param_array_get, + .free =3D param_array_free, +}; + +static struct kparam_array quirk_flags_param_array =3D { + .max =3D SNDRV_CARDS, + .elemsize =3D sizeof(char *), + .num =3D NULL, + .ops =3D ¶m_ops_charp, + .elem =3D &quirk_flags, +}; + +device_param_cb(quirk_flags, &quirk_flags_param_ops, &quirk_flags_param_ar= ray, + 0644); +MODULE_PARM_DESC(quirk_flags, "Add/modify USB audio quirks"); + /* * we keep the snd_usb_audio_t instances by ourselves for merging * the all interfaces on the same card as one sound device. @@ -750,10 +898,7 @@ static int snd_usb_audio_create(struct usb_interface *= intf, INIT_LIST_HEAD(&chip->midi_v2_list); INIT_LIST_HEAD(&chip->mixer_list); =20 - if (quirk_flags[idx]) - chip->quirk_flags =3D quirk_flags[idx]; - else - snd_usb_init_quirk_flags(chip); + snd_usb_init_dynamic_quirks(idx, chip); =20 card->private_free =3D snd_usb_audio_free; =20 @@ -1290,4 +1435,20 @@ static struct usb_driver usb_audio_driver =3D { .supports_autosuspend =3D 1, }; =20 -module_usb_driver(usb_audio_driver); +static int __init usb_audio_init(void) +{ + return usb_register_driver(&usb_audio_driver, THIS_MODULE, + KBUILD_MODNAME); +} + +static void __exit usb_audio_exit(void) +{ + mutex_lock(&device_quirk_mutex); + free_device_quirk_list(); + mutex_unlock(&device_quirk_mutex); + + usb_deregister(&usb_audio_driver); +} + +module_init(usb_audio_init); +module_exit(usb_audio_exit); diff --git a/sound/usb/quirks.c b/sound/usb/quirks.c index 94854f352b1702b491e1bf3c8b769f7088e03976..ee531ffa5ab13ac8b24c670e652= 9d3811f927b46 100644 --- a/sound/usb/quirks.c +++ b/sound/usb/quirks.c @@ -2537,3 +2537,44 @@ void snd_usb_init_quirk_flags(struct snd_usb_audio *= chip) } } } + +void snd_usb_init_dynamic_quirks(int idx, struct snd_usb_audio *chip) +{ + u16 vid =3D USB_ID_VENDOR(chip->usb_id); + u16 pid =3D USB_ID_PRODUCT(chip->usb_id); + struct device_quirk_entry *pos; + + mutex_lock(&device_quirk_mutex); + + /* old style option found: the position-based integer value */ + if (quirk_flags[idx] && + !kstrtou32(quirk_flags[idx], 0, &chip->quirk_flags)) { + usb_audio_dbg(chip, + "Set quirk flags 0x%x from param based on position %d for device = %04x:%04x\n", + chip->quirk_flags, idx, + USB_ID_VENDOR(chip->usb_id), + USB_ID_PRODUCT(chip->usb_id)); + + mutex_unlock(&device_quirk_mutex); + return; + } + + /* take the default quirk from the quirk table */ + snd_usb_init_quirk_flags(chip); + + /* add or correct quirk bits from options */ + list_for_each_entry(pos, &device_quirk_list, list) { + if (pos->vid =3D=3D 0 || (vid =3D=3D pos->vid && pos->pid =3D=3D 0) || + (vid =3D=3D pos->vid && pid =3D=3D pos->pid)) { + chip->quirk_flags |=3D pos->mask_flags; + chip->quirk_flags &=3D ~pos->unmask_flags; + usb_audio_dbg(chip, + "Set mask quirk flag 0x%x and unmask quirk flag 0x%x from param = for device %04x:%04x\n", + pos->mask_flags, pos->unmask_flags, + USB_ID_VENDOR(chip->usb_id), + USB_ID_PRODUCT(chip->usb_id)); + } + } + + mutex_unlock(&device_quirk_mutex); +} diff --git a/sound/usb/quirks.h b/sound/usb/quirks.h index bd5baf2b193a1985f3a0e52bf4a77ca741364769..00c2852c4769d0790a9e2a31b92= f3414767c9a98 100644 --- a/sound/usb/quirks.h +++ b/sound/usb/quirks.h @@ -53,4 +53,6 @@ void snd_usb_init_quirk_flags(struct snd_usb_audio *chip); const char *snd_usb_quirk_flag_find_name(unsigned long flag); u32 snd_usb_quirk_flags_from_name(char *name); =20 +void snd_usb_init_dynamic_quirks(int idx, struct snd_usb_audio *chip); + #endif /* __USBAUDIO_QUIRKS_H */ diff --git a/sound/usb/usbaudio.h b/sound/usb/usbaudio.h index 0a22cb4a02344b2dcf4009c560a759f2da25ca67..3d09d4b7950d884a2076fa48f21= 80a5e7c87cb3a 100644 --- a/sound/usb/usbaudio.h +++ b/sound/usb/usbaudio.h @@ -7,6 +7,8 @@ * Copyright (c) 2002 by Takashi Iwai */ =20 + #include + /* handling of USB vendor/product ID pairs as 32-bit numbers */ #define USB_ID(vendor, product) (((unsigned int)(vendor) << 16) | (product= )) #define USB_ID_VENDOR(id) ((id) >> 16) @@ -162,9 +164,13 @@ DEFINE_CLASS(snd_usb_lock, struct __snd_usb_lock, __snd_usb_unlock_shutdown(&(_T)), __snd_usb_lock_shutdown(chip), struct snd_usb_audio *chip) =20 +extern char *quirk_flags[SNDRV_CARDS]; extern bool snd_usb_use_vmalloc; extern bool snd_usb_skip_validation; =20 +extern struct mutex device_quirk_mutex; +extern struct list_head device_quirk_list; + /* * Driver behavior quirk flags, stored in chip->quirk_flags * @@ -254,4 +260,12 @@ extern bool snd_usb_skip_validation; #define QUIRK_FLAG_MIXER_CAPTURE_MIN_MUTE (1U << 25) /* Please also edit snd_usb_audio_quirk_flag_names */ =20 +struct device_quirk_entry { + struct list_head list; + u16 vid; + u16 pid; + u32 mask_flags; + u32 unmask_flags; +}; + #endif /* __USBAUDIO_H */ --=20 2.51.0 From nobody Thu Oct 2 10:39:59 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 0DD6931A812; Wed, 17 Sep 2025 12:46:42 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758113203; cv=none; b=te8EmfMpjKWdVWMcmKzGMoQeJC5fPP+pEmTcfGNhOFSNmpKda7x6JqqDFOSQMH9Krw84InRIiM540LBpdk7Wkea70UICEKwlQYslTgM1vh5d/NAQlQVear58ifk6WKIoIaH27aTT+lwNmH8gnAOb3kIS1io3tQj9EHJda5piX6c= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758113203; c=relaxed/simple; bh=4m09HVxeWOmfLkoOABM2Z8FAF12xRU3thrbn9gHjaNE=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=K1kNISI/iTc0/Jv0HIH5lnCJh9GUZPIBpjoUtMCq8H4DmqRp4jpHAObX08j6oZOB/H8pMS+AA/JfNJlFso49AXbUT1CT0KXTcnJ/weeiTABrzrRmjUX3fWVD8ayHAWPl2KKz6cTl63QAqcEoEtonDXHtGP7ZaHgApsdr8SnogVE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=T3Uy6JTX; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="T3Uy6JTX" Received: by smtp.kernel.org (Postfix) with ESMTPS id D12B3C113D0; Wed, 17 Sep 2025 12:46:42 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1758113202; bh=4m09HVxeWOmfLkoOABM2Z8FAF12xRU3thrbn9gHjaNE=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=T3Uy6JTXmXOdWE1jCViAWmbalx94XMPubKal1ngWRnwRZQxn6OHyjSbdLB55wDegq kwchp2jtqAgCLwibxdJkjtvSqeecNCkH2SpvfIeIuRJIykV9vaukIyeD4EJtwslAnO pP+RLtBLQqWYYZ7PEA7+8xXnOTIqBUt8jK2xZEOu9HAslESlIYyn8w2dgP6rzsdeaj B45/r22U1wKIajoKPQ98QtyzkDbbgiZXJA1Lwxn+cKmx5xwzWTzntn4V8KlLtYgKEq teRsCETM/VFkarkjmGp+7NDu0VRFkkIf/VPqCO+LklYwDn80uH0/f8VMYOzrwBx+X5 Vd+nIwH5l6mmw== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id C8511CAC59D; Wed, 17 Sep 2025 12:46:42 +0000 (UTC) From: Cryolitia PukNgae via B4 Relay Date: Wed, 17 Sep 2025 20:46:43 +0800 Subject: [PATCH v3 4/4] ALSA: doc: add docs about device_device_quirk_flags in snd-usb-audio 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: <20250917-sound-v3-4-92ebe9472a0a@uniontech.com> References: <20250917-sound-v3-0-92ebe9472a0a@uniontech.com> In-Reply-To: <20250917-sound-v3-0-92ebe9472a0a@uniontech.com> To: Jaroslav Kysela , Takashi Iwai , Jonathan Corbet , Luis Chamberlain , Petr Pavlu , Daniel Gomez , Sami Tolvanen Cc: linux-sound@vger.kernel.org, linux-usb@vger.kernel.org, linux-kernel@vger.kernel.org, linux-doc@vger.kernel.org, Mingcong Bai , Kexy Biscuit , Nie Cheng , Zhan Jun , Feng Yuan , qaqland , kernel@uniontech.com, linux-modules@vger.kernel.org, Cryolitia PukNgae X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1758113201; l=7243; i=cryolitia@uniontech.com; s=20250730; h=from:subject:message-id; bh=FrGLJBJnqo9zN6+xgDNO+WYVjRiKsb3cKaYsHmjiH7E=; b=gE/1lcbGSKLIyPWnGhSWN9s4EGeSj22aOYnwzSYGBlHiz/h4eoEflKVPMBXlJbVITGCM5tsKK 2SPYbCo7t7dB5hFGmA2W+zwcRfvQsES/Bs2Y7C1hW+2eqgK2UiC7rOs X-Developer-Key: i=cryolitia@uniontech.com; a=ed25519; pk=tZ+U+kQkT45GRGewbMSB4VPmvpD+KkHC/Wv3rMOn/PU= X-Endpoint-Received: by B4 Relay for cryolitia@uniontech.com/20250730 with auth_id=474 X-Original-From: Cryolitia PukNgae Reply-To: cryolitia@uniontech.com From: Cryolitia PukNgae Just briefly described about the new option. Signed-off-by: Cryolitia PukNgae --- Documentation/sound/alsa-configuration.rst | 112 ++++++++++++++++++++-----= ---- 1 file changed, 77 insertions(+), 35 deletions(-) diff --git a/Documentation/sound/alsa-configuration.rst b/Documentation/sou= nd/alsa-configuration.rst index a2fb8ed251dd0294e7a62209ca15d5c32c6adfae..23ee37f24ff89a983b3dffe6312= 057cd84b8f579 100644 --- a/Documentation/sound/alsa-configuration.rst +++ b/Documentation/sound/alsa-configuration.rst @@ -2297,39 +2297,81 @@ skip_validation of the unit descriptor instead of a driver probe error, so that we can check its details. quirk_flags - Contains the bit flags for various device specific workarounds. - Applied to the corresponding card index. - - * bit 0: Skip reading sample rate for devices - * bit 1: Create Media Controller API entries - * bit 2: Allow alignment on audio sub-slot at transfer - * bit 3: Add length specifier to transfers - * bit 4: Start playback stream at first in implement feedback mode - * bit 5: Skip clock selector setup - * bit 6: Ignore errors from clock source search - * bit 7: Indicates ITF-USB DSD based DACs - * bit 8: Add a delay of 20ms at each control message handling - * bit 9: Add a delay of 1-2ms at each control message handling - * bit 10: Add a delay of 5-6ms at each control message handling - * bit 11: Add a delay of 50ms at each interface setup - * bit 12: Perform sample rate validations at probe - * bit 13: Disable runtime PM autosuspend - * bit 14: Ignore errors for mixer access - * bit 15: Support generic DSD raw U32_BE format - * bit 16: Set up the interface at first like UAC1 - * bit 17: Apply the generic implicit feedback sync mode - * bit 18: Don't apply implicit feedback sync mode - * bit 19: Don't closed interface during setting sample rate - * bit 20: Force an interface reset whenever stopping & restarting - a stream - * bit 21: Do not set PCM rate (frequency) when only one rate is - available for the given endpoint. - * bit 22: Set the fixed resolution 16 for Mic Capture Volume - * bit 23: Set the fixed resolution 384 for Mic Capture Volume - * bit 24: Set minimum volume control value as mute for devices - where the lowest playback value represents muted state instead - of minimum audible volume - * bit 25: Be similar to bit 24 but for capture streams + The option provides a refined and flexible control for applying quirk + flags. It allows to specify the quirk flags for each device, and could + be modified dynamically via sysfs. + The old usage accepts an array of integers, each of which apply quirk + flags on the device in the order of probing. + e.g. ``quirk_flags=3D0x01,0x02`` applies get_sample_rate to the first + device, and share_media_device to the second device. + The new usage accepts a string in the format of + ``VID1:PID1:FLAGS1;VID2:PID2:FLAGS2;...``, where ``VIDx`` and ``PIDx`` + specify the device, and ``FLAGSx`` specify the flags to be applied. + ``VIDx`` and ``PIDx`` are 4-digit hexadecimal numbers, and could be + specified as ``*`` to match any value. ``FLAGSx`` could be a set of + flags given by name, separated by ``|``, or a hexadecimal number + representing the bit flags. The available flag names are listed above. + An exclamation mark could be prefixed to a flag name to negate the fla= g. + For example, ``1234:abcd:mixer_playback_min_mute|!ignore_ctl_error;*:*= :0x01;`` + 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. + + * bit 0: ``get_sample_rate`` + Skip reading sample rate for devices + * bit 1: ``share_media_device`` + Create Media Controller API entries + * bit 2: ``align_transfer`` + Allow alignment on audio sub-slot at transfer + * bit 3: ``tx_length`` + Add length specifier to transfers + * bit 4: ``playback_first`` + Start playback stream at first in implement feedback mode + * bit 5: ``skip_clock_selector`` + Skip clock selector setup + * bit 6: ``ignore_clock_source`` + Ignore errors from clock source search + * bit 7: ``itf_usb_dsd_dac`` + Indicates ITF-USB DSD based DACs + * bit 8: ``ctl_msg_delay`` + Add a delay of 20ms at each control message handling + * bit 9: ``ctl_msg_delay_1m`` + Add a delay of 1-2ms at each control message handling + * bit 10: ``ctl_msg_delay_5m`` + Add a delay of 5-6ms at each control message handling + * bit 11: ``iface_delay`` + Add a delay of 50ms at each interface setup + * bit 12: ``validate_rates`` + Perform sample rate validations at probe + * bit 13: ``disable_autosuspend`` + Disable runtime PM autosuspend + * bit 14: ``ignore_ctl_error`` + Ignore errors for mixer access + * bit 15: ``dsd_raw`` + Support generic DSD raw U32_BE format + * bit 16: ``set_iface_first`` + Set up the interface at first like UAC1 + * bit 17: ``generic_implicit_fb`` + Apply the generic implicit feedback sync mode + * bit 18: ``skip_implicit_fb`` + Don't apply implicit feedback sync mode + * bit 19: ``iface_skip_close`` + Don't closed interface during setting sample rate + * bit 20: ``force_iface_reset`` + Force an interface reset whenever stopping & restarting a stream + * bit 21: ``fixed_rate`` + Do not set PCM rate (frequency) when only one rate is available + for the given endpoint + * bit 22: ``mic_res_16`` + Set the fixed resolution 16 for Mic Capture Volume + * bit 23: ``mic_res_384`` + Set the fixed resolution 384 for Mic Capture Volume + * bit 24: ``mixer_playback_min_mute`` + Set minimum volume control value as mute for devices where the + lowest playback value represents muted state instead of minimum + audible volume + * bit 25: ``mixer_capture_min_mute`` + Be similar to bit 24 but for capture streams =20 This module supports multiple devices, autoprobe and hotplugging. =20 @@ -2344,8 +2386,8 @@ report it to the upstream. NB: ``quirk_alias`` option is provided only for testing / development. If you want to have a proper support, contact to upstream for adding the matching quirk in the driver code statically. -Ditto for ``quirk_flags``. If a device is known to require specific -workarounds, please report to the upstream. +Ditto for ``quirk_flags``. If a device +is known to require specific workarounds, please report to the upstream. =20 Module snd-usb-caiaq -------------------- --=20 2.51.0