spi/dw_spi: conditional transfer mode changes
authorGeorge Shore <george@georgeshore.com>
Thu, 21 Jan 2010 11:40:52 +0000 (11:40 +0000)
committerGrant Likely <grant.likely@secretlab.ca>
Thu, 21 Jan 2010 14:25:32 +0000 (07:25 -0700)
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>
drivers/spi/dw_spi.c

index 3853df5db052aef28e4100bd6b4446176fc87b6d..e434320fded81f96fe4d6bcf5d76307c1d8045a0 100644 (file)
@@ -537,6 +537,22 @@ static void pump_transfers(unsigned long data)
        }
        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 */
        dws->dma_mapped = map_dma_buffers(dws);
 
This page took 0.026087 seconds and 5 git commands to generate.