#include <linux/err.h>
#include <linux/mutex.h>
#include <linux/acpi.h>
+#include <linux/dmi.h>
#include <linux/io.h>
#include "lm75.h"
#include "compat.h"
u8 vbat;
u8 fandiv1;
u8 fandiv2;
+ u8 sio_enable;
#endif
};
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
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++) {