{ config, lib, pkgs, ... }:

{
  hardware = {
    deviceTree = {
      filter = "bcm2711-rpi-*.dtb";
      overlays = [{
        name = "rpi-poe";
        dtsText = ''
          /*
           * Overlay for the Raspberry Pi POE HAT.
           */
          /dts-v1/;
          /plugin/;

          / {
            compatible = "brcm,bcm2711";

          	fragment@0 {
          		target-path = "/";
          		__overlay__ {
          			fan0: rpi-poe-fan@0 {
          				compatible = "raspberrypi,rpi-poe-fan";
          				firmware = <&firmware>;
          				cooling-min-state = <0>;
          				cooling-max-state = <4>;
          				#cooling-cells = <2>;
          				cooling-levels = <0 1 10 100 255>;
          				status = "okay";
          			};
          		};
          	};

          	fragment@1 {
          		target = <&cpu_thermal>;
          		__overlay__ {
          			trips {
          				trip0: trip0 {
          					temperature = <40000>;
          					hysteresis = <2000>;
          					type = "active";
          				};
          				trip1: trip1 {
          					temperature = <45000>;
          					hysteresis = <2000>;
          					type = "active";
          				};
          				trip2: trip2 {
          					temperature = <50000>;
          					hysteresis = <2000>;
          					type = "active";
          				};
          				trip3: trip3 {
          					temperature = <55000>;
          					hysteresis = <5000>;
          					type = "active";
          				};
          			};
          			cooling-maps {
          				map0 {
          					trip = <&trip0>;
          					cooling-device = <&fan0 0 1>;
          				};
          				map1 {
          					trip = <&trip1>;
          					cooling-device = <&fan0 1 2>;
          				};
          				map2 {
          					trip = <&trip2>;
          					cooling-device = <&fan0 2 3>;
          				};
          				map3 {
          					trip = <&trip3>;
          					cooling-device = <&fan0 3 4>;
          				};
          			};
          		};
          	};

          	fragment@2 {
          		target-path = "/__overrides__";
          		__overlay__ {
          			poe_fan_temp0 =		<&trip0>,"temperature:0";
          			poe_fan_temp0_hyst =	<&trip0>,"hysteresis:0";
          			poe_fan_temp1 =		<&trip1>,"temperature:0";
          			poe_fan_temp1_hyst =	<&trip1>,"hysteresis:0";
          			poe_fan_temp2 =		<&trip2>,"temperature:0";
          			poe_fan_temp2_hyst =	<&trip2>,"hysteresis:0";
          			poe_fan_temp3 =		<&trip3>,"temperature:0";
          			poe_fan_temp3_hyst =	<&trip3>,"hysteresis:0";
          		};
          	};

          	__overrides__ {
          		poe_fan_temp0 =		<&trip0>,"temperature:0";
          		poe_fan_temp0_hyst =	<&trip0>,"hysteresis:0";
          		poe_fan_temp1 =		<&trip1>,"temperature:0";
          		poe_fan_temp1_hyst =	<&trip1>,"hysteresis:0";
          		poe_fan_temp2 =		<&trip2>,"temperature:0";
          		poe_fan_temp2_hyst =	<&trip2>,"hysteresis:0";
          		poe_fan_temp3 =		<&trip3>,"temperature:0";
          		poe_fan_temp3_hyst =	<&trip3>,"hysteresis:0";
          	};
          };
        '';
      }];
    };
  };
}