[PATCH] mmc: sdhci-of-arasan: Properly set corecfg_clockmultipler on rk3399
Shawn Lin
shawn.lin at rock-chips.com
Fri Aug 26 01:36:14 PDT 2016
在 2016/8/26 16:31, Heiko Stübner 写道:
> Am Freitag, 26. August 2016, 15:50:57 schrieb Shawn Lin:
>> + Heiko
>>
>> 在 2016/8/26 14:38, Ziyuan Xu 写道:
>>> Hi Shawn,
>>>
>>> On 2016年08月26日 11:22, Shawn Lin wrote:
>>>> corecfg_clockmultipler indicates clock multiplier value of
>>>> programmable clock generator which should be the same value
>>>> of SDHCI_CAPABILITIES_1. The default value of the register,
>>>> corecfg_clockmultipler, is 0x10. But actually it is a mistake
>>>
>>> corecfg_clockmultipler==>corecfg_clockmultiplier
>>>
>>>> by designer as our intention was to set it to be zero which
>>>> means we don't support programmable clock generator. So we have
>>>> to made it to be zero on bootloader which seems work fine until
>>>
>>> made==>make
>>>
>>>> now. But now we find a issue that when deploying genpd support
>>>
>>> a issue==>an issue
>>>
>>>> for it, the remove callback will trigger the genpd to poweroff the
>>>> power domain for sdhci-of-arasan which magage the controller, phy
>>>
>>> magage==>manage
>>>
>>>> and corecfg_* stuff.
>>>>
>>>> So when we do bind/unbind the driver, we have already reinit
>>>
>>> do==>doing
>>>
>>>> the controller and phy, but without doing that for corecfg_*.
>>>> Regarding to only the corecfg_clockmultipler is wrong, let's
>>>> fix it by explicitly marking it to be zero when probing. With
>>>> this change, we could do bind/unbind successfully.
>>>>
>>>> Reported-by: Ziyuan Xu <xzy.xu at rock-chips.com>
>>>> Cc: Douglas Anderson <dianders at chromium.org>
>>>> Signed-off-by: Shawn Lin <shawn.lin at rock-chips.com>
>>>> ---
>>>>
>>>> drivers/mmc/host/sdhci-of-arasan.c | 9 +++++++++
>>>> 1 file changed, 9 insertions(+)
>>>>
>>>> diff --git a/drivers/mmc/host/sdhci-of-arasan.c
>>>> b/drivers/mmc/host/sdhci-of-arasan.c
>>>> index 0b3a9cf..c1eb263 100644
>>>> --- a/drivers/mmc/host/sdhci-of-arasan.c
>>>> +++ b/drivers/mmc/host/sdhci-of-arasan.c
>>>> @@ -67,10 +67,12 @@ struct sdhci_arasan_soc_ctl_field {
>>>>
>>>> * accessible via the syscon API.
>>>> *
>>>> * @baseclkfreq: Where to find corecfg_baseclkfreq
>>>>
>>>> + * @clockmultiplier: Where to find corecfg_clockmultiplier
>>>>
>>>> * @hiword_update: If true, use HIWORD_UPDATE to access the syscon
>>>> */
>>>>
>>>> struct sdhci_arasan_soc_ctl_map {
>>>>
>>>> struct sdhci_arasan_soc_ctl_field baseclkfreq;
>>>>
>>>> + struct sdhci_arasan_soc_ctl_field clockmultiplier;
>>>>
>>>> bool hiword_update;
>>>>
>>>> };
>>>> @@ -100,6 +102,7 @@ struct sdhci_arasan_data {
>>>>
>>>> static const struct sdhci_arasan_soc_ctl_map rk3399_soc_ctl_map = {
>>>>
>>>> .baseclkfreq = { .reg = 0xf000, .width = 8, .shift = 8 },
>>>>
>>>> + .clockmultiplier = { .reg = 0xf02c, .width = 8, .shit = 0},
>>>>
>>>> .hiword_update = true,
>>>>
>>>> };
>>>> @@ -528,6 +531,12 @@ static int sdhci_arasan_probe(struct
>>>>
>>>> platform_device *pdev)
>>>>
>>>> ret);
>>>>
>>>> goto err_pltfm_free;
>>>>
>>>> }
>>>>
>>>> +
>>>> + if (of_device_is_compatible(pdev->dev.of_node,
>>>> + "rockchip,rk3399-sdhci-5.1"))
>>>> + sdhci_arasan_syscon_write(host,
>>>> + &soc_ctl_map->clockmultiplier,
>>>> + 0);
>>>
>>> Variable soc_ctl_map is undefined in sdhci_arasan_probe(), please fix it.
>>
>> Woops, I change the code a bit after generating patch, I will fix it.
>>
>>> Moreover, we can not access grf_emmccore/grf_emmcphy prior to enable
>>> clk_ahb, so do it after clock enable.
>>
>> Hrmm, we configure the grf vai CPU and the clock for accessing
>> grf is aclk_emmc_grf( I saw aclk_emmc_noc is critical and it seems we
>> should treat aclk_emmc_* the same way).
>
> No :-)
>
> The aclk_emmc_grf is (similar to aclk_vio_grf etc) part of the emmc block.
>
> The noc clocks (as far as I understand) are the interconnect clocks that
> supply the link between interconnect and peripheral, so are part of the
> interconnect block.
>
> We don't model the interconnect on any rockchip soc right now, so the noc
> clocks are rightfully marked critical, but we of course do model the emmc
> block, so it should handle its grf clock, similar to how the drm driver is
> (planning to) doing it right now.
Thanks for these details. Seems we should plan to handle this inside the
sdhci-of-arasan for rockchip soc.
>
>
> Heiko
>
>
>
--
Best Regards
Shawn Lin
More information about the Linux-rockchip
mailing list