Commit 87c301ca authored by Linus Torvalds's avatar Linus Torvalds
Browse files
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
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -875,6 +875,7 @@ int dw_spi_add_host(struct device *dev, struct dw_spi *dws)
		master->set_cs = dw_spi_set_cs;
	master->transfer_one = dw_spi_transfer_one;
	master->handle_err = dw_spi_handle_err;
	if (dws->mem_ops.exec_op)
		master->mem_ops = &dws->mem_ops;
	master->max_speed_hz = dws->max_freq;
	master->dev.of_node = dev->of_node;
+1 −0
Original line number Diff line number Diff line
@@ -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_use_autosuspend(spi_imx->dev);
	pm_runtime_get_noresume(spi_imx->dev);
	pm_runtime_set_active(spi_imx->dev);
	pm_runtime_enable(spi_imx->dev);

+7 −0
Original line number Diff line number Diff line
@@ -1001,6 +1001,7 @@ static int nxp_fspi_probe(struct platform_device *pdev)
	struct resource *res;
	struct nxp_fspi *f;
	int ret;
	u32 reg;

	ctlr = spi_alloc_master(&pdev->dev, sizeof(*f));
	if (!ctlr)
@@ -1032,6 +1033,12 @@ static int nxp_fspi_probe(struct platform_device *pdev)
		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 */
	if (is_acpi_node(f->dev->fwnode))
		res = platform_get_resource(pdev, IORESOURCE_MEM, 1);
+5 −0
Original line number Diff line number Diff line
@@ -3372,12 +3372,15 @@ int spi_setup(struct spi_device *spi)
	if (!spi->max_speed_hz)
		spi->max_speed_hz = spi->controller->max_speed_hz;

	mutex_lock(&spi->controller->io_mutex);

	if (spi->controller->setup)
		status = spi->controller->setup(spi);

	if (spi->controller->auto_runtime_pm && spi->controller->set_cs) {
		status = pm_runtime_get_sync(spi->controller->dev.parent);
		if (status < 0) {
			mutex_unlock(&spi->controller->io_mutex);
			pm_runtime_put_noidle(spi->controller->dev.parent);
			dev_err(&spi->controller->dev, "Failed to power device: %d\n",
				status);
@@ -3399,6 +3402,8 @@ int spi_setup(struct spi_device *spi)
		spi_set_cs(spi, false);
	}

	mutex_unlock(&spi->controller->io_mutex);

	if (spi->rt && !spi->controller->rt) {
		spi->controller->rt = true;
		spi_set_thread_rt(spi->controller);