Only request I/O ports 0x295-0x296 instead of the full I/O address
range. This solves a conflict with PNP resources on a few motherboards.
Also request the I/O ports in two parts (4 low ports, 4 high ports)
during device detection, otherwise the PNP resource make the request
(and thus the detection) fail.
Signed-off-by: Jean Delvare <khali@linux-fr.org>
---
drivers/hwmon/w83781d.c | 21 ++++++++++++++++-----
1 file changed, 16 insertions(+), 5 deletions(-)
|
old
|
new
|
|
| 1367 | 1367 | |
| 1368 | 1368 | /* Reserve the ISA region */ |
| 1369 | 1369 | res = platform_get_resource(pdev, IORESOURCE_IO, 0); |
| 1370 | | if (!request_region(res->start, W83781D_EXTENT, "w83781d")) { |
| | 1370 | if (!request_region(res->start + W83781D_ADDR_REG_OFFSET, 2, |
| | 1371 | "w83781d")) { |
| 1371 | 1372 | err = -EBUSY; |
| 1372 | 1373 | goto exit; |
| 1373 | 1374 | } |
| … |
… |
|
| 1415 | 1416 | device_remove_file(&pdev->dev, &dev_attr_name); |
| 1416 | 1417 | kfree(data); |
| 1417 | 1418 | exit_release_region: |
| 1418 | | release_region(res->start, W83781D_EXTENT); |
| | 1419 | release_region(res->start + W83781D_ADDR_REG_OFFSET, 2); |
| 1419 | 1420 | exit: |
| 1420 | 1421 | return err; |
| 1421 | 1422 | } |
| … |
… |
|
| 1429 | 1430 | sysfs_remove_group(&pdev->dev.kobj, &w83781d_group); |
| 1430 | 1431 | sysfs_remove_group(&pdev->dev.kobj, &w83781d_group_opt); |
| 1431 | 1432 | device_remove_file(&pdev->dev, &dev_attr_name); |
| 1432 | | release_region(data->client.addr, W83781D_EXTENT); |
| | 1433 | release_region(data->client.addr + W83781D_ADDR_REG_OFFSET, 2); |
| 1433 | 1434 | kfree(data); |
| 1434 | 1435 | |
| 1435 | 1436 | return 0; |
| … |
… |
|
| 1797 | 1798 | { |
| 1798 | 1799 | int val, save, found = 0; |
| 1799 | 1800 | |
| 1800 | | if (!request_region(address, W83781D_EXTENT, "w83781d")) |
| | 1801 | /* We have to request the region in two parts because some |
| | 1802 | boards declare base+4 to base+7 as a PNP device */ |
| | 1803 | if (!request_region(address, 4, "w83781d")) { |
| | 1804 | pr_debug("w83781d: Failed to request low part of region\n"); |
| 1801 | 1805 | return 0; |
| | 1806 | } |
| | 1807 | if (!request_region(address + 4, 4, "w83781d")) { |
| | 1808 | pr_debug("w83781d: Failed to request high part of region\n"); |
| | 1809 | release_region(address, 4); |
| | 1810 | return 0; |
| | 1811 | } |
| 1802 | 1812 | |
| 1803 | 1813 | #define REALLY_SLOW_IO |
| 1804 | 1814 | /* We need the timeouts for at least some W83781D-like |
| … |
… |
|
| 1871 | 1881 | val == 0x30 ? "W83782D" : "W83781D", (int)address); |
| 1872 | 1882 | |
| 1873 | 1883 | release: |
| 1874 | | release_region(address, W83781D_EXTENT); |
| | 1884 | release_region(address, 4); |
| | 1885 | release_region(address + 4, 4); |
| 1875 | 1886 | return found; |
| 1876 | 1887 | } |
| 1877 | 1888 | |