[PATCH 13/20] clk: rockchip: Add rk3576 clk support

Jonas Karlman jonas at kwiboo.se
Fri Jan 31 00:18:32 CET 2025


Hi Heiko,

On 2024-11-21 15:27, Heiko Stuebner wrote:
> From: Elaine Zhang <zhangqing at rock-chips.com>
> 
> Add clock driver support for Rockchip RK3576 SoC.
> 
> Signed-off-by: Elaine Zhang <zhangqing at rock-chips.com>
> [adapted to mainline u-boot]
> Signed-off-by: Heiko Stuebner <heiko at sntech.de>
> ---
>  .../include/asm/arch-rockchip/cru_rk3576.h    |  486 ++++
>  drivers/clk/rockchip/Makefile                 |    1 +
>  drivers/clk/rockchip/clk_rk3576.c             | 2517 +++++++++++++++++
>  3 files changed, 3004 insertions(+)
>  create mode 100644 arch/arm/include/asm/arch-rockchip/cru_rk3576.h
>  create mode 100644 drivers/clk/rockchip/clk_rk3576.c
> 
> diff --git a/arch/arm/include/asm/arch-rockchip/cru_rk3576.h b/arch/arm/include/asm/arch-rockchip/cru_rk3576.h
> new file mode 100644
> index 00000000000..893d92ff5f7
> --- /dev/null
> +++ b/arch/arm/include/asm/arch-rockchip/cru_rk3576.h
> @@ -0,0 +1,486 @@
> +/* SPDX-License-Identifier: GPL-2.0 */
> +/*
> + * Copyright (c) 2020 Rockchip Electronics Co. Ltd.
> + * Author: Elaine Zhang <zhangqing at rock-chips.com>
> + */
> +
> +#ifndef _ASM_ARCH_CRU_RK3576_H
> +#define _ASM_ARCH_CRU_RK3576_H
> +
> +#define MHz		1000000
> +#define KHz		1000
> +#define OSC_HZ		(24 * MHz)
> +
> +#define CPU_PVTPLL_HZ	(1008 * MHz)
> +#define LPLL_HZ		(816 * MHz)
> +#define GPLL_HZ		(1188 * MHz)
> +#define CPLL_HZ		(1000 * MHz)
> +#define PPLL_HZ		(1100 * MHz)
> +#define GMAC0_PTP_REFCLK_IN	(24 * MHz)
> +#define GMAC1_PTP_REFCLK_IN	(24 * MHz)
> +
> +/* RK3576 pll id */
> +enum rk3576_pll_id {
> +	BPLL,
> +	LPLL,
> +	DPLL,
> +	CPLL,
> +	GPLL,
> +	VPLL,
> +	AUPLL,
> +	SPLL,
> +	PPLL,
> +	PLL_COUNT,
> +};
> +
> +struct rk3576_clk_info {
> +	unsigned long id;
> +	char *name;
> +	bool is_cru;
> +};

rk3576_clk_info is not used for anything and can be dropped.

> +
> +struct rk3576_clk_priv {
> +	struct rk3576_cru *cru;
> +	struct rk3576_grf *grf;

This grf member is not used for anything in the clk driver and can be
dropped.

> +	ulong ppll_hz;
> +	ulong gpll_hz;
> +	ulong cpll_hz;
> +	ulong vpll_hz;
> +	ulong aupll_hz;
> +	ulong spll_hz;
> +	ulong lpll_hz;
> +	ulong bpll_hz;
> +	ulong armclk_hz;
> +	ulong armclk_enter_hz;
> +	ulong armclk_init_hz;
> +	bool sync_kernel;
> +	bool set_armclk_rate;
> +};
> +

[snip]

> diff --git a/drivers/clk/rockchip/Makefile b/drivers/clk/rockchip/Makefile
> index 9e379cc2e3b..855bf318de7 100644
> --- a/drivers/clk/rockchip/Makefile
> +++ b/drivers/clk/rockchip/Makefile
> @@ -16,6 +16,7 @@ obj-$(CONFIG_ROCKCHIP_RK3328) += clk_rk3328.o
>  obj-$(CONFIG_ROCKCHIP_RK3368) += clk_rk3368.o
>  obj-$(CONFIG_ROCKCHIP_RK3399) += clk_rk3399.o
>  obj-$(CONFIG_ROCKCHIP_RK3568) += clk_rk3568.o
> +obj-$(CONFIG_ROCKCHIP_RK3576) += clk_rk3576.o
>  obj-$(CONFIG_ROCKCHIP_RK3588) += clk_rk3588.o
>  obj-$(CONFIG_ROCKCHIP_RV1108) += clk_rv1108.o
>  obj-$(CONFIG_ROCKCHIP_RV1126) += clk_rv1126.o
> diff --git a/drivers/clk/rockchip/clk_rk3576.c b/drivers/clk/rockchip/clk_rk3576.c
> new file mode 100644
> index 00000000000..c11dd594a72
> --- /dev/null
> +++ b/drivers/clk/rockchip/clk_rk3576.c
> @@ -0,0 +1,2517 @@
> +// SPDX-License-Identifier: GPL-2.0
> +/*
> + * Copyright (c) 2021 Fuzhou Rockchip Electronics Co., Ltd
> + * Author: Elaine Zhang <zhangqing at rock-chips.com>
> + */
> +

