Hi Stefan,

On 12/30/2016 12:41 AM, Stefan Herbrechtsmeier wrote:
> Hi,
> 
> Am 29.12.2016 um 08:44 schrieb Jaehoon Chung:
>> Hi
>>
>> On 12/29/2016 09:53 AM, Kever Yang wrote:
>>> Hi Stefan,
>>>
>>>      Thanks for your review comment.
>>> On 12/29/2016 02:35 AM, Stefan Herbrechtsmeier wrote:
>>>> Hi,
>>>>
>>>> Am 28.12.2016 um 12:01 schrieb Jaehoon Chung:
>>>>> On 12/28/2016 12:32 PM, Kever Yang wrote:
>>>>>> Init the clock rate to max-frequency from dts with clock driver api.
>>>>>>
>>>>>> Signed-off-by: Kever Yang <kever.y...@rock-chips.com>
>>>>> Reviewed-by: Jaehoon Chung <jh80.ch...@samsung.com>
>>>> This is an incorrect use of the max-frequency property.
>>>>
>>>> The max-frequency value limit the output clock of the mmc interface and 
>>>> depends on the controller, circuit (level shifter), board and so on. It 
>>>> doesn't represents the clock frequency of the controller.
>>>>
>>>> The clock setup inside the clock framework should use the 
>>>> assigned-clock-rates property. The mmc driver should only enable the clock 
>>>> and pass the clock rate together with the max-frequency to the mmc 
>>>> framework.
>>> I'm not good at mmc controller and driver framework, but seems that the 
>>> sdhci core treats the max-frequency as the clock input from clock module, 
>>> right?
> This is true for the current u-boot implementation. But this code is wrong 
> and differs from the kernel. The u-boot mmc framework doesn't distinguish 
> between f_max of the mmc interface and max_clk of the host controller. I have 
> already post a patch to fix this.
> 
>>> What if the mmc controller max-frequency is not equal to the clock module 
>>> output which is possible? Does kernel deal with this, and how.
> The kernel distinguish between clock module output frequency (host->max_clk) 
> and max-frequency of the mmc interface (mmc->f_max).
> 
>> If my understanding is right, some controller should be broken the 
>> CLOCK_BASE capability. (Refer to Linux kernel)
>> And then they needs to get value from CMU.
>>
>> host->max_clk should be used the card's maximum value.
> It represents the (input) base clock of the mmc controller and not the card. 
> A divider of one leads to maximum value.
> 
>> In Linux Kernel's case
>> if max_frequency property is defined, assigned to mmc->f_max
>> and host->f_max is assigned to clk_get_rate() value. (If Broken clock_base 
>> capability)
> host->max_clk not host->f_max
> 
>> And check "mmc->f_max > host->f_max" or "mmc->f_max == 0"
>>     if true
>>     then mmc->_f_max = f_max;
>>     else
>>     then mmc->f_max is used to "max_frequency" value.
>>
>> In Conclusion,
>>     host's maximum value is used. ("max_frequency" property is used to 
>> QUIRK_BROKEN_CAP_CLOCK_BASE in Linux kernel.)
> The conclusion is wrong. The host->max_clk isn't influenced by the 
> max-frequency. The mmc drivers supplies the host->max_clk via the 
> get_max_clock function if QUIRK_BROKEN_CAP_CLOCK_BASE is set. The mmc->f_max 
> is equal to host->max_clk or max-frequency if set. This means you only need 
> max-frequency if it is lower than the host->max_clk.

host->max_clk is influenced by max-frequency.
get_max_clock function? where is get_max_clock() function used?
Your patches didn't apply yet. waiting for Michal's review.

Did you know what means the quirk for broken clock base?
It means host->max_clk can be 0 or other. Then it should be lower than min_clk 
likes your mentions.
To prevent this, getting from max_frequency property.

> 
> The host->max_clk is used for the calculation of the divider and multiplier. 
> It represents the clock rate of the controller.
> The mmc->f_max limits the clock rate of the card.

Yes, mmc->f_max is card's maximum frequency.
You can see how to control the clock in drivers/mmc/mmc.c

Kernel and u-boot have to check the card and host's clock values.
And needs to choose the one of them.. f_max is not getting from card. Also it's 
assigned from host controller.

Really ideal approach is "Using the clk_set_rate()/clk_get_rate() from 
CMU"..but some controllers don't fully support yet the CMU.
Of_course, it needs to consider the base clock broken case.

> 
>> Kever's patch is not problem.
> The problem is that the patch "init the clock rate to max-frequency" and this 
> is wrong and differs from the kernel which use the assigned-clock-rates. What 
> happens if somebody sets the max-frequency to 400000? Does the clock 
> controller supports such a low frequency? What happens if the clock 
> controller use a different clock as requested and the mmc framework assume 
> the requested clock rate?

Agreed this point, It needs to implement the clk_set_rate() in 
rockchip_sdhci.c. with value passed by set_ios().

> 
> The mmc drivers shouldn't use the max-frequency to request a clock rate. It 
> should only request the current clock rate or set a default clock rate 
> independent of the max-frequency.
> 
> Regards
>   Stefan
> 
> 
> 

_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to