[U-Boot] [PATCH v3 32/54] mmc: Calculate dwmmc FIFO threshold size if not provided

Jaehoon Chung jh80.chung at samsung.com
Fri Jun 26 06:49:48 CEST 2015


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 at 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 at 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);
>>>
>>
> 



More information about the U-Boot mailing list