static int spi_imx_setupxfer(struct spi_device *spi, struct spi_transfer *t) { struct spi_imx_data *spi_imx = spi_master_get_devdata(spi->master); struct spi_imx_config config; int ret; config.bpw = t ? t->bits_per_word : spi->bits_per_word; config.speed_hz = t ? t->speed_hz : spi->max_speed_hz; config.mode = spi->mode; config.cs = spi->chip_select; if (!config.speed_hz) config.speed_hz = spi->max_speed_hz; if (!config.bpw) config.bpw = spi->bits_per_word; /* Initialize the functions for transfer */ if (config.bpw <= 8) { spi_imx->rx = spi_imx_buf_rx_u8; spi_imx->tx = spi_imx_buf_tx_u8; spi_imx->tx_config.dst_addr_width = DMA_SLAVE_BUSWIDTH_1_BYTE; spi_imx->rx_config.src_addr_width = DMA_SLAVE_BUSWIDTH_1_BYTE; } else if (config.bpw <= 16) { spi_imx->rx = spi_imx_buf_rx_u16; spi_imx->tx = spi_imx_buf_tx_u16; spi_imx->tx_config.dst_addr_width = DMA_SLAVE_BUSWIDTH_2_BYTES; spi_imx->rx_config.src_addr_width = DMA_SLAVE_BUSWIDTH_2_BYTES; } else { spi_imx->rx = spi_imx_buf_rx_u32; spi_imx->tx = spi_imx_buf_tx_u32; spi_imx->tx_config.dst_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES; spi_imx->rx_config.src_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES; } if (spi_imx->bitbang.master->can_dma && spi_imx_can_dma(spi_imx->bitbang.master, spi, t)) { ret = dmaengine_slave_config(spi_imx->bitbang.master->dma_tx, &spi_imx->tx_config); if (ret) { dev_err(&spi->dev, "error in TX dma configuration.\n"); return ret; } ret = dmaengine_slave_config(spi_imx->bitbang.master->dma_rx, &spi_imx->rx_config); if (ret) { dev_err(&spi->dev, "error in RX dma configuration.\n"); return ret; } } spi_imx->devtype_data->config(spi_imx, &config); return 0; }
static int spi_imx_transfer(struct spi_device *spi, struct spi_transfer *transfer) { int ret; struct spi_imx_data *spi_imx = spi_master_get_devdata(spi->master); if (spi_imx->bitbang.master->can_dma && spi_imx_can_dma(spi_imx->bitbang.master, spi, transfer)) { spi_imx->usedma = true; ret = spi_imx_dma_transfer(spi_imx, transfer); if (ret != -EAGAIN) return ret; } spi_imx->usedma = false; return spi_imx_pio_transfer(spi, transfer); }
static int spi_imx_setupxfer(struct spi_device *spi, struct spi_transfer *t) { struct spi_imx_data *spi_imx = spi_master_get_devdata(spi->master); struct spi_imx_config config; int ret; config.bpw = t ? t->bits_per_word : spi->bits_per_word; config.speed_hz = t ? t->speed_hz : spi->max_speed_hz; if (!config.speed_hz) config.speed_hz = spi->max_speed_hz; if (!config.bpw) config.bpw = spi->bits_per_word; /* Initialize the functions for transfer */ if (config.bpw <= 8) { spi_imx->rx = spi_imx_buf_rx_u8; spi_imx->tx = spi_imx_buf_tx_u8; } else if (config.bpw <= 16) { spi_imx->rx = spi_imx_buf_rx_u16; spi_imx->tx = spi_imx_buf_tx_u16; } else { spi_imx->rx = spi_imx_buf_rx_u32; spi_imx->tx = spi_imx_buf_tx_u32; } if (spi_imx_can_dma(spi_imx->bitbang.master, spi, t)) spi_imx->usedma = 1; else spi_imx->usedma = 0; if (spi_imx->usedma) { ret = spi_imx_dma_configure(spi->master, spi_imx_bytes_per_word(config.bpw)); if (ret) return ret; } spi_imx->devtype_data->config(spi, &config); return 0; }