| From 95b0fdbe6a8400944da748845857de35a59b90e2 Mon Sep 17 00:00:00 2001 |
| From: Guenter Roeck <linux@roeck-us.net> |
| Date: Sun, 12 Mar 2017 06:18:58 -0700 |
| Subject: [PATCH] hwmon: (it87) Avoid registering the same chip on both SIO |
| addresses |
| |
| commit 8358378b22518d92424597503d3c1cd302a490b6 upstream. |
| |
| IT8705F is known to respond on both SIO addresses. Registering it twice |
| may result in system lockups. |
| |
| Reported-by: Russell King <linux@armlinux.org.uk> |
| Fixes: e84bd9535e2b ("hwmon: (it87) Add support for second Super-IO chip") |
| Signed-off-by: Guenter Roeck <linux@roeck-us.net> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/drivers/hwmon/it87.c b/drivers/hwmon/it87.c |
| index 3e64105aa5d0..b5d796f7f135 100644 |
| --- a/drivers/hwmon/it87.c |
| +++ b/drivers/hwmon/it87.c |
| @@ -3115,7 +3115,7 @@ static int __init sm_it87_init(void) |
| { |
| int sioaddr[2] = { REG_2E, REG_4E }; |
| struct it87_sio_data sio_data; |
| - unsigned short isa_address; |
| + unsigned short isa_address[2]; |
| bool found = false; |
| int i, err; |
| |
| @@ -3125,15 +3125,29 @@ static int __init sm_it87_init(void) |
| |
| for (i = 0; i < ARRAY_SIZE(sioaddr); i++) { |
| memset(&sio_data, 0, sizeof(struct it87_sio_data)); |
| - isa_address = 0; |
| - err = it87_find(sioaddr[i], &isa_address, &sio_data); |
| - if (err || isa_address == 0) |
| + isa_address[i] = 0; |
| + err = it87_find(sioaddr[i], &isa_address[i], &sio_data); |
| + if (err || isa_address[i] == 0) |
| continue; |
| + /* |
| + * Don't register second chip if its ISA address matches |
| + * the first chip's ISA address. |
| + */ |
| + if (i && isa_address[i] == isa_address[0]) |
| + break; |
| |
| - err = it87_device_add(i, isa_address, &sio_data); |
| + err = it87_device_add(i, isa_address[i], &sio_data); |
| if (err) |
| goto exit_dev_unregister; |
| + |
| found = true; |
| + |
| + /* |
| + * IT8705F may respond on both SIO addresses. |
| + * Stop probing after finding one. |
| + */ |
| + if (sio_data.type == it87) |
| + break; |
| } |
| |
| if (!found) { |
| -- |
| 2.12.0 |
| |