diff options
| author | Rong Zhang <i@rong.moe> | 2026-03-04 03:48:03 +0800 |
|---|---|---|
| committer | Takashi Iwai <tiwai@suse.de> | 2026-03-04 12:05:57 +0100 |
| commit | dfd4b0d46e774d7fbd23a438ead45de08bde783e (patch) | |
| tree | 160ce80989cd79178262404e80c37ca189ece173 | |
| parent | f510f3bacc2f0f862bb4b878e80e5519cec3419e (diff) | |
ALSA: usb-audio: Apply linear volume quirk on MV-SILICON devices
MV-SILICON is a SoC manufacturer producing multifunctional audio SoCs.
Many devices built on top of their SDK share a common quirk that the
Playback and Capture mixers use linear volume with val = 0/4096/1.
The SDK seems to always report "MV-SILICON" for manufacturer string.
Hence, match it so that we don't need to define quirk table entries
separately for each devices. The "val = 0/4096/1" pattern is also
checked against before applying the quirk, in order that the quirk won't
accidentally break unseen variants.
Quirky device samples:
usb 7-1: New USB device found, idVendor=1235, idProduct=0003, bcdDevice= 1.00
usb 7-1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
usb 7-1: Product: G1
usb 7-1: Manufacturer: MV-SILICON
usb 7-1: SerialNumber: 20190808
usb 7-1: New USB device found, idVendor=1235, idProduct=0003, bcdDevice= 1.00
usb 7-1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
usb 7-1: Product: mvsilicon B1 usb audio
usb 7-1: Manufacturer: MV-SILICON
usb 7-1: SerialNumber: 20190808
usb 5-1.4: New USB device found, idVendor=8888, idProduct=1719, bcdDevice= 1.00
usb 5-1.4: New USB device strings: Mfr=1, Product=2, SerialNumber=3
usb 5-1.4: Product: HF310 USB Audio
usb 5-1.4: Manufacturer: MV-SILICON
usb 5-1.4: SerialNumber: 20190808
usb 7-1: New USB device found, idVendor=2717, idProduct=5086, bcdDevice= 1.00
usb 7-1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
usb 7-1: Product: Redmi 电脑音箱
usb 7-1: Manufacturer: MV-SILICON
usb 7-1: SerialNumber: 20190808
usb 2-1.2: New USB device found, idVendor=3142, idProduct=a601, bcdDevice= 1.00
usb 2-1.2: New USB device strings: Mfr=1, Product=2, SerialNumber=3
usb 2-1.2: Product: fifine Microphone
usb 2-1.2: Manufacturer: MV-SILICON
usb 2-1.2: SerialNumber: 20190808
* https://forum.ubuntu-it.org/viewtopic.php?t=659345
Signed-off-by: Rong Zhang <i@rong.moe>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Link: https://patch.msgid.link/20260303194805.266158-9-i@rong.moe
| -rw-r--r-- | sound/usb/mixer_quirks.c | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c index 539044c0c6440..e97814dc90259 100644 --- a/sound/usb/mixer_quirks.c +++ b/sound/usb/mixer_quirks.c @@ -4588,6 +4588,24 @@ static void snd_dragonfly_quirk_db_scale(struct usb_mixer_interface *mixer, } } +static void snd_usb_mv_silicon_quirks(struct usb_mixer_interface *mixer, + struct usb_mixer_elem_info *cval, + struct snd_kcontrol *kctl) +{ + if (cval->min == 0 && cval->max == 4096 && cval->res == 1) { + /* The final effects will be printed later. */ + usb_audio_info(mixer->chip, "applying MV-SILICON quirks (0/4096/1 variant)\n"); + + /* Respect MIN_MUTE set by module parameters. */ + if (!(mixer->chip->quirk_flags & QUIRK_FLAG_MIXER_PLAYBACK_MIN_MUTE)) + mixer->chip->quirk_flags |= QUIRK_FLAG_MIXER_PLAYBACK_LINEAR_VOL; + if (!(mixer->chip->quirk_flags & QUIRK_FLAG_MIXER_CAPTURE_MIN_MUTE)) + mixer->chip->quirk_flags |= QUIRK_FLAG_MIXER_CAPTURE_LINEAR_VOL; + } else { + usb_audio_dbg(mixer->chip, "not applying MV-SILICON quirks on unknown variant"); + } +} + /* * Some Plantronics headsets have control names that don't meet ALSA naming * standards. This function fixes nonstandard source names. By the time @@ -4664,6 +4682,10 @@ void snd_usb_mixer_fu_apply_quirk(struct usb_mixer_interface *mixer, break; } + if (cval->control == UAC_FU_VOLUME && + !strncmp(mixer->chip->card->longname, "MV-SILICON", 10)) + snd_usb_mv_silicon_quirks(mixer, cval, kctl); + /* lowest playback value is muted on some devices */ if (mixer->chip->quirk_flags & QUIRK_FLAG_MIXER_PLAYBACK_MIN_MUTE) if (strstr(kctl->id.name, "Playback")) { |
