]> git.sur5r.net Git - groeck-it87/commitdiff
Add support for IT8781F
authorGuenter Roeck <linux@roeck-us.net>
Thu, 12 Feb 2015 18:40:02 +0000 (10:40 -0800)
committerGuenter Roeck <linux@roeck-us.net>
Thu, 12 Feb 2015 18:40:02 +0000 (10:40 -0800)
IT8781F is mostly compatible to IT8782F. Major difference is that it only
supports four instead of six UART channels, and therefore does not share
the uart6 pins.

Signed-off-by: Guenter Roeck <linux@roeck-us.net>
README
it87.c

diff --git a/README b/README
index 62110550dd66b6e44cbcd1a1d897535cf4e24cf9..598fd0b8fdb94121bc2cbda7677d12996e2ed6b4 100644 (file)
--- a/README
+++ b/README
@@ -30,6 +30,10 @@ Supported chips:
     Prefix: 'it8728'
     Addresses scanned: from Super I/O config space (8 I/O ports)
     Datasheet: Not publicly available
+  * IT8781F
+    Prefix: 'it8781'
+    Addresses scanned: from Super I/O config space (8 I/O ports)
+    Datasheet: Not publicly available
   * IT8782F
     Prefix: 'it8782'
     Addresses scanned: from Super I/O config space (8 I/O ports)
diff --git a/it87.c b/it87.c
index 125d15889d5169d66560c93ff9fae9487d04d933..a90628a4be9e96d50bb6ea73a2cf5f73bf562507 100644 (file)
--- a/it87.c
+++ b/it87.c
@@ -23,6 +23,7 @@
  *            IT8758E  Super I/O chip w/LPC interface
  *            IT8771E  Super I/O chip w/LPC interface
  *            IT8772E  Super I/O chip w/LPC interface
+ *            IT8781F  Super I/O chip w/LPC interface
  *            IT8782F  Super I/O chip w/LPC interface
  *            IT8783E/F Super I/O chip w/LPC interface
  *            Sis950   A clone of the IT8705F
@@ -67,7 +68,7 @@
 #define DRVNAME "it87"
 
 enum chips { it87, it8712, it8716, it8718, it8720, it8721, it8728, it8771,
-            it8772, it8782, it8783, it8603 };
+            it8772, it8781, it8782, it8783, it8603 };
 
 static unsigned short force_id;
 module_param(force_id, ushort, 0);
@@ -147,6 +148,7 @@ static inline void superio_exit(void)
 #define IT8728F_DEVID 0x8728
 #define IT8771E_DEVID 0x8771
 #define IT8772E_DEVID 0x8772
+#define IT8781F_DEVID 0x8781
 #define IT8782F_DEVID 0x8782
 #define IT8783E_DEVID 0x8783
 #define IT8603E_DEVID 0x8603
@@ -308,6 +310,12 @@ static const struct it87_devices it87_devices[] = {
                                        /* 16 bit fans (HWSensors4, OHM) */
                .peci_mask = 0x07,
        },
+       [it8781] = {
+               .name = "it8781",
+               .features = FEAT_16BIT_FANS | FEAT_TEMP_OFFSET
+                 | FEAT_TEMP_OLD_PECI,
+               .old_peci_mask = 0x4,
+       },
        [it8782] = {
                .name = "it8782",
                .features = FEAT_16BIT_FANS | FEAT_TEMP_OFFSET
@@ -1762,6 +1770,9 @@ static int __init it87_find(unsigned short *address,
        case IT8772E_DEVID:
                sio_data->type = it8772;
                break;
+       case IT8781F_DEVID:
+               sio_data->type = it8781;
+               break;
        case IT8782F_DEVID:
                sio_data->type = it8782;
                break;
@@ -1920,10 +1931,11 @@ static int __init it87_find(unsigned short *address,
                reg = superio_inb(IT87_SIO_GPIO3_REG);
                if (sio_data->type == it8721 || sio_data->type == it8728 ||
                    sio_data->type == it8771 || sio_data->type == it8772 ||
-                   sio_data->type == it8782) {
+                   sio_data->type == it8781 || sio_data->type == it8782) {
                        /*
-                        * IT8721F/IT8758E, and IT8782F don't have VID pins
-                        * at all, not sure about the IT8728F and compatibles.
+                        * IT8721F/IT8758E, IT8728F, IT8772F, IT8781F, and
+                        * IT8782F don't have VID pins at all, not sure about
+                        * the IT8771F.
                         */
                        sio_data->skip_vid = 1;
                } else {
@@ -2148,7 +2160,8 @@ static int it87_probe(struct platform_device *pdev)
                        data->in_scaled |= (1 << 8);    /* in8 is Vbat */
                if (sio_data->internal & (1 << 3))
                        data->in_scaled |= (1 << 9);    /* in9 is AVCC */
-       } else if (sio_data->type == it8782 || sio_data->type == it8783) {
+       } else if (sio_data->type == it8781 || sio_data->type == it8782 ||
+                  sio_data->type == it8783) {
                if (sio_data->internal & (1 << 0))
                        data->in_scaled |= (1 << 3);    /* in3 is VCC5V */
                if (sio_data->internal & (1 << 1))
@@ -2461,9 +2474,12 @@ static void it87_init_device(struct platform_device *pdev)
                        it87_write_value(data, IT87_REG_FAN_16BIT,
                                         tmp | 0x07);
                }
-               /* IT8705F, IT8782F, and IT8783E/F only support three fans. */
-               if (data->type != it87 && data->type != it8782 &&
-                   data->type != it8783) {
+               /*
+                * IT8705F, IT8781F, IT8782F, and IT8783E/F only support
+                * three fans.
+                */
+               if (data->type != it87 && data->type != it8781 &&
+                   data->type != it8782 && data->type != it8783) {
                        if (tmp & (1 << 4))
                                data->has_fan |= (1 << 3); /* fan4 enabled */
                        if (tmp & (1 << 5))