aboutsummaryrefslogtreecommitdiffstats
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
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>
-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