Commit 1504d226 authored by Mark Brown's avatar Mark Brown

Merge remote-tracking branches 'spi/fix/bcm63xx', 'spi/fix/dspi',...

Merge remote-tracking branches 'spi/fix/bcm63xx', 'spi/fix/dspi', 'spi/fix/hspi', 'spi/fix/imx', 'spi/fix/msiof', 'spi/fix/pxa2xx', 'spi/fix/qspi', 'spi/topic/altera', 'spi/topic/ath79' and 'spi/topic/atmel' into spi-linus
...@@ -220,8 +220,6 @@ static int altera_spi_probe(struct platform_device *pdev) ...@@ -220,8 +220,6 @@ static int altera_spi_probe(struct platform_device *pdev)
/* setup the state for the bitbang driver */ /* setup the state for the bitbang driver */
hw->bitbang.master = master; hw->bitbang.master = master;
if (!hw->bitbang.master)
return err;
hw->bitbang.chipselect = altera_spi_chipsel; hw->bitbang.chipselect = altera_spi_chipsel;
hw->bitbang.txrx_bufs = altera_spi_txrx; hw->bitbang.txrx_bufs = altera_spi_txrx;
......
...@@ -243,21 +243,21 @@ static int ath79_spi_probe(struct platform_device *pdev) ...@@ -243,21 +243,21 @@ static int ath79_spi_probe(struct platform_device *pdev)
goto err_put_master; goto err_put_master;
} }
sp->base = ioremap(r->start, resource_size(r)); sp->base = devm_ioremap(&pdev->dev, r->start, resource_size(r));
if (!sp->base) { if (!sp->base) {
ret = -ENXIO; ret = -ENXIO;
goto err_put_master; goto err_put_master;
} }
sp->clk = clk_get(&pdev->dev, "ahb"); sp->clk = devm_clk_get(&pdev->dev, "ahb");
if (IS_ERR(sp->clk)) { if (IS_ERR(sp->clk)) {
ret = PTR_ERR(sp->clk); ret = PTR_ERR(sp->clk);
goto err_unmap; goto err_put_master;
} }
ret = clk_enable(sp->clk); ret = clk_enable(sp->clk);
if (ret) if (ret)
goto err_clk_put; goto err_put_master;
rate = DIV_ROUND_UP(clk_get_rate(sp->clk), MHZ); rate = DIV_ROUND_UP(clk_get_rate(sp->clk), MHZ);
if (!rate) { if (!rate) {
...@@ -280,10 +280,6 @@ static int ath79_spi_probe(struct platform_device *pdev) ...@@ -280,10 +280,6 @@ static int ath79_spi_probe(struct platform_device *pdev)
ath79_spi_disable(sp); ath79_spi_disable(sp);
err_clk_disable: err_clk_disable:
clk_disable(sp->clk); clk_disable(sp->clk);
err_clk_put:
clk_put(sp->clk);
err_unmap:
iounmap(sp->base);
err_put_master: err_put_master:
spi_master_put(sp->bitbang.master); spi_master_put(sp->bitbang.master);
...@@ -297,8 +293,6 @@ static int ath79_spi_remove(struct platform_device *pdev) ...@@ -297,8 +293,6 @@ static int ath79_spi_remove(struct platform_device *pdev)
spi_bitbang_stop(&sp->bitbang); spi_bitbang_stop(&sp->bitbang);
ath79_spi_disable(sp); ath79_spi_disable(sp);
clk_disable(sp->clk); clk_disable(sp->clk);
clk_put(sp->clk);
iounmap(sp->base);
spi_master_put(sp->bitbang.master); spi_master_put(sp->bitbang.master);
return 0; return 0;
......
This diff is collapsed.
...@@ -169,8 +169,6 @@ static int bcm63xx_txrx_bufs(struct spi_device *spi, struct spi_transfer *first, ...@@ -169,8 +169,6 @@ static int bcm63xx_txrx_bufs(struct spi_device *spi, struct spi_transfer *first,
transfer_list); transfer_list);
} }
len -= prepend_len;
init_completion(&bs->done); init_completion(&bs->done);
/* Fill in the Message control register */ /* Fill in the Message control register */
......
...@@ -320,8 +320,10 @@ static void dspi_chipselect(struct spi_device *spi, int value) ...@@ -320,8 +320,10 @@ static void dspi_chipselect(struct spi_device *spi, int value)
switch (value) { switch (value) {
case BITBANG_CS_ACTIVE: case BITBANG_CS_ACTIVE:
pushr |= SPI_PUSHR_CONT; pushr |= SPI_PUSHR_CONT;
break;
case BITBANG_CS_INACTIVE: case BITBANG_CS_INACTIVE:
pushr &= ~SPI_PUSHR_CONT; pushr &= ~SPI_PUSHR_CONT;
break;
} }
writel(pushr, dspi->base + SPI_PUSHR); writel(pushr, dspi->base + SPI_PUSHR);
......
...@@ -206,7 +206,8 @@ static unsigned int spi_imx_clkdiv_2(unsigned int fin, ...@@ -206,7 +206,8 @@ static unsigned int spi_imx_clkdiv_2(unsigned int fin,
#define MX51_ECSPI_STAT_RR (1 << 3) #define MX51_ECSPI_STAT_RR (1 << 3)
/* MX51 eCSPI */ /* MX51 eCSPI */
static unsigned int mx51_ecspi_clkdiv(unsigned int fin, unsigned int fspi) static unsigned int mx51_ecspi_clkdiv(unsigned int fin, unsigned int fspi,
unsigned int *fres)
{ {
/* /*
* there are two 4-bit dividers, the pre-divider divides by * there are two 4-bit dividers, the pre-divider divides by
...@@ -234,6 +235,10 @@ static unsigned int mx51_ecspi_clkdiv(unsigned int fin, unsigned int fspi) ...@@ -234,6 +235,10 @@ static unsigned int mx51_ecspi_clkdiv(unsigned int fin, unsigned int fspi)
pr_debug("%s: fin: %u, fspi: %u, post: %u, pre: %u\n", pr_debug("%s: fin: %u, fspi: %u, post: %u, pre: %u\n",
__func__, fin, fspi, post, pre); __func__, fin, fspi, post, pre);
/* Resulting frequency for the SCLK line. */
*fres = (fin / (pre + 1)) >> post;
return (pre << MX51_ECSPI_CTRL_PREDIV_OFFSET) | return (pre << MX51_ECSPI_CTRL_PREDIV_OFFSET) |
(post << MX51_ECSPI_CTRL_POSTDIV_OFFSET); (post << MX51_ECSPI_CTRL_POSTDIV_OFFSET);
} }
...@@ -264,6 +269,7 @@ static int __maybe_unused mx51_ecspi_config(struct spi_imx_data *spi_imx, ...@@ -264,6 +269,7 @@ static int __maybe_unused mx51_ecspi_config(struct spi_imx_data *spi_imx,
struct spi_imx_config *config) struct spi_imx_config *config)
{ {
u32 ctrl = MX51_ECSPI_CTRL_ENABLE, cfg = 0; u32 ctrl = MX51_ECSPI_CTRL_ENABLE, cfg = 0;
u32 clk = config->speed_hz, delay;
/* /*
* The hardware seems to have a race condition when changing modes. The * The hardware seems to have a race condition when changing modes. The
...@@ -275,7 +281,7 @@ static int __maybe_unused mx51_ecspi_config(struct spi_imx_data *spi_imx, ...@@ -275,7 +281,7 @@ static int __maybe_unused mx51_ecspi_config(struct spi_imx_data *spi_imx,
ctrl |= MX51_ECSPI_CTRL_MODE_MASK; ctrl |= MX51_ECSPI_CTRL_MODE_MASK;
/* set clock speed */ /* set clock speed */
ctrl |= mx51_ecspi_clkdiv(spi_imx->spi_clk, config->speed_hz); ctrl |= mx51_ecspi_clkdiv(spi_imx->spi_clk, config->speed_hz, &clk);
/* set chip select to use */ /* set chip select to use */
ctrl |= MX51_ECSPI_CTRL_CS(config->cs); ctrl |= MX51_ECSPI_CTRL_CS(config->cs);
...@@ -297,6 +303,23 @@ static int __maybe_unused mx51_ecspi_config(struct spi_imx_data *spi_imx, ...@@ -297,6 +303,23 @@ static int __maybe_unused mx51_ecspi_config(struct spi_imx_data *spi_imx,
writel(ctrl, spi_imx->base + MX51_ECSPI_CTRL); writel(ctrl, spi_imx->base + MX51_ECSPI_CTRL);
writel(cfg, spi_imx->base + MX51_ECSPI_CONFIG); writel(cfg, spi_imx->base + MX51_ECSPI_CONFIG);
/*
* Wait until the changes in the configuration register CONFIGREG
* propagate into the hardware. It takes exactly one tick of the
* SCLK clock, but we will wait two SCLK clock just to be sure. The
* effect of the delay it takes for the hardware to apply changes
* is noticable if the SCLK clock run very slow. In such a case, if
* the polarity of SCLK should be inverted, the GPIO ChipSelect might
* be asserted before the SCLK polarity changes, which would disrupt
* the SPI communication as the device on the other end would consider
* the change of SCLK polarity as a clock tick already.
*/
delay = (2 * 1000000) / clk;
if (likely(delay < 10)) /* SCLK is faster than 100 kHz */
udelay(delay);
else /* SCLK is _very_ slow */
usleep_range(delay, delay + 10);
return 0; return 0;
} }
......
...@@ -1066,6 +1066,8 @@ pxa2xx_spi_acpi_get_pdata(struct platform_device *pdev) ...@@ -1066,6 +1066,8 @@ pxa2xx_spi_acpi_get_pdata(struct platform_device *pdev)
pdata->num_chipselect = 1; pdata->num_chipselect = 1;
pdata->enable_dma = true; pdata->enable_dma = true;
pdata->tx_chan_id = -1;
pdata->rx_chan_id = -1;
return pdata; return pdata;
} }
......
...@@ -353,4 +353,4 @@ module_platform_driver(hspi_driver); ...@@ -353,4 +353,4 @@ module_platform_driver(hspi_driver);
MODULE_DESCRIPTION("SuperH HSPI bus driver"); MODULE_DESCRIPTION("SuperH HSPI bus driver");
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
MODULE_AUTHOR("Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>"); MODULE_AUTHOR("Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>");
MODULE_ALIAS("platform:sh_spi"); MODULE_ALIAS("platform:sh-hspi");
...@@ -152,7 +152,7 @@ static void sh_msiof_spi_set_clk_regs(struct sh_msiof_spi_priv *p, ...@@ -152,7 +152,7 @@ static void sh_msiof_spi_set_clk_regs(struct sh_msiof_spi_priv *p,
size_t k; size_t k;
if (!WARN_ON(!spi_hz || !parent_rate)) if (!WARN_ON(!spi_hz || !parent_rate))
div = parent_rate / spi_hz; div = DIV_ROUND_UP(parent_rate, spi_hz);
/* TODO: make more fine grained */ /* TODO: make more fine grained */
......
...@@ -417,10 +417,8 @@ static irqreturn_t ti_qspi_isr(int irq, void *dev_id) ...@@ -417,10 +417,8 @@ static irqreturn_t ti_qspi_isr(int irq, void *dev_id)
static int ti_qspi_runtime_resume(struct device *dev) static int ti_qspi_runtime_resume(struct device *dev)
{ {
struct ti_qspi *qspi; struct ti_qspi *qspi;
struct spi_master *master;
master = dev_get_drvdata(dev); qspi = dev_get_drvdata(dev);
qspi = spi_master_get_devdata(master);
ti_qspi_restore_ctx(qspi); ti_qspi_restore_ctx(qspi);
return 0; return 0;
...@@ -516,13 +514,9 @@ static int ti_qspi_probe(struct platform_device *pdev) ...@@ -516,13 +514,9 @@ static int ti_qspi_probe(struct platform_device *pdev)
static int ti_qspi_remove(struct platform_device *pdev) static int ti_qspi_remove(struct platform_device *pdev)
{ {
struct spi_master *master; struct ti_qspi *qspi = platform_get_drvdata(pdev);
struct ti_qspi *qspi;
int ret; int ret;
master = platform_get_drvdata(pdev);
qspi = spi_master_get_devdata(master);
ret = pm_runtime_get_sync(qspi->dev); ret = pm_runtime_get_sync(qspi->dev);
if (ret < 0) { if (ret < 0) {
dev_err(qspi->dev, "pm_runtime_get_sync() failed\n"); dev_err(qspi->dev, "pm_runtime_get_sync() failed\n");
...@@ -534,8 +528,6 @@ static int ti_qspi_remove(struct platform_device *pdev) ...@@ -534,8 +528,6 @@ static int ti_qspi_remove(struct platform_device *pdev)
pm_runtime_put(qspi->dev); pm_runtime_put(qspi->dev);
pm_runtime_disable(&pdev->dev); pm_runtime_disable(&pdev->dev);
spi_unregister_master(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