aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMark Brown <broonie@kernel.org>2017-02-19 11:40:55 -0500
committerMark Brown <broonie@kernel.org>2017-02-19 11:40:55 -0500
commit3490462378944c7e137657d0d66bb707303cfc96 (patch)
treeed0a745abd1c44b02629c8aaa8943ef88f7300f9
parent42af2f5c52daec0c182af66984927ef64885bbcc (diff)
parent1ce24864bff40e11500a699789412115fdf244bf (diff)
Merge remote-tracking branch 'spi/topic/dma' into spi-next
-rw-r--r--drivers/spi/spi-mt65xx.c37
-rw-r--r--drivers/spi/spi.c8
2 files changed, 37 insertions, 8 deletions
diff --git a/drivers/spi/spi-mt65xx.c b/drivers/spi/spi-mt65xx.c
index 899d7a8f0889..278867a31950 100644
--- a/drivers/spi/spi-mt65xx.c
+++ b/drivers/spi/spi-mt65xx.c
@@ -73,7 +73,7 @@
73#define MTK_SPI_IDLE 0 73#define MTK_SPI_IDLE 0
74#define MTK_SPI_PAUSED 1 74#define MTK_SPI_PAUSED 1
75 75
76#define MTK_SPI_MAX_FIFO_SIZE 32 76#define MTK_SPI_MAX_FIFO_SIZE 32U
77#define MTK_SPI_PACKET_SIZE 1024 77#define MTK_SPI_PACKET_SIZE 1024
78 78
79struct mtk_spi_compatible { 79struct mtk_spi_compatible {
@@ -333,7 +333,7 @@ static int mtk_spi_fifo_transfer(struct spi_master *master,
333 struct mtk_spi *mdata = spi_master_get_devdata(master); 333 struct mtk_spi *mdata = spi_master_get_devdata(master);
334 334
335 mdata->cur_transfer = xfer; 335 mdata->cur_transfer = xfer;
336 mdata->xfer_len = xfer->len; 336 mdata->xfer_len = min(MTK_SPI_MAX_FIFO_SIZE, xfer->len);
337 mtk_spi_prepare_transfer(master, xfer); 337 mtk_spi_prepare_transfer(master, xfer);
338 mtk_spi_setup_packet(master); 338 mtk_spi_setup_packet(master);
339 339
@@ -410,7 +410,10 @@ static bool mtk_spi_can_dma(struct spi_master *master,
410 struct spi_device *spi, 410 struct spi_device *spi,
411 struct spi_transfer *xfer) 411 struct spi_transfer *xfer)
412{ 412{
413 return xfer->len > MTK_SPI_MAX_FIFO_SIZE; 413 /* Buffers for DMA transactions must be 4-byte aligned */
414 return (xfer->len > MTK_SPI_MAX_FIFO_SIZE &&
415 (unsigned long)xfer->tx_buf % 4 == 0 &&
416 (unsigned long)xfer->rx_buf % 4 == 0);
414} 417}
415 418
416static int mtk_spi_setup(struct spi_device *spi) 419static int mtk_spi_setup(struct spi_device *spi)
@@ -451,7 +454,33 @@ static irqreturn_t mtk_spi_interrupt(int irq, void *dev_id)
451 &reg_val, remainder); 454 &reg_val, remainder);
452 } 455 }
453 } 456 }
454 spi_finalize_current_transfer(master); 457
458 trans->len -= mdata->xfer_len;
459 if (!trans->len) {
460 spi_finalize_current_transfer(master);
461 return IRQ_HANDLED;
462 }
463
464 if (trans->tx_buf)
465 trans->tx_buf += mdata->xfer_len;
466 if (trans->rx_buf)
467 trans->rx_buf += mdata->xfer_len;
468
469 mdata->xfer_len = min(MTK_SPI_MAX_FIFO_SIZE, trans->len);
470 mtk_spi_setup_packet(master);
471
472 cnt = trans->len / 4;
473 iowrite32_rep(mdata->base + SPI_TX_DATA_REG, trans->tx_buf, cnt);
474
475 remainder = trans->len % 4;
476 if (remainder > 0) {
477 reg_val = 0;
478 memcpy(&reg_val, trans->tx_buf + (cnt * 4), remainder);
479 writel(reg_val, mdata->base + SPI_TX_DATA_REG);
480 }
481
482 mtk_spi_enable_transfer(master);
483
455 return IRQ_HANDLED; 484 return IRQ_HANDLED;
456 } 485 }
457 486
diff --git a/drivers/spi/spi.c b/drivers/spi/spi.c
index 59cb26470d70..e70955339d33 100644
--- a/drivers/spi/spi.c
+++ b/drivers/spi/spi.c
@@ -807,12 +807,12 @@ static int __spi_map_msg(struct spi_master *master, struct spi_message *msg)
807 if (master->dma_tx) 807 if (master->dma_tx)
808 tx_dev = master->dma_tx->device->dev; 808 tx_dev = master->dma_tx->device->dev;
809 else 809 else
810 tx_dev = &master->dev; 810 tx_dev = master->dev.parent;
811 811
812 if (master->dma_rx) 812 if (master->dma_rx)
813 rx_dev = master->dma_rx->device->dev; 813 rx_dev = master->dma_rx->device->dev;
814 else 814 else
815 rx_dev = &master->dev; 815 rx_dev = master->dev.parent;
816 816
817 list_for_each_entry(xfer, &msg->transfers, transfer_list) { 817 list_for_each_entry(xfer, &msg->transfers, transfer_list) {
818 if (!master->can_dma(master, msg->spi, xfer)) 818 if (!master->can_dma(master, msg->spi, xfer))
@@ -854,12 +854,12 @@ static int __spi_unmap_msg(struct spi_master *master, struct spi_message *msg)
854 if (master->dma_tx) 854 if (master->dma_tx)
855 tx_dev = master->dma_tx->device->dev; 855 tx_dev = master->dma_tx->device->dev;
856 else 856 else
857 tx_dev = &master->dev; 857 tx_dev = master->dev.parent;
858 858
859 if (master->dma_rx) 859 if (master->dma_rx)
860 rx_dev = master->dma_rx->device->dev; 860 rx_dev = master->dma_rx->device->dev;
861 else 861 else
862 rx_dev = &master->dev; 862 rx_dev = master->dev.parent;
863 863
864 list_for_each_entry(xfer, &msg->transfers, transfer_list) { 864 list_for_each_entry(xfer, &msg->transfers, transfer_list) {
865 if (!master->can_dma(master, msg->spi, xfer)) 865 if (!master->can_dma(master, msg->spi, xfer))