[U-Boot] [PATCH 08/13] rockchip: mmc: support rk3066 mmc
Simon Glass
sjg at chromium.org
Thu Jun 8 03:30:02 UTC 2017
Hi Kever,
On 6 June 2017 at 21:23, Kever Yang <kever.yang at rock-chips.com> wrote:
> Simon,
>
>
>
> On 06/07/2017 05:10 AM, Simon Glass wrote:
>>
>> Hi Pawel,
>>
>> On 6 June 2017 at 12:51, Paweł Jarosz <paweljarosz3691 at gmail.com> wrote:
>>>
>>> rk3066 and rk3288 mmc designware ip's are very similiar. They differ in
>>> internal dma support and max driver frequency.
>>>
>>> Signed-off-by: Paweł Jarosz <paweljarosz3691 at gmail.com>
>>> ---
>>> drivers/mmc/rockchip_dw_mmc.c | 31 +++++++++++++++++++++++++++++--
>>> 1 file changed, 29 insertions(+), 2 deletions(-)
>>>
>>> diff --git a/drivers/mmc/rockchip_dw_mmc.c
>>> b/drivers/mmc/rockchip_dw_mmc.c
>>> index 25a21e2..d94c395 100644
>>> --- a/drivers/mmc/rockchip_dw_mmc.c
>>> +++ b/drivers/mmc/rockchip_dw_mmc.c
>>> @@ -22,8 +22,14 @@ DECLARE_GLOBAL_DATA_PTR;
>>>
>>> struct rockchip_mmc_plat {
>>> #if CONFIG_IS_ENABLED(OF_PLATDATA)
>>> +
>>> +#ifdef CONFIG_ROCKCHIP_RK3066
>>> + struct dtd_rockchip_rk2928_dw_mshc dtplat;
>>> +#else
>>> struct dtd_rockchip_rk3288_dw_mshc dtplat;
>>> #endif
>>> +
>>> +#endif
>>> struct mmc_config cfg;
>>> struct mmc mmc;
>>> };
>>> @@ -109,8 +115,11 @@ static int rockchip_dwmmc_probe(struct udevice *dev)
>>> int ret;
>>>
>>> #if CONFIG_IS_ENABLED(OF_PLATDATA)
>>> +#ifdef CONFIG_ROCKCHIP_RK3066
>>> + struct dtd_rockchip_rk2928_dw_mshc *dtplat = &plat->dtplat;
>>> +#else
>>> struct dtd_rockchip_rk3288_dw_mshc *dtplat = &plat->dtplat;
>>> -
>>> +#endif
>>
>> I am not keen on this - it will get ugly. Can you please do this:
>>
>> Create a new driver for rk3288 which just has the platdata stuff,
>> rockchip_dwmmc_ofdata_to_platdata() and the U_BOOT_DRIVER().
>> Everything else should remain in this file.
>>
>> Then in a new patch, create a driver for rk3066 which uses the same
>> common elements from rockchip_dw_mmc.c
>
>
> I think I have discuss this with you online or offline for many times,
> when OF_PLATADATA enabled, the dts is pre-compile by dtoc and then
> there is structure like 'dtd_rockchip_rk2928_dw_mshc' which is from the dts
> node compatible name, I propose to use the last compatible name in dtoc
> instead of the first one, then we can get the same structure name and used
> in drivers.
>
> I still not enable the dwmmc when OF_PLATDATA enabled on rk3399 because
> of the same reason.
>
> I think we should fix this from the root cause, but not make different
> driver
> for different SoCs.
OK, well if you think that will work it is fine with me. I will take a
look at the change.
Regards,
Simon
>
> Thanks,
> - Kever
>>
>>
>>> host->name = dev->name;
>>> host->ioaddr = map_sysmem(dtplat->reg[0], dtplat->reg[1]);
>>> host->buswidth = dtplat->bus_width;
>>> @@ -118,7 +127,12 @@ static int rockchip_dwmmc_probe(struct udevice *dev)
>>> host->priv = dev;
>>> host->dev_index = 0;
>>> priv->fifo_depth = dtplat->fifo_depth;
>>> +
>>> +#ifdef CONFIG_ROCKCHIP_RK3066
>>> + priv->fifo_mode = 1;
>>> +#else
>>> priv->fifo_mode = 0;
>>> +#endif
>>
>> What about the fifo_mode property in the DT?
>>
>> If you have to hard-code this you should use a .data parameter in
>> rockchip_dwmmc_ids (e.g. RK2928, RK3288) and use that to determine the
>> mode. But hopefully the DT is enough.
>>
>> For OF_PLATDATA however I suggest you have a different probe() which
>> either sets up this value and then calls rockchip_dwmmc_probe(), or
>> add it as a parameter to rockchip_dwmmc_probe().
>>
>>> memcpy(priv->minmax, dtplat->clock_freq_min_max,
>>> sizeof(priv->minmax));
>>>
>>> ret = clk_get_by_index_platdata(dev, 0, dtplat->clocks,
>>> &priv->clk);
>>> @@ -162,14 +176,27 @@ static int rockchip_dwmmc_bind(struct udevice *dev)
>>> }
>>>
>>> static const struct udevice_id rockchip_dwmmc_ids[] = {
>>> + { .compatible = "rockchip,rk2928-dw-mshc" },
>>> { .compatible = "rockchip,rk3288-dw-mshc" },
>>> { }
>>> };
>>>
>>> +U_BOOT_DRIVER(rockchip_rk2928_dw_mshc) = {
>>> + .name = "rockchip_rk2928_dw_mshc",
>>> + .id = UCLASS_MMC,
>>> + .of_match = rockchip_dwmmc_ids,
>>> + .ofdata_to_platdata = rockchip_dwmmc_ofdata_to_platdata,
>>> + .ops = &dm_dwmci_ops,
>>> + .bind = rockchip_dwmmc_bind,
>>> + .probe = rockchip_dwmmc_probe,
>>> + .priv_auto_alloc_size = sizeof(struct rockchip_dwmmc_priv),
>>> + .platdata_auto_alloc_size = sizeof(struct rockchip_mmc_plat),
>>> +};
>>> +
>>> U_BOOT_DRIVER(rockchip_dwmmc_drv) = {
>>> .name = "rockchip_rk3288_dw_mshc",
>>> .id = UCLASS_MMC,
>>> - .of_match = rockchip_dwmmc_ids,
>>
>> I think you ne
>>>
>>> .ofdata_to_platdata = rockchip_dwmmc_ofdata_to_platdata,
>>> .ops = &dm_dwmci_ops,
>>> .bind = rockchip_dwmmc_bind,
>>> --
>>> 2.7.4
>>>
>> Regards,
>> Simon
>> _______________________________________________
>> U-Boot mailing list
>> U-Boot at lists.denx.de
>> https://lists.denx.de/listinfo/u-boot
>
>
>
More information about the U-Boot
mailing list