X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=nct6775.c;h=198fc46762e8b6e2996c1133f9066a7ab6d47271;hb=ad00077d680fba0530befe9e9ebb94ea090ce9ed;hp=3272356015af5478fda2d31588cb2056c05156cf;hpb=74c5c007daa6325b99d88b3f2015f46c9d6a8184;p=groeck-nct6775 diff --git a/nct6775.c b/nct6775.c index 3272356..198fc46 100644 --- a/nct6775.c +++ b/nct6775.c @@ -57,6 +57,7 @@ #include #include #include +#include #include #include "lm75.h" #include "compat.h" @@ -890,6 +891,7 @@ struct nct6775_data { u8 vbat; u8 fandiv1; u8 fandiv2; + u8 sio_enable; #endif }; @@ -3214,10 +3216,29 @@ nct6775_check_fan_inputs(struct nct6775_data *data) pwm6pin = false; } else if (data->kind == nct6776) { bool gpok = superio_inb(sioreg, 0x27) & 0x80; + const char *board_vendor, *board_name; + + board_vendor = dmi_get_system_info(DMI_BOARD_VENDOR); + board_name = dmi_get_system_info(DMI_BOARD_NAME); superio_select(sioreg, NCT6775_LD_HWM); regval = superio_inb(sioreg, SIO_REG_ENABLE); + /* + * ASRock Z77 Pro4-M is known to not enable fan 3..5 + * if booted in UEFI Ultra-FastBoot mode. + */ + if (!strcmp(board_vendor, "ASRock") && + !strcmp(board_name, "Z77 Pro4-M")) { + if ((regval & 0xe0) != 0xe0) { + pr_warn("Enabling Fans 3-5\n"); + regval |= 0xe0; + superio_outb(sioreg, SIO_REG_ENABLE, regval); + } + } + + data->sio_enable = regval; + if (regval & 0x80) fan3pin = gpok; else @@ -4050,19 +4071,26 @@ static int nct6775_suspend(struct device *dev) static int nct6775_resume(struct device *dev) { struct nct6775_data *data = dev_get_drvdata(dev); + int sioreg = data->sioreg; int i, j, err = 0; + u8 reg; mutex_lock(&data->update_lock); data->bank = 0xff; /* Force initial bank selection */ - if (data->kind == nct6791 || data->kind == nct6792) { - err = superio_enter(data->sioreg); - if (err) - goto abort; + err = superio_enter(sioreg); + if (err) + goto abort; - nct6791_enable_io_mapping(data->sioreg); - superio_exit(data->sioreg); - } + superio_select(sioreg, NCT6775_LD_HWM); + reg = superio_inb(sioreg, SIO_REG_ENABLE); + if (reg != data->sio_enable) + superio_outb(sioreg, SIO_REG_ENABLE, data->sio_enable); + + if (data->kind == nct6791 || data->kind == nct6792) + nct6791_enable_io_mapping(sioreg); + + superio_exit(sioreg); /* Restore limits */ for (i = 0; i < data->in_num; i++) {