]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
platform/x86: oxpec: Adhere to sysfs-class-hwmon and enable pwm on 2
authorAntheas Kapenekakis <lkml@antheas.dev>
Fri, 25 Apr 2025 11:18:16 +0000 (13:18 +0200)
committerIlpo Järvinen <ilpo.jarvinen@linux.intel.com>
Wed, 30 Apr 2025 11:05:39 +0000 (14:05 +0300)
Currently, the driver does not adhere to the sysfs-class-hwmon
specification: 0 is used for auto fan control and 1 is used for manual
control. However, it is expected that 0 sets the fan to full speed,
1 sets the fan to manual, and then 2 is used for automatic control.

Therefore, change the sysfs API to reflect this and enable pwm on 2.

As we are breaking the ABI for this driver, rename oxpec to oxp_ec,
reflecting the naming convention used by other drivers, to allow for
a smooth migration in current userspace programs.

Closes: https://lore.kernel.org/linux-hwmon/20241027174836.8588-1-derekjohn.clark@gmail.com/
Reviewed-by: Derek J. Clark <derekjohn.clark@gmail.com>
Reviewed-by: Thomas Weißschuh <linux@weissschuh.net>
Signed-off-by: Antheas Kapenekakis <lkml@antheas.dev>
Link: https://lore.kernel.org/r/20250425111821.88746-12-lkml@antheas.dev
Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
drivers/platform/x86/oxpec.c

index 918a553bd8969306bf9d7658d288ea620f5e427d..45dfe0a7578b7ad81d10803a130a50aa121dbccc 100644 (file)
@@ -732,7 +732,27 @@ static int oxp_platform_read(struct device *dev, enum hwmon_sensor_types type,
                case hwmon_pwm_input:
                        return oxp_pwm_input_read(val);
                case hwmon_pwm_enable:
-                       return oxp_pwm_read(val);
+                       ret = oxp_pwm_read(val);
+                       if (ret)
+                               return ret;
+
+                       /* Check for auto and return 2 */
+                       if (!*val) {
+                               *val = 2;
+                               return 0;
+                       }
+
+                       /* Return 0 if at full fan speed, 1 otherwise */
+                       ret = oxp_pwm_fan_speed(val);
+                       if (ret)
+                               return ret;
+
+                       if (*val == 255)
+                               *val = 0;
+                       else
+                               *val = 1;
+
+                       return 0;
                default:
                        break;
                }
@@ -746,15 +766,24 @@ static int oxp_platform_read(struct device *dev, enum hwmon_sensor_types type,
 static int oxp_platform_write(struct device *dev, enum hwmon_sensor_types type,
                              u32 attr, int channel, long val)
 {
+       int ret;
+
        switch (type) {
        case hwmon_pwm:
                switch (attr) {
                case hwmon_pwm_enable:
                        if (val == 1)
                                return oxp_pwm_enable();
-                       else if (val == 0)
+                       else if (val == 2)
                                return oxp_pwm_disable();
-                       return -EINVAL;
+                       else if (val != 0)
+                               return -EINVAL;
+
+                       /* Enable PWM and set to max speed */
+                       ret = oxp_pwm_enable();
+                       if (ret)
+                               return ret;
+                       return oxp_pwm_input_write(255);
                case hwmon_pwm_input:
                        return oxp_pwm_input_write(val);
                default:
@@ -819,7 +848,7 @@ static int oxp_platform_probe(struct platform_device *pdev)
        struct device *dev = &pdev->dev;
        struct device *hwdev;
 
-       hwdev = devm_hwmon_device_register_with_info(dev, "oxpec", NULL,
+       hwdev = devm_hwmon_device_register_with_info(dev, "oxp_ec", NULL,
                                                     &oxp_ec_chip_info, NULL);
 
        return PTR_ERR_OR_ZERO(hwdev);