Commit c7f5d7ed authored by Jean Delvare's avatar Jean Delvare Committed by Greg Kroah-Hartman

[PATCH] w83781d: Use real-time status registers

Use the real-time status registers of the Winbond W83782D, W83783S and
W83627HF chips, instead of the interrupt status registers. Interrupts
cannot be trusted at least for voltage inputs, as they are two-times
triggers (as opposed to comparator mode, which we want.) The w83627hf
driver was fixed in a similar way some times ago.
Signed-off-by: default avatarJean Delvare <khali@linux-fr.org>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent e3efa5a7
...@@ -95,11 +95,16 @@ MODULE_PARM_DESC(init, "Set to zero to bypass chip initialization"); ...@@ -95,11 +95,16 @@ MODULE_PARM_DESC(init, "Set to zero to bypass chip initialization");
(0x39))) (0x39)))
#define W83781D_REG_CONFIG 0x40 #define W83781D_REG_CONFIG 0x40
/* Interrupt status (W83781D, AS99127F) */
#define W83781D_REG_ALARM1 0x41 #define W83781D_REG_ALARM1 0x41
#define W83781D_REG_ALARM2 0x42 #define W83781D_REG_ALARM2 0x42
#define W83781D_REG_ALARM3 0x450 /* not on W83781D */
#define W83781D_REG_IRQ 0x4C /* Real-time status (W83782D, W83783S, W83627HF) */
#define W83782D_REG_ALARM1 0x459
#define W83782D_REG_ALARM2 0x45A
#define W83782D_REG_ALARM3 0x45B
#define W83781D_REG_BEEP_CONFIG 0x4D #define W83781D_REG_BEEP_CONFIG 0x4D
#define W83781D_REG_BEEP_INTS1 0x56 #define W83781D_REG_BEEP_INTS1 0x56
#define W83781D_REG_BEEP_INTS2 0x57 #define W83781D_REG_BEEP_INTS2 0x57
...@@ -1513,15 +1518,6 @@ w83781d_init_client(struct i2c_client *client) ...@@ -1513,15 +1518,6 @@ w83781d_init_client(struct i2c_client *client)
W83781D_REG_TEMP3_CONFIG, tmp & 0xfe); W83781D_REG_TEMP3_CONFIG, tmp & 0xfe);
} }
} }
if (type != w83781d) {
/* enable comparator mode for temp2 and temp3 so
alarm indication will work correctly */
i = w83781d_read_value(client, W83781D_REG_IRQ);
if (!(i & 0x40))
w83781d_write_value(client, W83781D_REG_IRQ,
i | 0x40);
}
} }
/* Start monitoring */ /* Start monitoring */
...@@ -1612,14 +1608,25 @@ static struct w83781d_data *w83781d_update_device(struct device *dev) ...@@ -1612,14 +1608,25 @@ static struct w83781d_data *w83781d_update_device(struct device *dev)
data->fan_div[1] |= (i >> 4) & 0x04; data->fan_div[1] |= (i >> 4) & 0x04;
data->fan_div[2] |= (i >> 5) & 0x04; data->fan_div[2] |= (i >> 5) & 0x04;
} }
data->alarms =
w83781d_read_value(client,
W83781D_REG_ALARM1) +
(w83781d_read_value(client, W83781D_REG_ALARM2) << 8);
if ((data->type == w83782d) || (data->type == w83627hf)) { if ((data->type == w83782d) || (data->type == w83627hf)) {
data->alarms |= data->alarms = w83781d_read_value(client,
w83781d_read_value(client, W83782D_REG_ALARM1)
W83781D_REG_ALARM3) << 16; | (w83781d_read_value(client,
W83782D_REG_ALARM2) << 8)
| (w83781d_read_value(client,
W83782D_REG_ALARM3) << 16);
} else if (data->type == w83783s) {
data->alarms = w83781d_read_value(client,
W83782D_REG_ALARM1)
| (w83781d_read_value(client,
W83782D_REG_ALARM2) << 8);
} else {
/* No real-time status registers, fall back to
interrupt status registers */
data->alarms = w83781d_read_value(client,
W83781D_REG_ALARM1)
| (w83781d_read_value(client,
W83781D_REG_ALARM2) << 8);
} }
i = w83781d_read_value(client, W83781D_REG_BEEP_INTS2); i = w83781d_read_value(client, W83781D_REG_BEEP_INTS2);
data->beep_enable = i >> 7; data->beep_enable = i >> 7;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment