#define F71882FG_REG_FAN_STATUS                0x92
 #define F71882FG_REG_FAN_BEEP          0x93
 
-#define F71882FG_REG_TEMP(nr)          (0x72 + 2 * (nr))
-#define F71882FG_REG_TEMP_OVT(nr)      (0x82 + 2 * (nr))
-#define F71882FG_REG_TEMP_HIGH(nr)     (0x83 + 2 * (nr))
+#define F71882FG_REG_TEMP(nr)          (0x70 + 2 * (nr))
+#define F71882FG_REG_TEMP_OVT(nr)      (0x80 + 2 * (nr))
+#define F71882FG_REG_TEMP_HIGH(nr)     (0x81 + 2 * (nr))
 #define F71882FG_REG_TEMP_STATUS       0x62
 #define F71882FG_REG_TEMP_BEEP         0x63
 #define F71882FG_REG_TEMP_HYST1                0x6C
        u16     fan_full_speed[4];
        u8      fan_status;
        u8      fan_beep;
-       u8      temp[3];
-       u8      temp_ovt[3];
-       u8      temp_high[3];
-       u8      temp_hyst[3];
-       u8      temp_type[3];
+       /* Note: all models have only 3 temperature channels, but on some
+          they are addressed as 0-2 and on others as 1-3, so for coding
+          convenience we reserve space for 4 channels */
+       u8      temp[4];
+       u8      temp_ovt[4];
+       u8      temp_high[4];
+       u8      temp_hyst[4];
+       u8      temp_type[4];
        u8      temp_status;
        u8      temp_beep;
        u8      temp_diode_open;
        SENSOR_ATTR_2(in6_input, S_IRUGO, show_in, NULL, 0, 6),
        SENSOR_ATTR_2(in7_input, S_IRUGO, show_in, NULL, 0, 7),
        SENSOR_ATTR_2(in8_input, S_IRUGO, show_in, NULL, 0, 8),
