From: Richard Genoud <richard.gen...@gmail.com> Signed-off-by: Richard Genoud <richard.gen...@gmail.com> Cc: grant.lik...@secretlab.ca Cc: spi-devel-general@lists.sourceforge.net --- drivers/spi/spi-atmel.c | 53 +++++++++++++++++++++++++++++++---------------- 1 file changed, 35 insertions(+), 18 deletions(-)
diff --git a/drivers/spi/spi-atmel.c b/drivers/spi/spi-atmel.c index 0007a53..7a3613d 100644 --- a/drivers/spi/spi-atmel.c +++ b/drivers/spi/spi-atmel.c @@ -249,6 +249,8 @@ struct atmel_spi_device { #define BUFFER_SIZE PAGE_SIZE #define INVALID_DMA_ADDRESS 0xffffffff +static struct dma_slave_config slave_config; + /* * Version 2 of the SPI controller has * - CR.LASTXFER @@ -406,17 +408,41 @@ static bool filter(struct dma_chan *chan, void *slave) } } +static int atmel_spi_set_dma_xfer_width(struct atmel_spi *as, u8 bits_per_word) +{ + int err = 0; + + if (bits_per_word > 8) { + slave_config.dst_addr_width = DMA_SLAVE_BUSWIDTH_2_BYTES; + slave_config.src_addr_width = DMA_SLAVE_BUSWIDTH_2_BYTES; + } else { + slave_config.dst_addr_width = DMA_SLAVE_BUSWIDTH_1_BYTE; + slave_config.src_addr_width = DMA_SLAVE_BUSWIDTH_1_BYTE; + } + + slave_config.direction = DMA_TO_DEVICE; + if (dmaengine_slave_config(as->dma.chan_tx, &slave_config)) { + dev_err(&as->pdev->dev, + "failed to configure tx dma channel\n"); + err = -EINVAL; + } + + slave_config.direction = DMA_FROM_DEVICE; + if (dmaengine_slave_config(as->dma.chan_rx, &slave_config)) { + dev_err(&as->pdev->dev, + "failed to configure rx dma channel\n"); + err = -EINVAL; + } + return err; +} + static int __devinit atmel_spi_configure_dma(struct atmel_spi *as) { struct at_dma_slave *sdata = (struct at_dma_slave *)&as->data.dma_slave; - struct dma_slave_config slave_config; int err; - memset(&slave_config, 0, sizeof(slave_config)); slave_config.dst_addr = (dma_addr_t)as->phybase + SPI_TDR; slave_config.src_addr = (dma_addr_t)as->phybase + SPI_RDR; - slave_config.dst_addr_width = DMA_SLAVE_BUSWIDTH_1_BYTE; - slave_config.src_addr_width = DMA_SLAVE_BUSWIDTH_1_BYTE; slave_config.src_maxburst = 1; slave_config.dst_maxburst = 1; slave_config.device_fc = false; @@ -439,21 +465,9 @@ static int __devinit atmel_spi_configure_dma(struct atmel_spi *as) goto error; } - slave_config.direction = DMA_TO_DEVICE; - if (dmaengine_slave_config(as->dma.chan_tx, &slave_config)) { - dev_err(&as->pdev->dev, - "failed to configure tx dma channel\n"); - err = -EINVAL; + err = atmel_spi_set_dma_xfer_width(as, 8); + if (err) goto error; - } - - slave_config.direction = DMA_FROM_DEVICE; - if (dmaengine_slave_config(as->dma.chan_rx, &slave_config)) { - dev_err(&as->pdev->dev, - "failed to configure rx dma channel\n"); - err = -EINVAL; - goto error; - } dev_info(&as->pdev->dev, "Using %s (tx) and " \ " %s (rx) for DMA transfers\n", @@ -575,6 +589,9 @@ static int atmel_spi_next_xfer_dma(struct spi_master *master, memset(as->buffer, 0, xfer->len); } + if (atmel_spi_set_dma_xfer_width(as, xfer->bits_per_word)) + goto err_dma; + /* Send both scatterlists */ rxdesc = rxchan->device->device_prep_slave_sg(rxchan, &as->dma.sgrx, -- 1.7.9.5 ------------------------------------------------------------------------------ Everyone hates slow websites. So do we. Make your web apps faster with AppDynamics Download AppDynamics Lite for free today: http://p.sf.net/sfu/appdyn_d2d_nov _______________________________________________ spi-devel-general mailing list spi-devel-general@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/spi-devel-general