spi: stm32: add a delay before SPI disable
[ Upstream commit 6de8a70c84ee0586fdde4e671626b9caca6aed74 ] As explained in errata sheet, in section "2.14.5 Truncation of SPI output signals after EOT event": On STM32MP1x, EOT interrupt can be thrown before the true end of communication. So we add a delay of a half period to wait the real end of the transmission. Link: https://www.st.com/resource/en/errata_sheet/es0539-stm32mp131x3x5x-device-errata-stmicroelectronics.pdf Signed-off-by: Valentin Caron <valentin.caron@foss.st.com> Link: https://lore.kernel.org/r/20230906132735.748174-1-valentin.caron@foss.st.com Signed-off-by: Mark Brown <broonie@kernel.org> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
84592ec591
commit
85ca138f92
@ -268,6 +268,7 @@ struct stm32_spi_cfg {
|
||||
* @fifo_size: size of the embedded fifo in bytes
|
||||
* @cur_midi: master inter-data idleness in ns
|
||||
* @cur_speed: speed configured in Hz
|
||||
* @cur_half_period: time of a half bit in us
|
||||
* @cur_bpw: number of bits in a single SPI data frame
|
||||
* @cur_fthlv: fifo threshold level (data frames in a single data packet)
|
||||
* @cur_comm: SPI communication mode
|
||||
@ -294,6 +295,7 @@ struct stm32_spi {
|
||||
|
||||
unsigned int cur_midi;
|
||||
unsigned int cur_speed;
|
||||
unsigned int cur_half_period;
|
||||
unsigned int cur_bpw;
|
||||
unsigned int cur_fthlv;
|
||||
unsigned int cur_comm;
|
||||
@ -454,6 +456,8 @@ static int stm32_spi_prepare_mbr(struct stm32_spi *spi, u32 speed_hz,
|
||||
|
||||
spi->cur_speed = spi->clk_rate / (1 << mbrdiv);
|
||||
|
||||
spi->cur_half_period = DIV_ROUND_CLOSEST(USEC_PER_SEC, 2 * spi->cur_speed);
|
||||
|
||||
return mbrdiv - 1;
|
||||
}
|
||||
|
||||
@ -695,6 +699,10 @@ static void stm32h7_spi_disable(struct stm32_spi *spi)
|
||||
return;
|
||||
}
|
||||
|
||||
/* Add a delay to make sure that transmission is ended. */
|
||||
if (spi->cur_half_period)
|
||||
udelay(spi->cur_half_period);
|
||||
|
||||
if (spi->cur_usedma && spi->dma_tx)
|
||||
dmaengine_terminate_all(spi->dma_tx);
|
||||
if (spi->cur_usedma && spi->dma_rx)
|
||||
|
Loading…
Reference in New Issue
Block a user