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 | ||