Re: [PATCH] hwmon: (w83627ehf) Fix documentation of temperature sensor resolution

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Tue, 1 Nov 2011 06:57:36 -0700, Guenter Roeck wrote:
> On Tue, Nov 01, 2011 at 06:19:36AM -0400, Jean Delvare wrote:
> > The NCT6775F and NCT6776F have specific temperature sensor resolutions
> > for sensors above 3.
> > 
> > Signed-off-by: Jean Delvare <khali@xxxxxxxxxxxx>
> > Cc: Guenter Roeck <guenter.roeck@xxxxxxxxxxxx>
> > ---
> > Guenter, did I get it right?
> > 
> Did I add the 0.0 degrees note ? Brr.

I've done worse...

> Anyway, it is kind of correct. temp7 to temp9 resolution is 0.5 degrees C, but the code
> only reads full degrees because it was too complicated to merge the lowest bit.

It is indeed different from the other values but I wouldn't call it
terribly complicated. My only worry is related to the integrity of the
reading, i.e. how can we guarantee that the MSB and the LSB belong to
the same measurement. I would hope that the chip latches the LSB when
the MSB is read, but I don't see any mention of this in the datasheet.
The problem isn't limited to temp7 to temp9, BTW, other 9-bit
temperature inputs are affected too.

Would the following (untested) be OK with you?

---
 drivers/hwmon/w83627ehf.c |   12 ++++++++++++
 1 file changed, 12 insertions(+)

--- linux-3.2-rc0.orig/drivers/hwmon/w83627ehf.c	2011-11-05 12:42:03.000000000 +0100
+++ linux-3.2-rc0/drivers/hwmon/w83627ehf.c	2011-11-05 14:48:33.000000000 +0100
@@ -260,6 +260,7 @@ static const u16 NCT6775_REG_TEMP_OVER[]
 	= { 0x39, 0x155, 0x255, 0, 0, 0, 0x672, 0x677, 0x67C };
 static const u16 NCT6775_REG_TEMP_SOURCE[]
 	= { 0x621, 0x622, 0x623, 0x100, 0x200, 0x300, 0x624, 0x625, 0x626 };
+#define NCT6775_REG_TEMP_LSB		0x62E
 
 static const char *const w83667hg_b_temp_label[] = {
 	"SYSTIN",
@@ -888,6 +889,17 @@ static struct w83627ehf_data *w83627ehf_
 				  = w83627ehf_read_temp(data,
 						data->reg_temp_hyst[i]);
 		}
+		/* LSB of temp7-9 are stored in the same register */
+		if (data->have_temp & (0x7 << 6)) {
+			u8 reg = w83627ehf_read_value(data,
+						      NCT6775_REG_TEMP_LSB);
+
+			for (i = 0; i < 3; i++) {
+				if (data->have_temp & (1 << (6 + i)))
+					data->temp[6 + i]
+					  |= (reg << (7 - i)) & 0x80;
+			}
+		}
 
 		data->alarms = w83627ehf_read_value(data,
 					W83627EHF_REG_ALARM1) |


> Acked-by: Guenter Roeck <guenter.roeck@xxxxxxxxxxxx>

Thanks.

-- 
Jean Delvare

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


[Index of Archives]     [Linux Kernel]     [Linux Hardware Monitoring]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]

  Powered by Linux