All of lore.kernel.org
 help / color / mirror / Atom feed
From: Wei Ni <wni-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
To: Jean Delvare <khali-PUYAD+kWke1g9hUCZPvPmw@public.gmane.org>
Cc: Guenter Roeck <linux-0h96xk9xTtrk1uMJSBkQmQ@public.gmane.org>,
	"thierry.reding-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org"
	<thierry.reding-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>,
	"lm-sensors-GZX6beZjE8VD60Wz+7aTrA@public.gmane.org"
	<lm-sensors-GZX6beZjE8VD60Wz+7aTrA@public.gmane.org>,
	"linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org"
	<linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org>,
	"linux-tegra-u79uwXL29TY76Z2rM5mHXA@public.gmane.org"
	<linux-tegra-u79uwXL29TY76Z2rM5mHXA@public.gmane.org>
Subject: Re: [PATCH v3 2/4] hwmon: (lm90) use macro defines for the status bit
Date: Wed, 17 Jul 2013 15:03:35 +0800	[thread overview]
Message-ID: <51E641C7.4000107@nvidia.com> (raw)
In-Reply-To: <20130715185727.4ebde8c4-R0o5gVi9kd7kN2dkZ6Wm7A@public.gmane.org>

On 07/16/2013 12:57 AM, Jean Delvare wrote:
> Hi Wei, Guenter,
> 
> On Fri, 12 Jul 2013 15:48:05 +0800, Wei Ni wrote:
>> Add bit defines for the status register.
> 
> Regarding the subject: for me these are constants, not macros. AFAIK
> the term "macro" refers to defines with parameters only.

How about "Introduce status bits"

