u8 vid;
        u8 vrm;
+
+       u8 temp3_disable;
+       u8 in6_skip;
 };
 
 struct w83627ehf_sio_data {
        return sprintf(buf, "%d\n", (int)data->temp_type[nr]);
 }
 
-static struct sensor_device_attribute sda_temp[] = {
+static struct sensor_device_attribute sda_temp_input[] = {
        SENSOR_ATTR(temp1_input, S_IRUGO, show_temp1, NULL, 0),
        SENSOR_ATTR(temp2_input, S_IRUGO, show_temp, NULL, 0),
        SENSOR_ATTR(temp3_input, S_IRUGO, show_temp, NULL, 1),
+};
+
+static struct sensor_device_attribute sda_temp_max[] = {
        SENSOR_ATTR(temp1_max, S_IRUGO | S_IWUSR, show_temp1_max,
                    store_temp1_max, 0),
        SENSOR_ATTR(temp2_max, S_IRUGO | S_IWUSR, show_temp_max,
                    store_temp_max, 0),
        SENSOR_ATTR(temp3_max, S_IRUGO | S_IWUSR, show_temp_max,
                    store_temp_max, 1),
+};
+
+static struct sensor_device_attribute sda_temp_max_hyst[] = {
        SENSOR_ATTR(temp1_max_hyst, S_IRUGO | S_IWUSR, show_temp1_max_hyst,
                    store_temp1_max_hyst, 0),
        SENSOR_ATTR(temp2_max_hyst, S_IRUGO | S_IWUSR, show_temp_max_hyst,
                    store_temp_max_hyst, 0),
        SENSOR_ATTR(temp3_max_hyst, S_IRUGO | S_IWUSR, show_temp_max_hyst,
                    store_temp_max_hyst, 1),
+};
+
+static struct sensor_device_attribute sda_temp_alarm[] = {
        SENSOR_ATTR(temp1_alarm, S_IRUGO, show_alarm, NULL, 4),
        SENSOR_ATTR(temp2_alarm, S_IRUGO, show_alarm, NULL, 5),
        SENSOR_ATTR(temp3_alarm, S_IRUGO, show_alarm, NULL, 13),
+};
+
+static struct sensor_device_attribute sda_temp_type[] = {
        SENSOR_ATTR(temp1_type, S_IRUGO, show_temp_type, NULL, 0),
        SENSOR_ATTR(temp2_type, S_IRUGO, show_temp_type, NULL, 1),
        SENSOR_ATTR(temp3_type, S_IRUGO, show_temp_type, NULL, 2),
        for (i = 0; i < ARRAY_SIZE(sda_sf3_arrays_fan4); i++)
                device_remove_file(dev, &sda_sf3_arrays_fan4[i].dev_attr);
        for (i = 0; i < data->in_num; i++) {
+               if ((i == 6) && data->in6_skip)
+                       continue;
                device_remove_file(dev, &sda_in_input[i].dev_attr);
                device_remove_file(dev, &sda_in_alarm[i].dev_attr);
                device_remove_file(dev, &sda_in_min[i].dev_attr);
                device_remove_file(dev, &sda_target_temp[i].dev_attr);
                device_remove_file(dev, &sda_tolerance[i].dev_attr);
        }
-       for (i = 0; i < ARRAY_SIZE(sda_temp); i++)
-               device_remove_file(dev, &sda_temp[i].dev_attr);
+       for (i = 0; i < 3; i++) {
+               if ((i == 2) && data->temp3_disable)
+                       continue;
+               device_remove_file(dev, &sda_temp_input[i].dev_attr);
+               device_remove_file(dev, &sda_temp_max[i].dev_attr);
+               device_remove_file(dev, &sda_temp_max_hyst[i].dev_attr);
+               device_remove_file(dev, &sda_temp_alarm[i].dev_attr);
+               device_remove_file(dev, &sda_temp_type[i].dev_attr);
+       }
 
        device_remove_file(dev, &dev_attr_name);
        device_remove_file(dev, &dev_attr_cpu0_vid);
        for (i = 0; i < 2; i++) {
                tmp = w83627ehf_read_value(data,
                                           W83627EHF_REG_TEMP_CONFIG[i]);
+               if ((i == 1) && data->temp3_disable)
+                       continue;
                if (tmp & 0x01)
                        w83627ehf_write_value(data,
                                              W83627EHF_REG_TEMP_CONFIG[i],
        /* 667HG has 3 pwms */
        data->pwm_num = (sio_data->kind == w83667hg) ? 3 : 4;
 
+       /* Check temp3 configuration bit for 667HG */
+       if (sio_data->kind == w83667hg) {
+               data->temp3_disable = w83627ehf_read_value(data,
+                                       W83627EHF_REG_TEMP_CONFIG[1]) & 0x01;
+               data->in6_skip = !data->temp3_disable;
+       }
+
        /* Initialize the chip */
        w83627ehf_init_device(data);
 
                                goto exit_remove;
                }
 
-       for (i = 0; i < data->in_num; i++)
+       for (i = 0; i < data->in_num; i++) {
+               if ((i == 6) && data->in6_skip)
+                       continue;
                if ((err = device_create_file(dev, &sda_in_input[i].dev_attr))
                        || (err = device_create_file(dev,
                                &sda_in_alarm[i].dev_attr))
                        || (err = device_create_file(dev,
                                &sda_in_max[i].dev_attr)))
                        goto exit_remove;
+       }
 
        for (i = 0; i < 5; i++) {
                if (data->has_fan & (1 << i)) {
                }
        }
 
-       for (i = 0; i < ARRAY_SIZE(sda_temp); i++)
-               if ((err = device_create_file(dev, &sda_temp[i].dev_attr)))
+       for (i = 0; i < 3; i++) {
+               if ((i == 2) && data->temp3_disable)
+                       continue;
+               if ((err = device_create_file(dev,
+                               &sda_temp_input[i].dev_attr))
+                       || (err = device_create_file(dev,
+                               &sda_temp_max[i].dev_attr))
+                       || (err = device_create_file(dev,
+                               &sda_temp_max_hyst[i].dev_attr))
+                       || (err = device_create_file(dev,
+                               &sda_temp_alarm[i].dev_attr))
+                       || (err = device_create_file(dev,
+                               &sda_temp_type[i].dev_attr)))
                        goto exit_remove;
+       }
 
        err = device_create_file(dev, &dev_attr_name);
        if (err)