]> git.sur5r.net Git - groeck-it87/blobdiff - it87.c
Fix FAN_TAC5 detection for IT8665E
[groeck-it87] / it87.c
diff --git a/it87.c b/it87.c
index 50489971715ec2cfaf3f5d8296c90c5c4d6095d3..87ee0882127e81190ea36764747da002162e6bf0 100644 (file)
--- a/it87.c
+++ b/it87.c
@@ -74,6 +74,7 @@
 #include <linux/acpi.h>
 #include <linux/io.h>
 #include "compat.h"
+#include "version.h"
 
 #define DRVNAME "it87"
 
@@ -723,7 +724,6 @@ struct it87_data {
        const struct attribute_group *groups[7];
        enum chips type;
        u32 features;
-       u8 bank;
        u8 peci_mask;
        u8 old_peci_mask;
 
@@ -754,6 +754,7 @@ struct it87_data {
        s8 temp[NUM_TEMP][4];   /* [nr][0]=temp, [1]=min, [2]=max, [3]=offset */
        u8 num_temp_limit;      /* Number of temperature limit registers */
        u8 num_temp_offset;     /* Number of temperature offset registers */
+       u8 temp_src[4];         /* Up to 4 temperature source registers */
        u8 sensor;              /* Register value (IT87_REG_TEMP_ENABLE) */
        u8 extra;               /* Register value (IT87_REG_TEMP_EXTRA) */
        u8 fan_div[NUM_FAN_DIV];/* Register encoding, shifted right */
@@ -921,16 +922,21 @@ static void _it87_write_value(struct it87_data *data, u8 reg, u8 value)
        outb_p(value, data->addr + IT87_DATA_REG_OFFSET);
 }
 
-static void it87_set_bank(struct it87_data *data, u8 bank)
+static u8 it87_set_bank(struct it87_data *data, u8 bank)
 {
-       if (has_bank_sel(data) && bank != data->bank) {
+       u8 _bank = bank;
+
+       if (has_bank_sel(data)) {
                u8 breg = _it87_read_value(data, IT87_REG_BANK);
 
-               breg &= 0x1f;
-               breg |= (bank << 5);
-               data->bank = bank;
-               _it87_write_value(data, IT87_REG_BANK, breg);
+               _bank = breg >> 5;
+               if (bank != _bank) {
+                       breg &= 0x1f;
+                       breg |= (bank << 5);
+                       _it87_write_value(data, IT87_REG_BANK, breg);
+               }
        }
+       return _bank;
 }
 
 /*
@@ -940,8 +946,14 @@ static void it87_set_bank(struct it87_data *data, u8 bank)
  */
 static int it87_read_value(struct it87_data *data, u16 reg)
 {
-       it87_set_bank(data, reg >> 8);
-       return _it87_read_value(data, reg & 0xff);
+       u8 bank;
+       int val;
+
+       bank = it87_set_bank(data, reg >> 8);
+       val = _it87_read_value(data, reg & 0xff);
+       it87_set_bank(data, bank);
+
+       return val;
 }
 
 /*
@@ -951,8 +963,11 @@ static int it87_read_value(struct it87_data *data, u16 reg)
  */
 static void it87_write_value(struct it87_data *data, u16 reg, u8 value)
 {
-       it87_set_bank(data, reg >> 8);
+       u8 bank;
+
+       bank = it87_set_bank(data, reg >> 8);
        _it87_write_value(data, reg & 0xff, value);
+       it87_set_bank(data, bank);
 }
 
 static void it87_update_pwm_ctrl(struct it87_data *data, int nr)
@@ -1323,10 +1338,9 @@ static int get_temp_type(struct it87_data *data, int index)
        int type = 0;
 
        if (has_bank_sel(data)) {
-               int s1reg = IT87_REG_TEMP_SRC1[index/2] >> ((index % 2) * 4);
                u8 src1, src2;
 
-               src1 = (it87_read_value(data, s1reg) >> ((index % 2) * 4)) & 0x0f;
+               src1 = (data->temp_src[index / 2] >> ((index % 2) * 4)) & 0x0f;
 
                switch (data->type) {
                case it8686:
@@ -1342,7 +1356,7 @@ static int get_temp_type(struct it87_data *data, int index)
                                index = src1;
                                break;
                        }
-                       src2 = it87_read_value(data, IT87_REG_TEMP_SRC2);
+                       src2 = data->temp_src[3];
                        switch(src1) {
                        case 3:
                                type = (src2 & BIT(index)) ? 6 : 5;
@@ -3223,6 +3237,10 @@ static int __init it87_find(int sioaddr, unsigned short *address,
                /* Check for pwm2, fan2 */
                if (reg29 & BIT(1))
                        sio_data->skip_pwm |= BIT(1);
+               /*
+                * Note: Table 6-1 in datasheet claims that FAN_TAC2
+                * would be enabled with 29h[2]=0.
+                */
                if (reg2d & BIT(4))
                        sio_data->skip_fan |= BIT(1);
 
@@ -3253,7 +3271,7 @@ static int __init it87_find(int sioaddr, unsigned short *address,
                                sio_data->skip_fan |= BIT(3);
                        if (reg26 & BIT(5))
                                sio_data->skip_pwm |= BIT(4);
-                       if (!(reg26 & BIT(4)))
+                       if (reg26 & BIT(4))
                                sio_data->skip_fan |= BIT(4);
                }
 
@@ -3567,6 +3585,13 @@ static void it87_init_device(struct platform_device *pdev)
                }
        }
 
+       if (has_bank_sel(data)) {
+               for (i = 0; i < 3; i++)
+                       data->temp_src[i] =
+                               it87_read_value(data, IT87_REG_TEMP_SRC1[i]);
+               data->temp_src[3] = it87_read_value(data, IT87_REG_TEMP_SRC2);
+       }
+
        /* Start monitoring */
        it87_write_value(data, IT87_REG_CONFIG,
                         (it87_read_value(data, IT87_REG_CONFIG) & 0x3e)
@@ -3661,7 +3686,6 @@ static int it87_probe(struct platform_device *pdev)
        data->pwm_num_temp_map = it87_devices[sio_data->type].num_temp_map;
        data->peci_mask = it87_devices[sio_data->type].peci_mask;
        data->old_peci_mask = it87_devices[sio_data->type].old_peci_mask;
-       data->bank = 0xff;
 
        /*
         * IT8705F Datasheet 0.4.1, 3h == Version G.
@@ -3915,6 +3939,8 @@ static int __init sm_it87_init(void)
        bool found = false;
        int i, err;
 
+       pr_info("it87 driver version %s\n", IT87_DRIVER_VERSION);
+
        if (dmi)
                dmi_data = dmi->driver_data;