Commit 5c2818cdfad1973ede3dcd2a8709620a192f8385

Authored by Cory Maccarrone
Committed by Grant Likely
1 parent 4751c1c74b

SPI100k: Fix 8-bit and RX-only transfers

This change fixes 8-bit transfers and RX-only transfers.  The
SPI100k framework requires minimum 16-bit words to be written, so 8-bit
transfers must be shited by 8 bits and sent out as a 16-bit word.

Additionally, receive-only transfers were failing due to the
perceived need to fill the TX buffer with something.  This is in
fact not needed.

Signed-off-by: Cory Maccarrone <darkstar6262@gmail.com>
Signed-off-by: Grant Likely <grant.likely@secretlab.ca>

Showing 1 changed file with 12 additions and 11 deletions Side-by-side Diff

drivers/spi/omap_spi_100k.c
... ... @@ -141,7 +141,12 @@
141 141 {
142 142 struct omap1_spi100k *spi100k = spi_master_get_devdata(master);
143 143  
144   - /* write 16-bit word */
  144 + /* write 16-bit word, shifting 8-bit data if necessary */
  145 + if (len <= 8) {
  146 + data <<= 8;
  147 + len = 16;
  148 + }
  149 +
145 150 spi100k_enable_clock(master);
146 151 writew( data , spi100k->base + SPI_TX_MSB);
147 152  
... ... @@ -162,6 +167,10 @@
162 167 int dataH,dataL;
163 168 struct omap1_spi100k *spi100k = spi_master_get_devdata(master);
164 169  
  170 + /* Always do at least 16 bits */
  171 + if (len <= 8)
  172 + len = 16;
  173 +
165 174 spi100k_enable_clock(master);
166 175 writew(SPI_CTRL_SEN(0) |
167 176 SPI_CTRL_WORD_SIZE(len) |
... ... @@ -214,10 +223,6 @@
214 223 c = count;
215 224 word_len = cs->word_len;
216 225  
217   - /* RX_ONLY mode needs dummy data in TX reg */
218   - if (xfer->tx_buf == NULL)
219   - spi100k_write_data(spi->master,word_len, 0);
220   -
221 226 if (word_len <= 8) {
222 227 u8 *rx;
223 228 const u8 *tx;
224 229  
... ... @@ -227,9 +232,9 @@
227 232 do {
228 233 c-=1;
229 234 if (xfer->tx_buf != NULL)
230   - spi100k_write_data(spi->master,word_len, *tx);
  235 + spi100k_write_data(spi->master, word_len, *tx++);
231 236 if (xfer->rx_buf != NULL)
232   - *rx = spi100k_read_data(spi->master,word_len);
  237 + *rx++ = spi100k_read_data(spi->master, word_len);
233 238 } while(c);
234 239 } else if (word_len <= 16) {
235 240 u16 *rx;
... ... @@ -379,10 +384,6 @@
379 384  
380 385 if (t->len) {
381 386 unsigned count;
382   -
383   - /* RX_ONLY mode needs dummy data in TX reg */
384   - if (t->tx_buf == NULL)
385   - spi100k_write_data(spi->master, 8, 0);
386 387  
387 388 count = omap1_spi100k_txrx_pio(spi, t);
388 389 m->actual_length += count;