Browse Source

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: Jean Delvare <jdelvare@suse.de>
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
Guenter Roeck 10 years ago
parent
commit
3ba9d977a9
3 changed files with 53 additions and 5 deletions
  1. 10 3
      Documentation/hwmon/it87
  2. 1 1
      drivers/hwmon/Kconfig
  3. 42 1
      drivers/hwmon/it87.c

+ 10 - 3
Documentation/hwmon/it87

@@ -6,6 +6,10 @@ Supported chips:
     Prefix: 'it8603'
     Prefix: 'it8603'
     Addresses scanned: from Super I/O config space (8 I/O ports)
     Addresses scanned: from Super I/O config space (8 I/O ports)
     Datasheet: Not publicly available
     Datasheet: Not publicly available
+  * IT8620E
+    Prefix: 'it8620'
+    Addresses scanned: from Super I/O config space (8 I/O ports)
+    Datasheet: Not publicly available
   * IT8705F
   * IT8705F
     Prefix: 'it87'
     Prefix: 'it87'
     Addresses scanned: from Super I/O config space (8 I/O ports)
     Addresses scanned: from Super I/O config space (8 I/O ports)
@@ -106,7 +110,7 @@ motherboard models.
 Description
 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,
 IT8712F, IT8716F, IT8718F, IT8720F, IT8721F, IT8726F, IT8728F, IT8758E,
 IT8771E, IT8772E, IT8781F, IT8782F, IT8783E/F, IT8786E, IT8790E, and SiS950
 IT8771E, IT8772E, IT8781F, IT8782F, IT8783E/F, IT8786E, IT8790E, and SiS950
 chips.
 chips.
@@ -147,8 +151,11 @@ The IT8728F, IT8771E, and IT8772E are considered compatible with the IT8721F,
 until a datasheet becomes available (hopefully.)
 until a datasheet becomes available (hopefully.)
 
 
 The IT8603E/IT8623E is a custom design, hardware monitoring part is similar to
 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.
 The IT8790E supports up to 3 fans. 16-bit fan mode is always enabled.
 
 

+ 1 - 1
drivers/hwmon/Kconfig

@@ -601,7 +601,7 @@ config SENSORS_IT87
 	  If you say yes here you get support for ITE IT8705F, IT8712F,
 	  If you say yes here you get support for ITE IT8705F, IT8712F,
 	  IT8716F, IT8718F, IT8720F, IT8721F, IT8726F, IT8728F, IT8758E,
 	  IT8716F, IT8718F, IT8720F, IT8721F, IT8726F, IT8728F, IT8758E,
 	  IT8771E, IT8772E, IT8781F, IT8782F, IT8783E/F, IT8786E, IT8790E,
 	  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
 	  This driver can also be built as a module.  If so, the module
 	  will be called it87.
 	  will be called it87.

+ 42 - 1
drivers/hwmon/it87.c

@@ -11,6 +11,7 @@
  *  similar parts.  The other devices are supported by different drivers.
  *  similar parts.  The other devices are supported by different drivers.
  *
  *
  *  Supports: IT8603E  Super I/O chip w/LPC interface
  *  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
  *            IT8623E  Super I/O chip w/LPC interface
  *            IT8705F  Super I/O chip w/LPC interface
  *            IT8705F  Super I/O chip w/LPC interface
  *            IT8712F  Super I/O chip w/LPC interface
  *            IT8712F  Super I/O chip w/LPC interface
@@ -69,7 +70,7 @@
 #define DRVNAME "it87"
 #define DRVNAME "it87"
 
 
 enum chips { it87, it8712, it8716, it8718, it8720, it8721, it8728, it8771,
 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;
 static unsigned short force_id;
 module_param(force_id, ushort, 0);
 module_param(force_id, ushort, 0);
@@ -155,12 +156,14 @@ static inline void superio_exit(void)
 #define IT8786E_DEVID 0x8786
 #define IT8786E_DEVID 0x8786
 #define IT8790E_DEVID 0x8790
 #define IT8790E_DEVID 0x8790
 #define IT8603E_DEVID 0x8603
 #define IT8603E_DEVID 0x8603
+#define IT8620E_DEVID 0x8620
 #define IT8623E_DEVID 0x8623
 #define IT8623E_DEVID 0x8623
 #define IT87_ACT_REG  0x30
 #define IT87_ACT_REG  0x30
 #define IT87_BASE_REG 0x60
 #define IT87_BASE_REG 0x60
 
 
 /* Logical device 7 registers (IT8712F and later) */
 /* Logical device 7 registers (IT8712F and later) */
 #define IT87_SIO_GPIO1_REG	0x25
 #define IT87_SIO_GPIO1_REG	0x25
+#define IT87_SIO_GPIO2_REG	0x26
 #define IT87_SIO_GPIO3_REG	0x27
 #define IT87_SIO_GPIO3_REG	0x27
 #define IT87_SIO_GPIO5_REG	0x29
 #define IT87_SIO_GPIO5_REG	0x29
 #define IT87_SIO_PINX1_REG	0x2a	/* Pin selection */
 #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,
 		  | FEAT_TEMP_OFFSET | FEAT_TEMP_PECI | FEAT_IN7_INTERNAL,
 		.peci_mask = 0x07,
 		.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)
 #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:
 	case IT8623E_DEVID:
 		sio_data->type = it8603;
 		sio_data->type = it8603;
 		break;
 		break;
+	case IT8620E_DEVID:
+		sio_data->type = it8620;
+		break;
 	case 0xffff:	/* No device at all */
 	case 0xffff:	/* No device at all */
 		goto exit;
 		goto exit;
 	default:
 	default:
@@ -1984,6 +1998,33 @@ static int __init it87_find(unsigned short *address,
 
 
 		sio_data->internal |= (1 << 3); /* in9 is AVCC */
 		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;
 		sio_data->beep_pin = superio_inb(IT87_SIO_BEEP_PIN_REG) & 0x3f;
 	} else {
 	} else {
 		int reg;
 		int reg;