diff options
author | Frank Crawford <frank@crawford.emu.id.au> | 2023-07-07 22:29:52 +1000 |
---|---|---|
committer | Guenter Roeck <linux@roeck-us.net> | 2023-08-21 06:04:29 -0700 |
commit | 6593eac899202eedf328247d6f1818453c1b49ac (patch) | |
tree | 4a5bdd0b22b4fb3695ecfb0d1020b9d41e1a2f17 /drivers/hwmon/it87.c | |
parent | 2f60e5932942d923258b37d24d147cb7d765df3d (diff) |
hwmon: (it87) Add support to detect sensor type AMDTSI
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>
Diffstat (limited to 'drivers/hwmon/it87.c')
-rw-r--r-- | drivers/hwmon/it87.c | 35 |
1 files changed, 31 insertions, 4 deletions
diff --git a/drivers/hwmon/it87.c b/drivers/hwmon/it87.c index 36cc7a2b56b5..fbe86cec6055 100644 --- a/drivers/hwmon/it87.c +++ b/drivers/hwmon/it87.c @@ -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)) |