--- drivers/hwmon/it87.c | 32 ++++++++++++++++++++++++++++---- 1 file changed, 28 insertions(+), 4 deletions(-) Index: linux-3.12.13-rt21/drivers/hwmon/it87.c =================================================================== @ linux-3.12.13-rt21/drivers/hwmon/it87.c:21 @ * IT8721F Super I/O chip w/LPC interface * IT8726F Super I/O chip w/LPC interface * IT8728F Super I/O chip w/LPC interface + * IT8739F Super I/O chip w/LPC interface * IT8758E Super I/O chip w/LPC interface * IT8771E Super I/O chip w/LPC interface * IT8772E Super I/O chip w/LPC interface @ linux-3.12.13-rt21/drivers/hwmon/it87.c:67 @ #define DRVNAME "it87" -enum chips { it87, it8712, it8716, it8718, it8720, it8721, it8728, it8771, - it8772, it8782, it8783 }; +enum chips { it87, it8712, it8716, it8718, it8720, it8721, it8728, it8739, + it8771, it8772, it8782, it8783 }; static unsigned short force_id; module_param(force_id, ushort, 0); MODULE_PARM_DESC(force_id, "Override the detected device ID"); +static unsigned short force_address; +module_param(force_address, ushort, 0); +MODULE_PARM_DESC(force_address, "Override the device address"); + static struct platform_device *pdev; #define REG 0x2e /* The register to read/write */ @ linux-3.12.13-rt21/drivers/hwmon/it87.c:150 @ static inline void superio_exit(void) #define IT8721F_DEVID 0x8721 #define IT8726F_DEVID 0x8726 #define IT8728F_DEVID 0x8728 +#define IT8739F_DEVID 0x8739 #define IT8771E_DEVID 0x8771 #define IT8772E_DEVID 0x8772 #define IT8782F_DEVID 0x8782 @ linux-3.12.13-rt21/drivers/hwmon/it87.c:294 @ static const struct it87_devices it87_de | FEAT_TEMP_OFFSET | FEAT_TEMP_PECI, .peci_mask = 0x07, }, + [it8739] = { + .name = "it8739", + .features = FEAT_NEWER_AUTOPWM | FEAT_12MV_ADC | FEAT_16BIT_FANS + | FEAT_TEMP_OFFSET | FEAT_TEMP_PECI, + .peci_mask = 0x07, + }, [it8771] = { .name = "it8771", .features = FEAT_NEWER_AUTOPWM | FEAT_12MV_ADC | FEAT_16BIT_FANS @ linux-3.12.13-rt21/drivers/hwmon/it87.c:1712 @ static int __init it87_find(unsigned sho struct it87_sio_data *sio_data) { int err; - u16 chip_type; + u16 chip_type, found_id; const char *board_vendor, *board_name; err = superio_enter(); @ linux-3.12.13-rt21/drivers/hwmon/it87.c:1720 @ static int __init it87_find(unsigned sho return err; err = -ENODEV; - chip_type = force_id ? force_id : superio_inw(DEVID); + found_id = superio_inw(DEVID); + chip_type = force_id ? force_id : found_id; + if (force_id != found_id) + pr_info("Found IT%04xF chip, forced to assume IT%04xF chip\n", + found_id, force_id); switch (chip_type) { case IT8705F_DEVID: @ linux-3.12.13-rt21/drivers/hwmon/it87.c:1749 @ static int __init it87_find(unsigned sho case IT8728F_DEVID: sio_data->type = it8728; break; + case IT8739F_DEVID: + sio_data->type = it8739; + break; case IT8771E_DEVID: sio_data->type = it8771; break; @ linux-3.12.13-rt21/drivers/hwmon/it87.c:1778 @ static int __init it87_find(unsigned sho } *address = superio_inw(IT87_BASE_REG) & ~(IT87_EXTENT - 1); + if (*address != force_address) { + pr_info("Using forced chip address 0x%x instead of 0x%x\n", + force_address, *address); + *address = force_address; + } if (*address == 0) { pr_info("Base address not set, skipping\n"); goto exit;