diff options
author | Christophe Kerello <christophe.kerello@foss.st.com> | 2022-05-04 11:14:55 +0200 |
---|---|---|
committer | Yann Gautier <yann.gautier@st.com> | 2022-05-11 10:01:17 +0200 |
commit | 55de58323e458b38b455439a8846cb663deb5508 (patch) | |
tree | f96a7ddf8c5ddb9ada003d2901e3c1a13b2abe16 /drivers/st | |
parent | aeef2c22da2eb103a054e4d2d45651eb1f2a6a99 (diff) | |
download | arm-trusted-firmware-55de58323e458b38b455439a8846cb663deb5508.tar.gz |
fix(st-spi): always check SR_TCF flags in stm32_qspi_wait_cmd()
Currently, SR_TCF flag is checked in case there is data, this criteria
is not correct.
SR_TCF flags is set when programmed number of bytes have been
transferred to the memory device ("bytes" comprised command and data
send to the SPI device).
So even if there is no data, we must check SR_TCF flag.
Change-Id: I99c4145e639c1b842feb3690dd78329179c18132
Signed-off-by: Christophe Kerello <christophe.kerello@foss.st.com>
Diffstat (limited to 'drivers/st')
-rw-r--r-- | drivers/st/spi/stm32_qspi.c | 16 |
1 files changed, 8 insertions, 8 deletions
diff --git a/drivers/st/spi/stm32_qspi.c b/drivers/st/spi/stm32_qspi.c index d3c26d94d..28e071907 100644 --- a/drivers/st/spi/stm32_qspi.c +++ b/drivers/st/spi/stm32_qspi.c @@ -1,13 +1,10 @@ /* - * Copyright (c) 2019-2021, STMicroelectronics - All Rights Reserved + * Copyright (c) 2019-2022, STMicroelectronics - All Rights Reserved * * SPDX-License-Identifier: GPL-2.0+ OR BSD-3-Clause */ #include <inttypes.h> -#include <libfdt.h> - -#include <platform_def.h> #include <common/debug.h> #include <common/fdt_wrappers.h> @@ -19,6 +16,9 @@ #include <drivers/st/stm32mp_reset.h> #include <lib/mmio.h> #include <lib/utils_def.h> +#include <libfdt.h> + +#include <platform_def.h> /* Timeout for device interface reset */ #define TIMEOUT_US_1_MS 1000U @@ -139,10 +139,6 @@ static int stm32_qspi_wait_cmd(const struct spi_mem_op *op) int ret = 0; uint64_t timeout; - if (op->data.nbytes == 0U) { - return stm32_qspi_wait_for_not_busy(); - } - timeout = timeout_init_us(QSPI_CMD_TIMEOUT_US); while ((mmio_read_32(qspi_base() + QSPI_SR) & QSPI_SR_TCF) == 0U) { if (timeout_elapsed(timeout)) { @@ -163,6 +159,10 @@ static int stm32_qspi_wait_cmd(const struct spi_mem_op *op) /* Clear flags */ mmio_write_32(qspi_base() + QSPI_FCR, QSPI_FCR_CTCF | QSPI_FCR_CTEF); + if (ret == 0) { + ret = stm32_qspi_wait_for_not_busy(); + } + return ret; } |