X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=it87.c;h=8a51027b38cfc0b1280f742f855f081108285364;hb=4f8c82e23c6ec819d166f467dab5509757dd540a;hp=5d13753be1888746689a810e72e9dd8a0439a621;hpb=3fde481373cebaf4d2dd03441e909b7ee880dca6;p=groeck-it87 diff --git a/it87.c b/it87.c index 5d13753..8a51027 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 @@ -339,7 +341,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 +383,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 +392,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 +401,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 +411,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 +422,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 +433,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 +446,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 +458,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 +471,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 +486,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 +501,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 +512,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 +523,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 +534,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 +545,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 +556,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 +567,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 +576,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 +601,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 +613,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 +626,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 +639,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 +651,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 +664,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 +676,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 +688,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 +788,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 +1134,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 @@ -1227,9 +1243,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, @@ -3020,6 +3038,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; @@ -3088,8 +3109,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 */ @@ -3188,7 +3209,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);