aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/spi/spi-sirf.c43
1 files changed, 13 insertions, 30 deletions
diff --git a/drivers/spi/spi-sirf.c b/drivers/spi/spi-sirf.c
index ac2ea8a1bd65..e00b437fa2a2 100644
--- a/drivers/spi/spi-sirf.c
+++ b/drivers/spi/spi-sirf.c
@@ -140,9 +140,6 @@ struct sirfsoc_spi {
140 unsigned int left_tx_cnt; 140 unsigned int left_tx_cnt;
141 unsigned int left_rx_cnt; 141 unsigned int left_rx_cnt;
142 142
143 /* tasklet to push tx msg into FIFO */
144 struct tasklet_struct tasklet_tx;
145
146 int chipselect[0]; 143 int chipselect[0];
147}; 144};
148 145
@@ -234,17 +231,6 @@ static void spi_sirfsoc_tx_word_u32(struct sirfsoc_spi *sspi)
234 sspi->left_tx_cnt--; 231 sspi->left_tx_cnt--;
235} 232}
236 233
237static void spi_sirfsoc_tasklet_tx(unsigned long arg)
238{
239 struct sirfsoc_spi *sspi = (struct sirfsoc_spi *)arg;
240
241 /* Fill Tx FIFO while there are left words to be transmitted */
242 while (!((readl(sspi->base + SIRFSOC_SPI_TXFIFO_STATUS) &
243 SIRFSOC_SPI_FIFO_FULL)) &&
244 sspi->left_tx_cnt)
245 sspi->tx_word(sspi);
246}
247
248static irqreturn_t spi_sirfsoc_irq(int irq, void *dev_id) 234static irqreturn_t spi_sirfsoc_irq(int irq, void *dev_id)
249{ 235{
250 struct sirfsoc_spi *sspi = dev_id; 236 struct sirfsoc_spi *sspi = dev_id;
@@ -259,25 +245,25 @@ static irqreturn_t spi_sirfsoc_irq(int irq, void *dev_id)
259 writel(0x0, sspi->base + SIRFSOC_SPI_INT_EN); 245 writel(0x0, sspi->base + SIRFSOC_SPI_INT_EN);
260 } 246 }
261 247
262 if (spi_stat & SIRFSOC_SPI_FRM_END) { 248 if (spi_stat & (SIRFSOC_SPI_FRM_END
249 | SIRFSOC_SPI_RXFIFO_THD_REACH))
263 while (!((readl(sspi->base + SIRFSOC_SPI_RXFIFO_STATUS) 250 while (!((readl(sspi->base + SIRFSOC_SPI_RXFIFO_STATUS)
264 & SIRFSOC_SPI_FIFO_EMPTY)) && 251 & SIRFSOC_SPI_FIFO_EMPTY)) &&
265 sspi->left_rx_cnt) 252 sspi->left_rx_cnt)
266 sspi->rx_word(sspi); 253 sspi->rx_word(sspi);
267 254
268 /* Received all words */ 255 if (spi_stat & (SIRFSOC_SPI_FIFO_EMPTY
269 if ((sspi->left_rx_cnt == 0) && (sspi->left_tx_cnt == 0)) { 256 | SIRFSOC_SPI_TXFIFO_THD_REACH))
270 complete(&sspi->done); 257 while (!((readl(sspi->base + SIRFSOC_SPI_TXFIFO_STATUS)
271 writel(0x0, sspi->base + SIRFSOC_SPI_INT_EN); 258 & SIRFSOC_SPI_FIFO_FULL)) &&
272 } 259 sspi->left_tx_cnt)
273 } 260 sspi->tx_word(sspi);
274
275 if (spi_stat & SIRFSOC_SPI_RXFIFO_THD_REACH ||
276 spi_stat & SIRFSOC_SPI_TXFIFO_THD_REACH ||
277 spi_stat & SIRFSOC_SPI_RX_FIFO_FULL ||
278 spi_stat & SIRFSOC_SPI_TXFIFO_EMPTY)
279 tasklet_schedule(&sspi->tasklet_tx);
280 261
262 /* Received all words */
263 if ((sspi->left_rx_cnt == 0) && (sspi->left_tx_cnt == 0)) {
264 complete(&sspi->done);
265 writel(0x0, sspi->base + SIRFSOC_SPI_INT_EN);
266 }
281 return IRQ_HANDLED; 267 return IRQ_HANDLED;
282} 268}
283 269
@@ -566,9 +552,6 @@ static int spi_sirfsoc_probe(struct platform_device *pdev)
566 552
567 init_completion(&sspi->done); 553 init_completion(&sspi->done);
568 554
569 tasklet_init(&sspi->tasklet_tx, spi_sirfsoc_tasklet_tx,
570 (unsigned long)sspi);
571
572 writel(SIRFSOC_SPI_FIFO_RESET, sspi->base + SIRFSOC_SPI_RXFIFO_OP); 555 writel(SIRFSOC_SPI_FIFO_RESET, sspi->base + SIRFSOC_SPI_RXFIFO_OP);
573 writel(SIRFSOC_SPI_FIFO_RESET, sspi->base + SIRFSOC_SPI_TXFIFO_OP); 556 writel(SIRFSOC_SPI_FIFO_RESET, sspi->base + SIRFSOC_SPI_TXFIFO_OP);
574 writel(SIRFSOC_SPI_FIFO_START, sspi->base + SIRFSOC_SPI_RXFIFO_OP); 557 writel(SIRFSOC_SPI_FIFO_START, sspi->base + SIRFSOC_SPI_RXFIFO_OP);