mirror of https://github.com/hak5/openwrt.git
238 lines
8.1 KiB
Diff
238 lines
8.1 KiB
Diff
From 04bb2a031cf95b34b7432dd47b318a932a895b4c Mon Sep 17 00:00:00 2001
|
|
From: Marek Szyprowski <m.szyprowski@samsung.com>
|
|
Date: Wed, 30 Jun 2010 14:27:32 -0600
|
|
Subject: [PATCH] spi/bitbang: add support for SPI_MASTER_NO_{TX, RX} modes
|
|
|
|
This patch adds a new flags argument to bitbang_txrx_be_cpha0 and
|
|
bitbang_txrx_be_cpha1 transfer functions. This enables support for
|
|
SPI_MASTER_NO_{TX,RX} transfer modes. The change should have no impact
|
|
on speed of the existing drivers. bitbank_txrx_* functions are usually
|
|
inlined into the drivers. When the argument is equal to constant zero,
|
|
the optimizer would be able to eliminate the dead code (flags checks)
|
|
easily. Tested on ARM and GCC 4.4.x and in all cases the checks were
|
|
eliminated in the inlined function.
|
|
|
|
Reviewed-by: Kyungmin Park <kyungmin.park@samsung.com>
|
|
Signed-off-by: Marek Szyprowski <m.szyprowski@samsung.com>
|
|
Acked-by: David Brownell <dbrownell@users.sourceforge.net>
|
|
Signed-off-by: Grant Likely <grant.likely@secretlab.ca>
|
|
---
|
|
drivers/spi/spi_bitbang_txrx.h | 16 ++++++++++------
|
|
drivers/spi/spi_butterfly.c | 2 +-
|
|
drivers/spi/spi_gpio.c | 8 ++++----
|
|
drivers/spi/spi_lm70llp.c | 2 +-
|
|
drivers/spi/spi_s3c24xx_gpio.c | 8 ++++----
|
|
drivers/spi/spi_sh_sci.c | 8 ++++----
|
|
6 files changed, 24 insertions(+), 20 deletions(-)
|
|
|
|
--- a/drivers/spi/spi_bitbang_txrx.h
|
|
+++ b/drivers/spi/spi_bitbang_txrx.h
|
|
@@ -44,7 +44,7 @@
|
|
|
|
static inline u32
|
|
bitbang_txrx_be_cpha0(struct spi_device *spi,
|
|
- unsigned nsecs, unsigned cpol,
|
|
+ unsigned nsecs, unsigned cpol, unsigned flags,
|
|
u32 word, u8 bits)
|
|
{
|
|
/* if (cpol == 0) this is SPI_MODE_0; else this is SPI_MODE_2 */
|
|
@@ -53,7 +53,8 @@ bitbang_txrx_be_cpha0(struct spi_device
|
|
for (word <<= (32 - bits); likely(bits); bits--) {
|
|
|
|
/* setup MSB (to slave) on trailing edge */
|
|
- setmosi(spi, word & (1 << 31));
|
|
+ if ((flags & SPI_MASTER_NO_TX) == 0)
|
|
+ setmosi(spi, word & (1 << 31));
|
|
spidelay(nsecs); /* T(setup) */
|
|
|
|
setsck(spi, !cpol);
|
|
@@ -61,7 +62,8 @@ bitbang_txrx_be_cpha0(struct spi_device
|
|
|
|
/* sample MSB (from slave) on leading edge */
|
|
word <<= 1;
|
|
- word |= getmiso(spi);
|
|
+ if ((flags & SPI_MASTER_NO_RX) == 0)
|
|
+ word |= getmiso(spi);
|
|
setsck(spi, cpol);
|
|
}
|
|
return word;
|
|
@@ -69,7 +71,7 @@ bitbang_txrx_be_cpha0(struct spi_device
|
|
|
|
static inline u32
|
|
bitbang_txrx_be_cpha1(struct spi_device *spi,
|
|
- unsigned nsecs, unsigned cpol,
|
|
+ unsigned nsecs, unsigned cpol, unsigned flags,
|
|
u32 word, u8 bits)
|
|
{
|
|
/* if (cpol == 0) this is SPI_MODE_1; else this is SPI_MODE_3 */
|
|
@@ -79,7 +81,8 @@ bitbang_txrx_be_cpha1(struct spi_device
|
|
|
|
/* setup MSB (to slave) on leading edge */
|
|
setsck(spi, !cpol);
|
|
- setmosi(spi, word & (1 << 31));
|
|
+ if ((flags & SPI_MASTER_NO_TX) == 0)
|
|
+ setmosi(spi, word & (1 << 31));
|
|
spidelay(nsecs); /* T(setup) */
|
|
|
|
setsck(spi, cpol);
|
|
@@ -87,7 +90,8 @@ bitbang_txrx_be_cpha1(struct spi_device
|
|
|
|
/* sample MSB (from slave) on trailing edge */
|
|
word <<= 1;
|
|
- word |= getmiso(spi);
|
|
+ if ((flags & SPI_MASTER_NO_RX) == 0)
|
|
+ word |= getmiso(spi);
|
|
}
|
|
return word;
|
|
}
|
|
--- a/drivers/spi/spi_butterfly.c
|
|
+++ b/drivers/spi/spi_butterfly.c
|
|
@@ -156,7 +156,7 @@ butterfly_txrx_word_mode0(struct spi_dev
|
|
unsigned nsecs,
|
|
u32 word, u8 bits)
|
|
{
|
|
- return bitbang_txrx_be_cpha0(spi, nsecs, 0, word, bits);
|
|
+ return bitbang_txrx_be_cpha0(spi, nsecs, 0, 0, word, bits);
|
|
}
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
--- a/drivers/spi/spi_gpio.c
|
|
+++ b/drivers/spi/spi_gpio.c
|
|
@@ -157,25 +157,25 @@ static inline void spidelay(unsigned nse
|
|
static u32 spi_gpio_txrx_word_mode0(struct spi_device *spi,
|
|
unsigned nsecs, u32 word, u8 bits)
|
|
{
|
|
- return bitbang_txrx_be_cpha0(spi, nsecs, 0, word, bits);
|
|
+ return bitbang_txrx_be_cpha0(spi, nsecs, 0, 0, word, bits);
|
|
}
|
|
|
|
static u32 spi_gpio_txrx_word_mode1(struct spi_device *spi,
|
|
unsigned nsecs, u32 word, u8 bits)
|
|
{
|
|
- return bitbang_txrx_be_cpha1(spi, nsecs, 0, word, bits);
|
|
+ return bitbang_txrx_be_cpha1(spi, nsecs, 0, 0, word, bits);
|
|
}
|
|
|
|
static u32 spi_gpio_txrx_word_mode2(struct spi_device *spi,
|
|
unsigned nsecs, u32 word, u8 bits)
|
|
{
|
|
- return bitbang_txrx_be_cpha0(spi, nsecs, 1, word, bits);
|
|
+ return bitbang_txrx_be_cpha0(spi, nsecs, 1, 0, word, bits);
|
|
}
|
|
|
|
static u32 spi_gpio_txrx_word_mode3(struct spi_device *spi,
|
|
unsigned nsecs, u32 word, u8 bits)
|
|
{
|
|
- return bitbang_txrx_be_cpha1(spi, nsecs, 1, word, bits);
|
|
+ return bitbang_txrx_be_cpha1(spi, nsecs, 1, 0, word, bits);
|
|
}
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
--- a/drivers/spi/spi_lm70llp.c
|
|
+++ b/drivers/spi/spi_lm70llp.c
|
|
@@ -191,7 +191,7 @@ static void lm70_chipselect(struct spi_d
|
|
*/
|
|
static u32 lm70_txrx(struct spi_device *spi, unsigned nsecs, u32 word, u8 bits)
|
|
{
|
|
- return bitbang_txrx_be_cpha0(spi, nsecs, 0, word, bits);
|
|
+ return bitbang_txrx_be_cpha0(spi, nsecs, 0, 0, word, bits);
|
|
}
|
|
|
|
static void spi_lm70llp_attach(struct parport *p)
|
|
--- a/drivers/spi/spi_s3c24xx_gpio.c
|
|
+++ b/drivers/spi/spi_s3c24xx_gpio.c
|
|
@@ -64,25 +64,25 @@ static inline u32 getmiso(struct spi_dev
|
|
static u32 s3c2410_spigpio_txrx_mode0(struct spi_device *spi,
|
|
unsigned nsecs, u32 word, u8 bits)
|
|
{
|
|
- return bitbang_txrx_be_cpha0(spi, nsecs, 0, word, bits);
|
|
+ return bitbang_txrx_be_cpha0(spi, nsecs, 0, 0, word, bits);
|
|
}
|
|
|
|
static u32 s3c2410_spigpio_txrx_mode1(struct spi_device *spi,
|
|
unsigned nsecs, u32 word, u8 bits)
|
|
{
|
|
- return bitbang_txrx_be_cpha1(spi, nsecs, 0, word, bits);
|
|
+ return bitbang_txrx_be_cpha1(spi, nsecs, 0, 0, word, bits);
|
|
}
|
|
|
|
static u32 s3c2410_spigpio_txrx_mode2(struct spi_device *spi,
|
|
unsigned nsecs, u32 word, u8 bits)
|
|
{
|
|
- return bitbang_txrx_be_cpha0(spi, nsecs, 1, word, bits);
|
|
+ return bitbang_txrx_be_cpha0(spi, nsecs, 1, 0, word, bits);
|
|
}
|
|
|
|
static u32 s3c2410_spigpio_txrx_mode3(struct spi_device *spi,
|
|
unsigned nsecs, u32 word, u8 bits)
|
|
{
|
|
- return bitbang_txrx_be_cpha1(spi, nsecs, 1, word, bits);
|
|
+ return bitbang_txrx_be_cpha1(spi, nsecs, 1, 0, word, bits);
|
|
}
|
|
|
|
|
|
--- a/drivers/spi/spi_sh_sci.c
|
|
+++ b/drivers/spi/spi_sh_sci.c
|
|
@@ -83,25 +83,25 @@ static inline u32 getmiso(struct spi_dev
|
|
static u32 sh_sci_spi_txrx_mode0(struct spi_device *spi,
|
|
unsigned nsecs, u32 word, u8 bits)
|
|
{
|
|
- return bitbang_txrx_be_cpha0(spi, nsecs, 0, word, bits);
|
|
+ return bitbang_txrx_be_cpha0(spi, nsecs, 0, 0, word, bits);
|
|
}
|
|
|
|
static u32 sh_sci_spi_txrx_mode1(struct spi_device *spi,
|
|
unsigned nsecs, u32 word, u8 bits)
|
|
{
|
|
- return bitbang_txrx_be_cpha1(spi, nsecs, 0, word, bits);
|
|
+ return bitbang_txrx_be_cpha1(spi, nsecs, 0, 0, word, bits);
|
|
}
|
|
|
|
static u32 sh_sci_spi_txrx_mode2(struct spi_device *spi,
|
|
unsigned nsecs, u32 word, u8 bits)
|
|
{
|
|
- return bitbang_txrx_be_cpha0(spi, nsecs, 1, word, bits);
|
|
+ return bitbang_txrx_be_cpha0(spi, nsecs, 1, 0, word, bits);
|
|
}
|
|
|
|
static u32 sh_sci_spi_txrx_mode3(struct spi_device *spi,
|
|
unsigned nsecs, u32 word, u8 bits)
|
|
{
|
|
- return bitbang_txrx_be_cpha1(spi, nsecs, 1, word, bits);
|
|
+ return bitbang_txrx_be_cpha1(spi, nsecs, 1, 0, word, bits);
|
|
}
|
|
|
|
static void sh_sci_spi_chipselect(struct spi_device *dev, int value)
|
|
--- a/drivers/spi/spi_gpio_old.c
|
|
+++ b/drivers/spi/spi_gpio_old.c
|
|
@@ -80,25 +80,25 @@ static inline void do_spidelay(struct sp
|
|
static u32 spi_gpio_txrx_mode0(struct spi_device *spi,
|
|
unsigned nsecs, u32 word, u8 bits)
|
|
{
|
|
- return bitbang_txrx_be_cpha0(spi, nsecs, 0, word, bits);
|
|
+ return bitbang_txrx_be_cpha0(spi, nsecs, 0, 0, word, bits);
|
|
}
|
|
|
|
static u32 spi_gpio_txrx_mode1(struct spi_device *spi,
|
|
unsigned nsecs, u32 word, u8 bits)
|
|
{
|
|
- return bitbang_txrx_be_cpha1(spi, nsecs, 0, word, bits);
|
|
+ return bitbang_txrx_be_cpha1(spi, nsecs, 0, 0, word, bits);
|
|
}
|
|
|
|
static u32 spi_gpio_txrx_mode2(struct spi_device *spi,
|
|
unsigned nsecs, u32 word, u8 bits)
|
|
{
|
|
- return bitbang_txrx_be_cpha0(spi, nsecs, 1, word, bits);
|
|
+ return bitbang_txrx_be_cpha0(spi, nsecs, 1, 0, word, bits);
|
|
}
|
|
|
|
static u32 spi_gpio_txrx_mode3(struct spi_device *spi,
|
|
unsigned nsecs, u32 word, u8 bits)
|
|
{
|
|
- return bitbang_txrx_be_cpha1(spi, nsecs, 1, word, bits);
|
|
+ return bitbang_txrx_be_cpha1(spi, nsecs, 1, 0, word, bits);
|
|
}
|
|
|
|
static void spi_gpio_chipselect(struct spi_device *dev, int on)
|