Important
THIS IS NOW OBSOLETE WITH KERNEL VERSIONS ≥ 6.7.0
A recent announcement in the kernel mail list by Cirrus developers will solve the problem described here. Therefore, the proposed solutions will be soon obsolete. See this comment (thanks, @flukejones, for the tip).
I got the speakers working on my Asus Zenbook 14 OLED UX3402, the one with Intel CPU and the two CS35L41
audio amplifiers connected over SPI (not the UM3402YA, with AMD and I²C). The amplifiers are supported by the snd_hda_scodec_cs35l41
module in recent kernel versions, but they require some model-specific configuration paramaters, that should be provided by the BIOS, via ACPI. Of course, they are missing. It seems that the Windows drivers have those parameters somehow hardcoded, instead of using ACPI (bad idea, but who am I to criticise). Since Asus has been nasty and refused/was not able to update the BIOS with the missing data, I have patched the ACPI tables myself.
Warning
As stated by Cirrus developers, if you try this there is a non-zero (low, I hope) possibility of blowing your speakers. Take into account that this procedure is not just configuring your box, it is hardware-level hacking with very scarce information about the hardware (thank you, ASUS, and thank you, Cirrus, for not publishing the CS35L41 datasheet and making it only available by request). Additionally, You should know how to work with DSDT or SSDT files (I have a brief guide here) and how to recover from a non booting system. You are on your own. You have been warned.
Note
I have used the patch for some months, and everything seems OK. As you can see, the most recent versions do not require electrical parameters to be specified, just providing the functions of several GPIO pins, that are already present in the original BIOS, and the behavior associated to them. I am almost sure that the patch is totally safe.
My BIOS is the most recent one (version 310). I have added two _DSD objects in the SSDT file
(ssdt_csc3551.dsl
, or its already assembled version, ssdt_csc3551.aml
):
-
One inside the SPK1 device, providing the missing
"cirrus,dev-index"
and other properties, just like the I2C models. You can also provide these properties by patching the kernel module (thelinux/sound/pci/hda/cs35l41_hda.c
file). -
Another one, after the SPK1 device, with the chip select GPIOs,
"cs-gpios"
, required by the SPI bus (the somehow simpler I²C bus does not use chip select pins, but addresses). Without this _DSD object, only one amplifier can be addressed and activated. In this case, the driver refuses to load even for this single working amplifier.
Instead of applying a SSDT file, you may patch the full DSDT dissassembled DSDT file (dsdt.dsl
).
This was my original solution (thanks to @thor2002ro for pointing to the simpler, nicer SSDT
solution, see the comment,
especially if you use grub). The patch is available for reference, just apply the SSDT file.
I keep the old, original patch, that produced AMP short error
messages when the volume was high
enough, for reference. Please try first the simpler patch with external boost, that seems to work
without flaws (thanks to @bdandy, see the comment).
Output from journalctl -b -g CSC3551 --output short-monotonic
after the old patch:
[5.358062] zenbook kernel: Serial bus multi instantiate pseudo device driver CSC3551:00: Instantiated 2 SPI devices.
[5.643640] zenbook kernel: cs35l41-hda spi1-CSC3551:00-cs35l41-hda.0: Cirrus Logic CS35L41 (35a40), Revision: B2
[5.680302] zenbook kernel: cs35l41-hda spi1-CSC3551:00-cs35l41-hda.1: Cirrus Logic CS35L41 (35a40), Revision: B2
[5.996217] zenbook kernel: cs35l41-hda spi1-CSC3551:00-cs35l41-hda.0: Falling back to default firmware.
[5.996608] zenbook kernel: cs35l41-hda spi1-CSC3551:00-cs35l41-hda.0: DSP1: Firmware version: 3
[5.996611] zenbook kernel: cs35l41-hda spi1-CSC3551:00-cs35l41-hda.0: DSP1: cirrus/cs35l41-dsp1-spk-prot.wmfw: Fri 24 Jun 2022 14:55:56 GMT Daylight Time
[6.069598] zenbook kernel: cs35l41-hda spi1-CSC3551:00-cs35l41-hda.0: DSP1: Firmware: 400a4 vendor: 0x2 v0.58.0, 2 algorithms
[6.070173] zenbook kernel: cs35l41-hda spi1-CSC3551:00-cs35l41-hda.0: DSP1: 0: ID cd v29.78.0 XM@94 YM@e
[6.070185] zenbook kernel: cs35l41-hda spi1-CSC3551:00-cs35l41-hda.0: DSP1: 1: ID f20b v0.1.0 XM@17c YM@0
[6.070192] zenbook kernel: cs35l41-hda spi1-CSC3551:00-cs35l41-hda.0: DSP1: spk-prot: e:\workspace\workspace\tibranch_release_playback_6.76_2\ormis\staging\default_tunings\internal\CS35L53\Fixed_Attenuation_Mono_48000_29.78.0\full\Fixed_Attenuation_Mono_48000_29.78.0_full.bin
[6.083485] zenbook kernel: snd_hda_codec_realtek ehdaudio0D0: bound spi1-CSC3551:00-cs35l41-hda.0 (ops cs35l41_hda_comp_ops [snd_hda_scodec_cs35l41])
[6.083899] zenbook kernel: cs35l41-hda spi1-CSC3551:00-cs35l41-hda.1: Falling back to default firmware.
[6.083962] zenbook kernel: cs35l41-hda spi1-CSC3551:00-cs35l41-hda.1: DSP1: Firmware version: 3
[6.083966] zenbook kernel: cs35l41-hda spi1-CSC3551:00-cs35l41-hda.1: DSP1: cirrus/cs35l41-dsp1-spk-prot.wmfw: Fri 24 Jun 2022 14:55:56 GMT Daylight Time
[6.145224] zenbook kernel: cs35l41-hda spi1-CSC3551:00-cs35l41-hda.1: DSP1: Firmware: 400a4 vendor: 0x2 v0.58.0, 2 algorithms
[6.145817] zenbook kernel: cs35l41-hda spi1-CSC3551:00-cs35l41-hda.1: DSP1: 0: ID cd v29.78.0 XM@94 YM@e
[6.145828] zenbook kernel: cs35l41-hda spi1-CSC3551:00-cs35l41-hda.1: DSP1: 1: ID f20b v0.1.0 XM@17c YM@0
[6.145834] zenbook kernel: cs35l41-hda spi1-CSC3551:00-cs35l41-hda.1: DSP1: spk-prot: e:\workspace\workspace\tibranch_release_playback_6.76_2\ormis\staging\default_tunings\internal\CS35L53\Fixed_Attenuation_Mono_48000_29.78.0\full\Fixed_Attenuation_Mono_48000_29.78.0_full.bin
[6.161484] zenbook kernel: snd_hda_codec_realtek ehdaudio0D0: bound spi1-CSC3551:00-cs35l41-hda.1 (ops cs35l41_hda_comp_ops [snd_hda_scodec_cs35l41])
The "Falling back to default firmware" disappears if spk-id-gpios
are provided (the block is commented in the patch). As a result, a different firmware is loaded, resulting in very low volume and strong distortion. If the new patch is used, that uses external boost, the sound is correct, and the log is
[0.004000] zenbook kernel: ACPI: Table Upgrade: install [SSDT-CUSTOM- CSC3551]
[0.004000] zenbook kernel: ACPI: SSDT 0x00000000368FD000 0001A0 (v01 CUSTOM CSC3551 00000001 INTL 20200925)
[5.607253] zenbook kernel: Serial bus multi instantiate pseudo device driver CSC3551:00: Instantiated 2 SPI devices.
[5.906936] zenbook kernel: cs35l41-hda spi1-CSC3551:00-cs35l41-hda.0: Cirrus Logic CS35L41 (35a40), Revision: B2
[5.907354] zenbook kernel: cs35l41-hda spi1-CSC3551:00-cs35l41-hda.1: Reset line busy, assuming shared reset
[5.938136] zenbook kernel: cs35l41-hda spi1-CSC3551:00-cs35l41-hda.1: Cirrus Logic CS35L41 (35a40), Revision: B2
[6.239406] zenbook kernel: cs35l41-hda spi1-CSC3551:00-cs35l41-hda.0: DSP1: Firmware version: 3
[6.239415] zenbook kernel: cs35l41-hda spi1-CSC3551:00-cs35l41-hda.0: DSP1: cirrus/cs35l41-dsp1-spk-prot-10431e02.wmfw: Fri 27 Aug 2021 14:58:19 W. Europe Daylight Time
[6.313109] zenbook kernel: cs35l41-hda spi1-CSC3551:00-cs35l41-hda.0: DSP1: Firmware: 400a4 vendor: 0x2 v0.43.1, 2 algorithms
[6.313524] zenbook kernel: cs35l41-hda spi1-CSC3551:00-cs35l41-hda.0: DSP1: 0: ID cd v29.63.1 XM@94 YM@e
[6.313530] zenbook kernel: cs35l41-hda spi1-CSC3551:00-cs35l41-hda.0: DSP1: 1: ID f20b v0.1.0 XM@176 YM@0
[6.313535] zenbook kernel: cs35l41-hda spi1-CSC3551:00-cs35l41-hda.0: DSP1: spk-prot: C:\Users\tyang\Desktop\Product Setting\SmartAMP\ASUS\ASUS_Zenbook\UX3402\Tuning Release\220304\ASUS_UX3402_L_tuning_IDYC_ReDc_PICL_RTL_0304.bin
[6.337211] zenbook kernel: snd_hda_codec_realtek ehdaudio0D0: bound spi1-CSC3551:00-cs35l41-hda.0 (ops cs35l41_hda_comp_ops [snd_hda_scodec_cs35l41])
[6.337534] zenbook kernel: cs35l41-hda spi1-CSC3551:00-cs35l41-hda.1: DSP1: Firmware version: 3
[6.337540] zenbook kernel: cs35l41-hda spi1-CSC3551:00-cs35l41-hda.1: DSP1: cirrus/cs35l41-dsp1-spk-prot-10431e02.wmfw: Fri 27 Aug 2021 14:58:19 W. Europe Daylight Time
[6.399070] zenbook kernel: cs35l41-hda spi1-CSC3551:00-cs35l41-hda.1: DSP1: Firmware: 400a4 vendor: 0x2 v0.43.1, 2 algorithms
[6.399612] zenbook kernel: cs35l41-hda spi1-CSC3551:00-cs35l41-hda.1: DSP1: 0: ID cd v29.63.1 XM@94 YM@e
[6.399623] zenbook kernel: cs35l41-hda spi1-CSC3551:00-cs35l41-hda.1: DSP1: 1: ID f20b v0.1.0 XM@176 YM@0
[6.399629] zenbook kernel: cs35l41-hda spi1-CSC3551:00-cs35l41-hda.1: DSP1: spk-prot: C:\Users\tyang\Desktop\Product Setting\SmartAMP\ASUS\ASUS_Zenbook\UX3402\Tuning Release\220304\ASUS_UX3402_R_tuning_IDYC_ReDc_PICL_RTL_0304.bin
[6.427637] zenbook kernel: snd_hda_codec_realtek ehdaudio0D0: bound spi1-CSC3551:00-cs35l41-hda.1 (ops cs35l41_hda_comp_ops [snd_hda_scodec_cs35l41])
@fermino the issue I'm having is "still no sound" from what I can tell, grub is not loading the custom tables. even though the entry is in the grub.cfg
sudo dmesg | grep SSDT
[ 0.015492] ACPI: SSDT 0x00000000407E3000 00740E (v02 DptfTb DptfTabl 00001000 INTL 20200717)
[ 0.015499] ACPI: SSDT 0x000000004076F000 00038C (v02 PmaxDv Pmax_Dev 00000001 INTL 20200717)
[ 0.015501] ACPI: SSDT 0x0000000040769000 005D0B (v02 CpuRef CpuSsdt 00003000 INTL 20200717)
[ 0.015503] ACPI: SSDT 0x0000000040766000 002AA1 (v02 SaSsdt SaSsdt 00003000 INTL 20200717)
[ 0.015505] ACPI: SSDT 0x0000000040762000 0033D3 (v02 INTEL IgfxSsdt 00003000 INTL 20200717)
[ 0.015508] ACPI: SSDT 0x0000000040754000 00D337 (v02 INTEL TcssSsdt 00001000 INTL 20200717)
[ 0.015516] ACPI: SSDT 0x000000004074B000 005D47 (v02 ASUS AdlP_Rvp 00001000 INTL 20200717)
[ 0.015518] ACPI: SSDT 0x0000000040749000 001F1A (v02 ASUS Ther_Rvp 00001000 INTL 20200717)
[ 0.015523] ACPI: SSDT 0x0000000040744000 002A83 (v02 ASUS PtidDevc 00001000 INTL 20200717)
[ 0.015525] ACPI: SSDT 0x0000000040741000 002357 (v02 ASUS TbtTypeC 00000000 INTL 20200717)
[ 0.015532] ACPI: SSDT 0x000000004073D000 001AC9 (v02 ASUS UsbCTabl 00001000 INTL 20200717)
[ 0.015538] ACPI: SSDT 0x0000000040739000 000B35 (v02 INTEL xh_adlLP 00000000 INTL 20200717)
[ 0.015541] ACPI: SSDT 0x0000000040735000 003AEA (v02 SocGpe SocGpe 00003000 INTL 20200717)
[ 0.015543] ACPI: SSDT 0x0000000040732000 002B2A (v02 SocCmn SocCmn 00003000 INTL 20200717)
[ 0.015545] ACPI: SSDT 0x0000000040731000 000144 (v02 Intel ADebTabl 00001000 INTL 20200717)
[ 0.015567] ACPI: Reserving SSDT table memory at [mem 0x407e3000-0x407ea40d]
[ 0.015568] ACPI: Reserving SSDT table memory at [mem 0x4076f000-0x4076f38b]
[ 0.015569] ACPI: Reserving SSDT table memory at [mem 0x40769000-0x4076ed0a]
[ 0.015569] ACPI: Reserving SSDT table memory at [mem 0x40766000-0x40768aa0]
[ 0.015570] ACPI: Reserving SSDT table memory at [mem 0x40762000-0x407653d2]
[ 0.015571] ACPI: Reserving SSDT table memory at [mem 0x40754000-0x40761336]
[ 0.015573] ACPI: Reserving SSDT table memory at [mem 0x4074b000-0x40750d46]
[ 0.015573] ACPI: Reserving SSDT table memory at [mem 0x40749000-0x4074af19]
[ 0.015574] ACPI: Reserving SSDT table memory at [mem 0x40744000-0x40746a82]
[ 0.015575] ACPI: Reserving SSDT table memory at [mem 0x40741000-0x40743356]
[ 0.015577] ACPI: Reserving SSDT table memory at [mem 0x4073d000-0x4073eac8]
[ 0.015578] ACPI: Reserving SSDT table memory at [mem 0x40739000-0x40739b34]
[ 0.015579] ACPI: Reserving SSDT table memory at [mem 0x40735000-0x40738ae9]
[ 0.015579] ACPI: Reserving SSDT table memory at [mem 0x40732000-0x40734b29]
[ 0.015580] ACPI: Reserving SSDT table memory at [mem 0x40731000-0x40731143]
[ 0.230477] ACPI: SSDT 0xFFFF972441FDE400 0001AB (v02 PmRef Cpu0Psd 00003000 INTL 20200717)
[ 0.237350] ACPI: SSDT 0xFFFF97244120A400 000394 (v02 PmRef Cpu0Cst 00003001 INTL 20200717)
[ 0.238595] ACPI: SSDT 0xFFFF97244245C000 000560 (v02 PmRef Cpu0Ist 00003000 INTL 20200717)
[ 0.239782] ACPI: SSDT 0xFFFF97244245C800 0004BA (v02 PmRef Cpu0Hwp 00003000 INTL 20200717)
[ 0.241187] ACPI: SSDT 0xFFFF972441200000 001BAF (v02 PmRef ApIst 00003000 INTL 20200717)
[ 0.242975] ACPI: SSDT 0xFFFF972441204000 001038 (v02 PmRef ApHwp 00003000 INTL 20200717)
[ 0.244470] ACPI: SSDT 0xFFFF972441206000 001349 (v02 PmRef ApPsd 00003000 INTL 20200717)
[ 0.246178] ACPI: SSDT 0xFFFF972441214000 000FBB (v02 PmRef ApCst 00003000 INTL 20200717)