From 468b76b2222873ee212af103349d4e7cfbe29227 Mon Sep 17 00:00:00 2001 From: Ziyuan Xu Date: Tue, 26 Aug 2025 11:14:57 +0800 Subject: [PATCH] soc: rockchip: thunderboot_mmc: Send CMD12 after transmission completion There're two ways to support read multiple blocks transmission: - Current design: SET_BLOCK_COUNT(CMD23) + READ_MULTIPLE_BLOCK(CMD18) - READ_MULTIPLE_BLOCK(CMD18) + STOP_TRANSMISSION(CMD12) CMD23 only support 2^16 blocks, we should change to plan B for the larger size transmission. Change-Id: Id8f3d11dbff65b8bac4b74ef2024862b6722fc26 Signed-off-by: Ziyuan Xu --- drivers/soc/rockchip/rockchip_thunderboot_mmc.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/drivers/soc/rockchip/rockchip_thunderboot_mmc.c b/drivers/soc/rockchip/rockchip_thunderboot_mmc.c index 3ca747066a6b..1dd41b456aae 100644 --- a/drivers/soc/rockchip/rockchip_thunderboot_mmc.c +++ b/drivers/soc/rockchip/rockchip_thunderboot_mmc.c @@ -17,6 +17,8 @@ #include #define SDMMC_CTRL 0x000 +#define SDMMC_CMDARG 0x028 +#define SDMMC_CMD 0x02c #define SDMMC_RINTSTS 0x044 #define SDMMC_STATUS 0x048 #define SDMMC_BMOD 0x080 @@ -84,6 +86,18 @@ static int rk_tb_mmc_thread(void *p) writel(0, regs + SDMMC_BMOD); writel(0, regs + SDMMC_DBADDR); + /* Send CMD12 to stop transmission */ + writel(0xffffffff, regs + SDMMC_RINTSTS); + writel(0, regs + SDMMC_CMDARG); + writel(0xa000414c, regs + SDMMC_CMD); + + if (readl_poll_timeout(regs + SDMMC_RINTSTS, status, + !(status & BIT(2)), 100, + 11 * USEC_PER_MSEC)) { + dev_err(dev, "Send CMD12 timeout!\n"); + goto out; + } + /* Parse ramdisk addr and help start decompressing */ if (rds && rdd) { struct resource src, dst;