|
@@ -21,6 +21,7 @@
|
|
|
* IT8721F Super I/O chip w/LPC interface
|
|
|
* IT8726F Super I/O chip w/LPC interface
|
|
|
* IT8728F Super I/O chip w/LPC interface
|
|
|
+ * IT8732F Super I/O chip w/LPC interface
|
|
|
* IT8758E Super I/O chip w/LPC interface
|
|
|
* IT8771E Super I/O chip w/LPC interface
|
|
|
* IT8772E Super I/O chip w/LPC interface
|
|
@@ -69,8 +70,9 @@
|
|
|
|
|
|
#define DRVNAME "it87"
|
|
|
|
|
|
-enum chips { it87, it8712, it8716, it8718, it8720, it8721, it8728, it8771,
|
|
|
- it8772, it8781, it8782, it8783, it8786, it8790, it8603, it8620 };
|
|
|
+enum chips { it87, it8712, it8716, it8718, it8720, it8721, it8728, it8732,
|
|
|
+ it8771, it8772, it8781, it8782, it8783, it8786, it8790, it8603,
|
|
|
+ it8620 };
|
|
|
|
|
|
static unsigned short force_id;
|
|
|
module_param(force_id, ushort, 0);
|
|
@@ -148,6 +150,7 @@ static inline void superio_exit(void)
|
|
|
#define IT8721F_DEVID 0x8721
|
|
|
#define IT8726F_DEVID 0x8726
|
|
|
#define IT8728F_DEVID 0x8728
|
|
|
+#define IT8732F_DEVID 0x8732
|
|
|
#define IT8771E_DEVID 0x8771
|
|
|
#define IT8772E_DEVID 0x8772
|
|
|
#define IT8781F_DEVID 0x8781
|
|
@@ -265,6 +268,7 @@ struct it87_devices {
|
|
|
#define FEAT_VID (1 << 9) /* Set if chip supports VID */
|
|
|
#define FEAT_IN7_INTERNAL (1 << 10) /* Set if in7 is internal */
|
|
|
#define FEAT_SIX_FANS (1 << 11) /* Supports six fans */
|
|
|
+#define FEAT_10_9MV_ADC (1 << 12)
|
|
|
|
|
|
static const struct it87_devices it87_devices[] = {
|
|
|
[it87] = {
|
|
@@ -315,6 +319,15 @@ static const struct it87_devices it87_devices[] = {
|
|
|
| FEAT_IN7_INTERNAL,
|
|
|
.peci_mask = 0x07,
|
|
|
},
|
|
|
+ [it8732] = {
|
|
|
+ .name = "it8732",
|
|
|
+ .suffix = "F",
|
|
|
+ .features = FEAT_NEWER_AUTOPWM | FEAT_16BIT_FANS
|
|
|
+ | FEAT_TEMP_OFFSET | FEAT_TEMP_OLD_PECI | FEAT_TEMP_PECI
|
|
|
+ | FEAT_10_9MV_ADC | FEAT_IN7_INTERNAL,
|
|
|
+ .peci_mask = 0x07,
|
|
|
+ .old_peci_mask = 0x02, /* Actually reports PCH */
|
|
|
+ },
|
|
|
[it8771] = {
|
|
|
.name = "it8771",
|
|
|
.suffix = "E",
|
|
@@ -391,6 +404,7 @@ static const struct it87_devices it87_devices[] = {
|
|
|
|
|
|
#define has_16bit_fans(data) ((data)->features & FEAT_16BIT_FANS)
|
|
|
#define has_12mv_adc(data) ((data)->features & FEAT_12MV_ADC)
|
|
|
+#define has_10_9mv_adc(data) ((data)->features & FEAT_10_9MV_ADC)
|
|
|
#define has_newer_autopwm(data) ((data)->features & FEAT_NEWER_AUTOPWM)
|
|
|
#define has_old_autopwm(data) ((data)->features & FEAT_OLD_AUTOPWM)
|
|
|
#define has_temp_offset(data) ((data)->features & FEAT_TEMP_OFFSET)
|
|
@@ -475,7 +489,14 @@ struct it87_data {
|
|
|
|
|
|
static int adc_lsb(const struct it87_data *data, int nr)
|
|
|
{
|
|
|
- int lsb = has_12mv_adc(data) ? 12 : 16;
|
|
|
+ int lsb;
|
|
|
+
|
|
|
+ if (has_12mv_adc(data))
|
|
|
+ lsb = 120;
|
|
|
+ else if (has_10_9mv_adc(data))
|
|
|
+ lsb = 109;
|
|
|
+ else
|
|
|
+ lsb = 160;
|
|
|
if (data->in_scaled & (1 << nr))
|
|
|
lsb <<= 1;
|
|
|
return lsb;
|
|
@@ -483,13 +504,13 @@ static int adc_lsb(const struct it87_data *data, int nr)
|
|
|
|
|
|
static u8 in_to_reg(const struct it87_data *data, int nr, long val)
|
|
|
{
|
|
|
- val = DIV_ROUND_CLOSEST(val, adc_lsb(data, nr));
|
|
|
+ val = DIV_ROUND_CLOSEST(val * 10, adc_lsb(data, nr));
|
|
|
return clamp_val(val, 0, 255);
|
|
|
}
|
|
|
|
|
|
static int in_from_reg(const struct it87_data *data, int nr, int val)
|
|
|
{
|
|
|
- return val * adc_lsb(data, nr);
|
|
|
+ return DIV_ROUND_CLOSEST(val * adc_lsb(data, nr), 10);
|
|
|
}
|
|
|
|
|
|
static inline u8 FAN_TO_REG(long rpm, int div)
|
|
@@ -1515,9 +1536,14 @@ static ssize_t show_label(struct device *dev, struct device_attribute *attr,
|
|
|
};
|
|
|
struct it87_data *data = dev_get_drvdata(dev);
|
|
|
int nr = to_sensor_dev_attr(attr)->index;
|
|
|
+ const char *label;
|
|
|
|
|
|
- return sprintf(buf, "%s\n", has_12mv_adc(data) ? labels_it8721[nr]
|
|
|
- : labels[nr]);
|
|
|
+ if (has_12mv_adc(data) || has_10_9mv_adc(data))
|
|
|
+ label = labels_it8721[nr];
|
|
|
+ else
|
|
|
+ label = labels[nr];
|
|
|
+
|
|
|
+ return sprintf(buf, "%s\n", label);
|
|
|
}
|
|
|
static SENSOR_DEVICE_ATTR(in3_label, S_IRUGO, show_label, NULL, 0);
|
|
|
static SENSOR_DEVICE_ATTR(in7_label, S_IRUGO, show_label, NULL, 1);
|
|
@@ -1853,6 +1879,9 @@ static int __init it87_find(unsigned short *address,
|
|
|
case IT8728F_DEVID:
|
|
|
sio_data->type = it8728;
|
|
|
break;
|
|
|
+ case IT8732F_DEVID:
|
|
|
+ sio_data->type = it8732;
|
|
|
+ break;
|
|
|
case IT8771E_DEVID:
|
|
|
sio_data->type = it8771;
|
|
|
break;
|