Skip to content

Commit 52b62e7

Browse files
lopsided98broonie
authored andcommitted
spi: stm32: enable controller before asserting CS
On the STM32F4/7, the MOSI and CLK pins float while the controller is disabled. CS is a regular GPIO, and therefore always driven. Currently, the controller is enabled in the transfer_one() callback, which runs after CS is asserted. Therefore, there is a period where the SPI pins are floating while CS is asserted, making it possible for stray signals to disrupt communications. An analogous problem occurs at the end of the transfer when the controller is disabled before CS is released. This problem can be reliably observed by enabling the pull-up (if CPOL=0) or pull-down (if CPOL=1) on the clock pin. This will cause two extra unintended clock edges per transfer, when the controller is enabled and disabled. Note that this bug is likely not present on the STM32H7, because this driver sets the AFCNTR bit (not supported on F4/F7), which keeps the SPI pins driven even while the controller is disabled. Enabling/disabling the controller as part of runtime PM was suggested as an alternative approach, but this breaks the driver on the STM32MP1 (see [1]). The following quote from the manual may explain this: > To restart the internal state machine properly, SPI is strongly > suggested to be disabled and re-enabled before next transaction starts > despite its setting is not changed. This patch has been tested on an STM32F746 with a MAX14830 UART expander. [1] https://lore.kernel.org/lkml/ZXzRi_h2AMqEhMVw@dell-precision-5540/T/ Signed-off-by: Ben Wolsieffer <ben.wolsieffer@hefring.com> Link: https://lore.kernel.org/r/20240424135237.1329001-2-ben.wolsieffer@hefring.com Signed-off-by: Mark Brown <broonie@kernel.org>
1 parent 4756fa5 commit 52b62e7

File tree

1 file changed

+2
-12
lines changed

1 file changed

+2
-12
lines changed

drivers/spi/spi-stm32.c

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1016,10 +1016,8 @@ static irqreturn_t stm32fx_spi_irq_event(int irq, void *dev_id)
10161016
static irqreturn_t stm32fx_spi_irq_thread(int irq, void *dev_id)
10171017
{
10181018
struct spi_controller *ctrl = dev_id;
1019-
struct stm32_spi *spi = spi_controller_get_devdata(ctrl);
10201019

10211020
spi_finalize_current_transfer(ctrl);
1022-
stm32fx_spi_disable(spi);
10231021

10241022
return IRQ_HANDLED;
10251023
}
@@ -1187,6 +1185,8 @@ static int stm32_spi_prepare_msg(struct spi_controller *ctrl,
11871185
~clrb) | setb,
11881186
spi->base + spi->cfg->regs->cpol.reg);
11891187

1188+
stm32_spi_enable(spi);
1189+
11901190
spin_unlock_irqrestore(&spi->lock, flags);
11911191

11921192
return 0;
@@ -1204,7 +1204,6 @@ static void stm32fx_spi_dma_tx_cb(void *data)
12041204

12051205
if (spi->cur_comm == SPI_SIMPLEX_TX || spi->cur_comm == SPI_3WIRE_TX) {
12061206
spi_finalize_current_transfer(spi->ctrl);
1207-
stm32fx_spi_disable(spi);
12081207
}
12091208
}
12101209

@@ -1219,7 +1218,6 @@ static void stm32_spi_dma_rx_cb(void *data)
12191218
struct stm32_spi *spi = data;
12201219

12211220
spi_finalize_current_transfer(spi->ctrl);
1222-
spi->cfg->disable(spi);
12231221
}
12241222

12251223
/**
@@ -1307,8 +1305,6 @@ static int stm32fx_spi_transfer_one_irq(struct stm32_spi *spi)
13071305

13081306
stm32_spi_set_bits(spi, STM32FX_SPI_CR2, cr2);
13091307

1310-
stm32_spi_enable(spi);
1311-
13121308
/* starting data transfer when buffer is loaded */
13131309
if (spi->tx_buf)
13141310
spi->cfg->write_tx(spi);
@@ -1345,8 +1341,6 @@ static int stm32h7_spi_transfer_one_irq(struct stm32_spi *spi)
13451341

13461342
spin_lock_irqsave(&spi->lock, flags);
13471343

1348-
stm32_spi_enable(spi);
1349-
13501344
/* Be sure to have data in fifo before starting data transfer */
13511345
if (spi->tx_buf)
13521346
stm32h7_spi_write_txfifo(spi);
@@ -1378,8 +1372,6 @@ static void stm32fx_spi_transfer_one_dma_start(struct stm32_spi *spi)
13781372
*/
13791373
stm32_spi_set_bits(spi, STM32FX_SPI_CR2, STM32FX_SPI_CR2_ERRIE);
13801374
}
1381-
1382-
stm32_spi_enable(spi);
13831375
}
13841376

13851377
/**
@@ -1413,8 +1405,6 @@ static void stm32h7_spi_transfer_one_dma_start(struct stm32_spi *spi)
14131405

14141406
stm32_spi_set_bits(spi, STM32H7_SPI_IER, ier);
14151407

1416-
stm32_spi_enable(spi);
1417-
14181408
if (STM32_SPI_HOST_MODE(spi))
14191409
stm32_spi_set_bits(spi, STM32H7_SPI_CR1, STM32H7_SPI_CR1_CSTART);
14201410
}

0 commit comments

Comments
 (0)