]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
ACPI: fan: Add hwmon notification support
authorArmin Wolf <W_Armin@gmx.de>
Fri, 24 Oct 2025 18:38:23 +0000 (20:38 +0200)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Mon, 27 Oct 2025 19:56:01 +0000 (20:56 +0100)
The platform firmware can notify the ACPI fan device that the fan
speed has changed. Relay this notification to the hwmon device if
present so that userspace applications can react to it.

Signed-off-by: Armin Wolf <W_Armin@gmx.de>
Link: https://patch.msgid.link/20251024183824.5656-3-W_Armin@gmx.de
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
drivers/acpi/fan.h
drivers/acpi/fan_core.c
drivers/acpi/fan_hwmon.c

index 0d73433c3889236886b9367bb4ab6b35dc767b79..dcc1ad3118ff74f2e16420afad6459f407624a33 100644 (file)
@@ -56,6 +56,9 @@ struct acpi_fan {
        struct acpi_fan_fif fif;
        struct acpi_fan_fps *fps;
        int fps_count;
+#if IS_REACHABLE(CONFIG_HWMON)
+       struct device *hdev;
+#endif
        struct thermal_cooling_device *cdev;
        struct device_attribute fst_speed;
        struct device_attribute fine_grain_control;
@@ -99,8 +102,10 @@ void acpi_fan_delete_attributes(struct acpi_device *device);
 
 #if IS_REACHABLE(CONFIG_HWMON)
 int devm_acpi_fan_create_hwmon(struct device *dev);
+void acpi_fan_notify_hwmon(struct device *dev);
 #else
 static inline int devm_acpi_fan_create_hwmon(struct device *dev) { return 0; };
+static inline void acpi_fan_notify_hwmon(struct device *dev) { };
 #endif
 
 #endif
index 9ee4ef2d6dbcd1d79548509f272c1e7fd94cb70f..7be22c52670ca1638864a121fdd777fd99d915e0 100644 (file)
@@ -326,6 +326,7 @@ static void acpi_fan_notify_handler(acpi_handle handle, u32 event, void *context
                if (ret < 0)
                        dev_err(dev, "Error retrieving current fan status: %d\n", ret);
 
+               acpi_fan_notify_hwmon(dev);
                acpi_bus_generate_netlink_event("fan", dev_name(dev), event, 0);
                break;
        default:
index 47a02ef5a6067193a97e41a78fc1c463e07522c9..d3374f8f524b72652e4a339cb48255eaed05d595 100644 (file)
@@ -162,12 +162,19 @@ static const struct hwmon_chip_info acpi_fan_hwmon_chip_info = {
        .info = acpi_fan_hwmon_info,
 };
 
+void acpi_fan_notify_hwmon(struct device *dev)
+{
+       struct acpi_fan *fan = dev_get_drvdata(dev);
+
+       hwmon_notify_event(fan->hdev, hwmon_fan, hwmon_fan_input, 0);
+}
+
 int devm_acpi_fan_create_hwmon(struct device *dev)
 {
        struct acpi_fan *fan = dev_get_drvdata(dev);
-       struct device *hdev;
 
-       hdev = devm_hwmon_device_register_with_info(dev, "acpi_fan", fan, &acpi_fan_hwmon_chip_info,
-                                                   NULL);
-       return PTR_ERR_OR_ZERO(hdev);
+       fan->hdev = devm_hwmon_device_register_with_info(dev, "acpi_fan", fan,
+                                                        &acpi_fan_hwmon_chip_info, NULL);
+
+       return PTR_ERR_OR_ZERO(fan->hdev);
 }