Commit 87b4b6634ac112ddfe7b92aae50eb4bf7b128d1a

Authored by Bjorn Helgaas
Committed by Mark M. Hoffman
1 parent d384e35a25

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>

Showing 1 changed file with 23 additions and 9 deletions Side-by-side Diff

drivers/hwmon/it87.c
... ... @@ -2,6 +2,14 @@
2 2 it87.c - Part of lm_sensors, Linux kernel modules for hardware
3 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 13 Supports: IT8705F Super I/O chip w/LPC interface
6 14 IT8712F Super I/O chip w/LPC interface
7 15 IT8716F Super I/O chip w/LPC interface
8 16  
... ... @@ -118,10 +126,16 @@
118 126 /* Length of ISA address segment */
119 127 #define IT87_EXTENT 8
120 128  
121   -/* Where are the ISA address/data registers relative to the base address */
122   -#define IT87_ADDR_REG_OFFSET 5
123   -#define IT87_DATA_REG_OFFSET 6
  129 +/* Length of ISA address segment for Environmental Controller */
  130 +#define IT87_EC_EXTENT 2
124 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
  138 +
125 139 /*----- The IT87 registers -----*/
126 140  
127 141 #define IT87_REG_CONFIG 0x00
128 142  
... ... @@ -968,10 +982,10 @@
968 982 };
969 983  
970 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 986 dev_err(dev, "Failed to request region 0x%lx-0x%lx\n",
973 987 (unsigned long)res->start,
974   - (unsigned long)(res->start + IT87_EXTENT - 1));
  988 + (unsigned long)(res->start + IT87_EC_EXTENT - 1));
975 989 err = -EBUSY;
976 990 goto ERROR0;
977 991 }
... ... @@ -1124,7 +1138,7 @@
1124 1138 platform_set_drvdata(pdev, NULL);
1125 1139 kfree(data);
1126 1140 ERROR1:
1127   - release_region(res->start, IT87_EXTENT);
  1141 + release_region(res->start, IT87_EC_EXTENT);
1128 1142 ERROR0:
1129 1143 return err;
1130 1144 }
... ... @@ -1137,7 +1151,7 @@
1137 1151 sysfs_remove_group(&pdev->dev.kobj, &it87_group);
1138 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 1155 platform_set_drvdata(pdev, NULL);
1142 1156 kfree(data);
1143 1157  
... ... @@ -1402,8 +1416,8 @@
1402 1416 const struct it87_sio_data *sio_data)
1403 1417 {
1404 1418 struct resource res = {
1405   - .start = address ,
1406   - .end = address + IT87_EXTENT - 1,
  1419 + .start = address + IT87_EC_OFFSET,
  1420 + .end = address + IT87_EC_OFFSET + IT87_EC_EXTENT - 1,
1407 1421 .name = DRVNAME,
1408 1422 .flags = IORESOURCE_IO,
1409 1423 };