Ubuntu: Ubuntu 20.4 installing NVIDIA drivers breaks built-in audio on laptop
On a new laptop I couldn’t get the external HDMI monitor to work with the nouveau drivers, so I installed the NVIDIA drivers (version 440).
The NVIDIA drivers worked perfectly and the external monitor could be configured, but it didn’t take too long to notice that the built-in audio wasn’t working.
Audio would only play through HDMI. Disconnecting the monitor wouldn’t make the built-in audio work again.
No audio from the built-in speakers or headphones on a laptop isn’t good.
Reverting to the nouveau drivers wouldn’t fix the audio. I have to say that I have become a fan of the ZFS rollback feature on 20.04 in a flash. You can revert the system to how it was before any update that borks things. You can try different troubleshooting solutions and go back if needed. Big fan.
So, how to get the audio to work again?
First find the audio driver being used. There are several ways to find what audio driver you are using:
$ inxi -iF [...] Audio: Device-1: Intel Cannon Lake PCH cAVS driver: snd_hda_intel Device-2: NVIDIA TU106 High Definition Audio driver: snd_hda_intel Sound Server: ALSA v: k5.4.0-28-generic [...]
$ lshw -c multimedia *-multimedia description: Audio device product: TU106 High Definition Audio Controller vendor: NVIDIA Corporation physical id: 0.1 bus info: pci@0000:01:00.1 version: a1 width: 32 bits clock: 33MHz capabilities: bus_master cap_list configuration: driver=snd_hda_intel latency=0 resources: irq:17 memory:b4000000-b4003fff *-multimedia description: Audio device product: Cannon Lake PCH cAVS vendor: Intel Corporation physical id: 1f.3 bus info: pci@0000:00:1f.3 version: 10 width: 64 bits clock: 33MHz capabilities: bus_master cap_list configuration: driver=snd_hda_intel latency=32 resources: irq:150 memory:b4618000-b461bfff memory:b4200000-b42fffff
$ lspci -v [...] 00:1f.3 Audio device: Intel Corporation Cannon Lake PCH cAVS (rev 10) Subsystem: CLEVO/KAPOK Computer Cannon Lake PCH cAVS Flags: bus master, fast devsel, latency 32, IRQ 150 Memory at b4618000 (64-bit, non-prefetchable) [size=16K] Memory at b4200000 (64-bit, non-prefetchable) [size=1M] Capabilities: <access denied> Kernel driver in use: snd_hda_intel Kernel modules: snd_hda_intel, snd_sof_pci [...] 01:00.1 Audio device: NVIDIA Corporation TU106 High Definition Audio Controller (rev a1) Subsystem: CLEVO/KAPOK Computer TU106 High Definition Audio Controller Flags: bus master, fast devsel, latency 0, IRQ 17 Memory at b4000000 (32-bit, non-prefetchable) [size=16K] Capabilities: <access denied> Kernel driver in use: snd_hda_intel Kernel modules: snd_hda_intel [...]
From the above we can see that the audio driver being used is snd_hda_intel, which is quite common.
Second, find out the audio codecs in use:
$ cat /proc/asound/card0/codec*
The output after installing the NVIDIA drivers that stopped the audio from working shows a lot of UNKNOWN and N/A entries:
Codec: Realtek ALC1220 Address: 0 AFG Function Id: 0x1 (unsol 1) Vendor Id: 0x10ec1220 Subsystem Id: 0x155896e1 Revision Id: 0x100003 No Modem Function Group found Default PCM: N/A Default Amp-In caps: N/A Default Amp-Out caps: N/A State of AFG node 0x01: Power: setting=UNKNOWN, actual=UNKNOWN, Error, Clock-stop-OK, Setting-reset Invalid AFG subtree Codec: Intel Kabylake HDMI Address: 2 AFG Function Id: 0x1 (unsol 0) Vendor Id: 0x8086280b Subsystem Id: 0x80860101 Revision Id: 0x100000 No Modem Function Group found Default PCM: N/A Default Amp-In caps: N/A Default Amp-Out caps: N/A State of AFG node 0x01: Power: setting=UNKNOWN, actual=UNKNOWN, Error, Clock-stop-OK, Setting-reset Invalid AFG subtree
But a normal/working output would be similar to this:
Codec: Realtek ALC1220 Address: 0 AFG Function Id: 0x1 (unsol 1) Vendor Id: 0x10ec1220 Subsystem Id: 0x155896e1 Revision Id: 0x100003 No Modem Function Group found Default PCM: rates [0x5f0]: 32000 44100 48000 88200 96000 192000 bits [0xe]: 16 20 24 formats [0x1]: PCM Default Amp-In caps: N/A Default Amp-Out caps: N/A State of AFG node 0x01: Power states: D0 D1 D2 D3 D3cold CLKSTOP EPSS Power: setting=D0, actual=D0 GPIO: io=8, o=0, i=0, unsolicited=1, wake=0 IO[0]: enable=0, dir=0, wake=0, sticky=0, data=0, unsol=0 IO[1]: enable=0, dir=0, wake=0, sticky=0, data=0, unsol=0 IO[2]: enable=0, dir=0, wake=0, sticky=0, data=0, unsol=0 IO[3]: enable=0, dir=0, wake=0, sticky=0, data=0, unsol=0 IO[4]: enable=0, dir=0, wake=0, sticky=0, data=0, unsol=0 IO[5]: enable=0, dir=0, wake=0, sticky=0, data=0, unsol=0 IO[6]: enable=0, dir=0, wake=0, sticky=0, data=0, unsol=0 IO[7]: enable=0, dir=0, wake=0, sticky=0, data=0, unsol=0 Node 0x02 [Audio Output] wcaps 0x41d: Stereo Amp-Out Control: name="Line Out Playback Volume", index=0, device=0 [...]
From all of the above we can determine that the audio driver used is snd_hda_intel and that the codec is Realtek ALC1220.
It is very likely that your driver will be the same but the codec might vary. If using snd_hda_intel you can lookup what model variant you need searching the codec name in this list:
https://www.infradead.org/~mchehab/rst_conversion/sound/hd-audio/models.html
For the ALC1220 the model name to use seems to be dual-codecs.
Edit your ALSA configuration file:
# vim /etc/modprobe.d/alsa-base.conf
and add this to the end of the file:
# Manual entry to allow audio via headphones because NVIDIA drivers break the built-in audio options snd-hda-intel model=clevo-p950 options snd-hda-intel probe_mask=0x1
I used the wrong model name by mistake. I meant to use dual-codecs but I used the model name just below in the list: clevo-p950. It worked and as it worked I haven’t gone back to edit it.
After updating your alsa configuration file reboot.
Just be more careful than me and choose the model name that matches your system.
After rebooting the audio from the built-in speakers and headphones were working.
You can change the output being used from your settings or using PulseAudio‘s volume control.