diff mbox

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

Message ID 1435095556-15924-33-git-send-email-sjg@chromium.org
State Superseded
Delegated to: Simon Glass
Headers show

Commit Message

Simon Glass June 23, 2015, 9:38 p.m. UTC
We can calculate this. Add code to do this if it is not provided.

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(-)

Comments

Jaehoon Chung June 25, 2015, 1:58 a.m. UTC | #1
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?

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);
>
Simon Glass June 25, 2015, 7:26 p.m. UTC | #2
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?

Regards,
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);
> >
>
Jaehoon Chung June 26, 2015, 4:49 a.m. UTC | #3
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);
>>>
>>
>
diff mbox

Patch

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