Disabling configuration mode on some chips can result in system hang-ups and access failures to the Super-IO chip at the second SIO address. Never exit configuration mode on these chips to avoid the problem. This patch should be applied in conjunction with a previous one to initialise the second chip for certain mother boards. Signed-off-by: Frank Crawford <frank@xxxxxxxxxxxxxxxxxx> --- drivers/hwmon/it87.c | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/drivers/hwmon/it87.c b/drivers/hwmon/it87.c index a8a6a0ffee82..7049e81f5af1 100644 --- a/drivers/hwmon/it87.c +++ b/drivers/hwmon/it87.c @@ -128,10 +128,12 @@ static inline int superio_enter(int ioreg) return 0; } -static inline void superio_exit(int ioreg) +static inline void superio_exit(int ioreg, bool doexit) { - outb(0x02, ioreg); - outb(0x02, ioreg + 1); + if (doexit) { + outb(0x02, ioreg); + outb(0x02, ioreg + 1); + } release_region(ioreg, 2); } @@ -497,6 +499,7 @@ static const struct it87_devices it87_devices[] = { struct it87_sio_data { int sioaddr; enum chips type; + u8 doexit; /* Values read from Super-I/O config space */ u8 revision; u8 vid_value; @@ -523,6 +526,8 @@ struct it87_data { u8 peci_mask; u8 old_peci_mask; + bool doexit; /* true if exit from sio config is ok */ + unsigned short addr; const char *name; struct mutex update_lock; @@ -2405,6 +2410,7 @@ static int __init it87_find(int sioaddr, unsigned short *address, int err; u16 chip_type; const struct it87_devices *config; + bool doexit = true; err = superio_enter(sioaddr); if (err) @@ -2501,6 +2507,8 @@ static int __init it87_find(int sioaddr, unsigned short *address, goto exit; } + sio_data->doexit = doexit; + err = 0; sio_data->sioaddr = sioaddr; sio_data->revision = superio_inb(sioaddr, DEVREV) & 0x0f; @@ -2827,7 +2835,7 @@ static int __init it87_find(int sioaddr, unsigned short *address, sio_data->skip_pwm |= dmi_data->skip_pwm; exit: - superio_exit(sioaddr); + superio_exit(sioaddr, doexit); return err; } @@ -3061,6 +3069,7 @@ static int it87_probe(struct platform_device *pdev) data->addr = res->start; data->sioaddr = sio_data->sioaddr; data->type = sio_data->type; + data->doexit = sio_data->doexit; data->features = it87_devices[sio_data->type].features; data->peci_mask = it87_devices[sio_data->type].peci_mask; data->old_peci_mask = it87_devices[sio_data->type].old_peci_mask; @@ -3213,7 +3222,7 @@ static void it87_resume_sio(struct platform_device *pdev) reg2c); } - superio_exit(data->sioaddr); + superio_exit(data->sioaddr, data->doexit); } static int it87_resume(struct device *dev) -- 2.39.1