mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-11-24 21:54:01 +00:00
mmc: fsl_esdhc_imx: simplify esdhc_setup_data()
[ fsl_esdhc commit 7e48a028a4
]
First, we need the waterlevel setting for PIO mode only. Secondy, both DMA
setup code is identical for both directions, except for the data pointer.
Thus, unify them.
Signed-off-by: Michael Walle <michael@walle.cc>
Signed-off-by: Sean Anderson <sean.anderson@seco.com>
Reviewed-by: Jaehoon Chung <jh80.chung@samsung.com>
This commit is contained in:
parent
0167267769
commit
41c6a22fc2
1 changed files with 48 additions and 33 deletions
|
@ -279,59 +279,74 @@ static void esdhc_pio_read_write(struct fsl_esdhc_priv *priv,
|
|||
}
|
||||
#endif
|
||||
|
||||
static int esdhc_setup_data(struct fsl_esdhc_priv *priv, struct mmc *mmc,
|
||||
struct mmc_data *data)
|
||||
#ifdef CONFIG_SYS_FSL_ESDHC_USE_PIO
|
||||
static void esdhc_setup_watermark_level(struct fsl_esdhc_priv *priv,
|
||||
struct mmc_data *data)
|
||||
{
|
||||
int timeout;
|
||||
uint trans_bytes = data->blocksize * data->blocks;
|
||||
struct fsl_esdhc *regs = priv->esdhc_regs;
|
||||
uint wml_value;
|
||||
|
||||
wml_value = data->blocksize/4;
|
||||
uint wml_value = data->blocksize / 4;
|
||||
|
||||
if (data->flags & MMC_DATA_READ) {
|
||||
if (wml_value > WML_RD_WML_MAX)
|
||||
wml_value = WML_RD_WML_MAX_VAL;
|
||||
|
||||
esdhc_clrsetbits32(®s->wml, WML_RD_WML_MASK, wml_value);
|
||||
#ifndef CONFIG_SYS_FSL_ESDHC_USE_PIO
|
||||
priv->dma_addr = dma_map_single(data->dest, trans_bytes,
|
||||
mmc_get_dma_dir(data));
|
||||
if (upper_32_bits(priv->dma_addr))
|
||||
printf("Cannot use 64 bit addresses with SDMA\n");
|
||||
esdhc_write32(®s->dsaddr, lower_32_bits(priv->dma_addr));
|
||||
#endif
|
||||
} else {
|
||||
if (wml_value > WML_WR_WML_MAX)
|
||||
wml_value = WML_WR_WML_MAX_VAL;
|
||||
if (priv->wp_enable) {
|
||||
if ((esdhc_read32(®s->prsstat) &
|
||||
PRSSTAT_WPSPL) == 0) {
|
||||
printf("\nThe SD card is locked. Can not write to a locked card.\n\n");
|
||||
return -ETIMEDOUT;
|
||||
}
|
||||
|
||||
esdhc_clrsetbits32(®s->wml, WML_WR_WML_MASK,
|
||||
wml_value << 16);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
static void esdhc_setup_dma(struct fsl_esdhc_priv *priv, struct mmc_data *data)
|
||||
{
|
||||
uint trans_bytes = data->blocksize * data->blocks;
|
||||
struct fsl_esdhc *regs = priv->esdhc_regs;
|
||||
void *buf;
|
||||
|
||||
if (data->flags & MMC_DATA_WRITE)
|
||||
buf = (void *)data->src;
|
||||
else
|
||||
buf = data->dest;
|
||||
|
||||
priv->dma_addr = dma_map_single(buf, trans_bytes,
|
||||
mmc_get_dma_dir(data));
|
||||
if (upper_32_bits(priv->dma_addr))
|
||||
printf("Cannot use 64 bit addresses with SDMA\n");
|
||||
esdhc_write32(®s->dsaddr, lower_32_bits(priv->dma_addr));
|
||||
esdhc_write32(®s->blkattr, data->blocks << 16 | data->blocksize);
|
||||
}
|
||||
|
||||
static int esdhc_setup_data(struct fsl_esdhc_priv *priv, struct mmc *mmc,
|
||||
struct mmc_data *data)
|
||||
{
|
||||
int timeout;
|
||||
bool is_write = data->flags & MMC_DATA_WRITE;
|
||||
struct fsl_esdhc *regs = priv->esdhc_regs;
|
||||
|
||||
if (is_write) {
|
||||
if (priv->wp_enable && !(esdhc_read32(®s->prsstat) & PRSSTAT_WPSPL)) {
|
||||
printf("Cannot write to locked SD card.\n");
|
||||
return -EINVAL;
|
||||
} else {
|
||||
#if CONFIG_IS_ENABLED(DM_GPIO)
|
||||
if (dm_gpio_is_valid(&priv->wp_gpio) &&
|
||||
dm_gpio_get_value(&priv->wp_gpio)) {
|
||||
printf("\nThe SD card is locked. Can not write to a locked card.\n\n");
|
||||
return -ETIMEDOUT;
|
||||
printf("Cannot write to locked SD card.\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
esdhc_clrsetbits32(®s->wml, WML_WR_WML_MASK,
|
||||
wml_value << 16);
|
||||
#ifndef CONFIG_SYS_FSL_ESDHC_USE_PIO
|
||||
priv->dma_addr = dma_map_single((void *)data->src, trans_bytes,
|
||||
mmc_get_dma_dir(data));
|
||||
if (upper_32_bits(priv->dma_addr))
|
||||
printf("Cannot use 64 bit addresses with SDMA\n");
|
||||
esdhc_write32(®s->dsaddr, lower_32_bits(priv->dma_addr));
|
||||
#endif
|
||||
}
|
||||
|
||||
esdhc_write32(®s->blkattr, data->blocks << 16 | data->blocksize);
|
||||
#ifdef CONFIG_SYS_FSL_ESDHC_USE_PIO
|
||||
esdhc_setup_watermark_level(priv, data);
|
||||
#else
|
||||
esdhc_setup_dma(priv, data);
|
||||
#endif
|
||||
|
||||
/* Calculate the timeout period for data transactions */
|
||||
/*
|
||||
|
|
Loading…
Reference in a new issue