[PATCH v2] clk: rockchip: rk3588: Set SPLL frequency during SPL stage
Kever Yang
kever.yang at rock-chips.com
Thu May 23 05:45:15 CEST 2024
On 2024/5/23 01:31, Heiko Stuebner wrote:
> From: Heiko Stuebner <heiko.stuebner at cherry.de>
>
> All parts expect the SPLL to run at 702MHz. In U-Boot it's the SPLL_HZ
> declaring this rate and in the kernel it's a fixed clock definition.
>
> While everything is expecting 702MHz, the SPLL is not running that
> frequency when coming from the bootrom though, instead it's running
> at 351MHz and the vendor-u-boot just sets it to the expected frequency.
>
> The SPLL itself is located inside the secure-BUSCRU and in theory
> accessible as an SCMI clock, though this requires an unknown amount
> of cooperation from trusted-firmware to set at a later stage, though
> during the SPL stage we can still access the relevant CRU directly.
>
> The SPLL is for example necessary for the DSI controllers to produce
> output.
>
> As the SPLL is "just" another rk3588 pll, just set the desired rate
> directly during the SPL stage.
>
> Tested on rk3588-rock5b and rk3588-tiger by reading back the PLL rate
> and also observing working DSI output with this change.
>
> Fixes: 6737771600d4 ("rockchip: rk3588: Add support for sdmmc clocks in SPL")
> Suggested-by: Andy Yan <andy.yan at rock-chips.com>
> Signed-off-by: Heiko Stuebner <heiko.stuebner at cherry.de>
> Cc: Jonas Karlman <jonas at kwiboo.se>
> Cc: Quentin Schulz <quentin.schulz at cherry.de>
Reviewed-by: Kever Yang <kever.yang at rock-chips.com>
Thanks,
- Kever
> ---
> changes in v2:
> - use correct name for SBUSCRU
> - use dedicated constants for SBUSCRU registers
> - add comment to make it explicit that the SPLL is in a different CRU
>
> .../include/asm/arch-rockchip/cru_rk3588.h | 4 +++
> drivers/clk/rockchip/clk_rk3588.c | 30 +++++++++++++++++--
> 2 files changed, 31 insertions(+), 3 deletions(-)
>
> diff --git a/arch/arm/include/asm/arch-rockchip/cru_rk3588.h b/arch/arm/include/asm/arch-rockchip/cru_rk3588.h
> index a4507e5fdd7..a0e54d39654 100644
> --- a/arch/arm/include/asm/arch-rockchip/cru_rk3588.h
> +++ b/arch/arm/include/asm/arch-rockchip/cru_rk3588.h
> @@ -29,6 +29,7 @@ enum rk3588_pll_id {
> V0PLL,
> AUPLL,
> PPLL,
> + SPLL,
> PLL_COUNT,
> };
>
> @@ -150,6 +151,9 @@ struct pll_rate_table {
> #define RK3588_DSU_CLKGATE_CON(x) ((x) * 0x4 + RK3588_DSU_CRU_BASE + 0x800)
> #define RK3588_DSU_SOFTRST_CON(x) ((x) * 0x4 + RK3588_DSU_CRU_BASE + 0xa00)
>
> +#define RK3588_SBUSCRU_SPLL_CON(x) ((x) * 0x4 + 0x220)
> +#define RK3588_SBUSCRU_MODE_CON0 0x280
> +
> enum {
> /* CRU_CLK_SEL8_CON */
> ACLK_LOW_TOP_ROOT_SRC_SEL_SHIFT = 14,
> diff --git a/drivers/clk/rockchip/clk_rk3588.c b/drivers/clk/rockchip/clk_rk3588.c
> index 4c611a39049..c41c9be6aa3 100644
> --- a/drivers/clk/rockchip/clk_rk3588.c
> +++ b/drivers/clk/rockchip/clk_rk3588.c
> @@ -37,6 +37,7 @@ static struct rockchip_pll_rate_table rk3588_pll_rates[] = {
> RK3588_PLL_RATE(786000000, 1, 131, 2, 0),
> RK3588_PLL_RATE(742500000, 4, 495, 2, 0),
> RK3588_PLL_RATE(722534400, 8, 963, 2, 24850),
> + RK3588_PLL_RATE(702000000, 3, 351, 2, 0),
> RK3588_PLL_RATE(600000000, 2, 200, 2, 0),
> RK3588_PLL_RATE(594000000, 2, 198, 2, 0),
> RK3588_PLL_RATE(200000000, 3, 400, 4, 0),
> @@ -65,6 +66,15 @@ static struct rockchip_pll_clock rk3588_pll_clks[] = {
> RK3588_MODE_CON0, 0, 15, 0, rk3588_pll_rates),
> [PPLL] = PLL(pll_rk3588, PLL_PPLL, RK3588_PMU_PLL_CON(128),
> RK3588_MODE_CON0, 10, 15, 0, rk3588_pll_rates),
> +#ifdef CONFIG_SPL_BUILD
> + /*
> + * The SPLL is part of the SBUSCRU, not the main CRU and as
> + * such only directly accessible during the SPL stage.
> + */
> + [SPLL] = PLL(pll_rk3588, 0, RK3588_SBUSCRU_SPLL_CON(0),
> + RK3588_SBUSCRU_MODE_CON0, 0, 15, 0, rk3588_pll_rates),
> +#endif
> +
> };
>
> #ifndef CONFIG_SPL_BUILD
> @@ -2044,6 +2054,7 @@ U_BOOT_DRIVER(rockchip_rk3588_cru) = {
>
> #ifdef CONFIG_SPL_BUILD
> #define SCRU_BASE 0xfd7d0000
> +#define SBUSCRU_BASE 0xfd7d8000
>
> static ulong rk3588_scru_clk_get_rate(struct clk *clk)
> {
> @@ -2118,15 +2129,28 @@ static ulong rk3588_scru_clk_set_rate(struct clk *clk, ulong rate)
> return rk3588_scru_clk_get_rate(clk);
> }
>
> +static int rk3588_scru_clk_probe(struct udevice *dev)
> +{
> + int ret;
> +
> + ret = rockchip_pll_set_rate(&rk3588_pll_clks[SPLL],
> + (void *)SBUSCRU_BASE, SPLL, SPLL_HZ);
> + if (ret)
> + debug("%s setting spll rate failed %d\n", __func__, ret);
> +
> + return 0;
> +}
> +
> static const struct clk_ops rk3588_scru_clk_ops = {
> .get_rate = rk3588_scru_clk_get_rate,
> .set_rate = rk3588_scru_clk_set_rate,
> };
>
> U_BOOT_DRIVER(rockchip_rk3588_scru) = {
> - .name = "rockchip_rk3588_scru",
> - .id = UCLASS_CLK,
> - .ops = &rk3588_scru_clk_ops,
> + .name = "rockchip_rk3588_scru",
> + .id = UCLASS_CLK,
> + .ops = &rk3588_scru_clk_ops,
> + .probe = rk3588_scru_clk_probe,
> };
>
> static int rk3588_scmi_spl_glue_bind(struct udevice *dev)
More information about the U-Boot
mailing list