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>

authored by amy.shih and committed by Guenter Roeck 6bbfdcbc b428db1e

+20 -2
+20 -2
drivers/hwmon/nct7904.c
··· 99 u8 enable_dts; 100 u8 has_dts; 101 u8 temp_mode; /* 0: TR mode, 1: TD mode */ 102 }; 103 104 /* Access functions */ ··· 216 SMI_STS5_REG + (channel >> 3)); 217 if (ret < 0) 218 return ret; 219 - *val = (ret >> (channel & 0x07)) & 1; 220 return 0; 221 default: 222 return -EOPNOTSUPP; ··· 308 SMI_STS1_REG + (index >> 3)); 309 if (ret < 0) 310 return ret; 311 - *val = (ret >> (index & 0x07)) & 1; 312 return 0; 313 default: 314 return -EOPNOTSUPP;
··· 99 u8 enable_dts; 100 u8 has_dts; 101 u8 temp_mode; /* 0: TR mode, 1: TD mode */ 102 + u8 fan_alarm[2]; 103 + u8 vsen_alarm[3]; 104 }; 105 106 /* Access functions */ ··· 214 SMI_STS5_REG + (channel >> 3)); 215 if (ret < 0) 216 return ret; 217 + if (!data->fan_alarm[channel >> 3]) 218 + data->fan_alarm[channel >> 3] = ret & 0xff; 219 + else 220 + /* If there is new alarm showing up */ 221 + data->fan_alarm[channel >> 3] |= (ret & 0xff); 222 + *val = (data->fan_alarm[channel >> 3] >> (channel & 0x07)) & 1; 223 + /* Needs to clean the alarm if alarm existing */ 224 + if (*val) 225 + data->fan_alarm[channel >> 3] ^= 1 << (channel & 0x07); 226 return 0; 227 default: 228 return -EOPNOTSUPP; ··· 298 SMI_STS1_REG + (index >> 3)); 299 if (ret < 0) 300 return ret; 301 + if (!data->vsen_alarm[index >> 3]) 302 + data->vsen_alarm[index >> 3] = ret & 0xff; 303 + else 304 + /* If there is new alarm showing up */ 305 + data->vsen_alarm[index >> 3] |= (ret & 0xff); 306 + *val = (data->vsen_alarm[index >> 3] >> (index & 0x07)) & 1; 307 + /* Needs to clean the alarm if alarm existing */ 308 + if (*val) 309 + data->vsen_alarm[index >> 3] ^= 1 << (index & 0x07); 310 return 0; 311 default: 312 return -EOPNOTSUPP;