aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAxel Lin <axel.lin@ingics.com>2014-01-08 03:00:04 -0500
committerMark Brown <broonie@linaro.org>2014-01-09 12:58:28 -0500
commite826a7ff69b285ea295144303653c01f781ea9dc (patch)
tree8e0048fbe4467e23787cdc76b80ce04a9f9b5dcc
parent6ce4eac1f600b34f2f7f58f9cd8f0503d79e42ae (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.c62
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