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

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
...@@ -6,6 +6,10 @@ Supported chips: ...@@ -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. ...@@ -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, ...@@ -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 IT8728F. It only supports 3 fans, 16-bit fan mode, and the full speed mode
fan is not supported (value 0 of pwmX_enable). 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.
......
...@@ -601,7 +601,7 @@ config SENSORS_IT87 ...@@ -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.
......
...@@ -11,6 +11,7 @@ ...@@ -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 @@ ...@@ -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) ...@@ -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[] = { ...@@ -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, ...@@ -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, ...@@ -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;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment