diff options
Diffstat (limited to 'drivers/spi/spi-rspi.c')
-rw-r--r-- | drivers/spi/spi-rspi.c | 149 |
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 | ||
544 | no_dma: | 561 | no_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)); | 564 | no_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 | ||
551 | static void rspi_receive_init(const struct rspi_data *rspi) | 573 | static 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) { |