Patch "spi: sh-msiof: Avoid writing to registers from spi_master.setup()" has been added to the 4.14-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
spi: sh-msiof: Avoid writing to registers from spi_master.setup()
to the 4.14-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
spi-sh-msiof-avoid-writing-to-registers-from-spi_master.setup.patch
and it can be found in the queue-4.14 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From foo@baz Thu Mar 22 14:26:48 CET 2018
From: Geert Uytterhoeven <[email protected]>
Date: Wed, 13 Dec 2017 20:05:10 +0100
Subject: spi: sh-msiof: Avoid writing to registers from spi_master.setup()
From: Geert Uytterhoeven <[email protected]>
[ Upstream commit 7ff0b53c4051145d1cf992d2f60987e6447eed4f ]
The spi_master.setup() callback must not change configuration registers, as that could corrupt I/O that is in progress for other SPI slaves.
The only exception is the configuration of the native chip select polarity in SPI master mode, as a wrong chip select polarity will cause havoc during all future transfers to any other SPI slave.
Hence stop writing to registers in sh_msiof_spi_setup(), unless it is the first call for a controller using a native chip select, or unless native chip select polarity has changed (note that you'll loose anyway if I/O is in progress). Even then, only do what is strictly necessary, instead of calling sh_msiof_spi_set_pin_regs().
--- drivers/spi/spi-sh-msiof.c | 35 ++++++++++++++++++++++++----------- 1 file changed, 24 insertions(+), 11 deletions(-)
drivers/spi/spi-sh-msiof.c +24 -11
@@ -55,6 +55,8 @@ struct sh_msiof_spi_priv {void *rx_dma_page;dma_addr_t tx_dma_addr;dma_addr_t rx_dma_addr; +bool native_cs_inited; +bool native_cs_high;bool slave_aborted; };
@@ -528,8 +530,7 @@ static int sh_msiof_spi_setup(struct spi {struct device_node *np = spi->master->dev.of_node;struct sh_msiof_spi_priv *p =spi_master_get_devdata (spi->master); - -pm_runtime_get_sync (&p->pdev->dev); +u32 clr, set, tmp;if (!np) {/*
@@ -539,19 +540,31 @@ static int sh_msiof_spi_setup(struct spi spi->cs_gpio = (uintptr_t )spi->controller_data; } -/* Configure pins before deasserting CS */ -sh_msiof_spi_set_pin_regs (p, !!(spi->mode &SPI_CPOL ), - !!(spi->mode &SPI_CPHA ), - !!(spi->mode &SPI_3WIRE ), - !!(spi->mode &SPI_LSB_FIRST ), - !!(spi->mode &SPI_CS_HIGH )); - -if (spi->cs_gpio >=0 ) +if (spi->cs_gpio >=0 ) {gpio_set_value (spi->cs_gpio, !(spi->mode &SPI_CS_HIGH )); +return 0 ; + } + +if (spi_controller_is_slave (p->master)) +return 0 ; +if (p->native_cs_inited && + (p->native_cs_high == !!(spi->mode &SPI_CS_HIGH ))) +return 0 ; +/* Configure native chip select mode/polarity early */ + clr =MDR1_SYNCMD_MASK ; + set =MDR1_TRMD |TMDR1_PCON |MDR1_SYNCMD_SPI ; +if (spi->mode &SPI_CS_HIGH ) + clr |=BIT (MDR1_SYNCAC_SHIFT ); +else + set |=BIT (MDR1_SYNCAC_SHIFT ); +pm_runtime_get_sync (&p->pdev->dev); + tmp =sh_msiof_read (p,TMDR1 ) & ~clr; +sh_msiof_write (p,TMDR1 , tmp | set);pm_runtime_put (&p->pdev->dev); - + p->native_cs_high = spi->mode &SPI_CS_HIGH ; + p->native_cs_inited = true;return 0 ; }
Patches currently in stable-queue which might be from [email protected] are
queue-4.14/spi-sh-msiof-avoid-writing-to-registers-from-spi_master.setup.patch queue-4.14/pci-rcar-handle-rcar_pcie_parse_request_of_pci_ranges-failures.patch