Message ID | 20190919030205.11440-1-Amy.Shih@advantech.com.tw (mailing list archive) |
---|---|
State | Accepted |
Headers | show |
Series | [v1,1/1] hwmon: (nct7904) Add array fan_alarm and vsen_alarm to store the alarms in nct7904_data struct. | expand |
On Thu, Sep 19, 2019 at 11:02:05AM +0800, Amy.Shih@advantech.com.tw wrote: > From: "amy.shih" <amy.shih@advantech.com.tw> > > 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> Applied. Thanks, Guenter > --- > drivers/hwmon/nct7904.c | 22 ++++++++++++++++++++-- > 1 file 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 { > u8 enable_dts; > u8 has_dts; > u8 temp_mode; /* 0: TR mode, 1: TD mode */ > + u8 fan_alarm[2]; > + u8 vsen_alarm[3]; > }; > > /* Access functions */ > @@ -214,7 +216,15 @@ static int nct7904_read_fan(struct device *dev, u32 attr, int channel, > SMI_STS5_REG + (channel >> 3)); > if (ret < 0) > return ret; > - *val = (ret >> (channel & 0x07)) & 1; > + if (!data->fan_alarm[channel >> 3]) > + data->fan_alarm[channel >> 3] = ret & 0xff; > + else > + /* If there is new alarm showing up */ > + data->fan_alarm[channel >> 3] |= (ret & 0xff); > + *val = (data->fan_alarm[channel >> 3] >> (channel & 0x07)) & 1; > + /* Needs to clean the alarm if alarm existing */ > + if (*val) > + data->fan_alarm[channel >> 3] ^= 1 << (channel & 0x07); > return 0; > default: > return -EOPNOTSUPP; > @@ -298,7 +308,15 @@ static int nct7904_read_in(struct device *dev, u32 attr, int channel, > SMI_STS1_REG + (index >> 3)); > if (ret < 0) > return ret; > - *val = (ret >> (index & 0x07)) & 1; > + if (!data->vsen_alarm[index >> 3]) > + data->vsen_alarm[index >> 3] = ret & 0xff; > + else > + /* If there is new alarm showing up */ > + data->vsen_alarm[index >> 3] |= (ret & 0xff); > + *val = (data->vsen_alarm[index >> 3] >> (index & 0x07)) & 1; > + /* Needs to clean the alarm if alarm existing */ > + if (*val) > + data->vsen_alarm[index >> 3] ^= 1 << (index & 0x07); > return 0; > default: > return -EOPNOTSUPP;
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 { u8 enable_dts; u8 has_dts; u8 temp_mode; /* 0: TR mode, 1: TD mode */ + u8 fan_alarm[2]; + u8 vsen_alarm[3]; }; /* Access functions */ @@ -214,7 +216,15 @@ static int nct7904_read_fan(struct device *dev, u32 attr, int channel, SMI_STS5_REG + (channel >> 3)); if (ret < 0) return ret; - *val = (ret >> (channel & 0x07)) & 1; + if (!data->fan_alarm[channel >> 3]) + data->fan_alarm[channel >> 3] = ret & 0xff; + else + /* If there is new alarm showing up */ + data->fan_alarm[channel >> 3] |= (ret & 0xff); + *val = (data->fan_alarm[channel >> 3] >> (channel & 0x07)) & 1; + /* Needs to clean the alarm if alarm existing */ + if (*val) + data->fan_alarm[channel >> 3] ^= 1 << (channel & 0x07); return 0; default: return -EOPNOTSUPP; @@ -298,7 +308,15 @@ static int nct7904_read_in(struct device *dev, u32 attr, int channel, SMI_STS1_REG + (index >> 3)); if (ret < 0) return ret; - *val = (ret >> (index & 0x07)) & 1; + if (!data->vsen_alarm[index >> 3]) + data->vsen_alarm[index >> 3] = ret & 0xff; + else + /* If there is new alarm showing up */ + data->vsen_alarm[index >> 3] |= (ret & 0xff); + *val = (data->vsen_alarm[index >> 3] >> (index & 0x07)) & 1; + /* Needs to clean the alarm if alarm existing */ + if (*val) + data->vsen_alarm[index >> 3] ^= 1 << (index & 0x07); return 0; default: return -EOPNOTSUPP;