diff options
Diffstat (limited to 'SOURCES/asus-linux.patch')
-rw-r--r-- | SOURCES/asus-linux.patch | 720 |
1 files changed, 385 insertions, 335 deletions
diff --git a/SOURCES/asus-linux.patch b/SOURCES/asus-linux.patch index e554970..491e5be 100644 --- a/SOURCES/asus-linux.patch +++ b/SOURCES/asus-linux.patch @@ -1,7 +1,7 @@ -From 56e04226a7083c234b1bb04f7c0dca6f15e9ca2b Mon Sep 17 00:00:00 2001 +From 5a57dbe832b2dc8cc79516977f4fbbfed64c4743 Mon Sep 17 00:00:00 2001 From: "Luke D. Jones" <luke@ljones.dev> Date: Sun, 4 Jun 2023 18:48:11 +1200 -Subject: [PATCH 01/15] platform/x86: asus-wmi: add support for showing charger +Subject: [PATCH 01/13] platform/x86: asus-wmi: add support for showing charger mode Expose a WMI method in sysfs platform for showing which connected @@ -34,7 +34,7 @@ index a77a004a1baa..eb29e3023c7b 100644 + * 3 - Both connected, barrel used for charging \ No newline at end of file diff --git a/drivers/platform/x86/asus-wmi.c b/drivers/platform/x86/asus-wmi.c -index 1038dfdcdd32..f23375d5fb82 100644 +index 8bef66a2f0ce..cf82ae6323f8 100644 --- a/drivers/platform/x86/asus-wmi.c +++ b/drivers/platform/x86/asus-wmi.c @@ -237,6 +237,7 @@ struct asus_wmi { @@ -68,7 +68,7 @@ index 1038dfdcdd32..f23375d5fb82 100644 /* dGPU ********************************************************************/ static ssize_t dgpu_disable_show(struct device *dev, struct device_attribute *attr, char *buf) -@@ -3462,6 +3479,7 @@ static struct attribute *platform_attributes[] = { +@@ -3472,6 +3489,7 @@ static struct attribute *platform_attributes[] = { &dev_attr_camera.attr, &dev_attr_cardr.attr, &dev_attr_touchpad.attr, @@ -76,7 +76,7 @@ index 1038dfdcdd32..f23375d5fb82 100644 &dev_attr_egpu_enable.attr, &dev_attr_dgpu_disable.attr, &dev_attr_gpu_mux_mode.attr, -@@ -3491,6 +3509,8 @@ static umode_t asus_sysfs_is_visible(struct kobject *kobj, +@@ -3501,6 +3519,8 @@ static umode_t asus_sysfs_is_visible(struct kobject *kobj, devid = ASUS_WMI_DEVID_LID_RESUME; else if (attr == &dev_attr_als_enable.attr) devid = ASUS_WMI_DEVID_ALS_ENABLE; @@ -85,7 +85,7 @@ index 1038dfdcdd32..f23375d5fb82 100644 else if (attr == &dev_attr_egpu_enable.attr) ok = asus->egpu_enable_available; else if (attr == &dev_attr_dgpu_disable.attr) -@@ -3757,6 +3777,7 @@ static int asus_wmi_add(struct platform_device *pdev) +@@ -3767,6 +3787,7 @@ static int asus_wmi_add(struct platform_device *pdev) if (err) goto fail_platform; @@ -110,10 +110,10 @@ index 28234dc9fa6a..f90cafe26af1 100644 -- 2.41.0 -From 098acb8fe7bb5cea142002f0c855cc5e3bd220e8 Mon Sep 17 00:00:00 2001 +From 6c0e89067d0608fedd3b75844bdea5566a0c249f Mon Sep 17 00:00:00 2001 From: "Luke D. Jones" <luke@ljones.dev> Date: Sun, 4 Jun 2023 19:07:31 +1200 -Subject: [PATCH 02/15] platform/x86: asus-wmi: add support for showing middle +Subject: [PATCH 02/13] platform/x86: asus-wmi: add support for showing middle fan RPM Some newer ASUS ROG laptops now have a middle/center fan in addition @@ -129,7 +129,7 @@ Signed-off-by: Luke D. Jones <luke@ljones.dev> 2 files changed, 92 insertions(+) diff --git a/drivers/platform/x86/asus-wmi.c b/drivers/platform/x86/asus-wmi.c -index f23375d5fb82..375d25ae0aca 100644 +index cf82ae6323f8..069251d8040f 100644 --- a/drivers/platform/x86/asus-wmi.c +++ b/drivers/platform/x86/asus-wmi.c @@ -72,6 +72,7 @@ module_param(fnlock_default, bool, 0444); @@ -151,7 +151,7 @@ index f23375d5fb82..375d25ae0aca 100644 int agfn_pwm; bool fan_boost_mode_available; -@@ -2129,6 +2132,31 @@ static ssize_t fan2_label_show(struct device *dev, +@@ -2139,6 +2142,31 @@ static ssize_t fan2_label_show(struct device *dev, return sysfs_emit(buf, "%s\n", ASUS_GPU_FAN_DESC); } @@ -183,7 +183,7 @@ index f23375d5fb82..375d25ae0aca 100644 static ssize_t pwm2_enable_show(struct device *dev, struct device_attribute *attr, char *buf) -@@ -2175,6 +2203,52 @@ static ssize_t pwm2_enable_store(struct device *dev, +@@ -2185,6 +2213,52 @@ static ssize_t pwm2_enable_store(struct device *dev, return count; } @@ -236,7 +236,7 @@ index f23375d5fb82..375d25ae0aca 100644 /* Fan1 */ static DEVICE_ATTR_RW(pwm1); static DEVICE_ATTR_RW(pwm1_enable); -@@ -2184,6 +2258,10 @@ static DEVICE_ATTR_RO(fan1_label); +@@ -2194,6 +2268,10 @@ static DEVICE_ATTR_RO(fan1_label); static DEVICE_ATTR_RW(pwm2_enable); static DEVICE_ATTR_RO(fan2_input); static DEVICE_ATTR_RO(fan2_label); @@ -247,7 +247,7 @@ index f23375d5fb82..375d25ae0aca 100644 /* Temperature */ static DEVICE_ATTR(temp1_input, S_IRUGO, asus_hwmon_temp1, NULL); -@@ -2192,10 +2270,13 @@ static struct attribute *hwmon_attributes[] = { +@@ -2202,10 +2280,13 @@ static struct attribute *hwmon_attributes[] = { &dev_attr_pwm1.attr, &dev_attr_pwm1_enable.attr, &dev_attr_pwm2_enable.attr, @@ -261,7 +261,7 @@ index f23375d5fb82..375d25ae0aca 100644 &dev_attr_temp1_input.attr, NULL -@@ -2221,6 +2302,11 @@ static umode_t asus_hwmon_sysfs_is_visible(struct kobject *kobj, +@@ -2231,6 +2312,11 @@ static umode_t asus_hwmon_sysfs_is_visible(struct kobject *kobj, || attr == &dev_attr_pwm2_enable.attr) { if (asus->gpu_fan_type == FAN_TYPE_NONE) return 0; @@ -273,7 +273,7 @@ index f23375d5fb82..375d25ae0aca 100644 } else if (attr == &dev_attr_temp1_input.attr) { int err = asus_wmi_get_devstate(asus, ASUS_WMI_DEVID_THERMAL_CTRL, -@@ -2264,6 +2350,7 @@ static int asus_wmi_hwmon_init(struct asus_wmi *asus) +@@ -2274,6 +2360,7 @@ static int asus_wmi_hwmon_init(struct asus_wmi *asus) static int asus_wmi_fan_init(struct asus_wmi *asus) { asus->gpu_fan_type = FAN_TYPE_NONE; @@ -281,7 +281,7 @@ index f23375d5fb82..375d25ae0aca 100644 asus->fan_type = FAN_TYPE_NONE; asus->agfn_pwm = -1; -@@ -2278,6 +2365,10 @@ static int asus_wmi_fan_init(struct asus_wmi *asus) +@@ -2288,6 +2375,10 @@ static int asus_wmi_fan_init(struct asus_wmi *asus) if (asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_GPU_FAN_CTRL)) asus->gpu_fan_type = FAN_TYPE_SPEC83; @@ -307,10 +307,10 @@ index f90cafe26af1..2c03bda7703f 100644 -- 2.41.0 -From a23870110a38146cc951435c9955f3484df7a0b5 Mon Sep 17 00:00:00 2001 +From 60f66172c03e8cf8417818173c253824527a6d69 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 03/15] platform/x86: asus-wmi: support middle fan custom +Subject: [PATCH 03/13] platform/x86: asus-wmi: support middle fan custom curves Adds support for fan curves defined for the middle fan which @@ -323,7 +323,7 @@ Signed-off-by: Luke D. Jones <luke@ljones.dev> 2 files changed, 76 insertions(+), 2 deletions(-) diff --git a/drivers/platform/x86/asus-wmi.c b/drivers/platform/x86/asus-wmi.c -index 375d25ae0aca..fb27218e51cf 100644 +index 069251d8040f..89867b18e8f7 100644 --- a/drivers/platform/x86/asus-wmi.c +++ b/drivers/platform/x86/asus-wmi.c @@ -113,6 +113,7 @@ module_param(fnlock_default, bool, 0444); @@ -344,7 +344,7 @@ index 375d25ae0aca..fb27218e51cf 100644 struct platform_profile_handler platform_profile_handler; bool platform_profile_support; -@@ -2080,6 +2082,8 @@ static ssize_t pwm1_enable_store(struct device *dev, +@@ -2090,6 +2092,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; @@ -353,7 +353,7 @@ index 375d25ae0aca..fb27218e51cf 100644 return count; } -@@ -2531,6 +2535,9 @@ static int fan_curve_get_factory_default(struct asus_wmi *asus, u32 fan_dev) +@@ -2541,6 +2545,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; @@ -363,7 +363,7 @@ index 375d25ae0aca..fb27218e51cf 100644 curves = &asus->custom_fan_curves[fan_idx]; err = asus_wmi_evaluate_method_buf(asus->dsts_id, fan_dev, mode, buf, FAN_CURVE_BUF_LEN); -@@ -2819,6 +2826,42 @@ static SENSOR_DEVICE_ATTR_2_RW(pwm2_auto_point7_pwm, fan_curve, +@@ -2829,6 +2836,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); @@ -406,7 +406,7 @@ index 375d25ae0aca..fb27218e51cf 100644 static struct attribute *asus_fan_curve_attr[] = { /* CPU */ &sensor_dev_attr_pwm1_enable.dev_attr.attr, -@@ -2856,6 +2899,24 @@ static struct attribute *asus_fan_curve_attr[] = { +@@ -2866,6 +2909,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, @@ -431,7 +431,7 @@ index 375d25ae0aca..fb27218e51cf 100644 NULL }; -@@ -2875,6 +2936,9 @@ static umode_t asus_fan_curve_is_visible(struct kobject *kobj, +@@ -2885,6 +2946,9 @@ static umode_t asus_fan_curve_is_visible(struct kobject *kobj, if (asus->gpu_fan_curve_available && attr->name[3] == '2') return 0644; @@ -441,7 +441,7 @@ index 375d25ae0aca..fb27218e51cf 100644 return 0; } -@@ -2904,7 +2968,14 @@ static int asus_wmi_custom_fan_curve_init(struct asus_wmi *asus) +@@ -2914,7 +2978,14 @@ static int asus_wmi_custom_fan_curve_init(struct asus_wmi *asus) if (err) return err; @@ -457,7 +457,7 @@ index 375d25ae0aca..fb27218e51cf 100644 return 0; hwmon = devm_hwmon_device_register_with_groups( -@@ -2973,6 +3044,8 @@ static int throttle_thermal_policy_write(struct asus_wmi *asus) +@@ -2983,6 +3054,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; @@ -481,10 +481,10 @@ index 2c03bda7703f..329efc086993 100644 -- 2.41.0 -From 54101e21219d5fcda1cd2dc752be1f1335138d0d Mon Sep 17 00:00:00 2001 +From 0b90e1673515c0cf89f43c9a7f5cd06db9c7b3f2 Mon Sep 17 00:00:00 2001 From: "Luke D. Jones" <luke@ljones.dev> Date: Sun, 4 Jun 2023 20:01:57 +1200 -Subject: [PATCH 04/15] platform/x86: asus-wmi: add WMI method to show if egpu +Subject: [PATCH 04/13] platform/x86: asus-wmi: add WMI method to show if egpu connected Exposes the WMI method which tells if the eGPU is properly connected @@ -518,7 +518,7 @@ index eb29e3023c7b..878daf7c2036 100644 + * 0 - False, + * 1 - True diff --git a/drivers/platform/x86/asus-wmi.c b/drivers/platform/x86/asus-wmi.c -index fb27218e51cf..0c8a4a46b121 100644 +index 89867b18e8f7..a65cf8599124 100644 --- a/drivers/platform/x86/asus-wmi.c +++ b/drivers/platform/x86/asus-wmi.c @@ -243,6 +243,7 @@ struct asus_wmi { @@ -552,7 +552,7 @@ index fb27218e51cf..0c8a4a46b121 100644 /* gpu mux switch *************************************************************/ static ssize_t gpu_mux_mode_show(struct device *dev, struct device_attribute *attr, char *buf) -@@ -3645,6 +3662,7 @@ static struct attribute *platform_attributes[] = { +@@ -3655,6 +3672,7 @@ static struct attribute *platform_attributes[] = { &dev_attr_touchpad.attr, &dev_attr_charge_mode.attr, &dev_attr_egpu_enable.attr, @@ -560,7 +560,7 @@ index fb27218e51cf..0c8a4a46b121 100644 &dev_attr_dgpu_disable.attr, &dev_attr_gpu_mux_mode.attr, &dev_attr_lid_resume.attr, -@@ -3677,6 +3695,8 @@ static umode_t asus_sysfs_is_visible(struct kobject *kobj, +@@ -3687,6 +3705,8 @@ static umode_t asus_sysfs_is_visible(struct kobject *kobj, ok = asus->charge_mode_available; else if (attr == &dev_attr_egpu_enable.attr) ok = asus->egpu_enable_available; @@ -569,7 +569,7 @@ index fb27218e51cf..0c8a4a46b121 100644 else if (attr == &dev_attr_dgpu_disable.attr) ok = asus->dgpu_disable_available; else if (attr == &dev_attr_gpu_mux_mode.attr) -@@ -3943,6 +3963,7 @@ static int asus_wmi_add(struct platform_device *pdev) +@@ -3953,6 +3973,7 @@ static int asus_wmi_add(struct platform_device *pdev) asus->charge_mode_available = asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_CHARGE_MODE); asus->egpu_enable_available = asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_EGPU); @@ -595,10 +595,10 @@ index 329efc086993..2034648f8cdf 100644 -- 2.41.0 -From b6c07d4c56c033ea46baa8519160e1e20ba4cba3 Mon Sep 17 00:00:00 2001 +From 1bddf53ccac067e043857d28c1598401cd9db7f4 Mon Sep 17 00:00:00 2001 From: "Luke D. Jones" <luke@ljones.dev> Date: Tue, 20 Jun 2023 12:26:51 +1200 -Subject: [PATCH 05/15] platform/x86: asus-wmi: don't allow eGPU switching if +Subject: [PATCH 05/13] platform/x86: asus-wmi: don't allow eGPU switching if eGPU not connected Check the ASUS_WMI_DEVID_EGPU_CONNECTED method for eGPU connection @@ -610,7 +610,7 @@ Signed-off-by: Luke D. Jones <luke@ljones.dev> 1 file changed, 9 insertions(+) diff --git a/drivers/platform/x86/asus-wmi.c b/drivers/platform/x86/asus-wmi.c -index 0c8a4a46b121..821addb284d7 100644 +index a65cf8599124..3cb7cee110e2 100644 --- a/drivers/platform/x86/asus-wmi.c +++ b/drivers/platform/x86/asus-wmi.c @@ -693,6 +693,15 @@ static ssize_t egpu_enable_store(struct device *dev, @@ -632,10 +632,10 @@ index 0c8a4a46b121..821addb284d7 100644 -- 2.41.0 -From 5dacc507c4d14c70f167a38a1cfef82c75a1b113 Mon Sep 17 00:00:00 2001 +From 64b96869a3ed4b7c9e41c1a3e8410c3ec2582ca9 Mon Sep 17 00:00:00 2001 From: "Luke D. Jones" <luke@ljones.dev> Date: Tue, 20 Jun 2023 12:48:31 +1200 -Subject: [PATCH 06/15] platform/x86: asus-wmi: add safety checks to gpu +Subject: [PATCH 06/13] platform/x86: asus-wmi: add safety checks to gpu switching Add safety checking to dgpu_disable, egpu_enable, gpu_mux_mode. @@ -652,7 +652,7 @@ Signed-off-by: Luke D. Jones <luke@ljones.dev> 1 file changed, 49 insertions(+), 1 deletion(-) diff --git a/drivers/platform/x86/asus-wmi.c b/drivers/platform/x86/asus-wmi.c -index 821addb284d7..602426a7fb41 100644 +index 3cb7cee110e2..7e80ea2a802a 100644 --- a/drivers/platform/x86/asus-wmi.c +++ b/drivers/platform/x86/asus-wmi.c @@ -645,6 +645,18 @@ static ssize_t dgpu_disable_store(struct device *dev, @@ -736,10 +736,10 @@ index 821addb284d7..602426a7fb41 100644 -- 2.41.0 -From 2a4ae00343f45138df9df345e74d91acf3ae5d30 Mon Sep 17 00:00:00 2001 +From 76d73c965c18d6b5e1d8d9ab6ae446e2f1913b6b Mon Sep 17 00:00:00 2001 From: "Luke D. Jones" <luke@ljones.dev> Date: Sun, 4 Jun 2023 20:21:10 +1200 -Subject: [PATCH 07/15] platform/x86: asus-wmi: support setting mini-LED mode +Subject: [PATCH 07/13] platform/x86: asus-wmi: support setting mini-LED mode Support changing the mini-LED mode on some of the newer ASUS laptops. @@ -768,7 +768,7 @@ index 878daf7c2036..5624bdef49cb 100644 + * 0 - Single-zone, + * 1 - Multi-zone diff --git a/drivers/platform/x86/asus-wmi.c b/drivers/platform/x86/asus-wmi.c -index 602426a7fb41..1fc9e8afc2f3 100644 +index 7e80ea2a802a..9b3dd262f6e4 100644 --- a/drivers/platform/x86/asus-wmi.c +++ b/drivers/platform/x86/asus-wmi.c @@ -265,6 +265,7 @@ struct asus_wmi { @@ -779,7 +779,7 @@ index 602426a7fb41..1fc9e8afc2f3 100644 struct hotplug_slot hotplug_slot; struct mutex hotplug_lock; -@@ -1820,6 +1821,54 @@ static ssize_t panel_od_store(struct device *dev, +@@ -1830,6 +1831,54 @@ static ssize_t panel_od_store(struct device *dev, } static DEVICE_ATTR_RW(panel_od); @@ -834,7 +834,7 @@ index 602426a7fb41..1fc9e8afc2f3 100644 /* Quirks *********************************************************************/ static void asus_wmi_set_xusb2pr(struct asus_wmi *asus) -@@ -3727,6 +3776,7 @@ static struct attribute *platform_attributes[] = { +@@ -3737,6 +3786,7 @@ static struct attribute *platform_attributes[] = { &dev_attr_fan_boost_mode.attr, &dev_attr_throttle_thermal_policy.attr, &dev_attr_panel_od.attr, @@ -842,7 +842,7 @@ index 602426a7fb41..1fc9e8afc2f3 100644 NULL }; -@@ -3764,6 +3814,8 @@ static umode_t asus_sysfs_is_visible(struct kobject *kobj, +@@ -3774,6 +3824,8 @@ static umode_t asus_sysfs_is_visible(struct kobject *kobj, ok = asus->throttle_thermal_policy_available; else if (attr == &dev_attr_panel_od.attr) ok = asus->panel_overdrive_available; @@ -851,7 +851,7 @@ index 602426a7fb41..1fc9e8afc2f3 100644 if (devid != -1) ok = !(asus_wmi_get_devstate_simple(asus, devid) < 0); -@@ -4026,6 +4078,7 @@ static int asus_wmi_add(struct platform_device *pdev) +@@ -4036,6 +4088,7 @@ static int asus_wmi_add(struct platform_device *pdev) asus->kbd_rgb_mode_available = asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_TUF_RGB_MODE); asus->kbd_rgb_state_available = asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_TUF_RGB_STATE); asus->panel_overdrive_available = asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_PANEL_OD); @@ -874,10 +874,10 @@ index 2034648f8cdf..ea80361ac6c7 100644 -- 2.41.0 -From dc9ce2ef7dfadafbd5bc0a2d55ff76c28f6e4b87 Mon Sep 17 00:00:00 2001 +From 3172f65f82ae6b36ab30a91ff73ba703a902da0a Mon Sep 17 00:00:00 2001 From: "Luke D. Jones" <luke@ljones.dev> Date: Tue, 6 Jun 2023 15:05:01 +1200 -Subject: [PATCH 08/15] platform/x86: asus-wmi: expose dGPU and CPU tunables +Subject: [PATCH 08/13] platform/x86: asus-wmi: expose dGPU and CPU tunables for ROG Expose various CPU and dGPU tunables that are available on many ASUS @@ -964,7 +964,7 @@ index 5624bdef49cb..caaccd28fabf 100644 + Set the target temperature limit of the Nvidia dGPU: + * min=75, max=87 diff --git a/drivers/platform/x86/asus-wmi.c b/drivers/platform/x86/asus-wmi.c -index 1fc9e8afc2f3..d9a353081f91 100644 +index 9b3dd262f6e4..c732610b3fef 100644 --- a/drivers/platform/x86/asus-wmi.c +++ b/drivers/platform/x86/asus-wmi.c @@ -117,6 +117,16 @@ module_param(fnlock_default, bool, 0444); @@ -1000,7 +1000,7 @@ index 1fc9e8afc2f3..d9a353081f91 100644 bool kbd_rgb_mode_available; bool kbd_rgb_state_available; -@@ -946,6 +965,244 @@ static const struct attribute_group *kbd_rgb_mode_groups[] = { +@@ -956,6 +975,244 @@ static const struct attribute_group *kbd_rgb_mode_groups[] = { NULL, }; @@ -1245,7 +1245,7 @@ index 1fc9e8afc2f3..d9a353081f91 100644 /* Battery ********************************************************************/ /* The battery maximum charging percentage */ -@@ -3775,6 +4032,13 @@ static struct attribute *platform_attributes[] = { +@@ -3785,6 +4042,13 @@ static struct attribute *platform_attributes[] = { &dev_attr_als_enable.attr, &dev_attr_fan_boost_mode.attr, &dev_attr_throttle_thermal_policy.attr, @@ -1259,7 +1259,7 @@ index 1fc9e8afc2f3..d9a353081f91 100644 &dev_attr_panel_od.attr, &dev_attr_mini_led_mode.attr, NULL -@@ -3812,6 +4076,20 @@ static umode_t asus_sysfs_is_visible(struct kobject *kobj, +@@ -3822,6 +4086,20 @@ static umode_t asus_sysfs_is_visible(struct kobject *kobj, ok = asus->fan_boost_mode_available; else if (attr == &dev_attr_throttle_thermal_policy.attr) ok = asus->throttle_thermal_policy_available; @@ -1280,7 +1280,7 @@ index 1fc9e8afc2f3..d9a353081f91 100644 else if (attr == &dev_attr_panel_od.attr) ok = asus->panel_overdrive_available; else if (attr == &dev_attr_mini_led_mode.attr) -@@ -4077,6 +4355,13 @@ static int asus_wmi_add(struct platform_device *pdev) +@@ -4087,6 +4365,13 @@ static int asus_wmi_add(struct platform_device *pdev) asus->gpu_mux_mode_available = asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_GPU_MUX); asus->kbd_rgb_mode_available = asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_TUF_RGB_MODE); asus->kbd_rgb_state_available = asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_TUF_RGB_STATE); @@ -1317,262 +1317,11 @@ index ea80361ac6c7..16e99a1c37fc 100644 -- 2.41.0 -From 3e5c9979491f0d7d405e98728c111e12c93aefed Mon Sep 17 00:00:00 2001 -From: "Luke D. Jones" <luke@ljones.dev> -Date: Sun, 30 Apr 2023 10:56:34 +1200 -Subject: [PATCH 09/15] platform/x86: asus-wmi: add support for ASUS screenpad - -Add support for the WMI methods used to turn off and adjust the -brightness of the secondary "screenpad" device found on some high-end -ASUS laptops like the GX650P series and others. - -These methods are utilised in a new backlight device named asus_screenpad. - -Signed-off-by: Luke D. Jones <luke@ljones.dev> ---- - drivers/platform/x86/asus-wmi.c | 128 +++++++++++++++++++++ - drivers/platform/x86/asus-wmi.h | 1 + - include/linux/platform_data/x86/asus-wmi.h | 4 + - 3 files changed, 133 insertions(+) - -diff --git a/drivers/platform/x86/asus-wmi.c b/drivers/platform/x86/asus-wmi.c -index d9a353081f91..d14d0ea9d65f 100644 ---- a/drivers/platform/x86/asus-wmi.c -+++ b/drivers/platform/x86/asus-wmi.c -@@ -25,6 +25,7 @@ - #include <linux/input/sparse-keymap.h> - #include <linux/kernel.h> - #include <linux/leds.h> -+#include <linux/minmax.h> - #include <linux/module.h> - #include <linux/pci.h> - #include <linux/pci_hotplug.h> -@@ -212,6 +213,7 @@ struct asus_wmi { - - struct input_dev *inputdev; - struct backlight_device *backlight_device; -+ struct backlight_device *screenpad_backlight_device; - struct platform_device *platform_device; - - struct led_classdev wlan_led; -@@ -3769,6 +3771,123 @@ static int is_display_toggle(int code) - return 0; - } - -+/* Screenpad backlight *******************************************************/ -+ -+static int read_screenpad_backlight_power(struct asus_wmi *asus) -+{ -+ int ret; -+ -+ ret = asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_SCREENPAD_POWER); -+ if (ret < 0) -+ return ret; -+ /* 1 == powered */ -+ return ret ? FB_BLANK_UNBLANK : FB_BLANK_POWERDOWN; -+} -+ -+static int read_screenpad_brightness(struct backlight_device *bd) -+{ -+ struct asus_wmi *asus = bl_get_data(bd); -+ u32 retval; -+ int err; -+ -+ err = read_screenpad_backlight_power(asus); -+ if (err < 0) -+ return err; -+ /* The device brightness can only be read if powered, so return stored */ -+ if (err == FB_BLANK_POWERDOWN) -+ return asus->driver->screenpad_brightness; -+ -+ err = asus_wmi_get_devstate(asus, ASUS_WMI_DEVID_SCREENPAD_LIGHT, &retval); -+ if (err < 0) -+ return err; -+ -+ return retval & ASUS_WMI_DSTS_BRIGHTNESS_MASK; -+} -+ -+static int update_screenpad_bl_status(struct backlight_device *bd) -+{ -+ struct asus_wmi *asus = bl_get_data(bd); -+ int power, err = 0; -+ u32 ctrl_param; -+ -+ power = read_screenpad_backlight_power(asus); -+ if (power < 0) -+ return power; -+ -+ if (bd->props.power != power) { -+ if (power != FB_BLANK_UNBLANK) { -+ /* Only brightness > 0 can power it back on */ -+ ctrl_param = max(1, asus->driver->screenpad_brightness); -+ err = asus_wmi_set_devstate(ASUS_WMI_DEVID_SCREENPAD_LIGHT, -+ ctrl_param, NULL); -+ } else { -+ err = asus_wmi_set_devstate(ASUS_WMI_DEVID_SCREENPAD_POWER, 0, NULL); -+ } -+ } else if (power == FB_BLANK_UNBLANK) { -+ /* Only set brightness if powered on or we get invalid/unsync state */ -+ ctrl_param = bd->props.brightness; -+ err = asus_wmi_set_devstate(ASUS_WMI_DEVID_SCREENPAD_LIGHT, ctrl_param, NULL); -+ } -+ -+ /* Ensure brightness is stored to turn back on with */ -+ asus->driver->screenpad_brightness = bd->props.brightness; -+ -+ return err; -+} -+ -+static const struct backlight_ops asus_screenpad_bl_ops = { -+ .get_brightness = read_screenpad_brightness, -+ .update_status = update_screenpad_bl_status, -+ .options = BL_CORE_SUSPENDRESUME, -+}; -+ -+static int asus_screenpad_init(struct asus_wmi *asus) -+{ -+ struct backlight_device *bd; -+ struct backlight_properties props; -+ int err, power; -+ int brightness = 0; -+ -+ power = read_screenpad_backlight_power(asus); -+ if (power < 0) -+ return power; -+ -+ if (power != FB_BLANK_POWERDOWN) { -+ err = asus_wmi_get_devstate(asus, ASUS_WMI_DEVID_SCREENPAD_LIGHT, &brightness); -+ if (err < 0) -+ return err; -+ } -+ /* default to an acceptable min brightness on boot if too low */ -+ if (brightness < 60) -+ brightness = 60; -+ -+ memset(&props, 0, sizeof(struct backlight_properties)); -+ props.type = BACKLIGHT_RAW; /* ensure this bd is last to be picked */ -+ props.max_brightness = 255; -+ bd = backlight_device_register("asus_screenpad", -+ &asus->platform_device->dev, asus, -+ &asus_screenpad_bl_ops, &props); -+ if (IS_ERR(bd)) { -+ pr_err("Could not register backlight device\n"); -+ return PTR_ERR(bd); -+ } -+ -+ asus->screenpad_backlight_device = bd; -+ asus->driver->screenpad_brightness = brightness; -+ bd->props.brightness = brightness; -+ bd->props.power = power; -+ backlight_update_status(bd); -+ -+ return 0; -+} -+ -+static void asus_screenpad_exit(struct asus_wmi *asus) -+{ -+ backlight_device_unregister(asus->screenpad_backlight_device); -+ -+ asus->screenpad_backlight_device = NULL; -+} -+ - /* Fn-lock ********************************************************************/ - - static bool asus_wmi_has_fnlock_key(struct asus_wmi *asus) -@@ -4424,6 +4543,12 @@ static int asus_wmi_add(struct platform_device *pdev) - } else if (asus->driver->quirks->wmi_backlight_set_devstate) - err = asus_wmi_set_devstate(ASUS_WMI_DEVID_BACKLIGHT, 2, NULL); - -+ if (asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_SCREENPAD_LIGHT)) { -+ err = asus_screenpad_init(asus); -+ if (err && err != -ENODEV) -+ goto fail_screenpad; -+ } -+ - if (asus_wmi_has_fnlock_key(asus)) { - asus->fnlock_locked = fnlock_default; - asus_wmi_fnlock_update(asus); -@@ -4447,6 +4572,8 @@ static int asus_wmi_add(struct platform_device *pdev) - asus_wmi_backlight_exit(asus); - fail_backlight: - asus_wmi_rfkill_exit(asus); -+fail_screenpad: -+ asus_screenpad_exit(asus); - fail_rfkill: - asus_wmi_led_exit(asus); - fail_leds: -@@ -4473,6 +4600,7 @@ static int asus_wmi_remove(struct platform_device *device) - asus = platform_get_drvdata(device); - wmi_remove_notify_handler(asus->driver->event_guid); - asus_wmi_backlight_exit(asus); -+ asus_screenpad_exit(asus); - asus_wmi_input_exit(asus); - asus_wmi_led_exit(asus); - asus_wmi_rfkill_exit(asus); -diff --git a/drivers/platform/x86/asus-wmi.h b/drivers/platform/x86/asus-wmi.h -index a478ebfd34df..5fbdd0eafa02 100644 ---- a/drivers/platform/x86/asus-wmi.h -+++ b/drivers/platform/x86/asus-wmi.h -@@ -57,6 +57,7 @@ struct quirk_entry { - struct asus_wmi_driver { - int brightness; - int panel_power; -+ int screenpad_brightness; - int wlan_ctrl_by_user; - - const char *name; -diff --git a/include/linux/platform_data/x86/asus-wmi.h b/include/linux/platform_data/x86/asus-wmi.h -index 16e99a1c37fc..63e630276499 100644 ---- a/include/linux/platform_data/x86/asus-wmi.h -+++ b/include/linux/platform_data/x86/asus-wmi.h -@@ -58,6 +58,10 @@ - #define ASUS_WMI_DEVID_KBD_BACKLIGHT 0x00050021 - #define ASUS_WMI_DEVID_LIGHT_SENSOR 0x00050022 /* ?? */ - #define ASUS_WMI_DEVID_LIGHTBAR 0x00050025 -+/* This can only be used to disable the screen, not re-enable */ -+#define ASUS_WMI_DEVID_SCREENPAD_POWER 0x00050031 -+/* Writing a brightness re-enables the screen if disabled */ -+#define ASUS_WMI_DEVID_SCREENPAD_LIGHT 0x00050032 - #define ASUS_WMI_DEVID_FAN_BOOST_MODE 0x00110018 - #define ASUS_WMI_DEVID_THROTTLE_THERMAL_POLICY 0x00120075 - --- -2.41.0 - -From 44d4dc37d2311e4bc0cf5be59925391c3b6b2b9c Mon Sep 17 00:00:00 2001 -From: "Luke D. Jones" <luke@ljones.dev> -Date: Tue, 4 Jul 2023 16:34:23 +1200 -Subject: [PATCH 14/15] Fixes: 31278997add6 (ALSA: hda/realtek - Add headset - quirk for Dell DT) - -Remove an erroneous whitespace. - -Signed-off-by: Luke D. Jones <luke@ljones.dev> ---- - sound/pci/hda/patch_realtek.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c -index ba3c113f0be1..1547c40dc7e9 100644 ---- a/sound/pci/hda/patch_realtek.c -+++ b/sound/pci/hda/patch_realtek.c -@@ -5883,7 +5883,7 @@ static void alc_fixup_headset_mode_alc255_no_hp_mic(struct hda_codec *codec, - struct alc_spec *spec = codec->spec; - spec->parse_flags |= HDA_PINCFG_HEADSET_MIC; - alc255_set_default_jack_type(codec); -- } -+ } - else - alc_fixup_headset_mode(codec, fix, action); - } --- -2.41.0 - -From 0e153d43f60bfcfb24d004781339fdb49fba94ac Mon Sep 17 00:00:00 2001 +From 73622204c837e2ab4729bc2af2c8bb6d58f4b3b0 Mon Sep 17 00:00:00 2001 From: "Luke D. Jones" <luke@ljones.dev> Date: Sun, 23 Jul 2023 21:29:11 +1200 -Subject: [PATCH] platform/x86: asus-wmi: Fix and cleanup custom fan curve - functions +Subject: [PATCH 09/13] Fixes: a23870110a38 ("asus-wmi: add support for showing + middle fan RPM") After the addition of the mid fan custom curve functionality various incorrect behaviour was uncovered. This commit fixes these areas. @@ -1588,10 +1337,10 @@ Signed-off-by: Luke D. Jones <luke@ljones.dev> 1 file changed, 38 insertions(+), 40 deletions(-) diff --git a/drivers/platform/x86/asus-wmi.c b/drivers/platform/x86/asus-wmi.c -index d14d0ea9d65f..14ee43c61eb2 100644 +index c732610b3fef..496d03e88595 100644 --- a/drivers/platform/x86/asus-wmi.c +++ b/drivers/platform/x86/asus-wmi.c -@@ -2902,9 +2902,8 @@ static int fan_curve_get_factory_default(struct asus_wmi *asus, u32 fan_dev) +@@ -2910,9 +2910,8 @@ static int fan_curve_get_factory_default(struct asus_wmi *asus, u32 fan_dev) { struct fan_curve_data *curves; u8 buf[FAN_CURVE_BUF_LEN]; @@ -1602,7 +1351,7 @@ index d14d0ea9d65f..14ee43c61eb2 100644 if (asus->throttle_thermal_policy_available) mode = asus->throttle_thermal_policy_mode; -@@ -2914,13 +2913,6 @@ static int fan_curve_get_factory_default(struct asus_wmi *asus, u32 fan_dev) +@@ -2922,13 +2921,6 @@ static int fan_curve_get_factory_default(struct asus_wmi *asus, u32 fan_dev) else if (mode == 1) mode = 2; @@ -1616,7 +1365,7 @@ index d14d0ea9d65f..14ee43c61eb2 100644 err = asus_wmi_evaluate_method_buf(asus->dsts_id, fan_dev, mode, buf, FAN_CURVE_BUF_LEN); if (err) { -@@ -2928,9 +2920,17 @@ static int fan_curve_get_factory_default(struct asus_wmi *asus, u32 fan_dev) +@@ -2936,9 +2928,17 @@ static int fan_curve_get_factory_default(struct asus_wmi *asus, u32 fan_dev) return err; } @@ -1635,7 +1384,7 @@ index d14d0ea9d65f..14ee43c61eb2 100644 return 0; } -@@ -2960,7 +2960,7 @@ static struct fan_curve_data *fan_curve_attr_select(struct asus_wmi *asus, +@@ -2968,7 +2968,7 @@ static struct fan_curve_data *fan_curve_attr_select(struct asus_wmi *asus, { int index = to_sensor_dev_attr(attr)->index; @@ -1644,7 +1393,7 @@ index d14d0ea9d65f..14ee43c61eb2 100644 } /* Determine which fan the attribute is for if SENSOR_ATTR_2 */ -@@ -2969,7 +2969,7 @@ static struct fan_curve_data *fan_curve_attr_2_select(struct asus_wmi *asus, +@@ -2977,7 +2977,7 @@ static struct fan_curve_data *fan_curve_attr_2_select(struct asus_wmi *asus, { int nr = to_sensor_dev_attr_2(attr)->nr; @@ -1653,7 +1402,7 @@ index d14d0ea9d65f..14ee43c61eb2 100644 } static ssize_t fan_curve_show(struct device *dev, -@@ -2978,13 +2978,13 @@ static ssize_t fan_curve_show(struct device *dev, +@@ -2986,13 +2986,13 @@ static ssize_t fan_curve_show(struct device *dev, struct sensor_device_attribute_2 *dev_attr = to_sensor_dev_attr_2(attr); struct asus_wmi *asus = dev_get_drvdata(dev); struct fan_curve_data *data; @@ -1670,7 +1419,7 @@ index d14d0ea9d65f..14ee43c61eb2 100644 value = data->percents[index]; else value = data->temps[index]; -@@ -3027,23 +3027,21 @@ static ssize_t fan_curve_store(struct device *dev, +@@ -3035,23 +3035,21 @@ static ssize_t fan_curve_store(struct device *dev, struct sensor_device_attribute_2 *dev_attr = to_sensor_dev_attr_2(attr); struct asus_wmi *asus = dev_get_drvdata(dev); struct fan_curve_data *data; @@ -1699,7 +1448,7 @@ index d14d0ea9d65f..14ee43c61eb2 100644 /* * Mark as disabled so the user has to explicitly enable to apply a -@@ -3156,7 +3154,7 @@ static SENSOR_DEVICE_ATTR_2_RW(pwm1_auto_point8_temp, fan_curve, +@@ -3164,7 +3162,7 @@ static SENSOR_DEVICE_ATTR_2_RW(pwm1_auto_point8_temp, fan_curve, FAN_CURVE_DEV_CPU, 7); static SENSOR_DEVICE_ATTR_2_RW(pwm1_auto_point1_pwm, fan_curve, @@ -1708,7 +1457,7 @@ index d14d0ea9d65f..14ee43c61eb2 100644 static SENSOR_DEVICE_ATTR_2_RW(pwm1_auto_point2_pwm, fan_curve, FAN_CURVE_DEV_CPU | FAN_CURVE_PWM_MASK, 1); static SENSOR_DEVICE_ATTR_2_RW(pwm1_auto_point3_pwm, fan_curve, -@@ -3209,40 +3207,40 @@ static SENSOR_DEVICE_ATTR_2_RW(pwm2_auto_point8_pwm, fan_curve, +@@ -3217,40 +3215,40 @@ static SENSOR_DEVICE_ATTR_2_RW(pwm2_auto_point8_pwm, fan_curve, FAN_CURVE_DEV_GPU | FAN_CURVE_PWM_MASK, 7); /* MID */ @@ -1769,10 +1518,10 @@ index d14d0ea9d65f..14ee43c61eb2 100644 -- 2.41.0 -From 43fd8da367ca2e69faf9a380dfcea6ceb423a114 Mon Sep 17 00:00:00 2001 +From ebd35946f15047d89fd1bb68b0f75dc5c367af6e Mon Sep 17 00:00:00 2001 From: Stefan Binding <sbinding@opensource.cirrus.com> Date: Tue, 15 Aug 2023 17:10:33 +0100 -Subject: [PATCH 1/2] ALSA: hda: cs35l41: Support systems with missing _DSD +Subject: [PATCH 10/13] ALSA: hda: cs35l41: Support systems with missing _DSD properties Some systems using CS35L41 with HDA were released without some @@ -2031,11 +1780,11 @@ index 000000000000..fd834042e2fd -- 2.41.0 -From a29254f8aeb5ac7a7bd869648c518bff111dc65c Mon Sep 17 00:00:00 2001 +From d6f191b6827fae534a0635afb8d4380b59cb409c Mon Sep 17 00:00:00 2001 From: "Luke D. Jones" <luke@ljones.dev> Date: Wed, 23 Aug 2023 11:05:59 +1200 -Subject: [PATCH] ALSA: hda: cs35l41: Support ASUS 2023 laptops with missing - DSD +Subject: [PATCH 11/13] ALSA: hda: cs35l41: Support ASUS 2023 laptops with + missing DSD Support adding the missing DSD properties required for ASUS ROG 2023 laptops and other ASUS laptops to properly utilise the cs35l41. @@ -2062,14 +1811,14 @@ Signed-off-by: Jonathan LoBue <jlobue10@gmail.com> Co-developed-by: Luke D. Jones <luke@ljones.dev> Signed-off-by: Luke D. Jones <luke@ljones.dev> --- - sound/pci/hda/cs35l41_hda_property.c | 39 ++++++++++++++++++++++++++++ - 1 file changed, 39 insertions(+) + sound/pci/hda/cs35l41_hda_property.c | 47 ++++++++++++++++++++++++++++ + 1 file changed, 47 insertions(+) diff --git a/sound/pci/hda/cs35l41_hda_property.c b/sound/pci/hda/cs35l41_hda_property.c -index 673f23257a09..128d478f53f2 100644 +index 673f23257a09..b39f9443e1d6 100644 --- a/sound/pci/hda/cs35l41_hda_property.c +++ b/sound/pci/hda/cs35l41_hda_property.c -@@ -43,6 +43,33 @@ static int lenovo_legion_no_acpi(struct cs35l41_hda *cs35l41, struct device *phy +@@ -43,6 +43,41 @@ static int lenovo_legion_no_acpi(struct cs35l41_hda *cs35l41, struct device *phy return 0; } @@ -2087,7 +1836,6 @@ index 673f23257a09..128d478f53f2 100644 + /* check SPI or I2C address to assign the index */ + cs35l41->index = (id == 0 || id == 0x40) ? 0 : 1; + cs35l41->channel_index = 0; -+ cs35l41->reset_gpio = gpiod_get_index(physdev, NULL, 0, GPIOD_OUT_HIGH); + cs35l41->speaker_id = cs35l41_get_speaker_id(physdev, 0, 0, 2); + hw_cfg->spk_pos = cs35l41->index; + hw_cfg->bst_type = CS35L41_EXT_BOOST; @@ -2095,6 +1843,15 @@ index 673f23257a09..128d478f53f2 100644 + hw_cfg->gpio1.valid = true; + hw_cfg->gpio2.func = CS35L41_INTERRUPT; + hw_cfg->gpio2.valid = true; ++ ++ if (strcmp(cs35l41->acpi_subsystem_id, "10431473") == 0 ++ || strcmp(cs35l41->acpi_subsystem_id, "10431483") == 0 ++ || strcmp(cs35l41->acpi_subsystem_id, "10431493") == 0) { ++ cs35l41->reset_gpio = gpiod_get_index(physdev, NULL, 1, GPIOD_OUT_HIGH); ++ } else { ++ cs35l41->reset_gpio = gpiod_get_index(physdev, NULL, 0, GPIOD_OUT_HIGH); ++ } ++ + hw_cfg->valid = true; + + return 0; @@ -2103,25 +1860,318 @@ index 673f23257a09..128d478f53f2 100644 struct cs35l41_prop_model { const char *hid; const char *ssid; -@@ -53,6 +80,18 @@ struct cs35l41_prop_model { +@@ -53,6 +88,18 @@ struct cs35l41_prop_model { const struct cs35l41_prop_model cs35l41_prop_model_table[] = { { "CLSA0100", NULL, lenovo_legion_no_acpi }, { "CLSA0101", NULL, lenovo_legion_no_acpi }, + { "CSC3551", "10431433", asus_rog_2023_spkr_id2 }, // ASUS GS650P - i2c + { "CSC3551", "10431463", asus_rog_2023_spkr_id2 }, // ASUS GA402X/N - i2c -+ { "CSC3551", "10431473", asus_rog_2023_spkr_id2 }, // ASUS GU604V - spi -+ { "CSC3551", "10431483", asus_rog_2023_spkr_id2 }, // ASUS GU603V - spi -+ { "CSC3551", "10431493", asus_rog_2023_spkr_id2 }, // ASUS GV601V - spi -+ { "CSC3551", "10431573", asus_rog_2023_spkr_id2 }, // ASUS GZ301V - spi ++ { "CSC3551", "10431473", asus_rog_2023_spkr_id2 }, // ASUS GU604V - spi, reset gpio 1 ++ { "CSC3551", "10431483", asus_rog_2023_spkr_id2 }, // ASUS GU603V - spi, reset gpio 1 ++ { "CSC3551", "10431493", asus_rog_2023_spkr_id2 }, // ASUS GV601V - spi, reset gpio 1 ++ { "CSC3551", "10431573", asus_rog_2023_spkr_id2 }, // ASUS GZ301V - spi, reset gpio 0 + { "CSC3551", "104317F3", asus_rog_2023_spkr_id2 }, // ASUS ROG ALLY - i2c -+ { "CSC3551", "10431B93", asus_rog_2023_spkr_id2 }, // ASUS G614J - spi -+ { "CSC3551", "10431CAF", asus_rog_2023_spkr_id2 }, // ASUS G634J - spi -+ { "CSC3551", "10431C9F", asus_rog_2023_spkr_id2 }, // ASUS G614JI -spi ++ { "CSC3551", "10431B93", asus_rog_2023_spkr_id2 }, // ASUS G614J - spi, reset gpio 0 ++ { "CSC3551", "10431CAF", asus_rog_2023_spkr_id2 }, // ASUS G634J - spi, reset gpio 0 ++ { "CSC3551", "10431C9F", asus_rog_2023_spkr_id2 }, // ASUS G614JI -spi, reset gpio 0 + { "CSC3551", "10431D1F", asus_rog_2023_spkr_id2 }, // ASUS G713P - i2c -+ { "CSC3551", "10431F1F", asus_rog_2023_spkr_id2 }, // ASUS H7604JV - spi ++ { "CSC3551", "10431F1F", asus_rog_2023_spkr_id2 }, // ASUS H7604JV - spi, reset gpio 0 {} }; -- 2.41.0 +From f2e032c25d0fac01e8272176c71d5080e0123081 Mon Sep 17 00:00:00 2001 +From: "Luke D. Jones" <luke@ljones.dev> +Date: Mon, 28 Aug 2023 11:05:16 +1200 +Subject: [PATCH 12/13] platform/x86: asus-wmi: corrections to egpu safety + check + +An incorrect if statement was preventing the enablement of the egpu. + +Fixes: 1bddf53ccac0 ("platform/x86: asus-wmi: don't allow eGPU switching if eGPU not connected") +Signed-off-by: Luke D. Jones <luke@ljones.dev> +--- + drivers/platform/x86/asus-wmi.c | 15 +++++++-------- + 1 file changed, 7 insertions(+), 8 deletions(-) + +diff --git a/drivers/platform/x86/asus-wmi.c b/drivers/platform/x86/asus-wmi.c +index 496d03e88595..13547e55ae82 100644 +--- a/drivers/platform/x86/asus-wmi.c ++++ b/drivers/platform/x86/asus-wmi.c +@@ -726,19 +726,18 @@ static ssize_t egpu_enable_store(struct device *dev, + return -EINVAL; + + result = asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_EGPU_CONNECTED); +- if (err < 0) +- return err; +- if (err < 1) { +- err = -ENODEV; +- pr_warn("Failed to set egpu disable: %d\n", err); ++ if (err < 0) { ++ pr_warn("Failed to get egpu connection status: %d\n", err); + return err; + } + + if (asus->gpu_mux_mode_available) { + result = asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_GPU_MUX); +- if (result < 0) ++ if (result < 0) { + /* An error here may signal greater failure of GPU handling */ ++ pr_warn("Failed to get gpu mux status: %d\n", err); + return result; ++ } + if (!result && enable) { + err = -ENODEV; + pr_warn("Can not enable eGPU when the MUX is in dGPU mode: %d\n", err); +@@ -748,12 +747,12 @@ static ssize_t egpu_enable_store(struct device *dev, + + err = asus_wmi_set_devstate(ASUS_WMI_DEVID_EGPU, enable, &result); + if (err) { +- pr_warn("Failed to set egpu disable: %d\n", err); ++ pr_warn("Failed to set egpu state: %d\n", err); + return err; + } + + if (result > 1) { +- pr_warn("Failed to set egpu disable (retval): 0x%x\n", result); ++ pr_warn("Failed to set egpu state (retval): 0x%x\n", result); + return -EIO; + } + +-- +2.41.0 + +From cc5628b9a4c5fea304346202f753b48bc8f6c622 Mon Sep 17 00:00:00 2001 +From: "Luke D. Jones" <luke@ljones.dev> +Date: Sun, 30 Apr 2023 10:56:34 +1200 +Subject: [PATCH 13/13] platform/x86: asus-wmi: add support for ASUS screenpad + +Add support for the WMI methods used to turn off and adjust the +brightness of the secondary "screenpad" device found on some high-end +ASUS laptops like the GX650P series and others. + +These methods are utilised in a new backlight device named asus_screenpad. + +Signed-off-by: Luke D. Jones <luke@ljones.dev> +--- + drivers/platform/x86/asus-wmi.c | 131 +++++++++++++++++++++ + drivers/platform/x86/asus-wmi.h | 1 + + include/linux/platform_data/x86/asus-wmi.h | 4 + + 3 files changed, 136 insertions(+) + +diff --git a/drivers/platform/x86/asus-wmi.c b/drivers/platform/x86/asus-wmi.c +index 13547e55ae82..2801c691133a 100644 +--- a/drivers/platform/x86/asus-wmi.c ++++ b/drivers/platform/x86/asus-wmi.c +@@ -25,6 +25,7 @@ + #include <linux/input/sparse-keymap.h> + #include <linux/kernel.h> + #include <linux/leds.h> ++#include <linux/minmax.h> + #include <linux/module.h> + #include <linux/pci.h> + #include <linux/pci_hotplug.h> +@@ -127,6 +128,9 @@ module_param(fnlock_default, bool, 0444); + #define NVIDIA_TEMP_MIN 75 + #define NVIDIA_TEMP_MAX 87 + ++#define ASUS_SCREENPAD_BRIGHT_MIN 20 ++#define ASUS_SCREENPAD_BRIGHT_MAX 255 ++ + static const char * const ashs_ids[] = { "ATK4001", "ATK4002", NULL }; + + static int throttle_thermal_policy_write(struct asus_wmi *); +@@ -212,6 +216,7 @@ struct asus_wmi { + + struct input_dev *inputdev; + struct backlight_device *backlight_device; ++ struct backlight_device *screenpad_backlight_device; + struct platform_device *platform_device; + + struct led_classdev wlan_led; +@@ -3776,6 +3781,123 @@ static int is_display_toggle(int code) + return 0; + } + ++/* Screenpad backlight *******************************************************/ ++ ++static int read_screenpad_backlight_power(struct asus_wmi *asus) ++{ ++ int ret; ++ ++ ret = asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_SCREENPAD_POWER); ++ if (ret < 0) ++ return ret; ++ /* 1 == powered */ ++ return ret ? FB_BLANK_UNBLANK : FB_BLANK_POWERDOWN; ++} ++ ++static int read_screenpad_brightness(struct backlight_device *bd) ++{ ++ struct asus_wmi *asus = bl_get_data(bd); ++ u32 retval; ++ int err; ++ ++ err = read_screenpad_backlight_power(asus); ++ if (err < 0) ++ return err; ++ /* The device brightness can only be read if powered, so return stored */ ++ if (err == FB_BLANK_POWERDOWN) ++ return asus->driver->screenpad_brightness; ++ ++ err = asus_wmi_get_devstate(asus, ASUS_WMI_DEVID_SCREENPAD_LIGHT, &retval); ++ if (err < 0) ++ return err; ++ ++ return (retval & ASUS_WMI_DSTS_BRIGHTNESS_MASK) - ASUS_SCREENPAD_BRIGHT_MIN; ++} ++ ++static int update_screenpad_bl_status(struct backlight_device *bd) ++{ ++ struct asus_wmi *asus = bl_get_data(bd); ++ int power, err = 0; ++ u32 ctrl_param; ++ ++ power = read_screenpad_backlight_power(asus); ++ if (power < 0) ++ return power; ++ ++ if (bd->props.power != power) { ++ if (power != FB_BLANK_UNBLANK) { ++ /* Only brightness > 0 can power it back on */ ++ ctrl_param = max(ASUS_SCREENPAD_BRIGHT_MIN, asus->driver->screenpad_brightness); ++ err = asus_wmi_set_devstate(ASUS_WMI_DEVID_SCREENPAD_LIGHT, ++ ctrl_param, NULL); ++ } else { ++ err = asus_wmi_set_devstate(ASUS_WMI_DEVID_SCREENPAD_POWER, 0, NULL); ++ } ++ } else if (power == FB_BLANK_UNBLANK) { ++ /* Only set brightness if powered on or we get invalid/unsync state */ ++ ctrl_param = bd->props.brightness + ASUS_SCREENPAD_BRIGHT_MIN; ++ err = asus_wmi_set_devstate(ASUS_WMI_DEVID_SCREENPAD_LIGHT, ctrl_param, NULL); ++ } ++ ++ /* Ensure brightness is stored to turn back on with */ ++ asus->driver->screenpad_brightness = bd->props.brightness + ASUS_SCREENPAD_BRIGHT_MIN; ++ ++ return err; ++} ++ ++static const struct backlight_ops asus_screenpad_bl_ops = { ++ .get_brightness = read_screenpad_brightness, ++ .update_status = update_screenpad_bl_status, ++ .options = BL_CORE_SUSPENDRESUME, ++}; ++ ++static int asus_screenpad_init(struct asus_wmi *asus) ++{ ++ struct backlight_device *bd; ++ struct backlight_properties props; ++ int err, power; ++ int brightness = 0; ++ ++ power = read_screenpad_backlight_power(asus); ++ if (power < 0) ++ return power; ++ ++ if (power != FB_BLANK_POWERDOWN) { ++ err = asus_wmi_get_devstate(asus, ASUS_WMI_DEVID_SCREENPAD_LIGHT, &brightness); ++ if (err < 0) ++ return err; ++ } ++ /* default to an acceptable min brightness on boot if too low */ ++ if (brightness < ASUS_SCREENPAD_BRIGHT_MIN) ++ brightness = ASUS_SCREENPAD_BRIGHT_MIN; ++ ++ memset(&props, 0, sizeof(struct backlight_properties)); ++ props.type = BACKLIGHT_RAW; /* ensure this bd is last to be picked */ ++ props.max_brightness = ASUS_SCREENPAD_BRIGHT_MAX - ASUS_SCREENPAD_BRIGHT_MIN; ++ bd = backlight_device_register("asus_screenpad", ++ &asus->platform_device->dev, asus, ++ &asus_screenpad_bl_ops, &props); ++ if (IS_ERR(bd)) { ++ pr_err("Could not register backlight device\n"); ++ return PTR_ERR(bd); ++ } ++ ++ asus->screenpad_backlight_device = bd; ++ asus->driver->screenpad_brightness = brightness; ++ bd->props.brightness = brightness; ++ bd->props.power = power; ++ backlight_update_status(bd); ++ ++ return 0; ++} ++ ++static void asus_screenpad_exit(struct asus_wmi *asus) ++{ ++ backlight_device_unregister(asus->screenpad_backlight_device); ++ ++ asus->screenpad_backlight_device = NULL; ++} ++ + /* Fn-lock ********************************************************************/ + + static bool asus_wmi_has_fnlock_key(struct asus_wmi *asus) +@@ -4431,6 +4553,12 @@ static int asus_wmi_add(struct platform_device *pdev) + } else if (asus->driver->quirks->wmi_backlight_set_devstate) + err = asus_wmi_set_devstate(ASUS_WMI_DEVID_BACKLIGHT, 2, NULL); + ++ if (asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_SCREENPAD_LIGHT)) { ++ err = asus_screenpad_init(asus); ++ if (err && err != -ENODEV) ++ goto fail_screenpad; ++ } ++ + if (asus_wmi_has_fnlock_key(asus)) { + asus->fnlock_locked = fnlock_default; + asus_wmi_fnlock_update(asus); +@@ -4454,6 +4582,8 @@ static int asus_wmi_add(struct platform_device *pdev) + asus_wmi_backlight_exit(asus); + fail_backlight: + asus_wmi_rfkill_exit(asus); ++fail_screenpad: ++ asus_screenpad_exit(asus); + fail_rfkill: + asus_wmi_led_exit(asus); + fail_leds: +@@ -4480,6 +4610,7 @@ static int asus_wmi_remove(struct platform_device *device) + asus = platform_get_drvdata(device); + wmi_remove_notify_handler(asus->driver->event_guid); + asus_wmi_backlight_exit(asus); ++ asus_screenpad_exit(asus); + asus_wmi_input_exit(asus); + asus_wmi_led_exit(asus); + asus_wmi_rfkill_exit(asus); +diff --git a/drivers/platform/x86/asus-wmi.h b/drivers/platform/x86/asus-wmi.h +index a478ebfd34df..5fbdd0eafa02 100644 +--- a/drivers/platform/x86/asus-wmi.h ++++ b/drivers/platform/x86/asus-wmi.h +@@ -57,6 +57,7 @@ struct quirk_entry { + struct asus_wmi_driver { + int brightness; + int panel_power; ++ int screenpad_brightness; + int wlan_ctrl_by_user; + + const char *name; +diff --git a/include/linux/platform_data/x86/asus-wmi.h b/include/linux/platform_data/x86/asus-wmi.h +index 16e99a1c37fc..63e630276499 100644 +--- a/include/linux/platform_data/x86/asus-wmi.h ++++ b/include/linux/platform_data/x86/asus-wmi.h +@@ -58,6 +58,10 @@ + #define ASUS_WMI_DEVID_KBD_BACKLIGHT 0x00050021 + #define ASUS_WMI_DEVID_LIGHT_SENSOR 0x00050022 /* ?? */ + #define ASUS_WMI_DEVID_LIGHTBAR 0x00050025 ++/* This can only be used to disable the screen, not re-enable */ ++#define ASUS_WMI_DEVID_SCREENPAD_POWER 0x00050031 ++/* Writing a brightness re-enables the screen if disabled */ ++#define ASUS_WMI_DEVID_SCREENPAD_LIGHT 0x00050032 + #define ASUS_WMI_DEVID_FAN_BOOST_MODE 0x00110018 + #define ASUS_WMI_DEVID_THROTTLE_THERMAL_POLICY 0x00120075 + +-- +2.41.0 + |