]> Pileus Git - ~andy/linux/blobdiff - drivers/spi/spi-sirf.c
HID: detect Win 8 multitouch devices in core
[~andy/linux] / drivers / spi / spi-sirf.c
index ac2ea8a1bd650a60002a1e2d2f91b9bbc5e01737..fc20bcfd90c30dd7bf90faa9eb4cd8785822b38e 100644 (file)
@@ -140,9 +140,6 @@ struct sirfsoc_spi {
        unsigned int left_tx_cnt;
        unsigned int left_rx_cnt;
 
-       /* tasklet to push tx msg into FIFO */
-       struct tasklet_struct tasklet_tx;
-
        int chipselect[0];
 };
 
@@ -234,17 +231,6 @@ static void spi_sirfsoc_tx_word_u32(struct sirfsoc_spi *sspi)
        sspi->left_tx_cnt--;
 }
 
-static void spi_sirfsoc_tasklet_tx(unsigned long arg)
-{
-       struct sirfsoc_spi *sspi = (struct sirfsoc_spi *)arg;
-
-       /* Fill Tx FIFO while there are left words to be transmitted */
-       while (!((readl(sspi->base + SIRFSOC_SPI_TXFIFO_STATUS) &
-                       SIRFSOC_SPI_FIFO_FULL)) &&
-                       sspi->left_tx_cnt)
-               sspi->tx_word(sspi);
-}
-
 static irqreturn_t spi_sirfsoc_irq(int irq, void *dev_id)
 {
        struct sirfsoc_spi *sspi = dev_id;
@@ -259,25 +245,25 @@ static irqreturn_t spi_sirfsoc_irq(int irq, void *dev_id)
                writel(0x0, sspi->base + SIRFSOC_SPI_INT_EN);
        }
 
-       if (spi_stat & SIRFSOC_SPI_FRM_END) {
+       if (spi_stat & (SIRFSOC_SPI_FRM_END
+                       | SIRFSOC_SPI_RXFIFO_THD_REACH))
                while (!((readl(sspi->base + SIRFSOC_SPI_RXFIFO_STATUS)
                                & SIRFSOC_SPI_FIFO_EMPTY)) &&
                                sspi->left_rx_cnt)
                        sspi->rx_word(sspi);
 
-               /* Received all words */
-               if ((sspi->left_rx_cnt == 0) && (sspi->left_tx_cnt == 0)) {
-                       complete(&sspi->done);
-                       writel(0x0, sspi->base + SIRFSOC_SPI_INT_EN);
-               }
-       }
-
-       if (spi_stat & SIRFSOC_SPI_RXFIFO_THD_REACH ||
-               spi_stat & SIRFSOC_SPI_TXFIFO_THD_REACH ||
-               spi_stat & SIRFSOC_SPI_RX_FIFO_FULL ||
-               spi_stat & SIRFSOC_SPI_TXFIFO_EMPTY)
-               tasklet_schedule(&sspi->tasklet_tx);
+       if (spi_stat & (SIRFSOC_SPI_FIFO_EMPTY
+                       | SIRFSOC_SPI_TXFIFO_THD_REACH))
+               while (!((readl(sspi->base + SIRFSOC_SPI_TXFIFO_STATUS)
+                               & SIRFSOC_SPI_FIFO_FULL)) &&
+                               sspi->left_tx_cnt)
+                       sspi->tx_word(sspi);
 
+       /* Received all words */
+       if ((sspi->left_rx_cnt == 0) && (sspi->left_tx_cnt == 0)) {
+               complete(&sspi->done);
+               writel(0x0, sspi->base + SIRFSOC_SPI_INT_EN);
+       }
        return IRQ_HANDLED;
 }
 
@@ -424,9 +410,7 @@ spi_sirfsoc_setup_transfer(struct spi_device *spi, struct spi_transfer *t)
                                        SIRFSOC_SPI_FIFO_WIDTH_DWORD;
                break;
        default:
-               dev_err(&spi->dev, "Bits per word %d not supported\n",
-                      bits_per_word);
-               return -EINVAL;
+               BUG();
        }
 
        if (!(spi->mode & SPI_CS_HIGH))
@@ -554,6 +538,8 @@ static int spi_sirfsoc_probe(struct platform_device *pdev)
        sspi->bitbang.txrx_bufs = spi_sirfsoc_transfer;
        sspi->bitbang.master->setup = spi_sirfsoc_setup;
        master->bus_num = pdev->id;
+       master->bits_per_word_mask = SPI_BPW_MASK(8) | SPI_BPW_MASK(12) |
+                                       SPI_BPW_MASK(16) | SPI_BPW_MASK(32);
        sspi->bitbang.master->dev.of_node = pdev->dev.of_node;
 
        sspi->clk = clk_get(&pdev->dev, NULL);
@@ -566,9 +552,6 @@ static int spi_sirfsoc_probe(struct platform_device *pdev)
 
        init_completion(&sspi->done);
 
-       tasklet_init(&sspi->tasklet_tx, spi_sirfsoc_tasklet_tx,
-                    (unsigned long)sspi);
-
        writel(SIRFSOC_SPI_FIFO_RESET, sspi->base + SIRFSOC_SPI_RXFIFO_OP);
        writel(SIRFSOC_SPI_FIFO_RESET, sspi->base + SIRFSOC_SPI_TXFIFO_OP);
        writel(SIRFSOC_SPI_FIFO_START, sspi->base + SIRFSOC_SPI_RXFIFO_OP);