diff options
-rw-r--r-- | drivers/spi/spi-sirf.c | 43 |
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 | ||
237 | static 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 | |||
248 | static irqreturn_t spi_sirfsoc_irq(int irq, void *dev_id) | 234 | static 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); |