]> git.sur5r.net Git - groeck-it87/commitdiff
Add limit support for temp 4-6
authorGuenter Roeck <linux@roeck-us.net>
Tue, 11 Apr 2017 13:47:37 +0000 (06:47 -0700)
committerGuenter Roeck <linux@roeck-us.net>
Tue, 11 Apr 2017 13:48:01 +0000 (06:48 -0700)
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
it87.c

diff --git a/it87.c b/it87.c
index 6f62ff6201bf451ed7f648e1829d3063e14b5d86..69d3761fad945135d64706f04400ac1ff72e8201 100644 (file)
--- a/it87.c
+++ b/it87.c
@@ -256,7 +256,7 @@ static const u8 IT87_REG_FANX_8665[] =      { 0x18, 0x19, 0x1a, 0x81, 0x83, 0x94 };
 static const u8 IT87_REG_FANX_MIN_8665[] =
                                        { 0x1b, 0x1c, 0x1d, 0x85, 0x87, 0xb3 };
 
 static const u8 IT87_REG_FANX_MIN_8665[] =
                                        { 0x1b, 0x1c, 0x1d, 0x85, 0x87, 0xb3 };
 
-static const u8 IT87_REG_TEMP_OFFSET[] = { 0x56, 0x57, 0x59 };
+static const u8 IT87_REG_TEMP_OFFSET[] = { 0x56, 0x57, 0x59, 0x5a, 0x91, 0x90 };
 
 #define IT87_REG_FAN_MAIN_CTRL 0x13
 #define IT87_REG_FAN_CTL       0x14
 
 #define IT87_REG_FAN_MAIN_CTRL 0x13
 #define IT87_REG_FAN_CTL       0x14
@@ -273,8 +273,9 @@ static const u8 IT87_REG_VIN[]      = { 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26,
 
 #define IT87_REG_VIN_MAX(nr)   (0x30 + (nr) * 2)
 #define IT87_REG_VIN_MIN(nr)   (0x31 + (nr) * 2)
 
 #define IT87_REG_VIN_MAX(nr)   (0x30 + (nr) * 2)
 #define IT87_REG_VIN_MIN(nr)   (0x31 + (nr) * 2)
-#define IT87_REG_TEMP_HIGH(nr) (0x40 + (nr) * 2)
-#define IT87_REG_TEMP_LOW(nr)  (0x41 + (nr) * 2)
+
+static const u8 IT87_REG_TEMP_HIGH[] = { 0x40, 0x42, 0x44, 0x46, 0xb4, 0xb6 };
+static const u8 IT87_REG_TEMP_LOW[] =  { 0x41, 0x43, 0x45, 0x47, 0xb5, 0xb7 };
 
 #define IT87_REG_VIN_ENABLE    0x50
 #define IT87_REG_TEMP_ENABLE   0x51
 
 #define IT87_REG_VIN_ENABLE    0x50
 #define IT87_REG_TEMP_ENABLE   0x51
@@ -293,8 +294,6 @@ static const u8 IT87_REG_AUTO_BASE[] = { 0x60, 0x68, 0x70, 0x78, 0xa0, 0xa8 };
 #define NUM_VIN                        ARRAY_SIZE(IT87_REG_VIN)
 #define NUM_VIN_LIMIT          8
 #define NUM_TEMP               6
 #define NUM_VIN                        ARRAY_SIZE(IT87_REG_VIN)
 #define NUM_VIN_LIMIT          8
 #define NUM_TEMP               6
-#define NUM_TEMP_OFFSET                ARRAY_SIZE(IT87_REG_TEMP_OFFSET)
-#define NUM_TEMP_LIMIT         3
 #define NUM_FAN                        ARRAY_SIZE(IT87_REG_FAN)
 #define NUM_FAN_DIV            3
 #define NUM_PWM                        ARRAY_SIZE(IT87_REG_PWM)
 #define NUM_FAN                        ARRAY_SIZE(IT87_REG_FAN)
 #define NUM_FAN_DIV            3
 #define NUM_PWM                        ARRAY_SIZE(IT87_REG_PWM)
@@ -304,6 +303,7 @@ struct it87_devices {
        const char *name;
        const char * const suffix;
        u32 features;
        const char *name;
        const char * const suffix;
        u32 features;
+       u8 num_temp_limit;
        u8 peci_mask;
        u8 old_peci_mask;
 };
        u8 peci_mask;
        u8 old_peci_mask;
 };
