hwmon: (lm70) Code streamlining and cleanup
This fixes a byteswap bug in the LM70 temperature sensor driver, which was previously covered up by a converse bug in the driver for the LM70EVAL-LLP board (which is also fixed). Other fixes: doc updates, remove an annoying msleep(), and improve three-wire protocol handling. Signed-off-by: Kaiwan N Billimoria <kaiwan@designergraphix.com> [ dbrownell@users.sourceforge.net: doc and whitespace tweaks ] Signed-off-by: David Brownell <dbrownell@users.sourceforge.net> Signed-off-by: Jean Delvare <khali@linux-fr.org>
此提交包含在:
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* 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>
|
||||
*
|
||||
@@ -40,8 +40,12 @@
|
||||
* 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.
|
||||
@@ -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,16 @@ static inline struct spi_lm70llp *spidev_to_pp(struct spi_device *spi)
|
||||
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);
|
||||
}
|
||||
|
||||
@@ -184,22 +192,7 @@ static void lm70_chipselect(struct spi_device *spi, int value)
|
||||
*/
|
||||
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 +286,9 @@ 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:
|
||||
@@ -326,7 +318,6 @@ static void spi_lm70llp_detach(struct parport *p)
|
||||
|
||||
/* power down */
|
||||
parport_write_data(pp->port, 0);
|
||||
msleep(10);
|
||||
|
||||
parport_release(pp->pd);
|
||||
parport_unregister_device(pp->pd);
|
||||
|
新增問題並參考
封鎖使用者