mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-12-17 09:43:59 +08:00
spi: Fixes for v5.10
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. -----BEGIN PGP SIGNATURE----- iQEzBAABCgAdFiEEreZoqmdXGLWf4p/qJNaLcl1Uh9AFAl/A/KIACgkQJNaLcl1U h9C8HQf/eo6/ZW9UrXlmpNPz0AaIkZoFJnQ2bLKsN1GfCyieRr57+ZJ9Ay8e0peY U0+PQfzcliMtwpML6TsdqmwZ8OLbm6E5FYSn3fAG+3jzn9LJr2K4aHYTPeydHbld RE+ZzTDDcsyhY5mH65oBI3cNJqbyzF5kx7yOdGIRv1dr2uAsElapOFyiudVGdzyd Jomfr42s82i9PyN4EArybW3snru67e69jY97Hfv4jKGrKMX0J5eL/pDlgoXz1YrA v/ldsJgJXkUagLg+LOb6xErWVSYm1lczXfEQQ1rTyXGrfBwXXdNu7Y2dKodHDNRB H4YiHvBaVS0TTU1zut5QQDBCJ6Xrlw== =sggt -----END PGP SIGNATURE----- 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
This commit is contained in:
commit
87c301ca91
@ -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;
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user