summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--configs/stm32mp25_defconfig2
-rw-r--r--drivers/mmc/stm32_sdmmc2.c16
-rw-r--r--drivers/mtd/nand/raw/stm32_fmc2_nand.c1
3 files changed, 18 insertions, 1 deletions
diff --git a/configs/stm32mp25_defconfig b/configs/stm32mp25_defconfig
index 14619ffd96c..2b02cd86d61 100644
--- a/configs/stm32mp25_defconfig
+++ b/configs/stm32mp25_defconfig
@@ -41,6 +41,8 @@ CONFIG_CMD_REGULATOR=y
CONFIG_CMD_LOG=y
CONFIG_CMD_UBI=y
CONFIG_OF_LIVE=y
+CONFIG_OF_UPSTREAM_BUILD_VENDOR=y
+CONFIG_OF_UPSTREAM_VENDOR="st"
CONFIG_ENV_IS_NOWHERE=y
CONFIG_ENV_IS_IN_MMC=y
CONFIG_ENV_IS_IN_SPI_FLASH=y
diff --git a/drivers/mmc/stm32_sdmmc2.c b/drivers/mmc/stm32_sdmmc2.c
index 9483fb57daf..122690aef3e 100644
--- a/drivers/mmc/stm32_sdmmc2.c
+++ b/drivers/mmc/stm32_sdmmc2.c
@@ -385,15 +385,29 @@ static int stm32_sdmmc2_end_data(struct udevice *dev,
u32 mask = SDMMC_STA_DCRCFAIL | SDMMC_STA_DTIMEOUT |
SDMMC_STA_IDMATE | SDMMC_STA_DATAEND;
u32 status;
+ unsigned long timeout_msecs = ctx->data_length >> 8;
+ unsigned long start_timeout;
+
+ /* At least, a timeout of 2 seconds is set */
+ if (timeout_msecs < 2000)
+ timeout_msecs = 2000;
if (data->flags & MMC_DATA_READ)
mask |= SDMMC_STA_RXOVERR;
else
mask |= SDMMC_STA_TXUNDERR;
+ start_timeout = get_timer(0);
status = readl(plat->base + SDMMC_STA);
- while (!(status & mask))
+ while (!(status & mask)) {
+ if (get_timer(start_timeout) > timeout_msecs) {
+ ctx->dpsm_abort = true;
+ return -ETIMEDOUT;
+ }
+
+ schedule();
status = readl(plat->base + SDMMC_STA);
+ }
/*
* Need invalidate the dcache again to avoid any
diff --git a/drivers/mtd/nand/raw/stm32_fmc2_nand.c b/drivers/mtd/nand/raw/stm32_fmc2_nand.c
index d1c88643c98..21e3c88a55a 100644
--- a/drivers/mtd/nand/raw/stm32_fmc2_nand.c
+++ b/drivers/mtd/nand/raw/stm32_fmc2_nand.c
@@ -1034,6 +1034,7 @@ static int stm32_fmc2_nfc_probe(struct udevice *dev)
ecclayout->eccpos[i] = oob_index;
ecclayout->oobfree->offset = oob_index;
ecclayout->oobfree->length = mtd->oobsize - ecclayout->oobfree->offset;
+ ecclayout->oobavail = ecclayout->oobfree->length;
chip->ecc.layout = ecclayout;
if (chip->options & NAND_BUSWIDTH_16)