
Hi, Simon.
On 06/26/2015 04:26 AM, Simon Glass wrote:
Hi Jaehoon,
On 24 June 2015 at 19:58, Jaehoon Chung jh80.chung@gmail.com wrote:
Hi, Simon.
On 06/24/2015 06:38 AM, Simon Glass wrote:
We can calculate this. Add code to do this if it is not provided.
Did you consider the kernel side?
Can you please be more specific?
I didn't check now for fifoth value. But as i know (in my experiment), if it's not defined fifoth_val into kernel dt file, fifoth value is calculated with value of reading register.
Well, i think your patch is right. (It needs to calculate the exactly fifoth_val.)
The below case should be problem.
1. Calculate and set the fifoth value at bootloader. fifoth register = 0x203f0040 2. If fifoth_val doesn't set into dt-file(kernel), on kernel side re-calculate fifoth value. Should be fifo_size = 3f, since fifoth register's value is 0x203f0040. and fifoth register should be set to 0x201e001f.(just example.)
So i will try to find more generic solution for this problem. If i missed something, let me know, plz. :)
Actually, this case is complicated case.
Best Regards, Jaehoon Chung
Regards,1 Simon
Best Regards, Jaehoon Chung
Signed-off-by: Simon Glass sjg@chromium.org
Changes in v3: None Changes in v2: None
drivers/mmc/dw_mmc.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-)
diff --git a/drivers/mmc/dw_mmc.c b/drivers/mmc/dw_mmc.c index a034c3f..cce2a5d 100644 --- a/drivers/mmc/dw_mmc.c +++ b/drivers/mmc/dw_mmc.c @@ -355,9 +355,15 @@ static int dwmci_init(struct mmc *mmc) dwmci_writel(host, DWMCI_IDINTEN, 0); dwmci_writel(host, DWMCI_BMOD, 1);
if (host->fifoth_val) {
dwmci_writel(host, DWMCI_FIFOTH, host->fifoth_val);
if (!host->fifoth_val) {
uint32_t fifo_size;
fifo_size = dwmci_readl(host, DWMCI_FIFOTH);
fifo_size = ((fifo_size & RX_WMARK_MASK) >> RX_WMARK_SHIFT) + 1;
host->fifoth_val = MSIZE(0x2) | RX_WMARK(fifo_size / 2 - 1) |
TX_WMARK(fifo_size / 2); }
dwmci_writel(host, DWMCI_FIFOTH, host->fifoth_val); dwmci_writel(host, DWMCI_CLKENA, 0); dwmci_writel(host, DWMCI_CLKSRC, 0);