Hi,
Hi,
On 07/04/2014 04:31 AM, Wills Wang wrote:
Hi,
diff --git a/drivers/mmc/sunxi_mmc.c b/drivers/mmc/sunxi_mmc.c
index bbfe8a3..f0cb760 100644
--- a/drivers/mmc/sunxi_mmc.c
+++ b/drivers/mmc/sunxi_mmc.c
@@ -173,8 +173,6 @@ static int mmc_core_init(struct mmc *mmc)
/* Reset controller */
writel(SUNXI_MMC_GCTRL_RESET, &mmchost->reg->gctrl);
udelay(1000);
- /* Always read / write data through the CPU */
- writel(SUNXI_MMC_GCTRL_ACCESS_BY_AHB, &mmchost->reg->gctrl);
return 0;
}
@@ -189,6 +187,13 @@ static int mmc_trans_data_by_cpu(struct mmc *mmc, struct
mmc_data *data)
unsigned byte_cnt = data->blocksize * data->blocks;
unsigned timeout_msecs = 2000;
unsigned *buff = (unsigned int *)(reading ? data->dest : data->src);
+ unsigned int gctrl;
+
+ /* Always read / write data through the CPU */
+ gctrl = readl(&mmchost->reg->gctrl);
+ gctrl &= ~SUNXI_MMC_GCTRL_ACCESS_BY_AHB;
The above line seems redundant / unnecessary.
These lines are based on read-modify-write principle, the mmc hardware on sunxi
have no detail document, we don't know what happen when operate this register
in actually.
Right, but the line below this one:
+ gctrl |= SUNXI_MMC_GCTRL_ACCESS_BY_AHB;
Undoes the clearing you're doing. And you are not working on
a register here, but on a local variable. So likely the
C-compiler will just optimize away the redundant line.
But even if the compiler does not optimize it away, then
the mmc controller still will not see it as the
|= overrules the &= and the result is not written to the
mmc controller until after the |= .
You are right, the clearing is unnecessary.
Can you please try with the redundant line removed ?
It work fine after remove the redundant line.
Best Regards
Wills
--
You received this message because you are subscribed to the Google Groups
"linux-sunxi" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to linux-sunxi+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.