aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/spi/spi-rspi.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/spi/spi-rspi.c')
-rw-r--r--drivers/spi/spi-rspi.c149
1 files changed, 91 insertions, 58 deletions
diff --git a/drivers/spi/spi-rspi.c b/drivers/spi/spi-rspi.c
index c850dfdfa9e3..54bb0faec155 100644
--- a/drivers/spi/spi-rspi.c
+++ b/drivers/spi/spi-rspi.c
@@ -87,7 +87,7 @@
87/* RSPI on SH only */ 87/* RSPI on SH only */
88#define SPCR_TXMD 0x02 /* TX Only Mode (vs. Full Duplex) */ 88#define SPCR_TXMD 0x02 /* TX Only Mode (vs. Full Duplex) */
89#define SPCR_SPMS 0x01 /* 3-wire Mode (vs. 4-wire) */ 89#define SPCR_SPMS 0x01 /* 3-wire Mode (vs. 4-wire) */
90/* QSPI on R-Car M2 only */ 90/* QSPI on R-Car Gen2 only */
91#define SPCR_WSWAP 0x02 /* Word Swap of read-data for DMAC */ 91#define SPCR_WSWAP 0x02 /* Word Swap of read-data for DMAC */
92#define SPCR_BSWAP 0x01 /* Byte Swap of read-data for DMAC */ 92#define SPCR_BSWAP 0x01 /* Byte Swap of read-data for DMAC */
93 93
@@ -472,25 +472,52 @@ static int rspi_dma_transfer(struct rspi_data *rspi, struct sg_table *tx,
472 dma_cookie_t cookie; 472 dma_cookie_t cookie;
473 int ret; 473 int ret;
474 474
475 if (tx) { 475 /* First prepare and submit the DMA request(s), as this may fail */
476 desc_tx = dmaengine_prep_slave_sg(rspi->master->dma_tx,
477 tx->sgl, tx->nents, DMA_TO_DEVICE,
478 DMA_PREP_INTERRUPT | DMA_CTRL_ACK);
479 if (!desc_tx)
480 goto no_dma;
481
482 irq_mask |= SPCR_SPTIE;
483 }
484 if (rx) { 476 if (rx) {
485 desc_rx = dmaengine_prep_slave_sg(rspi->master->dma_rx, 477 desc_rx = dmaengine_prep_slave_sg(rspi->master->dma_rx,
486 rx->sgl, rx->nents, DMA_FROM_DEVICE, 478 rx->sgl, rx->nents, DMA_FROM_DEVICE,
487 DMA_PREP_INTERRUPT | DMA_CTRL_ACK); 479 DMA_PREP_INTERRUPT | DMA_CTRL_ACK);
488 if (!desc_rx) 480 if (!desc_rx) {
489 goto no_dma; 481 ret = -EAGAIN;
482 goto no_dma_rx;
483 }
484
485 desc_rx->callback = rspi_dma_complete;
486 desc_rx->callback_param = rspi;
487 cookie = dmaengine_submit(desc_rx);
488 if (dma_submit_error(cookie)) {
489 ret = cookie;
490 goto no_dma_rx;
491 }
490 492
491 irq_mask |= SPCR_SPRIE; 493 irq_mask |= SPCR_SPRIE;
492 } 494 }
493 495
496 if (tx) {
497 desc_tx = dmaengine_prep_slave_sg(rspi->master->dma_tx,
498 tx->sgl, tx->nents, DMA_TO_DEVICE,
499 DMA_PREP_INTERRUPT | DMA_CTRL_ACK);
500 if (!desc_tx) {
501 ret = -EAGAIN;
502 goto no_dma_tx;
503 }
504
505 if (rx) {
506 /* No callback */
507 desc_tx->callback = NULL;
508 } else {
509 desc_tx->callback = rspi_dma_complete;
510 desc_tx->callback_param = rspi;
511 }
512 cookie = dmaengine_submit(desc_tx);
513 if (dma_submit_error(cookie)) {
514 ret = cookie;
515 goto no_dma_tx;
516 }
517
518 irq_mask |= SPCR_SPTIE;
519 }
520
494 /* 521 /*
495 * DMAC needs SPxIE, but if SPxIE is set, the IRQ routine will be 522 * DMAC needs SPxIE, but if SPxIE is set, the IRQ routine will be
496 * called. So, this driver disables the IRQ while DMA transfer. 523 * called. So, this driver disables the IRQ while DMA transfer.
@@ -503,34 +530,24 @@ static int rspi_dma_transfer(struct rspi_data *rspi, struct sg_table *tx,
503 rspi_enable_irq(rspi, irq_mask); 530 rspi_enable_irq(rspi, irq_mask);
504 rspi->dma_callbacked = 0; 531 rspi->dma_callbacked = 0;
505 532
506 if (rx) { 533 /* Now start DMA */
507 desc_rx->callback = rspi_dma_complete; 534 if (rx)
508 desc_rx->callback_param = rspi;
509 cookie = dmaengine_submit(desc_rx);
510 if (dma_submit_error(cookie))
511 return cookie;
512 dma_async_issue_pending(rspi->master->dma_rx); 535 dma_async_issue_pending(rspi->master->dma_rx);
513 } 536 if (tx)
514 if (tx) {
515 if (rx) {
516 /* No callback */
517 desc_tx->callback = NULL;
518 } else {
519 desc_tx->callback = rspi_dma_complete;
520 desc_tx->callback_param = rspi;
521 }
522 cookie = dmaengine_submit(desc_tx);
523 if (dma_submit_error(cookie))
524 return cookie;
525 dma_async_issue_pending(rspi->master->dma_tx); 537 dma_async_issue_pending(rspi->master->dma_tx);
526 }
527 538
528 ret = wait_event_interruptible_timeout(rspi->wait, 539 ret = wait_event_interruptible_timeout(rspi->wait,
529 rspi->dma_callbacked, HZ); 540 rspi->dma_callbacked, HZ);
530 if (ret > 0 && rspi->dma_callbacked) 541 if (ret > 0 && rspi->dma_callbacked)
531 ret = 0; 542 ret = 0;
532 else if (!ret) 543 else if (!ret) {
544 dev_err(&rspi->master->dev, "DMA timeout\n");
533 ret = -ETIMEDOUT; 545 ret = -ETIMEDOUT;
546 if (tx)
547 dmaengine_terminate_all(rspi->master->dma_tx);
548 if (rx)
549 dmaengine_terminate_all(rspi->master->dma_rx);
550 }
534 551
535 rspi_disable_irq(rspi, irq_mask); 552 rspi_disable_irq(rspi, irq_mask);
536 553
@@ -541,11 +558,16 @@ static int rspi_dma_transfer(struct rspi_data *rspi, struct sg_table *tx,
541 558
542 return ret; 559 return ret;
543 560
544no_dma: 561no_dma_tx:
545 pr_warn_once("%s %s: DMA not available, falling back to PIO\n", 562 if (rx)
546 dev_driver_string(&rspi->master->dev), 563 dmaengine_terminate_all(rspi->master->dma_rx);
547 dev_name(&rspi->master->dev)); 564no_dma_rx:
548 return -EAGAIN; 565 if (ret == -EAGAIN) {
566 pr_warn_once("%s %s: DMA not available, falling back to PIO\n",
567 dev_driver_string(&rspi->master->dev),
568 dev_name(&rspi->master->dev));
569 }
570 return ret;
549} 571}
550 572
551static void rspi_receive_init(const struct rspi_data *rspi) 573static void rspi_receive_init(const struct rspi_data *rspi)
@@ -887,20 +909,24 @@ static struct dma_chan *rspi_request_dma_chan(struct device *dev,
887 dma_cap_zero(mask); 909 dma_cap_zero(mask);
888 dma_cap_set(DMA_SLAVE, mask); 910 dma_cap_set(DMA_SLAVE, mask);
889 911
890 chan = dma_request_channel(mask, shdma_chan_filter, 912 chan = dma_request_slave_channel_compat(mask, shdma_chan_filter,
891 (void *)(unsigned long)id); 913 (void *)(unsigned long)id, dev,
914 dir == DMA_MEM_TO_DEV ? "tx" : "rx");
892 if (!chan) { 915 if (!chan) {
893 dev_warn(dev, "dma_request_channel failed\n"); 916 dev_warn(dev, "dma_request_slave_channel_compat failed\n");
894 return NULL; 917 return NULL;
895 } 918 }
896 919
897 memset(&cfg, 0, sizeof(cfg)); 920 memset(&cfg, 0, sizeof(cfg));
898 cfg.slave_id = id; 921 cfg.slave_id = id;
899 cfg.direction = dir; 922 cfg.direction = dir;
900 if (dir == DMA_MEM_TO_DEV) 923 if (dir == DMA_MEM_TO_DEV) {
901 cfg.dst_addr = port_addr; 924 cfg.dst_addr = port_addr;
902 else 925 cfg.dst_addr_width = DMA_SLAVE_BUSWIDTH_1_BYTE;
926 } else {
903 cfg.src_addr = port_addr; 927 cfg.src_addr = port_addr;
928 cfg.src_addr_width = DMA_SLAVE_BUSWIDTH_1_BYTE;
929 }
904 930
905 ret = dmaengine_slave_config(chan, &cfg); 931 ret = dmaengine_slave_config(chan, &cfg);
906 if (ret) { 932 if (ret) {
@@ -916,22 +942,30 @@ static int rspi_request_dma(struct device *dev, struct spi_master *master,
916 const struct resource *res) 942 const struct resource *res)
917{ 943{
918 const struct rspi_plat_data *rspi_pd = dev_get_platdata(dev); 944 const struct rspi_plat_data *rspi_pd = dev_get_platdata(dev);
945 unsigned int dma_tx_id, dma_rx_id;
946
947 if (dev->of_node) {
948 /* In the OF case we will get the slave IDs from the DT */
949 dma_tx_id = 0;
950 dma_rx_id = 0;
951 } else if (rspi_pd && rspi_pd->dma_tx_id && rspi_pd->dma_rx_id) {
952 dma_tx_id = rspi_pd->dma_tx_id;
953 dma_rx_id = rspi_pd->dma_rx_id;
954 } else {
955 /* The driver assumes no error. */
956 return 0;
957 }
919 958
920 if (!rspi_pd || !rspi_pd->dma_rx_id || !rspi_pd->dma_tx_id) 959 master->dma_tx = rspi_request_dma_chan(dev, DMA_MEM_TO_DEV, dma_tx_id,
921 return 0; /* The driver assumes no error. */
922
923 master->dma_rx = rspi_request_dma_chan(dev, DMA_DEV_TO_MEM,
924 rspi_pd->dma_rx_id,
925 res->start + RSPI_SPDR); 960 res->start + RSPI_SPDR);
926 if (!master->dma_rx) 961 if (!master->dma_tx)
927 return -ENODEV; 962 return -ENODEV;
928 963
929 master->dma_tx = rspi_request_dma_chan(dev, DMA_MEM_TO_DEV, 964 master->dma_rx = rspi_request_dma_chan(dev, DMA_DEV_TO_MEM, dma_rx_id,
930 rspi_pd->dma_tx_id,
931 res->start + RSPI_SPDR); 965 res->start + RSPI_SPDR);
932 if (!master->dma_tx) { 966 if (!master->dma_rx) {
933 dma_release_channel(master->dma_rx); 967 dma_release_channel(master->dma_tx);
934 master->dma_rx = NULL; 968 master->dma_tx = NULL;
935 return -ENODEV; 969 return -ENODEV;
936 } 970 }
937 971
@@ -1024,12 +1058,11 @@ static int rspi_request_irq(struct device *dev, unsigned int irq,
1024 irq_handler_t handler, const char *suffix, 1058 irq_handler_t handler, const char *suffix,
1025 void *dev_id) 1059 void *dev_id)
1026{ 1060{
1027 const char *base = dev_name(dev); 1061 const char *name = devm_kasprintf(dev, GFP_KERNEL, "%s:%s",
1028 size_t len = strlen(base) + strlen(suffix) + 2; 1062 dev_name(dev), suffix);
1029 char *name = devm_kzalloc(dev, len, GFP_KERNEL);
1030 if (!name) 1063 if (!name)
1031 return -ENOMEM; 1064 return -ENOMEM;
1032 snprintf(name, len, "%s:%s", base, suffix); 1065
1033 return devm_request_irq(dev, irq, handler, 0, name, dev_id); 1066 return devm_request_irq(dev, irq, handler, 0, name, dev_id);
1034} 1067}
1035 1068
@@ -1062,7 +1095,7 @@ static int rspi_probe(struct platform_device *pdev)
1062 master->num_chipselect = rspi_pd->num_chipselect; 1095 master->num_chipselect = rspi_pd->num_chipselect;
1063 else 1096 else
1064 master->num_chipselect = 2; /* default */ 1097 master->num_chipselect = 2; /* default */
1065 }; 1098 }
1066 1099
1067 /* ops parameter check */ 1100 /* ops parameter check */
1068 if (!ops->set_config_register) { 1101 if (!ops->set_config_register) {