diff options
author | Sonic Zhang <sonic.zhang@analog.com> | 2007-12-05 02:45:21 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-12-05 12:21:20 -0500 |
commit | 07612e5f224613020c0ba17ce28e8eac052ef8ce (patch) | |
tree | a401cf425ee349496cf4bfa2015bad601aa6f730 /drivers/spi/spi_bfin5xx.c | |
parent | 62310e51ac10c5e50998240e49a84d2e28377a48 (diff) |
spi: spi_bfin: resequence DMA start/stop
Set correct baud for spi mmc and enable SPI only after DMA is started.
Signed-off-by: Sonic Zhang <sonic.zhang@analog.com>
Signed-off-by: Bryan Wu <bryan.wu@analog.com>
Signed-off-by: David Brownell <dbrownell@users.sourceforge.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.c | 30 |
1 files changed, 19 insertions, 11 deletions
diff --git a/drivers/spi/spi_bfin5xx.c b/drivers/spi/spi_bfin5xx.c index 4dc7e6749322..a85bcb306590 100644 --- a/drivers/spi/spi_bfin5xx.c +++ b/drivers/spi/spi_bfin5xx.c | |||
@@ -231,13 +231,13 @@ static int restore_state(struct driver_data *drv_data) | |||
231 | dev_dbg(&drv_data->pdev->dev, "restoring spi ctl state\n"); | 231 | dev_dbg(&drv_data->pdev->dev, "restoring spi ctl state\n"); |
232 | 232 | ||
233 | /* Load the registers */ | 233 | /* Load the registers */ |
234 | cs_deactive(drv_data, chip); | ||
235 | write_BAUD(drv_data, chip->baud); | 234 | write_BAUD(drv_data, chip->baud); |
236 | chip->ctl_reg &= (~BIT_CTL_TIMOD); | 235 | chip->ctl_reg &= (~BIT_CTL_TIMOD); |
237 | chip->ctl_reg |= (chip->width << 8); | 236 | chip->ctl_reg |= (chip->width << 8); |
238 | write_CTRL(drv_data, chip->ctl_reg); | 237 | write_CTRL(drv_data, chip->ctl_reg); |
239 | 238 | ||
240 | bfin_spi_enable(drv_data); | 239 | bfin_spi_enable(drv_data); |
240 | cs_active(drv_data, chip); | ||
241 | 241 | ||
242 | if (ret) | 242 | if (ret) |
243 | dev_dbg(&drv_data->pdev->dev, | 243 | dev_dbg(&drv_data->pdev->dev, |
@@ -767,6 +767,7 @@ static void pump_transfers(unsigned long data) | |||
767 | 767 | ||
768 | disable_dma(drv_data->dma_channel); | 768 | disable_dma(drv_data->dma_channel); |
769 | clear_dma_irqstat(drv_data->dma_channel); | 769 | clear_dma_irqstat(drv_data->dma_channel); |
770 | bfin_spi_disable(drv_data); | ||
770 | 771 | ||
771 | /* config dma channel */ | 772 | /* config dma channel */ |
772 | dev_dbg(&drv_data->pdev->dev, "doing dma transfer\n"); | 773 | dev_dbg(&drv_data->pdev->dev, "doing dma transfer\n"); |
@@ -789,9 +790,6 @@ static void pump_transfers(unsigned long data) | |||
789 | dev_dbg(&drv_data->pdev->dev, | 790 | dev_dbg(&drv_data->pdev->dev, |
790 | "doing autobuffer DMA out.\n"); | 791 | "doing autobuffer DMA out.\n"); |
791 | 792 | ||
792 | /* set SPI transfer mode */ | ||
793 | write_CTRL(drv_data, (cr | CFG_SPI_DMAWRITE)); | ||
794 | |||
795 | /* no irq in autobuffer mode */ | 793 | /* no irq in autobuffer mode */ |
796 | dma_config = | 794 | dma_config = |
797 | (DMAFLOW_AUTO | RESTART | dma_width | DI_EN); | 795 | (DMAFLOW_AUTO | RESTART | dma_width | DI_EN); |
@@ -800,7 +798,13 @@ static void pump_transfers(unsigned long data) | |||
800 | (unsigned long)drv_data->tx); | 798 | (unsigned long)drv_data->tx); |
801 | enable_dma(drv_data->dma_channel); | 799 | enable_dma(drv_data->dma_channel); |
802 | 800 | ||
803 | /* just return here, there can only be one transfer in this mode */ | 801 | /* start SPI transfer */ |
802 | write_CTRL(drv_data, | ||
803 | (cr | CFG_SPI_DMAWRITE | BIT_CTL_ENABLE)); | ||
804 | |||
805 | /* just return here, there can only be one transfer | ||
806 | * in this mode | ||
807 | */ | ||
804 | message->status = 0; | 808 | message->status = 0; |
805 | giveback(drv_data); | 809 | giveback(drv_data); |
806 | return; | 810 | return; |
@@ -811,9 +815,6 @@ static void pump_transfers(unsigned long data) | |||
811 | /* set transfer mode, and enable SPI */ | 815 | /* set transfer mode, and enable SPI */ |
812 | dev_dbg(&drv_data->pdev->dev, "doing DMA in.\n"); | 816 | dev_dbg(&drv_data->pdev->dev, "doing DMA in.\n"); |
813 | 817 | ||
814 | /* set SPI transfer mode */ | ||
815 | write_CTRL(drv_data, (cr | CFG_SPI_DMAREAD)); | ||
816 | |||
817 | /* clear tx reg soformer data is not shifted out */ | 818 | /* clear tx reg soformer data is not shifted out */ |
818 | write_TDBR(drv_data, 0xFFFF); | 819 | write_TDBR(drv_data, 0xFFFF); |
819 | 820 | ||
@@ -827,12 +828,13 @@ static void pump_transfers(unsigned long data) | |||
827 | (unsigned long)drv_data->rx); | 828 | (unsigned long)drv_data->rx); |
828 | enable_dma(drv_data->dma_channel); | 829 | enable_dma(drv_data->dma_channel); |
829 | 830 | ||
831 | /* start SPI transfer */ | ||
832 | write_CTRL(drv_data, | ||
833 | (cr | CFG_SPI_DMAREAD | BIT_CTL_ENABLE)); | ||
834 | |||
830 | } else if (drv_data->tx != NULL) { | 835 | } else if (drv_data->tx != NULL) { |
831 | dev_dbg(&drv_data->pdev->dev, "doing DMA out.\n"); | 836 | dev_dbg(&drv_data->pdev->dev, "doing DMA out.\n"); |
832 | 837 | ||
833 | /* set SPI transfer mode */ | ||
834 | write_CTRL(drv_data, (cr | CFG_SPI_DMAWRITE)); | ||
835 | |||
836 | /* start dma */ | 838 | /* start dma */ |
837 | dma_enable_irq(drv_data->dma_channel); | 839 | dma_enable_irq(drv_data->dma_channel); |
838 | dma_config = (RESTART | dma_width | DI_EN); | 840 | dma_config = (RESTART | dma_width | DI_EN); |
@@ -840,6 +842,10 @@ static void pump_transfers(unsigned long data) | |||
840 | set_dma_start_addr(drv_data->dma_channel, | 842 | set_dma_start_addr(drv_data->dma_channel, |
841 | (unsigned long)drv_data->tx); | 843 | (unsigned long)drv_data->tx); |
842 | enable_dma(drv_data->dma_channel); | 844 | enable_dma(drv_data->dma_channel); |
845 | |||
846 | /* start SPI transfer */ | ||
847 | write_CTRL(drv_data, | ||
848 | (cr | CFG_SPI_DMAWRITE | BIT_CTL_ENABLE)); | ||
843 | } | 849 | } |
844 | } else { | 850 | } else { |
845 | /* IO mode write then read */ | 851 | /* IO mode write then read */ |
@@ -1142,6 +1148,8 @@ static int setup(struct spi_device *spi) | |||
1142 | peripheral_request(ssel[spi->master->bus_num] | 1148 | peripheral_request(ssel[spi->master->bus_num] |
1143 | [chip->chip_select_num-1], DRV_NAME); | 1149 | [chip->chip_select_num-1], DRV_NAME); |
1144 | 1150 | ||
1151 | cs_deactive(drv_data, chip); | ||
1152 | |||
1145 | return 0; | 1153 | return 0; |
1146 | } | 1154 | } |
1147 | 1155 | ||