[lm-sensors] [PATCH RESEND] hwmon: lm70: TI TMP121 support.

David Brownell david-b at pacbell.net
Fri Oct 24 11:21:51 CEST 2008


On Friday 24 October 2008, Kaiwan N Billimoria wrote:
> On Thu, 2008-10-23 at 11:37 -0700, David Brownell wrote:
> > Right, but afaik the lm70 code was only
> > tested with drivers/spi/spi_lm70llp.c and
> > that has a byte order handling bug.
> > 
> > Kaiwan Billimoria is the only person I
> > know who could test fixes to the LM70
> > and LM70LLP support ... Kaiwan, could
> > you give that a try?
> > 
> > - Dave
> > 
> Sure Dave.
> Pl point me to the latest patch(es) and help in clarifying what 
> exactly the bug is; been a while...  :-)
> 
> And of course, if you already have a fix i'll test it on the lm70llp
> board.

I suspect the following should do the job ... it has
the parport based adapter leave the data in MSB-first
byte order, with the lm70 driver converting to CPU
byte order.  (In a way that will match the TMP121/123
support.)

- Dave

---
 drivers/hwmon/lm70.c      |    4 +++-
 drivers/spi/spi_lm70llp.c |   19 +++----------------
 2 files changed, 6 insertions(+), 17 deletions(-)

--- a/drivers/hwmon/lm70.c
+++ b/drivers/hwmon/lm70.c
@@ -67,7 +67,7 @@ static ssize_t lm70_sense_temp(struct de
 	}
 	dev_dbg(dev, "rxbuf[1] : 0x%x rxbuf[0] : 0x%x\n", rxbuf[1], rxbuf[0]);
 
-	raw = (rxbuf[1] << 8) + rxbuf[0];
+	raw = (rxbuf[0] << 8) + rxbuf[1];
 	dev_dbg(dev, "raw=0x%x\n", raw);
 
 	/*
@@ -109,6 +109,8 @@ static int __devinit lm70_probe(struct s
 	if ((spi->mode & (SPI_CPOL|SPI_CPHA)) || !(spi->mode & SPI_3WIRE))
 		return -EINVAL;
 
+	/* NOTE:  we assume 8-bit words, and convert to 16 bits manually */
+
 	p_lm70 = kzalloc(sizeof *p_lm70, GFP_KERNEL);
 	if (!p_lm70)
 		return -ENOMEM;
--- a/drivers/spi/spi_lm70llp.c
+++ b/drivers/spi/spi_lm70llp.c
@@ -173,6 +173,8 @@ static void lm70_chipselect(struct spi_d
 {
 	struct spi_lm70llp *pp = spidev_to_pp(spi);
 
+	/* REVISIT initialize the clock polarity ... */
+
 	if (value)
 		assertCS(pp);
 	else
@@ -184,22 +186,7 @@ static void lm70_chipselect(struct spi_d
  */
 static u32 lm70_txrx(struct spi_device *spi, unsigned nsecs, u32 word, u8 bits)
 {
-	static u32 sio=0;
-	static int first_time=1;
-
-	/* First time: perform SPI bitbang and return the LSB of
-	 * the result of the SPI call.
-	 */
-	if (first_time) {
-		sio = bitbang_txrx_be_cpha0(spi, nsecs, 0, word, bits);
-		first_time=0;
-		return (sio & 0x00ff);
-	}
-	/* Return the MSB of the result of the SPI call */
-	else {
-		first_time=1;
-		return (sio >> 8);
-	}
+	return bitbang_txrx_be_cpha0(spi, nsecs, 0, word, bits);
 }
 
 static void spi_lm70llp_attach(struct parport *p)




More information about the lm-sensors mailing list