aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/spi
diff options
context:
space:
mode:
authorBrian Niebuhr <bniebuhr@efjohnson.com>2010-10-05 06:13:08 -0400
committerSekhar Nori <nsekhar@ti.com>2010-11-18 08:08:35 -0500
commit6dbd29b27bd2627ba0025a6cff14381e69512cdf (patch)
tree4a47f66a53430f1c16ad12d291253cadb3cb8b97 /drivers/spi
parent9b189fd7584a1d8c68334dd1bc47b363877b314e (diff)
spi: davinci: remove usage of additional completion variables for DMA
The DMA code does not use the existing completion variable 'done' which is being used for interrupt mode transfers. Instead it uses two different completion variables specific to DMA mode transfers. Eliminate the usage of new completion variables for DMA mode and use the existing completion variable. [nsekhar@ti.com: To make this process easy, eliminate the two different DMA completion callback functions for tx and rx and use a single callback function instead] Signed-off-by: Brian Niebuhr <bniebuhr@efjohnson.com> Tested-By: Michael Williamson <michael.williamson@criticallink.com> Signed-off-by: Sekhar Nori <nsekhar@ti.com>
Diffstat (limited to 'drivers/spi')
-rw-r--r--drivers/spi/davinci_spi.c58
1 files changed, 23 insertions, 35 deletions
diff --git a/drivers/spi/davinci_spi.c b/drivers/spi/davinci_spi.c
index a47947da17a3..6094e3a07853 100644
--- a/drivers/spi/davinci_spi.c
+++ b/drivers/spi/davinci_spi.c
@@ -118,9 +118,6 @@ struct davinci_spi_dma {
118 int dma_rx_channel; 118 int dma_rx_channel;
119 int dummy_param_slot; 119 int dummy_param_slot;
120 enum dma_event_q eventq; 120 enum dma_event_q eventq;
121
122 struct completion dma_tx_completion;
123 struct completion dma_rx_completion;
124}; 121};
125 122
126/* SPI Controller driver's private data. */ 123/* SPI Controller driver's private data. */
@@ -386,32 +383,6 @@ static int davinci_spi_setup_transfer(struct spi_device *spi,
386 return 0; 383 return 0;
387} 384}
388 385
389static void davinci_spi_dma_rx_callback(unsigned lch, u16 ch_status, void *data)
390{
391 struct davinci_spi *davinci_spi = data;
392 struct davinci_spi_dma *davinci_spi_dma = &davinci_spi->dma_channels;
393
394 edma_stop(davinci_spi_dma->dma_rx_channel);
395
396 if (ch_status == DMA_COMPLETE)
397 davinci_spi->rcount = 0;
398
399 complete(&davinci_spi_dma->dma_rx_completion);
400}
401
402static void davinci_spi_dma_tx_callback(unsigned lch, u16 ch_status, void *data)
403{
404 struct davinci_spi *davinci_spi = data;
405 struct davinci_spi_dma *davinci_spi_dma = &davinci_spi->dma_channels;
406
407 edma_stop(davinci_spi_dma->dma_tx_channel);
408
409 if (ch_status == DMA_COMPLETE)
410 davinci_spi->wcount = 0;
411
412 complete(&davinci_spi_dma->dma_tx_completion);
413}
414
415/** 386/**
416 * davinci_spi_setup - This functions will set default transfer method 387 * davinci_spi_setup - This functions will set default transfer method
417 * @spi: spi device on which data transfer to be done 388 * @spi: spi device on which data transfer to be done
@@ -630,6 +601,25 @@ static irqreturn_t davinci_spi_irq(s32 irq, void *context_data)
630 return IRQ_HANDLED; 601 return IRQ_HANDLED;
631} 602}
632 603
604static void davinci_spi_dma_callback(unsigned lch, u16 status, void *data)
605{
606 struct davinci_spi *davinci_spi = data;
607 struct davinci_spi_dma *davinci_spi_dma = &davinci_spi->dma_channels;
608
609 edma_stop(lch);
610
611 if (status == DMA_COMPLETE) {
612 if (lch == davinci_spi_dma->dma_rx_channel)
613 davinci_spi->rcount = 0;
614 if (lch == davinci_spi_dma->dma_tx_channel)
615 davinci_spi->wcount = 0;
616 }
617
618 if ((!davinci_spi->wcount && !davinci_spi->rcount) ||
619 (status != DMA_COMPLETE))
620 complete(&davinci_spi->done);
621}
622
633static int davinci_spi_bufs_dma(struct spi_device *spi, struct spi_transfer *t) 623static int davinci_spi_bufs_dma(struct spi_device *spi, struct spi_transfer *t)
634{ 624{
635 struct davinci_spi *davinci_spi; 625 struct davinci_spi *davinci_spi;
@@ -660,8 +650,7 @@ static int davinci_spi_bufs_dma(struct spi_device *spi, struct spi_transfer *t)
660 davinci_spi->wcount = t->len / data_type; 650 davinci_spi->wcount = t->len / data_type;
661 davinci_spi->rcount = davinci_spi->wcount; 651 davinci_spi->rcount = davinci_spi->wcount;
662 652
663 init_completion(&davinci_spi_dma->dma_rx_completion); 653 INIT_COMPLETION(davinci_spi->done);
664 init_completion(&davinci_spi_dma->dma_tx_completion);
665 654
666 /* disable all interrupts for dma transfers */ 655 /* disable all interrupts for dma transfers */
667 clear_io_bits(davinci_spi->base + SPIINT, SPIINT_MASKALL); 656 clear_io_bits(davinci_spi->base + SPIINT, SPIINT_MASKALL);
@@ -752,8 +741,7 @@ static int davinci_spi_bufs_dma(struct spi_device *spi, struct spi_transfer *t)
752 edma_start(davinci_spi_dma->dma_tx_channel); 741 edma_start(davinci_spi_dma->dma_tx_channel);
753 set_io_bits(davinci_spi->base + SPIINT, SPIINT_DMA_REQ_EN); 742 set_io_bits(davinci_spi->base + SPIINT, SPIINT_DMA_REQ_EN);
754 743
755 wait_for_completion_interruptible(&davinci_spi_dma->dma_tx_completion); 744 wait_for_completion_interruptible(&davinci_spi->done);
756 wait_for_completion_interruptible(&davinci_spi_dma->dma_rx_completion);
757 745
758 if (t->tx_buf) 746 if (t->tx_buf)
759 dma_unmap_single(NULL, t->tx_dma, davinci_spi->wcount, 747 dma_unmap_single(NULL, t->tx_dma, davinci_spi->wcount,
@@ -787,7 +775,7 @@ static int davinci_spi_request_dma(struct davinci_spi *davinci_spi)
787 struct davinci_spi_dma *davinci_spi_dma = &davinci_spi->dma_channels; 775 struct davinci_spi_dma *davinci_spi_dma = &davinci_spi->dma_channels;
788 776
789 r = edma_alloc_channel(davinci_spi_dma->dma_rx_channel, 777 r = edma_alloc_channel(davinci_spi_dma->dma_rx_channel,
790 davinci_spi_dma_rx_callback, davinci_spi, 778 davinci_spi_dma_callback, davinci_spi,
791 davinci_spi_dma->eventq); 779 davinci_spi_dma->eventq);
792 if (r < 0) { 780 if (r < 0) {
793 pr_err("Unable to request DMA channel for SPI RX\n"); 781 pr_err("Unable to request DMA channel for SPI RX\n");
@@ -796,7 +784,7 @@ static int davinci_spi_request_dma(struct davinci_spi *davinci_spi)
796 } 784 }
797 785
798 r = edma_alloc_channel(davinci_spi_dma->dma_tx_channel, 786 r = edma_alloc_channel(davinci_spi_dma->dma_tx_channel,
799 davinci_spi_dma_tx_callback, davinci_spi, 787 davinci_spi_dma_callback, davinci_spi,
800 davinci_spi_dma->eventq); 788 davinci_spi_dma->eventq);
801 if (r < 0) { 789 if (r < 0) {
802 pr_err("Unable to request DMA channel for SPI TX\n"); 790 pr_err("Unable to request DMA channel for SPI TX\n");