Hi Simon,
sorry for late response i was offline a bit W dniu 13.07.2021 o 22:17, Simon Glass pisze: > Hi Paweł, > > On Tue, 13 Jul 2021 at 12:59, Paweł Jarosz <paweljarosz3...@gmail.com> wrote: >> Add clock driver for rk3066 platform. >> >> Signed-off-by: Paweł Jarosz <paweljarosz3...@gmail.com> >> Acked-by: Philipp Tomsich <philipp.toms...@vrull.eu> >> --- >> >> Changes since v1: >> - updated to shifted masks >> - moved clk init to tpl >> >> Changes since v2: >> - none >> >> Changes since v3: >> - none >> >> Changes since v4: >> - updated to current codebase >> - fixed compilation errors >> >> Changes since v5: >> - various style changes >> - added clk_enable/clk_disable support for nand and mmc clocks >> - updated maintainer email >> - renamed uint32_t to u32 >> - used #if IS_ENABLED macro instead #ifdef >> >> >> >> .../include/asm/arch-rockchip/cru_rk3066.h | 203 +++++ >> drivers/clk/rockchip/Makefile | 1 + >> drivers/clk/rockchip/clk_rk3066.c | 704 ++++++++++++++++++ >> 3 files changed, 908 insertions(+) >> create mode 100644 arch/arm/include/asm/arch-rockchip/cru_rk3066.h >> create mode 100644 drivers/clk/rockchip/clk_rk3066.c >> > [..] > >> + >> +static int rk3066_clk_of_to_plat(struct udevice *dev) >> +{ >> +#if !CONFIG_IS_ENABLED(OF_PLATDATA) >> + struct rk3066_clk_priv *priv = dev_get_priv(dev); >> + >> + priv->cru = dev_read_addr_ptr(dev); >> +#endif >> + >> + return 0; >> +} >> + >> +static int rk3066_clk_probe(struct udevice *dev) >> +{ >> + struct rk3066_clk_priv *priv = dev_get_priv(dev); >> + >> + priv->grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); >> + if (IS_ERR(priv->grf)) >> + return PTR_ERR(priv->grf); >> + >> +#if IS_ENABLED(CONFIG_TPL_BUILD) > Do you need that? The line below should take care of it. Yep. Later rkclk_init and rkclk_configure_cpu should be only executed in TPL. >> +#if CONFIG_IS_ENABLED(OF_PLATDATA) >> + struct rk3066_clk_plat *plat = dev_get_plat(dev); >> + >> + priv->cru = map_sysmem(plat->dtd.reg[0], plat->dtd.reg[1]); >> +#endif >> + >> + rkclk_init(priv->cru, priv->grf); >> + >> + /* Init CPU frequency */ >> + rkclk_configure_cpu(priv->cru, priv->grf, APLL_SAFE_HZ); >> +#endif >> + >> + return 0; >> +} >> + >> +static int rk3066_clk_bind(struct udevice *dev) >> +{ >> + int ret; >> + struct udevice *sys_child; >> + struct sysreset_reg *priv; >> + >> + /* The reset driver does not have a device node, so bind it here */ >> + ret = device_bind_driver(dev, "rockchip_sysreset", "sysreset", >> + &sys_child); >> + if (ret) { >> + debug("Warning: No sysreset driver: ret=%d\n", ret); >> + } else { >> + priv = malloc(sizeof(struct sysreset_reg)); >> + priv->glb_srst_fst_value = offsetof(struct rk3066_cru, >> + cru_glb_srst_fst_value); >> + priv->glb_srst_snd_value = offsetof(struct rk3066_cru, >> + cru_glb_srst_snd_value); >> + dev_set_priv(sys_child, priv); >> + } >> + >> +#if CONFIG_IS_ENABLED(RESET_ROCKCHIP) > Can you use if() instead of #if ? Yes, but what is the difference? Sorry ... I don't know what to ask google to get the answer. Is it in this case doing the same thing and just looking better? Regards, Paweł Jarosz >> + ret = offsetof(struct rk3066_cru, cru_softrst_con[0]); >> + ret = rockchip_reset_bind(dev, ret, 9); >> + if (ret) >> + debug("Warning: software reset driver bind failed\n"); >> +#endif >> + >> + return 0; >> +} >> + >> +static const struct udevice_id rk3066_clk_ids[] = { >> + { .compatible = "rockchip,rk3066a-cru" }, >> + { } >> +}; >> + >> +U_BOOT_DRIVER(rockchip_rk3066a_cru) = { >> + .name = "rockchip_rk3066a_cru", >> + .id = UCLASS_CLK, >> + .of_match = rk3066_clk_ids, >> + .priv_auto = sizeof(struct rk3066_clk_priv), >> + .plat_auto = sizeof(struct rk3066_clk_plat), >> + .ops = &rk3066_clk_ops, >> + .bind = rk3066_clk_bind, >> + .of_to_plat = rk3066_clk_of_to_plat, >> + .probe = rk3066_clk_probe, >> +}; >> -- >> 2.32.0 >> > Regards, > Simon