This driver provides glue code connecting a National Semiconductor LM70 LLP
 temperature sensor evaluation board to the kernel's SPI core subsystem.
 
+This is a SPI master controller driver. It can be used in conjunction with
+(layered under) the LM70 logical driver (a "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 LM70EVAL-LLP) is
+available (on page 4) here:
+
+  http://www.national.com/appinfo/tempsensors/files/LM70LLPEVALmanual.pdf
+
 The hardware interfacing on the LM70 LLP eval board is as follows:
 
    Parallel                 LM70 LLP
 
                "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%02x rxbuf[1] : 0x%02x raw=0x%04x\n",
+               rxbuf[0], rxbuf[1], raw);
 
        /*
         * The "raw" temperature read into rxbuf[] is a 16-bit signed 2'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;
 
 /*
- * spi_lm70llp.c - driver for lm70llp eval board for the LM70 sensor
+ * spi_lm70llp.c - driver for LM70EVAL-LLP board for the LM70 sensor
  *
  * Copyright (C) 2006 Kaiwan N Billimoria <kaiwan@designergraphix.com>
  *
  * 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
+ * The schematic for this particular board (the LM70EVAL-LLP) is
+ * available (on page 4) here:
+ *  http://www.national.com/appinfo/tempsensors/files/LM70LLPEVALmanual.pdf
  *
  * Also see Documentation/spi/spi-lm70llp.  The SPI<->parport code here is
  * (heavily) based on spi-butterfly by David Brownell.
  *
  * 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"
 static inline void deassertCS(struct spi_lm70llp *pp)
 {
        u8 data = parport_read_data(pp->port);
+
+       data &= ~0x80;          /* pull D7/SI-out 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;           /* pull D7/SI-out high so lm70 drives SO-in */
        parport_write_data(pp->port, data & ~nCS);
 }
 
  */
 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)
                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:
 
        /* power down */
        parport_write_data(pp->port, 0);
-       msleep(10);
 
        parport_release(pp->pd);
        parport_unregister_device(pp->pd);