]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
platform/x86: alienware-wmi-wmax: Simplify FW profile to pprof matching
authorKurt Borja <kuurtb@gmail.com>
Tue, 4 Nov 2025 02:12:46 +0000 (21:12 -0500)
committerIlpo Järvinen <ilpo.jarvinen@linux.intel.com>
Mon, 10 Nov 2025 14:13:38 +0000 (16:13 +0200)
Drop profile matching micro-optimizations to improve readability and
long-term maintainability.

Additionally, is_awcc_thermal_profile_id is implicitly ignoring the
AWCC_PROFILE_SPECIAL_GMODE ID. State this explicitly with code and a
comment.

Signed-off-by: Kurt Borja <kuurtb@gmail.com>
Link: https://patch.msgid.link/20251103-aw-gmode-v1-1-eba7b7be0a9c@gmail.com
Reviewed-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
drivers/platform/x86/dell/alienware-wmi-wmax.c

index 31f9643a6a3b5c2eb74b089dc071964bd6df8b43..9af87471549cd97b7cc710ad980f7031b33efc37 100644 (file)
@@ -283,11 +283,6 @@ 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_TEMP_SENSOR_TYPES {
        AWCC_TEMP_SENSOR_CPU                    = 0x01,
        AWCC_TEMP_SENSOR_FRONT                  = 0x03,
@@ -314,17 +309,18 @@ enum AWCC_FAN_TYPES {
 };
 
 enum awcc_thermal_profile {
-       AWCC_PROFILE_USTT_BALANCED,
-       AWCC_PROFILE_USTT_BALANCED_PERFORMANCE,
-       AWCC_PROFILE_USTT_COOL,
-       AWCC_PROFILE_USTT_QUIET,
-       AWCC_PROFILE_USTT_PERFORMANCE,
-       AWCC_PROFILE_USTT_LOW_POWER,
-       AWCC_PROFILE_LEGACY_QUIET,
-       AWCC_PROFILE_LEGACY_BALANCED,
-       AWCC_PROFILE_LEGACY_BALANCED_PERFORMANCE,
-       AWCC_PROFILE_LEGACY_PERFORMANCE,
-       AWCC_PROFILE_LAST,
+       AWCC_PROFILE_SPECIAL_CUSTOM                     = 0x00,
+       AWCC_PROFILE_LEGACY_QUIET                       = 0x96,
+       AWCC_PROFILE_LEGACY_BALANCED                    = 0x97,
+       AWCC_PROFILE_LEGACY_BALANCED_PERFORMANCE        = 0x98,
+       AWCC_PROFILE_LEGACY_PERFORMANCE                 = 0x99,
+       AWCC_PROFILE_USTT_BALANCED                      = 0xA0,
+       AWCC_PROFILE_USTT_BALANCED_PERFORMANCE          = 0xA1,
+       AWCC_PROFILE_USTT_COOL                          = 0xA2,
+       AWCC_PROFILE_USTT_QUIET                         = 0xA3,
+       AWCC_PROFILE_USTT_PERFORMANCE                   = 0xA4,
+       AWCC_PROFILE_USTT_LOW_POWER                     = 0xA5,
+       AWCC_PROFILE_SPECIAL_GMODE                      = 0xAB,
 };
 
 struct wmax_led_args {
@@ -380,19 +376,6 @@ struct awcc_priv {
        u32 gpio_count;
 };
 
-static const enum platform_profile_option awcc_mode_to_platform_profile[AWCC_PROFILE_LAST] = {
-       [AWCC_PROFILE_USTT_BALANCED]                    = PLATFORM_PROFILE_BALANCED,
-       [AWCC_PROFILE_USTT_BALANCED_PERFORMANCE]        = PLATFORM_PROFILE_BALANCED_PERFORMANCE,
-       [AWCC_PROFILE_USTT_COOL]                        = PLATFORM_PROFILE_COOL,
-       [AWCC_PROFILE_USTT_QUIET]                       = PLATFORM_PROFILE_QUIET,
-       [AWCC_PROFILE_USTT_PERFORMANCE]                 = PLATFORM_PROFILE_PERFORMANCE,
-       [AWCC_PROFILE_USTT_LOW_POWER]                   = PLATFORM_PROFILE_LOW_POWER,
-       [AWCC_PROFILE_LEGACY_QUIET]                     = PLATFORM_PROFILE_QUIET,
-       [AWCC_PROFILE_LEGACY_BALANCED]                  = PLATFORM_PROFILE_BALANCED,
-       [AWCC_PROFILE_LEGACY_BALANCED_PERFORMANCE]      = PLATFORM_PROFILE_BALANCED_PERFORMANCE,
-       [AWCC_PROFILE_LEGACY_PERFORMANCE]               = PLATFORM_PROFILE_PERFORMANCE,
-};
-
 static struct awcc_quirks *awcc;
 
 /*
@@ -610,21 +593,41 @@ const struct attribute_group wmax_deepsleep_attribute_group = {
 /*
  * AWCC Helpers
  */
-static bool is_awcc_thermal_profile_id(u8 code)
+static int awcc_profile_to_pprof(enum awcc_thermal_profile profile,
+                                enum platform_profile_option *pprof)
 {
-       u8 table = FIELD_GET(AWCC_THERMAL_TABLE_MASK, code);
-       u8 mode = FIELD_GET(AWCC_THERMAL_MODE_MASK, code);
-
-       if (mode >= AWCC_PROFILE_LAST)
-               return false;
-
-       if (table == AWCC_THERMAL_TABLE_LEGACY && mode >= AWCC_PROFILE_LEGACY_QUIET)
-               return true;
-
-       if (table == AWCC_THERMAL_TABLE_USTT && mode <= AWCC_PROFILE_USTT_LOW_POWER)
-               return true;
+       switch (profile) {
+       case AWCC_PROFILE_SPECIAL_CUSTOM:
+               *pprof = PLATFORM_PROFILE_CUSTOM;
+               break;
+       case AWCC_PROFILE_LEGACY_QUIET:
+       case AWCC_PROFILE_USTT_QUIET:
+               *pprof = PLATFORM_PROFILE_QUIET;
+               break;
+       case AWCC_PROFILE_LEGACY_BALANCED:
+       case AWCC_PROFILE_USTT_BALANCED:
+               *pprof = PLATFORM_PROFILE_BALANCED;
+               break;
+       case AWCC_PROFILE_LEGACY_BALANCED_PERFORMANCE:
+       case AWCC_PROFILE_USTT_BALANCED_PERFORMANCE:
+               *pprof = PLATFORM_PROFILE_BALANCED_PERFORMANCE;
+               break;
+       case AWCC_PROFILE_LEGACY_PERFORMANCE:
+       case AWCC_PROFILE_USTT_PERFORMANCE:
+       case AWCC_PROFILE_SPECIAL_GMODE:
+               *pprof = PLATFORM_PROFILE_PERFORMANCE;
+               break;
+       case AWCC_PROFILE_USTT_COOL:
+               *pprof = PLATFORM_PROFILE_COOL;
+               break;
+       case AWCC_PROFILE_USTT_LOW_POWER:
+               *pprof = PLATFORM_PROFILE_LOW_POWER;
+               break;
+       default:
+               return -EINVAL;
+       }
 
-       return false;
+       return 0;
 }
 
 static int awcc_wmi_command(struct wmi_device *wdev, u32 method_id,
@@ -1273,24 +1276,7 @@ static int awcc_platform_profile_get(struct device *dev,
        if (ret)
                return ret;
 
-       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))
-               return -ENODATA;
-
-       out_data = FIELD_GET(AWCC_THERMAL_MODE_MASK, out_data);
-       *profile = awcc_mode_to_platform_profile[out_data];
-
-       return 0;
+       return awcc_profile_to_pprof(out_data, profile);
 }
 
 static int awcc_platform_profile_set(struct device *dev,
@@ -1327,7 +1313,6 @@ static int awcc_platform_profile_probe(void *drvdata, unsigned long *choices)
 {
        enum platform_profile_option profile;
        struct awcc_priv *priv = drvdata;
-       enum awcc_thermal_profile mode;
        u8 id, offset = 0;
        int ret;
 
@@ -1349,15 +1334,20 @@ static int awcc_platform_profile_probe(void *drvdata, unsigned long *choices)
                if (ret)
                        return ret;
 
-               if (!is_awcc_thermal_profile_id(id)) {
+               /*
+                * G-Mode profile ID is not listed consistently across modeles
+                * that support it, therefore we handle it through quirks.
+                */
+               if (id == AWCC_PROFILE_SPECIAL_GMODE)
+                       continue;
+
+               ret = awcc_profile_to_pprof(id, &profile);
+               if (ret) {
                        dev_dbg(&priv->wdev->dev, "Unmapped thermal profile ID 0x%02x\n", id);
                        continue;
                }
 
-               mode = FIELD_GET(AWCC_THERMAL_MODE_MASK, id);
-               profile = awcc_mode_to_platform_profile[mode];
                priv->supported_profiles[profile] = id;
-
                __set_bit(profile, choices);
        }
 
@@ -1366,14 +1356,14 @@ static int awcc_platform_profile_probe(void *drvdata, unsigned long *choices)
 
        if (awcc->gmode) {
                priv->supported_profiles[PLATFORM_PROFILE_PERFORMANCE] =
-                       AWCC_SPECIAL_PROFILE_GMODE;
+                       AWCC_PROFILE_SPECIAL_GMODE;
 
                __set_bit(PLATFORM_PROFILE_PERFORMANCE, choices);
        }
 
        /* Every model supports the "custom" profile */
        priv->supported_profiles[PLATFORM_PROFILE_CUSTOM] =
-               AWCC_SPECIAL_PROFILE_CUSTOM;
+               AWCC_PROFILE_SPECIAL_CUSTOM;
 
        __set_bit(PLATFORM_PROFILE_CUSTOM, choices);