diff options
-rw-r--r-- | drivers/hwmon/w83795.c | 23 |
1 files changed, 20 insertions, 3 deletions
diff --git a/drivers/hwmon/w83795.c b/drivers/hwmon/w83795.c index 400558d97f3d..600b2adbbd49 100644 --- a/drivers/hwmon/w83795.c +++ b/drivers/hwmon/w83795.c | |||
@@ -165,10 +165,11 @@ static const u8 IN_LSB_SHIFT_IDX[][2] = { | |||
165 | 165 | ||
166 | #define W83795_REG_VID_CTRL 0x6A | 166 | #define W83795_REG_VID_CTRL 0x6A |
167 | 167 | ||
168 | #define W83795_REG_ALARM_CTRL 0x40 | ||
169 | #define ALARM_CTRL_RTSACS (1 << 7) | ||
168 | #define W83795_REG_ALARM(index) (0x41 + (index)) | 170 | #define W83795_REG_ALARM(index) (0x41 + (index)) |
169 | #define W83795_REG_BEEP(index) (0x50 + (index)) | ||
170 | |||
171 | #define W83795_REG_CLR_CHASSIS 0x4D | 171 | #define W83795_REG_CLR_CHASSIS 0x4D |
172 | #define W83795_REG_BEEP(index) (0x50 + (index)) | ||
172 | 173 | ||
173 | 174 | ||
174 | #define W83795_REG_FCMS1 0x201 | 175 | #define W83795_REG_FCMS1 0x201 |
@@ -585,6 +586,7 @@ static struct w83795_data *w83795_update_device(struct device *dev) | |||
585 | struct i2c_client *client = to_i2c_client(dev); | 586 | struct i2c_client *client = to_i2c_client(dev); |
586 | struct w83795_data *data = i2c_get_clientdata(client); | 587 | struct w83795_data *data = i2c_get_clientdata(client); |
587 | u16 tmp; | 588 | u16 tmp; |
589 | u8 intrusion; | ||
588 | int i; | 590 | int i; |
589 | 591 | ||
590 | mutex_lock(&data->update_lock); | 592 | mutex_lock(&data->update_lock); |
@@ -656,9 +658,24 @@ static struct w83795_data *w83795_update_device(struct device *dev) | |||
656 | w83795_read(client, W83795_REG_PWM(i, PWM_OUTPUT)); | 658 | w83795_read(client, W83795_REG_PWM(i, PWM_OUTPUT)); |
657 | } | 659 | } |
658 | 660 | ||
659 | /* update alarm */ | 661 | /* Update intrusion and alarms |
662 | * It is important to read intrusion first, because reading from | ||
663 | * register SMI STS6 clears the interrupt status temporarily. */ | ||
664 | tmp = w83795_read(client, W83795_REG_ALARM_CTRL); | ||
665 | /* Switch to interrupt status for intrusion if needed */ | ||
666 | if (tmp & ALARM_CTRL_RTSACS) | ||
667 | w83795_write(client, W83795_REG_ALARM_CTRL, | ||
668 | tmp & ~ALARM_CTRL_RTSACS); | ||
669 | intrusion = w83795_read(client, W83795_REG_ALARM(5)) & (1 << 6); | ||
670 | /* Switch to real-time alarms */ | ||
671 | w83795_write(client, W83795_REG_ALARM_CTRL, tmp | ALARM_CTRL_RTSACS); | ||
660 | for (i = 0; i < ARRAY_SIZE(data->alarms); i++) | 672 | for (i = 0; i < ARRAY_SIZE(data->alarms); i++) |
661 | data->alarms[i] = w83795_read(client, W83795_REG_ALARM(i)); | 673 | data->alarms[i] = w83795_read(client, W83795_REG_ALARM(i)); |
674 | data->alarms[5] |= intrusion; | ||
675 | /* Restore original configuration if needed */ | ||
676 | if (!(tmp & ALARM_CTRL_RTSACS)) | ||
677 | w83795_write(client, W83795_REG_ALARM_CTRL, | ||
678 | tmp & ~ALARM_CTRL_RTSACS); | ||
662 | 679 | ||
663 | data->last_updated = jiffies; | 680 | data->last_updated = jiffies; |
664 | data->valid = 1; | 681 | data->valid = 1; |