[snip]

> +
> +static int rk3576_clk_probe(struct udevice *dev)
> +{
> +	struct rk3576_clk_priv *priv = dev_get_priv(dev);
> +	int ret;
> +
> +	priv->sync_kernel = false;
> +
> +#ifdef CONFIG_SPL_BUILD
> +	/* relase presetn_bigcore_biu/cru/grf */
> +	writel(0x1c001c00, 0x26010010);
> +	/* set spll to normal mode */
> +	writel(BITS_WITH_WMASK(2, 0x7U, 6),
> +	       RK3576_SCRU_BASE + RK3576_PLL_CON(137));
> +	writel(BITS_WITH_WMASK(1, 0x3U, 0),
> +	       RK3576_SCRU_BASE + RK3576_MODE_CON0);
> +	/* fix ppll\aupll\cpll */
> +	writel(BITS_WITH_WMASK(2, 0x7U, 6),
> +	       RK3576_CRU_BASE + RK3576_PMU_PLL_CON(129));
> +	writel(BITS_WITH_WMASK(2, 0x7U, 6),
> +	       RK3576_CRU_BASE + RK3576_PLL_CON(97));
> +	writel(BITS_WITH_WMASK(2, 0x7U, 6),
> +	       RK3576_CRU_BASE + RK3576_PLL_CON(105));
> +	writel(BITS_WITH_WMASK(1, 0x3U, 6),
> +	       RK3576_CRU_BASE + RK3576_MODE_CON0);
> +	writel(BITS_WITH_WMASK(1, 0x3U, 8),
> +	       RK3576_CRU_BASE + RK3576_MODE_CON0);
> +	/* init cci */
> +	writel(0xffff0000, RK3576_CRU_BASE + RK3576_CCI_CLKSEL_CON(4));
> +	rockchip_pll_set_rate(&rk3576_pll_clks[BPLL], priv->cru,
> +			      BPLL, LPLL_HZ);
> +	if (!priv->armclk_enter_hz) {
> +		ret = rockchip_pll_set_rate(&rk3576_pll_clks[LPLL], priv->cru,
> +					    LPLL, LPLL_HZ);
> +		priv->armclk_enter_hz =
> +			rockchip_pll_get_rate(&rk3576_pll_clks[LPLL],
> +					      priv->cru, LPLL);
> +		priv->armclk_init_hz = priv->armclk_enter_hz;
> +		rk_clrsetreg(&priv->cru->litclksel_con[0], CLK_LITCORE_DIV_MASK,
> +			     0 << CLK_LITCORE_DIV_SHIFT);
> +	}
> +	/* init cci */
> +	writel(0xffff20cb, RK3576_CRU_BASE + RK3576_CCI_CLKSEL_CON(4));
> +
> +	/* Change bigcore rm from 4 to 3 */
> +	writel(0x001c000c, RK3576_BIGCORE_GRF_BASE + 0x3c);
> +	writel(0x001c000c, RK3576_BIGCORE_GRF_BASE + 0x44);
> +	writel(0x00020002, RK3576_BIGCORE_GRF_BASE + 0x38);
> +	udelay(1);
> +	writel(0x00020000, RK3576_BIGCORE_GRF_BASE + 0x38);
> +	/* Change litcore rm from 4 to 3 */
> +	writel(0x001c000c, RK3576_LITCORE_GRF_BASE + 0x3c);
> +	writel(0x001c000c, RK3576_LITCORE_GRF_BASE + 0x44);
> +	writel(0x00020002, RK3576_LITCORE_GRF_BASE + 0x38);
> +	udelay(1);
> +	writel(0x00020000, RK3576_LITCORE_GRF_BASE + 0x38);
> +	/* Change cci rm form 4 to 3 */
> +	writel(0x001c000c, RK3576_CCI_GRF_BASE + 0x54);
> +#endif
> +
> +	priv->grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
> +	if (IS_ERR(priv->grf))
> +		return PTR_ERR(priv->grf);

This driver is not using grf, so this can be dropped and should also
save a few ms of boot time.

Regards,
Jonas

> +
> +	rk3576_clk_init(priv);
> +
> +	/* Process 'assigned-{clocks/clock-parents/clock-rates}' properties */
> +	ret = clk_set_defaults(dev, 1);
> +	if (ret)
> +		debug("%s clk_set_defaults failed %d\n", __func__, ret);
> +	else
> +		priv->sync_kernel = true;
> +
> +	return 0;
> +}

[snip]


More information about the U-Boot mailing list