+++ date = "2023-01-21T13:53:18+00:00" lastmod = "2023-01-21T13:53:18+00:00" tags = [ "linux", "gists" ] author = "tdro" +++ {{< disclose >}} A NixOS configuration for a [working sound driver](https://github.com/davidjo/snd_hda_macbookpro#readme) on an [A1418]() Cirrus Logic CS8409/CS42L83. {{}} ``` nix {caption="../packages/snd-hda-cs8409/default.nix"} { stdenv, lib, fetchgit, linuxKernel, kernel ? linuxKernel.kernels.linux_5_15 , version ? "d0d785dc1859b09299bde6d0f1d6786a0d610e7f" }: stdenv.mkDerivation { inherit version; name = "sna-hda-codec-cs8409-${version}-module-${kernel.modDirVersion}"; # Upstream: https://github.com/davidjo/snd_hda_macbookpro src = fetchgit { url = "https://github.com/egorenar/snd-hda-codec-cs8409.git"; rev = version; sha256 = "sha256-0UeoERcYpM+ojeZ7dDIE3ruTIoHkkC+s7FcoEVUTR0w="; }; hardeningDisable = [ "pic" ]; nativeBuildInputs = kernel.moduleBuildDependencies; NIX_CFLAGS_COMPILE = [ "-g" "-Wall" "-Wno-unused-variable" "-Wno-unused-function" ]; makeFlags = kernel.makeFlags ++ [ "INSTALL_MOD_PATH=$(out)" "KERNELRELEASE=${kernel.modDirVersion}" "KERNEL_DIR=${kernel.dev}/lib/modules/${kernel.modDirVersion}/build" ]; postPatch = '' printf ' snd-hda-codec-cs8409-objs := patch_cs8409.o patch_cs8409-tables.o obj-$(CONFIG_SND_HDA_CODEC_CS8409) += snd-hda-codec-cs8409.o KBUILD_EXTRA_CFLAGS = "-DAPPLE_PINSENSE_FIXUP -DAPPLE_CODECS -DCONFIG_SND_HDA_RECONFIG=1" KERNELRELEASE ?= $(shell uname -r) KERNEL_DIR ?= /lib/modules/$(KERNELRELEASE)/build PWD := $(shell pwd) default: make -C $(KERNEL_DIR) M=$(PWD) CFLAGS_MODULE=$(KBUILD_EXTRA_CFLAGS) install: make -C $(KERNEL_DIR) M=$(PWD) modules_install ' \ > Makefile sed --in-place 's||"${linuxKernel.kernels.linux_6_0.dev}/lib/modules/${linuxKernel.kernels.linux_6_0.modDirVersion}/source/include/sound/cs42l42.h"|' patch_cs8409.h sed --in-place 's|hda_local.h|${kernel.dev}/lib/modules/${kernel.modDirVersion}/source/sound/pci/hda/hda_local.h|' patch_cs8409.h sed --in-place 's|hda_jack.h|${kernel.dev}/lib/modules/${kernel.modDirVersion}/source/sound/pci/hda/hda_jack.h|' patch_cs8409.h sed --in-place 's|hda_generic.h|${kernel.dev}/lib/modules/${kernel.modDirVersion}/source/sound/pci/hda/hda_generic.h|' patch_cs8409.h sed --in-place 's|hda_auto_parser.h|${kernel.dev}/lib/modules/${kernel.modDirVersion}/source/sound/pci/hda/hda_auto_parser.h|' patch_cs8409.h ''; meta = { platforms = lib.platforms.linux; }; } ``` Then build it as a extra/custom kernel module. The results of stumbling upon yet another troublesome device... ```nix {caption="hardware.nix"} { pkgs, ... }: { boot = { extraModulePackages = [ (pkgs.callPackage ../packages/snd-hda-cs8409/default.nix { kernel = pkgs.linux_5_15; }) ]; }; } ```