@@ -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)
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@crawford.emu.id.au> --- drivers/hwmon/it87.c | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-)