Commit 87c301ca authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'spi-fix-v5.10-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/spi

Pull spi fixes from Mark Brown:
 "A few fixes for v5.10,  one for the core which fixes some potential
  races for controllers with multiple chip selects when configuration of
  the chip select for one client device races with the addition and
  initial setup of an additional client"

* tag 'spi-fix-v5.10-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/spi:
  spi: dw: Fix spi registration for controllers overriding CS
  spi: imx: fix the unbalanced spi runtime pm management
  spi: spi-nxp-fspi: fix fspi panic by unexpected interrupts
  spi: Take the SPI IO-mutex in the spi_setup() method
parents f594139d 0abdb0fb
...@@ -875,7 +875,8 @@ int dw_spi_add_host(struct device *dev, struct dw_spi *dws) ...@@ -875,7 +875,8 @@ int dw_spi_add_host(struct device *dev, struct dw_spi *dws)
master->set_cs = dw_spi_set_cs; master->set_cs = dw_spi_set_cs;
master->transfer_one = dw_spi_transfer_one; master->transfer_one = dw_spi_transfer_one;
master->handle_err = dw_spi_handle_err; master->handle_err = dw_spi_handle_err;
master->mem_ops = &dws->mem_ops; if (dws->mem_ops.exec_op)
master->mem_ops = &dws->mem_ops;
master->max_speed_hz = dws->max_freq; master->max_speed_hz = dws->max_freq;
master->dev.of_node = dev->of_node; master->dev.of_node = dev->of_node;
master->dev.fwnode = dev->fwnode; master->dev.fwnode = dev->fwnode;
......
...@@ -1686,6 +1686,7 @@ static int spi_imx_probe(struct platform_device *pdev) ...@@ -1686,6 +1686,7 @@ static int spi_imx_probe(struct platform_device *pdev)
pm_runtime_set_autosuspend_delay(spi_imx->dev, MXC_RPM_TIMEOUT); pm_runtime_set_autosuspend_delay(spi_imx->dev, MXC_RPM_TIMEOUT);
pm_runtime_use_autosuspend(spi_imx->dev); pm_runtime_use_autosuspend(spi_imx->dev);
pm_runtime_get_noresume(spi_imx->dev);
pm_runtime_set_active(spi_imx->dev); pm_runtime_set_active(spi_imx->dev);
pm_runtime_enable(spi_imx->dev); pm_runtime_enable(spi_imx->dev);
......
...@@ -1001,6 +1001,7 @@ static int nxp_fspi_probe(struct platform_device *pdev) ...@@ -1001,6 +1001,7 @@ static int nxp_fspi_probe(struct platform_device *pdev)
struct resource *res; struct resource *res;
struct nxp_fspi *f; struct nxp_fspi *f;
int ret; int ret;
u32 reg;
ctlr = spi_alloc_master(&pdev->dev, sizeof(*f)); ctlr = spi_alloc_master(&pdev->dev, sizeof(*f));
if (!ctlr) if (!ctlr)
...@@ -1032,6 +1033,12 @@ static int nxp_fspi_probe(struct platform_device *pdev) ...@@ -1032,6 +1033,12 @@ static int nxp_fspi_probe(struct platform_device *pdev)
goto err_put_ctrl; goto err_put_ctrl;
} }
/* Clear potential interrupts */
reg = fspi_readl(f, f->iobase + FSPI_INTR);
if (reg)
fspi_writel(f, reg, f->iobase + FSPI_INTR);
/* find the resources - controller memory mapped space */ /* find the resources - controller memory mapped space */
if (is_acpi_node(f->dev->fwnode)) if (is_acpi_node(f->dev->fwnode))
res = platform_get_resource(pdev, IORESOURCE_MEM, 1); res = platform_get_resource(pdev, IORESOURCE_MEM, 1);
......
...@@ -3372,12 +3372,15 @@ int spi_setup(struct spi_device *spi) ...@@ -3372,12 +3372,15 @@ int spi_setup(struct spi_device *spi)
if (!spi->max_speed_hz) if (!spi->max_speed_hz)
spi->max_speed_hz = spi->controller->max_speed_hz; spi->max_speed_hz = spi->controller->max_speed_hz;
mutex_lock(&spi->controller->io_mutex);
if (spi->controller->setup) if (spi->controller->setup)
status = spi->controller->setup(spi); status = spi->controller->setup(spi);
if (spi->controller->auto_runtime_pm && spi->controller->set_cs) { if (spi->controller->auto_runtime_pm && spi->controller->set_cs) {
status = pm_runtime_get_sync(spi->controller->dev.parent); status = pm_runtime_get_sync(spi->controller->dev.parent);
if (status < 0) { if (status < 0) {
mutex_unlock(&spi->controller->io_mutex);
pm_runtime_put_noidle(spi->controller->dev.parent); pm_runtime_put_noidle(spi->controller->dev.parent);
dev_err(&spi->controller->dev, "Failed to power device: %d\n", dev_err(&spi->controller->dev, "Failed to power device: %d\n",
status); status);
...@@ -3399,6 +3402,8 @@ int spi_setup(struct spi_device *spi) ...@@ -3399,6 +3402,8 @@ int spi_setup(struct spi_device *spi)
spi_set_cs(spi, false); spi_set_cs(spi, false);
} }
mutex_unlock(&spi->controller->io_mutex);
if (spi->rt && !spi->controller->rt) { if (spi->rt && !spi->controller->rt) {
spi->controller->rt = true; spi->controller->rt = true;
spi_set_thread_rt(spi->controller); spi_set_thread_rt(spi->controller);
......
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