aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/hwmon/it87.c
diff options
context:
space:
mode:
authorBjorn Helgaas <bjorn.helgaas@hp.com>2008-01-22 07:21:03 -0500
committerMark M. Hoffman <mhoffman@lightlink.com>2008-01-22 07:21:38 -0500
commit87b4b6634ac112ddfe7b92aae50eb4bf7b128d1a (patch)
tree3e7e5e671a9f0e6c997d98188336405d356e5aa6 /drivers/hwmon/it87.c
parentd384e35a25445bb60457b7dab8cffe178c6b7ecb (diff)
hwmon: (it87) request only Environment Controller ports
The IT8705F and related parts are Super I/O controllers that contain many separate devices. Some BIOSes describe IT8705F I/O port usage under a motherboard device (PNP0C02) with overlapping regions, e.g., 0x290-0x29f and 0x290-0x294. The it87 driver supports only the Environment Controller, which requires only two ISA ports, but it used to request an eight-port range. If that range exceeds a range reported by the BIOS, as 0x290-0x297 would, the request fails, and the it87 driver cannot claim the device. This patch makes the it87 driver request only the two ports used for the Environment Controller device. Systems where this problem has been reported: Gigabyte GA-K8N Ultra 9 Gigabyte M56S-S3 Gigabyte GA-965G-DS3 Kernel bug reports: http://bugzilla.kernel.org/show_bug.cgi?id=9514 http://lkml.org/lkml/2007/12/4/466 Related change: http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commitdiff;h=a7839e960675b549f06209d18283d5cee2ce9261 The patch above increases the number of PNP port resources we support. Prior to this patch, we ignored some port resources, which masked the it87 problem. Signed-off-by: Bjorn Helgaas <bjorn.helgaas@hp.com> Signed-off-by: Mark M. Hoffman <mhoffman@lightlink.com>
Diffstat (limited to 'drivers/hwmon/it87.c')
-rw-r--r--drivers/hwmon/it87.c32
1 files changed, 23 insertions, 9 deletions
diff --git a/drivers/hwmon/it87.c b/drivers/hwmon/it87.c
index 6a182e14cf58..ad6c8a319903 100644
--- a/drivers/hwmon/it87.c
+++ b/drivers/hwmon/it87.c
@@ -2,6 +2,14 @@
2 it87.c - Part of lm_sensors, Linux kernel modules for hardware 2 it87.c - Part of lm_sensors, Linux kernel modules for hardware
3 monitoring. 3 monitoring.
4 4
5 The IT8705F is an LPC-based Super I/O part that contains UARTs, a
6 parallel port, an IR port, a MIDI port, a floppy controller, etc., in
7 addition to an Environment Controller (Enhanced Hardware Monitor and
8 Fan Controller)
9
10 This driver supports only the Environment Controller in the IT8705F and
11 similar parts. The other devices are supported by different drivers.
12
5 Supports: IT8705F Super I/O chip w/LPC interface 13 Supports: IT8705F Super I/O chip w/LPC interface
6 IT8712F Super I/O chip w/LPC interface 14 IT8712F Super I/O chip w/LPC interface
7 IT8716F Super I/O chip w/LPC interface 15 IT8716F Super I/O chip w/LPC interface
@@ -118,9 +126,15 @@ static int fix_pwm_polarity;
118/* Length of ISA address segment */ 126/* Length of ISA address segment */
119#define IT87_EXTENT 8 127#define IT87_EXTENT 8
120 128
121/* Where are the ISA address/data registers relative to the base address */ 129/* Length of ISA address segment for Environmental Controller */
122#define IT87_ADDR_REG_OFFSET 5 130#define IT87_EC_EXTENT 2
123#define IT87_DATA_REG_OFFSET 6 131
132/* Offset of EC registers from ISA base address */
133#define IT87_EC_OFFSET 5
134
135/* Where are the ISA address/data registers relative to the EC base address */
136#define IT87_ADDR_REG_OFFSET 0
137#define IT87_DATA_REG_OFFSET 1
124 138
125/*----- The IT87 registers -----*/ 139/*----- The IT87 registers -----*/
126 140
@@ -968,10 +982,10 @@ static int __devinit it87_probe(struct platform_device *pdev)
968 }; 982 };
969 983
970 res = platform_get_resource(pdev, IORESOURCE_IO, 0); 984 res = platform_get_resource(pdev, IORESOURCE_IO, 0);
971 if (!request_region(res->start, IT87_EXTENT, DRVNAME)) { 985 if (!request_region(res->start, IT87_EC_EXTENT, DRVNAME)) {
972 dev_err(dev, "Failed to request region 0x%lx-0x%lx\n", 986 dev_err(dev, "Failed to request region 0x%lx-0x%lx\n",
973 (unsigned long)res->start, 987 (unsigned long)res->start,
974 (unsigned long)(res->start + IT87_EXTENT - 1)); 988 (unsigned long)(res->start + IT87_EC_EXTENT - 1));
975 err = -EBUSY; 989 err = -EBUSY;
976 goto ERROR0; 990 goto ERROR0;
977 } 991 }
@@ -1124,7 +1138,7 @@ ERROR2:
1124 platform_set_drvdata(pdev, NULL); 1138 platform_set_drvdata(pdev, NULL);
1125 kfree(data); 1139 kfree(data);
1126ERROR1: 1140ERROR1:
1127 release_region(res->start, IT87_EXTENT); 1141 release_region(res->start, IT87_EC_EXTENT);
1128ERROR0: 1142ERROR0:
1129 return err; 1143 return err;
1130} 1144}
@@ -1137,7 +1151,7 @@ static int __devexit it87_remove(struct platform_device *pdev)
1137 sysfs_remove_group(&pdev->dev.kobj, &it87_group); 1151 sysfs_remove_group(&pdev->dev.kobj, &it87_group);
1138 sysfs_remove_group(&pdev->dev.kobj, &it87_group_opt); 1152 sysfs_remove_group(&pdev->dev.kobj, &it87_group_opt);
1139 1153
1140 release_region(data->addr, IT87_EXTENT); 1154 release_region(data->addr, IT87_EC_EXTENT);
1141 platform_set_drvdata(pdev, NULL); 1155 platform_set_drvdata(pdev, NULL);
1142 kfree(data); 1156 kfree(data);
1143 1157
@@ -1402,8 +1416,8 @@ static int __init it87_device_add(unsigned short address,
1402 const struct it87_sio_data *sio_data) 1416 const struct it87_sio_data *sio_data)
1403{ 1417{
1404 struct resource res = { 1418 struct resource res = {
1405 .start = address , 1419 .start = address + IT87_EC_OFFSET,
1406 .end = address + IT87_EXTENT - 1, 1420 .end = address + IT87_EC_OFFSET + IT87_EC_EXTENT - 1,
1407 .name = DRVNAME, 1421 .name = DRVNAME,
1408 .flags = IORESOURCE_IO, 1422 .flags = IORESOURCE_IO,
1409 }; 1423 };