提交 e576bd90 编写于 作者: E Eric Nelson 提交者: Andy Fleming

i.MX: fsl_esdhc: allow use with cache enabled.

Signed-off-by: NEric Nelson <eric.nelson@boundarydevices.com>
Signed-off-by: NAndy Fleming <afleming@freescale.com>
上级 0b15d51e
...@@ -190,6 +190,10 @@ static int esdhc_setup_data(struct mmc *mmc, struct mmc_data *data) ...@@ -190,6 +190,10 @@ static int esdhc_setup_data(struct mmc *mmc, struct mmc_data *data)
esdhc_clrsetbits32(&regs->wml, WML_RD_WML_MASK, wml_value); esdhc_clrsetbits32(&regs->wml, WML_RD_WML_MASK, wml_value);
esdhc_write32(&regs->dsaddr, (u32)data->dest); esdhc_write32(&regs->dsaddr, (u32)data->dest);
} else { } else {
flush_dcache_range((ulong)data->src,
(ulong)data->src+data->blocks
*data->blocksize);
if (wml_value > WML_WR_WML_MAX) if (wml_value > WML_WR_WML_MAX)
wml_value = WML_WR_WML_MAX_VAL; wml_value = WML_WR_WML_MAX_VAL;
if ((esdhc_read32(&regs->prsstat) & PRSSTAT_WPSPL) == 0) { if ((esdhc_read32(&regs->prsstat) & PRSSTAT_WPSPL) == 0) {
...@@ -249,7 +253,15 @@ static int esdhc_setup_data(struct mmc *mmc, struct mmc_data *data) ...@@ -249,7 +253,15 @@ static int esdhc_setup_data(struct mmc *mmc, struct mmc_data *data)
return 0; return 0;
} }
static void check_and_invalidate_dcache_range
(struct mmc_cmd *cmd,
struct mmc_data *data) {
unsigned start = (unsigned)data->dest ;
unsigned size = roundup(ARCH_DMA_MINALIGN,
data->blocks*data->blocksize);
unsigned end = start+size ;
invalidate_dcache_range(start, end);
}
/* /*
* Sends a command out on the bus. Takes the mmc pointer, * Sends a command out on the bus. Takes the mmc pointer,
* a command pointer, and an optional data pointer. * a command pointer, and an optional data pointer.
...@@ -315,6 +327,9 @@ esdhc_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd, struct mmc_data *data) ...@@ -315,6 +327,9 @@ esdhc_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd, struct mmc_data *data)
while (!(esdhc_read32(&regs->irqstat) & (IRQSTAT_CC | IRQSTAT_CTOE))) while (!(esdhc_read32(&regs->irqstat) & (IRQSTAT_CC | IRQSTAT_CTOE)))
; ;
if (data && (data->flags & MMC_DATA_READ))
check_and_invalidate_dcache_range(cmd, data);
irqstat = esdhc_read32(&regs->irqstat); irqstat = esdhc_read32(&regs->irqstat);
esdhc_write32(&regs->irqstat, irqstat); esdhc_write32(&regs->irqstat, irqstat);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册