about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--nixos/modules/services/hardware/bluetooth.nix49
1 files changed, 36 insertions, 13 deletions
diff --git a/nixos/modules/services/hardware/bluetooth.nix b/nixos/modules/services/hardware/bluetooth.nix
index de0d48032113..71b3a93a2e0d 100644
--- a/nixos/modules/services/hardware/bluetooth.nix
+++ b/nixos/modules/services/hardware/bluetooth.nix
@@ -1,8 +1,11 @@
 { config, lib, pkgs, ... }:
 
 with lib;
+
 let
   bluez-bluetooth = pkgs.bluez;
+  cfg = config.hardware.bluetooth;
+
 in
 
 {
@@ -11,33 +14,53 @@ in
 
   options = {
 
-    hardware.bluetooth.enable = mkOption {
-      type = types.bool;
-      default = false;
-      description = "Whether to enable support for Bluetooth.";
+    hardware.bluetooth.enable = mkEnableOption "support for Bluetooth.";
+
+    hardware.bluetooth.powerOnBoot = mkOption {
+      type    = types.bool;
+      default = true;
+      description = "Whether to power up the default Bluetooth controller on boot.";
     };
 
   };
 
   ###### implementation
 
-  config = mkIf config.hardware.bluetooth.enable {
+  config = mkIf cfg.enable {
 
     environment.systemPackages = [ bluez-bluetooth pkgs.openobex pkgs.obexftp ];
 
     services.udev.packages = [ bluez-bluetooth ];
-
     services.dbus.packages = [ bluez-bluetooth ];
+    systemd.packages       = [ bluez-bluetooth ];
+
+    services.udev.extraRules = optionalString cfg.powerOnBoot ''
+      ACTION=="add", KERNEL=="hci[0-9]*", ENV{SYSTEMD_WANTS}="bluetooth-power@%k.service"
+    '';
+
+    systemd.services = {
+      bluetooth = {
+        wantedBy = [ "bluetooth.target" ];
+        aliases  = [ "dbus-org.bluez.service" ];
+      };
+
+      "bluetooth-power@" = mkIf cfg.powerOnBoot {
+        description = "Power up bluetooth controller";
+        after = [
+          "bluetooth.service"
+          "suspend.target"
+          "sys-subsystem-bluetooth-devices-%i.device"
+        ];
+        wantedBy = [ "suspend.target" ];
+
+        serviceConfig.Type      = "oneshot";
+        serviceConfig.ExecStart = "${pkgs.bluez.out}/bin/hciconfig %i up";
+      };
 
-    systemd.packages = [ bluez-bluetooth ];
-
-    systemd.services.bluetooth = {
-      wantedBy = [ "bluetooth.target" ];
-      aliases = [ "dbus-org.bluez.service" ];
     };
 
-    systemd.user.services.obex = {
-      aliases = [ "dbus-org.bluez.obex.service" ];
+    systemd.user.services = {
+      obex.aliases = [ "dbus-org.bluez.obex.service" ];
     };
 
   };