[PATCH] SPI lm70: Code streamlining and cleanup

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

 



spi_lm70llp driver:
-changed the bits_per_word setting.
-removed the convoluted if (first_time) ... else ... logic from the
bit-banging routine;
it now invokes a single bitbang_txrx_* call as required.
-better control over the parport D9 line in (de)assert inline routines
(see schematic for details).

lm70 driver:
-parse and save raw temperature in 'correct' byte-order.

Documentation/ updates as appropriate.

Signed-off-by: Kaiwan N Billimoria <kaiwan at designergraphix.com>

---
diff -uprN -X a/Documentation/dontdiff a/Documentation/hwmon/lm70
b/Documentation/hwmon/lm70
--- a/Documentation/hwmon/lm70	2008-10-10 03:43:53.000000000 +0530
+++ b/Documentation/hwmon/lm70	2008-11-12 12:17:21.000000000 +0530
@@ -25,6 +25,10 @@ complement digital temperature (sent via
 driver for interpretation. This driver makes use of the kernel's
in-core
 SPI support.
 
+As a real (in-tree) example of this "logical SPI protocol driver"
interfacing
+with a "physical SPI master controller" driver, see
drivers/spi/spi_lm70llp 
+and it's associated documentation.
+
 Thanks to
 ---------
 Jean Delvare <khali at linux-fr.org> for mentoring the hwmon-side driver
diff -uprN -X a/Documentation/dontdiff a/Documentation/spi/spi-lm70llp
b/Documentation/spi/spi-lm70llp
--- a/Documentation/spi/spi-lm70llp	2008-10-10 03:43:53.000000000 +0530
+++ b/Documentation/spi/spi-lm70llp	2008-11-12 12:13:50.000000000 +0530
@@ -13,10 +13,19 @@ Description
 This driver provides glue code connecting a National Semiconductor LM70
LLP
 temperature sensor evaluation board to the kernel's SPI core subsystem.
 
+This is an SPI master controller driver. It can be used in conjunction
with 
+(layered under) the LM70 logical driver (an "SPI protocol driver").
 In effect, this driver turns the parallel port interface on the eval
board
 into a SPI bus with a single device, which will be driven by the
generic
 LM70 driver (drivers/hwmon/lm70.c).
 
+
+Hardware Interfacing
+--------------------
+The schematic for this particular board (the LM70LLP eval board) is 
+available (on page 4) here:
+http://www.designergraphix.com/pull/spi_lm70/LM70LLPEVALmanual.pdf
+
 The hardware interfacing on the LM70 LLP eval board is as follows:
 
    Parallel                 LM70 LLP
@@ -67,3 +76,4 @@ Thanks to
 o David Brownell for mentoring the SPI-side driver development.
 o Dr.Craig Hollabaugh for the (early) "manual" bitbanging driver
version.
 o Nadir Billimoria for help interpreting the circuit schematic.
+
diff -uprN -X a/Documentation/dontdiff a/drivers/hwmon/lm70.c
b/drivers/hwmon/lm70.c
--- a/drivers/hwmon/lm70.c	2008-10-10 03:43:53.000000000 +0530
+++ b/drivers/hwmon/lm70.c	2008-11-12 12:18:34.000000000 +0530
@@ -65,10 +65,9 @@ static ssize_t lm70_sense_temp(struct de
 		"spi_write_then_read failed with status %d\n", status);
 		goto out;
 	}
-	dev_dbg(dev, "rxbuf[1] : 0x%x rxbuf[0] : 0x%x\n", rxbuf[1], rxbuf[0]);
-
-	raw = (rxbuf[1] << 8) + rxbuf[0];
-	dev_dbg(dev, "raw=0x%x\n", raw);
+	raw = (rxbuf[0] << 8) + rxbuf[1];
+	dev_dbg(dev, "rxbuf[0] : 0x%x rxbuf[1] : 0x%x raw=0x%08x\n", 
+		rxbuf[0], rxbuf[1], raw);
 
 	/*
 	 * The "raw" temperature read into rxbuf[] is a 16-bit signed 2's
diff -uprN -X a/Documentation/dontdiff a/drivers/spi/spi_lm70llp.c
b/drivers/spi/spi_lm70llp.c
--- a/drivers/spi/spi_lm70llp.c	2008-10-10 03:43:53.000000000 +0530
+++ b/drivers/spi/spi_lm70llp.c	2008-11-12 12:12:16.000000000 +0530
@@ -1,5 +1,5 @@
 /*
- * spi_lm70llp.c - driver for lm70llp eval board for the LM70 sensor
+ * spi_lm70llp.c - driver for LM70LLP eval board for the LM70 sensor
  *
  * Copyright (C) 2006 Kaiwan N Billimoria <kaiwan at designergraphix.com>
  *
@@ -27,11 +27,9 @@
 #include <linux/sysfs.h>
 #include <linux/workqueue.h>
 
-
 #include <linux/spi/spi.h>
 #include <linux/spi/spi_bitbang.h>
 
-
 /*
  * The LM70 communicates with a host processor using a 3-wire variant
of
  * the SPI/Microwire bus interface. This driver specifically supports
an
@@ -40,8 +38,14 @@
  * master controller driver.  The hwmon/lm70 driver is a "SPI protocol
  * driver", layered on top of this one and usable without the lm70llp.
  *
+ * Datasheet and Schematic:
  * The LM70 is a temperature sensor chip from National Semiconductor;
its
  * datasheet is available at http://www.national.com/pf/LM/LM70.html
+ * You can also find it here: 
+ *  http://www.designergraphix.com/pull/spi_lm70/LM70.pdf
+ * The schematic for this particular board (the LM70LLP eval board) is 
+ * available (on page 4) here:
+ *  http://www.designergraphix.com/pull/spi_lm70/LM70LLPEVALmanual.pdf
  *
  * Also see Documentation/spi/spi-lm70llp.  The SPI<->parport code here
is
  * (heavily) based on spi-butterfly by David Brownell.
@@ -64,7 +68,7 @@
  *
  * Note that parport pin 13 actually gets inverted by the transistor
  * arrangement which lets either the parport or the LM70 drive the
- * SI/SO signal.
+ * SI/SO signal (see the schematic for details).
  */
 
 #define DRVNAME		"spi-lm70llp"
@@ -106,12 +110,14 @@ static inline struct spi_lm70llp *spidev
 static inline void deassertCS(struct spi_lm70llp *pp)
 {
 	u8 data = parport_read_data(pp->port);
+	data &= ~0x80; /* keep D9 low while de-asserted */
 	parport_write_data(pp->port, data | nCS);
 }
 
 static inline void assertCS(struct spi_lm70llp *pp)
 {
 	u8 data = parport_read_data(pp->port);
+	data |= 0x80; /* keep D9 high while asserted */
 	parport_write_data(pp->port, data & ~nCS);
 }
 
@@ -184,22 +190,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)
@@ -293,10 +284,9 @@ static void spi_lm70llp_attach(struct pa
 		status = -ENODEV;
 		goto out_bitbang_stop;
 	}
-	pp->spidev_lm70->bits_per_word = 16;
+	pp->spidev_lm70->bits_per_word = 8;
 
 	lm70llp = pp;
-
 	return;
 
 out_bitbang_stop:
@@ -326,7 +316,6 @@ static void spi_lm70llp_detach(struct pa
 
 	/* power down */
 	parport_write_data(pp->port, 0);
-	msleep(10);
 
 	parport_release(pp->pd);
 	parport_unregister_device(pp->pd);





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

  Powered by Linux