The ASUS ROG Flow Z13 2025 (GZ302EA) experiences significantly lower speaker volume and quality on Linux (Fedora 43) compared to Windows.
Current Status: After applying a kernel fixup to bind CS35L41 amplifiers, the driver fails during probe with "Failed to sync masks in 10110" I2C communication error, resulting in no sound output. The firmware files exist (0x1043:0x1fb3) but amplifier binding fails at the hardware initialization stage.
Root Cause: Missing proper device quirk integration combined with I2C communication failure during amplifier probe. The fixup correctly detects the hardware but cannot establish communication with the amplifiers.
The Audio Hardware Architecture
Z13 2025 Audio Chain
This laptop uses a dual-stage audio system:
-
Realtek ALC294 Codec (Audio Link Controller)
- Primary codec handling audio encoding/decoding
- PCI Device:
c4:00.6 Audio device [0403]: Family 17h/19h/1ah HD Audio Controller - Subsystem ID:
0x1043:0x1fb3(ASUS ROG Flow Z13) - ALSA Card:
card1(/proc/asound/card1/codec#0) - Vendor ID:
0x10ec0294, Subsystem:0x10431fb3
-
Cirrus Logic CS35L41 Amplifiers (Dual speakers, left and right)
- I2C devices:
i2c-CSC3551:00-cs35l41-hda.0(left),.1(right) - Connected via I2C bus
- Each has its own DSP (Digital Signal Processor) for audio enhancement
- Firmware revision: v0.58.0 (speaker protection profile)
- I2C devices:
This architecture is typical for ASUS ROG laptops (also used in ROG Flow X13, ROG Zephyrus, etc.).
My laptop: ROG Flow Z13 (2025) GZ302 GZ302EA-RU420WS
Root Cause: Amplifier Binding Failure
Current Problem
After applying a dynamic fixup (ALC287_FIXUP_CS35L41_I2C_2) to bind the CS35L41 amplifiers, the driver fails during probe:
cs35l41-hda: Failed to sync masks in 10110
This is a regmap-IRQ I2C communication failure at register 0x10110 (IRQ mask register). The amplifiers are detected but cannot be initialized, resulting in no sound output.
Investigation Timeline
Phase 1: Initial State (Low Volume)
- Firmware files existed but weren't being loaded
- Generic firmware with Gain: 17 (conservative default)
- Sound worked but volume/quality was poor
Phase 2: After Fixup Application
- Fixup correctly detects ALC294 and attempts amplifier binding
- I2C devices detected:
i2c-CSC3551:00-cs35l41-hda.0and.1 - Amplifier driver probe fails with "Failed to sync masks" error
- Result: No sound (amplifiers cannot initialize)
The Firmware Files Exist
Firmware files for subsystem ID 0x1043:0x1fb3 are installed:
/lib/firmware/cirrus/cs35l41-dsp1-spk-prot-10431fb3-spkid0-l0.bin.xz
/lib/firmware/cirrus/cs35l41-dsp1-spk-prot-10431fb3-spkid0-r0.bin.xz
/lib/firmware/cirrus/cs35l41-dsp1-spk-prot-10431fb3.wmfw.xz
The blocker: I2C communication failure prevents the driver from loading firmware, even though files exist.
Why Software Solutions (EasyEffects) Aren't Enough
I tested EasyEffects presets and found them insufficient. This is expected because:
| Audio Processing Layer | Function | Windows/Dolby | Linux (Current) | Linux with Presets |
|---|---|---|---|---|
| DSP Firmware (Hardware) | Amplifier tuning, speaker protection, gain calibration | ✓ Optimized tuning | ✗ Generic (Gain 17) | ✗ Generic (Gain 17) |
| Software Equalization | Bass, treble, presence adjustments | Dolby processing | EasyEffects plugins | EasyEffects plugins |
| Loudness Perception | Dynamic range compression | Dolby algorithm | Compressor plugin | Compressor plugin |
EasyEffects recreates layers 2 and 3 but cannot overcome the hardware gain limitation in layer 1. We're still limited by Gain: 17 at the amplifier level. Boosting software on top of that creates digital clipping and quality degradation.
Analogy: EasyEffects is like turning up the volume knob when your speakers are physically set to 30% power. It helps, but you can't exceed the hardware ceiling without clipping.
Investigation Findings
Hardware Identifiers (for reference)
-
PCI Device:
c4:00.6(Family 17h/19h/1ah HD Audio Controller) -
Subsystem ID:
0x1043:0x1fb3(ASUS ROG Flow Z13) -
Codec: Realtek ALC294 (
0x10ec0294) -
I2C Bus:
i2c-CSC3551:00 -
Amplifier Devices:
cs35l41-hda.0(left),cs35l41-hda.1(right) - Kernel Version: 6.18.0-0.rc4 (vanilla Fedora 43)
-
ALSA Card:
card1(/proc/asound/card1/codec#0)
Current State
Working Components:
- ✅ Firmware files installed:
/lib/firmware/cirrus/cs35l41-*10431fb3* - ✅ I2C devices detected:
i2c-CSC3551:00-cs35l41-hda.0and.1 - ✅ Fixup function loaded (dynamic ALC294 detection)
- ✅ ALSA mixer controls functional (Master: 80%, all channels on)
Failing Components:
- ❌ CS35L41 driver probe fails: "Failed to sync masks in 10110"
- ❌ Amplifiers not bound to driver
- ❌ No sound output (codec cannot communicate with amplifiers)
Error Analysis
The "Failed to sync masks" error occurs in drivers/base/regmap/regmap-irq.c when trying to sync interrupt mask registers over I2C. Possible causes:
- I2C communication timing issue
- Amplifiers not ready when driver probes
- Hardware-specific initialization sequence required
- Regmap cache synchronization failure
Potential Solutions
Option 1: Robust Fixup with Fallback (Recommended)
- Modify fixup to handle amplifier binding failures gracefully
- Allow codec to work generically if amplifiers fail to bind
- Restores low-quality sound but maintains functionality
Option 2: I2C Timing/Initialization Fix
- Investigate reset GPIO timing
- Verify I2C bus speed configuration
- Check amplifier power-on sequence
Option 3: Driver Probe Sequence Fix
- Delay amplifier probe until codec is fully initialized
- Check if fixup timing (PRE_PROBE vs PROBE) is correct
Technical Deep Dive: The I2C Communication Failure
Current Driver Behavior
The kernel cs35l41-hda driver follows this sequence:
1. Fixup detects ALC294 codec (0x1043:0x1fb3)
2. Fixup applies ALC287_FIXUP_CS35L41_I2C_2
3. Driver attempts to bind CS35L41 amplifiers via I2C
4. Probe fails at regmap-IRQ sync (register 0x10110)
5. Result: No amplifier binding, no sound
The I2C Communication Problem
The error "Failed to sync masks in 10110" indicates the driver cannot synchronize interrupt mask registers with the amplifier hardware over I2C. This happens during the probe phase when the driver tries to:
- Read/write IRQ mask register (0x10110)
- Initialize interrupt handling
- Establish communication with the amplifier DSP
Why this matters: Without successful amplifier binding, the codec cannot route audio to speakers, even though the codec itself is functional.
Required Fixes
Immediate Fix: Make fixup handle binding failures gracefully
- Check amplifier binding status after fixup
- Fall back to generic codec mode if binding fails
- Restore basic functionality while investigating root cause
Long-term Fix: Resolve I2C communication timing/initialization
- Investigate amplifier power-on sequence
- Verify I2C bus configuration and timing
- Check if delayed probe or retry logic is needed
Reference Commands
Diagnostic commands:
# Check amplifier binding errors
sudo dmesg | grep -i "cs35l41\|alc294\|fixup\|Failed to sync" | tail -30
# Verify I2C devices are detected
ls -la /sys/bus/i2c/devices/i2c-CSC3551:00-cs35l41-hda.*/driver
# Check if driver modules are loaded
lsmod | grep cs35l41
# Verify firmware files exist
ls -la /lib/firmware/cirrus/cs35l41-*10431fb3*
# Check ALSA mixer levels
amixer -c1 scontents | grep -A 5 "Speaker\|Master\|PCM"
# Extract hardware info for reporting
sudo alsa-info.sh > alsa-info.log
# Check codec information
cat /proc/asound/card1/codec#0 | grep -A 2 "Subsystem Id"
Edit: Updated on Nov 26 2025
Kernel Version: Linux fedora 6.18.0-0.rc7.357.vanilla.fc43.x86_64 #1 SMP PREEMPT_DYNAMIC Sun Nov 23 23:34:12 UTC 2025 x86_64 GNU/Linux
This kernel version is picking up firmware for audio drivers and I can feel the improvement in the audio quality.
It still loads with Gain 17 but the sound is definitely louder than before.
[ 6.411647] snd_hda_codec_alc269 hdaudioC1D0: ALC294: picked fixup for PCI SSID 1043:1fb3
[ 6.952332] snd_hda_codec_alc269 hdaudioC1D0: bound i2c-CSC3551:00-cs35l41-hda.0 (ops cs35l41_hda_comp_ops [snd_hda_scodec_cs35l41])
[ 7.491295] snd_hda_codec_alc269 hdaudioC1D0: bound i2c-CSC3551:00-cs35l41-hda.1 (ops cs35l41_hda_comp_ops [snd_hda_scodec_cs35l41])
[ 6.876753] cs35l41-hda i2c-CSC3551:00-cs35l41-hda.0: DSP1: Firmware: 400a4 vendor: 0x2 v0.65.0, 2 algorithms
[ 6.952270] cs35l41-hda i2c-CSC3551:00-cs35l41-hda.0: Firmware Loaded - Type: spk-prot, Gain: 17
[ 7.415254] cs35l41-hda i2c-CSC3551:00-cs35l41-hda.1: DSP1: Firmware: 400a4 vendor: 0x2 v0.65.0, 2 algorithms
[ 7.491237] cs35l41-hda i2c-CSC3551:00-cs35l41-hda.1: Firmware Loaded - Type: spk-prot, Gain: 17
Not sure which commit fixed the issue.
aeeb85f26c3bb - Added the quirk, it was already there.
Top comments (0)