4.2 KiB
snd-hda-codec-cs8409 (out-of-tree)
Out-of-tree Linux kernel module for the Cirrus Logic CS8409 HD Audio bridge and related fixups (including Apple machine quirks). It mirrors the in-kernel ALSA HDA codec driver logic but can be built and updated without rebuilding the whole kernel.
Requirements
- Linux kernel headers for the kernel you are running
(e.g. on Debian/Ubuntu/Pop!_OS:linux-headers-$(uname -r)) - Toolchain able to build external modules (
gcc,make, etc.) - Build from a shell where
uname -rmatches the target kernel (or setKVER— see below)
Build
Always build from this directory using the provided Makefile so module C flags are applied correctly:
cd /path/to/snd-hda-codec-cs8409
make
Do not run only:
make -C /lib/modules/$(uname -r)/build M=$(pwd) modules
without passing the same CFLAGS_MODULE values as in the Makefile all: recipe. The Makefile sets defines such as APPLE_CODECS and CONFIG_SND_HDA_RECONFIG that this tree expects.
Optional: build for another installed kernel
make KVER=6.18.7-76061807-generic
(Use the directory name under /lib/modules/ for that kernel.)
Install module into updates/ (takes precedence over in-tree module)
sudo make install
sudo depmod -a # install target runs depmod; repeat if you copy the .ko manually
Reload the audio stack or reboot as appropriate on your distribution (e.g. unload/reload snd-hda-intel and related modules, or reboot).
Kernel compatibility
Recent work in this repository targets modern kernels (6.17+) where the ALSA HDA stack uses:
struct hda_codec_driverwithprobe/removeinstead of the oldcodec->patch_ops/.freecallbackssnd_hda_gen_remove()instead of the formersnd_hda_gen_free()export (a compatibility wrapper inhda_generic.hmaps the old name for this module)
The module has been verified to build and run on 6.18.x (e.g. Pop!_OS). Older kernels may still work if the symbols and APIs match; if not, use a branch or commit intended for that era.
Tested on
| Environment | Kernel | Notes |
|---|---|---|
| Pop!_OS | 6.18.7-76061807-generic |
make and sudo make install succeed; audio confirmed working after reload/reboot as needed on the test machine. |
Always install kernel headers that match your running kernel (linux-headers-$(uname -r) on Debian-based systems).
Development
The entire set of changes in this repository as published here—the kernel 6.17+ HDA API port (hda_codec_driver, variant ops, snd_hda_gen_remove compatibility), Makefile / .gitignore updates, README, and related integration—was written and iterated using Cursor (AI-assisted editor). The CS8409 codec logic and Apple extensions remain derived from Cirrus Logic and the Linux ALSA HDA codebase; original SPDX and copyright lines in the source files still apply.
Configuration flags (Makefile)
KBUILD_EXTRA_CFLAGS enables, among other things:
APPLE_CODECS— Apple-specific paths inpatch_cirrus_apple.hAPPLE_PINSENSE_FIXUPCONFIG_SND_HDA_RECONFIG
A debug-oriented line is commented out in the Makefile (extra logging defines).
License
The sources are under GPL-2.0-or-later (see SPDX headers in the individual files). This tree includes code attributed to Cirrus Logic and Takashi Iwai / the ALSA project, consistent with the upstream HDA codec drivers.
Troubleshooting
| Issue | What to check |
|---|---|
No rule to make target .../build |
Install kernel headers for uname -r. |
Many errors about missing cs8409_spec fields |
Build with this repo’s make (see above), not bare kbuild without CFLAGS_MODULE. |
modpost: "snd_hda_gen_free" undefined |
Use a tree that includes the hda_generic.h wrapper for snd_hda_gen_remove (kernel ≥ 6.17). |
| Compiler differs from kernel | Usually a warning only; same major gcc as the distro kernel is ideal. |
Contributing
Pull requests and reports against specific kernel version and hardware (PCI subsystem ID, machine model) help keep this module useful for others.