-       SENSOR_ATTR_2(temp1_input, S_IRUGO, show_temp, NULL, 0, 0),
+       SENSOR_ATTR_2(temp1_input, S_IRUGO, show_temp, NULL, 0, 1),
        SENSOR_ATTR_2(temp1_max, S_IRUGO|S_IWUSR, show_temp_max,
-               store_temp_max, 0, 0),
+               store_temp_max, 0, 1),
        SENSOR_ATTR_2(temp1_max_hyst, S_IRUGO|S_IWUSR, show_temp_max_hyst,
-               store_temp_max_hyst, 0, 0),
+               store_temp_max_hyst, 0, 1),
        SENSOR_ATTR_2(temp1_crit, S_IRUGO|S_IWUSR, show_temp_crit,
-               store_temp_crit, 0, 0),
+               store_temp_crit, 0, 1),
        SENSOR_ATTR_2(temp1_crit_hyst, S_IRUGO, show_temp_crit_hyst, NULL,
-               0, 0),
-       SENSOR_ATTR_2(temp1_type, S_IRUGO, show_temp_type, NULL, 0, 0),
+               0, 1),
+       SENSOR_ATTR_2(temp1_type, S_IRUGO, show_temp_type, NULL, 0, 1),
        SENSOR_ATTR_2(temp1_beep, S_IRUGO|S_IWUSR, show_temp_beep,
-               store_temp_beep, 0, 0),
-       SENSOR_ATTR_2(temp1_alarm, S_IRUGO, show_temp_alarm, NULL, 0, 0),
-       SENSOR_ATTR_2(temp1_fault, S_IRUGO, show_temp_fault, NULL, 0, 0),
-       SENSOR_ATTR_2(temp2_input, S_IRUGO, show_temp, NULL, 0, 1),
+               store_temp_beep, 0, 1),
+       SENSOR_ATTR_2(temp1_alarm, S_IRUGO, show_temp_alarm, NULL, 0, 1),
+       SENSOR_ATTR_2(temp1_fault, S_IRUGO, show_temp_fault, NULL, 0, 1),
+       SENSOR_ATTR_2(temp2_input, S_IRUGO, show_temp, NULL, 0, 2),
        SENSOR_ATTR_2(temp2_max, S_IRUGO|S_IWUSR, show_temp_max,
-               store_temp_max, 0, 1),
+               store_temp_max, 0, 2),
        SENSOR_ATTR_2(temp2_max_hyst, S_IRUGO|S_IWUSR, show_temp_max_hyst,
-               store_temp_max_hyst, 0, 1),
+               store_temp_max_hyst, 0, 2),
        SENSOR_ATTR_2(temp2_crit, S_IRUGO|S_IWUSR, show_temp_crit,
-               store_temp_crit, 0, 1),
+               store_temp_crit, 0, 2),
        SENSOR_ATTR_2(temp2_crit_hyst, S_IRUGO, show_temp_crit_hyst, NULL,
-               0, 1),
-       SENSOR_ATTR_2(temp2_type, S_IRUGO, show_temp_type, NULL, 0, 1),
+               0, 2),
+       SENSOR_ATTR_2(temp2_type, S_IRUGO, show_temp_type, NULL, 0, 2),
        SENSOR_ATTR_2(temp2_beep, S_IRUGO|S_IWUSR, show_temp_beep,
-               store_temp_beep, 0, 1),
-       SENSOR_ATTR_2(temp2_alarm, S_IRUGO, show_temp_alarm, NULL, 0, 1),
-       SENSOR_ATTR_2(temp2_fault, S_IRUGO, show_temp_fault, NULL, 0, 1),
-       SENSOR_ATTR_2(temp3_input, S_IRUGO, show_temp, NULL, 0, 2),
+               store_temp_beep, 0, 2),
+       SENSOR_ATTR_2(temp2_alarm, S_IRUGO, show_temp_alarm, NULL, 0, 2),
+       SENSOR_ATTR_2(temp2_fault, S_IRUGO, show_temp_fault, NULL, 0, 2),
+       SENSOR_ATTR_2(temp3_input, S_IRUGO, show_temp, NULL, 0, 3),
        SENSOR_ATTR_2(temp3_max, S_IRUGO|S_IWUSR, show_temp_max,
-               store_temp_max, 0, 2),
+               store_temp_max, 0, 3),
        SENSOR_ATTR_2(temp3_max_hyst, S_IRUGO|S_IWUSR, show_temp_max_hyst,
-               store_temp_max_hyst, 0, 2),
+               store_temp_max_hyst, 0, 3),
        SENSOR_ATTR_2(temp3_crit, S_IRUGO|S_IWUSR, show_temp_crit,
-               store_temp_crit, 0, 2),
+               store_temp_crit, 0, 3),
        SENSOR_ATTR_2(temp3_crit_hyst, S_IRUGO, show_temp_crit_hyst, NULL,
-               0, 2),
-       SENSOR_ATTR_2(temp3_type, S_IRUGO, show_temp_type, NULL, 0, 2),
+               0, 3),
+       SENSOR_ATTR_2(temp3_type, S_IRUGO, show_temp_type, NULL, 0, 3),
        SENSOR_ATTR_2(temp3_beep, S_IRUGO|S_IWUSR, show_temp_beep,
-               store_temp_beep, 0, 2),
-       SENSOR_ATTR_2(temp3_alarm, S_IRUGO, show_temp_alarm, NULL, 0, 2),
-       SENSOR_ATTR_2(temp3_fault, S_IRUGO, show_temp_fault, NULL, 0, 2),
+               store_temp_beep, 0, 3),
+       SENSOR_ATTR_2(temp3_alarm, S_IRUGO, show_temp_alarm, NULL, 0, 3),
+       SENSOR_ATTR_2(temp3_fault, S_IRUGO, show_temp_fault, NULL, 0, 3),
 };
 
 static struct sensor_device_attribute_2 f71882fg_in_temp_attr[] = {
                }
 
                /* Get High & boundary temps*/
