diff --git a/nixos/modules/hardware/video/webcam/facetimehd.nix b/nixos/modules/hardware/video/webcam/facetimehd.nix new file mode 100644 index 00000000000..83d954a0c03 --- /dev/null +++ b/nixos/modules/hardware/video/webcam/facetimehd.nix @@ -0,0 +1,43 @@ +{ config, lib, pkgs, ... }: + +with lib; + +let + + cfg = config.hardware.facetimehd; + + kernelPackages = config.boot.kernelPackages; + +in + +{ + + options.hardware.facetimehd.enable = mkEnableOption "facetimehd kernel module"; + + config = mkIf cfg.enable { + + assertions = singleton { + assertion = versionAtLeast kernelPackages.kernel.version "3.19"; + message = "facetimehd is not supported for kernels older than 3.19"; + }; + + boot.kernelModules = [ "facetimehd" ]; + + boot.extraModulePackages = [ kernelPackages.facetimehd ]; + + hardware.firmware = [ pkgs.facetimehd-firmware ]; + + # unload module during suspend/hibernate as it crashes the whole system + powerManagement.powerDownCommands = '' + ${pkgs.module_init_tools}/bin/rmmod -f facetimehd + ''; + + # and load it back on resume + powerManagement.resumeCommands = '' + export MODULE_DIR=/run/current-system/kernel-modules/lib/modules + ${pkgs.module_init_tools}/bin/modprobe -v facetimehd + ''; + + }; + +} diff --git a/nixos/modules/module-list.nix b/nixos/modules/module-list.nix index 2ff61877c23..48834128d9b 100644 --- a/nixos/modules/module-list.nix +++ b/nixos/modules/module-list.nix @@ -42,6 +42,7 @@ ./hardware/video/bumblebee.nix ./hardware/video/nvidia.nix ./hardware/video/ati.nix + ./hardware/video/webcam/facetimehd.nix ./installer/tools/auto-upgrade.nix ./installer/tools/nixos-checkout.nix ./installer/tools/tools.nix diff --git a/pkgs/os-specific/linux/facetimehd/default.nix b/pkgs/os-specific/linux/facetimehd/default.nix new file mode 100644 index 00000000000..06e6abfe417 --- /dev/null +++ b/pkgs/os-specific/linux/facetimehd/default.nix @@ -0,0 +1,34 @@ +{ stdenv, fetchFromGitHub, kernel }: + +# facetimehd is not supported for kernels older than 3.19"; +assert stdenv.lib.versionAtLeast kernel.version "3.19"; + +stdenv.mkDerivation rec { + + name = "facetimehd-${version}-${kernel.version}"; + version = "git-20160127"; + + src = fetchFromGitHub { + owner = "patjak"; + repo = "bcwc_pcie"; + rev = "186e9f9101ed9bbd7cc8d470f840d4a74c585ca7"; + sha256 = "1frsf6z6v94cz9fww9rbnk926jzl36fp3w2d1aw6djhzwm80a5gs"; + }; + + preConfigure = '' + export INSTALL_MOD_PATH="$out" + ''; + + makeFlags = [ + "KDIR=${kernel.dev}/lib/modules/${kernel.modDirVersion}/build" + ]; + + meta = with stdenv.lib; { + homepage = https://github.com/patjak/bcwc_pcie; + description = "Linux driver for the Facetime HD (Broadcom 1570) PCIe webcam"; + license = licenses.gpl2; + maintainers = [ maintainers.womfoo ]; + platforms = platforms.linux; + }; + +} diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index 311cbd1f76a..452d12e5a64 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -10263,6 +10263,8 @@ let openafsClient = callPackage ../servers/openafs-client { }; + facetimehd = callPackage ../os-specific/linux/facetimehd { }; + kernelHeaders = callPackage ../os-specific/linux/kernel-headers { }; klibc = callPackage ../os-specific/linux/klibc { };