summarylogtreecommitdiffstats
path: root/0009-platform-x86-asus-wmi-support-middle-fan-custom-curv.patch
diff options
context:
space:
mode:
Diffstat (limited to '0009-platform-x86-asus-wmi-support-middle-fan-custom-curv.patch')
-rw-r--r--0009-platform-x86-asus-wmi-support-middle-fan-custom-curv.patch172
1 files changed, 172 insertions, 0 deletions
diff --git a/0009-platform-x86-asus-wmi-support-middle-fan-custom-curv.patch b/0009-platform-x86-asus-wmi-support-middle-fan-custom-curv.patch
new file mode 100644
index 000000000000..d81dad9632ec
--- /dev/null
+++ b/0009-platform-x86-asus-wmi-support-middle-fan-custom-curv.patch
@@ -0,0 +1,172 @@
+From 21a0a1c935b8dde224e24ca027ff49bee7bfed01 Mon Sep 17 00:00:00 2001
+From: "Luke D. Jones" <luke@ljones.dev>
+Date: Sun, 4 Jun 2023 19:37:34 +1200
+Subject: [PATCH 09/11] platform/x86: asus-wmi: support middle fan custom
+ curves
+
+Adds support for fan curves defined for the middle fan which
+is available on some ASUS ROG laptops.
+
+Signed-off-by: Luke D. Jones <luke@ljones.dev>
+---
+ drivers/platform/x86/asus-wmi.c | 75 +++++++++++++++++++++-
+ include/linux/platform_data/x86/asus-wmi.h | 1 +
+ 2 files changed, 74 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/platform/x86/asus-wmi.c b/drivers/platform/x86/asus-wmi.c
+index 8cc532166559..d63d0111cb8b 100644
+--- a/drivers/platform/x86/asus-wmi.c
++++ b/drivers/platform/x86/asus-wmi.c
+@@ -114,6 +114,7 @@ module_param(fnlock_default, bool, 0444);
+ #define FAN_CURVE_BUF_LEN 32
+ #define FAN_CURVE_DEV_CPU 0x00
+ #define FAN_CURVE_DEV_GPU 0x01
++#define FAN_CURVE_DEV_MID 0x02
+ /* Mask to determine if setting temperature or percentage */
+ #define FAN_CURVE_PWM_MASK 0x04
+
+@@ -255,7 +256,8 @@ struct asus_wmi {
+
+ bool cpu_fan_curve_available;
+ bool gpu_fan_curve_available;
+- struct fan_curve_data custom_fan_curves[2];
++ bool mid_fan_curve_available;
++ struct fan_curve_data custom_fan_curves[3];
+
+ struct platform_profile_handler platform_profile_handler;
+ bool platform_profile_support;
+@@ -2082,6 +2084,8 @@ static ssize_t pwm1_enable_store(struct device *dev,
+ asus->custom_fan_curves[FAN_CURVE_DEV_CPU].enabled = false;
+ if (asus->gpu_fan_curve_available)
+ asus->custom_fan_curves[FAN_CURVE_DEV_GPU].enabled = false;
++ if (asus->mid_fan_curve_available)
++ asus->custom_fan_curves[FAN_CURVE_DEV_MID].enabled = false;
+
+ return count;
+ }
+@@ -2533,6 +2537,9 @@ static int fan_curve_get_factory_default(struct asus_wmi *asus, u32 fan_dev)
+ if (fan_dev == ASUS_WMI_DEVID_GPU_FAN_CURVE)
+ fan_idx = FAN_CURVE_DEV_GPU;
+
++ if (fan_dev == ASUS_WMI_DEVID_MID_FAN_CURVE)
++ fan_idx = FAN_CURVE_DEV_MID;
++
+ curves = &asus->custom_fan_curves[fan_idx];
+ err = asus_wmi_evaluate_method_buf(asus->dsts_id, fan_dev, mode, buf,
+ FAN_CURVE_BUF_LEN);
+@@ -2821,6 +2828,42 @@ static SENSOR_DEVICE_ATTR_2_RW(pwm2_auto_point7_pwm, fan_curve,
+ static SENSOR_DEVICE_ATTR_2_RW(pwm2_auto_point8_pwm, fan_curve,
+ FAN_CURVE_DEV_GPU | FAN_CURVE_PWM_MASK, 7);
+
++/* MID */
++static SENSOR_DEVICE_ATTR_RW(pwm3_enable, fan_curve_enable, FAN_CURVE_DEV_GPU);
++static SENSOR_DEVICE_ATTR_2_RW(pwm3_auto_point1_temp, fan_curve,
++ FAN_CURVE_DEV_GPU, 0);
++static SENSOR_DEVICE_ATTR_2_RW(pwm3_auto_point2_temp, fan_curve,
++ FAN_CURVE_DEV_GPU, 1);
++static SENSOR_DEVICE_ATTR_2_RW(pwm3_auto_point3_temp, fan_curve,
++ FAN_CURVE_DEV_GPU, 2);
++static SENSOR_DEVICE_ATTR_2_RW(pwm3_auto_point4_temp, fan_curve,
++ FAN_CURVE_DEV_GPU, 3);
++static SENSOR_DEVICE_ATTR_2_RW(pwm3_auto_point5_temp, fan_curve,
++ FAN_CURVE_DEV_GPU, 4);
++static SENSOR_DEVICE_ATTR_2_RW(pwm3_auto_point6_temp, fan_curve,
++ FAN_CURVE_DEV_GPU, 5);
++static SENSOR_DEVICE_ATTR_2_RW(pwm3_auto_point7_temp, fan_curve,
++ FAN_CURVE_DEV_GPU, 6);
++static SENSOR_DEVICE_ATTR_2_RW(pwm3_auto_point8_temp, fan_curve,
++ FAN_CURVE_DEV_GPU, 7);
++
++static SENSOR_DEVICE_ATTR_2_RW(pwm3_auto_point1_pwm, fan_curve,
++ FAN_CURVE_DEV_GPU | FAN_CURVE_PWM_MASK, 0);
++static SENSOR_DEVICE_ATTR_2_RW(pwm3_auto_point2_pwm, fan_curve,
++ FAN_CURVE_DEV_GPU | FAN_CURVE_PWM_MASK, 1);
++static SENSOR_DEVICE_ATTR_2_RW(pwm3_auto_point3_pwm, fan_curve,
++ FAN_CURVE_DEV_GPU | FAN_CURVE_PWM_MASK, 2);
++static SENSOR_DEVICE_ATTR_2_RW(pwm3_auto_point4_pwm, fan_curve,
++ FAN_CURVE_DEV_GPU | FAN_CURVE_PWM_MASK, 3);
++static SENSOR_DEVICE_ATTR_2_RW(pwm3_auto_point5_pwm, fan_curve,
++ FAN_CURVE_DEV_GPU | FAN_CURVE_PWM_MASK, 4);
++static SENSOR_DEVICE_ATTR_2_RW(pwm3_auto_point6_pwm, fan_curve,
++ FAN_CURVE_DEV_GPU | FAN_CURVE_PWM_MASK, 5);
++static SENSOR_DEVICE_ATTR_2_RW(pwm3_auto_point7_pwm, fan_curve,
++ FAN_CURVE_DEV_GPU | FAN_CURVE_PWM_MASK, 6);
++static SENSOR_DEVICE_ATTR_2_RW(pwm3_auto_point8_pwm, fan_curve,
++ FAN_CURVE_DEV_GPU | FAN_CURVE_PWM_MASK, 7);
++
+ static struct attribute *asus_fan_curve_attr[] = {
+ /* CPU */
+ &sensor_dev_attr_pwm1_enable.dev_attr.attr,
+@@ -2858,6 +2901,24 @@ static struct attribute *asus_fan_curve_attr[] = {
+ &sensor_dev_attr_pwm2_auto_point6_pwm.dev_attr.attr,
+ &sensor_dev_attr_pwm2_auto_point7_pwm.dev_attr.attr,
+ &sensor_dev_attr_pwm2_auto_point8_pwm.dev_attr.attr,
++ /* MID */
++ &sensor_dev_attr_pwm3_enable.dev_attr.attr,
++ &sensor_dev_attr_pwm3_auto_point1_temp.dev_attr.attr,
++ &sensor_dev_attr_pwm3_auto_point2_temp.dev_attr.attr,
++ &sensor_dev_attr_pwm3_auto_point3_temp.dev_attr.attr,
++ &sensor_dev_attr_pwm3_auto_point4_temp.dev_attr.attr,
++ &sensor_dev_attr_pwm3_auto_point5_temp.dev_attr.attr,
++ &sensor_dev_attr_pwm3_auto_point6_temp.dev_attr.attr,
++ &sensor_dev_attr_pwm3_auto_point7_temp.dev_attr.attr,
++ &sensor_dev_attr_pwm3_auto_point8_temp.dev_attr.attr,
++ &sensor_dev_attr_pwm3_auto_point1_pwm.dev_attr.attr,
++ &sensor_dev_attr_pwm3_auto_point2_pwm.dev_attr.attr,
++ &sensor_dev_attr_pwm3_auto_point3_pwm.dev_attr.attr,
++ &sensor_dev_attr_pwm3_auto_point4_pwm.dev_attr.attr,
++ &sensor_dev_attr_pwm3_auto_point5_pwm.dev_attr.attr,
++ &sensor_dev_attr_pwm3_auto_point6_pwm.dev_attr.attr,
++ &sensor_dev_attr_pwm3_auto_point7_pwm.dev_attr.attr,
++ &sensor_dev_attr_pwm3_auto_point8_pwm.dev_attr.attr,
+ NULL
+ };
+
+@@ -2877,6 +2938,9 @@ static umode_t asus_fan_curve_is_visible(struct kobject *kobj,
+ if (asus->gpu_fan_curve_available && attr->name[3] == '2')
+ return 0644;
+
++ if (asus->mid_fan_curve_available && attr->name[3] == '3')
++ return 0644;
++
+ return 0;
+ }
+
+@@ -2906,7 +2970,12 @@ static int asus_wmi_custom_fan_curve_init(struct asus_wmi *asus)
+ if (err)
+ return err;
+
+- if (!asus->cpu_fan_curve_available && !asus->gpu_fan_curve_available)
++ err = fan_curve_check_present(asus, &asus->mid_fan_curve_available,
++ ASUS_WMI_DEVID_MID_FAN_CURVE);
++ if (err)
++ return err;
++
++ if (!asus->cpu_fan_curve_available && !asus->gpu_fan_curve_available && !asus->mid_fan_curve_available)
+ return 0;
+
+ hwmon = devm_hwmon_device_register_with_groups(
+@@ -2975,6 +3044,8 @@ static int throttle_thermal_policy_write(struct asus_wmi *asus)
+ asus->custom_fan_curves[FAN_CURVE_DEV_CPU].enabled = false;
+ if (asus->gpu_fan_curve_available)
+ asus->custom_fan_curves[FAN_CURVE_DEV_GPU].enabled = false;
++ if (asus->mid_fan_curve_available)
++ asus->custom_fan_curves[FAN_CURVE_DEV_MID].enabled = false;
+
+ return 0;
+ }
+diff --git a/include/linux/platform_data/x86/asus-wmi.h b/include/linux/platform_data/x86/asus-wmi.h
+index 94e3172b9c72..dc5e8038d88b 100644
+--- a/include/linux/platform_data/x86/asus-wmi.h
++++ b/include/linux/platform_data/x86/asus-wmi.h
+@@ -87,6 +87,7 @@
+ #define ASUS_WMI_DEVID_MID_FAN_CTRL 0x00110031
+ #define ASUS_WMI_DEVID_CPU_FAN_CURVE 0x00110024
+ #define ASUS_WMI_DEVID_GPU_FAN_CURVE 0x00110025
++#define ASUS_WMI_DEVID_MID_FAN_CURVE 0x00110032
+
+ /* Power */
+ #define ASUS_WMI_DEVID_PROCESSOR_STATE 0x00120012
+--
+2.40.1
+