Commit 3ba9d977 authored by Guenter Roeck's avatar Guenter Roeck
Browse files

hwmon: (it87) Add support for IT8620E



IT8620E is mostly compatible to IT7828F. Add generic support for it.

IT8620E supports up to 6 fan tachometers and 6 pwm controls.
Support for the 6th tachometer and for the additional pwm controls
are addded in separate patches.

Reviewed-by: default avatarJean Delvare <jdelvare@suse.de>
Signed-off-by: default avatarGuenter Roeck <linux@roeck-us.net>
parent 4ee07157
Loading
Loading
Loading
Loading
+10 −3
Original line number Diff line number Diff line
@@ -6,6 +6,10 @@ Supported chips:
    Prefix: 'it8603'
    Addresses scanned: from Super I/O config space (8 I/O ports)
    Datasheet: Not publicly available
  * IT8620E
    Prefix: 'it8620'
    Addresses scanned: from Super I/O config space (8 I/O ports)
    Datasheet: Not publicly available
  * IT8705F
    Prefix: 'it87'
    Addresses scanned: from Super I/O config space (8 I/O ports)
@@ -106,7 +110,7 @@ motherboard models.
Description
-----------

This driver implements support for the IT8603E, IT8623E, IT8705F,
This driver implements support for the IT8603E, IT8620E, IT8623E, IT8705F,
IT8712F, IT8716F, IT8718F, IT8720F, IT8721F, IT8726F, IT8728F, IT8758E,
IT8771E, IT8772E, IT8781F, IT8782F, IT8783E/F, IT8786E, IT8790E, and SiS950
chips.
@@ -147,8 +151,11 @@ The IT8728F, IT8771E, and IT8772E are considered compatible with the IT8721F,
until a datasheet becomes available (hopefully.)

The IT8603E/IT8623E is a custom design, hardware monitoring part is similar to
IT8728F. It only supports 16-bit fan mode, the full speed mode of the
fan is not supported (value 0 of pwmX_enable).
IT8728F. It only supports 3 fans, 16-bit fan mode, and the full speed mode
of the fan is not supported (value 0 of pwmX_enable).

The IT8620E is another custom design, hardware monitoring part is similar to
IT8728F. It only supports 16-bit fan mode.

The IT8790E supports up to 3 fans. 16-bit fan mode is always enabled.

+1 −1
Original line number Diff line number Diff line
@@ -601,7 +601,7 @@ config SENSORS_IT87
	  If you say yes here you get support for ITE IT8705F, IT8712F,
	  IT8716F, IT8718F, IT8720F, IT8721F, IT8726F, IT8728F, IT8758E,
	  IT8771E, IT8772E, IT8781F, IT8782F, IT8783E/F, IT8786E, IT8790E,
	  IT8603E, and IT8623E sensor chips, and the SiS950 clone.
	  IT8603E, IT8620E, and IT8623E sensor chips, and the SiS950 clone.

	  This driver can also be built as a module.  If so, the module
	  will be called it87.
+42 −1
Original line number Diff line number Diff line
@@ -11,6 +11,7 @@
 *  similar parts.  The other devices are supported by different drivers.
 *
 *  Supports: IT8603E  Super I/O chip w/LPC interface
 *            IT8620E  Super I/O chip w/LPC interface
 *            IT8623E  Super I/O chip w/LPC interface
 *            IT8705F  Super I/O chip w/LPC interface
 *            IT8712F  Super I/O chip w/LPC interface
@@ -69,7 +70,7 @@
#define DRVNAME "it87"

enum chips { it87, it8712, it8716, it8718, it8720, it8721, it8728, it8771,
	     it8772, it8781, it8782, it8783, it8786, it8790, it8603 };
	     it8772, it8781, it8782, it8783, it8786, it8790, it8603, it8620 };

static unsigned short force_id;
module_param(force_id, ushort, 0);
@@ -155,12 +156,14 @@ static inline void superio_exit(void)
#define IT8786E_DEVID 0x8786
#define IT8790E_DEVID 0x8790
#define IT8603E_DEVID 0x8603
#define IT8620E_DEVID 0x8620
#define IT8623E_DEVID 0x8623
#define IT87_ACT_REG  0x30
#define IT87_BASE_REG 0x60

/* Logical device 7 registers (IT8712F and later) */
#define IT87_SIO_GPIO1_REG	0x25
#define IT87_SIO_GPIO2_REG	0x26
#define IT87_SIO_GPIO3_REG	0x27
#define IT87_SIO_GPIO5_REG	0x29
#define IT87_SIO_PINX1_REG	0x2a	/* Pin selection */
@@ -375,6 +378,14 @@ static const struct it87_devices it87_devices[] = {
		  | FEAT_TEMP_OFFSET | FEAT_TEMP_PECI | FEAT_IN7_INTERNAL,
		.peci_mask = 0x07,
	},
	[it8620] = {
		.name = "it8620",
		.suffix = "E",
		.features = FEAT_NEWER_AUTOPWM | FEAT_12MV_ADC | FEAT_16BIT_FANS
		  | FEAT_TEMP_OFFSET | FEAT_TEMP_PECI | FEAT_FIVE_FANS
		  | FEAT_IN7_INTERNAL,
		.peci_mask = 0x07,
	},
};

#define has_16bit_fans(data)	((data)->features & FEAT_16BIT_FANS)
@@ -1850,6 +1861,9 @@ static int __init it87_find(unsigned short *address,
	case IT8623E_DEVID:
		sio_data->type = it8603;
		break;
	case IT8620E_DEVID:
		sio_data->type = it8620;
		break;
	case 0xffff:	/* No device at all */
		goto exit;
	default:
@@ -1984,6 +1998,33 @@ static int __init it87_find(unsigned short *address,

		sio_data->internal |= (1 << 3); /* in9 is AVCC */

		sio_data->beep_pin = superio_inb(IT87_SIO_BEEP_PIN_REG) & 0x3f;
	} else if (sio_data->type == it8620) {
		int reg;

		superio_select(GPIO);

		/* Check for fan4, fan5 */
		reg = superio_inb(IT87_SIO_GPIO2_REG);
		if (!(reg & (1 << 5)))
			sio_data->skip_fan |= (1 << 3);
		if (!(reg & (1 << 4)))
			sio_data->skip_fan |= (1 << 4);

		/* Check for pwm3, fan3 */
		reg = superio_inb(IT87_SIO_GPIO3_REG);
		if (reg & (1 << 6))
			sio_data->skip_pwm |= (1 << 2);
		if (reg & (1 << 7))
			sio_data->skip_fan |= (1 << 2);

		/* Check for pwm2, fan2 */
		reg = superio_inb(IT87_SIO_GPIO5_REG);
		if (reg & (1 << 1))
			sio_data->skip_pwm |= (1 << 1);
		if (reg & (1 << 2))
			sio_data->skip_fan |= (1 << 1);

		sio_data->beep_pin = superio_inb(IT87_SIO_BEEP_PIN_REG) & 0x3f;
	} else {
		int reg;