Commit adb25d53 authored by Mark Brown's avatar Mark Brown

Merge remote-tracking branch 'spi/topic/sirf' into spi-next

parents f4e97581 237ce466
...@@ -19,7 +19,6 @@ ...@@ -19,7 +19,6 @@
#include <linux/of_gpio.h> #include <linux/of_gpio.h>
#include <linux/spi/spi.h> #include <linux/spi/spi.h>
#include <linux/spi/spi_bitbang.h> #include <linux/spi/spi_bitbang.h>
#include <linux/pinctrl/consumer.h>
#define DRIVER_NAME "sirfsoc_spi" #define DRIVER_NAME "sirfsoc_spi"
...@@ -127,7 +126,6 @@ struct sirfsoc_spi { ...@@ -127,7 +126,6 @@ struct sirfsoc_spi {
void __iomem *base; void __iomem *base;
u32 ctrl_freq; /* SPI controller clock speed */ u32 ctrl_freq; /* SPI controller clock speed */
struct clk *clk; struct clk *clk;
struct pinctrl *p;
/* rx & tx bufs from the spi_transfer */ /* rx & tx bufs from the spi_transfer */
const void *tx; const void *tx;
...@@ -142,9 +140,6 @@ struct sirfsoc_spi { ...@@ -142,9 +140,6 @@ struct sirfsoc_spi {
unsigned int left_tx_cnt; unsigned int left_tx_cnt;
unsigned int left_rx_cnt; unsigned int left_rx_cnt;
/* tasklet to push tx msg into FIFO */
struct tasklet_struct tasklet_tx;
int chipselect[0]; int chipselect[0];
}; };
...@@ -236,17 +231,6 @@ static void spi_sirfsoc_tx_word_u32(struct sirfsoc_spi *sspi) ...@@ -236,17 +231,6 @@ static void spi_sirfsoc_tx_word_u32(struct sirfsoc_spi *sspi)
sspi->left_tx_cnt--; 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) static irqreturn_t spi_sirfsoc_irq(int irq, void *dev_id)
{ {
struct sirfsoc_spi *sspi = dev_id; struct sirfsoc_spi *sspi = dev_id;
...@@ -261,25 +245,25 @@ static irqreturn_t spi_sirfsoc_irq(int irq, void *dev_id) ...@@ -261,25 +245,25 @@ static irqreturn_t spi_sirfsoc_irq(int irq, void *dev_id)
writel(0x0, sspi->base + SIRFSOC_SPI_INT_EN); 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) while (!((readl(sspi->base + SIRFSOC_SPI_RXFIFO_STATUS)
& SIRFSOC_SPI_FIFO_EMPTY)) && & SIRFSOC_SPI_FIFO_EMPTY)) &&
sspi->left_rx_cnt) sspi->left_rx_cnt)
sspi->rx_word(sspi); sspi->rx_word(sspi);
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 */ /* Received all words */
if ((sspi->left_rx_cnt == 0) && (sspi->left_tx_cnt == 0)) { if ((sspi->left_rx_cnt == 0) && (sspi->left_tx_cnt == 0)) {
complete(&sspi->done); complete(&sspi->done);
writel(0x0, sspi->base + SIRFSOC_SPI_INT_EN); 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);
return IRQ_HANDLED; return IRQ_HANDLED;
} }
...@@ -558,24 +542,16 @@ static int spi_sirfsoc_probe(struct platform_device *pdev) ...@@ -558,24 +542,16 @@ static int spi_sirfsoc_probe(struct platform_device *pdev)
SPI_BPW_MASK(16) | SPI_BPW_MASK(32); SPI_BPW_MASK(16) | SPI_BPW_MASK(32);
sspi->bitbang.master->dev.of_node = pdev->dev.of_node; sspi->bitbang.master->dev.of_node = pdev->dev.of_node;
sspi->p = pinctrl_get_select_default(&pdev->dev);
ret = IS_ERR(sspi->p);
if (ret)
goto free_master;
sspi->clk = clk_get(&pdev->dev, NULL); sspi->clk = clk_get(&pdev->dev, NULL);
if (IS_ERR(sspi->clk)) { if (IS_ERR(sspi->clk)) {
ret = -EINVAL; ret = -EINVAL;
goto free_pin; goto free_master;
} }
clk_prepare_enable(sspi->clk); clk_prepare_enable(sspi->clk);
sspi->ctrl_freq = clk_get_rate(sspi->clk); sspi->ctrl_freq = clk_get_rate(sspi->clk);
init_completion(&sspi->done); 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_RXFIFO_OP);
writel(SIRFSOC_SPI_FIFO_RESET, sspi->base + SIRFSOC_SPI_TXFIFO_OP); writel(SIRFSOC_SPI_FIFO_RESET, sspi->base + SIRFSOC_SPI_TXFIFO_OP);
writel(SIRFSOC_SPI_FIFO_START, sspi->base + SIRFSOC_SPI_RXFIFO_OP); writel(SIRFSOC_SPI_FIFO_START, sspi->base + SIRFSOC_SPI_RXFIFO_OP);
...@@ -594,8 +570,6 @@ static int spi_sirfsoc_probe(struct platform_device *pdev) ...@@ -594,8 +570,6 @@ static int spi_sirfsoc_probe(struct platform_device *pdev)
free_clk: free_clk:
clk_disable_unprepare(sspi->clk); clk_disable_unprepare(sspi->clk);
clk_put(sspi->clk); clk_put(sspi->clk);
free_pin:
pinctrl_put(sspi->p);
free_master: free_master:
spi_master_put(master); spi_master_put(master);
err_cs: err_cs:
...@@ -618,7 +592,6 @@ static int spi_sirfsoc_remove(struct platform_device *pdev) ...@@ -618,7 +592,6 @@ static int spi_sirfsoc_remove(struct platform_device *pdev)
} }
clk_disable_unprepare(sspi->clk); clk_disable_unprepare(sspi->clk);
clk_put(sspi->clk); clk_put(sspi->clk);
pinctrl_put(sspi->p);
spi_master_put(master); spi_master_put(master);
return 0; return 0;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment