Binary speaker volume on Lenovo Yoga Pro 7 14IMH9 (Meteor Lake + ALC287)
Binary Speaker Volume Control on Lenovo Yoga Pro 7 14IMH9 (Intel Meteor Lake + Realtek ALC287)
System Information
- Laptop Model: Lenovo Yoga Pro 7 14IMH9 (LNVNB161216)
- CPU: Intel Core Ultra 9 (Meteor Lake-P)
- Audio Controller: Intel Meteor Lake-P HD Audio Controller (PCI ID: 8086:7a50, rev 20)
- Audio Codec: Realtek ALC287 (Subsystem: 17aa:38cf)
- OS: Fedora 43 Workstation
- Kernel: 6.17.5-300.fc43.x86_64
- Firmware: linux-firmware-20251021-1.fc43
- Audio Stack: PipeWire 1.4.9 + WirePlumber
Problem Description
The internal laptop speakers exhibit binary volume control behavior: the speakers are either:
- Completely muted (when volume control is set to mute), OR
- Always at maximum loudness regardless of volume level setting (5%, 50%, or 100% all produce maximum volume)
There is no gradual volume adjustment between mute and maximum.
Expected Behavior
Volume control should provide smooth, gradual adjustment from 0% to 100%, with each percentage point producing a proportionally different loudness level.
Actual Behavior
- Mute (0%): Speakers are silent ✓ (works correctly)
-
Any level 1-100%: Speakers play at maximum volume ✗ (broken)
- Setting volume to 5% → maximum loudness
- Setting volume to 50% → maximum loudness
- Setting volume to 100% → maximum loudness
Audio Hardware Details
Codec Information
Codec: Realtek ALC287
Vendor Id: 0x10ec0287
Subsystem Id: 0x17aa38cf
Revision Id: 0x100002
Speaker Node (from codec dump)
Node 0x14 [Pin Complex] - Internal Speaker
Pin Default: 0x90170110
Node 0x17 [Pin Complex] - Bass Speaker
Pin Default: 0x90170111
ALSA Mixer Controls
The Speaker control shows volume changes in ALSA:
$ amixer -c 1 sget 'Speaker'
Simple mixer control 'Speaker',0
Capabilities: pvolume pswitch
Playback channels: Front Left - Front Right
Limits: Playback 0 - 87
# Volume changes reflected here but not in actual hardware output
PipeWire Sink Flags
Flags: HARDWARE HW_MUTE_CTRL HW_VOLUME_CTRL DECIBEL_VOLUME LATENCY
Diagnostic Steps Taken
-
✅ Disabled DRC (Dynamic Range Compression):
amixer -c 1 sset 'Post Mixer Analog Playback DRC switch' off- Result: Made speakers slightly quieter but still binary behavior
-
❌ Tried forcing software volume control via:
-
.asoundrcconfiguration - WirePlumber rules with
api.alsa.ignore-dB = true - Result: No effect, hardware still exhibits binary behavior
-
-
✅ Verified ALSA controls respond to commands:
- ALSA mixer values change correctly
- PipeWire volume adjustments propagate to ALSA
- Issue is at hardware/firmware level, not software
-
✅ Confirmed USB audio works correctly:
- Logitech USB Headset H340 has smooth volume control
- Problem is specific to internal speakers
Hypothesis
The smart speaker amplifier (likely TI TAS2781 or similar) is not properly controlled by the SOF (Sound Open Firmware) driver. The amplifier appears to be operating in a binary on/off mode instead of accepting fine-grained volume commands from the codec.
Similar Issues
This appears similar to other Lenovo laptop audio issues with smart amplifiers:
- ThinkPad P1 Gen 6 audio issues
- Legion series amplifier control problems
- Other Meteor Lake + Realtek combinations
Request
This hardware configuration appears to need:
- SOF topology updates for Meteor Lake + ALC287 + smart amplifier combination
- Proper amplifier initialization/control via I2C
- UCM profile adjustments for Lenovo Yoga Pro 7 14IMH9
Additional Information
Complete diagnostic data including:
- Full codec dump
- ALSA mixer controls
- PipeWire sink configuration
- Kernel dmesg audio logs
- SOF firmware versions
Full diagnostic logs: https://gist.github.com/spasoye-json/fb4c6b140b07c1c50f23df08d2aa4cc1
Workaround
Currently using USB headset as the internal speakers are unusable due to always-maximum volume.
@spasoye-json, the HDA codec and companion AMP configuration is done by the HDA stack, SOF has no control over this.
You can test with legacy HDA stack to see if there is a change in the binary behavior by (you will loose DMIC in legacy mode):
options snd_intel_dspcfg dsp_driver=1
You are likely missing HDA fixup to get the speaker to work correctly, other variants of Yoga Pro 7 appears to have fixups for the Bass speaker:
$ cat sound/hda/codecs/realtek/alc269.c | grep "Yoga Pro 7"
SND_PCI_QUIRK(0x17aa, 0x386e, "Yoga Pro 7 14ARP8", ALC285_FIXUP_SPEAKER2_TO_DAC1),
SND_PCI_QUIRK(0x17aa, 0x3882, "Lenovo Yoga Pro 7 14APH8", ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK_PIN),
SND_PCI_QUIRK(0x17aa, 0x3891, "Lenovo Yoga Pro 7 14AHP9", ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK_PIN),
SND_PCI_QUIRK(0x17aa, 0x390d, "Lenovo Yoga Pro 7 14ASP10", ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK_PIN),
As a wild guess I would try this if it helps:
diff --git a/sound/hda/codecs/realtek/alc269.c b/sound/hda/codecs/realtek/alc269.c
index ed97b0b724f7..f59f96b18a91 100644
--- a/sound/hda/codecs/realtek/alc269.c
+++ b/sound/hda/codecs/realtek/alc269.c
@@ -7094,6 +7094,7 @@ static const struct hda_quirk alc269_fixup_tbl[] = {
SND_PCI_QUIRK(0x17aa, 0x38c8, "Thinkbook 13x Gen 4", ALC287_FIXUP_MG_RTKC_CSAMP_CS35L41_I2C_THINKPAD),
SND_PCI_QUIRK(0x17aa, 0x38cb, "Y790 YG DUAL", ALC287_FIXUP_TAS2781_I2C),
SND_PCI_QUIRK(0x17aa, 0x38cd, "Y790 VECO DUAL", ALC287_FIXUP_TAS2781_I2C),
+ SND_PCI_QUIRK(0x17aa, 0x38cf, "Lenovo Yoga Pro 7 14IMH9", ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK_PIN),
SND_PCI_QUIRK(0x17aa, 0x38d2, "Lenovo Yoga 9 14IMH9", ALC287_FIXUP_YOGA9_14IMH9_BASS_SPK_PIN),
SND_PCI_QUIRK(0x17aa, 0x38d3, "Yoga S990-16 Pro IMH YC Dual", ALC287_FIXUP_TAS2781_I2C),
SND_PCI_QUIRK(0x17aa, 0x38d4, "Yoga S990-16 Pro IMH VECO Dual", ALC287_FIXUP_TAS2781_I2C),
Hi @ujfalusi, thank you for the quick response!
Clarification on the Issue
I want to clarify: speakers already work and produce sound. The issue is specifically about volume control being binary (only mute or maximum), not about speakers being silent.
Original Problem
- ✅ Speakers produce sound
- ❌ Volume control is binary: either muted OR maximum volume
- ❌ No gradual adjustment: 5%, 50%, and 100% all produce the same maximum loudness
Test Results with Legacy HDA Mode
Device: Lenovo Yoga Pro 7 14IMH9 (0x17aa:0x38cf)
Kernel: 6.17.5-300.fc43.x86_64
Test: Legacy HDA mode with dsp_driver=1
Result: Same behavior - speakers work but volume control still binary (mute or maximum only).
Volume Control Behavior
$ amixer -c1 get Master
Limits: Playback 0 - 87
Mono: Playback 44 [51%] [-32.25dB] [on]
# But changing volume has no audible effect:
$ amixer -c1 set Master 20% # Still plays at maximum volume
$ amixer -c1 set Master 80% # Still plays at maximum volume
$ amixer -c1 set Master 0% # Muted (only this works)
The volume controls exist and can be adjusted in software, but the actual speaker output remains at maximum volume regardless of the setting (except when muted).
Question About the Suggested Fixup
You suggested:
+ SND_PCI_QUIRK(0x17aa, 0x38cf, "Lenovo Yoga Pro 7 14IMH9",
+ ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK_PIN),
I noticed that other "14IMH9" models (Yoga 9 14IMH9) use a different fixup:
SND_PCI_QUIRK(0x17aa, 0x38d2, "Lenovo Yoga 9 14IMH9", ALC287_FIXUP_YOGA9_14IMH9_BASS_SPK_PIN),
SND_PCI_QUIRK(0x17aa, 0x38d7, "Lenovo Yoga 9 14IMH9", ALC287_FIXUP_YOGA9_14IMH9_BASS_SPK_PIN),
Questions:
- Will the
ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK_PINfixup address the volume control issue specifically? - Since this laptop is also a "14IMH9" platform, should I try
ALC287_FIXUP_YOGA9_14IMH9_BASS_SPK_PINinstead? - Is there a specific fixup that handles volume control mapping for binary-to-gradual conversion?
Hardware Context
- Model: Lenovo Yoga Pro 7 14IMH9 (not "Yoga 9", but shares IMH9 platform)
- Codec: Realtek ALC287 (Subsystem: 17aa:38cf)
- Issue: Binary volume control (mute/max only)
- Not an issue: Speaker activation/sound output (already working)
I'm happy to test alternative patches or provide additional diagnostics. Let me know what would be most helpful!
Additional Info Available
- Full codec dump
- Pin configurations
- ALSA control details
- Audio topology information
All available in the original issue report if needed.
Thanks for your help!
@spasoye-json, ALC287_FIXUP_YOGA9_14IMH9_BASS_SPK_PIN is chaining the ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK_PIN, it does something else on top of that fixup.
These fixups do change how the amps and codec is configured... alc287_fixup_yoga9_14iap7_bass_spk_pin() have this comment for example:
/*
* Avoid DAC 0x06 and 0x08, as they have no volume controls.
* DAC 0x02 and 0x03 would be fine.
*/
It looks to me that it might have effect on the volume control as well, but true that your device might need yet another type of fixup...
have you tried:
amixer -c1 set Speaker 20%
Only Lenovo knows what is right (or perhaps Realtek), this is really out of the scope of SOF, we don't have information on how OEMs connect up their devices. This is really unfortunate, but there is not much.
The best course of action is to ask help in [email protected], make sure to provide a link to uploaded alsa-info report.