diff options
Diffstat (limited to 'drivers/spi/davinci_spi.c')
-rw-r--r-- | drivers/spi/davinci_spi.c | 153 |
1 files changed, 51 insertions, 102 deletions
diff --git a/drivers/spi/davinci_spi.c b/drivers/spi/davinci_spi.c index 9695f98b03b..6db47860102 100644 --- a/drivers/spi/davinci_spi.c +++ b/drivers/spi/davinci_spi.c | |||
@@ -116,8 +116,6 @@ | |||
116 | struct davinci_spi_dma { | 116 | struct davinci_spi_dma { |
117 | int dma_tx_channel; | 117 | int dma_tx_channel; |
118 | int dma_rx_channel; | 118 | int dma_rx_channel; |
119 | int dma_tx_sync_dev; | ||
120 | int dma_rx_sync_dev; | ||
121 | enum dma_event_q eventq; | 119 | enum dma_event_q eventq; |
122 | 120 | ||
123 | struct completion dma_tx_completion; | 121 | struct completion dma_tx_completion; |
@@ -153,8 +151,6 @@ struct davinci_spi { | |||
153 | 151 | ||
154 | static struct davinci_spi_config davinci_spi_default_cfg; | 152 | static struct davinci_spi_config davinci_spi_default_cfg; |
155 | 153 | ||
156 | static unsigned use_dma; | ||
157 | |||
158 | static void davinci_spi_rx_buf_u8(u32 data, struct davinci_spi *davinci_spi) | 154 | static void davinci_spi_rx_buf_u8(u32 data, struct davinci_spi *davinci_spi) |
159 | { | 155 | { |
160 | if (davinci_spi->rx) { | 156 | if (davinci_spi->rx) { |
@@ -391,12 +387,7 @@ static int davinci_spi_setup_transfer(struct spi_device *spi, | |||
391 | 387 | ||
392 | static void davinci_spi_dma_rx_callback(unsigned lch, u16 ch_status, void *data) | 388 | static void davinci_spi_dma_rx_callback(unsigned lch, u16 ch_status, void *data) |
393 | { | 389 | { |
394 | struct spi_device *spi = (struct spi_device *)data; | 390 | struct davinci_spi_dma *davinci_spi_dma = data; |
395 | struct davinci_spi *davinci_spi; | ||
396 | struct davinci_spi_dma *davinci_spi_dma; | ||
397 | |||
398 | davinci_spi = spi_master_get_devdata(spi->master); | ||
399 | davinci_spi_dma = &davinci_spi->dma_channels; | ||
400 | 391 | ||
401 | if (ch_status == DMA_COMPLETE) | 392 | if (ch_status == DMA_COMPLETE) |
402 | edma_stop(davinci_spi_dma->dma_rx_channel); | 393 | edma_stop(davinci_spi_dma->dma_rx_channel); |
@@ -408,12 +399,7 @@ static void davinci_spi_dma_rx_callback(unsigned lch, u16 ch_status, void *data) | |||
408 | 399 | ||
409 | static void davinci_spi_dma_tx_callback(unsigned lch, u16 ch_status, void *data) | 400 | static void davinci_spi_dma_tx_callback(unsigned lch, u16 ch_status, void *data) |
410 | { | 401 | { |
411 | struct spi_device *spi = (struct spi_device *)data; | 402 | struct davinci_spi_dma *davinci_spi_dma = data; |
412 | struct davinci_spi *davinci_spi; | ||
413 | struct davinci_spi_dma *davinci_spi_dma; | ||
414 | |||
415 | davinci_spi = spi_master_get_devdata(spi->master); | ||
416 | davinci_spi_dma = &davinci_spi->dma_channels; | ||
417 | 403 | ||
418 | if (ch_status == DMA_COMPLETE) | 404 | if (ch_status == DMA_COMPLETE) |
419 | edma_stop(davinci_spi_dma->dma_tx_channel); | 405 | edma_stop(davinci_spi_dma->dma_tx_channel); |
@@ -423,39 +409,6 @@ static void davinci_spi_dma_tx_callback(unsigned lch, u16 ch_status, void *data) | |||
423 | complete(&davinci_spi_dma->dma_tx_completion); | 409 | complete(&davinci_spi_dma->dma_tx_completion); |
424 | } | 410 | } |
425 | 411 | ||
426 | static int davinci_spi_request_dma(struct spi_device *spi) | ||
427 | { | ||
428 | struct davinci_spi *davinci_spi; | ||
429 | struct davinci_spi_dma *davinci_spi_dma; | ||
430 | struct device *sdev; | ||
431 | int r; | ||
432 | |||
433 | davinci_spi = spi_master_get_devdata(spi->master); | ||
434 | davinci_spi_dma = &davinci_spi->dma_channels; | ||
435 | sdev = davinci_spi->bitbang.master->dev.parent; | ||
436 | |||
437 | r = edma_alloc_channel(davinci_spi_dma->dma_rx_sync_dev, | ||
438 | davinci_spi_dma_rx_callback, spi, | ||
439 | davinci_spi_dma->eventq); | ||
440 | if (r < 0) { | ||
441 | dev_dbg(sdev, "Unable to request DMA channel for SPI RX\n"); | ||
442 | return -EAGAIN; | ||
443 | } | ||
444 | davinci_spi_dma->dma_rx_channel = r; | ||
445 | r = edma_alloc_channel(davinci_spi_dma->dma_tx_sync_dev, | ||
446 | davinci_spi_dma_tx_callback, spi, | ||
447 | davinci_spi_dma->eventq); | ||
448 | if (r < 0) { | ||
449 | edma_free_channel(davinci_spi_dma->dma_rx_channel); | ||
450 | davinci_spi_dma->dma_rx_channel = -1; | ||
451 | dev_dbg(sdev, "Unable to request DMA channel for SPI TX\n"); | ||
452 | return -EAGAIN; | ||
453 | } | ||
454 | davinci_spi_dma->dma_tx_channel = r; | ||
455 | |||
456 | return 0; | ||
457 | } | ||
458 | |||
459 | /** | 412 | /** |
460 | * davinci_spi_setup - This functions will set default transfer method | 413 | * davinci_spi_setup - This functions will set default transfer method |
461 | * @spi: spi device on which data transfer to be done | 414 | * @spi: spi device on which data transfer to be done |
@@ -466,7 +419,6 @@ static int davinci_spi_setup(struct spi_device *spi) | |||
466 | { | 419 | { |
467 | int retval = 0; | 420 | int retval = 0; |
468 | struct davinci_spi *davinci_spi; | 421 | struct davinci_spi *davinci_spi; |
469 | struct davinci_spi_dma *davinci_spi_dma; | ||
470 | struct davinci_spi_platform_data *pdata; | 422 | struct davinci_spi_platform_data *pdata; |
471 | 423 | ||
472 | davinci_spi = spi_master_get_devdata(spi->master); | 424 | davinci_spi = spi_master_get_devdata(spi->master); |
@@ -494,33 +446,9 @@ static int davinci_spi_setup(struct spi_device *spi) | |||
494 | clear_io_bits(davinci_spi->base + SPIGCR1, | 446 | clear_io_bits(davinci_spi->base + SPIGCR1, |
495 | SPIGCR1_LOOPBACK_MASK); | 447 | SPIGCR1_LOOPBACK_MASK); |
496 | 448 | ||
497 | if (use_dma) { | ||
498 | davinci_spi_dma = &davinci_spi->dma_channels; | ||
499 | |||
500 | if ((davinci_spi_dma->dma_rx_channel == -1) || | ||
501 | (davinci_spi_dma->dma_tx_channel == -1)) | ||
502 | retval = davinci_spi_request_dma(spi); | ||
503 | } | ||
504 | |||
505 | return retval; | 449 | return retval; |
506 | } | 450 | } |
507 | 451 | ||
508 | static void davinci_spi_cleanup(struct spi_device *spi) | ||
509 | { | ||
510 | if (use_dma) { | ||
511 | struct davinci_spi *davinci_spi = | ||
512 | spi_master_get_devdata(spi->master); | ||
513 | struct davinci_spi_dma *davinci_spi_dma = | ||
514 | &davinci_spi->dma_channels; | ||
515 | |||
516 | if ((davinci_spi_dma->dma_rx_channel != -1) | ||
517 | && (davinci_spi_dma->dma_tx_channel != -1)) { | ||
518 | edma_free_channel(davinci_spi_dma->dma_tx_channel); | ||
519 | edma_free_channel(davinci_spi_dma->dma_rx_channel); | ||
520 | } | ||
521 | } | ||
522 | } | ||
523 | |||
524 | static int davinci_spi_check_error(struct davinci_spi *davinci_spi, | 452 | static int davinci_spi_check_error(struct davinci_spi *davinci_spi, |
525 | int int_status) | 453 | int int_status) |
526 | { | 454 | { |
@@ -842,6 +770,30 @@ static int davinci_spi_bufs_dma(struct spi_device *spi, struct spi_transfer *t) | |||
842 | return t->len; | 770 | return t->len; |
843 | } | 771 | } |
844 | 772 | ||
773 | static int davinci_spi_request_dma(struct davinci_spi_dma *davinci_spi_dma) | ||
774 | { | ||
775 | int r; | ||
776 | |||
777 | r = edma_alloc_channel(davinci_spi_dma->dma_rx_channel, | ||
778 | davinci_spi_dma_rx_callback, davinci_spi_dma, | ||
779 | davinci_spi_dma->eventq); | ||
780 | if (r < 0) { | ||
781 | pr_err("Unable to request DMA channel for SPI RX\n"); | ||
782 | return -EAGAIN; | ||
783 | } | ||
784 | |||
785 | r = edma_alloc_channel(davinci_spi_dma->dma_tx_channel, | ||
786 | davinci_spi_dma_tx_callback, davinci_spi_dma, | ||
787 | davinci_spi_dma->eventq); | ||
788 | if (r < 0) { | ||
789 | edma_free_channel(davinci_spi_dma->dma_rx_channel); | ||
790 | pr_err("Unable to request DMA channel for SPI TX\n"); | ||
791 | return -EAGAIN; | ||
792 | } | ||
793 | |||
794 | return 0; | ||
795 | } | ||
796 | |||
845 | /** | 797 | /** |
846 | * davinci_spi_probe - probe function for SPI Master Controller | 798 | * davinci_spi_probe - probe function for SPI Master Controller |
847 | * @pdev: platform_device structure which contains plateform specific data | 799 | * @pdev: platform_device structure which contains plateform specific data |
@@ -928,45 +880,39 @@ static int davinci_spi_probe(struct platform_device *pdev) | |||
928 | master->bus_num = pdev->id; | 880 | master->bus_num = pdev->id; |
929 | master->num_chipselect = pdata->num_chipselect; | 881 | master->num_chipselect = pdata->num_chipselect; |
930 | master->setup = davinci_spi_setup; | 882 | master->setup = davinci_spi_setup; |
931 | master->cleanup = davinci_spi_cleanup; | ||
932 | 883 | ||
933 | davinci_spi->bitbang.chipselect = davinci_spi_chipselect; | 884 | davinci_spi->bitbang.chipselect = davinci_spi_chipselect; |
934 | davinci_spi->bitbang.setup_transfer = davinci_spi_setup_transfer; | 885 | davinci_spi->bitbang.setup_transfer = davinci_spi_setup_transfer; |
935 | 886 | ||
936 | davinci_spi->version = pdata->version; | 887 | davinci_spi->version = pdata->version; |
937 | use_dma = pdata->use_dma; | ||
938 | 888 | ||
939 | davinci_spi->bitbang.flags = SPI_NO_CS | SPI_LSB_FIRST | SPI_LOOP; | 889 | davinci_spi->bitbang.flags = SPI_NO_CS | SPI_LSB_FIRST | SPI_LOOP; |
940 | if (davinci_spi->version == SPI_VERSION_2) | 890 | if (davinci_spi->version == SPI_VERSION_2) |
941 | davinci_spi->bitbang.flags |= SPI_READY; | 891 | davinci_spi->bitbang.flags |= SPI_READY; |
942 | 892 | ||
943 | if (use_dma) { | 893 | r = platform_get_resource(pdev, IORESOURCE_DMA, 0); |
944 | r = platform_get_resource(pdev, IORESOURCE_DMA, 0); | 894 | if (r) |
945 | if (r) | 895 | dma_rx_chan = r->start; |
946 | dma_rx_chan = r->start; | 896 | r = platform_get_resource(pdev, IORESOURCE_DMA, 1); |
947 | r = platform_get_resource(pdev, IORESOURCE_DMA, 1); | 897 | if (r) |
948 | if (r) | 898 | dma_tx_chan = r->start; |
949 | dma_tx_chan = r->start; | 899 | r = platform_get_resource(pdev, IORESOURCE_DMA, 2); |
950 | r = platform_get_resource(pdev, IORESOURCE_DMA, 2); | 900 | if (r) |
951 | if (r) | 901 | dma_eventq = r->start; |
952 | dma_eventq = r->start; | 902 | |
953 | } | 903 | davinci_spi->bitbang.txrx_bufs = davinci_spi_bufs_pio; |
954 | 904 | if (dma_rx_chan != SPI_NO_RESOURCE && | |
955 | if (!use_dma || | 905 | dma_tx_chan != SPI_NO_RESOURCE && |
956 | dma_rx_chan == SPI_NO_RESOURCE || | 906 | dma_eventq != SPI_NO_RESOURCE) { |
957 | dma_tx_chan == SPI_NO_RESOURCE || | 907 | davinci_spi->dma_channels.dma_rx_channel = dma_rx_chan; |
958 | dma_eventq == SPI_NO_RESOURCE) { | 908 | davinci_spi->dma_channels.dma_tx_channel = dma_tx_chan; |
959 | davinci_spi->bitbang.txrx_bufs = davinci_spi_bufs_pio; | ||
960 | use_dma = 0; | ||
961 | } else { | ||
962 | davinci_spi->bitbang.txrx_bufs = davinci_spi_bufs_dma; | ||
963 | |||
964 | davinci_spi->dma_channels.dma_rx_channel = -1; | ||
965 | davinci_spi->dma_channels.dma_rx_sync_dev = dma_rx_chan; | ||
966 | davinci_spi->dma_channels.dma_tx_channel = -1; | ||
967 | davinci_spi->dma_channels.dma_tx_sync_dev = dma_tx_chan; | ||
968 | davinci_spi->dma_channels.eventq = dma_eventq; | 909 | davinci_spi->dma_channels.eventq = dma_eventq; |
969 | 910 | ||
911 | ret = davinci_spi_request_dma(&davinci_spi->dma_channels); | ||
912 | if (ret) | ||
913 | goto free_clk; | ||
914 | |||
915 | davinci_spi->bitbang.txrx_bufs = davinci_spi_bufs_dma; | ||
970 | dev_info(&pdev->dev, "DaVinci SPI driver in EDMA mode\n" | 916 | dev_info(&pdev->dev, "DaVinci SPI driver in EDMA mode\n" |
971 | "Using RX channel = %d , TX channel = %d and " | 917 | "Using RX channel = %d , TX channel = %d and " |
972 | "event queue = %d", dma_rx_chan, dma_tx_chan, | 918 | "event queue = %d", dma_rx_chan, dma_tx_chan, |
@@ -1015,12 +961,15 @@ static int davinci_spi_probe(struct platform_device *pdev) | |||
1015 | 961 | ||
1016 | ret = spi_bitbang_start(&davinci_spi->bitbang); | 962 | ret = spi_bitbang_start(&davinci_spi->bitbang); |
1017 | if (ret) | 963 | if (ret) |
1018 | goto free_clk; | 964 | goto free_dma; |
1019 | 965 | ||
1020 | dev_info(&pdev->dev, "Controller at 0x%p\n", davinci_spi->base); | 966 | dev_info(&pdev->dev, "Controller at 0x%p\n", davinci_spi->base); |
1021 | 967 | ||
1022 | return ret; | 968 | return ret; |
1023 | 969 | ||
970 | free_dma: | ||
971 | edma_free_channel(davinci_spi->dma_channels.dma_tx_channel); | ||
972 | edma_free_channel(davinci_spi->dma_channels.dma_rx_channel); | ||
1024 | free_clk: | 973 | free_clk: |
1025 | clk_disable(davinci_spi->clk); | 974 | clk_disable(davinci_spi->clk); |
1026 | clk_put(davinci_spi->clk); | 975 | clk_put(davinci_spi->clk); |