summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoramy.shih <amy.shih@advantech.com.tw>2019-09-18 23:02:05 -0400
committerGuenter Roeck <linux@roeck-us.net>2019-10-02 09:42:48 -0400
commit6bbfdcbc8e459acda67e32f520f7ecddc391afe9 (patch)
treed6c957c6cde720b744d719bed82b116852956470
parentb428db1e880d5f0f1cc22009974bee38a095284e (diff)
hwmon: (nct7904) Add array fan_alarm and vsen_alarm to store the alarms in nct7904_data struct.
SMI# interrupt for fan and voltage is Two-Times Interrupt Mode. Fan or voltage exceeds high limit or going below low limit, it will causes an interrupt if the previous interrupt has been reset by reading all the interrupt Status Register. Thus, add the array fan_alarm and vsen_alarm to store the alarms for all of the fan and voltage sensors. Signed-off-by: amy.shih <amy.shih@advantech.com.tw> Link: https://lore.kernel.org/r/20190919030205.11440-1-Amy.Shih@advantech.com.tw Fixes: 486842db3b79 ("hwmon: (nct7904) Add extra sysfs support for fan, voltage and temperature.") Signed-off-by: Guenter Roeck <linux@roeck-us.net>
-rw-r--r--drivers/hwmon/nct7904.c22
1 files changed, 20 insertions, 2 deletions
diff --git a/drivers/hwmon/nct7904.c b/drivers/hwmon/nct7904.c
index f62dd1882451..b26419dbe840 100644
--- a/drivers/hwmon/nct7904.c
+++ b/drivers/hwmon/nct7904.c
@@ -99,6 +99,8 @@ struct nct7904_data {
99 u8 enable_dts; 99 u8 enable_dts;
100 u8 has_dts; 100 u8 has_dts;
101 u8 temp_mode; /* 0: TR mode, 1: TD mode */ 101 u8 temp_mode; /* 0: TR mode, 1: TD mode */
102 u8 fan_alarm[2];
103 u8 vsen_alarm[3];
102}; 104};
103 105
104/* Access functions */ 106/* Access functions */
@@ -214,7 +216,15 @@ static int nct7904_read_fan(struct device *dev, u32 attr, int channel,
214 SMI_STS5_REG + (channel >> 3)); 216 SMI_STS5_REG + (channel >> 3));
215 if (ret < 0) 217 if (ret < 0)
216 return ret; 218 return ret;
217 *val = (ret >> (channel & 0x07)) & 1; 219 if (!data->fan_alarm[channel >> 3])
220 data->fan_alarm[channel >> 3] = ret & 0xff;
221 else
222 /* If there is new alarm showing up */
223 data->fan_alarm[channel >> 3] |= (ret & 0xff);
224 *val = (data->fan_alarm[channel >> 3] >> (channel & 0x07)) & 1;
225 /* Needs to clean the alarm if alarm existing */
226 if (*val)
227 data->fan_alarm[channel >> 3] ^= 1 << (channel & 0x07);
218 return 0; 228 return 0;
219 default: 229 default:
220 return -EOPNOTSUPP; 230 return -EOPNOTSUPP;
@@ -298,7 +308,15 @@ static int nct7904_read_in(struct device *dev, u32 attr, int channel,
298 SMI_STS1_REG + (index >> 3)); 308 SMI_STS1_REG + (index >> 3));
299 if (ret < 0) 309 if (ret < 0)
300 return ret; 310 return ret;
301 *val = (ret >> (index & 0x07)) & 1; 311 if (!data->vsen_alarm[index >> 3])
312 data->vsen_alarm[index >> 3] = ret & 0xff;
313 else
314 /* If there is new alarm showing up */
315 data->vsen_alarm[index >> 3] |= (ret & 0xff);
316 *val = (data->vsen_alarm[index >> 3] >> (index & 0x07)) & 1;
317 /* Needs to clean the alarm if alarm existing */
318 if (*val)
319 data->vsen_alarm[index >> 3] ^= 1 << (index & 0x07);
302 return 0; 320 return 0;
303 default: 321 default:
304 return -EOPNOTSUPP; 322 return -EOPNOTSUPP;