---
 drivers/hwmon/it87.c |   32 ++++++++++++++++++++++++++++----
 1 file changed, 28 insertions(+), 4 deletions(-)

Index: linux-3.12.24-rt38/drivers/hwmon/it87.c
===================================================================
--- linux-3.12.24-rt38.orig/drivers/hwmon/it87.c
+++ linux-3.12.24-rt38/drivers/hwmon/it87.c
@@ -18,6 +18,7 @@
  *            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
@@ -63,13 +64,17 @@
 
 #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 */
@@ -142,6 +147,7 @@ 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
@@ -285,6 +291,12 @@ 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
@@ -1697,7 +1709,7 @@ 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();
@@ -1705,7 +1717,11 @@ 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:
@@ -1730,6 +1746,9 @@ 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;
@@ -1756,6 +1775,11 @@ 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;