]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
platform/x86: asus-wmi: Fix inconsistent use of thermal policies
authorArmin Wolf <W_Armin@gmx.de>
Thu, 7 Nov 2024 00:38:10 +0000 (01:38 +0100)
committerIlpo Järvinen <ilpo.jarvinen@linux.intel.com>
Tue, 12 Nov 2024 09:55:16 +0000 (11:55 +0200)
When changing the thermal policy using the platform profile API,
a Vivobook thermal policy is stored in throttle_thermal_policy_mode.

However everywhere else a normal thermal policy is stored inside this
variable, potentially confusing the platform profile.

Fix this by always storing normal thermal policy values inside
throttle_thermal_policy_mode and only do the conversion when writing
the thermal policy to hardware. This also fixes the order in which
throttle_thermal_policy_switch_next() steps through the thermal modes
on Vivobook machines.

Tested-by: Casey G Bowman <casey.g.bowman@intel.com>
Fixes: bcbfcebda2cb ("platform/x86: asus-wmi: add support for vivobook fan profiles")
Signed-off-by: Armin Wolf <W_Armin@gmx.de>
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
Link: https://lore.kernel.org/r/20241107003811.615574-2-W_Armin@gmx.de
Reviewed-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
drivers/platform/x86/asus-wmi.c

index 2ccc23b259d3e6d4142d079594a0e6c2e67b17ba..88cd1f39f22e341ccc703c89448517bee4f43c31 100644 (file)
@@ -3696,10 +3696,28 @@ static int asus_wmi_custom_fan_curve_init(struct asus_wmi *asus)
 /* Throttle thermal policy ****************************************************/
 static int throttle_thermal_policy_write(struct asus_wmi *asus)
 {
-       u8 value = asus->throttle_thermal_policy_mode;
        u32 retval;
+       u8 value;
        int err;
 
+       if (asus->throttle_thermal_policy_dev == ASUS_WMI_DEVID_THROTTLE_THERMAL_POLICY_VIVO) {
+               switch (asus->throttle_thermal_policy_mode) {
+               case ASUS_THROTTLE_THERMAL_POLICY_DEFAULT:
+                       value = ASUS_THROTTLE_THERMAL_POLICY_DEFAULT_VIVO;
+                       break;
+               case ASUS_THROTTLE_THERMAL_POLICY_OVERBOOST:
+                       value = ASUS_THROTTLE_THERMAL_POLICY_OVERBOOST_VIVO;
+                       break;
+               case ASUS_THROTTLE_THERMAL_POLICY_SILENT:
+                       value = ASUS_THROTTLE_THERMAL_POLICY_SILENT_VIVO;
+                       break;
+               default:
+                       return -EINVAL;
+               }
+       } else {
+               value = asus->throttle_thermal_policy_mode;
+       }
+
        err = asus_wmi_set_devstate(asus->throttle_thermal_policy_dev,
                                    value, &retval);
 
@@ -3804,46 +3822,6 @@ static ssize_t throttle_thermal_policy_store(struct device *dev,
 static DEVICE_ATTR_RW(throttle_thermal_policy);
 
 /* Platform profile ***********************************************************/
-static int asus_wmi_platform_profile_to_vivo(struct asus_wmi *asus, int mode)
-{
-       bool vivo;
-
-       vivo = asus->throttle_thermal_policy_dev == ASUS_WMI_DEVID_THROTTLE_THERMAL_POLICY_VIVO;
-
-       if (vivo) {
-               switch (mode) {
-               case ASUS_THROTTLE_THERMAL_POLICY_DEFAULT:
-                       return ASUS_THROTTLE_THERMAL_POLICY_DEFAULT_VIVO;
-               case ASUS_THROTTLE_THERMAL_POLICY_OVERBOOST:
-                       return ASUS_THROTTLE_THERMAL_POLICY_OVERBOOST_VIVO;
-               case ASUS_THROTTLE_THERMAL_POLICY_SILENT:
-                       return ASUS_THROTTLE_THERMAL_POLICY_SILENT_VIVO;
-               }
-       }
-
-       return mode;
-}
-
-static int asus_wmi_platform_profile_mode_from_vivo(struct asus_wmi *asus, int mode)
-{
-       bool vivo;
-
-       vivo = asus->throttle_thermal_policy_dev == ASUS_WMI_DEVID_THROTTLE_THERMAL_POLICY_VIVO;
-
-       if (vivo) {
-               switch (mode) {
-               case ASUS_THROTTLE_THERMAL_POLICY_DEFAULT_VIVO:
-                       return ASUS_THROTTLE_THERMAL_POLICY_DEFAULT;
-               case ASUS_THROTTLE_THERMAL_POLICY_OVERBOOST_VIVO:
-                       return ASUS_THROTTLE_THERMAL_POLICY_OVERBOOST;
-               case ASUS_THROTTLE_THERMAL_POLICY_SILENT_VIVO:
-                       return ASUS_THROTTLE_THERMAL_POLICY_SILENT;
-               }
-       }
-
-       return mode;
-}
-
 static int asus_wmi_platform_profile_get(struct platform_profile_handler *pprof,
                                        enum platform_profile_option *profile)
 {
@@ -3853,7 +3831,7 @@ static int asus_wmi_platform_profile_get(struct platform_profile_handler *pprof,
        asus = container_of(pprof, struct asus_wmi, platform_profile_handler);
        tp = asus->throttle_thermal_policy_mode;
 
-       switch (asus_wmi_platform_profile_mode_from_vivo(asus, tp)) {
+       switch (tp) {
        case ASUS_THROTTLE_THERMAL_POLICY_DEFAULT:
                *profile = PLATFORM_PROFILE_BALANCED;
                break;
@@ -3892,7 +3870,7 @@ static int asus_wmi_platform_profile_set(struct platform_profile_handler *pprof,
                return -EOPNOTSUPP;
        }
 
-       asus->throttle_thermal_policy_mode = asus_wmi_platform_profile_to_vivo(asus, tp);
+       asus->throttle_thermal_policy_mode = tp;
        return throttle_thermal_policy_write(asus);
 }