mmc: stm32_sdmmc2: correctly manage block size
DBLOCKSIZE should be filled such as the data size is 2^DBLOCKSIZE. Hence it is calculated with __builtin_ctz. Change-Id: Id6b5ff9b594afc4fc523a388011beed307e6abd1 Signed-off-by: Yann Gautier <yann.gautier@st.com>
This commit is contained in:
parent
2c2c9f1eb1
commit
d9d803e0be
|
@ -71,20 +71,14 @@
|
||||||
#define SDMMC_DCTRLR_DTEN BIT(0)
|
#define SDMMC_DCTRLR_DTEN BIT(0)
|
||||||
#define SDMMC_DCTRLR_DTDIR BIT(1)
|
#define SDMMC_DCTRLR_DTDIR BIT(1)
|
||||||
#define SDMMC_DCTRLR_DTMODE GENMASK(3, 2)
|
#define SDMMC_DCTRLR_DTMODE GENMASK(3, 2)
|
||||||
#define SDMMC_DCTRLR_DBLOCKSIZE_0 BIT(4)
|
|
||||||
#define SDMMC_DCTRLR_DBLOCKSIZE_1 BIT(5)
|
|
||||||
#define SDMMC_DCTRLR_DBLOCKSIZE_3 BIT(7)
|
|
||||||
#define SDMMC_DCTRLR_DBLOCKSIZE GENMASK(7, 4)
|
#define SDMMC_DCTRLR_DBLOCKSIZE GENMASK(7, 4)
|
||||||
|
#define SDMMC_DCTRLR_DBLOCKSIZE_SHIFT 4
|
||||||
#define SDMMC_DCTRLR_FIFORST BIT(13)
|
#define SDMMC_DCTRLR_FIFORST BIT(13)
|
||||||
|
|
||||||
#define SDMMC_DCTRLR_CLEAR_MASK (SDMMC_DCTRLR_DTEN | \
|
#define SDMMC_DCTRLR_CLEAR_MASK (SDMMC_DCTRLR_DTEN | \
|
||||||
SDMMC_DCTRLR_DTDIR | \
|
SDMMC_DCTRLR_DTDIR | \
|
||||||
SDMMC_DCTRLR_DTMODE | \
|
SDMMC_DCTRLR_DTMODE | \
|
||||||
SDMMC_DCTRLR_DBLOCKSIZE)
|
SDMMC_DCTRLR_DBLOCKSIZE)
|
||||||
#define SDMMC_DBLOCKSIZE_8 (SDMMC_DCTRLR_DBLOCKSIZE_0 | \
|
|
||||||
SDMMC_DCTRLR_DBLOCKSIZE_1)
|
|
||||||
#define SDMMC_DBLOCKSIZE_512 (SDMMC_DCTRLR_DBLOCKSIZE_0 | \
|
|
||||||
SDMMC_DCTRLR_DBLOCKSIZE_3)
|
|
||||||
|
|
||||||
/* SDMMC status register */
|
/* SDMMC status register */
|
||||||
#define SDMMC_STAR_CCRCFAIL BIT(0)
|
#define SDMMC_STAR_CCRCFAIL BIT(0)
|
||||||
|
@ -464,11 +458,14 @@ static int stm32_sdmmc2_prepare(int lba, uintptr_t buf, size_t size)
|
||||||
int ret;
|
int ret;
|
||||||
uintptr_t base = sdmmc2_params.reg_base;
|
uintptr_t base = sdmmc2_params.reg_base;
|
||||||
uint32_t data_ctrl = SDMMC_DCTRLR_DTDIR;
|
uint32_t data_ctrl = SDMMC_DCTRLR_DTDIR;
|
||||||
|
uint32_t arg_size;
|
||||||
|
|
||||||
if (size == 8U) {
|
assert(size != 0U);
|
||||||
data_ctrl |= SDMMC_DBLOCKSIZE_8;
|
|
||||||
|
if (size > MMC_BLOCK_SIZE) {
|
||||||
|
arg_size = MMC_BLOCK_SIZE;
|
||||||
} else {
|
} else {
|
||||||
data_ctrl |= SDMMC_DBLOCKSIZE_512;
|
arg_size = size;
|
||||||
}
|
}
|
||||||
|
|
||||||
sdmmc2_params.use_dma = plat_sdmmc2_use_dma(base, buf);
|
sdmmc2_params.use_dma = plat_sdmmc2_use_dma(base, buf);
|
||||||
|
@ -487,12 +484,7 @@ static int stm32_sdmmc2_prepare(int lba, uintptr_t buf, size_t size)
|
||||||
zeromem(&cmd, sizeof(struct mmc_cmd));
|
zeromem(&cmd, sizeof(struct mmc_cmd));
|
||||||
|
|
||||||
cmd.cmd_idx = MMC_CMD(16);
|
cmd.cmd_idx = MMC_CMD(16);
|
||||||
if (size > MMC_BLOCK_SIZE) {
|
cmd.cmd_arg = arg_size;
|
||||||
cmd.cmd_arg = MMC_BLOCK_SIZE;
|
|
||||||
} else {
|
|
||||||
cmd.cmd_arg = size;
|
|
||||||
}
|
|
||||||
|
|
||||||
cmd.resp_type = MMC_RESPONSE_R1;
|
cmd.resp_type = MMC_RESPONSE_R1;
|
||||||
|
|
||||||
ret = stm32_sdmmc2_send_cmd(&cmd);
|
ret = stm32_sdmmc2_send_cmd(&cmd);
|
||||||
|
@ -514,6 +506,8 @@ static int stm32_sdmmc2_prepare(int lba, uintptr_t buf, size_t size)
|
||||||
flush_dcache_range(buf, size);
|
flush_dcache_range(buf, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
data_ctrl |= __builtin_ctz(arg_size) << SDMMC_DCTRLR_DBLOCKSIZE_SHIFT;
|
||||||
|
|
||||||
mmio_clrsetbits_32(base + SDMMC_DCTRLR,
|
mmio_clrsetbits_32(base + SDMMC_DCTRLR,
|
||||||
SDMMC_DCTRLR_CLEAR_MASK,
|
SDMMC_DCTRLR_CLEAR_MASK,
|
||||||
data_ctrl);
|
data_ctrl);
|
||||||
|
|
Loading…
Reference in New Issue