diff options
| author | Axel Lin <axel.lin@ingics.com> | 2014-01-08 03:00:04 -0500 |
|---|---|---|
| committer | Mark Brown <broonie@linaro.org> | 2014-01-09 12:58:28 -0500 |
| commit | e826a7ff69b285ea295144303653c01f781ea9dc (patch) | |
| tree | 8e0048fbe4467e23787cdc76b80ce04a9f9b5dcc | |
| parent | 6ce4eac1f600b34f2f7f58f9cd8f0503d79e42ae (diff) | |
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>
| -rw-r--r-- | drivers/spi/spi-oc-tiny.c | 62 |
1 files changed, 11 insertions, 51 deletions
diff --git a/drivers/spi/spi-oc-tiny.c b/drivers/spi/spi-oc-tiny.c index 91c668596202..f7c896e2981e 100644 --- a/drivers/spi/spi-oc-tiny.c +++ b/drivers/spi/spi-oc-tiny.c | |||
| @@ -153,62 +153,22 @@ static int tiny_spi_txrx_bufs(struct spi_device *spi, struct spi_transfer *t) | |||
| 153 | } | 153 | } |
| 154 | 154 | ||
| 155 | wait_for_completion(&hw->done); | 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 | } else { | 156 | } else { |
| 202 | writeb(0, hw->base + TINY_SPI_TXDATA); | 157 | /* we need to tighten the transfer loop */ |
| 203 | if (t->len > 1) { | 158 | writeb(txp ? *txp++ : 0, hw->base + TINY_SPI_TXDATA); |
| 204 | writeb(0, hw->base + TINY_SPI_TXDATA); | 159 | for (i = 1; i < t->len; i++) { |
| 205 | for (i = 2; i < t->len; i++) { | 160 | writeb(txp ? *txp++ : 0, hw->base + TINY_SPI_TXDATA); |
| 161 | |||
| 162 | if (rxp || (i != t->len - 1)) | ||
| 206 | tiny_spi_wait_txr(hw); | 163 | tiny_spi_wait_txr(hw); |
| 207 | writeb(0, hw->base + TINY_SPI_TXDATA); | 164 | if (rxp) |
| 208 | } | 165 | *rxp++ = readb(hw->base + TINY_SPI_TXDATA); |
| 209 | } | 166 | } |
| 210 | tiny_spi_wait_txe(hw); | 167 | tiny_spi_wait_txe(hw); |
| 168 | if (rxp) | ||
| 169 | *rxp++ = readb(hw->base + TINY_SPI_RXDATA); | ||
| 211 | } | 170 | } |
| 171 | |||
| 212 | return t->len; | 172 | return t->len; |
| 213 | } | 173 | } |
| 214 | 174 | ||
