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.
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.
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?
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