X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=it87.c;h=7c1e7e41dcbaa882ec13600dda674b6a790cd569;hb=6582b4739f90e8efec31c7406a7826bdf314f8a8;hp=e6f240d783f40cf7dcfaee8e62cf9cabcbf624ce;hpb=7bf9a9269add6ea870aa6fe0dd0f76ab963ed9a0;p=groeck-it87 diff --git a/it87.c b/it87.c index e6f240d..7c1e7e4 100644 --- a/it87.c +++ b/it87.c @@ -11,6 +11,7 @@ * similar parts. The other devices are supported by different drivers. * * Supports: IT8603E Super I/O chip w/LPC interface + * IT8606E Super I/O chip w/LPC interface * IT8607E Super I/O chip w/LPC interface * IT8613E Super I/O chip w/LPC interface * IT8620E Super I/O chip w/LPC interface @@ -83,8 +84,8 @@ enum chips { it87, it8712, it8716, it8718, it8720, it8721, it8728, it8732, it8771, it8772, it8781, it8782, it8783, it8786, it8790, - it8792, it8603, it8607, it8613, it8620, it8622, it8625, it8628, - it8655, it8665, it8686 }; + it8792, it8603, it8606, it8607, it8613, it8620, it8622, it8625, + it8628, it8655, it8665, it8686 }; static unsigned short force_id; module_param(force_id, ushort, 0000); @@ -187,6 +188,7 @@ static inline void superio_exit(int ioreg, bool doexit) #define IT8786E_DEVID 0x8786 #define IT8790E_DEVID 0x8790 #define IT8603E_DEVID 0x8603 +#define IT8606E_DEVID 0x8606 #define IT8607E_DEVID 0x8607 #define IT8613E_DEVID 0x8613 #define IT8620E_DEVID 0x8620 @@ -256,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 @@ -339,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; @@ -381,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, @@ -390,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, @@ -399,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, @@ -409,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, @@ -420,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, @@ -431,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 @@ -444,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 @@ -456,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 @@ -469,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, @@ -484,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, @@ -499,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, @@ -510,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, @@ -521,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, @@ -532,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, @@ -543,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, @@ -554,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, @@ -565,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, @@ -574,9 +580,20 @@ static const struct it87_devices it87_devices[] = { .num_temp_map = 4, .peci_mask = 0x07, }, + [it8606] = { + .name = "it8606", + .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, + .num_temp_limit = 3, + .num_temp_offset = 3, + .num_temp_map = 3, + .peci_mask = 0x07, + }, [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 @@ -588,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 @@ -600,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 @@ -613,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 @@ -626,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 @@ -638,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 @@ -651,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 @@ -663,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 @@ -675,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 @@ -775,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 */ @@ -1122,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 @@ -1158,7 +1178,8 @@ static struct it87_data *it87_update_device(struct device *dev) if (!(data->has_fan & BIT(i))) continue; - data->fan[i][1] = data->read(data, data->REG_FAN_MIN[i]); + data->fan[i][1] = data->read(data, + data->REG_FAN_MIN[i]); data->fan[i][0] = data->read(data, data->REG_FAN[i]); /* Add high byte if in 16-bit mode */ if (has_16bit_fans(data)) { @@ -1226,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, @@ -1446,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; } @@ -2933,7 +2957,8 @@ static const struct attribute_group it87_group_auto_pwm = { /* SuperIO detection - will change isa_address if a chip is found */ static int __init it87_find(int sioaddr, unsigned short *address, - phys_addr_t *mmio_address, struct it87_sio_data *sio_data) + phys_addr_t *mmio_address, + struct it87_sio_data *sio_data) { const struct it87_devices *config; phys_addr_t base = 0; @@ -3018,6 +3043,9 @@ static int __init it87_find(int sioaddr, unsigned short *address, case IT8623E_DEVID: sio_data->type = it8603; break; + case IT8606E_DEVID: + sio_data->type = it8606; + break; case IT8607E_DEVID: sio_data->type = it8607; break; @@ -3086,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 */ @@ -3186,7 +3214,8 @@ static int __init it87_find(int sioaddr, unsigned short *address, sio_data->beep_pin = superio_inb(sioaddr, IT87_SIO_BEEP_PIN_REG) & 0x3f; - } else if (sio_data->type == it8603 || sio_data->type == it8607) { + } else if (sio_data->type == it8603 || sio_data->type == it8606 || + sio_data->type == it8607) { int reg27, reg29; superio_select(sioaddr, GPIO); @@ -4121,21 +4150,24 @@ static struct it87_dmi_data nvidia_fn68pt = { static const struct dmi_system_id it87_dmi_table[] __initconst = { { .matches = { - DMI_MATCH(DMI_SYS_VENDOR, "Gigabyte Technology Co., Ltd."), + DMI_MATCH(DMI_SYS_VENDOR, + "Gigabyte Technology Co., Ltd."), DMI_MATCH(DMI_BOARD_NAME, "AB350"), }, .driver_data = &gigabyte_sio2_force, }, { .matches = { - DMI_MATCH(DMI_SYS_VENDOR, "Gigabyte Technology Co., Ltd."), + DMI_MATCH(DMI_SYS_VENDOR, + "Gigabyte Technology Co., Ltd."), DMI_MATCH(DMI_BOARD_NAME, "AX370"), }, .driver_data = &gigabyte_sio2_force, }, { .matches = { - DMI_MATCH(DMI_SYS_VENDOR, "Gigabyte Technology Co., Ltd."), + DMI_MATCH(DMI_SYS_VENDOR, + "Gigabyte Technology Co., Ltd."), DMI_MATCH(DMI_BOARD_NAME, "Z97X-Gaming G1"), }, .driver_data = &gigabyte_sio2_force,