From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jaehoon Chung Date: Fri, 26 Jun 2015 13:49:48 +0900 Subject: [U-Boot] [PATCH v3 32/54] mmc: Calculate dwmmc FIFO threshold size if not provided In-Reply-To: References: <1435095556-15924-1-git-send-email-sjg@chromium.org> <1435095556-15924-33-git-send-email-sjg@chromium.org> <558B6033.2030601@gmail.com> Message-ID: <558CD9EC.9030106@samsung.com> List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: u-boot@lists.denx.de Hi, Simon. On 06/26/2015 04:26 AM, Simon Glass wrote: > Hi Jaehoon, > > On 24 June 2015 at 19:58, Jaehoon Chung 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 >>> --- >>> >>> 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); >>> >> >