Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

spi: oc-tiny: Simplify tiny_spi_txrx_bufs implementation when irq is not used

Currently we have similar code for (txp && rxp), (txp && !rxp), (!rxp & txp),
and (!txp && !rxp) cases. This patch refactors the code a bit to avoid
duplicate similar code.

Signed-off-by: Axel Lin <axel.lin@ingics.com>
Signed-off-by: Mark Brown <broonie@linaro.org>

authored by

Axel Lin and committed by
Mark Brown
e826a7ff 6ce4eac1

+11 -51
+11 -51
drivers/spi/spi-oc-tiny.c
··· 153 153 } 154 154 155 155 wait_for_completion(&hw->done); 156 - } else if (txp && rxp) { 157 - /* we need to tighten the transfer loop */ 158 - writeb(*txp++, hw->base + TINY_SPI_TXDATA); 159 - if (t->len > 1) { 160 - writeb(*txp++, hw->base + TINY_SPI_TXDATA); 161 - for (i = 2; i < t->len; i++) { 162 - u8 rx, tx = *txp++; 163 - tiny_spi_wait_txr(hw); 164 - rx = readb(hw->base + TINY_SPI_TXDATA); 165 - writeb(tx, hw->base + TINY_SPI_TXDATA); 166 - *rxp++ = rx; 167 - } 168 - tiny_spi_wait_txr(hw); 169 - *rxp++ = readb(hw->base + TINY_SPI_TXDATA); 170 - } 171 - tiny_spi_wait_txe(hw); 172 - *rxp++ = readb(hw->base + TINY_SPI_RXDATA); 173 - } else if (rxp) { 174 - writeb(0, hw->base + TINY_SPI_TXDATA); 175 - if (t->len > 1) { 176 - writeb(0, 177 - hw->base + TINY_SPI_TXDATA); 178 - for (i = 2; i < t->len; i++) { 179 - u8 rx; 180 - tiny_spi_wait_txr(hw); 181 - rx = readb(hw->base + TINY_SPI_TXDATA); 182 - writeb(0, hw->base + TINY_SPI_TXDATA); 183 - *rxp++ = rx; 184 - } 185 - tiny_spi_wait_txr(hw); 186 - *rxp++ = readb(hw->base + TINY_SPI_TXDATA); 187 - } 188 - tiny_spi_wait_txe(hw); 189 - *rxp++ = readb(hw->base + TINY_SPI_RXDATA); 190 - } else if (txp) { 191 - writeb(*txp++, hw->base + TINY_SPI_TXDATA); 192 - if (t->len > 1) { 193 - writeb(*txp++, hw->base + TINY_SPI_TXDATA); 194 - for (i = 2; i < t->len; i++) { 195 - u8 tx = *txp++; 196 - tiny_spi_wait_txr(hw); 197 - writeb(tx, hw->base + TINY_SPI_TXDATA); 198 - } 199 - } 200 - tiny_spi_wait_txe(hw); 201 156 } else { 202 - writeb(0, hw->base + TINY_SPI_TXDATA); 203 - if (t->len > 1) { 204 - writeb(0, hw->base + TINY_SPI_TXDATA); 205 - for (i = 2; i < t->len; i++) { 157 + /* we need to tighten the transfer loop */ 158 + writeb(txp ? *txp++ : 0, hw->base + TINY_SPI_TXDATA); 159 + for (i = 1; i < t->len; i++) { 160 + writeb(txp ? *txp++ : 0, hw->base + TINY_SPI_TXDATA); 161 + 162 + if (rxp || (i != t->len - 1)) 206 163 tiny_spi_wait_txr(hw); 207 - writeb(0, hw->base + TINY_SPI_TXDATA); 208 - } 164 + if (rxp) 165 + *rxp++ = readb(hw->base + TINY_SPI_TXDATA); 209 166 } 210 167 tiny_spi_wait_txe(hw); 168 + if (rxp) 169 + *rxp++ = readb(hw->base + TINY_SPI_RXDATA); 211 170 } 171 + 212 172 return t->len; 213 173 } 214 174