diff options
| author | Marek Vasut <marex@denx.de> | 2012-07-09 00:48:31 +0000 | 
|---|---|---|
| committer | Albert ARIBAUD <albert.u.boot@aribaud.net> | 2012-09-01 14:58:16 +0200 | 
| commit | c7065fa824ab30108e1964bf1060eacb4323a85e (patch) | |
| tree | 677c27a793dad6730616344aef4e791a9ad4de01 | |
| parent | e972d72bd7ce944a655328c6a8ef1e75e56490e3 (diff) | |
| download | olio-uboot-2014.01-c7065fa824ab30108e1964bf1060eacb4323a85e.tar.xz olio-uboot-2014.01-c7065fa824ab30108e1964bf1060eacb4323a85e.zip | |
MX28: SPI: Refactor spi_xfer a bit
This makes it easier to adapt for addition of DMA support.
Signed-off-by: Marek Vasut <marex@denx.de>
Cc: Fabio Estevam <festevam@gmail.com>
Cc: Otavio Salvador <otavio@ossystems.com.br>
Cc: Stefano Babic <sbabic@denx.de>
Cc: Wolfgang Denk <wd@denx.de>
| -rw-r--r-- | drivers/spi/mxs_spi.c | 32 | 
1 files changed, 22 insertions, 10 deletions
| diff --git a/drivers/spi/mxs_spi.c b/drivers/spi/mxs_spi.c index 7859536a6..a21b02b7f 100644 --- a/drivers/spi/mxs_spi.c +++ b/drivers/spi/mxs_spi.c @@ -146,21 +146,33 @@ int spi_xfer(struct spi_slave *slave, unsigned int bitlen,  	struct mxs_spi_slave *mxs_slave = to_mxs_slave(slave);  	struct mx28_ssp_regs *ssp_regs = mxs_slave->regs;  	int len = bitlen / 8; -	const char *tx = dout; -	char *rx = din;  	char dummy; +	int write = 0; +	char *data = NULL;  	if (bitlen == 0) {  		if (flags & SPI_XFER_END) { -			rx = &dummy; +			din = (void *)&dummy;  			len = 1;  		} else  			return 0;  	} -	if (!rx && !tx) +	/* Half-duplex only */ +	if (din && dout) +		return -EINVAL; +	/* No data */ +	if (!din && !dout)  		return 0; +	if (dout) { +		data = (char *)dout; +		write = 1; +	} else if (din) { +		data = (char *)din; +		write = 0; +	} +  	if (flags & SPI_XFER_BEGIN)  		mxs_spi_start_xfer(ssp_regs); @@ -171,7 +183,7 @@ int spi_xfer(struct spi_slave *slave, unsigned int bitlen,  		if ((flags & SPI_XFER_END) && !len)  			mxs_spi_end_xfer(ssp_regs); -		if (tx) +		if (write)  			writel(SSP_CTRL0_READ, &ssp_regs->hw_ssp_ctrl0_clr);  		else  			writel(SSP_CTRL0_READ, &ssp_regs->hw_ssp_ctrl0_set); @@ -184,20 +196,20 @@ int spi_xfer(struct spi_slave *slave, unsigned int bitlen,  			return -ETIMEDOUT;  		} -		if (tx) -			writel(*tx++, &ssp_regs->hw_ssp_data); +		if (write) +			writel(*data++, &ssp_regs->hw_ssp_data);  		writel(SSP_CTRL0_DATA_XFER, &ssp_regs->hw_ssp_ctrl0_set); -		if (rx) { +		if (!write) {  			if (mx28_wait_mask_clr(&ssp_regs->hw_ssp_status_reg,  				SSP_STATUS_FIFO_EMPTY, MXS_SPI_MAX_TIMEOUT)) {  				printf("MXS SPI: Timeout waiting for data\n");  				return -ETIMEDOUT;  			} -			*rx = readl(&ssp_regs->hw_ssp_data); -			rx++; +			*data = readl(&ssp_regs->hw_ssp_data); +			data++;  		}  		if (mx28_wait_mask_clr(&ssp_regs->hw_ssp_ctrl0_reg, |