Je viens d’acheter un ASUS Zenbook 14, modèle UX3402 (Q409Z lorsqu’il est acheté chez Best Buy aux États-Unis). Il était livré avec Windows 11 installé, et la sortie audio fonctionne parfaitement sous Windows. J’ai installé Ubuntu 22.04 dessus, et tout fonctionne sauf les haut-parleurs internes. Il utilise le codec Realtek ALC294 et affiche les logos Harman/Kardon et Dolby Atmos sur le clavier. J’ai essayé toutes les suggestions, comme utiliser hdajackretask pour activer et router divers broches, forcer le module noyau snd_hda_intel (snd_sof_intel_hda était le défaut), réinstaller alsa et pulseaudio, désactiver le fastboot dans le BIOS, mais rien ne fonctionne. Pas un son des haut-parleurs internes. J’ai aussi essayé de modifier les assignations GPIO avec hda-verb, sans succès.
Le plus drôle, c’est que la prise casque et la sortie audio via HDMI et Thunderbolt/DisplayPort fonctionnent. Je peux brancher des écouteurs et entendre le son sans aucun problème. Le matériel audio est donc clairement pris en charge. Je pense que le problème vient peut-être du système audio de ce portable en particulier. Il utilise une configuration audio de type surround, avec possiblement 4 haut-parleurs. Il utilise peut-être aussi un amplificateur intégré qui n’est pas activé. Quand Windows était installé, le Gestionnaire de périphériques montrait un appareil « Cirrus Logic Awesome Speaker Amps » sous « Contrôleurs audio, vidéo et jeu » :
Cependant, je n’ai rien vu à ce sujet en exécutant lspci sous Ubuntu.
Voici la sortie de dmesg au chargement du pilote audio :
[ 3.628292] snd_hda_intel 0000:00:1f.3: enabling device (0000 -> 0002)
[ 3.628620] snd_hda_intel 0000:00:1f.3: Applying patch firmware 'hda-jack-retask.fw'
[ 4.956625] snd_hda_intel 0000:00:1f.3: bound 0000:00:02.0 (ops i915_audio_component_bind_ops [i915])
[ 5.052007] snd_hda_codec_realtek hdaudioC0D0: autoconfig for ALC294: line_outs=1 (0x17/0x0/0x0/0x0/0x0) type:speaker
[ 5.052013] snd_hda_codec_realtek hdaudioC0D0: speaker_outs=0 (0x0/0x0/0x0/0x0/0x0)
[ 5.052016] snd_hda_codec_realtek hdaudioC0D0: hp_outs=1 (0x21/0x0/0x0/0x0/0x0)
[ 5.052017] snd_hda_codec_realtek hdaudioC0D0: mono: mono_out=0x0
[ 5.052018] snd_hda_codec_realtek hdaudioC0D0: inputs:
[ 5.052019] snd_hda_codec_realtek hdaudioC0D0: Headset Mic=0x19
Quelqu’un a-t-il rencontré ce problème avec un portable utilisant un amplificateur intégré ?
MISE À JOUR 1 :
Je pense que les haut-parleurs du portable dépendent d’un circuit intégré amplificateur Cirrus Logic CS35L41 connecté via le bus SPI. Malheureusement, je ne pense pas qu’il existe un pilote Linux, donc aucun moyen de l’activer et de lui envoyer des commandes. Un pilote est apparemment en cours de développement par un employé de Cirrus Logic, mais impossible de savoir si/quand il sera terminé et s’il sera compatible avec ce portable :
MISE À JOUR 2 :
J’ai installé le noyau 5.18.0rc7 et j’ai obtenu la sortie suivante de dmesg :
[ 1.718769] platform CSC3551:00: hash matches
[ 1.718805] acpi CSC3551:00: hash matches
[ 2.896282] Serial bus multi instantiate pseudo device driver CSC3551:00: Instantiated 2 SPI devices.
[ 2.989842] cs35l41_hda: probe of spi1-CSC3551:00-cs35l41-hda.0 failed with error -22
[ 2.990220] cs35l41_hda: probe of spi1-CSC3551:00-cs35l41-hda.1 failed with error -22
Il semble que le noyau détecte les amplificateurs sur le bus SPI, mais ne peut pas passer l’étape de sondage en raison de l’erreur -22. Les choses semblent donc se rapprocher, mais ce n’est pas encore ça.
MISE À JOUR 3 :
J’ai ouvert le portable et je vois deux puces CS35L51X côte à côte sur la carte mère. Ce portable utilise donc deux amplificateurs CS35L51, pas CS35L41. Je ne sais pas si cela a de l’importance, mais c’est définitivement une puce différente (plus récente ?).
MISE À JOUR 4 :
Essayé avec le noyau 5.19.0rc4. Toujours pas fonctionnel, bien qu’il y ait un message supplémentaire « platform not supported ». Je suppose que c’est ce que signifie l’erreur -22 :
[ 4.807553] Serial bus multi instantiate pseudo device driver CSC3551:00: Instantiated 2 SPI devices.
[ 5.053785] cs35l41-hda spi1-CSC3551:00-cs35l41-hda.0: error -EINVAL: Platform not supported -22
[ 5.053791] cs35l41-hda: probe of spi1-CSC3551:00-cs35l41-hda.0 failed with error -22
[ 5.054477] cs35l41-hda spi1-CSC3551:00-cs35l41-hda.1: error -EINVAL: Platform not supported -22
[ 5.054487] cs35l41-hda: probe of spi1-CSC3551:00-cs35l41-hda.1 failed with error -22
MISE À JOUR 5 :
Essayé avec le noyau 6.0 RC3. J’obtiens les mêmes résultats que ceux décrits par Bo Gao ci-dessous (propriétés ACPI _DSD manquantes). Voici la sortie dmesg :
[ 4.245350] Serial bus multi instantiate pseudo device driver CSC3551:00: Instantiated 2 SPI devices.
[ 4.674892] cs35l41-hda spi1-CSC3551:00-cs35l41-hda.0: Error: ACPI _DSD Properties are missing for HID CSC3551.
[ 4.674953] cs35l41-hda spi1-CSC3551:00-cs35l41-hda.0: error -EINVAL: Platform not supported
[ 4.675000] cs35l41-hda: probe of spi1-CSC3551:00-cs35l41-hda.0 failed with error -22
[ 4.675363] cs35l41-hda spi1-CSC3551:00-cs35l41-hda.1: Error: ACPI _DSD Properties are missing for HID CSC3551.
[ 4.675413] cs35l41-hda spi1-CSC3551:00-cs35l41-hda.1: error -EINVAL: Platform not supported
[ 4.675454] cs35l41-hda: probe of spi1-CSC3551:00-cs35l41-hda.1 failed with error -22
Malgré l’absence de ces propriétés dans le BIOS, ces amplificateurs fonctionnent toujours parfaitement sous Windows. Peut-être que ces propriétés peuvent donc être récupérées depuis une installation Windows. J’ai un double démarrage Linux/Windows sur ce portable, il m’est donc facile de chercher tout ce dont les développeurs open source de Cirrus Logic pourraient avoir besoin (si vous lisez ceci, faites-le moi savoir !).
MISE À JOUR 6 :
J’ai essayé de compiler un noyau 5.19 en utilisant des correctifs (modifiés) référencés par Bo Gao. Au moins un amplificateur a semblé s’activer correctement, mais toujours pas de son et le redémarrage n’a pas aidé. Cependant, ma configuration est différente. Le correctif PCI quirks publié pourrait ne pas fonctionner avec ce portable, car les amplificateurs sont connectés via SPI, pas I2C, et le correctif référencé semble être pour I2C. De plus, ce portable utilise le codec Realtek ALC294. Voici la sortie dmesg :
[ 4.272896] cs35l41-hda spi1-CSC3551:00-cs35l41-hda.0: Cirrus Logic CS35L41 (35a40), Revision: B2
[ 4.273073] cs35l41-hda spi1-CSC3551:00-cs35l41-hda.1: Reset line busy, assuming shared reset
[ 4.377887] cs35l41-hda spi1-CSC3551:00-cs35l41-hda.1: Failed waiting for OTP_BOOT_DONE: -110
[ 4.377984] cs35l41-hda: probe of spi1-CSC3551:00-cs35l41-hda.1 failed with error -110
J’ai essayé quelques variations des PCI quirks dans le correctif Realtek (ceux préfixés par « ALC294 »), mais aucun n’a fonctionné. Je ne suis pas sûr que ces quirks soient effectivement sélectionnés. Y a-t-il un moyen de vérifier qu’ils sont actifs ?
Source : Super User