[PATCH v4 09/12] rockchip: mmc: rockchip_dw_mmc: add rk3066/rk3188 support
Kever Yang
kever.yang at rock-chips.com
Sat Apr 9 07:04:46 CEST 2022
On 2022/4/6 23:29, Johan Jonker wrote:
> Hi,
>
> On 4/6/22 16:50, Kever Yang wrote:
>> Hi Johan,
>>
>> On 2022/4/4 07:06, Johan Jonker wrote:
>>> The Rockchip SoCs rk3066/rk3188 have mmc DT nodes
>>> with as compatible string "rockchip,rk2928-dw-mshc".
>>> Add support to the existing driver with help of
>>> a DM_DRIVER_ALIAS.
>>>
>>> This type needs a permanent enabled fifo.
>>> The other Rockchip SoCs not always have the property
>>> "fifo-mode" in the TPL/SPL DT nodes, so dtplat structures
>>> can't be used to switch it on.
>> There is an option "u-boot,spl-fifo-mode", which already used for many
>> SoCs,
>>
>> could you try with it?
> Rk3066 SPL makes use of dt-plat.c to describe the DT, because of memory
> size and it's BOOTROM doesn't have build-in SD card support like the
> later models.
>
> u-boot-tpl.bin : 25,112 bytes
> u-boot-spl.bin : 39,280 bytes
> u-boot-dtb.img : 328,678 bytes
>
>
> Example rockchip_dwmmc_probe function:
>
> old:
> priv->fifo_mode = 0;
>
> vs.
>
> new:
> priv->fifo_mode = dtplat->u_boot_spl_fifo_mode
>
>
> The use of u_boot_spl_fifo_mode in C code would make it a requirement
> for other SoC types to include it in "static struct
> dtd_rockchip_rk3288_dw_mshc" as well:
>
> .u_boot_spl_fifo_mode = false,
Yes, extend the dt-plat with new fifo mode support will be OK.
BTW: rk3288 can also use fifo-mode in SPL in dt-plat mode, so you can
re-use this structure
and no need to add a new one.
Thanks,
- Kever
>
> Please advise how to get progress here as.
>
> Kind regards,
>
> Johan
>
> ===
>
> static struct dtd_rockchip_rk3288_dw_mshc dtv_mmc_at_10214000 = {
> .bus_width = 0x4,
> .cap_mmc_highspeed = true,
> .cap_sd_highspeed = true,
> .clock_frequency = 0x2faf080,
> .clocks = {
> {0, {448}},
> {0, {72}},},
> .dma_names = "rx-tx",
> .dmas = {0xa, 0x1},
> .fifo_depth = 0x100,
> .fifo_mode = true,
> .max_frequency = 0x3d0900,
> .reg = {0x10214000, 0x1000},
> .reset_names = "reset",
> .resets = {0x2, 0x51},
>
> .u_boot_spl_fifo_mode = true,
>
> .vmmc_supply = 0xf,
> };
> U_BOOT_DRVINFO(mmc_at_10214000) = {
> .name = "rockchip_rk3288_dw_mshc",
> .plat = &dtv_mmc_at_10214000,
> .plat_size = sizeof(dtv_mmc_at_10214000),
> .parent_idx = -1,
> };
>
>
>>
>> Thanks,
>>
>> - Kever
>>
>>> Add a data structure linked to the compatible string
>>> to enable.
>>>
>>> Signed-off-by: Johan Jonker <jbx6244 at gmail.com>
>>> ---
>>>
>>> Changed V4:
>>> use boolean
>>> ---
>>> drivers/mmc/rockchip_dw_mmc.c | 16 +++++++++++++---
>>> 1 file changed, 13 insertions(+), 3 deletions(-)
>>>
>>> diff --git a/drivers/mmc/rockchip_dw_mmc.c
>>> b/drivers/mmc/rockchip_dw_mmc.c
>>> index be065ec0c3..45488dd7bd 100644
>>> --- a/drivers/mmc/rockchip_dw_mmc.c
>>> +++ b/drivers/mmc/rockchip_dw_mmc.c
>>> @@ -19,6 +19,11 @@
>>> #include <linux/delay.h>
>>> #include <linux/err.h>
>>> +enum rockchip_dwmmc_type {
>>> + RK2928_MSHC,
>>> + RK3288_MSHC,
>>> +};
>>> +
>>> struct rockchip_mmc_plat {
>>> #if CONFIG_IS_ENABLED(OF_PLATDATA)
>>> struct dtd_rockchip_rk3288_dw_mshc dtplat;
>>> @@ -111,6 +116,7 @@ static int rockchip_dwmmc_probe(struct udevice *dev)
>>> #if CONFIG_IS_ENABLED(OF_PLATDATA)
>>> struct dtd_rockchip_rk3288_dw_mshc *dtplat = &plat->dtplat;
>>> + enum rockchip_dwmmc_type type = dev_get_driver_data(dev);
>>> host->name = dev->name;
>>> host->ioaddr = map_sysmem(dtplat->reg[0], dtplat->reg[1]);
>>> @@ -119,7 +125,10 @@ static int rockchip_dwmmc_probe(struct udevice *dev)
>>> host->priv = dev;
>>> host->dev_index = 0;
>>> priv->fifo_depth = dtplat->fifo_depth;
>>> - priv->fifo_mode = 0;
>>> + if (type == RK2928_MSHC)
>>> + priv->fifo_mode = true;
>>> + else
>>> + priv->fifo_mode = false;
>>> priv->minmax[0] = 400000; /* 400 kHz */
>>> priv->minmax[1] = dtplat->max_frequency;
>>> @@ -163,8 +172,8 @@ 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" },
>>> + { .compatible = "rockchip,rk2928-dw-mshc", .data = RK2928_MSHC },
>>> + { .compatible = "rockchip,rk3288-dw-mshc", .data = RK3288_MSHC },
>>> { }
>>> };
>>> @@ -180,5 +189,6 @@ U_BOOT_DRIVER(rockchip_rk3288_dw_mshc) = {
>>> .plat_auto = sizeof(struct rockchip_mmc_plat),
>>> };
>>> +DM_DRIVER_ALIAS(rockchip_rk3288_dw_mshc, rockchip_rk2928_dw_mshc)
>>> DM_DRIVER_ALIAS(rockchip_rk3288_dw_mshc, rockchip_rk3328_dw_mshc)
>>> DM_DRIVER_ALIAS(rockchip_rk3288_dw_mshc, rockchip_rk3368_dw_mshc)
More information about the U-Boot
mailing list