Skip to content

Commit

Permalink
spi: stm32: always perform registers configuration prior to transfer
Browse files Browse the repository at this point in the history
[ Upstream commit 60ccb35 ]

SPI registers content may have been lost upon suspend/resume sequence.
So, always compute and apply the necessary configuration in
stm32_spi_transfer_one_setup routine.

Signed-off-by: Alain Volmat <alain.volmat@st.com>
Link: https://lore.kernel.org/r/1597043558-29668-6-git-send-email-alain.volmat@st.com
Signed-off-by: Mark Brown <broonie@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
  • Loading branch information
avolmat-st authored and gregkh committed Sep 3, 2020
1 parent 2844685 commit d2da80e
Showing 1 changed file with 17 additions and 25 deletions.
42 changes: 17 additions & 25 deletions drivers/spi/spi-stm32.c
Expand Up @@ -1590,41 +1590,33 @@ static int stm32_spi_transfer_one_setup(struct stm32_spi *spi,
unsigned long flags;
unsigned int comm_type;
int nb_words, ret = 0;
int mbr;

spin_lock_irqsave(&spi->lock, flags);

spi->cur_xferlen = transfer->len;

if (spi->cur_bpw != transfer->bits_per_word) {
spi->cur_bpw = transfer->bits_per_word;
spi->cfg->set_bpw(spi);
}

if (spi->cur_speed != transfer->speed_hz) {
int mbr;

/* Update spi->cur_speed with real clock speed */
mbr = stm32_spi_prepare_mbr(spi, transfer->speed_hz,
spi->cfg->baud_rate_div_min,
spi->cfg->baud_rate_div_max);
if (mbr < 0) {
ret = mbr;
goto out;
}
spi->cur_bpw = transfer->bits_per_word;
spi->cfg->set_bpw(spi);

transfer->speed_hz = spi->cur_speed;
stm32_spi_set_mbr(spi, mbr);
/* Update spi->cur_speed with real clock speed */
mbr = stm32_spi_prepare_mbr(spi, transfer->speed_hz,
spi->cfg->baud_rate_div_min,
spi->cfg->baud_rate_div_max);
if (mbr < 0) {
ret = mbr;
goto out;
}

comm_type = stm32_spi_communication_type(spi_dev, transfer);
if (spi->cur_comm != comm_type) {
ret = spi->cfg->set_mode(spi, comm_type);
transfer->speed_hz = spi->cur_speed;
stm32_spi_set_mbr(spi, mbr);

if (ret < 0)
goto out;
comm_type = stm32_spi_communication_type(spi_dev, transfer);
ret = spi->cfg->set_mode(spi, comm_type);
if (ret < 0)
goto out;

spi->cur_comm = comm_type;
}
spi->cur_comm = comm_type;

if (spi->cfg->set_data_idleness)
spi->cfg->set_data_idleness(spi, transfer->len);
Expand Down

0 comments on commit d2da80e

Please sign in to comment.