aboutsummaryrefslogtreecommitdiff
path: root/drivers/spi/spi-orion.c
diff options
context:
space:
mode:
authorLinus Torvalds <[email protected]>2021-08-30 11:41:46 -0700
committerLinus Torvalds <[email protected]>2021-08-30 11:41:46 -0700
commit0da9bc6d2fc3f98095d69f34c17f7d5730bbcc6c (patch)
treeb0036377a4375b0c3b1b564ba36b7190018aec2a /drivers/spi/spi-orion.c
parentd46e0d335497d89e36a8dab3ce5b605d7088c67a (diff)
parent6e9c846aa0c53673c5d53925a6122aa0e53a9795 (diff)
Merge tag 'spi-v5.15' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/spi
Pull spi updates from Mark Brown: "A quiet release for SPI, some fixes and a couple of new drivers plus one small refactoring: - Move the chip select timing configuration from the controller to the device to allow a bit more flexibility - New drivers for Rockchip SFC and Spreadtrum ADI" * tag 'spi-v5.15' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/spi: (47 commits) spi: spi-zynq-qspi: use wait_for_completion_timeout to make zynq_qspi_exec_mem_op not interruptible spi: add sprd ADI for sc9863 and ums512 spi: Convert sprd ADI bindings to yaml spi: sprd: Add ADI r3 support spi: sprd: Fix the wrong WDG_LOAD_VAL spi: davinci: invoke chipselect callback spi: sprd: fill offset only to RD_CMD register for reading from slave device spi: sprd: Make sure offset not equal to slave address size spi: sprd: Pass offset instead of physical address to adi_read/_write() spi: rockchip-sfc: Fix assigned but never used return error codes spi: rockchip-sfc: Remove redundant IO operations spi: stm32: fix excluded_middle.cocci warnings spi: coldfire-qspi: Use clk_disable_unprepare in the remove function spi: tegra20-slink: remove spi_master_put() in tegra_slink_remove() spi: rockchip-sfc: add rockchip serial flash controller spi: rockchip-sfc: Bindings for Rockchip serial flash controller spi: orion: Prevent incorrect chip select behaviour spi: mxic: add missing braces spi: spi-pic32: Fix issue with uninitialized dma_slave_config spi: spi-fsl-dspi: Fix issue with uninitialized dma_slave_config ...
Diffstat (limited to 'drivers/spi/spi-orion.c')
-rw-r--r--drivers/spi/spi-orion.c22
1 files changed, 16 insertions, 6 deletions
diff --git a/drivers/spi/spi-orion.c b/drivers/spi/spi-orion.c
index 34b31aba3981..e8de3cbbfb2a 100644
--- a/drivers/spi/spi-orion.c
+++ b/drivers/spi/spi-orion.c
@@ -328,8 +328,16 @@ orion_spi_setup_transfer(struct spi_device *spi, struct spi_transfer *t)
static void orion_spi_set_cs(struct spi_device *spi, bool enable)
{
struct orion_spi *orion_spi;
+ void __iomem *ctrl_reg;
+ u32 val;
orion_spi = spi_master_get_devdata(spi->master);
+ ctrl_reg = spi_reg(orion_spi, ORION_SPI_IF_CTRL_REG);
+
+ val = readl(ctrl_reg);
+
+ /* Clear existing chip-select and assertion state */
+ val &= ~(ORION_SPI_CS_MASK | 0x1);
/*
* If this line is using a GPIO to control chip select, this internal
@@ -338,9 +346,7 @@ static void orion_spi_set_cs(struct spi_device *spi, bool enable)
* as it is handled by a GPIO, but that doesn't matter. What we need
* is to deassert the old chip select and assert some other chip select.
*/
- orion_spi_clrbits(orion_spi, ORION_SPI_IF_CTRL_REG, ORION_SPI_CS_MASK);
- orion_spi_setbits(orion_spi, ORION_SPI_IF_CTRL_REG,
- ORION_SPI_CS(spi->chip_select));
+ val |= ORION_SPI_CS(spi->chip_select);
/*
* Chip select logic is inverted from spi_set_cs(). For lines using a
@@ -350,9 +356,13 @@ static void orion_spi_set_cs(struct spi_device *spi, bool enable)
* doesn't matter.
*/
if (!enable)
- orion_spi_setbits(orion_spi, ORION_SPI_IF_CTRL_REG, 0x1);
- else
- orion_spi_clrbits(orion_spi, ORION_SPI_IF_CTRL_REG, 0x1);
+ val |= 0x1;
+
+ /*
+ * To avoid toggling unwanted chip selects update the register
+ * with a single write.
+ */
+ writel(val, ctrl_reg);
}
static inline int orion_spi_wait_till_ready(struct orion_spi *orion_spi)