aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/spi/dw_spi.c
diff options
context:
space:
mode:
authorGeorge Shore <george@georgeshore.com>2010-01-21 06:40:52 -0500
committerGrant Likely <grant.likely@secretlab.ca>2010-01-21 09:25:32 -0500
commit052dc7c45d8f685fb3720a08331ba3e91e87937e (patch)
treeb874258f108a2ac2d8dbec12a137562d4ea4b402 /drivers/spi/dw_spi.c
parentf4aec798ae5a837a1f062e295f9a5f1b00962589 (diff)
spi/dw_spi: conditional transfer mode changes
This allows the switching between transfer modes between 'transmit only', 'receive only' and 'transmit and receive' modes. Due to the design of the SPI block, changing transfer modes requires that the block be disabled; in doing so the chipselect line is inherently deasserted and (usually) the attached device discards its state. Consequentially, switching modes requires that a platform-specific chipselect function has been defined so that the chipselect is not dropped during the change. Signed-off-by: George Shore <george@georgeshore.com> Signed-off-by: Grant Likely <grant.likely@secretlab.ca>
Diffstat (limited to 'drivers/spi/dw_spi.c')
-rw-r--r--drivers/spi/dw_spi.c16
1 files changed, 16 insertions, 0 deletions
diff --git a/drivers/spi/dw_spi.c b/drivers/spi/dw_spi.c
index 3853df5db052..e434320fded8 100644
--- a/drivers/spi/dw_spi.c
+++ b/drivers/spi/dw_spi.c
@@ -537,6 +537,22 @@ static void pump_transfers(unsigned long data)
537 } 537 }
538 message->state = RUNNING_STATE; 538 message->state = RUNNING_STATE;
539 539
540 /*
541 * Adjust transfer mode if necessary. Requires platform dependent
542 * chipselect mechanism.
543 */
544 if (dws->cs_control) {
545 if (dws->rx && dws->tx)
546 chip->tmode = 0x00;
547 else if (dws->rx)
548 chip->tmode = 0x02;
549 else
550 chip->tmode = 0x01;
551
552 cr0 &= ~(0x3 << SPI_MODE_OFFSET);
553 cr0 |= (chip->tmode << SPI_TMOD_OFFSET);
554 }
555
540 /* Check if current transfer is a DMA transaction */ 556 /* Check if current transfer is a DMA transaction */
541 dws->dma_mapped = map_dma_buffers(dws); 557 dws->dma_mapped = map_dma_buffers(dws);
542 558