| .. SPDX-License-Identifier: GPL-2.0-only |
| |
| ======================================================================== |
| Audio drivers for Cirrus Logic CS35L54/56/57/63 Boosted Smart Amplifiers |
| ======================================================================== |
| :Copyright: 2025 Cirrus Logic, Inc. and |
| Cirrus Logic International Semiconductor Ltd. |
| |
| Contact: patches@opensource.cirrus.com |
| |
| Summary |
| ======= |
| |
| The high-level summary of this document is: |
| |
| **If you have a laptop that uses CS35L54/56/57/63 amplifiers but audio is not |
| working, DO NOT ATTEMPT TO USE FIRMWARE AND SETTINGS FROM ANOTHER LAPTOP, |
| EVEN IF THAT LAPTOP SEEMS SIMILAR.** |
| |
| The CS35L54/56/57/63 amplifiers must be correctly configured for the power |
| supply voltage, speaker impedance, maximum speaker voltage/current, and |
| other external hardware connections. |
| |
| The amplifiers feature advanced boost technology that increases the voltage |
| used to drive the speakers, while proprietary speaker protection algorithms |
| allow these boosted amplifiers to push the limits of the speakers without |
| causing damage. These **must** be configured correctly. |
| |
| Supported Cirrus Logic amplifiers |
| --------------------------------- |
| |
| The cs35l56 drivers support: |
| |
| * CS35L54 |
| * CS35L56 |
| * CS35L57 |
| * CS35L63 |
| |
| There are two drivers in the kernel |
| |
| *For systems using SoundWire*: sound/soc/codecs/cs35l56.c and associated files |
| |
| *For systems using HDA*: sound/pci/hda/cs35l56_hda.c |
| |
| Firmware |
| ======== |
| |
| The amplifier is controlled and managed by firmware running on the internal |
| DSP. Firmware files are essential to enable the full capabilities of the |
| amplifier. |
| |
| Firmware is distributed in the linux-firmware repository: |
| https://gitlab.com/kernel-firmware/linux-firmware.git |
| |
| On most SoundWire systems the amplifier has a default minimum capability to |
| produce audio. However this will be |
| |
| * at low volume, to protect the speakers, since the speaker specifications |
| and power supply voltages are unknown. |
| * a mono mix of left and right channels. |
| |
| On some SoundWire systems that have both CS42L43 and CS35L56/57 the CS35L56/57 |
| receive their audio from the CS42L43 instead of directly from the host |
| SoundWire interface. These systems can be identified by the CS42L43 showing |
| in dmesg as a SoundWire device, but the CS35L56/57 as SPI. On these systems |
| the firmware is *mandatory* to enable receiving the audio from the CS42L43. |
| |
| On HDA systems the firmware is *mandatory* to enable HDA bridge mode. There |
| will not be any audio from the amplifiers without firmware. |
| |
| Cirrus Logic firmware files |
| --------------------------- |
| |
| Each amplifier requires two firmware files. One file has a .wmfw suffix, the |
| other has a .bin suffix. |
| |
| The firmware is customized by the OEM to match the hardware of each laptop, |
| and the firmware is specific to that laptop. Because of this, there are many |
| firmware files in linux-firmware for these amplifiers. Firmware files are |
| **not interchangeable between laptops**. |
| |
| Cirrus Logic submits files for known laptops to the upstream linux-firmware |
| repository. Providing Cirrus Logic is aware of a particular laptop and has |
| permission from the manufacturer to publish the firmware, it will be pushed |
| to linux-firmware. You may need to upgrade to a newer release of |
| linux-firmware to obtain the firmware for your laptop. |
| |
| **Important:** the Makefile for linux-firmware creates symlinks that are listed |
| in the WHENCE file. These symlinks are required for the CS35L56 driver to be |
| able to load the firmware. |
| |
| How do I know which firmware file I should have? |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| All firmware file names are qualified with a unique "system ID". On normal |
| x86 PCs with PCI audio this is the Vendor Subsystem ID (SSID) of the host |
| PCI audio interface. |
| |
| The SSID can be viewed using the lspci tool:: |
| |
| lspci -v -nn | grep -A2 -i audio |
| 0000:00:1f.3 Audio device [0403]: Intel Corporation Meteor Lake-P HD Audio Controller [8086:7e28] |
| Subsystem: Dell Meteor Lake-P HD Audio Controller [1028:0c63] |
| |
| In this example the SSID is 10280c63. |
| |
| The format of the firmware file names is: |
| |
| SoundWire (except CS35L56 Rev B0): |
| cs35lxx-b0-dsp1-misc-SSID[-spkidX]-l?u? |
| |
| SoundWire CS35L56 Rev B0: |
| cs35lxx-b0-dsp1-misc-SSID[-spkidX]-ampN |
| |
| Non-SoundWire (HDA and I2S): |
| cs35lxx-b0-dsp1-misc-SSID[-spkidX]-ampN |
| |
| Where: |
| |
| * cs35lxx-b0 is the amplifier model and silicon revision. This information |
| is logged by the driver during initialization. |
| * SSID is the 8-digit hexadecimal SSID value. |
| * l?u? is the physical address on the SoundWire bus of the amp this |
| file applies to. |
| * ampN is the amplifier number (for example amp1). This is the same as |
| the prefix on the ALSA control names except that it is always lower-case |
| in the file name. |
| * spkidX is an optional part, used for laptops that have firmware |
| configurations for different makes and models of internal speakers. |
| |
| The CS35L56 Rev B0 continues to use the old filename scheme because a |
| large number of firmware files have already been published with these |
| names. |
| |
| Sound Open Firmware and ALSA topology files |
| ------------------------------------------- |
| |
| All SoundWire systems will require a Sound Open Firmware (SOF) for the |
| host CPU audio DSP, together with an ALSA topology file (.tplg). |
| |
| The SOF firmware will usually be provided by the manufacturer of the host |
| CPU (i.e. Intel or AMD). The .tplg file is normally part of the SOF firmware |
| release. |
| |
| SOF binary builds are available from: https://github.com/thesofproject/sof-bin/releases |
| |
| The main SOF source is here: https://github.com/thesofproject |
| |
| ALSA-ucm configurations |
| ----------------------- |
| Typically an appropriate ALSA-ucm configuration file is needed for |
| use-case managers and audio servers such as PipeWire. |
| |
| Configuration files are available from the alsa-ucm-conf repository: |
| https://git.alsa-project.org/?p=alsa-ucm-conf.git |
| |
| Kernel log messages |
| =================== |
| |
| SoundWire |
| --------- |
| A successful initialization will look like this (this will be repeated for |
| each amplifier):: |
| |
| [ 7.568374] cs35l56 sdw:0:0:01fa:3556:01:0: supply VDD_P not found, using dummy regulator |
| [ 7.605208] cs35l56 sdw:0:0:01fa:3556:01:0: supply VDD_IO not found, using dummy regulator |
| [ 7.605313] cs35l56 sdw:0:0:01fa:3556:01:0: supply VDD_A not found, using dummy regulator |
| [ 7.939279] cs35l56 sdw:0:0:01fa:3556:01:0: Cirrus Logic CS35L56 Rev B0 OTP3 fw:3.4.4 (patched=0) |
| [ 7.947844] cs35l56 sdw:0:0:01fa:3556:01:0: Slave 4 state check1: UNATTACHED, status was 1 |
| [ 8.740280] cs35l56 sdw:0:0:01fa:3556:01:0: supply VDD_B not found, using dummy regulator |
| [ 8.740552] cs35l56 sdw:0:0:01fa:3556:01:0: supply VDD_AMP not found, using dummy regulator |
| [ 9.242164] cs35l56 sdw:0:0:01fa:3556:01:0: DSP1: cirrus/cs35l56-b0-dsp1-misc-xxxxxxxx.wmfw: format 3 timestamp 0x66b2b872 |
| [ 9.242173] cs35l56 sdw:0:0:01fa:3556:01:0: DSP1: cirrus/cs35l56-b0-dsp1-misc-xxxxxxxx.wmfw: Tue 05 Dec 2023 21:37:21 GMT Standard Time |
| [ 9.991709] cs35l56 sdw:0:0:01fa:3556:01:0: DSP1: Firmware: 1a00d6 vendor: 0x2 v3.11.23, 41 algorithms |
| [10.039098] cs35l56 sdw:0:0:01fa:3556:01:0: DSP1: cirrus/cs35l56-b0-dsp1-misc-xxxxxxxx-amp1.bin: v3.11.23 |
| [10.879235] cs35l56 sdw:0:0:01fa:3556:01:0: Slave 4 state check1: UNATTACHED, status was 1 |
| [11.401536] cs35l56 sdw:0:0:01fa:3556:01:0: Calibration applied |
| |
| HDA |
| --- |
| A successful initialization will look like this (this will be repeated for |
| each amplifier):: |
| |
| [ 6.306475] cs35l56-hda i2c-CSC3556:00-cs35l56-hda.0: Cirrus Logic CS35L56 Rev B0 OTP3 fw:3.4.4 (patched=0) |
| [ 6.613892] cs35l56-hda i2c-CSC3556:00-cs35l56-hda.0: DSP system name: 'xxxxxxxx', amp name: 'AMP1' |
| [ 8.266660] snd_hda_codec_cs8409 ehdaudio0D0: bound i2c-CSC3556:00-cs35l56-hda.0 (ops cs35l56_hda_comp_ops [snd_hda_scodec_cs35l56]) |
| [ 8.287525] cs35l56-hda i2c-CSC3556:00-cs35l56-hda.0: DSP1: cirrus/cs35l56-b0-dsp1-misc-xxxxxxxx.wmfw: format 3 timestamp 0x66b2b872 |
| [ 8.287528] cs35l56-hda i2c-CSC3556:00-cs35l56-hda.0: DSP1: cirrus/cs35l56-b0-dsp1-misc-xxxxxxxx.wmfw: Tue 05 Dec 2023 21:37:21 GMT Standard Time |
| [ 9.984335] cs35l56-hda i2c-CSC3556:00-cs35l56-hda.0: DSP1: Firmware: 1a00d6 vendor: 0x2 v3.11.23, 41 algorithms |
| [10.085797] cs35l56-hda i2c-CSC3556:00-cs35l56-hda.0: DSP1: cirrus/cs35l56-b0-dsp1-misc-xxxxxxxx-amp1.bin: v3.11.23 |
| [10.655237] cs35l56-hda i2c-CSC3556:00-cs35l56-hda.0: Calibration applied |
| |
| Important messages |
| ~~~~~~~~~~~~~~~~~~ |
| Cirrus Logic CS35L56 Rev B0 OTP3 fw:3.4.4 (patched=0) |
| Shows that the driver has been able to read device ID registers from the |
| amplifier. |
| |
| * The actual amplifier type and silicon revision (CS35L56 B0 in this |
| example) is shown, as read from the amplifier identification registers. |
| * (patched=0) is normal, and indicates that the amplifier has been hard |
| reset and is running default ROM firmware. |
| * (patched=1) means that something has previously downloaded firmware |
| to the amplifier and the driver does not have control of the RESET |
| signal to be able to replace this preloaded firmware. This is normal |
| for systems where the BIOS downloads firmware to the amplifiers |
| before OS boot. |
| This status can also be seen if the cs35l56 kernel module is unloaded |
| and reloaded on a system where the driver does not have control of |
| RESET. SoundWire systems typically do not give the driver control of |
| RESET and only a BIOS (re)boot can reset the amplifiers. |
| |
| DSP1: cirrus/cs35l56-b0-dsp1-misc-xxxxxxxx.wmfw |
| Shows that a .wmfw firmware file was found and downloaded. |
| |
| DSP1: cirrus/cs35l56-b0-dsp1-misc-xxxxxxxx-amp1.bin |
| Shows that a .bin firmware file was found and downloaded. |
| |
| Calibration applied |
| Factory calibration data in EFI was written to the amplifier. |
| |
| Error messages |
| ============== |
| This section explains some of the error messages that the driver can log. |
| |
| Algorithm coefficient version %d.%d.%d but expected %d.%d.%d |
| The version of the .bin file content does not match the loaded firmware. |
| Caused by mismatched .wmfw and .bin file, or .bin file was found but |
| .wmfw was not. |
| |
| No %s for algorithm %x |
| The version of the .bin file content does not match the loaded firmware. |
| Caused by mismatched .wmfw and .bin file, or .bin file was found but |
| .wmfw was not. |
| |
| .bin file required but not found |
| HDA driver did not find a .bin file that matches this hardware. |
| |
| Calibration disabled due to missing firmware controls |
| Driver was not able to write EFI calibration data to firmware registers. |
| This typically means that either: |
| |
| * The driver did not find a suitable wmfw for this hardware, or |
| * The amplifier has already been patched with firmware by something |
| previously, and the driver does not have control of a hard RESET line |
| to be able to reset the amplifier and download the firmware files it |
| found. This situation is indicated by the device identification |
| string in the kernel log shows "(patched=1)" |
| |
| Failed to write calibration |
| Same meaning and cause as "Calibration disabled due to missing firmware |
| controls" |
| |
| Failed to read calibration data from EFI |
| Factory calibration data in EFI is missing, empty or corrupt. |
| This is most likely to be cause by accidentally deleting the file from |
| the EFI filesystem. |
| |
| No calibration for silicon ID |
| The factory calibration data in EFI does not match this hardware. |
| The most likely cause is that an amplifier has been replaced on the |
| motherboard without going through manufacturer calibration process to |
| generate calibration data for the new amplifier. |
| |
| Did not find any buses for CSCxxxx |
| Only on HDA systems. The HDA codec driver found an ACPI entry for |
| Cirrus Logic companion amps, but could not enumerate the ACPI entries for |
| the I2C/SPI buses. The most likely cause of this is that: |
| |
| * The relevant bus driver (I2C or SPI) is not part of the kernel. |
| * The HDA codec driver was built-in to the kernel but the I2C/SPI |
| bus driver is a module and so the HDA codec driver cannot call the |
| bus driver functions. |
| |
| init_completion timed out |
| The SoundWire bus controller (host end) did not enumerate the amplifier. |
| In other words, the ACPI says there is an amplifier but for some reason |
| it was not detected on the bus. |
| |
| No AF01 node |
| Indicates an error in ACPI. A SoundWire system should have a Device() |
| node named "AF01" but it was not found. |
| |
| Failed to get spk-id-gpios |
| ACPI says that the driver should request a GPIO but the driver was not |
| able to get that GPIO. The most likely cause is that the kernel does not |
| include the correct GPIO or PINCTRL driver for this system. |
| |
| Failed to read spk-id |
| ACPI says that the driver should request a GPIO but the driver was not |
| able to read that GPIO. |
| |
| Unexpected spk-id element count |
| AF01 contains more speaker ID GPIO entries than the driver supports |
| |
| Overtemp error |
| Amplifier overheat protection was triggered and the amplifier shut down |
| to protect itself. |
| |
| Amp short error |
| Amplifier detected a short-circuit on the speaker output pins and shut |
| down for protection. This would normally indicate a damaged speaker. |
| |
| Hibernate wake failed |
| The driver tried to wake the amplifier from its power-saving state but |
| did not see the expected responses from the amplifier. This can be caused |
| by using firmware that does not match the hardware. |