Re: [PATCH] spi: omap2-mcspi: Cleanup the omap2_mcspi_txrx_dma function

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Monday 03 September 2012 07:32 PM, Shubhrajyoti D wrote:
> Currently in omap2_mcspi_txrx_dma has the rx 
I meant tx here will resend. please ignore this patch

> and the rx support
> interleaved. Make the rx related code in omap2_mcspi_rx_dma
> and the tx related code omap2_mcspi_tx_dma and call functions.
>
> While at it also remove the braces in the if statements which has only
> one line.
> Also fix ["foo * bar" to "foo *bar"] warn for the rx and tx variables.
>
> Only a cleanup no functional change.
>
> Signed-off-by: Shubhrajyoti D <shubhrajyoti@xxxxxx>
> ---
>  drivers/spi/spi-omap2-mcspi.c |  256 +++++++++++++++++++++++------------------
>  1 files changed, 144 insertions(+), 112 deletions(-)
>
> diff --git a/drivers/spi/spi-omap2-mcspi.c b/drivers/spi/spi-omap2-mcspi.c
> index 1c1dd34..dd8fc88 100644
> --- a/drivers/spi/spi-omap2-mcspi.c
> +++ b/drivers/spi/spi-omap2-mcspi.c
> @@ -315,49 +315,27 @@ static void omap2_mcspi_tx_callback(void *data)
>  	omap2_mcspi_set_dma_req(spi, 0, 0);
>  }
>  
> -static unsigned
> -omap2_mcspi_txrx_dma(struct spi_device *spi, struct spi_transfer *xfer)
> +static void omap2_mcspi_tx_dma(struct spi_device *spi,
> +				struct spi_transfer *xfer,
> +				struct dma_slave_config cfg)
>  {
>  	struct omap2_mcspi	*mcspi;
> -	struct omap2_mcspi_cs	*cs = spi->controller_state;
>  	struct omap2_mcspi_dma  *mcspi_dma;
>  	unsigned int		count;
> -	int			word_len, element_count;
> -	int			elements = 0;
> -	u32			l;
>  	u8			* rx;
>  	const u8		* tx;
>  	void __iomem		*chstat_reg;
> -	struct dma_slave_config	cfg;
> -	enum dma_slave_buswidth width;
> -	unsigned es;
> +	struct omap2_mcspi_cs	*cs = spi->controller_state;
>  
>  	mcspi = spi_master_get_devdata(spi->master);
>  	mcspi_dma = &mcspi->dma_channels[spi->chip_select];
> -	l = mcspi_cached_chconf0(spi);
> +	count = xfer->len;
>  
> +	rx = xfer->rx_buf;
> +	tx = xfer->tx_buf;
>  	chstat_reg = cs->base + OMAP2_MCSPI_CHSTAT0;
>  
> -	if (cs->word_len <= 8) {
> -		width = DMA_SLAVE_BUSWIDTH_1_BYTE;
> -		es = 1;
> -	} else if (cs->word_len <= 16) {
> -		width = DMA_SLAVE_BUSWIDTH_2_BYTES;
> -		es = 2;
> -	} else {
> -		width = DMA_SLAVE_BUSWIDTH_4_BYTES;
> -		es = 4;
> -	}
> -
> -	memset(&cfg, 0, sizeof(cfg));
> -	cfg.src_addr = cs->phys + OMAP2_MCSPI_RX0;
> -	cfg.dst_addr = cs->phys + OMAP2_MCSPI_TX0;
> -	cfg.src_addr_width = width;
> -	cfg.dst_addr_width = width;
> -	cfg.src_maxburst = 1;
> -	cfg.dst_maxburst = 1;
> -
> -	if (xfer->tx_buf && mcspi_dma->dma_tx) {
> +	if (mcspi_dma->dma_tx) {
>  		struct dma_async_tx_descriptor *tx;
>  		struct scatterlist sg;
>  
> @@ -368,7 +346,7 @@ omap2_mcspi_txrx_dma(struct spi_device *spi, struct spi_transfer *xfer)
>  		sg_dma_len(&sg) = xfer->len;
>  
>  		tx = dmaengine_prep_slave_sg(mcspi_dma->dma_tx, &sg, 1,
> -			DMA_MEM_TO_DEV, DMA_PREP_INTERRUPT | DMA_CTRL_ACK);
> +		DMA_MEM_TO_DEV, DMA_PREP_INTERRUPT | DMA_CTRL_ACK);
>  		if (tx) {
>  			tx->callback = omap2_mcspi_tx_callback;
>  			tx->callback_param = spi;
> @@ -377,8 +355,50 @@ omap2_mcspi_txrx_dma(struct spi_device *spi, struct spi_transfer *xfer)
>  			/* FIXME: fall back to PIO? */
>  		}
>  	}
> +	dma_async_issue_pending(mcspi_dma->dma_tx);
> +	omap2_mcspi_set_dma_req(spi, 0, 1);
>  
> -	if (xfer->rx_buf && mcspi_dma->dma_rx) {
> +	wait_for_completion(&mcspi_dma->dma_tx_completion);
> +	dma_unmap_single(mcspi->dev, xfer->tx_dma, count,
> +			 DMA_TO_DEVICE);
> +
> +	/* for TX_ONLY mode, be sure all words have shifted out */
> +	if (rx == NULL) {
> +		if (mcspi_wait_for_reg_bit(chstat_reg,
> +					OMAP2_MCSPI_CHSTAT_TXS) < 0)
> +			dev_err(&spi->dev, "TXS timed out\n");
> +		else if (mcspi_wait_for_reg_bit(chstat_reg,
> +					OMAP2_MCSPI_CHSTAT_EOT) < 0)
> +			dev_err(&spi->dev, "EOT timed out\n");
> +	}
> +}
> +
> +static unsigned
> +omap2_mcspi_rx_dma(struct spi_device *spi, struct spi_transfer *xfer,
> +				struct dma_slave_config cfg,
> +				unsigned es)
> +{
> +	struct omap2_mcspi	*mcspi;
> +	struct omap2_mcspi_dma  *mcspi_dma;
> +	unsigned int		count;
> +	u32			l;
> +	int			elements = 0;
> +	int			word_len, element_count;
> +	struct omap2_mcspi_cs	*cs = spi->controller_state;
> +	mcspi = spi_master_get_devdata(spi->master);
> +	mcspi_dma = &mcspi->dma_channels[spi->chip_select];
> +	count = xfer->len;
> +	word_len = cs->word_len;
> +	l = mcspi_cached_chconf0(spi);
> +
> +	if (word_len <= 8)
> +		element_count = count;
> +	else if (word_len <= 16)
> +		element_count = count >> 1;
> +	else /* word_len <= 32 */
> +		element_count = count >> 2;
> +
> +	if (mcspi_dma->dma_rx) {
>  		struct dma_async_tx_descriptor *tx;
>  		struct scatterlist sg;
>  		size_t len = xfer->len - es;
> @@ -393,108 +413,120 @@ omap2_mcspi_txrx_dma(struct spi_device *spi, struct spi_transfer *xfer)
>  		sg_dma_len(&sg) = len;
>  
>  		tx = dmaengine_prep_slave_sg(mcspi_dma->dma_rx, &sg, 1,
> -			DMA_DEV_TO_MEM, DMA_PREP_INTERRUPT | DMA_CTRL_ACK);
> +				DMA_DEV_TO_MEM, DMA_PREP_INTERRUPT |
> +				DMA_CTRL_ACK);
>  		if (tx) {
>  			tx->callback = omap2_mcspi_rx_callback;
>  			tx->callback_param = spi;
>  			dmaengine_submit(tx);
>  		} else {
> -			/* FIXME: fall back to PIO? */
> -		}
> -	}
> -
> -	count = xfer->len;
> -	word_len = cs->word_len;
> -
> -	rx = xfer->rx_buf;
> -	tx = xfer->tx_buf;
> -
> -	if (word_len <= 8) {
> -		element_count = count;
> -	} else if (word_len <= 16) {
> -		element_count = count >> 1;
> -	} else /* word_len <= 32 */ {
> -		element_count = count >> 2;
> -	}
> -
> -	if (tx != NULL) {
> -		dma_async_issue_pending(mcspi_dma->dma_tx);
> -		omap2_mcspi_set_dma_req(spi, 0, 1);
> -	}
> -
> -	if (rx != NULL) {
> -		dma_async_issue_pending(mcspi_dma->dma_rx);
> -		omap2_mcspi_set_dma_req(spi, 1, 1);
> -	}
> -
> -	if (tx != NULL) {
> -		wait_for_completion(&mcspi_dma->dma_tx_completion);
> -		dma_unmap_single(mcspi->dev, xfer->tx_dma, count,
> -				 DMA_TO_DEVICE);
> -
> -		/* for TX_ONLY mode, be sure all words have shifted out */
> -		if (rx == NULL) {
> -			if (mcspi_wait_for_reg_bit(chstat_reg,
> -						OMAP2_MCSPI_CHSTAT_TXS) < 0)
> -				dev_err(&spi->dev, "TXS timed out\n");
> -			else if (mcspi_wait_for_reg_bit(chstat_reg,
> -						OMAP2_MCSPI_CHSTAT_EOT) < 0)
> -				dev_err(&spi->dev, "EOT timed out\n");
> +				/* FIXME: fall back to PIO? */
>  		}
>  	}
>  
> -	if (rx != NULL) {
> -		wait_for_completion(&mcspi_dma->dma_rx_completion);
> -		dma_unmap_single(mcspi->dev, xfer->rx_dma, count,
> -				 DMA_FROM_DEVICE);
> -		omap2_mcspi_set_enable(spi, 0);
> +	dma_async_issue_pending(mcspi_dma->dma_rx);
> +	omap2_mcspi_set_dma_req(spi, 1, 1);
>  
> -		elements = element_count - 1;
> +	wait_for_completion(&mcspi_dma->dma_rx_completion);
> +	dma_unmap_single(mcspi->dev, xfer->rx_dma, count,
> +			 DMA_FROM_DEVICE);
> +	omap2_mcspi_set_enable(spi, 0);
>  
> -		if (l & OMAP2_MCSPI_CHCONF_TURBO) {
> -			elements--;
> +	elements = element_count - 1;
>  
> -			if (likely(mcspi_read_cs_reg(spi, OMAP2_MCSPI_CHSTAT0)
> -				   & OMAP2_MCSPI_CHSTAT_RXS)) {
> -				u32 w;
> -
> -				w = mcspi_read_cs_reg(spi, OMAP2_MCSPI_RX0);
> -				if (word_len <= 8)
> -					((u8 *)xfer->rx_buf)[elements++] = w;
> -				else if (word_len <= 16)
> -					((u16 *)xfer->rx_buf)[elements++] = w;
> -				else /* word_len <= 32 */
> -					((u32 *)xfer->rx_buf)[elements++] = w;
> -			} else {
> -				dev_err(&spi->dev,
> -					"DMA RX penultimate word empty");
> -				count -= (word_len <= 8)  ? 2 :
> -					(word_len <= 16) ? 4 :
> -					/* word_len <= 32 */ 8;
> -				omap2_mcspi_set_enable(spi, 1);
> -				return count;
> -			}
> -		}
> +	if (l & OMAP2_MCSPI_CHCONF_TURBO) {
> +		elements--;
>  
>  		if (likely(mcspi_read_cs_reg(spi, OMAP2_MCSPI_CHSTAT0)
> -				& OMAP2_MCSPI_CHSTAT_RXS)) {
> +				   & OMAP2_MCSPI_CHSTAT_RXS)) {
>  			u32 w;
>  
>  			w = mcspi_read_cs_reg(spi, OMAP2_MCSPI_RX0);
>  			if (word_len <= 8)
> -				((u8 *)xfer->rx_buf)[elements] = w;
> +				((u8 *)xfer->rx_buf)[elements++] = w;
>  			else if (word_len <= 16)
> -				((u16 *)xfer->rx_buf)[elements] = w;
> +				((u16 *)xfer->rx_buf)[elements++] = w;
>  			else /* word_len <= 32 */
> -				((u32 *)xfer->rx_buf)[elements] = w;
> +				((u32 *)xfer->rx_buf)[elements++] = w;
>  		} else {
> -			dev_err(&spi->dev, "DMA RX last word empty");
> -			count -= (word_len <= 8)  ? 1 :
> -				 (word_len <= 16) ? 2 :
> -			       /* word_len <= 32 */ 4;
> +			dev_err(&spi->dev, "DMA RX penultimate word empty");
> +			count -= (word_len <= 8)  ? 2 :
> +				(word_len <= 16) ? 4 :
> +				/* word_len <= 32 */ 8;
> +			omap2_mcspi_set_enable(spi, 1);
> +			return count;
>  		}
> -		omap2_mcspi_set_enable(spi, 1);
>  	}
> +	if (likely(mcspi_read_cs_reg(spi, OMAP2_MCSPI_CHSTAT0)
> +				& OMAP2_MCSPI_CHSTAT_RXS)) {
> +		u32 w;
> +
> +		w = mcspi_read_cs_reg(spi, OMAP2_MCSPI_RX0);
> +		if (word_len <= 8)
> +			((u8 *)xfer->rx_buf)[elements] = w;
> +		else if (word_len <= 16)
> +			((u16 *)xfer->rx_buf)[elements] = w;
> +		else /* word_len <= 32 */
> +			((u32 *)xfer->rx_buf)[elements] = w;
> +	} else {
> +		dev_err(&spi->dev, "DMA RX last word empty");
> +		count -= (word_len <= 8)  ? 1 :
> +			 (word_len <= 16) ? 2 :
> +		       /* word_len <= 32 */ 4;
> +	}
> +	omap2_mcspi_set_enable(spi, 1);
> +	return count;
> +}
> +
> +static unsigned
> +omap2_mcspi_txrx_dma(struct spi_device *spi, struct spi_transfer *xfer)
> +{
> +	struct omap2_mcspi	*mcspi;
> +	struct omap2_mcspi_cs	*cs = spi->controller_state;
> +	struct omap2_mcspi_dma  *mcspi_dma;
> +	unsigned int		count;
> +	u32			l;
> +	u8			*rx;
> +	const u8		*tx;
> +	struct dma_slave_config	cfg;
> +	enum dma_slave_buswidth width;
> +	unsigned es;
> +
> +	mcspi = spi_master_get_devdata(spi->master);
> +	mcspi_dma = &mcspi->dma_channels[spi->chip_select];
> +	l = mcspi_cached_chconf0(spi);
> +
> +
> +	if (cs->word_len <= 8) {
> +		width = DMA_SLAVE_BUSWIDTH_1_BYTE;
> +		es = 1;
> +	} else if (cs->word_len <= 16) {
> +		width = DMA_SLAVE_BUSWIDTH_2_BYTES;
> +		es = 2;
> +	} else {
> +		width = DMA_SLAVE_BUSWIDTH_4_BYTES;
> +		es = 4;
> +	}
> +
> +	memset(&cfg, 0, sizeof(cfg));
> +	cfg.src_addr = cs->phys + OMAP2_MCSPI_RX0;
> +	cfg.dst_addr = cs->phys + OMAP2_MCSPI_TX0;
> +	cfg.src_addr_width = width;
> +	cfg.dst_addr_width = width;
> +	cfg.src_maxburst = 1;
> +	cfg.dst_maxburst = 1;
> +
> +	rx = xfer->rx_buf;
> +	tx = xfer->tx_buf;
> +
> +	count = xfer->len;
> +
> +	if (tx != NULL)
> +		omap2_mcspi_tx_dma(spi, xfer, cfg);
> +
> +	if (rx != NULL)
> +		return omap2_mcspi_rx_dma(spi, xfer, cfg, es);
> +
>  	return count;
>  }
>  

--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux Arm (vger)]     [ARM Kernel]     [ARM MSM]     [Linux Tegra]     [Linux WPAN Networking]     [Linux Wireless Networking]     [Maemo Users]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite Trails]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux