diff options
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.patch | 172 |
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 + |