aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/spi/spi_bfin5xx.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/spi/spi_bfin5xx.c')
-rw-r--r--drivers/spi/spi_bfin5xx.c26
1 files changed, 16 insertions, 10 deletions
diff --git a/drivers/spi/spi_bfin5xx.c b/drivers/spi/spi_bfin5xx.c
index b797ece0b10c..88dee87fc420 100644
--- a/drivers/spi/spi_bfin5xx.c
+++ b/drivers/spi/spi_bfin5xx.c
@@ -761,11 +761,10 @@ static void pump_transfers(unsigned long data)
761 if (!full_duplex && drv_data->cur_chip->enable_dma 761 if (!full_duplex && drv_data->cur_chip->enable_dma
762 && drv_data->len > 6) { 762 && drv_data->len > 6) {
763 763
764 unsigned long dma_start_addr; 764 unsigned long dma_start_addr, flags;
765 765
766 disable_dma(drv_data->dma_channel); 766 disable_dma(drv_data->dma_channel);
767 clear_dma_irqstat(drv_data->dma_channel); 767 clear_dma_irqstat(drv_data->dma_channel);
768 bfin_spi_disable(drv_data);
769 768
770 /* config dma channel */ 769 /* config dma channel */
771 dev_dbg(&drv_data->pdev->dev, "doing dma transfer\n"); 770 dev_dbg(&drv_data->pdev->dev, "doing dma transfer\n");
@@ -796,8 +795,7 @@ static void pump_transfers(unsigned long data)
796 enable_dma(drv_data->dma_channel); 795 enable_dma(drv_data->dma_channel);
797 796
798 /* start SPI transfer */ 797 /* start SPI transfer */
799 write_CTRL(drv_data, 798 write_CTRL(drv_data, cr | BIT_CTL_TIMOD_DMA_TX);
800 (cr | BIT_CTL_TIMOD_DMA_TX | BIT_CTL_ENABLE));
801 799
802 /* just return here, there can only be one transfer 800 /* just return here, there can only be one transfer
803 * in this mode 801 * in this mode
@@ -842,14 +840,22 @@ static void pump_transfers(unsigned long data)
842 } else 840 } else
843 BUG(); 841 BUG();
844 842
845 /* start dma */ 843 /* oh man, here there be monsters ... and i dont mean the
846 dma_enable_irq(drv_data->dma_channel); 844 * fluffy cute ones from pixar, i mean the kind that'll eat
847 set_dma_config(drv_data->dma_channel, dma_config); 845 * your data, kick your dog, and love it all. do *not* try
846 * and change these lines unless you (1) heavily test DMA
847 * with SPI flashes on a loaded system (e.g. ping floods),
848 * (2) know just how broken the DMA engine interaction with
849 * the SPI peripheral is, and (3) have someone else to blame
850 * when you screw it all up anyways.
851 */
848 set_dma_start_addr(drv_data->dma_channel, dma_start_addr); 852 set_dma_start_addr(drv_data->dma_channel, dma_start_addr);
853 set_dma_config(drv_data->dma_channel, dma_config);
854 local_irq_save(flags);
849 enable_dma(drv_data->dma_channel); 855 enable_dma(drv_data->dma_channel);
850 856 write_CTRL(drv_data, cr);
851 /* start SPI transfer */ 857 dma_enable_irq(drv_data->dma_channel);
852 write_CTRL(drv_data, (cr | BIT_CTL_ENABLE)); 858 local_irq_restore(flags);
853 859
854 } else { 860 } else {
855 /* IO mode write then read */ 861 /* IO mode write then read */