On Wed, Jun 21, 2023 at 11:35 PM <nick.hawkins@xxxxxxx> wrote: > The gxp-fan-ctrl driver in HWMON no longer will report fan presence > or fan failure states as these GPIOs providing this information will be > consumed by the host. It will be the hosts function to keep track of > fan presence and status. I understand the approach such that you have also constructed a userspace cooling daemon that will consume the fan and GPIO information to drive the hardware monitoring and that is what you mean when you say "the host" will do it. This is a *bad idea*. While I can't stop you since these are indeed userspace interfaces we provide, I urge you to look into my earlier proposal to use a thermal zone to manage the cooling inside the kernel and get rid of all that custom userspace. The kernel has all that is needed to regulate the thermal zone with PID and on/off regulation. It will work even if the userspace crashes completely, which is what you want. The code is reviewed by a large community and very well tested. I think I showed this example before from arch/arm/boot/dts/gemini-dlink-dns-313.dts: thermal-zones { chassis-thermal { /* Poll every 20 seconds */ polling-delay = <20000>; /* Poll every 2nd second when cooling */ polling-delay-passive = <2000>; thermal-sensors = <&g751>; /* Tripping points from the fan.script in the rootfs */ trips { chassis_alert0: chassis-alert0 { /* At 43 degrees turn on low speed */ temperature = <43000>; hysteresis = <3000>; type = "active"; }; chassis_alert1: chassis-alert1 { /* At 47 degrees turn on high speed */ temperature = <47000>; hysteresis = <3000>; type = "active"; }; chassis_crit: chassis-crit { /* Just shut down at 60 degrees */ temperature = <60000>; hysteresis = <2000>; type = "critical"; }; }; cooling-maps { map0 { trip = <&chassis_alert0>; cooling-device = <&fan0 1 1>; }; map1 { trip = <&chassis_alert1>; cooling-device = <&fan0 2 2>; }; }; }; }; This uses a thermal sensor and a fan with two speeds. Adding a "presence" GPIO to the thermal zone core to enable and disable it which is what your use case needs should be pretty trivial. Yours, Linus Walleij