hwmon: (w83781d) Fix I/O resource conflict with PNP

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 makes the request
(and thus the detection) fail.

This fixes lm-sensors ticket #2306:
http://www.lm-sensors.org/ticket/2306

Signed-off-by: Jean Delvare <khali@linux-fr.org>
Signed-off-by: Mark M. Hoffman <mhoffman@lightlink.com>

authored by Jean Delvare and committed by Mark M. Hoffman 2961cb22 05dda977

+16 -5
+16 -5
drivers/hwmon/w83781d.c
··· 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 } ··· 1416 1415 device_remove_file(&pdev->dev, &dev_attr_name); 1417 1416 kfree(data); 1418 1417 exit_release_region: 1419 - release_region(res->start, W83781D_EXTENT); 1418 + release_region(res->start + W83781D_ADDR_REG_OFFSET, 2); 1420 1419 exit: 1421 1420 return err; 1422 1421 } ··· 1430 1429 sysfs_remove_group(&pdev->dev.kobj, &w83781d_group); 1431 1430 sysfs_remove_group(&pdev->dev.kobj, &w83781d_group_opt); 1432 1431 device_remove_file(&pdev->dev, &dev_attr_name); 1433 - release_region(data->client.addr, W83781D_EXTENT); 1432 + release_region(data->client.addr + W83781D_ADDR_REG_OFFSET, 2); 1434 1433 kfree(data); 1435 1434 1436 1435 return 0; ··· 1798 1797 { 1799 1798 int val, save, found = 0; 1800 1799 1801 - if (!request_region(address, W83781D_EXTENT, "w83781d")) 1800 + /* We have to request the region in two parts because some 1801 + boards declare base+4 to base+7 as a PNP device */ 1802 + if (!request_region(address, 4, "w83781d")) { 1803 + pr_debug("w83781d: Failed to request low part of region\n"); 1802 1804 return 0; 1805 + } 1806 + if (!request_region(address + 4, 4, "w83781d")) { 1807 + pr_debug("w83781d: Failed to request high part of region\n"); 1808 + release_region(address, 4); 1809 + return 0; 1810 + } 1803 1811 1804 1812 #define REALLY_SLOW_IO 1805 1813 /* We need the timeouts for at least some W83781D-like ··· 1881 1871 val == 0x30 ? "W83782D" : "W83781D", (int)address); 1882 1872 1883 1873 release: 1884 - release_region(address, W83781D_EXTENT); 1874 + release_region(address + 4, 4); 1875 + release_region(address, 4); 1885 1876 return found; 1886 1877 } 1887 1878