hwmon: (it87) Add support to detect sensor type AMDTSI
authorFrank Crawford <frank@crawford.emu.id.au>
Fri, 7 Jul 2023 12:29:52 +0000 (22:29 +1000)
committerGuenter Roeck <linux@roeck-us.net>
Mon, 21 Aug 2023 13:04:29 +0000 (06:04 -0700)
Add test for sensor type AMDTSI which is available on certain recent
chipsets.

Signed-off-by: Frank Crawford <frank@crawford.emu.id.au>
Link: https://lore.kernel.org/r/20230707123005.956415-4-frank@crawford.emu.id.au
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
drivers/hwmon/it87.c

index 36cc7a2..fbe86ce 100644 (file)
@@ -221,6 +221,10 @@ static bool fix_pwm_polarity;
  * Super-I/O configuration space.
  */
 #define IT87_REG_VID           0x0a
+
+/* Interface Selection register on other chips */
+#define IT87_REG_IFSEL         0x0a
+
 /*
  * The IT8705F and IT8712F earlier than revision 0x08 use register 0x0b
  * for fan divisors. Later IT8712F revisions must use 16-bit tachometer
@@ -1170,14 +1174,37 @@ static int get_temp_type(struct it87_data *data, int index)
         * 0 = disabled
         */
        u8 reg, extra;
-       int type = 0;
+       int ttype, type = 0;
+
+       /* Detect PECI vs. AMDTSI */
+       ttype = 6;
+       if ((has_temp_peci(data, index)) || data->type == it8721 ||
+           data->type == it8720) {
+               extra = it87_read_value(data, IT87_REG_IFSEL);
+               if ((extra & 0x70) == 0x40)
+                       ttype = 5;
+       }
 
-       reg = data->sensor;     /* In case value is updated while used */
-       extra = data->extra;
+       reg = it87_read_value(data, IT87_REG_TEMP_ENABLE);
+
+       /* Per chip special detection */
+       switch (data->type) {
+       case it8622:
+               if (!(reg & 0xc0) && index == 3)
+                       type = ttype;
+               break;
+       default:
+               break;
+       }
+
+       if (type || index >= 3)
+               return type;
+
+       extra = it87_read_value(data, IT87_REG_TEMP_EXTRA);
 
        if ((has_temp_peci(data, index) && (reg >> 6 == index + 1)) ||
            (has_temp_old_peci(data, index) && (extra & 0x80)))
-               type = 6;       /* Intel PECI */
+               type = ttype;   /* Intel PECI or AMDTSI */
        else if (reg & BIT(index))
                type = 3;       /* thermal diode */
        else if (reg & BIT(index + 3))