Commit 052dc7c4 authored by George Shore's avatar George Shore Committed by Grant Likely

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: default avatarGeorge Shore <george@georgeshore.com>
Signed-off-by: default avatarGrant Likely <grant.likely@secretlab.ca>
parent f4aec798
...@@ -537,6 +537,22 @@ static void pump_transfers(unsigned long data) ...@@ -537,6 +537,22 @@ static void pump_transfers(unsigned long data)
} }
message->state = RUNNING_STATE; message->state = RUNNING_STATE;
/*
* Adjust transfer mode if necessary. Requires platform dependent
* chipselect mechanism.
*/
if (dws->cs_control) {
if (dws->rx && dws->tx)
chip->tmode = 0x00;
else if (dws->rx)
chip->tmode = 0x02;
else
chip->tmode = 0x01;
cr0 &= ~(0x3 << SPI_MODE_OFFSET);
cr0 |= (chip->tmode << SPI_TMOD_OFFSET);
}
/* Check if current transfer is a DMA transaction */ /* Check if current transfer is a DMA transaction */
dws->dma_mapped = map_dma_buffers(dws); dws->dma_mapped = map_dma_buffers(dws);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment