spi: Fixes for v3.15
A few driver specific fixes here: - SH HSPI was dealing with its clocks incorrectly which meant it didn't work on some SoCs, fixing this also requires a small fix to one of the SoC clock trees to avoid breaking existing users. - The SiRF driver appears to have had several quality problems, it's fairly new and not widely used so this isn't too worrying. - A brute force fix for excessive locking in the Atmel driver, it needs further investigation but this deals with the immediate issue. - A build fix for the Blackfin driver. -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQIcBAABAgAGBQJTWPNeAAoJELSic+t+oim9VOYP/1s4R3EsLg/CoO6T3jqDqizZ 0jnQgqTUi11q8+5ozLdt0zhmGOwmoTaqP3RhNqntwFyMucEWmBjrJcRlcmbfq5ve IWAArM++RvzCgUmK2DfnQ+KxvLNbdDzO6Q+DIzUb1lia5T64Ope3JBWUG2CT5YSE Yhi1qaktVWP57toZQmuidW+Q48d+fBxdzQ8VIfP1q2GqISwuabALjzp0I+oG5Sa1 3yd0037WmIYXUM+dKMijPQjNtB4FLJ545RR+Y5s9RXn9Pq/KpLL2aVCaPbDW36Oz bK4zO80mS6zfurk9Yi7RiOV1uTCd/dg4G2MLTzrtP5LgdKpqthVElKbLJUv9cv0z gZ19wFM0tGe3raxUsXUlcxAyETiNPP+pm6QriS9rgrdazIiS0gP6tvpfU8Szxv3o EJMJEQ76ieuVA8LVLskPehNYTl5z4CiISS8SrBUdvV4P96RdyD4rGLdDJw5PDIEL GBEpdcg48QFt6twO52xAQEzRx0T98c/C0GGYR38CbRiNFFZCh5IAr0po1iwTY3WC vR/2YJw2Lf/+rf6Hu0cNuFd1csaTBQqh6x4JqVHdmL+xIqut2yhP3DLynK9+APR2 6oIHameZGAY1s0iDpCbeEZoTJF0uJw4+qV3xpCDnSTwiBQoD8whwJUnrFyKb1Mo2 +T5hNKls3vDpNwVPFueU =kM6u -----END PGP SIGNATURE----- Merge tag 'spi-v3.15-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/spi Pull spi fixes from Mark Brown: "A few driver specific fixes here: - SH HSPI was dealing with its clocks incorrectly which meant it didn't work on some SoCs, fixing this also requires a small fix to one of the SoC clock trees to avoid breaking existing users. - The SiRF driver appears to have had several quality problems, it's fairly new and not widely used so this isn't too worrying. - A brute force fix for excessive locking in the Atmel driver, it needs further investigation but this deals with the immediate issue. - A build fix for the Blackfin driver" * tag 'spi-v3.15-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/spi: spi: atmel: Fix scheduling while atomic bug spi: sh-hspi: Do not specifically request shyway_clk clock ARM: shmobile: r8a7778: Use clks as MSTP007 parent spi: sirf: make GPIO chipselect function work well spi: sirf: set SPI controller in RISC IO chipselect mode spi: sirf: correct TXFIFO empty interrupt status bit spi: bfin5xx: fix build error
This commit is contained in:
commit
ff1e5b447e
|
@ -170,7 +170,7 @@ static struct clk mstp_clks[MSTP_NR] = {
|
||||||
[MSTP010] = SH_CLK_MSTP32(&p_clk, MSTPCR0, 10, 0), /* SSI2 */
|
[MSTP010] = SH_CLK_MSTP32(&p_clk, MSTPCR0, 10, 0), /* SSI2 */
|
||||||
[MSTP009] = SH_CLK_MSTP32(&p_clk, MSTPCR0, 9, 0), /* SSI3 */
|
[MSTP009] = SH_CLK_MSTP32(&p_clk, MSTPCR0, 9, 0), /* SSI3 */
|
||||||
[MSTP008] = SH_CLK_MSTP32(&p_clk, MSTPCR0, 8, 0), /* SRU */
|
[MSTP008] = SH_CLK_MSTP32(&p_clk, MSTPCR0, 8, 0), /* SRU */
|
||||||
[MSTP007] = SH_CLK_MSTP32(&p_clk, MSTPCR0, 7, 0), /* HSPI */
|
[MSTP007] = SH_CLK_MSTP32(&s_clk, MSTPCR0, 7, 0), /* HSPI */
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct clk_lookup lookups[] = {
|
static struct clk_lookup lookups[] = {
|
||||||
|
|
|
@ -1115,8 +1115,11 @@ static int atmel_spi_one_transfer(struct spi_master *master,
|
||||||
atmel_spi_next_xfer_pio(master, xfer);
|
atmel_spi_next_xfer_pio(master, xfer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* interrupts are disabled, so free the lock for schedule */
|
||||||
|
atmel_spi_unlock(as);
|
||||||
ret = wait_for_completion_timeout(&as->xfer_completion,
|
ret = wait_for_completion_timeout(&as->xfer_completion,
|
||||||
SPI_DMA_TIMEOUT);
|
SPI_DMA_TIMEOUT);
|
||||||
|
atmel_spi_lock(as);
|
||||||
if (WARN_ON(ret == 0)) {
|
if (WARN_ON(ret == 0)) {
|
||||||
dev_err(&spi->dev,
|
dev_err(&spi->dev,
|
||||||
"spi trasfer timeout, err %d\n", ret);
|
"spi trasfer timeout, err %d\n", ret);
|
||||||
|
|
|
@ -12,6 +12,7 @@
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <linux/delay.h>
|
#include <linux/delay.h>
|
||||||
#include <linux/device.h>
|
#include <linux/device.h>
|
||||||
|
#include <linux/gpio.h>
|
||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
#include <linux/io.h>
|
#include <linux/io.h>
|
||||||
#include <linux/ioport.h>
|
#include <linux/ioport.h>
|
||||||
|
|
|
@ -244,9 +244,9 @@ static int hspi_probe(struct platform_device *pdev)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
|
|
||||||
clk = clk_get(NULL, "shyway_clk");
|
clk = clk_get(&pdev->dev, NULL);
|
||||||
if (IS_ERR(clk)) {
|
if (IS_ERR(clk)) {
|
||||||
dev_err(&pdev->dev, "shyway_clk is required\n");
|
dev_err(&pdev->dev, "couldn't get clock\n");
|
||||||
ret = -EINVAL;
|
ret = -EINVAL;
|
||||||
goto error0;
|
goto error0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -287,8 +287,8 @@ static irqreturn_t spi_sirfsoc_irq(int irq, void *dev_id)
|
||||||
sspi->left_rx_word)
|
sspi->left_rx_word)
|
||||||
sspi->rx_word(sspi);
|
sspi->rx_word(sspi);
|
||||||
|
|
||||||
if (spi_stat & (SIRFSOC_SPI_FIFO_EMPTY
|
if (spi_stat & (SIRFSOC_SPI_TXFIFO_EMPTY |
|
||||||
| SIRFSOC_SPI_TXFIFO_THD_REACH))
|
SIRFSOC_SPI_TXFIFO_THD_REACH))
|
||||||
while (!((readl(sspi->base + SIRFSOC_SPI_TXFIFO_STATUS)
|
while (!((readl(sspi->base + SIRFSOC_SPI_TXFIFO_STATUS)
|
||||||
& SIRFSOC_SPI_FIFO_FULL)) &&
|
& SIRFSOC_SPI_FIFO_FULL)) &&
|
||||||
sspi->left_tx_word)
|
sspi->left_tx_word)
|
||||||
|
@ -470,7 +470,16 @@ static void spi_sirfsoc_chipselect(struct spi_device *spi, int value)
|
||||||
writel(regval, sspi->base + SIRFSOC_SPI_CTRL);
|
writel(regval, sspi->base + SIRFSOC_SPI_CTRL);
|
||||||
} else {
|
} else {
|
||||||
int gpio = sspi->chipselect[spi->chip_select];
|
int gpio = sspi->chipselect[spi->chip_select];
|
||||||
gpio_direction_output(gpio, spi->mode & SPI_CS_HIGH ? 0 : 1);
|
switch (value) {
|
||||||
|
case BITBANG_CS_ACTIVE:
|
||||||
|
gpio_direction_output(gpio,
|
||||||
|
spi->mode & SPI_CS_HIGH ? 1 : 0);
|
||||||
|
break;
|
||||||
|
case BITBANG_CS_INACTIVE:
|
||||||
|
gpio_direction_output(gpio,
|
||||||
|
spi->mode & SPI_CS_HIGH ? 0 : 1);
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -559,6 +568,11 @@ spi_sirfsoc_setup_transfer(struct spi_device *spi, struct spi_transfer *t)
|
||||||
regval &= ~SIRFSOC_SPI_CMD_MODE;
|
regval &= ~SIRFSOC_SPI_CMD_MODE;
|
||||||
sspi->tx_by_cmd = false;
|
sspi->tx_by_cmd = false;
|
||||||
}
|
}
|
||||||
|
/*
|
||||||
|
* set spi controller in RISC chipselect mode, we are controlling CS by
|
||||||
|
* software BITBANG_CS_ACTIVE and BITBANG_CS_INACTIVE.
|
||||||
|
*/
|
||||||
|
regval |= SIRFSOC_SPI_CS_IO_MODE;
|
||||||
writel(regval, sspi->base + SIRFSOC_SPI_CTRL);
|
writel(regval, sspi->base + SIRFSOC_SPI_CTRL);
|
||||||
|
|
||||||
if (IS_DMA_VALID(t)) {
|
if (IS_DMA_VALID(t)) {
|
||||||
|
|
Loading…
Reference in New Issue