Commit 5c2818cdfad1973ede3dcd2a8709620a192f8385
Committed by
Grant Likely
1 parent
4751c1c74b
Exists in
master
and in
7 other branches
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; |