]> git.sur5r.net Git - groeck-it87/blobdiff - it87.c
Fix PECI/AMDTSI selection
[groeck-it87] / it87.c
diff --git a/it87.c b/it87.c
index 9f1d38bdc07c09c6065e2c649a307ef56304c348..7c1e7e41dcbaa882ec13600dda674b6a790cd569 100644 (file)
--- a/it87.c
+++ b/it87.c
@@ -258,6 +258,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
@@ -341,7 +345,7 @@ static const u16 IT87_REG_TEMP_SRC1[] =     { 0x21d, 0x21e, 0x21f };
 
 struct it87_devices {
        const char *name;
-       const char * const suffix;
+       const char * const model;
        u32 features;
        u8 num_temp_limit;
        u8 num_temp_offset;
@@ -383,7 +387,7 @@ struct it87_devices {
 static const struct it87_devices it87_devices[] = {
        [it87] = {
                .name = "it87",
-               .suffix = "F",
+               .model = "IT87F",
                .features = FEAT_OLD_AUTOPWM | FEAT_FANCTL_ONOFF,
                                                /* may need to overwrite */
                .num_temp_limit = 3,
@@ -392,7 +396,7 @@ static const struct it87_devices it87_devices[] = {
        },
        [it8712] = {
                .name = "it8712",
-               .suffix = "F",
+               .model = "IT8712F",
                .features = FEAT_OLD_AUTOPWM | FEAT_VID | FEAT_FANCTL_ONOFF,
                                                /* may need to overwrite */
                .num_temp_limit = 3,
@@ -401,7 +405,7 @@ static const struct it87_devices it87_devices[] = {
        },
        [it8716] = {
                .name = "it8716",
-               .suffix = "F",
+               .model = "IT8716F",
                .features = FEAT_16BIT_FANS | FEAT_VID
                  | FEAT_FAN16_CONFIG | FEAT_FIVE_FANS | FEAT_PWM_FREQ2
                  | FEAT_FANCTL_ONOFF,
@@ -411,7 +415,7 @@ static const struct it87_devices it87_devices[] = {
        },
        [it8718] = {
                .name = "it8718",
-               .suffix = "F",
+               .model = "IT8718F",
                .features = FEAT_16BIT_FANS | FEAT_VID
                  | FEAT_TEMP_OLD_PECI | FEAT_FAN16_CONFIG | FEAT_FIVE_FANS
                  | FEAT_PWM_FREQ2 | FEAT_FANCTL_ONOFF,
@@ -422,7 +426,7 @@ static const struct it87_devices it87_devices[] = {
        },
        [it8720] = {
                .name = "it8720",
-               .suffix = "F",
+               .model = "IT8720F",
                .features = FEAT_16BIT_FANS | FEAT_VID
                  | FEAT_TEMP_OLD_PECI | FEAT_FAN16_CONFIG | FEAT_FIVE_FANS
                  | FEAT_PWM_FREQ2 | FEAT_FANCTL_ONOFF,
@@ -433,7 +437,7 @@ static const struct it87_devices it87_devices[] = {
        },
        [it8721] = {
                .name = "it8721",
-               .suffix = "F",
+               .model = "IT8721F",
                .features = FEAT_NEWER_AUTOPWM | FEAT_12MV_ADC | FEAT_16BIT_FANS
                  | FEAT_TEMP_OLD_PECI | FEAT_TEMP_PECI
                  | FEAT_FAN16_CONFIG | FEAT_FIVE_FANS | FEAT_IN7_INTERNAL
@@ -446,7 +450,7 @@ static const struct it87_devices it87_devices[] = {
        },
        [it8728] = {
                .name = "it8728",
-               .suffix = "F",
+               .model = "IT8728F",
                .features = FEAT_NEWER_AUTOPWM | FEAT_12MV_ADC | FEAT_16BIT_FANS
                  | FEAT_TEMP_PECI | FEAT_FIVE_FANS
                  | FEAT_IN7_INTERNAL | FEAT_PWM_FREQ2 | FEAT_SCALING
@@ -458,7 +462,7 @@ static const struct it87_devices it87_devices[] = {
        },
        [it8732] = {
                .name = "it8732",
-               .suffix = "F",
+               .model = "IT8732F",
                .features = FEAT_NEWER_AUTOPWM | FEAT_16BIT_FANS
                  | FEAT_TEMP_OLD_PECI | FEAT_TEMP_PECI
                  | FEAT_10_9MV_ADC | FEAT_IN7_INTERNAL | FEAT_FOUR_FANS
@@ -471,7 +475,7 @@ static const struct it87_devices it87_devices[] = {
        },
        [it8771] = {
                .name = "it8771",
-               .suffix = "E",
+               .model = "IT8771E",
                .features = FEAT_NEWER_AUTOPWM | FEAT_12MV_ADC | FEAT_16BIT_FANS
                  | FEAT_TEMP_PECI | FEAT_IN7_INTERNAL
                  | FEAT_PWM_FREQ2 | FEAT_SCALING | FEAT_FANCTL_ONOFF,
@@ -486,7 +490,7 @@ static const struct it87_devices it87_devices[] = {
        },
        [it8772] = {
                .name = "it8772",
-               .suffix = "E",
+               .model = "IT8772E",
                .features = FEAT_NEWER_AUTOPWM | FEAT_12MV_ADC | FEAT_16BIT_FANS
                  | FEAT_TEMP_PECI | FEAT_IN7_INTERNAL
                  | FEAT_PWM_FREQ2 | FEAT_SCALING | FEAT_FANCTL_ONOFF,
@@ -501,7 +505,7 @@ static const struct it87_devices it87_devices[] = {
        },
        [it8781] = {
                .name = "it8781",
-               .suffix = "F",
+               .model = "IT8781F",
                .features = FEAT_16BIT_FANS
                  | FEAT_TEMP_OLD_PECI | FEAT_FAN16_CONFIG | FEAT_PWM_FREQ2
                  | FEAT_FANCTL_ONOFF,
@@ -512,7 +516,7 @@ static const struct it87_devices it87_devices[] = {
        },
        [it8782] = {
                .name = "it8782",
-               .suffix = "F",
+               .model = "IT8782F",
                .features = FEAT_16BIT_FANS
                  | FEAT_TEMP_OLD_PECI | FEAT_FAN16_CONFIG | FEAT_PWM_FREQ2
                  | FEAT_FANCTL_ONOFF,
@@ -523,7 +527,7 @@ static const struct it87_devices it87_devices[] = {
        },
        [it8783] = {
                .name = "it8783",
-               .suffix = "E/F",
+               .model = "IT8783E/F",
                .features = FEAT_16BIT_FANS
                  | FEAT_TEMP_OLD_PECI | FEAT_FAN16_CONFIG | FEAT_PWM_FREQ2
                  | FEAT_FANCTL_ONOFF,
@@ -534,7 +538,7 @@ static const struct it87_devices it87_devices[] = {
        },
        [it8786] = {
                .name = "it8786",
-               .suffix = "E",
+               .model = "IT8786E",
                .features = FEAT_NEWER_AUTOPWM | FEAT_12MV_ADC | FEAT_16BIT_FANS
                  | FEAT_TEMP_PECI | FEAT_IN7_INTERNAL
                  | FEAT_PWM_FREQ2 | FEAT_FANCTL_ONOFF,
@@ -545,7 +549,7 @@ static const struct it87_devices it87_devices[] = {
        },
        [it8790] = {
                .name = "it8790",
-               .suffix = "E",
+               .model = "IT8790E",
                .features = FEAT_NEWER_AUTOPWM | FEAT_10_9MV_ADC | FEAT_SCALING
                  | FEAT_16BIT_FANS | FEAT_TEMP_PECI
                  | FEAT_IN7_INTERNAL | FEAT_PWM_FREQ2 | FEAT_FANCTL_ONOFF,
@@ -556,7 +560,7 @@ static const struct it87_devices it87_devices[] = {
        },
        [it8792] = {
                .name = "it8792",
-               .suffix = "E",
+               .model = "IT8792E/IT8795E",
                .features = FEAT_NEWER_AUTOPWM | FEAT_10_9MV_ADC | FEAT_SCALING
                  | FEAT_16BIT_FANS | FEAT_TEMP_PECI
                  | FEAT_IN7_INTERNAL | FEAT_PWM_FREQ2 | FEAT_FANCTL_ONOFF,
@@ -567,7 +571,7 @@ static const struct it87_devices it87_devices[] = {
        },
        [it8603] = {
                .name = "it8603",
-               .suffix = "E",
+               .model = "IT8603E",
                .features = FEAT_NEWER_AUTOPWM | FEAT_12MV_ADC | FEAT_16BIT_FANS
                  | FEAT_TEMP_PECI | FEAT_IN7_INTERNAL
                  | FEAT_AVCC3 | FEAT_PWM_FREQ2 | FEAT_SCALING,
@@ -578,7 +582,7 @@ static const struct it87_devices it87_devices[] = {
        },
        [it8606] = {
                .name = "it8606",
-               .suffix = "E",
+               .model = "IT8606E",
                .features = FEAT_NEWER_AUTOPWM | FEAT_12MV_ADC | FEAT_16BIT_FANS
                  | FEAT_TEMP_PECI | FEAT_IN7_INTERNAL
                  | FEAT_AVCC3 | FEAT_PWM_FREQ2 | FEAT_SCALING,
@@ -589,7 +593,7 @@ static const struct it87_devices it87_devices[] = {
        },
        [it8607] = {
                .name = "it8607",
-               .suffix = "E",
+               .model = "IT8607E",
                .features = FEAT_NEWER_AUTOPWM | FEAT_12MV_ADC | FEAT_16BIT_FANS
                  | FEAT_TEMP_PECI | FEAT_IN7_INTERNAL | FEAT_NEW_TEMPMAP
                  | FEAT_AVCC3 | FEAT_PWM_FREQ2 | FEAT_SCALING
@@ -601,7 +605,7 @@ static const struct it87_devices it87_devices[] = {
        },
        [it8613] = {
                .name = "it8613",
-               .suffix = "E",
+               .model = "IT8613E",
                .features = FEAT_NEWER_AUTOPWM | FEAT_11MV_ADC | FEAT_16BIT_FANS
                  | FEAT_TEMP_PECI | FEAT_FIVE_FANS
                  | FEAT_FIVE_PWM | FEAT_IN7_INTERNAL | FEAT_PWM_FREQ2
@@ -613,7 +617,7 @@ static const struct it87_devices it87_devices[] = {
        },
        [it8620] = {
                .name = "it8620",
-               .suffix = "E",
+               .model = "IT8620E",
                .features = FEAT_NEWER_AUTOPWM | FEAT_12MV_ADC | FEAT_16BIT_FANS
                  | FEAT_TEMP_PECI | FEAT_SIX_FANS
                  | FEAT_IN7_INTERNAL | FEAT_SIX_PWM | FEAT_PWM_FREQ2
@@ -626,7 +630,7 @@ static const struct it87_devices it87_devices[] = {
        },
        [it8622] = {
                .name = "it8622",
-               .suffix = "E",
+               .model = "IT8622E",
                .features = FEAT_NEWER_AUTOPWM | FEAT_12MV_ADC | FEAT_16BIT_FANS
                  | FEAT_TEMP_PECI | FEAT_FIVE_FANS | FEAT_FOUR_TEMP
                  | FEAT_FIVE_PWM | FEAT_IN7_INTERNAL | FEAT_PWM_FREQ2
@@ -639,7 +643,7 @@ static const struct it87_devices it87_devices[] = {
        },
        [it8625] = {
                .name = "it8625",
-               .suffix = "E",
+               .model = "IT8625E",
                .features = FEAT_NEWER_AUTOPWM | FEAT_16BIT_FANS
                  | FEAT_AVCC3 | FEAT_NEW_TEMPMAP
                  | FEAT_11MV_ADC | FEAT_IN7_INTERNAL | FEAT_SIX_FANS
@@ -651,7 +655,7 @@ static const struct it87_devices it87_devices[] = {
        },
        [it8628] = {
                .name = "it8628",
-               .suffix = "E",
+               .model = "IT8628E",
                .features = FEAT_NEWER_AUTOPWM | FEAT_12MV_ADC | FEAT_16BIT_FANS
                  | FEAT_TEMP_PECI | FEAT_SIX_FANS
                  | FEAT_IN7_INTERNAL | FEAT_SIX_PWM | FEAT_PWM_FREQ2
@@ -664,7 +668,7 @@ static const struct it87_devices it87_devices[] = {
        },
        [it8655] = {
                .name = "it8655",
-               .suffix = "E",
+               .model = "IT8655E",
                .features = FEAT_NEWER_AUTOPWM | FEAT_16BIT_FANS
                  | FEAT_AVCC3 | FEAT_NEW_TEMPMAP | FEAT_SCALING
                  | FEAT_10_9MV_ADC | FEAT_IN7_INTERNAL | FEAT_BANK_SEL
@@ -676,7 +680,7 @@ static const struct it87_devices it87_devices[] = {
        },
        [it8665] = {
                .name = "it8665",
-               .suffix = "E",
+               .model = "IT8665E",
                .features = FEAT_NEWER_AUTOPWM | FEAT_16BIT_FANS
                  | FEAT_AVCC3 | FEAT_NEW_TEMPMAP | FEAT_SCALING
                  | FEAT_10_9MV_ADC | FEAT_IN7_INTERNAL | FEAT_SIX_FANS
@@ -688,7 +692,7 @@ static const struct it87_devices it87_devices[] = {
        },
        [it8686] = {
                .name = "it8686",
-               .suffix = "E",
+               .model = "IT8686E",
                .features = FEAT_NEWER_AUTOPWM | FEAT_12MV_ADC | FEAT_16BIT_FANS
                  | FEAT_SIX_FANS | FEAT_NEW_TEMPMAP
                  | FEAT_IN7_INTERNAL | FEAT_SIX_PWM | FEAT_PWM_FREQ2
@@ -788,7 +792,6 @@ struct it87_data {
        const u8 *REG_TEMP_HIGH;
 
        unsigned short addr;
-       const char *name;
        struct mutex update_lock;
        char valid;             /* !=0 if following fields are valid */
        unsigned long last_updated;     /* In jiffies */
@@ -1135,15 +1138,19 @@ static void it87_unlock(struct it87_data *data)
 static struct it87_data *it87_update_device(struct device *dev)
 {
        struct it87_data *data = dev_get_drvdata(dev);
+       struct it87_data *ret = data;
        int err;
        int i;
 
-       err = it87_lock(data);
-       if (err)
-               return ERR_PTR(err);
+       mutex_lock(&data->update_lock);
 
        if (time_after(jiffies, data->last_updated + HZ + HZ / 2) ||
            !data->valid) {
+               err = smbus_disable(data);
+               if (err) {
+                       ret = ERR_PTR(err);
+                       goto unlock;
+               }
                if (update_vbat) {
                        /*
                         * Cleared after each update, so reenable.  Value
@@ -1240,9 +1247,11 @@ static struct it87_data *it87_update_device(struct device *dev)
                }
                data->last_updated = jiffies;
                data->valid = 1;
+               smbus_enable(data);
        }
-       it87_unlock(data);
-       return data;
+unlock:
+       mutex_unlock(&data->update_lock);
+       return ret;
 }
 
 static ssize_t show_in(struct device *dev, struct device_attribute *attr,
@@ -1460,11 +1469,12 @@ static int get_temp_type(struct it87_data *data, int index)
        if (type)
                return type;
 
-       /* Dectect PECI vs. AMDTSI if possible */
+       /* Dectect PECI vs. AMDTSI */
        ttype = 6;
-       if ((has_temp_peci(data, index)) && data->type != it8721) {
-               extra = data->read(data, 0x98); /* PCH/AMDTSI host status */
-               if (extra & BIT(6))
+       if ((has_temp_peci(data, index)) || data->type == it8721 ||
+           data->type == it8720) {
+               extra = data->read(data, IT87_REG_IFSEL);
+               if ((extra & 0x70) == 0x40)
                        ttype = 5;
        }
 
@@ -3104,8 +3114,8 @@ static int __init it87_find(int sioaddr, unsigned short *address,
        if (base)
                snprintf(mmio_str, sizeof(mmio_str), " [MMIO at %pa]", &base);
 
-       pr_info("Found IT%04x%s chip at 0x%x%s, revision %d\n", chip_type,
-               it87_devices[sio_data->type].suffix,
+       pr_info("Found %s chip at 0x%x%s, revision %d\n",
+               it87_devices[sio_data->type].model,
                *address, mmio_str, sio_data->revision);
 
        /* in7 (VSB or VCCH5V) is always internal on some chips */