]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
platform/x86: alienware-wmi-wmax: Add appropriate labels to fans
authorKurt Borja <kuurtb@gmail.com>
Wed, 28 May 2025 10:47:22 +0000 (07:47 -0300)
committerIlpo Järvinen <ilpo.jarvinen@linux.intel.com>
Mon, 9 Jun 2025 09:36:26 +0000 (12:36 +0300)
Add known fan type IDs and match them to an appropriate label in
awcc_hwmon_read_string().

Additionally, add the AWCC_TEMP_SENSOR_FRONT type, which was inferred
from it's related fan type in supported systems.

Signed-off-by: Kurt Borja <kuurtb@gmail.com>
Reviewed-by: Armin Wolf <W_Armin@gmx.de>
Link: https://lore.kernel.org/r/20250528-awcc-labels-v1-1-6aa39d8e4c3d@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 c42f9228b0b255fe962b735ac96486824e83945f..b25eb3225d8e5385384880a9cb480aaf3cb4d0a8 100644 (file)
@@ -273,9 +273,29 @@ enum AWCC_SPECIAL_THERMAL_CODES {
 
 enum AWCC_TEMP_SENSOR_TYPES {
        AWCC_TEMP_SENSOR_CPU                    = 0x01,
+       AWCC_TEMP_SENSOR_FRONT                  = 0x03,
        AWCC_TEMP_SENSOR_GPU                    = 0x06,
 };
 
+enum AWCC_FAN_TYPES {
+       AWCC_FAN_CPU_1                          = 0x32,
+       AWCC_FAN_GPU_1                          = 0x33,
+       AWCC_FAN_PCI                            = 0x34,
+       AWCC_FAN_MID                            = 0x35,
+       AWCC_FAN_TOP_1                          = 0x36,
+       AWCC_FAN_SIDE                           = 0x37,
+       AWCC_FAN_U2_1                           = 0x38,
+       AWCC_FAN_U2_2                           = 0x39,
+       AWCC_FAN_FRONT_1                        = 0x3A,
+       AWCC_FAN_CPU_2                          = 0x3B,
+       AWCC_FAN_GPU_2                          = 0x3C,
+       AWCC_FAN_TOP_2                          = 0x3D,
+       AWCC_FAN_TOP_3                          = 0x3E,
+       AWCC_FAN_FRONT_2                        = 0x3F,
+       AWCC_FAN_BOTTOM_1                       = 0x40,
+       AWCC_FAN_BOTTOM_2                       = 0x41,
+};
+
 enum awcc_thermal_profile {
        AWCC_PROFILE_USTT_BALANCED,
        AWCC_PROFILE_USTT_BALANCED_PERFORMANCE,
@@ -314,7 +334,6 @@ struct wmax_u32_args {
 
 struct awcc_fan_data {
        unsigned long auto_channels_temp;
-       const char *label;
        u32 min_rpm;
        u32 max_rpm;
        u8 suspend_cache;
@@ -896,6 +915,9 @@ static int awcc_hwmon_read_string(struct device *dev, enum hwmon_sensor_types ty
                case AWCC_TEMP_SENSOR_CPU:
                        *str = "CPU";
                        break;
+               case AWCC_TEMP_SENSOR_FRONT:
+                       *str = "Front";
+                       break;
                case AWCC_TEMP_SENSOR_GPU:
                        *str = "GPU";
                        break;
@@ -906,7 +928,46 @@ static int awcc_hwmon_read_string(struct device *dev, enum hwmon_sensor_types ty
 
                break;
        case hwmon_fan:
-               *str = priv->fan_data[channel]->label;
+               switch (priv->fan_data[channel]->id) {
+               case AWCC_FAN_CPU_1:
+               case AWCC_FAN_CPU_2:
+                       *str = "CPU Fan";
+                       break;
+               case AWCC_FAN_GPU_1:
+               case AWCC_FAN_GPU_2:
+                       *str = "GPU Fan";
+                       break;
+               case AWCC_FAN_PCI:
+                       *str = "PCI Fan";
+                       break;
+               case AWCC_FAN_MID:
+                       *str = "Mid Fan";
+                       break;
+               case AWCC_FAN_TOP_1:
+               case AWCC_FAN_TOP_2:
+               case AWCC_FAN_TOP_3:
+                       *str = "Top Fan";
+                       break;
+               case AWCC_FAN_SIDE:
+                       *str = "Side Fan";
+                       break;
+               case AWCC_FAN_U2_1:
+               case AWCC_FAN_U2_2:
+                       *str = "U.2 Fan";
+                       break;
+               case AWCC_FAN_FRONT_1:
+               case AWCC_FAN_FRONT_2:
+                       *str = "Front Fan";
+                       break;
+               case AWCC_FAN_BOTTOM_1:
+               case AWCC_FAN_BOTTOM_2:
+                       *str = "Bottom Fan";
+                       break;
+               default:
+                       *str = "Unknown Fan";
+                       break;
+               }
+
                break;
        default:
                return -EOPNOTSUPP;
@@ -1051,40 +1112,6 @@ static int awcc_hwmon_temps_init(struct wmi_device *wdev)
        return 0;
 }
 
-static char *awcc_get_fan_label(unsigned long *fan_temps)
-{
-       unsigned int temp_count = bitmap_weight(fan_temps, AWCC_ID_BITMAP_SIZE);
-       char *label;
-       u8 temp_id;
-
-       switch (temp_count) {
-       case 0:
-               label = "Independent Fan";
-               break;
-       case 1:
-               temp_id = find_first_bit(fan_temps, AWCC_ID_BITMAP_SIZE);
-
-               switch (temp_id) {
-               case AWCC_TEMP_SENSOR_CPU:
-                       label = "Processor Fan";
-                       break;
-               case AWCC_TEMP_SENSOR_GPU:
-                       label = "Video Fan";
-                       break;
-               default:
-                       label = "Unknown Fan";
-                       break;
-               }
-
-               break;
-       default:
-               label = "Shared Fan";
-               break;
-       }
-
-       return label;
-}
-
 static int awcc_hwmon_fans_init(struct wmi_device *wdev)
 {
        struct awcc_priv *priv = dev_get_drvdata(&wdev->dev);
@@ -1138,7 +1165,6 @@ static int awcc_hwmon_fans_init(struct wmi_device *wdev)
                fan_data->id = id;
                fan_data->min_rpm = min_rpm;
                fan_data->max_rpm = max_rpm;
-               fan_data->label = awcc_get_fan_label(fan_temps);
                bitmap_gather(gather, fan_temps, priv->temp_sensors, AWCC_ID_BITMAP_SIZE);
                bitmap_copy(&fan_data->auto_channels_temp, gather, BITS_PER_LONG);
                priv->fan_data[i] = fan_data;