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

Changed files
+20 -2
drivers
hwmon
+20 -2
drivers/hwmon/nct7904.c
··· 99 99 u8 enable_dts; 100 100 u8 has_dts; 101 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 106 /* Access functions */ ··· 216 214 SMI_STS5_REG + (channel >> 3)); 217 215 if (ret < 0) 218 216 return ret; 219 - *val = (ret >> (channel & 0x07)) & 1; 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); 220 226 return 0; 221 227 default: 222 228 return -EOPNOTSUPP; ··· 308 298 SMI_STS1_REG + (index >> 3)); 309 299 if (ret < 0) 310 300 return ret; 311 - *val = (ret >> (index & 0x07)) & 1; 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); 312 310 return 0; 313 311 default: 314 312 return -EOPNOTSUPP;