diff options
Diffstat (limited to 'drivers/spi/spi-oc-tiny.c')
| -rw-r--r-- | drivers/spi/spi-oc-tiny.c | 67 | 
1 files changed, 12 insertions, 55 deletions
diff --git a/drivers/spi/spi-oc-tiny.c b/drivers/spi/spi-oc-tiny.c index 333cb1badcd..8998d11c723 100644 --- a/drivers/spi/spi-oc-tiny.c +++ b/drivers/spi/spi-oc-tiny.c @@ -15,7 +15,6 @@   * published by the Free Software Foundation.   */ -#include <linux/init.h>  #include <linux/interrupt.h>  #include <linux/errno.h>  #include <linux/module.h> @@ -153,62 +152,22 @@ static int tiny_spi_txrx_bufs(struct spi_device *spi, struct spi_transfer *t)  		}  		wait_for_completion(&hw->done); -	} else if (txp && rxp) { -		/* we need to tighten the transfer loop */ -		writeb(*txp++, hw->base + TINY_SPI_TXDATA); -		if (t->len > 1) { -			writeb(*txp++, hw->base + TINY_SPI_TXDATA); -			for (i = 2; i < t->len; i++) { -				u8 rx, tx = *txp++; -				tiny_spi_wait_txr(hw); -				rx = readb(hw->base + TINY_SPI_TXDATA); -				writeb(tx, hw->base + TINY_SPI_TXDATA); -				*rxp++ = rx; -			} -			tiny_spi_wait_txr(hw); -			*rxp++ = readb(hw->base + TINY_SPI_TXDATA); -		} -		tiny_spi_wait_txe(hw); -		*rxp++ = readb(hw->base + TINY_SPI_RXDATA); -	} else if (rxp) { -		writeb(0, hw->base + TINY_SPI_TXDATA); -		if (t->len > 1) { -			writeb(0, -			       hw->base + TINY_SPI_TXDATA); -			for (i = 2; i < t->len; i++) { -				u8 rx; -				tiny_spi_wait_txr(hw); -				rx = readb(hw->base + TINY_SPI_TXDATA); -				writeb(0, hw->base + TINY_SPI_TXDATA); -				*rxp++ = rx; -			} -			tiny_spi_wait_txr(hw); -			*rxp++ = readb(hw->base + TINY_SPI_TXDATA); -		} -		tiny_spi_wait_txe(hw); -		*rxp++ = readb(hw->base + TINY_SPI_RXDATA); -	} else if (txp) { -		writeb(*txp++, hw->base + TINY_SPI_TXDATA); -		if (t->len > 1) { -			writeb(*txp++, hw->base + TINY_SPI_TXDATA); -			for (i = 2; i < t->len; i++) { -				u8 tx = *txp++; -				tiny_spi_wait_txr(hw); -				writeb(tx, hw->base + TINY_SPI_TXDATA); -			} -		} -		tiny_spi_wait_txe(hw);  	} else { -		writeb(0, hw->base + TINY_SPI_TXDATA); -		if (t->len > 1) { -			writeb(0, hw->base + TINY_SPI_TXDATA); -			for (i = 2; i < t->len; i++) { +		/* we need to tighten the transfer loop */ +		writeb(txp ? *txp++ : 0, hw->base + TINY_SPI_TXDATA); +		for (i = 1; i < t->len; i++) { +			writeb(txp ? *txp++ : 0, hw->base + TINY_SPI_TXDATA); + +			if (rxp || (i != t->len - 1))  				tiny_spi_wait_txr(hw); -				writeb(0, hw->base + TINY_SPI_TXDATA); -			} +			if (rxp) +				*rxp++ = readb(hw->base + TINY_SPI_TXDATA);  		}  		tiny_spi_wait_txe(hw); +		if (rxp) +			*rxp++ = readb(hw->base + TINY_SPI_RXDATA);  	} +  	return t->len;  } @@ -306,9 +265,7 @@ static int tiny_spi_probe(struct platform_device *pdev)  	platform_set_drvdata(pdev, hw);  	/* setup the state for the bitbang driver */ -	hw->bitbang.master = spi_master_get(master); -	if (!hw->bitbang.master) -		return err; +	hw->bitbang.master = master;  	hw->bitbang.setup_transfer = tiny_spi_setup_transfer;  	hw->bitbang.chipselect = tiny_spi_chipselect;  	hw->bitbang.txrx_bufs = tiny_spi_txrx_bufs;  | 
