Commit 91749996 authored by Jean Delvare's avatar Jean Delvare Committed by Greg Kroah-Hartman
Browse files

[PATCH] hwmon: Drop legacy ISA address support from it87



Drop legacy ISA address support from the it87 driver. All supported
chips are Super-I/O chips, so the device ISA address can be safely read
from Super-I/O space rather than blindly assumed.

Two nearby inaccurate documentation statements have been fixed as well:
* The IT8705F doesn't have an SMBus interface.
* The SiS950 doesn't have a distinct prefix.

Signed-off-by: default avatarJean Delvare <khali@linux-fr.org>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent 80ce3b7d
Loading
Loading
Loading
Loading
+4 −4
Original line number Diff line number Diff line
@@ -4,18 +4,18 @@ Kernel driver it87
Supported chips:
  * IT8705F
    Prefix: 'it87'
    Addresses scanned: from Super I/O config space, or default ISA 0x290 (8 I/O ports)
    Addresses scanned: from Super I/O config space (8 I/O ports)
    Datasheet: Publicly available at the ITE website
               http://www.ite.com.tw/
  * IT8712F
    Prefix: 'it8712'
    Addresses scanned: I2C 0x28 - 0x2f
                       from Super I/O config space, or default ISA 0x290 (8 I/O ports)
                       from Super I/O config space (8 I/O ports)
    Datasheet: Publicly available at the ITE website
               http://www.ite.com.tw/
  * SiS950   [clone of IT8705F]
    Prefix: 'sis950'
    Addresses scanned: from Super I/O config space, or default ISA 0x290 (8 I/O ports)
    Prefix: 'it87'
    Addresses scanned: from Super I/O config space (8 I/O ports)
    Datasheet: No longer be available

Author: Christophe Gauthron <chrisg@0-in.com>
+11 −40
Original line number Diff line number Diff line
@@ -2,7 +2,7 @@
    it87.c - Part of lm_sensors, Linux kernel modules for hardware
             monitoring.

    Supports: IT8705F  Super I/O chip w/LPC interface & SMBus
    Supports: IT8705F  Super I/O chip w/LPC interface
              IT8712F  Super I/O chip w/LPC interface & SMBus
              Sis950   A clone of the IT8705F

@@ -47,7 +47,7 @@
/* Addresses to scan */
static unsigned short normal_i2c[] = { 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d,
					0x2e, 0x2f, I2C_CLIENT_END };
static unsigned short isa_address = 0x290;
static unsigned short isa_address;

/* Insmod parameters */
I2C_CLIENT_INSMOD_2(it87, it8712);
@@ -706,7 +706,7 @@ static int it87_isa_attach_adapter(struct i2c_adapter *adapter)
}

/* SuperIO detection - will change isa_address if a chip is found */
static int __init it87_find(int *address)
static int __init it87_find(unsigned short *address)
{
	int err = -ENODEV;

@@ -757,34 +757,7 @@ int it87_detect(struct i2c_adapter *adapter, int address, int kind)
		if (!request_region(address, IT87_EXTENT, it87_isa_driver.name))
			goto ERROR0;

	/* Probe whether there is anything available on this address. Already
	   done for SMBus and Super-I/O clients */
	if (kind < 0) {
		if (is_isa && !chip_type) {
#define REALLY_SLOW_IO
			/* We need the timeouts for at least some IT87-like chips. But only
			   if we read 'undefined' registers. */
			i = inb_p(address + 1);
			if (inb_p(address + 2) != i
			 || inb_p(address + 3) != i
			 || inb_p(address + 7) != i) {
		 		err = -ENODEV;
				goto ERROR1;
			}
#undef REALLY_SLOW_IO

			/* Let's just hope nothing breaks here */
			i = inb_p(address + 5) & 0x7f;
			outb_p(~i & 0x7f, address + 5);
			if ((inb_p(address + 5) & 0x7f) != (~i & 0x7f)) {
				outb_p(i, address + 5);
				err = -ENODEV;
				goto ERROR1;
			}
		}
	}

	/* OK. For now, we presume we have a valid client. We now create the
	/* For now, we presume we have a valid client. We create the
	   client structure, even though we cannot fill it completely yet.
	   But it allows us to access it87_{read,write}_value. */

@@ -1182,21 +1155,19 @@ static struct it87_data *it87_update_device(struct device *dev)

static int __init sm_it87_init(void)
{
	int addr, res;

	if (!it87_find(&addr)) {
		isa_address = addr;
	}
	int res;

	res = i2c_add_driver(&it87_driver);
	if (res)
		return res;

	if (!it87_find(&isa_address)) {
		res = i2c_isa_add_driver(&it87_isa_driver);
		if (res) {
			i2c_del_driver(&it87_driver);
			return res;
		}
	}

	return 0;
}