-               for (nr = 0; nr < 3; nr++) {
+               for (nr = 1; nr < 4; nr++) {
                        data->temp_ovt[nr] = f71882fg_read8(data,
                                                F71882FG_REG_TEMP_OVT(nr));
                        data->temp_high[nr] = f71882fg_read8(data,
                }
 
                /* Have to hardcode hyst*/
-               data->temp_hyst[0] = f71882fg_read8(data,
+               data->temp_hyst[1] = f71882fg_read8(data,
                                                F71882FG_REG_TEMP_HYST1) >> 4;
                /* Hyst temps 2 & 3 stored in same register */
                reg = f71882fg_read8(data, F71882FG_REG_TEMP_HYST23);
-               data->temp_hyst[1] = reg & 0x0F;
-               data->temp_hyst[2] = reg >> 4;
+               data->temp_hyst[2] = reg & 0x0F;
+               data->temp_hyst[3] = reg >> 4;
 
                /* Have to hardcode type, because temp1 is special */
                reg  = f71882fg_read8(data, F71882FG_REG_TEMP_TYPE);
                reg2 = f71882fg_read8(data, F71882FG_REG_PECI);
                if ((reg2 & 0x03) == 0x01)
-                       data->temp_type[0] = 6 /* PECI */;
+                       data->temp_type[1] = 6 /* PECI */;
                else if ((reg2 & 0x03) == 0x02)
-                       data->temp_type[0] = 5 /* AMDSI */;
+                       data->temp_type[1] = 5 /* AMDSI */;
                else
-                       data->temp_type[0] = (reg & 0x02) ? 2 : 4;
+                       data->temp_type[1] = (reg & 0x02) ? 2 : 4;
 
-               data->temp_type[1] = (reg & 0x04) ? 2 : 4;
-               data->temp_type[2] = (reg & 0x08) ? 2 : 4;
+               data->temp_type[2] = (reg & 0x04) ? 2 : 4;
+               data->temp_type[3] = (reg & 0x08) ? 2 : 4;
 
                data->temp_beep = f71882fg_read8(data, F71882FG_REG_TEMP_BEEP);
 
                                                F71882FG_REG_TEMP_STATUS);
                data->temp_diode_open = f71882fg_read8(data,
                                                F71882FG_REG_TEMP_DIODE_OPEN);
-               for (nr = 0; nr < 3; nr++)
+               for (nr = 1; nr < 4; nr++)
                        data->temp[nr] = f71882fg_read8(data,
                                                F71882FG_REG_TEMP(nr));
 
 
        /* convert value to register contents */
        switch (nr) {
-               case 0:
-                       val = val << 4;
-                       break;
                case 1:
-                       val = val | (data->temp_hyst[2] << 4);
+                       val = val << 4;
                        break;
                case 2:
-                       val = data->temp_hyst[1] | (val << 4);
+                       val = val | (data->temp_hyst[3] << 4);
+                       break;
+               case 3:
+                       val = data->temp_hyst[2] | (val << 4);
                        break;
        }
 
-       f71882fg_write8(data, nr ? F71882FG_REG_TEMP_HYST23 :
-               F71882FG_REG_TEMP_HYST1, val);
+       f71882fg_write8(data, (nr <= 1) ? F71882FG_REG_TEMP_HYST1 :
+               F71882FG_REG_TEMP_HYST23, val);
 
 store_temp_max_hyst_exit:
        mutex_unlock(&data->update_lock);
        struct f71882fg_data *data = f71882fg_update_device(dev);
        int nr = to_sensor_dev_attr_2(devattr)->index;
 
-       if (data->temp_beep & (1 << (nr + 1)))
+       if (data->temp_beep & (1 << nr))
                return sprintf(buf, "1\n");
        else
                return sprintf(buf, "0\n");
 
        mutex_lock(&data->update_lock);
        if (val)
-               data->temp_beep |= 1 << (nr + 1);
+               data->temp_beep |= 1 << nr;
        else
-               data->temp_beep &= ~(1 << (nr + 1));
+               data->temp_beep &= ~(1 << nr);
 
        f71882fg_write8(data, F71882FG_REG_TEMP_BEEP, data->temp_beep);
        mutex_unlock(&data->update_lock);
        struct f71882fg_data *data = f71882fg_update_device(dev);
        int nr = to_sensor_dev_attr_2(devattr)->index;
 
-       if (data->temp_status & (1 << (nr + 1)))
+       if (data->temp_status & (1 << nr))
                return sprintf(buf, "1\n");
        else
                return sprintf(buf, "0\n");
        struct f71882fg_data *data = f71882fg_update_device(dev);
        int nr = to_sensor_dev_attr_2(devattr)->index;
 
-       if (data->temp_diode_open & (1 << (nr + 1)))
+       if (data->temp_diode_open & (1 << nr))
                return sprintf(buf, "1\n");
        else
                return sprintf(buf, "0\n");