|
| 1 | +.. SPDX-License-Identifier: GPL-2.0-only |
| 2 | +
|
| 3 | +===================================================================== |
| 4 | +Audio drivers for Cirrus Logic CS35L54/56/57 Boosted Smart Amplifiers |
| 5 | +===================================================================== |
| 6 | +:Copyright: 2025 Cirrus Logic, Inc. and |
| 7 | + Cirrus Logic International Semiconductor Ltd. |
| 8 | + |
| 9 | + |
| 10 | + |
| 11 | +Summary |
| 12 | +======= |
| 13 | + |
| 14 | +The high-level summary of this document is: |
| 15 | + |
| 16 | +**If you have a laptop that uses CS35L54/56/57 amplifiers but audio is not |
| 17 | +working, DO NOT ATTEMPT TO USE FIRMWARE AND SETTINGS FROM ANOTHER LAPTOP, |
| 18 | +EVEN IF THAT LAPTOP SEEMS SIMILAR.** |
| 19 | + |
| 20 | +The CS35L54/56/57 amplifiers must be correctly configured for the power |
| 21 | +supply voltage, speaker impedance, maximum speaker voltage/current, and |
| 22 | +other external hardware connections. |
| 23 | + |
| 24 | +The amplifiers feature advanced boost technology that increases the voltage |
| 25 | +used to drive the speakers, while proprietary speaker protection algorithms |
| 26 | +allow these boosted amplifiers to push the limits of the speakers without |
| 27 | +causing damage. These **must** be configured correctly. |
| 28 | + |
| 29 | +Supported Cirrus Logic amplifiers |
| 30 | +--------------------------------- |
| 31 | + |
| 32 | +The cs35l56 drivers support: |
| 33 | + |
| 34 | +* CS35L54 |
| 35 | +* CS35L56 |
| 36 | +* CS35L57 |
| 37 | + |
| 38 | +There are two drivers in the kernel |
| 39 | + |
| 40 | +*For systems using SoundWire*: sound/soc/codecs/cs35l56.c and associated files |
| 41 | + |
| 42 | +*For systems using HDA*: sound/pci/hda/cs35l56_hda.c |
| 43 | + |
| 44 | +Firmware |
| 45 | +======== |
| 46 | + |
| 47 | +The amplifier is controlled and managed by firmware running on the internal |
| 48 | +DSP. Firmware files are essential to enable the full capabilities of the |
| 49 | +amplifier. |
| 50 | + |
| 51 | +Firmware is distributed in the linux-firmware repository: |
| 52 | +https://gitlab.com/kernel-firmware/linux-firmware.git |
| 53 | + |
| 54 | +On most SoundWire systems the amplifier has a default minimum capability to |
| 55 | +produce audio. However this will be |
| 56 | + |
| 57 | +* at low volume, to protect the speakers, since the speaker specifications |
| 58 | + and power supply voltages are unknown. |
| 59 | +* a mono mix of left and right channels. |
| 60 | + |
| 61 | +On some SoundWire systems that have both CS42L43 and CS35L56/57 the CS35L56/57 |
| 62 | +receive their audio from the CS42L43 instead of directly from the host |
| 63 | +SoundWire interface. These systems can be identified by the CS42L43 showing |
| 64 | +in dmesg as a SoundWire device, but the CS35L56/57 as SPI. On these systems |
| 65 | +the firmware is *mandatory* to enable receiving the audio from the CS42L43. |
| 66 | + |
| 67 | +On HDA systems the firmware is *mandatory* to enable HDA bridge mode. There |
| 68 | +will not be any audio from the amplifiers without firmware. |
| 69 | + |
| 70 | +Cirrus Logic firmware files |
| 71 | +--------------------------- |
| 72 | + |
| 73 | +Each amplifier requires two firmware files. One file has a .wmfw suffix, the |
| 74 | +other has a .bin suffix. |
| 75 | + |
| 76 | +The firmware is customized by the OEM to match the hardware of each laptop, |
| 77 | +and the firmware is specific to that laptop. Because of this, there are many |
| 78 | +firmware files in linux-firmware for these amplifiers. Firmware files are |
| 79 | +**not interchangeable between laptops**. |
| 80 | + |
| 81 | +Cirrus Logic submits files for known laptops to the upstream linux-firmware |
| 82 | +repository. Providing Cirrus Logic is aware of a particular laptop and has |
| 83 | +permission from the manufacturer to publish the firmware, it will be pushed |
| 84 | +to linux-firmware. You may need to upgrade to a newer release of |
| 85 | +linux-firmware to obtain the firmware for your laptop. |
| 86 | + |
| 87 | +**Important:** the Makefile for linux-firmware creates symlinks that are listed |
| 88 | +in the WHENCE file. These symlinks are required for the CS35L56 driver to be |
| 89 | +able to load the firmware. |
| 90 | + |
| 91 | +How do I know which firmware file I should have? |
| 92 | +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| 93 | +All firmware file names are qualified with a unique "system ID". On normal |
| 94 | +x86 PCs with PCI audio this is the Vendor Subsystem ID (SSID) of the host |
| 95 | +PCI audio interface. |
| 96 | + |
| 97 | +The SSID can be viewed using the lspci tool:: |
| 98 | + |
| 99 | + lspci -v -nn | grep -A2 -i audio |
| 100 | + 0000:00:1f.3 Audio device [0403]: Intel Corporation Meteor Lake-P HD Audio Controller [8086:7e28] |
| 101 | + Subsystem: Dell Meteor Lake-P HD Audio Controller [1028:0c63] |
| 102 | + |
| 103 | +In this example the SSID is 10280c63. |
| 104 | + |
| 105 | +The format of the firmware file names is: |
| 106 | + |
| 107 | + cs35lxx-b0-dsp1-misc-SSID[-spkidX]-ampN |
| 108 | + |
| 109 | +Where: |
| 110 | + |
| 111 | + * cs35lxx-b0 is the amplifier model and silicon revision. This information |
| 112 | + is logged by the driver during initialization. |
| 113 | + * SSID is the 8-digit hexadecimal SSID value. |
| 114 | + * ampN is the amplifier number (for example amp1). This is the same as |
| 115 | + the prefix on the ALSA control names except that it is always lower-case |
| 116 | + in the file name. |
| 117 | + * spkidX is an optional part, used for laptops that have firmware |
| 118 | + configurations for different makes and models of internal speakers. |
| 119 | + |
| 120 | +Sound Open Firmware and ALSA topology files |
| 121 | +------------------------------------------- |
| 122 | + |
| 123 | +All SoundWire systems will require a Sound Open Firmware (SOF) for the |
| 124 | +host CPU audio DSP, together with an ALSA topology file (.tplg). |
| 125 | + |
| 126 | +The SOF firmware will usually be provided by the manufacturer of the host |
| 127 | +CPU (i.e. Intel or AMD). The .tplg file is normally part of the SOF firmware |
| 128 | +release. |
| 129 | + |
| 130 | +SOF binary builds are available from: https://github.com/thesofproject/sof-bin/releases |
| 131 | + |
| 132 | +The main SOF source is here: https://github.com/thesofproject |
| 133 | + |
| 134 | +ALSA-ucm configurations |
| 135 | +----------------------- |
| 136 | +Typically an appropriate ALSA-ucm configuration file is needed for |
| 137 | +use-case managers and audio servers such as PipeWire. |
| 138 | + |
| 139 | +Configuration files are available from the alsa-ucm-conf repository: |
| 140 | +https://git.alsa-project.org/?p=alsa-ucm-conf.git |
| 141 | + |
| 142 | +Kernel log messages |
| 143 | +=================== |
| 144 | + |
| 145 | +SoundWire |
| 146 | +--------- |
| 147 | +A successful initialization will look like this (this will be repeated for |
| 148 | +each amplifier):: |
| 149 | + |
| 150 | + [ 7.568374] cs35l56 sdw:0:0:01fa:3556:01:0: supply VDD_P not found, using dummy regulator |
| 151 | + [ 7.605208] cs35l56 sdw:0:0:01fa:3556:01:0: supply VDD_IO not found, using dummy regulator |
| 152 | + [ 7.605313] cs35l56 sdw:0:0:01fa:3556:01:0: supply VDD_A not found, using dummy regulator |
| 153 | + [ 7.939279] cs35l56 sdw:0:0:01fa:3556:01:0: Cirrus Logic CS35L56 Rev B0 OTP3 fw:3.4.4 (patched=0) |
| 154 | + [ 7.947844] cs35l56 sdw:0:0:01fa:3556:01:0: Slave 4 state check1: UNATTACHED, status was 1 |
| 155 | + [ 8.740280] cs35l56 sdw:0:0:01fa:3556:01:0: supply VDD_B not found, using dummy regulator |
| 156 | + [ 8.740552] cs35l56 sdw:0:0:01fa:3556:01:0: supply VDD_AMP not found, using dummy regulator |
| 157 | + [ 9.242164] cs35l56 sdw:0:0:01fa:3556:01:0: DSP1: cirrus/cs35l56-b0-dsp1-misc-xxxxxxxx.wmfw: format 3 timestamp 0x66b2b872 |
| 158 | + [ 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 |
| 159 | + [ 9.991709] cs35l56 sdw:0:0:01fa:3556:01:0: DSP1: Firmware: 1a00d6 vendor: 0x2 v3.11.23, 41 algorithms |
| 160 | + [10.039098] cs35l56 sdw:0:0:01fa:3556:01:0: DSP1: cirrus/cs35l56-b0-dsp1-misc-xxxxxxxx-amp1.bin: v3.11.23 |
| 161 | + [10.879235] cs35l56 sdw:0:0:01fa:3556:01:0: Slave 4 state check1: UNATTACHED, status was 1 |
| 162 | + [11.401536] cs35l56 sdw:0:0:01fa:3556:01:0: Calibration applied |
| 163 | + |
| 164 | +HDA |
| 165 | +--- |
| 166 | +A successful initialization will look like this (this will be repeated for |
| 167 | +each amplifier):: |
| 168 | + |
| 169 | + [ 6.306475] cs35l56-hda i2c-CSC3556:00-cs35l56-hda.0: Cirrus Logic CS35L56 Rev B0 OTP3 fw:3.4.4 (patched=0) |
| 170 | + [ 6.613892] cs35l56-hda i2c-CSC3556:00-cs35l56-hda.0: DSP system name: 'xxxxxxxx', amp name: 'AMP1' |
| 171 | + [ 8.266660] snd_hda_codec_cs8409 ehdaudio0D0: bound i2c-CSC3556:00-cs35l56-hda.0 (ops cs35l56_hda_comp_ops [snd_hda_scodec_cs35l56]) |
| 172 | + [ 8.287525] cs35l56-hda i2c-CSC3556:00-cs35l56-hda.0: DSP1: cirrus/cs35l56-b0-dsp1-misc-xxxxxxxx.wmfw: format 3 timestamp 0x66b2b872 |
| 173 | + [ 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 |
| 174 | + [ 9.984335] cs35l56-hda i2c-CSC3556:00-cs35l56-hda.0: DSP1: Firmware: 1a00d6 vendor: 0x2 v3.11.23, 41 algorithms |
| 175 | + [10.085797] cs35l56-hda i2c-CSC3556:00-cs35l56-hda.0: DSP1: cirrus/cs35l56-b0-dsp1-misc-xxxxxxxx-amp1.bin: v3.11.23 |
| 176 | + [10.655237] cs35l56-hda i2c-CSC3556:00-cs35l56-hda.0: Calibration applied |
| 177 | + |
| 178 | +Important messages |
| 179 | +~~~~~~~~~~~~~~~~~~ |
| 180 | +Cirrus Logic CS35L56 Rev B0 OTP3 fw:3.4.4 (patched=0) |
| 181 | + Shows that the driver has been able to read device ID registers from the |
| 182 | + amplifier. |
| 183 | + |
| 184 | + * The actual amplifier type and silicon revision (CS35L56 B0 in this |
| 185 | + example) is shown, as read from the amplifier identification registers. |
| 186 | + * (patched=0) is normal, and indicates that the amplifier has been hard |
| 187 | + reset and is running default ROM firmware. |
| 188 | + * (patched=1) means that something has previously downloaded firmware |
| 189 | + to the amplifier and the driver does not have control of the RESET |
| 190 | + signal to be able to replace this preloaded firmware. This is normal |
| 191 | + for systems where the BIOS downloads firmware to the amplifiers |
| 192 | + before OS boot. |
| 193 | + This status can also be seen if the cs35l56 kernel module is unloaded |
| 194 | + and reloaded on a system where the driver does not have control of |
| 195 | + RESET. SoundWire systems typically do not give the driver control of |
| 196 | + RESET and only a BIOS (re)boot can reset the amplifiers. |
| 197 | + |
| 198 | +DSP1: cirrus/cs35l56-b0-dsp1-misc-xxxxxxxx.wmfw |
| 199 | + Shows that a .wmfw firmware file was found and downloaded. |
| 200 | + |
| 201 | +DSP1: cirrus/cs35l56-b0-dsp1-misc-xxxxxxxx-amp1.bin |
| 202 | + Shows that a .bin firmware file was found and downloaded. |
| 203 | + |
| 204 | +Calibration applied |
| 205 | + Factory calibration data in EFI was written to the amplifier. |
| 206 | + |
| 207 | +Error messages |
| 208 | +============== |
| 209 | +This section explains some of the error messages that the driver can log. |
| 210 | + |
| 211 | +Algorithm coefficient version %d.%d.%d but expected %d.%d.%d |
| 212 | + The version of the .bin file content does not match the loaded firmware. |
| 213 | + Caused by mismatched .wmfw and .bin file, or .bin file was found but |
| 214 | + .wmfw was not. |
| 215 | + |
| 216 | +No %s for algorithm %x |
| 217 | + The version of the .bin file content does not match the loaded firmware. |
| 218 | + Caused by mismatched .wmfw and .bin file, or .bin file was found but |
| 219 | + .wmfw was not. |
| 220 | + |
| 221 | +.bin file required but not found |
| 222 | + HDA driver did not find a .bin file that matches this hardware. |
| 223 | + |
| 224 | +Calibration disabled due to missing firmware controls |
| 225 | + Driver was not able to write EFI calibration data to firmware registers. |
| 226 | + This typically means that either: |
| 227 | + |
| 228 | + * The driver did not find a suitable wmfw for this hardware, or |
| 229 | + * The amplifier has already been patched with firmware by something |
| 230 | + previously, and the driver does not have control of a hard RESET line |
| 231 | + to be able to reset the amplifier and download the firmware files it |
| 232 | + found. This situation is indicated by the device identification |
| 233 | + string in the kernel log shows "(patched=1)" |
| 234 | + |
| 235 | +Failed to write calibration |
| 236 | + Same meaning and cause as "Calibration disabled due to missing firmware |
| 237 | + controls" |
| 238 | + |
| 239 | +Failed to read calibration data from EFI |
| 240 | + Factory calibration data in EFI is missing, empty or corrupt. |
| 241 | + This is most likely to be cause by accidentally deleting the file from |
| 242 | + the EFI filesystem. |
| 243 | + |
| 244 | +No calibration for silicon ID |
| 245 | + The factory calibration data in EFI does not match this hardware. |
| 246 | + The most likely cause is that an amplifier has been replaced on the |
| 247 | + motherboard without going through manufacturer calibration process to |
| 248 | + generate calibration data for the new amplifier. |
| 249 | + |
| 250 | +Did not find any buses for CSCxxxx |
| 251 | + Only on HDA systems. The HDA codec driver found an ACPI entry for |
| 252 | + Cirrus Logic companion amps, but could not enumerate the ACPI entries for |
| 253 | + the I2C/SPI buses. The most likely cause of this is that: |
| 254 | + |
| 255 | + * The relevant bus driver (I2C or SPI) is not part of the kernel. |
| 256 | + * The HDA codec driver was built-in to the kernel but the I2C/SPI |
| 257 | + bus driver is a module and so the HDA codec driver cannot call the |
| 258 | + bus driver functions. |
| 259 | + |
| 260 | +init_completion timed out |
| 261 | + The SoundWire bus controller (host end) did not enumerate the amplifier. |
| 262 | + In other words, the ACPI says there is an amplifier but for some reason |
| 263 | + it was not detected on the bus. |
| 264 | + |
| 265 | +No AF01 node |
| 266 | + Indicates an error in ACPI. A SoundWire system should have a Device() |
| 267 | + node named "AF01" but it was not found. |
| 268 | + |
| 269 | +Failed to get spk-id-gpios |
| 270 | + ACPI says that the driver should request a GPIO but the driver was not |
| 271 | + able to get that GPIO. The most likely cause is that the kernel does not |
| 272 | + include the correct GPIO or PINCTRL driver for this system. |
| 273 | + |
| 274 | +Failed to read spk-id |
| 275 | + ACPI says that the driver should request a GPIO but the driver was not |
| 276 | + able to read that GPIO. |
| 277 | + |
| 278 | +Unexpected spk-id element count |
| 279 | + AF01 contains more speaker ID GPIO entries than the driver supports |
| 280 | + |
| 281 | +Overtemp error |
| 282 | + Amplifier overheat protection was triggered and the amplifier shut down |
| 283 | + to protect itself. |
| 284 | + |
| 285 | +Amp short error |
| 286 | + Amplifier detected a short-circuit on the speaker output pins and shut |
| 287 | + down for protection. This would normally indicate a damaged speaker. |
| 288 | + |
| 289 | +Hibernate wake failed |
| 290 | + The driver tried to wake the amplifier from its power-saving state but |
| 291 | + did not see the expected responses from the amplifier. This can be caused |
| 292 | + by using firmware that does not match the hardware. |
0 commit comments