> 
>> Signed-off-by: Wei Ni <wni-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
>> ---
>>  drivers/hwmon/lm90.c |   72 ++++++++++++++++++++++++++++++++++----------------
>>  1 file changed, 49 insertions(+), 23 deletions(-)
>>
>> diff --git a/drivers/hwmon/lm90.c b/drivers/hwmon/lm90.c
>> index 5f30f90..c90037f 100644
>> --- a/drivers/hwmon/lm90.c
>> +++ b/drivers/hwmon/lm90.c
>> @@ -179,6 +179,19 @@ enum chips { lm90, adm1032, lm99, lm86, max6657, max6659, adt7461, max6680,
>>  #define LM90_HAVE_TEMP3		(1 << 6) /* 3rd temperature sensor	*/
>>  #define LM90_HAVE_BROKEN_ALERT	(1 << 7) /* Broken alert		*/
>>  
>> +/* LM90 status */
>> +#define LM90_STATUS_LTHRM	(1 << 0) /* local THERM limit tripped */
>> +#define LM90_STATUS_RTHRM	(1 << 1) /* remote THERM limit tripped */
>> +#define LM90_STATUS_OPEN	(1 << 2) /* remote is an open circuit */
>> +#define LM90_STATUS_RLOW	(1 << 3) /* remote low temp limit tripped */
>> +#define LM90_STATUS_RHIGH	(1 << 4) /* remote high temp limit tripped */
>> +#define LM90_STATUS_LLOW	(1 << 5) /* local low temp limit tripped */
>> +#define LM90_STATUS_LHIGH	(1 << 6) /* local high temp limit tripped */
>> +#define LM90_STATUS_BUSY	(1 << 7) /* ADC is converting */
> 
> LM90_STATUS_BUSY is never used anywhere so please don't define it.

Ok, I will remove it.

> 
>> +
>> +#define MAX6696_STATUS2_RLOW	(1 << 3) /* remote2 low temp limit tripped */
>> +#define MAX6696_STATUS2_RHIGH	(1 << 4) /* remote2 high temp limit tripped */
>> +
>>  /*
>>   * Driver data (common to all clients)
>>   */
>> @@ -1417,6 +1430,36 @@ static void lm90_init_client(struct i2c_client *client)
>>  		i2c_smbus_write_byte_data(client, LM90_REG_W_CONFIG1, config);
>>  }
>>  
>> +static bool lm90_is_tripped(struct i2c_client *client)
>> +{
>> +	struct lm90_data *data = i2c_get_clientdata(client);
>> +	u8 status, status2 = 0;
>> +
>> +	lm90_read_reg(client, LM90_REG_R_STATUS, &status);
>> +
>> +	if (data->kind == max6696)
>> +		lm90_read_reg(client, MAX6696_REG_R_STATUS2, &status2);
>> +
>> +	if ((status & 0x7f) == 0 && (status2 & 0xfe) == 0)
>> +		return false;
> 
> It's a bit disappointing to not use the freshly introduced constants.
> That being said I agree it would make the code hard to read, so you can
> leave it as is.

Sorry, I forgot it.
How about to define:
#define LM90_STATUS_MASK 0x7f
#define MAX6696_STATUS2 0xfe

Or since Guenter is for vacation, I can just leave it as is, and wait
him back to talk about below issue.

> 
> Unrelated to this patch, but Guenter, I am worried about the MAX6696
> handling here. I realize that I am the one who accepted your code, but
> now it looks wrong. Specifically:
> * We check for (status2 & 0xfe) i.e. 7 alarm bits, but the code below
>   only reports 2 alarms bits. So if any of the 5 other alarm bits in
>   STATUS2 are, we may return true (chip is tripped) but not print the
>   cause.
> * At least bits 1 and 2 of STATUS 2 fit totally fine in the driver as
>   it currently exists, so I can't think of any reason for not handling
>   them. Why are we not? Ideally we should print a message for every
>   alarm bit so that we never return "true" without printing a message.
>   Even though OT2 limits aren't handled by the driver...
> * If you think this piece of code shouldn't deal with OT/THERM limits
>   because they do not trigger an SMBus alarm, this can be discussed,
>   but all chips should be handled the same in this respect then.
> * Why in the first place is max6696's data->alert_alarms set to 0x187c
>   and not 0x1c7c? Including 1OPEN but not 2OPEN makes no sense.
> 
>> +
>> +	if (status & (LM90_STATUS_LLOW | LM90_STATUS_LHIGH | LM90_STATUS_LTHRM))
>> +		dev_warn(&client->dev,
>> +			 "temp%d out of range, please check!\n", 1);
>> +	if (status & (LM90_STATUS_RLOW | LM90_STATUS_RHIGH | LM90_STATUS_RTHRM))
>> +		dev_warn(&client->dev,
>> +			 "temp%d out of range, please check!\n", 2);
>> +	if (status & LM90_STATUS_OPEN)
>> +		dev_warn(&client->dev,
>> +			 "temp%d diode open, please check!\n", 2);
>> +
>> +	if (status2 & (MAX6696_STATUS2_RLOW | MAX6696_STATUS2_RHIGH))
>> +		dev_warn(&client->dev,
>> +			 "temp%d out of range, please check!\n", 3);
>> +
>> +	return true;
>> +}
>> +
>>  static int lm90_probe(struct i2c_client *client,
>>  		      const struct i2c_device_id *id)
>>  {
>> @@ -1515,36 +1558,19 @@ static int lm90_remove(struct i2c_client *client)
>>  
>>  static void lm90_alert(struct i2c_client *client, unsigned int flag)
>>  {
>> -	struct lm90_data *data = i2c_get_clientdata(client);
>> -	u8 config, alarms, alarms2 = 0;
>> -
>> -	lm90_read_reg(client, LM90_REG_R_STATUS, &alarms);
>> -
>> -	if (data->kind == max6696)
>> -		lm90_read_reg(client, MAX6696_REG_R_STATUS2, &alarms2);
>> -
>> -	if ((alarms & 0x7f) == 0 && (alarms2 & 0xfe) == 0) {
>> +	if (!lm90_is_tripped(client)) {
> 
> You could swap the success and failure cases to avoid this negation.

Yes, I will change it.

> 
>>  		dev_info(&client->dev, "Everything OK\n");
>>  	} else {
>> -		if (alarms & 0x61)
>> -			dev_warn(&client->dev,
>> -				 "temp%d out of range, please check!\n", 1);
>> -		if (alarms & 0x1a)
>> -			dev_warn(&client->dev,
>> -				 "temp%d out of range, please check!\n", 2);
>> -		if (alarms & 0x04)
>> -			dev_warn(&client->dev,
>> -				 "temp%d diode open, please check!\n", 2);
>> -
>> -		if (alarms2 & 0x18)
>> -			dev_warn(&client->dev,
>> -				 "temp%d out of range, please check!\n", 3);
>> -
>>  		/*
>>  		 * Disable ALERT# output, because these chips don't implement
>>  		 * SMBus alert correctly; they should only hold the alert line
>>  		 * low briefly.
>>  		 */
>> +		struct lm90_data *data = i2c_get_clientdata(client);
>> +		u8 config, alarms;
>> +
>> +		lm90_read_reg(client, LM90_REG_R_STATUS, &alarms);
> 
> You end up reading LM90_REG_R_STATUS, which is not OK. This register
> contains self-clearing bits, so there is no guarantee that the second
> read will return the same value as the first read. You'll have to come
> up with a different approach that reads LM90_REG_R_STATUS only once.

Oh, yes, this is a problem, I didn't noticed it.
How about to use this:
bool lm90_alarms_tripped(*client, *status);
bool lm90_alarms2_tripped(*client, *status2);
So we can read the status only once and pass it.

> 
>> +
>>  		if ((data->flags & LM90_HAVE_BROKEN_ALERT)
>>  		 && (alarms & data->alert_alarms)) {
>>  			dev_dbg(&client->dev, "Disabling ALERT#\n");
> 
> 

WARNING: multiple messages have this Message-ID (diff)
From: Wei Ni <wni@nvidia.com>
To: Jean Delvare <khali-PUYAD+kWke1g9hUCZPvPmw@public.gmane.org>
Cc: Guenter Roeck <linux-0h96xk9xTtrk1uMJSBkQmQ@public.gmane.org>,
	"thierry.reding-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org"
	<thierry.reding-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>,
	"lm-sensors-GZX6beZjE8VD60Wz+7aTrA@public.gmane.org"
	<lm-sensors-GZX6beZjE8VD60Wz+7aTrA@public.gmane.org>,
	"linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org"
	<linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org>,
	"linux-tegra-u79uwXL29TY76Z2rM5mHXA@public.gmane.org"
	<linux-tegra-u79uwXL29TY76Z2rM5mHXA@public.gmane.org>
Subject: Re: [lm-sensors] [PATCH v3 2/4] hwmon: (lm90) use macro defines for the status bit
Date: Wed, 17 Jul 2013 07:03:35 +0000	[thread overview]
Message-ID: <51E641C7.4000107@nvidia.com> (raw)
In-Reply-To: <20130715185727.4ebde8c4-R0o5gVi9kd7kN2dkZ6Wm7A@public.gmane.org>

On 07/16/2013 12:57 AM, Jean Delvare wrote:
> Hi Wei, Guenter,
> 
> On Fri, 12 Jul 2013 15:48:05 +0800, Wei Ni wrote:
>> Add bit defines for the status register.
> 
> Regarding the subject: for me these are constants, not macros. AFAIK
> the term "macro" refers to defines with parameters only.

How about "Introduce status bits"

> 
>> Signed-off-by: Wei Ni <wni@nvidia.com>
>> ---
>>  drivers/hwmon/lm90.c |   72 ++++++++++++++++++++++++++++++++++----------------
>>  1 file changed, 49 insertions(+), 23 deletions(-)
>>
>> diff --git a/drivers/hwmon/lm90.c b/drivers/hwmon/lm90.c
>> index 5f30f90..c90037f 100644
>> --- a/drivers/hwmon/lm90.c
>> +++ b/drivers/hwmon/lm90.c
>> @@ -179,6 +179,19 @@ enum chips { lm90, adm1032, lm99, lm86, max6657, max6659, adt7461, max6680,
>>  #define LM90_HAVE_TEMP3		(1 << 6) /* 3rd temperature sensor	*/
>>  #define LM90_HAVE_BROKEN_ALERT	(1 << 7) /* Broken alert		*/
>>  
>> +/* LM90 status */
>> +#define LM90_STATUS_LTHRM	(1 << 0) /* local THERM limit tripped */
>> +#define LM90_STATUS_RTHRM	(1 << 1) /* remote THERM limit tripped */
>> +#define LM90_STATUS_OPEN	(1 << 2) /* remote is an open circuit */
>> +#define LM90_STATUS_RLOW	(1 << 3) /* remote low temp limit tripped */
>> +#define LM90_STATUS_RHIGH	(1 << 4) /* remote high temp limit tripped */
>> +#define LM90_STATUS_LLOW	(1 << 5) /* local low temp limit tripped */
>> +#define LM90_STATUS_LHIGH	(1 << 6) /* local high temp limit tripped */
>> +#define LM90_STATUS_BUSY	(1 << 7) /* ADC is converting */
> 
> LM90_STATUS_BUSY is never used anywhere so please don't define it.

Ok, I will remove it.

> 
>> +
>> +#define MAX6696_STATUS2_RLOW	(1 << 3) /* remote2 low temp limit tripped */
>> +#define MAX6696_STATUS2_RHIGH	(1 << 4) /* remote2 high temp limit tripped */
>> +
>>  /*
>>   * Driver data (common to all clients)
>>   */
>> @@ -1417,6 +1430,36 @@ static void lm90_init_client(struct i2c_client *client)
>>  		i2c_smbus_write_byte_data(client, LM90_REG_W_CONFIG1, config);
>>  }
>>  
>> +static bool lm90_is_tripped(struct i2c_client *client)
>> +{
>> +	struct lm90_data *data = i2c_get_clientdata(client);
>> +	u8 status, status2 = 0;
>> +
>> +	lm90_read_reg(client, LM90_REG_R_STATUS, &status);
>> +
>> +	if (data->kind = max6696)
>> +		lm90_read_reg(client, MAX6696_REG_R_STATUS2, &status2);
>> +
>> +	if ((status & 0x7f) = 0 && (status2 & 0xfe) = 0)
>> +		return false;
> 
> It's a bit disappointing to not use the freshly introduced constants.
> That being said I agree it would make the code hard to read, so you can
> leave it as is.

Sorry, I forgot it.
How about to define:
#define LM90_STATUS_MASK 0x7f
#define MAX6696_STATUS2 0xfe

Or since Guenter is for vacation, I can just leave it as is, and wait
him back to talk about below issue.

> 
> Unrelated to this patch, but Guenter, I am worried about the MAX6696
> handling here. I realize that I am the one who accepted your code, but
> now it looks wrong. Specifically:
> * We check for (status2 & 0xfe) i.e. 7 alarm bits, but the code below
>   only reports 2 alarms bits. So if any of the 5 other alarm bits in
>   STATUS2 are, we may return true (chip is tripped) but not print the
>   cause.
> * At least bits 1 and 2 of STATUS 2 fit totally fine in the driver as
>   it currently exists, so I can't think of any reason for not handling
>   them. Why are we not? Ideally we should print a message for every
>   alarm bit so that we never return "true" without printing a message.
>   Even though OT2 limits aren't handled by the driver...
> * If you think this piece of code shouldn't deal with OT/THERM limits
>   because they do not trigger an SMBus alarm, this can be discussed,
>   but all chips should be handled the same in this respect then.
> * Why in the first place is max6696's data->alert_alarms set to 0x187c
>   and not 0x1c7c? Including 1OPEN but not 2OPEN makes no sense.
> 
>> +
>> +	if (status & (LM90_STATUS_LLOW | LM90_STATUS_LHIGH | LM90_STATUS_LTHRM))
>> +		dev_warn(&client->dev,
>> +			 "temp%d out of range, please check!\n", 1);
>> +	if (status & (LM90_STATUS_RLOW | LM90_STATUS_RHIGH | LM90_STATUS_RTHRM))
>> +		dev_warn(&client->dev,
>> +			 "temp%d out of range, please check!\n", 2);
>> +	if (status & LM90_STATUS_OPEN)
>> +		dev_warn(&client->dev,
>> +			 "temp%d diode open, please check!\n", 2);
>> +
>> +	if (status2 & (MAX6696_STATUS2_RLOW | MAX6696_STATUS2_RHIGH))
>> +		dev_warn(&client->dev,
>> +			 "temp%d out of range, please check!\n", 3);
>> +
>> +	return true;
>> +}
>> +
>>  static int lm90_probe(struct i2c_client *client,
>>  		      const struct i2c_device_id *id)
>>  {
>> @@ -1515,36 +1558,19 @@ static int lm90_remove(struct i2c_client *client)
>>  
>>  static void lm90_alert(struct i2c_client *client, unsigned int flag)
>>  {
>> -	struct lm90_data *data = i2c_get_clientdata(client);
>> -	u8 config, alarms, alarms2 = 0;
>> -
>> -	lm90_read_reg(client, LM90_REG_R_STATUS, &alarms);
>> -
>> -	if (data->kind = max6696)
>> -		lm90_read_reg(client, MAX6696_REG_R_STATUS2, &alarms2);
>> -
>> -	if ((alarms & 0x7f) = 0 && (alarms2 & 0xfe) = 0) {
>> +	if (!lm90_is_tripped(client)) {
> 
> You could swap the success and failure cases to avoid this negation.

Yes, I will change it.

> 
>>  		dev_info(&client->dev, "Everything OK\n");
>>  	} else {
>> -		if (alarms & 0x61)
>> -			dev_warn(&client->dev,
>> -				 "temp%d out of range, please check!\n", 1);
>> -		if (alarms & 0x1a)
>> -			dev_warn(&client->dev,
>> -				 "temp%d out of range, please check!\n", 2);
>> -		if (alarms & 0x04)
>> -			dev_warn(&client->dev,
>> -				 "temp%d diode open, please check!\n", 2);
>> -
>> -		if (alarms2 & 0x18)
>> -			dev_warn(&client->dev,
>> -				 "temp%d out of range, please check!\n", 3);
>> -
>>  		/*
>>  		 * Disable ALERT# output, because these chips don't implement
>>  		 * SMBus alert correctly; they should only hold the alert line
>>  		 * low briefly.
>>  		 */
>> +		struct lm90_data *data = i2c_get_clientdata(client);
>> +		u8 config, alarms;
>> +
>> +		lm90_read_reg(client, LM90_REG_R_STATUS, &alarms);
> 
> You end up reading LM90_REG_R_STATUS, which is not OK. This register
> contains self-clearing bits, so there is no guarantee that the second
> read will return the same value as the first read. You'll have to come
> up with a different approach that reads LM90_REG_R_STATUS only once.

Oh, yes, this is a problem, I didn't noticed it.
How about to use this:
bool lm90_alarms_tripped(*client, *status);
bool lm90_alarms2_tripped(*client, *status2);
So we can read the status only once and pass it.

> 
>> +
>>  		if ((data->flags & LM90_HAVE_BROKEN_ALERT)
>>  		 && (alarms & data->alert_alarms)) {
>>  			dev_dbg(&client->dev, "Disabling ALERT#\n");
> 
> 


_______________________________________________
lm-sensors mailing list
lm-sensors@lm-sensors.org
http://lists.lm-sensors.org/mailman/listinfo/lm-sensors

WARNING: multiple messages have this Message-ID (diff)
From: Wei Ni <wni@nvidia.com>
To: Jean Delvare <khali@linux-fr.org>
Cc: Guenter Roeck <linux@roeck-us.net>,
	"thierry.reding@gmail.com" <thierry.reding@gmail.com>,
	"lm-sensors@lm-sensors.org" <lm-sensors@lm-sensors.org>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
	"linux-tegra@vger.kernel.org" <linux-tegra@vger.kernel.org>
Subject: Re: [PATCH v3 2/4] hwmon: (lm90) use macro defines for the status bit
Date: Wed, 17 Jul 2013 15:03:35 +0800	[thread overview]
Message-ID: <51E641C7.4000107@nvidia.com> (raw)
In-Reply-To: <20130715185727.4ebde8c4@endymion.delvare>

On 07/16/2013 12:57 AM, Jean Delvare wrote:
> Hi Wei, Guenter,
> 
> On Fri, 12 Jul 2013 15:48:05 +0800, Wei Ni wrote:
>> Add bit defines for the status register.
> 
> Regarding the subject: for me these are constants, not macros. AFAIK
> the term "macro" refers to defines with parameters only.

How about "Introduce status bits"

> 
>> Signed-off-by: Wei Ni <wni@nvidia.com>
>> ---
>>  drivers/hwmon/lm90.c |   72 ++++++++++++++++++++++++++++++++++----------------
>>  1 file changed, 49 insertions(+), 23 deletions(-)
>>
>> diff --git a/drivers/hwmon/lm90.c b/drivers/hwmon/lm90.c
>> index 5f30f90..c90037f 100644
>> --- a/drivers/hwmon/lm90.c
>> +++ b/drivers/hwmon/lm90.c
>> @@ -179,6 +179,19 @@ enum chips { lm90, adm1032, lm99, lm86, max6657, max6659, adt7461, max6680,
>>  #define LM90_HAVE_TEMP3		(1 << 6) /* 3rd temperature sensor	*/
>>  #define LM90_HAVE_BROKEN_ALERT	(1 << 7) /* Broken alert		*/
>>  
>> +/* LM90 status */
>> +#define LM90_STATUS_LTHRM	(1 << 0) /* local THERM limit tripped */
>> +#define LM90_STATUS_RTHRM	(1 << 1) /* remote THERM limit tripped */
>> +#define LM90_STATUS_OPEN	(1 << 2) /* remote is an open circuit */
>> +#define LM90_STATUS_RLOW	(1 << 3) /* remote low temp limit tripped */
>> +#define LM90_STATUS_RHIGH	(1 << 4) /* remote high temp limit tripped */
>> +#define LM90_STATUS_LLOW	(1 << 5) /* local low temp limit tripped */
>> +#define LM90_STATUS_LHIGH	(1 << 6) /* local high temp limit tripped */
>> +#define LM90_STATUS_BUSY	(1 << 7) /* ADC is converting */
> 
> LM90_STATUS_BUSY is never used anywhere so please don't define it.

Ok, I will remove it.

> 
>> +
>> +#define MAX6696_STATUS2_RLOW	(1 << 3) /* remote2 low temp limit tripped */
>> +#define MAX6696_STATUS2_RHIGH	(1 << 4) /* remote2 high temp limit tripped */
>> +
>>  /*
>>   * Driver data (common to all clients)
>>   */
>> @@ -1417,6 +1430,36 @@ static void lm90_init_client(struct i2c_client *client)
>>  		i2c_smbus_write_byte_data(client, LM90_REG_W_CONFIG1, config);
>>  }
>>  
>> +static bool lm90_is_tripped(struct i2c_client *client)
>> +{
>> +	struct lm90_data *data = i2c_get_clientdata(client);
>> +	u8 status, status2 = 0;
>> +
>> +	lm90_read_reg(client, LM90_REG_R_STATUS, &status);
>> +
>> +	if (data->kind == max6696)
>> +		lm90_read_reg(client, MAX6696_REG_R_STATUS2, &status2);
>> +
>> +	if ((status & 0x7f) == 0 && (status2 & 0xfe) == 0)
>> +		return false;
> 
> It's a bit disappointing to not use the freshly introduced constants.
> That being said I agree it would make the code hard to read, so you can
> leave it as is.

Sorry, I forgot it.
How about to define:
#define LM90_STATUS_MASK 0x7f
#define MAX6696_STATUS2 0xfe

Or since Guenter is for vacation, I can just leave it as is, and wait
him back to talk about below issue.

> 
> Unrelated to this patch, but Guenter, I am worried about the MAX6696
> handling here. I realize that I am the one who accepted your code, but
> now it looks wrong. Specifically:
> * We check for (status2 & 0xfe) i.e. 7 alarm bits, but the code below
>   only reports 2 alarms bits. So if any of the 5 other alarm bits in
>   STATUS2 are, we may return true (chip is tripped) but not print the
>   cause.
> * At least bits 1 and 2 of STATUS 2 fit totally fine in the driver as
>   it currently exists, so I can't think of any reason for not handling
>   them. Why are we not? Ideally we should print a message for every
>   alarm bit so that we never return "true" without printing a message.
>   Even though OT2 limits aren't handled by the driver...
> * If you think this piece of code shouldn't deal with OT/THERM limits
>   because they do not trigger an SMBus alarm, this can be discussed,
>   but all chips should be handled the same in this respect then.
> * Why in the first place is max6696's data->alert_alarms set to 0x187c
>   and not 0x1c7c? Including 1OPEN but not 2OPEN makes no sense.
> 
>> +
>> +	if (status & (LM90_STATUS_LLOW | LM90_STATUS_LHIGH | LM90_STATUS_LTHRM))
>> +		dev_warn(&client->dev,
>> +			 "temp%d out of range, please check!\n", 1);
>> +	if (status & (LM90_STATUS_RLOW | LM90_STATUS_RHIGH | LM90_STATUS_RTHRM))
>> +		dev_warn(&client->dev,
>> +			 "temp%d out of range, please check!\n", 2);
>> +	if (status & LM90_STATUS_OPEN)
>> +		dev_warn(&client->dev,
>> +			 "temp%d diode open, please check!\n", 2);
>> +
>> +	if (status2 & (MAX6696_STATUS2_RLOW | MAX6696_STATUS2_RHIGH))
>> +		dev_warn(&client->dev,
>> +			 "temp%d out of range, please check!\n", 3);
>> +
>> +	return true;
>> +}
>> +
>>  static int lm90_probe(struct i2c_client *client,
>>  		      const struct i2c_device_id *id)
>>  {
>> @@ -1515,36 +1558,19 @@ static int lm90_remove(struct i2c_client *client)
>>  
>>  static void lm90_alert(struct i2c_client *client, unsigned int flag)
>>  {
>> -	struct lm90_data *data = i2c_get_clientdata(client);
>> -	u8 config, alarms, alarms2 = 0;
>> -
>> -	lm90_read_reg(client, LM90_REG_R_STATUS, &alarms);
>> -
>> -	if (data->kind == max6696)
>> -		lm90_read_reg(client, MAX6696_REG_R_STATUS2, &alarms2);
>> -
>> -	if ((alarms & 0x7f) == 0 && (alarms2 & 0xfe) == 0) {
>> +	if (!lm90_is_tripped(client)) {
> 
> You could swap the success and failure cases to avoid this negation.

Yes, I will change it.

> 
>>  		dev_info(&client->dev, "Everything OK\n");
>>  	} else {
>> -		if (alarms & 0x61)
>> -			dev_warn(&client->dev,
>> -				 "temp%d out of range, please check!\n", 1);
>> -		if (alarms & 0x1a)
>> -			dev_warn(&client->dev,
>> -				 "temp%d out of range, please check!\n", 2);
>> -		if (alarms & 0x04)
>> -			dev_warn(&client->dev,
>> -				 "temp%d diode open, please check!\n", 2);
>> -
>> -		if (alarms2 & 0x18)
>> -			dev_warn(&client->dev,
>> -				 "temp%d out of range, please check!\n", 3);
>> -
>>  		/*
>>  		 * Disable ALERT# output, because these chips don't implement
>>  		 * SMBus alert correctly; they should only hold the alert line
>>  		 * low briefly.
>>  		 */
>> +		struct lm90_data *data = i2c_get_clientdata(client);
>> +		u8 config, alarms;
>> +
>> +		lm90_read_reg(client, LM90_REG_R_STATUS, &alarms);
> 
> You end up reading LM90_REG_R_STATUS, which is not OK. This register
> contains self-clearing bits, so there is no guarantee that the second
> read will return the same value as the first read. You'll have to come
> up with a different approach that reads LM90_REG_R_STATUS only once.

Oh, yes, this is a problem, I didn't noticed it.
How about to use this:
bool lm90_alarms_tripped(*client, *status);
bool lm90_alarms2_tripped(*client, *status2);
So we can read the status only once and pass it.

> 
>> +
>>  		if ((data->flags & LM90_HAVE_BROKEN_ALERT)
>>  		 && (alarms & data->alert_alarms)) {
>>  			dev_dbg(&client->dev, "Disabling ALERT#\n");
> 
> 


  parent reply	other threads:[~2013-07-17  7:03 UTC|newest]

Thread overview: 115+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-07-12  7:48 [PATCH v3 0/4] Lm90 Enhancements Wei Ni
2013-07-12  7:48 ` Wei Ni
2013-07-12  7:48 ` [lm-sensors] " Wei Ni
2013-07-12  7:48 ` [PATCH v3 1/4] hwmon: (lm90) split set&show temp as common codes Wei Ni
2013-07-12  7:48   ` Wei Ni
2013-07-12  7:48   ` [lm-sensors] " Wei Ni
     [not found]   ` <1373615287-18502-2-git-send-email-wni-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
2013-07-12 13:26     ` Jean Delvare
2013-07-12 13:26       ` Jean Delvare
2013-07-12 13:26       ` [lm-sensors] " Jean Delvare
     [not found]       ` <20130712152615.23464a6b-R0o5gVi9kd7kN2dkZ6Wm7A@public.gmane.org>
2013-07-12 13:50         ` Guenter Roeck
2013-07-12 13:50           ` Guenter Roeck
2013-07-12 13:50           ` [lm-sensors] " Guenter Roeck
     [not found]           ` <20130712135000.GA3386-0h96xk9xTtrk1uMJSBkQmQ@public.gmane.org>
2013-07-12 14:30             ` Jean Delvare
2013-07-12 14:30               ` Jean Delvare
2013-07-12 14:30               ` [lm-sensors] " Jean Delvare
2013-07-12 14:40               ` Guenter Roeck
2013-07-12 14:40                 ` [lm-sensors] " Guenter Roeck
2013-07-15  6:25                 ` Wei Ni
2013-07-15  6:25                   ` Wei Ni
2013-07-15  6:25                   ` [lm-sensors] " Wei Ni
2013-07-15  7:24                   ` Jean Delvare
2013-07-15  7:24                     ` Jean Delvare
2013-07-15  7:24                     ` [lm-sensors] " Jean Delvare
     [not found]                     ` <20130715092415.6d082aa2-R0o5gVi9kd7kN2dkZ6Wm7A@public.gmane.org>
2013-07-15  9:14                       ` Wei Ni
2013-07-15  9:14                         ` Wei Ni
2013-07-15  9:14                         ` [lm-sensors] " Wei Ni
     [not found]                         ` <51E3BD5F.6060806-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
2013-07-15 17:52                           ` Jean Delvare
2013-07-15 17:52                             ` Jean Delvare
2013-07-15 17:52                             ` [lm-sensors] " Jean Delvare
2013-07-17  4:26                     ` Thierry Reding
2013-07-17  4:26                       ` [lm-sensors] " Thierry Reding
2013-07-17  5:14                       ` Guenter Roeck
2013-07-17  5:14                         ` [lm-sensors] " Guenter Roeck
2013-07-17  6:26                         ` Wei Ni
2013-07-17  6:26                           ` [lm-sensors] " Wei Ni
2013-07-17  9:11                           ` Jean Delvare
2013-07-17  9:11                             ` [lm-sensors] " Jean Delvare
2013-07-17  9:54                             ` Wei Ni
2013-07-17  9:54                               ` [lm-sensors] " Wei Ni
2013-07-15  6:05         ` Wei Ni
2013-07-15  6:05           ` Wei Ni
2013-07-15  6:05           ` [lm-sensors] " Wei Ni
     [not found]           ` <51E39114.505-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
2013-07-15  7:29             ` Jean Delvare
2013-07-15  7:29               ` Jean Delvare
2013-07-15  7:29               ` [lm-sensors] " Jean Delvare
     [not found] ` <1373615287-18502-1-git-send-email-wni-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
2013-07-12  7:48   ` [PATCH v3 2/4] hwmon: (lm90) use macro defines for the status bit Wei Ni
2013-07-12  7:48     ` Wei Ni
2013-07-12  7:48     ` [lm-sensors] " Wei Ni
2013-07-15 16:57     ` Jean Delvare
2013-07-15 16:57       ` Jean Delvare
2013-07-15 16:57       ` [lm-sensors] " Jean Delvare
     [not found]       ` <20130715185727.4ebde8c4-R0o5gVi9kd7kN2dkZ6Wm7A@public.gmane.org>
2013-07-15 17:33         ` Guenter Roeck
2013-07-15 17:33           ` Guenter Roeck
2013-07-15 17:33           ` [lm-sensors] " Guenter Roeck
     [not found]           ` <20130715173322.GA20484-0h96xk9xTtrk1uMJSBkQmQ@public.gmane.org>
2013-10-30 15:33             ` Jean Delvare
2013-10-30 15:33               ` Jean Delvare
2013-10-30 15:33               ` [lm-sensors] " Jean Delvare
     [not found]               ` <20131030163326.4e7e0cfc-R0o5gVi9kd7kN2dkZ6Wm7A@public.gmane.org>
2013-10-30 16:11                 ` Guenter Roeck
2013-10-30 16:11                   ` Guenter Roeck
2013-10-30 16:11                   ` [lm-sensors] " Guenter Roeck
2013-10-30 16:56                 ` Guenter Roeck
2013-10-30 16:56                   ` Guenter Roeck
2013-10-30 16:56                   ` [lm-sensors] " Guenter Roeck
2013-07-17  7:03         ` Wei Ni [this message]
2013-07-17  7:03           ` Wei Ni
2013-07-17  7:03           ` [lm-sensors] " Wei Ni
2013-07-17  7:09           ` Wei Ni
2013-07-17  7:09             ` [lm-sensors] " Wei Ni
     [not found]           ` <51E641C7.4000107-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
2013-07-17  8:28             ` Jean Delvare
2013-07-17  8:28               ` Jean Delvare
2013-07-17  8:28               ` [lm-sensors] " Jean Delvare
2013-07-17  9:29               ` Wei Ni
2013-07-17  9:29                 ` [lm-sensors] " Wei Ni
     [not found]                 ` <51E663FC.5050209-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
2013-07-17  9:46                   ` Jean Delvare
2013-07-17  9:46                     ` Jean Delvare
2013-07-17  9:46                     ` [lm-sensors] " Jean Delvare
2013-07-12  7:48 ` [PATCH v3 3/4] hwmon: (lm90) add support to handle IRQ Wei Ni
2013-07-12  7:48   ` Wei Ni
2013-07-12  7:48   ` [lm-sensors] " Wei Ni
2013-07-18 15:58   ` Jean Delvare
2013-07-18 15:58     ` Jean Delvare
2013-07-18 15:58     ` [lm-sensors] " Jean Delvare
     [not found]     ` <20130718175822.62c358bf-R0o5gVi9kd7kN2dkZ6Wm7A@public.gmane.org>
2013-07-19  6:41       ` Wei Ni
2013-07-19  6:41         ` Wei Ni
2013-07-19  6:41         ` [lm-sensors] " Wei Ni
     [not found]         ` <51E8DFB2.9070701-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
2013-07-24  7:46           ` Wei Ni
2013-07-24  7:46             ` Wei Ni
2013-07-24  7:46             ` [lm-sensors] " Wei Ni
2013-07-24  8:08             ` Jean Delvare
2013-07-24  8:08               ` [lm-sensors] " Jean Delvare
2013-07-27 15:02         ` Jean Delvare
2013-07-27 15:02           ` [lm-sensors] " Jean Delvare
2013-07-29 10:14           ` Wei Ni
2013-07-29 10:14             ` [lm-sensors] " Wei Ni
     [not found]             ` <51F640A0.4040809-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
2013-07-29 15:58               ` Jean Delvare
2013-07-29 15:58                 ` Jean Delvare
2013-07-29 15:58                 ` [lm-sensors] " Jean Delvare
     [not found]                 ` <20130729175835.795dba2b-R0o5gVi9kd7kN2dkZ6Wm7A@public.gmane.org>
2013-07-30  8:18                   ` Wei Ni
2013-07-30  8:18                     ` Wei Ni
2013-07-30  8:18                     ` [lm-sensors] " Wei Ni
     [not found]                     ` <51F776DB.3060104-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
2013-09-16 12:34                       ` Jean Delvare
2013-09-16 12:34                         ` Jean Delvare
2013-09-16 12:34                         ` [lm-sensors] " Jean Delvare
2013-07-12  7:48 ` [PATCH v3 4/4] hwmon: (lm90) use enums for the indexes of temp8 and temp11 Wei Ni
2013-07-12  7:48   ` Wei Ni
2013-07-12  7:48   ` [lm-sensors] " Wei Ni
     [not found]   ` <1373615287-18502-5-git-send-email-wni-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
2013-07-27 15:38     ` Jean Delvare
2013-07-27 15:38       ` Jean Delvare
2013-07-27 15:38       ` [lm-sensors] " Jean Delvare
     [not found]       ` <20130727173830.14cb5b21-R0o5gVi9kd7kN2dkZ6Wm7A@public.gmane.org>
2013-07-29 11:15         ` Wei Ni
2013-07-29 11:15           ` Wei Ni
2013-07-29 11:15           ` [lm-sensors] " Wei Ni
     [not found]           ` <51F64EC0.800-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
2013-07-29 15:48             ` Jean Delvare
2013-07-29 15:48               ` Jean Delvare
2013-07-29 15:48               ` [lm-sensors] " Jean Delvare

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=51E641C7.4000107@nvidia.com \
    --to=wni-ddmlm1+adcrqt0dzr+alfa@public.gmane.org \
    --cc=khali-PUYAD+kWke1g9hUCZPvPmw@public.gmane.org \
    --cc=linux-0h96xk9xTtrk1uMJSBkQmQ@public.gmane.org \
    --cc=linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
    --cc=linux-tegra-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
    --cc=lm-sensors-GZX6beZjE8VD60Wz+7aTrA@public.gmane.org \
    --cc=thierry.reding-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.