@@ -339,12 +339,14 @@ static const struct it87_devices it87_devices[] = {
                .suffix = "F",
                .features = FEAT_OLD_AUTOPWM | FEAT_FANCTL_ONOFF,
                                                /* may need to overwrite */
                .suffix = "F",
                .features = FEAT_OLD_AUTOPWM | FEAT_FANCTL_ONOFF,
                                                /* may need to overwrite */
+               .num_temp_limit = 3,
        },
        [it8712] = {
                .name = "it8712",
                .suffix = "F",
                .features = FEAT_OLD_AUTOPWM | FEAT_VID | FEAT_FANCTL_ONOFF,
                                                /* may need to overwrite */
        },
        [it8712] = {
                .name = "it8712",
                .suffix = "F",
                .features = FEAT_OLD_AUTOPWM | FEAT_VID | FEAT_FANCTL_ONOFF,
                                                /* may need to overwrite */
+               .num_temp_limit = 3,
        },
        [it8716] = {
                .name = "it8716",
        },
        [it8716] = {
                .name = "it8716",
@@ -352,6 +354,7 @@ static const struct it87_devices it87_devices[] = {
                .features = FEAT_16BIT_FANS | FEAT_TEMP_OFFSET | FEAT_VID
                  | FEAT_FAN16_CONFIG | FEAT_FIVE_FANS | FEAT_PWM_FREQ2
                  | FEAT_FANCTL_ONOFF,
                .features = FEAT_16BIT_FANS | FEAT_TEMP_OFFSET | FEAT_VID
                  | FEAT_FAN16_CONFIG | FEAT_FIVE_FANS | FEAT_PWM_FREQ2
                  | FEAT_FANCTL_ONOFF,
+               .num_temp_limit = 3,
        },
        [it8718] = {
                .name = "it8718",
        },
        [it8718] = {
                .name = "it8718",
@@ -359,6 +362,7 @@ static const struct it87_devices it87_devices[] = {
                .features = FEAT_16BIT_FANS | FEAT_TEMP_OFFSET | FEAT_VID
                  | FEAT_TEMP_OLD_PECI | FEAT_FAN16_CONFIG | FEAT_FIVE_FANS
                  | FEAT_PWM_FREQ2 | FEAT_FANCTL_ONOFF,
                .features = FEAT_16BIT_FANS | FEAT_TEMP_OFFSET | FEAT_VID
                  | FEAT_TEMP_OLD_PECI | FEAT_FAN16_CONFIG | FEAT_FIVE_FANS
                  | FEAT_PWM_FREQ2 | FEAT_FANCTL_ONOFF,
+               .num_temp_limit = 3,
                .old_peci_mask = 0x4,
        },
        [it8720] = {
                .old_peci_mask = 0x4,
        },
        [it8720] = {
@@ -367,6 +371,7 @@ static const struct it87_devices it87_devices[] = {
                .features = FEAT_16BIT_FANS | FEAT_TEMP_OFFSET | FEAT_VID
                  | FEAT_TEMP_OLD_PECI | FEAT_FAN16_CONFIG | FEAT_FIVE_FANS
                  | FEAT_PWM_FREQ2 | FEAT_FANCTL_ONOFF,
                .features = FEAT_16BIT_FANS | FEAT_TEMP_OFFSET | FEAT_VID
                  | FEAT_TEMP_OLD_PECI | FEAT_FAN16_CONFIG | FEAT_FIVE_FANS
                  | FEAT_PWM_FREQ2 | FEAT_FANCTL_ONOFF,
+               .num_temp_limit = 3,
                .old_peci_mask = 0x4,
        },
        [it8721] = {
                .old_peci_mask = 0x4,
        },
        [it8721] = {
@@ -376,6 +381,7 @@ static const struct it87_devices it87_devices[] = {
                  | FEAT_TEMP_OFFSET | FEAT_TEMP_OLD_PECI | FEAT_TEMP_PECI
                  | FEAT_FAN16_CONFIG | FEAT_FIVE_FANS | FEAT_IN7_INTERNAL
                  | FEAT_PWM_FREQ2 | FEAT_SCALING | FEAT_FANCTL_ONOFF,
                  | FEAT_TEMP_OFFSET | FEAT_TEMP_OLD_PECI | FEAT_TEMP_PECI
                  | FEAT_FAN16_CONFIG | FEAT_FIVE_FANS | FEAT_IN7_INTERNAL
                  | FEAT_PWM_FREQ2 | FEAT_SCALING | FEAT_FANCTL_ONOFF,
+               .num_temp_limit = 3,
                .peci_mask = 0x05,
                .old_peci_mask = 0x02,  /* Actually reports PCH */
        },
                .peci_mask = 0x05,
                .old_peci_mask = 0x02,  /* Actually reports PCH */
        },
@@ -386,6 +392,7 @@ static const struct it87_devices it87_devices[] = {
                  | FEAT_TEMP_OFFSET | FEAT_TEMP_PECI | FEAT_FIVE_FANS
                  | FEAT_IN7_INTERNAL | FEAT_PWM_FREQ2 | FEAT_SCALING
                  | FEAT_FANCTL_ONOFF,
                  | FEAT_TEMP_OFFSET | FEAT_TEMP_PECI | FEAT_FIVE_FANS
                  | FEAT_IN7_INTERNAL | FEAT_PWM_FREQ2 | FEAT_SCALING
                  | FEAT_FANCTL_ONOFF,
+               .num_temp_limit = 3,
                .peci_mask = 0x07,
        },
        [it8732] = {
                .peci_mask = 0x07,
        },
        [it8732] = {
@@ -395,6 +402,7 @@ static const struct it87_devices it87_devices[] = {
                  | FEAT_TEMP_OFFSET | FEAT_TEMP_OLD_PECI | FEAT_TEMP_PECI
                  | FEAT_10_9MV_ADC | FEAT_IN7_INTERNAL | FEAT_FOUR_FANS
                  | FEAT_FOUR_PWM | FEAT_FANCTL_ONOFF,
                  | FEAT_TEMP_OFFSET | FEAT_TEMP_OLD_PECI | FEAT_TEMP_PECI
                  | FEAT_10_9MV_ADC | FEAT_IN7_INTERNAL | FEAT_FOUR_FANS
                  | FEAT_FOUR_PWM | FEAT_FANCTL_ONOFF,
+               .num_temp_limit = 3,
                .peci_mask = 0x07,
                .old_peci_mask = 0x02,  /* Actually reports PCH */
        },
                .peci_mask = 0x07,
                .old_peci_mask = 0x02,  /* Actually reports PCH */
        },
@@ -408,6 +416,7 @@ static const struct it87_devices it87_devices[] = {
                                /* 12mV ADC (OHM) */
                                /* 16 bit fans (OHM) */
                                /* three fans, always 16 bit (guesswork) */
                                /* 12mV ADC (OHM) */
                                /* 16 bit fans (OHM) */
                                /* three fans, always 16 bit (guesswork) */
+               .num_temp_limit = 3,
                .peci_mask = 0x07,
        },
        [it8772] = {
                .peci_mask = 0x07,
        },
        [it8772] = {
@@ -420,6 +429,7 @@ static const struct it87_devices it87_devices[] = {
                                /* 12mV ADC (HWSensors4, OHM) */
                                /* 16 bit fans (HWSensors4, OHM) */
                                /* three fans, always 16 bit (datasheet) */
                                /* 12mV ADC (HWSensors4, OHM) */
                                /* 16 bit fans (HWSensors4, OHM) */
                                /* three fans, always 16 bit (datasheet) */
+               .num_temp_limit = 3,
                .peci_mask = 0x07,
        },
        [it8781] = {
                .peci_mask = 0x07,
        },
        [it8781] = {
@@ -428,6 +438,7 @@ static const struct it87_devices it87_devices[] = {
                .features = FEAT_16BIT_FANS | FEAT_TEMP_OFFSET
                  | FEAT_TEMP_OLD_PECI | FEAT_FAN16_CONFIG | FEAT_PWM_FREQ2
                  | FEAT_FANCTL_ONOFF,
                .features = FEAT_16BIT_FANS | FEAT_TEMP_OFFSET
                  | FEAT_TEMP_OLD_PECI | FEAT_FAN16_CONFIG | FEAT_PWM_FREQ2
                  | FEAT_FANCTL_ONOFF,
+               .num_temp_limit = 3,
                .old_peci_mask = 0x4,
        },
        [it8782] = {
                .old_peci_mask = 0x4,
        },
        [it8782] = {
@@ -436,6 +447,7 @@ static const struct it87_devices it87_devices[] = {
                .features = FEAT_16BIT_FANS | FEAT_TEMP_OFFSET
                  | FEAT_TEMP_OLD_PECI | FEAT_FAN16_CONFIG | FEAT_PWM_FREQ2
                  | FEAT_FANCTL_ONOFF,
                .features = FEAT_16BIT_FANS | FEAT_TEMP_OFFSET
                  | FEAT_TEMP_OLD_PECI | FEAT_FAN16_CONFIG | FEAT_PWM_FREQ2
                  | FEAT_FANCTL_ONOFF,
+               .num_temp_limit = 3,
                .old_peci_mask = 0x4,
        },
        [it8783] = {
                .old_peci_mask = 0x4,
        },
        [it8783] = {
@@ -444,6 +456,7 @@ static const struct it87_devices it87_devices[] = {
                .features = FEAT_16BIT_FANS | FEAT_TEMP_OFFSET
                  | FEAT_TEMP_OLD_PECI | FEAT_FAN16_CONFIG | FEAT_PWM_FREQ2
                  | FEAT_FANCTL_ONOFF,
                .features = FEAT_16BIT_FANS | FEAT_TEMP_OFFSET
                  | FEAT_TEMP_OLD_PECI | FEAT_FAN16_CONFIG | FEAT_PWM_FREQ2
                  | FEAT_FANCTL_ONOFF,
+               .num_temp_limit = 3,
                .old_peci_mask = 0x4,
        },
        [it8786] = {
                .old_peci_mask = 0x4,
        },
        [it8786] = {
@@ -452,6 +465,7 @@ static const struct it87_devices it87_devices[] = {
                .features = FEAT_NEWER_AUTOPWM | FEAT_12MV_ADC | FEAT_16BIT_FANS
                  | FEAT_TEMP_OFFSET | FEAT_TEMP_PECI | FEAT_IN7_INTERNAL
                  | FEAT_PWM_FREQ2 | FEAT_FANCTL_ONOFF,
                .features = FEAT_NEWER_AUTOPWM | FEAT_12MV_ADC | FEAT_16BIT_FANS
                  | FEAT_TEMP_OFFSET | FEAT_TEMP_PECI | FEAT_IN7_INTERNAL
                  | FEAT_PWM_FREQ2 | FEAT_FANCTL_ONOFF,
+               .num_temp_limit = 3,
                .peci_mask = 0x07,
        },
        [it8790] = {
                .peci_mask = 0x07,
        },
        [it8790] = {
@@ -460,6 +474,7 @@ static const struct it87_devices it87_devices[] = {
                .features = FEAT_NEWER_AUTOPWM | FEAT_10_9MV_ADC | FEAT_SCALING
                  | FEAT_16BIT_FANS | FEAT_TEMP_OFFSET | FEAT_TEMP_PECI
                  | FEAT_IN7_INTERNAL | FEAT_PWM_FREQ2 | FEAT_FANCTL_ONOFF,
                .features = FEAT_NEWER_AUTOPWM | FEAT_10_9MV_ADC | FEAT_SCALING
                  | FEAT_16BIT_FANS | FEAT_TEMP_OFFSET | FEAT_TEMP_PECI
                  | FEAT_IN7_INTERNAL | FEAT_PWM_FREQ2 | FEAT_FANCTL_ONOFF,
+               .num_temp_limit = 3,
                .peci_mask = 0x07,
        },
        [it8792] = {
                .peci_mask = 0x07,
        },
        [it8792] = {
@@ -468,6 +483,7 @@ static const struct it87_devices it87_devices[] = {
                .features = FEAT_NEWER_AUTOPWM | FEAT_10_9MV_ADC | FEAT_SCALING
                  | FEAT_16BIT_FANS | FEAT_TEMP_OFFSET | FEAT_TEMP_PECI
                  | FEAT_IN7_INTERNAL | FEAT_PWM_FREQ2 | FEAT_FANCTL_ONOFF,
                .features = FEAT_NEWER_AUTOPWM | FEAT_10_9MV_ADC | FEAT_SCALING
                  | FEAT_16BIT_FANS | FEAT_TEMP_OFFSET | FEAT_TEMP_PECI
                  | FEAT_IN7_INTERNAL | FEAT_PWM_FREQ2 | FEAT_FANCTL_ONOFF,
+               .num_temp_limit = 3,
                .peci_mask = 0x07,
        },
        [it8603] = {
                .peci_mask = 0x07,
        },
        [it8603] = {
@@ -476,6 +492,7 @@ static const struct it87_devices it87_devices[] = {
                .features = FEAT_NEWER_AUTOPWM | FEAT_12MV_ADC | FEAT_16BIT_FANS
                  | FEAT_TEMP_OFFSET | FEAT_TEMP_PECI | FEAT_IN7_INTERNAL
                  | FEAT_AVCC3 | FEAT_PWM_FREQ2 | FEAT_SCALING,
                .features = FEAT_NEWER_AUTOPWM | FEAT_12MV_ADC | FEAT_16BIT_FANS
                  | FEAT_TEMP_OFFSET | FEAT_TEMP_PECI | FEAT_IN7_INTERNAL
                  | FEAT_AVCC3 | FEAT_PWM_FREQ2 | FEAT_SCALING,
+               .num_temp_limit = 3,
                .peci_mask = 0x07,
        },
        [it8607] = {
                .peci_mask = 0x07,
        },
        [it8607] = {
@@ -485,6 +502,7 @@ static const struct it87_devices it87_devices[] = {
                  | FEAT_TEMP_OFFSET | FEAT_TEMP_PECI | FEAT_IN7_INTERNAL
                  | FEAT_AVCC3 | FEAT_PWM_FREQ2 | FEAT_SCALING
                  | FEAT_FANCTL_ONOFF,
                  | FEAT_TEMP_OFFSET | FEAT_TEMP_PECI | FEAT_IN7_INTERNAL
                  | FEAT_AVCC3 | FEAT_PWM_FREQ2 | FEAT_SCALING
                  | FEAT_FANCTL_ONOFF,
+               .num_temp_limit = 3,
                .peci_mask = 0x07,
        },
        [it8620] = {
                .peci_mask = 0x07,
        },
        [it8620] = {
@@ -495,6 +513,7 @@ static const struct it87_devices it87_devices[] = {
                  | FEAT_IN7_INTERNAL | FEAT_SIX_PWM | FEAT_PWM_FREQ2
                  | FEAT_SIX_TEMP | FEAT_VIN3_5V | FEAT_SCALING
                  | FEAT_FANCTL_ONOFF,
                  | FEAT_IN7_INTERNAL | FEAT_SIX_PWM | FEAT_PWM_FREQ2
                  | FEAT_SIX_TEMP | FEAT_VIN3_5V | FEAT_SCALING
                  | FEAT_FANCTL_ONOFF,
+               .num_temp_limit = 3,
                .peci_mask = 0x07,
        },
        [it8622] = {
                .peci_mask = 0x07,
        },
        [it8622] = {
@@ -504,6 +523,7 @@ static const struct it87_devices it87_devices[] = {
                  | FEAT_TEMP_OFFSET | FEAT_TEMP_PECI | FEAT_FIVE_FANS
                  | FEAT_FIVE_PWM | FEAT_IN7_INTERNAL | FEAT_PWM_FREQ2
                  | FEAT_AVCC3 | FEAT_VIN3_5V | FEAT_SCALING,
                  | FEAT_TEMP_OFFSET | FEAT_TEMP_PECI | FEAT_FIVE_FANS
                  | FEAT_FIVE_PWM | FEAT_IN7_INTERNAL | FEAT_PWM_FREQ2
                  | FEAT_AVCC3 | FEAT_VIN3_5V | FEAT_SCALING,
+               .num_temp_limit = 3,
                .peci_mask = 0x07,
        },
        [it8628] = {
                .peci_mask = 0x07,
        },
        [it8628] = {
@@ -514,6 +534,7 @@ static const struct it87_devices it87_devices[] = {
                  | FEAT_IN7_INTERNAL | FEAT_SIX_PWM | FEAT_PWM_FREQ2
                  | FEAT_SIX_TEMP | FEAT_SCALING | FEAT_AVCC3
                  | FEAT_FANCTL_ONOFF,
                  | FEAT_IN7_INTERNAL | FEAT_SIX_PWM | FEAT_PWM_FREQ2
                  | FEAT_SIX_TEMP | FEAT_SCALING | FEAT_AVCC3
                  | FEAT_FANCTL_ONOFF,
+               .num_temp_limit = 3,
                .peci_mask = 0x07,
        },
        [it8655] = {
                .peci_mask = 0x07,
        },
        [it8655] = {
@@ -522,6 +543,7 @@ static const struct it87_devices it87_devices[] = {
                .features = FEAT_NEWER_AUTOPWM | FEAT_16BIT_FANS
                  | FEAT_TEMP_OFFSET | FEAT_TEMP_PECI | FEAT_AVCC3
                  | FEAT_10_9MV_ADC | FEAT_IN7_INTERNAL | FEAT_BANK_SEL,
                .features = FEAT_NEWER_AUTOPWM | FEAT_16BIT_FANS
                  | FEAT_TEMP_OFFSET | FEAT_TEMP_PECI | FEAT_AVCC3
                  | FEAT_10_9MV_ADC | FEAT_IN7_INTERNAL | FEAT_BANK_SEL,
+               .num_temp_limit = 6,
                .peci_mask = 0x07,
        },
        [it8665] = {
                .peci_mask = 0x07,
        },
        [it8665] = {
@@ -531,6 +553,7 @@ static const struct it87_devices it87_devices[] = {
                  | FEAT_TEMP_OFFSET | FEAT_TEMP_PECI | FEAT_AVCC3
                  | FEAT_10_9MV_ADC | FEAT_IN7_INTERNAL | FEAT_SIX_FANS
                  | FEAT_SIX_PWM | FEAT_BANK_SEL,
                  | FEAT_TEMP_OFFSET | FEAT_TEMP_PECI | FEAT_AVCC3
                  | FEAT_10_9MV_ADC | FEAT_IN7_INTERNAL | FEAT_SIX_FANS
                  | FEAT_SIX_PWM | FEAT_BANK_SEL,
+               .num_temp_limit = 6,
                .peci_mask = 0x07,
        },
        [it8686] = {
                .peci_mask = 0x07,
        },
        [it8686] = {
@@ -540,6 +563,7 @@ static const struct it87_devices it87_devices[] = {
                  | FEAT_TEMP_OFFSET | FEAT_TEMP_PECI | FEAT_SIX_FANS
                  | FEAT_IN7_INTERNAL | FEAT_SIX_PWM | FEAT_PWM_FREQ2
                  | FEAT_SIX_TEMP | FEAT_BANK_SEL | FEAT_SCALING | FEAT_AVCC3,
                  | FEAT_TEMP_OFFSET | FEAT_TEMP_PECI | FEAT_SIX_FANS
                  | FEAT_IN7_INTERNAL | FEAT_SIX_PWM | FEAT_PWM_FREQ2
                  | FEAT_SIX_TEMP | FEAT_BANK_SEL | FEAT_SCALING | FEAT_AVCC3,
+               .num_temp_limit = 6,
                .peci_mask = 0x07,
        },
 };
                .peci_mask = 0x07,
        },
 };
@@ -626,6 +650,7 @@ struct it87_data {
        u16 fan[NUM_FAN][2];    /* Register values, [nr][0]=fan, [1]=min */
        u8 has_temp;            /* Bitfield, temp sensors enabled */
        s8 temp[NUM_TEMP][4];   /* [nr][0]=temp, [1]=min, [2]=max, [3]=offset */
        u16 fan[NUM_FAN][2];    /* Register values, [nr][0]=fan, [1]=min */
        u8 has_temp;            /* Bitfield, temp sensors enabled */
        s8 temp[NUM_TEMP][4];   /* [nr][0]=temp, [1]=min, [2]=max, [3]=offset */
+       u8 num_temp_limit;      /* Number of temp limit/offset 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 */
        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 */
@@ -910,18 +935,18 @@ static struct it87_data *it87_update_device(struct device *dev)
                        data->temp[i][0] =
                                it87_read_value(data, IT87_REG_TEMP(i));
 
                        data->temp[i][0] =
                                it87_read_value(data, IT87_REG_TEMP(i));
 
-                       if (has_temp_offset(data) && i < NUM_TEMP_OFFSET)
+                       if (i >= data->num_temp_limit)
+                               continue;
+
+                       if (has_temp_offset(data))
                                data->temp[i][3] =
                                  it87_read_value(data,
                                                  IT87_REG_TEMP_OFFSET[i]);
 
                                data->temp[i][3] =
                                  it87_read_value(data,
                                                  IT87_REG_TEMP_OFFSET[i]);
 
-                       if (i >= NUM_TEMP_LIMIT)
-                               continue;
-
                        data->temp[i][1] =
                        data->temp[i][1] =
-                               it87_read_value(data, IT87_REG_TEMP_LOW(i));
+                               it87_read_value(data, IT87_REG_TEMP_LOW[i]);
                        data->temp[i][2] =
                        data->temp[i][2] =
-                               it87_read_value(data, IT87_REG_TEMP_HIGH(i));
+                               it87_read_value(data, IT87_REG_TEMP_HIGH[i]);
                }
 
                /* Newer chips don't have clock dividers */
                }
 
                /* Newer chips don't have clock dividers */
@@ -1088,10 +1113,10 @@ static ssize_t set_temp(struct device *dev, struct device_attribute *attr,
        switch (index) {
        default:
        case 1:
        switch (index) {
        default:
        case 1:
-               reg = IT87_REG_TEMP_LOW(nr);
+               reg = IT87_REG_TEMP_LOW[nr];
                break;
        case 2:
                break;
        case 2:
-               reg = IT87_REG_TEMP_HIGH(nr);
+               reg = IT87_REG_TEMP_HIGH[nr];
                break;
        case 3:
                regval = it87_read_value(data, IT87_REG_BEEP_ENABLE);
                break;
        case 3:
                regval = it87_read_value(data, IT87_REG_BEEP_ENABLE);
@@ -1132,8 +1157,26 @@ static SENSOR_DEVICE_ATTR_2(temp3_max, S_IRUGO | S_IWUSR, show_temp, set_temp,
 static SENSOR_DEVICE_ATTR_2(temp3_offset, S_IRUGO | S_IWUSR, show_temp,
                            set_temp, 2, 3);
 static SENSOR_DEVICE_ATTR_2(temp4_input, S_IRUGO, show_temp, NULL, 3, 0);
 static SENSOR_DEVICE_ATTR_2(temp3_offset, S_IRUGO | S_IWUSR, show_temp,
                            set_temp, 2, 3);
 static SENSOR_DEVICE_ATTR_2(temp4_input, S_IRUGO, show_temp, NULL, 3, 0);
+static SENSOR_DEVICE_ATTR_2(temp4_min, S_IRUGO | S_IWUSR, show_temp, set_temp,
+                           3, 1);
+static SENSOR_DEVICE_ATTR_2(temp4_max, S_IRUGO | S_IWUSR, show_temp, set_temp,
+                           3, 2);
+static SENSOR_DEVICE_ATTR_2(temp4_offset, S_IRUGO | S_IWUSR, show_temp,
+                           set_temp, 3, 3);
 static SENSOR_DEVICE_ATTR_2(temp5_input, S_IRUGO, show_temp, NULL, 4, 0);
 static SENSOR_DEVICE_ATTR_2(temp5_input, S_IRUGO, show_temp, NULL, 4, 0);
+static SENSOR_DEVICE_ATTR_2(temp5_min, S_IRUGO | S_IWUSR, show_temp, set_temp,
+                           4, 1);
+static SENSOR_DEVICE_ATTR_2(temp5_max, S_IRUGO | S_IWUSR, show_temp, set_temp,
+                           4, 2);
+static SENSOR_DEVICE_ATTR_2(temp5_offset, S_IRUGO | S_IWUSR, show_temp,
+                           set_temp, 4, 3);
 static SENSOR_DEVICE_ATTR_2(temp6_input, S_IRUGO, show_temp, NULL, 5, 0);
 static SENSOR_DEVICE_ATTR_2(temp6_input, S_IRUGO, show_temp, NULL, 5, 0);
+static SENSOR_DEVICE_ATTR_2(temp6_min, S_IRUGO | S_IWUSR, show_temp, set_temp,
+                           5, 1);
+static SENSOR_DEVICE_ATTR_2(temp6_max, S_IRUGO | S_IWUSR, show_temp, set_temp,
+                           5, 2);
+static SENSOR_DEVICE_ATTR_2(temp6_offset, S_IRUGO | S_IWUSR, show_temp,
+                           set_temp, 5, 3);
 
 static ssize_t show_temp_type(struct device *dev, struct device_attribute *attr,
                              char *buf)
 
 static ssize_t show_temp_type(struct device *dev, struct device_attribute *attr,
                              char *buf)
@@ -1209,6 +1252,12 @@ static SENSOR_DEVICE_ATTR(temp2_type, S_IRUGO | S_IWUSR, show_temp_type,
                          set_temp_type, 1);
 static SENSOR_DEVICE_ATTR(temp3_type, S_IRUGO | S_IWUSR, show_temp_type,
                          set_temp_type, 2);
                          set_temp_type, 1);
 static SENSOR_DEVICE_ATTR(temp3_type, S_IRUGO | S_IWUSR, show_temp_type,
                          set_temp_type, 2);
+static SENSOR_DEVICE_ATTR(temp4_type, S_IRUGO | S_IWUSR, show_temp_type,
+                         set_temp_type, 3);
+static SENSOR_DEVICE_ATTR(temp5_type, S_IRUGO | S_IWUSR, show_temp_type,
+                         set_temp_type, 4);
+static SENSOR_DEVICE_ATTR(temp6_type, S_IRUGO | S_IWUSR, show_temp_type,
+                         set_temp_type, 5);
 
 /* 6 Fans */
 
 
 /* 6 Fans */
 
@@ -1978,6 +2027,9 @@ static SENSOR_DEVICE_ATTR(fan6_alarm, S_IRUGO, show_alarm, NULL, 7);
 static SENSOR_DEVICE_ATTR(temp1_alarm, S_IRUGO, show_alarm, NULL, 16);
 static SENSOR_DEVICE_ATTR(temp2_alarm, S_IRUGO, show_alarm, NULL, 17);
 static SENSOR_DEVICE_ATTR(temp3_alarm, S_IRUGO, show_alarm, NULL, 18);
 static SENSOR_DEVICE_ATTR(temp1_alarm, S_IRUGO, show_alarm, NULL, 16);
 static SENSOR_DEVICE_ATTR(temp2_alarm, S_IRUGO, show_alarm, NULL, 17);
 static SENSOR_DEVICE_ATTR(temp3_alarm, S_IRUGO, show_alarm, NULL, 18);
+static SENSOR_DEVICE_ATTR(temp4_alarm, S_IRUGO, show_alarm, NULL, 19);
+static SENSOR_DEVICE_ATTR(temp5_alarm, S_IRUGO, show_alarm, NULL, 20);
+static SENSOR_DEVICE_ATTR(temp6_alarm, S_IRUGO, show_alarm, NULL, 21);
 static SENSOR_DEVICE_ATTR(intrusion0_alarm, S_IRUGO | S_IWUSR,
                          show_alarm, clear_intrusion, 4);
 
 static SENSOR_DEVICE_ATTR(intrusion0_alarm, S_IRUGO | S_IWUSR,
                          show_alarm, clear_intrusion, 4);
 
@@ -2031,6 +2083,9 @@ static SENSOR_DEVICE_ATTR(temp1_beep, S_IRUGO | S_IWUSR,
                          show_beep, set_beep, 2);
 static SENSOR_DEVICE_ATTR(temp2_beep, S_IRUGO, show_beep, NULL, 2);
 static SENSOR_DEVICE_ATTR(temp3_beep, S_IRUGO, show_beep, NULL, 2);
                          show_beep, set_beep, 2);
 static SENSOR_DEVICE_ATTR(temp2_beep, S_IRUGO, show_beep, NULL, 2);
 static SENSOR_DEVICE_ATTR(temp3_beep, S_IRUGO, show_beep, NULL, 2);
+static SENSOR_DEVICE_ATTR(temp4_beep, S_IRUGO, show_beep, NULL, 2);
+static SENSOR_DEVICE_ATTR(temp5_beep, S_IRUGO, show_beep, NULL, 2);
+static SENSOR_DEVICE_ATTR(temp6_beep, S_IRUGO, show_beep, NULL, 2);
 
 static ssize_t show_vrm_reg(struct device *dev, struct device_attribute *attr,
                            char *buf)
 
 static ssize_t show_vrm_reg(struct device *dev, struct device_attribute *attr,
                            char *buf)
@@ -2190,14 +2245,12 @@ static umode_t it87_temp_is_visible(struct kobject *kobj,
        int i = index / 7;      /* temperature index */
        int a = index % 7;      /* attribute index */
 
        int i = index / 7;      /* temperature index */
        int a = index % 7;      /* attribute index */
 
-       if (index >= 21) {
-               i = index - 21 + 3;
-               a = 0;
-       }
-
        if (!(data->has_temp & BIT(i)))
                return 0;
 
        if (!(data->has_temp & BIT(i)))
                return 0;
 
+       if (a && i >= data->num_temp_limit)
+               return 0;
+
        if (a == 5 && !has_temp_offset(data))
                return 0;
 
        if (a == 5 && !has_temp_offset(data))
                return 0;
 
@@ -2233,8 +2286,26 @@ static struct attribute *it87_attributes_temp[] = {
        &sensor_dev_attr_temp3_beep.dev_attr.attr,
 
        &sensor_dev_attr_temp4_input.dev_attr.attr,     /* 21 */
        &sensor_dev_attr_temp3_beep.dev_attr.attr,
 
        &sensor_dev_attr_temp4_input.dev_attr.attr,     /* 21 */
+       &sensor_dev_attr_temp4_max.dev_attr.attr,
+       &sensor_dev_attr_temp4_min.dev_attr.attr,
+       &sensor_dev_attr_temp4_type.dev_attr.attr,
+       &sensor_dev_attr_temp4_alarm.dev_attr.attr,
+       &sensor_dev_attr_temp4_offset.dev_attr.attr,
+       &sensor_dev_attr_temp4_beep.dev_attr.attr,
        &sensor_dev_attr_temp5_input.dev_attr.attr,
        &sensor_dev_attr_temp5_input.dev_attr.attr,
+       &sensor_dev_attr_temp5_max.dev_attr.attr,
+       &sensor_dev_attr_temp5_min.dev_attr.attr,
+       &sensor_dev_attr_temp5_type.dev_attr.attr,
+       &sensor_dev_attr_temp5_alarm.dev_attr.attr,
+       &sensor_dev_attr_temp5_offset.dev_attr.attr,
+       &sensor_dev_attr_temp5_beep.dev_attr.attr,
        &sensor_dev_attr_temp6_input.dev_attr.attr,
        &sensor_dev_attr_temp6_input.dev_attr.attr,
+       &sensor_dev_attr_temp6_max.dev_attr.attr,
+       &sensor_dev_attr_temp6_min.dev_attr.attr,
+       &sensor_dev_attr_temp6_type.dev_attr.attr,
+       &sensor_dev_attr_temp6_alarm.dev_attr.attr,
+       &sensor_dev_attr_temp6_offset.dev_attr.attr,
+       &sensor_dev_attr_temp6_beep.dev_attr.attr,
        NULL
 };
 
        NULL
 };
 
@@ -3128,10 +3199,10 @@ static void it87_init_device(struct platform_device *pdev)
                if (tmp == 0xff)
                        it87_write_value(data, IT87_REG_VIN_MIN(i), 0);
        }
                if (tmp == 0xff)
                        it87_write_value(data, IT87_REG_VIN_MIN(i), 0);
        }
-       for (i = 0; i < NUM_TEMP_LIMIT; i++) {
-               tmp = it87_read_value(data, IT87_REG_TEMP_HIGH(i));
+       for (i = 0; i < data->num_temp_limit; i++) {
+               tmp = it87_read_value(data, IT87_REG_TEMP_HIGH[i]);
                if (tmp == 0xff)
                if (tmp == 0xff)
-                       it87_write_value(data, IT87_REG_TEMP_HIGH(i), 127);
+                       it87_write_value(data, IT87_REG_TEMP_HIGH[i], 127);
        }
 
        /*
        }
 
        /*
@@ -3300,6 +3371,7 @@ static int it87_probe(struct platform_device *pdev)
        data->addr = res->start;
        data->type = sio_data->type;
        data->features = it87_devices[sio_data->type].features;
        data->addr = res->start;
        data->type = sio_data->type;
        data->features = it87_devices[sio_data->type].features;
+       data->num_temp_limit = it87_devices[sio_data->type].num_temp_limit;
        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;
        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;