X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=it87.c;h=9bb5d5b3761d5603f3ee2befcf2f97b5bfe1221c;hb=c01952b9ca87c2127bd97e194a654979dd842ceb;hp=1ca0d149add81ab2036f3e60c296ed2d87986f1f;hpb=485178c1ecc1835066178eeda681a4d0a9cdd0ef;p=groeck-it87 diff --git a/it87.c b/it87.c index 1ca0d14..9bb5d5b 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, @@ -90,10 +87,6 @@ module_param(force_id, ushort, 0); MODULE_PARM_DESC(force_id, "Override the detected device ID"); static struct platform_device *it87_pdev[2]; -#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 */ @@ -144,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. */ @@ -165,10 +147,6 @@ 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; } @@ -179,10 +157,6 @@ static inline void superio_exit(int ioreg, bool doexit) 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 */ @@ -633,7 +607,7 @@ static const struct it87_devices it87_devices[] = { .name = "it8655", .suffix = "E", .features = FEAT_NEWER_AUTOPWM | FEAT_16BIT_FANS - | FEAT_AVCC3 | FEAT_NEW_TEMPMAP + | FEAT_AVCC3 | FEAT_NEW_TEMPMAP | FEAT_SCALING | FEAT_10_9MV_ADC | FEAT_IN7_INTERNAL | FEAT_BANK_SEL, .num_temp_limit = 6, .num_temp_offset = 6, @@ -642,7 +616,7 @@ static const struct it87_devices it87_devices[] = { .name = "it8665", .suffix = "E", .features = FEAT_NEWER_AUTOPWM | FEAT_16BIT_FANS - | FEAT_AVCC3 | FEAT_NEW_TEMPMAP + | FEAT_AVCC3 | FEAT_NEW_TEMPMAP | FEAT_SCALING | FEAT_10_9MV_ADC | FEAT_IN7_INTERNAL | FEAT_SIX_FANS | FEAT_SIX_PWM | FEAT_BANK_SEL, .num_temp_limit = 6, @@ -2859,6 +2833,7 @@ static int __init it87_find(int sioaddr, unsigned short *address, break; case IT8790E_DEVID: sio_data->type = it8790; + doexit = false; /* See IT8792E comment above */ break; case IT8603E_DEVID: case IT8623E_DEVID: @@ -3847,16 +3822,26 @@ exit_device_put: } struct it87_dmi_data { - char *sio_mutex; /* SIO ACPI mutex */ + bool sio2_force_config; /* force sio2 into configuration mode */ u8 skip_pwm; /* pwm channels to skip for this board */ }; /* - * On Gigabyte AB350 and AX370 boards, accesses to the Super-IO chip - * at address 0x2e/0x2f need to be mutex protected. + * On various Gigabyte AM4 boards (AB350, AX370), the second Super-IO chip + * (IT8792E) needs to be in configuration mode before accessing the first + * due to a bug in IT8792E which otherwise results in LPC bus access errors. + * This needs to be done before accessing the first Super-IO chip since + * the second chip may have been accessed prior to loading this driver. + * + * The problem is also reported to affect IT8795E, which is used on X299 boards + * and has the same chip ID as IT9792E (0x8733). It also appears to affect + * systems with IT8790E, which is used on some Z97X-Gaming boards as well as + * Z87X-OC. + * DMI entries for those systems will be added as they become available and + * as the problem is confirmed to affect those boards. */ -static struct it87_dmi_data gigabyte_ab350_gaming = { - .sio_mutex = "\\_SB.PCI0.SBRG.SIO1.MUT0", +static struct it87_dmi_data gigabyte_sio2_force = { + .sio2_force_config = true, }; /* @@ -3875,37 +3860,23 @@ 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"), + DMI_MATCH(DMI_BOARD_NAME, "AB350"), }, - .driver_data = &gigabyte_ab350_gaming, + .driver_data = &gigabyte_sio2_force, }, { .matches = { DMI_MATCH(DMI_SYS_VENDOR, "Gigabyte Technology Co., Ltd."), - DMI_MATCH(DMI_BOARD_NAME, "AX370-Gaming K7"), + DMI_MATCH(DMI_BOARD_NAME, "AX370"), }, - .driver_data = &gigabyte_ab350_gaming, + .driver_data = &gigabyte_sio2_force, }, { .matches = { DMI_MATCH(DMI_SYS_VENDOR, "Gigabyte Technology Co., Ltd."), - DMI_MATCH(DMI_BOARD_NAME, "AX370-Gaming 5"), + DMI_MATCH(DMI_BOARD_NAME, "Z97X-Gaming G1"), }, - .driver_data = &gigabyte_ab350_gaming, + .driver_data = &gigabyte_sio2_force, }, { .matches = { @@ -3930,29 +3901,13 @@ static int __init sm_it87_init(void) if (dmi) dmi_data = dmi->driver_data; - if (dmi_data) { -#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; + if (dmi_data && dmi_data->sio2_force_config) + __superio_enter(REG_4E); + for (i = 0; i < ARRAY_SIZE(sioaddr); i++) { memset(&sio_data, 0, sizeof(struct it87_sio_data)); isa_address = 0;