]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
platform/x86: alienware-wmi-wmax: Add support for the "custom" thermal profile
authorKurt Borja <kuurtb@gmail.com>
Sat, 29 Mar 2025 07:32:23 +0000 (04:32 -0300)
committerIlpo Järvinen <ilpo.jarvinen@linux.intel.com>
Fri, 11 Apr 2025 10:04:48 +0000 (13:04 +0300)
All models with the "AWCC" WMAX device support a "custom" thermal
profile. In some models this profile signals user-space that the user
wants to manually control the fans, which are always unlocked. In other
models it actually unlocks manual fan control.

Reviewed-by: Armin Wolf <W_Armin@gmx.de>
Reviewed-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
Signed-off-by: Kurt Borja <kuurtb@gmail.com>
Link: https://lore.kernel.org/r/20250329-hwm-v7-6-a14ea39d8a94@gmail.com
Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
drivers/platform/x86/dell/alienware-wmi-wmax.c

index cd4234a282cbd3c480a77801c282c3e786fc4a9c..5bf8264a1063b7d3310100d0edbfd0b9447dbe74 100644 (file)
@@ -30,8 +30,6 @@
 #define AWCC_METHOD_THERMAL_CONTROL            0x15
 #define AWCC_METHOD_GAME_SHIFT_STATUS          0x25
 
-#define AWCC_THERMAL_MODE_GMODE                        0xAB
-
 #define AWCC_FAILURE_CODE                      0xFFFFFFFF
 #define AWCC_FAILURE_CODE_2                    0xFFFFFFFE
 
@@ -179,6 +177,11 @@ enum AWCC_THERMAL_TABLES {
        AWCC_THERMAL_TABLE_USTT                 = 0xA,
 };
 
+enum AWCC_SPECIAL_THERMAL_CODES {
+       AWCC_SPECIAL_PROFILE_CUSTOM             = 0x00,
+       AWCC_SPECIAL_PROFILE_GMODE              = 0xAB,
+};
+
 enum awcc_thermal_profile {
        AWCC_PROFILE_USTT_BALANCED,
        AWCC_PROFILE_USTT_BALANCED_PERFORMANCE,
@@ -599,9 +602,15 @@ static int awcc_platform_profile_get(struct device *dev,
        if (ret)
                return ret;
 
-       if (out_data == AWCC_THERMAL_MODE_GMODE) {
+       switch (out_data) {
+       case AWCC_SPECIAL_PROFILE_CUSTOM:
+               *profile = PLATFORM_PROFILE_CUSTOM;
+               return 0;
+       case AWCC_SPECIAL_PROFILE_GMODE:
                *profile = PLATFORM_PROFILE_PERFORMANCE;
                return 0;
+       default:
+               break;
        }
 
        if (!is_awcc_thermal_profile_id(out_data))
@@ -686,11 +695,17 @@ static int awcc_platform_profile_probe(void *drvdata, unsigned long *choices)
 
        if (awcc->gmode) {
                priv->supported_profiles[PLATFORM_PROFILE_PERFORMANCE] =
-                       AWCC_THERMAL_MODE_GMODE;
+                       AWCC_SPECIAL_PROFILE_GMODE;
 
                __set_bit(PLATFORM_PROFILE_PERFORMANCE, choices);
        }
 
+       /* Every model supports the "custom" profile */
+       priv->supported_profiles[PLATFORM_PROFILE_CUSTOM] =
+               AWCC_SPECIAL_PROFILE_CUSTOM;
+
+       __set_bit(PLATFORM_PROFILE_CUSTOM, choices);
+
        return 0;
 }