platform/x86: asus-wmi: Expand support of GPU fan to read RPM and label
authorLuke D. Jones <luke@ljones.dev>
Fri, 16 Sep 2022 00:46:23 +0000 (12:46 +1200)
committerHans de Goede <hdegoede@redhat.com>
Mon, 19 Sep 2022 12:43:51 +0000 (14:43 +0200)
The previously added patch to add support for pwm change for TUF laptops
also is usuable for more than TUF. The same method `0x00110014` is
used to read the fan RPM.

Add two extra attributes for reading fan2 plus fan2 label.

Signed-off-by: Luke D. Jones <luke@ljones.dev>
Link: https://lore.kernel.org/r/20220916004623.10992-1-luke@ljones.dev
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
drivers/platform/x86/asus-wmi.c

index ae46af7..6e8e093 100644 (file)
@@ -72,6 +72,7 @@ module_param(fnlock_default, bool, 0444);
 
 #define ASUS_WMI_FNLOCK_BIOS_DISABLED  BIT(0)
 
+#define ASUS_GPU_FAN_DESC              "gpu_fan"
 #define ASUS_FAN_DESC                  "cpu_fan"
 #define ASUS_FAN_MFUN                  0x13
 #define ASUS_FAN_SFUN_READ             0x06
@@ -2078,6 +2079,30 @@ static ssize_t asus_hwmon_temp1(struct device *dev,
 }
 
 /* GPU fan on modern ROG laptops */
+static ssize_t fan2_input_show(struct device *dev,
+                                       struct device_attribute *attr,
+                                       char *buf)
+{
+       struct asus_wmi *asus = dev_get_drvdata(dev);
+       int value;
+       int ret;
+
+       ret = asus_wmi_get_devstate(asus, ASUS_WMI_DEVID_GPU_FAN_CTRL, &value);
+       if (ret < 0)
+               return ret;
+
+       value &= 0xffff;
+
+       return sysfs_emit(buf, "%d\n", value * 100);
+}
+
+static ssize_t fan2_label_show(struct device *dev,
+                                         struct device_attribute *attr,
+                                         char *buf)
+{
+       return sysfs_emit(buf, "%s\n", ASUS_GPU_FAN_DESC);
+}
+
 static ssize_t pwm2_enable_show(struct device *dev,
                                struct device_attribute *attr,
                                char *buf)
@@ -2127,9 +2152,12 @@ static ssize_t pwm2_enable_store(struct device *dev,
 /* Fan1 */
 static DEVICE_ATTR_RW(pwm1);
 static DEVICE_ATTR_RW(pwm1_enable);
-static DEVICE_ATTR_RW(pwm2_enable);
 static DEVICE_ATTR_RO(fan1_input);
 static DEVICE_ATTR_RO(fan1_label);
+/* Fan2 - GPU fan */
+static DEVICE_ATTR_RW(pwm2_enable);
+static DEVICE_ATTR_RO(fan2_input);
+static DEVICE_ATTR_RO(fan2_label);
 
 /* Temperature */
 static DEVICE_ATTR(temp1_input, S_IRUGO, asus_hwmon_temp1, NULL);
@@ -2140,6 +2168,8 @@ static struct attribute *hwmon_attributes[] = {
        &dev_attr_pwm2_enable.attr,
        &dev_attr_fan1_input.attr,
        &dev_attr_fan1_label.attr,
+       &dev_attr_fan2_input.attr,
+       &dev_attr_fan2_label.attr,
 
        &dev_attr_temp1_input.attr,
        NULL
@@ -2160,7 +2190,9 @@ static umode_t asus_hwmon_sysfs_is_visible(struct kobject *kobj,
            || attr == &dev_attr_pwm1_enable.attr) {
                if (asus->fan_type == FAN_TYPE_NONE)
                        return 0;
-       } else if (attr == &dev_attr_pwm2_enable.attr) {
+       } else if (attr == &dev_attr_fan2_input.attr
+           || attr == &dev_attr_fan2_label.attr
+           || attr == &dev_attr_pwm2_enable.attr) {
                if (asus->gpu_fan_type == FAN_TYPE_NONE)
                        return 0;
        } else if (attr == &dev_attr_temp1_input.attr) {