aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/spi/spi_bfin5xx.c
diff options
context:
space:
mode:
authorMike Frysinger <vapier.adi@gmail.com>2009-04-06 22:00:41 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2009-04-07 11:31:05 -0400
commit11d6f5995137ba4dc49e9337185ac0a8753f8f69 (patch)
tree36f45d8415d190db572be32dd12ec24424c98ad5 /drivers/spi/spi_bfin5xx.c
parent4160bde2d83d1c66e9c774c48015a13733fe9aba (diff)
Blackfin SPI Driver: get dma working for SPI flashes
When using a BF533-STAMP here with a W25X10 SPI flash. It works fine when enable_dma is disabled, but doesn't work at all when turning DMA on. We get just 0xff bytes back when trying to read the device. Change the code around so that it programs the SPI first and then enables DMA, it seems to work a lot better ... Signed-off-by: Mike Frysinger <vapier.adi@gmail.com> Signed-off-by: Bryan Wu <cooloney@kernel.org> Acked-by: David Brownell <dbrownell@users.sourceforge.net> Cc: David Brownell <david-b@pacbell.net> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
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 */