DEV Community

Ankit Khandelwal
Ankit Khandelwal

Posted on • Edited on

ROG Flow Z13 2025 Linux Audio Quality Investigation

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:

  1. 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
  2. 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)

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
Enter fullscreen mode Exit fullscreen mode

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.0 and .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
Enter fullscreen mode Exit fullscreen mode

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.0 and .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:

  1. I2C communication timing issue
  2. Amplifiers not ready when driver probes
  3. Hardware-specific initialization sequence required
  4. 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
Enter fullscreen mode Exit fullscreen mode

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"
Enter fullscreen mode Exit fullscreen mode

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])
Enter fullscreen mode Exit fullscreen mode
[    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
Enter fullscreen mode Exit fullscreen mode

Not sure which commit fixed the issue.
aeeb85f26c3bb - Added the quirk, it was already there.

Top comments (0)