X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=it87.c;h=43578fd5213c032d1ff00dccfbc82d8c5f90ceef;hb=ce2074226cabbdb0c8732ae0f7efb13bc9d9959d;hp=deb416c8552db8a5e980f54191d5ad94d3b5027c;hpb=f9a7bd87c2ba1003e8bede593f423e791f8e7282;p=groeck-it87 diff --git a/it87.c b/it87.c index deb416c..43578fd 100644 --- a/it87.c +++ b/it87.c @@ -77,9 +77,6 @@ #define DRVNAME "it87" -/* Necessary API not (yet) exported in upstream kernel */ -/* #define __IT87_USE_ACPI_MUTEX */ - 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, @@ -89,17 +86,7 @@ static unsigned short force_id; module_param(force_id, ushort, 0); MODULE_PARM_DESC(force_id, "Override the detected device ID"); -static unsigned short blacklist = 1; -module_param(blacklist, ushort, 0); -MODULE_PARM_DESC(blacklist, - "Enable/disable blacklist (1=enable, 0=disable, default 1)"); - static struct platform_device *it87_pdev[2]; -static bool it87_sio4e_broken; -#ifdef __IT87_USE_ACPI_MUTEX -static acpi_handle it87_acpi_sio_handle; -static char *it87_acpi_sio_mutex; -#endif #define REG_2E 0x2e /* The register to read/write */ #define REG_4E 0x4e /* Secondary register to read/write */ @@ -127,12 +114,6 @@ static inline int superio_inb(int ioreg, int reg) outb(reg, ioreg); val = inb(ioreg + 1); - if (it87_sio4e_broken && ioreg == 0x4e && val == 0xff) { - __superio_enter(ioreg); - outb(reg, ioreg); - val = inb(ioreg + 1); - pr_warn("Retry access 0x4e:0x%x -> 0x%x\n", reg, val); - } return val; } @@ -156,17 +137,6 @@ static inline void superio_select(int ioreg, int ldn) static inline int superio_enter(int ioreg) { -#ifdef __IT87_USE_ACPI_MUTEX - if (it87_acpi_sio_mutex) { - acpi_status status; - - status = acpi_acquire_mutex(NULL, it87_acpi_sio_mutex, 0x10); - if (ACPI_FAILURE(status)) { - pr_err("Failed to acquire ACPI mutex\n"); - return -EBUSY; - } - } -#endif /* * Try to reserve ioreg and ioreg + 1 for exclusive access. */ @@ -177,24 +147,16 @@ static inline int superio_enter(int ioreg) return 0; error: -#ifdef __IT87_USE_ACPI_MUTEX - if (it87_acpi_sio_mutex) - acpi_release_mutex(it87_acpi_sio_handle, NULL); -#endif return -EBUSY; } -static inline void superio_exit(int ioreg) +static inline void superio_exit(int ioreg, bool doexit) { - if (!it87_sio4e_broken || ioreg != 0x4e) { + if (doexit) { outb(0x02, ioreg); outb(0x02, ioreg + 1); } release_region(ioreg, 2); -#ifdef __IT87_USE_ACPI_MUTEX - if (it87_acpi_sio_mutex) - acpi_release_mutex(it87_acpi_sio_handle, NULL); -#endif } /* Logical device 4 registers */ @@ -373,7 +335,6 @@ struct it87_devices { #define FEAT_NEWER_AUTOPWM BIT(1) #define FEAT_OLD_AUTOPWM BIT(2) #define FEAT_16BIT_FANS BIT(3) -#define FEAT_TEMP_OFFSET BIT(4) #define FEAT_TEMP_PECI BIT(5) #define FEAT_TEMP_OLD_PECI BIT(6) #define FEAT_FAN16_CONFIG BIT(7) /* Need to enable 16-bit fans */ @@ -416,7 +377,7 @@ static const struct it87_devices it87_devices[] = { [it8716] = { .name = "it8716", .suffix = "F", - .features = FEAT_16BIT_FANS | FEAT_TEMP_OFFSET | FEAT_VID + .features = FEAT_16BIT_FANS | FEAT_VID | FEAT_FAN16_CONFIG | FEAT_FIVE_FANS | FEAT_PWM_FREQ2 | FEAT_FANCTL_ONOFF, .num_temp_limit = 3, @@ -425,7 +386,7 @@ static const struct it87_devices it87_devices[] = { [it8718] = { .name = "it8718", .suffix = "F", - .features = FEAT_16BIT_FANS | FEAT_TEMP_OFFSET | FEAT_VID + .features = FEAT_16BIT_FANS | FEAT_VID | FEAT_TEMP_OLD_PECI | FEAT_FAN16_CONFIG | FEAT_FIVE_FANS | FEAT_PWM_FREQ2 | FEAT_FANCTL_ONOFF, .num_temp_limit = 3, @@ -435,7 +396,7 @@ static const struct it87_devices it87_devices[] = { [it8720] = { .name = "it8720", .suffix = "F", - .features = FEAT_16BIT_FANS | FEAT_TEMP_OFFSET | FEAT_VID + .features = FEAT_16BIT_FANS | FEAT_VID | FEAT_TEMP_OLD_PECI | FEAT_FAN16_CONFIG | FEAT_FIVE_FANS | FEAT_PWM_FREQ2 | FEAT_FANCTL_ONOFF, .num_temp_limit = 3, @@ -446,7 +407,7 @@ static const struct it87_devices it87_devices[] = { .name = "it8721", .suffix = "F", .features = FEAT_NEWER_AUTOPWM | FEAT_12MV_ADC | FEAT_16BIT_FANS - | FEAT_TEMP_OFFSET | FEAT_TEMP_OLD_PECI | FEAT_TEMP_PECI + | FEAT_TEMP_OLD_PECI | FEAT_TEMP_PECI | FEAT_FAN16_CONFIG | FEAT_FIVE_FANS | FEAT_IN7_INTERNAL | FEAT_PWM_FREQ2 | FEAT_SCALING | FEAT_FANCTL_ONOFF, .num_temp_limit = 3, @@ -458,7 +419,7 @@ static const struct it87_devices it87_devices[] = { .name = "it8728", .suffix = "F", .features = FEAT_NEWER_AUTOPWM | FEAT_12MV_ADC | FEAT_16BIT_FANS - | FEAT_TEMP_OFFSET | FEAT_TEMP_PECI | FEAT_FIVE_FANS + | FEAT_TEMP_PECI | FEAT_FIVE_FANS | FEAT_IN7_INTERNAL | FEAT_PWM_FREQ2 | FEAT_SCALING | FEAT_FANCTL_ONOFF, .num_temp_limit = 6, @@ -469,7 +430,7 @@ static const struct it87_devices it87_devices[] = { .name = "it8732", .suffix = "F", .features = FEAT_NEWER_AUTOPWM | FEAT_16BIT_FANS - | FEAT_TEMP_OFFSET | FEAT_TEMP_OLD_PECI | FEAT_TEMP_PECI + | FEAT_TEMP_OLD_PECI | FEAT_TEMP_PECI | FEAT_10_9MV_ADC | FEAT_IN7_INTERNAL | FEAT_FOUR_FANS | FEAT_FOUR_PWM | FEAT_FANCTL_ONOFF, .num_temp_limit = 3, @@ -481,7 +442,7 @@ static const struct it87_devices it87_devices[] = { .name = "it8771", .suffix = "E", .features = FEAT_NEWER_AUTOPWM | FEAT_12MV_ADC | FEAT_16BIT_FANS - | FEAT_TEMP_OFFSET | FEAT_TEMP_PECI | FEAT_IN7_INTERNAL + | FEAT_TEMP_PECI | FEAT_IN7_INTERNAL | FEAT_PWM_FREQ2 | FEAT_SCALING | FEAT_FANCTL_ONOFF, /* PECI: guesswork */ /* 12mV ADC (OHM) */ @@ -495,7 +456,7 @@ static const struct it87_devices it87_devices[] = { .name = "it8772", .suffix = "E", .features = FEAT_NEWER_AUTOPWM | FEAT_12MV_ADC | FEAT_16BIT_FANS - | FEAT_TEMP_OFFSET | FEAT_TEMP_PECI | FEAT_IN7_INTERNAL + | FEAT_TEMP_PECI | FEAT_IN7_INTERNAL | FEAT_PWM_FREQ2 | FEAT_SCALING | FEAT_FANCTL_ONOFF, /* PECI (coreboot) */ /* 12mV ADC (HWSensors4, OHM) */ @@ -508,7 +469,7 @@ static const struct it87_devices it87_devices[] = { [it8781] = { .name = "it8781", .suffix = "F", - .features = FEAT_16BIT_FANS | FEAT_TEMP_OFFSET + .features = FEAT_16BIT_FANS | FEAT_TEMP_OLD_PECI | FEAT_FAN16_CONFIG | FEAT_PWM_FREQ2 | FEAT_FANCTL_ONOFF, .num_temp_limit = 3, @@ -518,7 +479,7 @@ static const struct it87_devices it87_devices[] = { [it8782] = { .name = "it8782", .suffix = "F", - .features = FEAT_16BIT_FANS | FEAT_TEMP_OFFSET + .features = FEAT_16BIT_FANS | FEAT_TEMP_OLD_PECI | FEAT_FAN16_CONFIG | FEAT_PWM_FREQ2 | FEAT_FANCTL_ONOFF, .num_temp_limit = 3, @@ -528,7 +489,7 @@ static const struct it87_devices it87_devices[] = { [it8783] = { .name = "it8783", .suffix = "E/F", - .features = FEAT_16BIT_FANS | FEAT_TEMP_OFFSET + .features = FEAT_16BIT_FANS | FEAT_TEMP_OLD_PECI | FEAT_FAN16_CONFIG | FEAT_PWM_FREQ2 | FEAT_FANCTL_ONOFF, .num_temp_limit = 3, @@ -539,7 +500,7 @@ static const struct it87_devices it87_devices[] = { .name = "it8786", .suffix = "E", .features = FEAT_NEWER_AUTOPWM | FEAT_12MV_ADC | FEAT_16BIT_FANS - | FEAT_TEMP_OFFSET | FEAT_TEMP_PECI | FEAT_IN7_INTERNAL + | FEAT_TEMP_PECI | FEAT_IN7_INTERNAL | FEAT_PWM_FREQ2 | FEAT_FANCTL_ONOFF, .num_temp_limit = 3, .num_temp_offset = 3, @@ -549,7 +510,7 @@ static const struct it87_devices it87_devices[] = { .name = "it8790", .suffix = "E", .features = FEAT_NEWER_AUTOPWM | FEAT_10_9MV_ADC | FEAT_SCALING - | FEAT_16BIT_FANS | FEAT_TEMP_OFFSET | FEAT_TEMP_PECI + | FEAT_16BIT_FANS | FEAT_TEMP_PECI | FEAT_IN7_INTERNAL | FEAT_PWM_FREQ2 | FEAT_FANCTL_ONOFF, .num_temp_limit = 3, .num_temp_offset = 3, @@ -559,7 +520,7 @@ static const struct it87_devices it87_devices[] = { .name = "it8792", .suffix = "E", .features = FEAT_NEWER_AUTOPWM | FEAT_10_9MV_ADC | FEAT_SCALING - | FEAT_16BIT_FANS | FEAT_TEMP_OFFSET | FEAT_TEMP_PECI + | FEAT_16BIT_FANS | FEAT_TEMP_PECI | FEAT_IN7_INTERNAL | FEAT_PWM_FREQ2 | FEAT_FANCTL_ONOFF, .num_temp_limit = 3, .num_temp_offset = 3, @@ -569,7 +530,7 @@ static const struct it87_devices it87_devices[] = { .name = "it8603", .suffix = "E", .features = FEAT_NEWER_AUTOPWM | FEAT_12MV_ADC | FEAT_16BIT_FANS - | FEAT_TEMP_OFFSET | FEAT_TEMP_PECI | FEAT_IN7_INTERNAL + | FEAT_TEMP_PECI | FEAT_IN7_INTERNAL | FEAT_AVCC3 | FEAT_PWM_FREQ2 | FEAT_SCALING, .num_temp_limit = 3, .num_temp_offset = 3, @@ -579,7 +540,7 @@ static const struct it87_devices it87_devices[] = { .name = "it8607", .suffix = "E", .features = FEAT_NEWER_AUTOPWM | FEAT_12MV_ADC | FEAT_16BIT_FANS - | FEAT_TEMP_OFFSET | FEAT_TEMP_PECI | FEAT_IN7_INTERNAL + | FEAT_TEMP_PECI | FEAT_IN7_INTERNAL | FEAT_AVCC3 | FEAT_PWM_FREQ2 | FEAT_SCALING | FEAT_FANCTL_ONOFF, .num_temp_limit = 3, @@ -590,7 +551,7 @@ static const struct it87_devices it87_devices[] = { .name = "it8613", .suffix = "E", .features = FEAT_NEWER_AUTOPWM | FEAT_11MV_ADC | FEAT_16BIT_FANS - | FEAT_TEMP_OFFSET | FEAT_TEMP_PECI | FEAT_FIVE_FANS + | FEAT_TEMP_PECI | FEAT_FIVE_FANS | FEAT_FIVE_PWM | FEAT_IN7_INTERNAL | FEAT_PWM_FREQ2 | FEAT_AVCC3 | FEAT_SCALING | FEAT_NEW_TEMPMAP, .num_temp_limit = 6, @@ -601,7 +562,7 @@ static const struct it87_devices it87_devices[] = { .name = "it8620", .suffix = "E", .features = FEAT_NEWER_AUTOPWM | FEAT_12MV_ADC | FEAT_16BIT_FANS - | FEAT_TEMP_OFFSET | FEAT_TEMP_PECI | FEAT_SIX_FANS + | FEAT_TEMP_PECI | FEAT_SIX_FANS | FEAT_IN7_INTERNAL | FEAT_SIX_PWM | FEAT_PWM_FREQ2 | FEAT_SIX_TEMP | FEAT_VIN3_5V | FEAT_SCALING | FEAT_FANCTL_ONOFF, @@ -613,7 +574,7 @@ static const struct it87_devices it87_devices[] = { .name = "it8622", .suffix = "E", .features = FEAT_NEWER_AUTOPWM | FEAT_12MV_ADC | FEAT_16BIT_FANS - | FEAT_TEMP_OFFSET | FEAT_TEMP_PECI | FEAT_FIVE_FANS + | FEAT_TEMP_PECI | FEAT_FIVE_FANS | FEAT_FIVE_PWM | FEAT_IN7_INTERNAL | FEAT_PWM_FREQ2 | FEAT_AVCC3 | FEAT_VIN3_5V | FEAT_SCALING, .num_temp_limit = 3, @@ -624,7 +585,7 @@ static const struct it87_devices it87_devices[] = { .name = "it8625", .suffix = "E", .features = FEAT_NEWER_AUTOPWM | FEAT_16BIT_FANS - | FEAT_TEMP_OFFSET | FEAT_AVCC3 | FEAT_NEW_TEMPMAP + | FEAT_AVCC3 | FEAT_NEW_TEMPMAP | FEAT_11MV_ADC | FEAT_IN7_INTERNAL | FEAT_SIX_FANS | FEAT_SIX_PWM | FEAT_BANK_SEL | FEAT_SCALING, .num_temp_limit = 6, @@ -634,7 +595,7 @@ static const struct it87_devices it87_devices[] = { .name = "it8628", .suffix = "E", .features = FEAT_NEWER_AUTOPWM | FEAT_12MV_ADC | FEAT_16BIT_FANS - | FEAT_TEMP_OFFSET | FEAT_TEMP_PECI | FEAT_SIX_FANS + | FEAT_TEMP_PECI | FEAT_SIX_FANS | FEAT_IN7_INTERNAL | FEAT_SIX_PWM | FEAT_PWM_FREQ2 | FEAT_SIX_TEMP | FEAT_SCALING | FEAT_AVCC3 | FEAT_FANCTL_ONOFF, @@ -646,7 +607,7 @@ static const struct it87_devices it87_devices[] = { .name = "it8655", .suffix = "E", .features = FEAT_NEWER_AUTOPWM | FEAT_16BIT_FANS - | FEAT_TEMP_OFFSET | FEAT_AVCC3 | FEAT_NEW_TEMPMAP + | FEAT_AVCC3 | FEAT_NEW_TEMPMAP | FEAT_10_9MV_ADC | FEAT_IN7_INTERNAL | FEAT_BANK_SEL, .num_temp_limit = 6, .num_temp_offset = 6, @@ -655,7 +616,7 @@ static const struct it87_devices it87_devices[] = { .name = "it8665", .suffix = "E", .features = FEAT_NEWER_AUTOPWM | FEAT_16BIT_FANS - | FEAT_TEMP_OFFSET | FEAT_AVCC3 | FEAT_NEW_TEMPMAP + | FEAT_AVCC3 | FEAT_NEW_TEMPMAP | FEAT_10_9MV_ADC | FEAT_IN7_INTERNAL | FEAT_SIX_FANS | FEAT_SIX_PWM | FEAT_BANK_SEL, .num_temp_limit = 6, @@ -665,7 +626,7 @@ static const struct it87_devices it87_devices[] = { .name = "it8686", .suffix = "E", .features = FEAT_NEWER_AUTOPWM | FEAT_12MV_ADC | FEAT_16BIT_FANS - | FEAT_TEMP_OFFSET | FEAT_SIX_FANS | FEAT_NEW_TEMPMAP + | FEAT_SIX_FANS | FEAT_NEW_TEMPMAP | FEAT_IN7_INTERNAL | FEAT_SIX_PWM | FEAT_PWM_FREQ2 | FEAT_SIX_TEMP | FEAT_BANK_SEL | FEAT_SCALING | FEAT_AVCC3, .num_temp_limit = 6, @@ -678,7 +639,6 @@ static const struct it87_devices it87_devices[] = { #define has_10_9mv_adc(data) ((data)->features & FEAT_10_9MV_ADC) #define has_newer_autopwm(data) ((data)->features & FEAT_NEWER_AUTOPWM) #define has_old_autopwm(data) ((data)->features & FEAT_OLD_AUTOPWM) -#define has_temp_offset(data) ((data)->features & FEAT_TEMP_OFFSET) #define has_temp_peci(data, nr) (((data)->features & FEAT_TEMP_PECI) && \ ((data)->peci_mask & BIT(nr))) #define has_temp_old_peci(data, nr) \ @@ -1055,7 +1015,7 @@ static struct it87_data *it87_update_device(struct device *dev) if (i >= data->num_temp_limit) continue; - if (has_temp_offset(data) && i < data->num_temp_offset) + if (i < data->num_temp_offset) data->temp[i][3] = it87_read_value(data, data->REG_TEMP_OFFSET[i]); @@ -2471,7 +2431,7 @@ static umode_t it87_temp_is_visible(struct kobject *kobj, return attr->mode; } - if (a == 5 && (!has_temp_offset(data) || i >= data->num_temp_offset)) + if (a == 5 && i >= data->num_temp_offset) return 0; if (a == 6 && !data->has_beep) @@ -2800,9 +2760,10 @@ static const struct attribute_group it87_group_auto_pwm = { static int __init it87_find(int sioaddr, unsigned short *address, struct it87_sio_data *sio_data) { - int err; - u16 chip_type; const struct it87_devices *config; + bool doexit = true; + u16 chip_type; + int err; err = superio_enter(sioaddr); if (err) @@ -2844,6 +2805,13 @@ static int __init it87_find(int sioaddr, unsigned short *address, break; case IT8792E_DEVID: sio_data->type = it8792; + /* + * Disabling configuration mode on IT8792E can result in system + * hang-ups and access failures to the Super-IO chip at the + * second SIO address. Never exit configuration mode on this + * chip to avoid the problem. + */ + doexit = false; break; case IT8771E_DEVID: sio_data->type = it8771; @@ -3040,9 +3008,16 @@ static int __init it87_find(int sioaddr, unsigned short *address, if (reg29 & BIT(2)) sio_data->skip_fan |= BIT(1); - if (sio_data->type == it8603) { + switch (sio_data->type) { + case it8603: sio_data->skip_in |= BIT(5); /* No VIN5 */ sio_data->skip_in |= BIT(6); /* No VIN6 */ + break; + case it8607: + sio_data->skip_pwm |= BIT(0);/* No fan1 */ + sio_data->skip_fan |= BIT(0); + default: + break; } sio_data->beep_pin = superio_inb(sioaddr, @@ -3388,7 +3363,7 @@ static int __init it87_find(int sioaddr, unsigned short *address, pr_info("Beeping is supported\n"); exit: - superio_exit(sioaddr); + superio_exit(sioaddr, doexit); return err; } @@ -3846,21 +3821,9 @@ exit_device_put: } struct it87_dmi_data { - bool sio4e_broken; /* SIO accesses @ 0x4e are broken */ - char *sio_mutex; /* SIO ACPI mutex */ u8 skip_pwm; /* pwm channels to skip for this board */ }; -/* - * On Gigabyte AB350 and AX370 boards, accesses to the Super-IO chip - * at address 0x4e/0x4f can result in a system hang. - * Accesses to address 0x2e/0x2f need to be mutex protected. - */ -static struct it87_dmi_data gigabyte_ab350_gaming = { - .sio4e_broken = true, - .sio_mutex = "\\_SB.PCI0.SBRG.SIO1.MUT0", -}; - /* * On the Shuttle SN68PT, FAN_CTL2 is apparently not * connected to a fan, but to something else. One user @@ -3874,41 +3837,6 @@ 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_BOARD_NAME, "AB350-Gaming-CF"), - }, - .driver_data = &gigabyte_ab350_gaming, - }, - { - .matches = { - DMI_MATCH(DMI_SYS_VENDOR, "Gigabyte Technology Co., Ltd."), - DMI_MATCH(DMI_BOARD_NAME, "AB350-Gaming 3-CF"), - }, - .driver_data = &gigabyte_ab350_gaming, - }, - { - .matches = { - DMI_MATCH(DMI_SYS_VENDOR, "Gigabyte Technology Co., Ltd."), - DMI_MATCH(DMI_BOARD_NAME, "AB350M-D3H-CF"), - }, - .driver_data = &gigabyte_ab350_gaming, - }, - { - .matches = { - DMI_MATCH(DMI_SYS_VENDOR, "Gigabyte Technology Co., Ltd."), - DMI_MATCH(DMI_BOARD_NAME, "AX370-Gaming K7"), - }, - .driver_data = &gigabyte_ab350_gaming, - }, - { - .matches = { - DMI_MATCH(DMI_SYS_VENDOR, "Gigabyte Technology Co., Ltd."), - DMI_MATCH(DMI_BOARD_NAME, "AX370-Gaming 5"), - }, - .driver_data = &gigabyte_ab350_gaming, - }, { .matches = { DMI_MATCH(DMI_BOARD_VENDOR, "nVIDIA"), @@ -3932,37 +3860,11 @@ static int __init sm_it87_init(void) if (dmi) dmi_data = dmi->driver_data; - if (dmi_data) { - it87_sio4e_broken = dmi_data->sio4e_broken; -#ifdef __IT87_USE_ACPI_MUTEX - if (dmi_data->sio_mutex) { - static acpi_status status; - - status = acpi_get_handle(NULL, dmi_data->sio_mutex, - &it87_acpi_sio_handle); - if (ACPI_SUCCESS(status)) { - it87_acpi_sio_mutex = dmi_data->sio_mutex; - pr_debug("Found ACPI SIO mutex %s\n", - dmi_data->sio_mutex); - } else { - pr_warn("ACPI SIO mutex %s not found\n", - dmi_data->sio_mutex); - } - } -#endif /* __IT87_USE_ACPI_MUTEX */ - } - err = platform_driver_register(&it87_driver); if (err) return err; for (i = 0; i < ARRAY_SIZE(sioaddr); i++) { - /* - * Accessing the second Super-IO chip can result in board - * hangs. Disable until we figure out what is going on. - */ - if (blacklist && it87_sio4e_broken && sioaddr[i] == 0x4e) - continue; memset(&sio_data, 0, sizeof(struct it87_sio_data)); isa_address = 0; err = it87_find(sioaddr[i], &isa_address, &sio_data);