[PATCH 5/6] clk: rockchip: rk3506: Use FIELD_PREP_WM16 macro
Jonas Karlman <[email protected]> Mon, 3 Aug 2026 19:09:43 +0000
| Newsgroups | gmane.comp.boot-loaders.u-boot |
|---|---|
| Message-ID | <[email protected]> |
Change to use writel() together with the FIELD_PREP_WM16() macro instead of using the rk_clrsetreg() macro to avoid having to define the mask as a parameter to both rk_clrsetreg() and FIELD_PREP(). Also change to use u32 variables consistently. No change in behavior is expected due to this code style change. Signed-off-by: Jonas Karlman <[email protected]> --- drivers/clk/rockchip/clk_rk3506.c | 195 ++++++++++++++---------------- 1 file changed, 90 insertions(+), 105 deletions(-) diff --git a/drivers/clk/rockchip/clk_rk3506.c b/drivers/clk/rockchip/clk_rk3506.c index e156bf19a6b4..7ccab313e6ec 100644 --- a/drivers/clk/rockchip/clk_rk3506.c +++ b/drivers/clk/rockchip/clk_rk3506.c @@ -9,10 +9,11 @@ #include <clk-uclass.h> #include <asm/arch-rockchip/clock.h> #include <asm/arch-rockchip/cru_rk3506.h> -#include <asm/arch-rockchip/hardware.h> +#include <asm/io.h> #include <dm/device-internal.h> #include <dm/lists.h> #include <dt-bindings/clock/rockchip,rk3506-cru.h> +#include <linux/hw_bitfield.h> #define DIV_TO_RATE(input_rate, div) ((input_rate) / ((div) + 1)) @@ -122,10 +123,10 @@ static int rk3506_armclk_set_rate(struct rk3506_clk_priv *priv, ulong new_rate) */ old_rate = rk3506_armclk_get_rate(priv); if (new_rate >= old_rate) { - rk_clrsetreg(RK3506_CLKSEL_CON(15), ACLK_CORE_DIV_MASK, - FIELD_PREP(ACLK_CORE_DIV_MASK, rate->aclk_div)); - rk_clrsetreg(RK3506_CLKSEL_CON(16), PCLK_CORE_DIV_MASK, - FIELD_PREP(PCLK_CORE_DIV_MASK, rate->pclk_div)); + writel(FIELD_PREP_WM16(ACLK_CORE_DIV_MASK, rate->aclk_div), + RK3506_CLKSEL_CON(15)); + writel(FIELD_PREP_WM16(PCLK_CORE_DIV_MASK, rate->pclk_div), + RK3506_CLKSEL_CON(16)); } if (new_rate == 589824000 || new_rate == 1179648000) { @@ -146,22 +147,22 @@ static int rk3506_armclk_set_rate(struct rk3506_clk_priv *priv, ulong new_rate) con = readl(RK3506_CLKSEL_CON(15)); old_div = FIELD_GET(CLK_CORE_SRC_DIV_MASK, con); if (DIV_TO_RATE(prate, old_div) > new_rate) { - rk_clrsetreg(RK3506_CLKSEL_CON(15), CLK_CORE_SRC_DIV_MASK, - FIELD_PREP(CLK_CORE_SRC_DIV_MASK, div - 1)); - rk_clrsetreg(RK3506_CLKSEL_CON(15), CLK_CORE_SRC_SEL_MASK, - FIELD_PREP(CLK_CORE_SRC_SEL_MASK, sel)); + writel(FIELD_PREP_WM16(CLK_CORE_SRC_DIV_MASK, div - 1), + RK3506_CLKSEL_CON(15)); + writel(FIELD_PREP_WM16(CLK_CORE_SRC_SEL_MASK, sel), + RK3506_CLKSEL_CON(15)); } else { - rk_clrsetreg(RK3506_CLKSEL_CON(15), CLK_CORE_SRC_SEL_MASK, - FIELD_PREP(CLK_CORE_SRC_SEL_MASK, sel)); - rk_clrsetreg(RK3506_CLKSEL_CON(15), CLK_CORE_SRC_DIV_MASK, - FIELD_PREP(CLK_CORE_SRC_DIV_MASK, div - 1)); + writel(FIELD_PREP_WM16(CLK_CORE_SRC_SEL_MASK, sel), + RK3506_CLKSEL_CON(15)); + writel(FIELD_PREP_WM16(CLK_CORE_SRC_DIV_MASK, div - 1), + RK3506_CLKSEL_CON(15)); } if (new_rate < old_rate) { - rk_clrsetreg(RK3506_CLKSEL_CON(15), ACLK_CORE_DIV_MASK, - FIELD_PREP(ACLK_CORE_DIV_MASK, rate->aclk_div)); - rk_clrsetreg(RK3506_CLKSEL_CON(16), PCLK_CORE_DIV_MASK, - FIELD_PREP(PCLK_CORE_DIV_MASK, rate->pclk_div)); + writel(FIELD_PREP_WM16(ACLK_CORE_DIV_MASK, rate->aclk_div), + RK3506_CLKSEL_CON(15)); + writel(FIELD_PREP_WM16(PCLK_CORE_DIV_MASK, rate->pclk_div), + RK3506_CLKSEL_CON(16)); } return rk3506_armclk_get_rate(priv); @@ -209,26 +210,26 @@ static ulong rk3506_pll_div_set_rate(struct rk3506_clk_priv *priv, ulong clk_id, case CLK_GPLL_DIV: div = DIV_ROUND_UP(priv->gpll_hz, rate); assert(div - 1 <= 15); - rk_clrsetreg(RK3506_CLKSEL_CON(0), CLK_GPLL_DIV_MASK, - FIELD_PREP(CLK_GPLL_DIV_MASK, div - 1)); + writel(FIELD_PREP_WM16(CLK_GPLL_DIV_MASK, div - 1), + RK3506_CLKSEL_CON(0)); break; case CLK_GPLL_DIV_100M: div = DIV_ROUND_UP(priv->gpll_div_hz, rate); assert(div - 1 <= 15); - rk_clrsetreg(RK3506_CLKSEL_CON(0), CLK_GPLL_DIV_100M_MASK, - FIELD_PREP(CLK_GPLL_DIV_100M_MASK, div - 1)); + writel(FIELD_PREP_WM16(CLK_GPLL_DIV_100M_MASK, div - 1), + RK3506_CLKSEL_CON(0)); break; case CLK_V0PLL_DIV: div = DIV_ROUND_UP(priv->v0pll_hz, rate); assert(div - 1 <= 15); - rk_clrsetreg(RK3506_CLKSEL_CON(1), CLK_V0PLL_DIV_MASK, - FIELD_PREP(CLK_V0PLL_DIV_MASK, div - 1)); + writel(FIELD_PREP_WM16(CLK_V0PLL_DIV_MASK, div - 1), + RK3506_CLKSEL_CON(1)); break; case CLK_V1PLL_DIV: div = DIV_ROUND_UP(priv->v1pll_hz, rate); assert(div - 1 <= 15); - rk_clrsetreg(RK3506_CLKSEL_CON(1), CLK_V1PLL_DIV_MASK, - FIELD_PREP(CLK_V1PLL_DIV_MASK, div - 1)); + writel(FIELD_PREP_WM16(CLK_V1PLL_DIV_MASK, div - 1), + RK3506_CLKSEL_CON(1)); break; default: return -ENOENT; @@ -293,22 +294,19 @@ static ulong rk3506_bus_set_rate(struct rk3506_clk_priv *priv, ulong clk_id, switch (clk_id) { case ACLK_BUS_ROOT: - rk_clrsetreg(RK3506_CLKSEL_CON(21), - ACLK_BUS_SEL_MASK | ACLK_BUS_DIV_MASK, - FIELD_PREP(ACLK_BUS_SEL_MASK, sel) | - FIELD_PREP(ACLK_BUS_DIV_MASK, div - 1)); + writel(FIELD_PREP_WM16(ACLK_BUS_SEL_MASK, sel) | + FIELD_PREP_WM16(ACLK_BUS_DIV_MASK, div - 1), + RK3506_CLKSEL_CON(21)); break; case HCLK_BUS_ROOT: - rk_clrsetreg(RK3506_CLKSEL_CON(21), - HCLK_BUS_SEL_MASK | HCLK_BUS_DIV_MASK, - FIELD_PREP(HCLK_BUS_SEL_MASK, sel) | - FIELD_PREP(HCLK_BUS_DIV_MASK, div - 1)); + writel(FIELD_PREP_WM16(HCLK_BUS_SEL_MASK, sel) | + FIELD_PREP_WM16(HCLK_BUS_DIV_MASK, div - 1), + RK3506_CLKSEL_CON(21)); break; case PCLK_BUS_ROOT: - rk_clrsetreg(RK3506_CLKSEL_CON(22), - PCLK_BUS_SEL_MASK | PCLK_BUS_DIV_MASK, - FIELD_PREP(PCLK_BUS_SEL_MASK, sel) | - FIELD_PREP(PCLK_BUS_DIV_MASK, div - 1)); + writel(FIELD_PREP_WM16(PCLK_BUS_SEL_MASK, sel) | + FIELD_PREP_WM16(PCLK_BUS_DIV_MASK, div - 1), + RK3506_CLKSEL_CON(22)); break; default: return -ENOENT; @@ -368,16 +366,14 @@ static ulong rk3506_peri_set_rate(struct rk3506_clk_priv *priv, ulong clk_id, switch (clk_id) { case ACLK_HSPERI_ROOT: - rk_clrsetreg(RK3506_CLKSEL_CON(49), - ACLK_HSPERI_SEL_MASK | ACLK_HSPERI_DIV_MASK, - FIELD_PREP(ACLK_HSPERI_SEL_MASK, sel) | - FIELD_PREP(ACLK_HSPERI_DIV_MASK, div - 1)); + writel(FIELD_PREP_WM16(ACLK_HSPERI_SEL_MASK, sel) | + FIELD_PREP_WM16(ACLK_HSPERI_DIV_MASK, div - 1), + RK3506_CLKSEL_CON(49)); break; case HCLK_LSPERI_ROOT: - rk_clrsetreg(RK3506_CLKSEL_CON(29), - HCLK_LSPERI_SEL_MASK | HCLK_LSPERI_DIV_MASK, - FIELD_PREP(HCLK_LSPERI_SEL_MASK, sel) | - FIELD_PREP(HCLK_LSPERI_DIV_MASK, div - 1)); + writel(FIELD_PREP_WM16(HCLK_LSPERI_SEL_MASK, sel) | + FIELD_PREP_WM16(HCLK_LSPERI_DIV_MASK, div - 1), + RK3506_CLKSEL_CON(29)); break; default: return -ENOENT; @@ -429,10 +425,9 @@ static ulong rk3506_sdmmc_set_rate(struct rk3506_clk_priv *priv, ulong clk_id, } assert(div - 1 <= 63); - rk_clrsetreg(RK3506_CLKSEL_CON(49), - CCLK_SDMMC_SEL_MASK | CCLK_SDMMC_DIV_MASK, - FIELD_PREP(CCLK_SDMMC_SEL_MASK, sel) | - FIELD_PREP(CCLK_SDMMC_DIV_MASK, div - 1)); + writel(FIELD_PREP_WM16(CCLK_SDMMC_SEL_MASK, sel) | + FIELD_PREP_WM16(CCLK_SDMMC_DIV_MASK, div - 1), + RK3506_CLKSEL_CON(49)); return rk3506_sdmmc_get_rate(priv, clk_id); } @@ -472,10 +467,9 @@ static ulong rk3506_saradc_set_rate(struct rk3506_clk_priv *priv, ulong clk_id, } assert(div - 1 <= 15); - rk_clrsetreg(RK3506_CLKSEL_CON(54), - CLK_SARADC_SEL_MASK | CLK_SARADC_DIV_MASK, - FIELD_PREP(CLK_SARADC_SEL_MASK, sel) | - FIELD_PREP(CLK_SARADC_DIV_MASK, div - 1)); + writel(FIELD_PREP_WM16(CLK_SARADC_SEL_MASK, sel) | + FIELD_PREP_WM16(CLK_SARADC_DIV_MASK, div - 1), + RK3506_CLKSEL_CON(54)); return rk3506_saradc_get_rate(priv, clk_id); } @@ -485,6 +479,7 @@ static ulong rk3506_tsadc_get_rate(struct rk3506_clk_priv *priv, ulong clk_id) u32 con, div; con = readl(RK3506_CLKSEL_CON(61)); + switch (clk_id) { case CLK_TSADC_TSEN: div = FIELD_GET(CLK_TSADC_TSEN_DIV_MASK, con); @@ -508,14 +503,14 @@ static ulong rk3506_tsadc_set_rate(struct rk3506_clk_priv *priv, ulong clk_id, case CLK_TSADC_TSEN: div = DIV_ROUND_UP(OSC_HZ, rate); assert(div - 1 <= 7); - rk_clrsetreg(RK3506_CLKSEL_CON(61), CLK_TSADC_TSEN_DIV_MASK, - FIELD_PREP(CLK_TSADC_TSEN_DIV_MASK, div - 1)); + writel(FIELD_PREP_WM16(CLK_TSADC_TSEN_DIV_MASK, div - 1), + RK3506_CLKSEL_CON(61)); break; case CLK_TSADC: div = DIV_ROUND_UP(OSC_HZ, rate); assert(div - 1 <= 255); - rk_clrsetreg(RK3506_CLKSEL_CON(61), CLK_TSADC_DIV_MASK, - FIELD_PREP(CLK_TSADC_DIV_MASK, div - 1)); + writel(FIELD_PREP_WM16(CLK_TSADC_DIV_MASK, div - 1), + RK3506_CLKSEL_CON(61)); break; default: return -ENOENT; @@ -580,22 +575,19 @@ static ulong rk3506_i2c_set_rate(struct rk3506_clk_priv *priv, ulong clk_id, switch (clk_id) { case CLK_I2C0: - rk_clrsetreg(RK3506_CLKSEL_CON(32), - CLK_I2C0_SEL_MASK | CLK_I2C0_DIV_MASK, - FIELD_PREP(CLK_I2C0_SEL_MASK, sel) | - FIELD_PREP(CLK_I2C0_DIV_MASK, div - 1)); + writel(FIELD_PREP_WM16(CLK_I2C0_SEL_MASK, sel) | + FIELD_PREP_WM16(CLK_I2C0_DIV_MASK, div - 1), + RK3506_CLKSEL_CON(32)); break; case CLK_I2C1: - rk_clrsetreg(RK3506_CLKSEL_CON(32), - CLK_I2C1_SEL_MASK | CLK_I2C1_DIV_MASK, - FIELD_PREP(CLK_I2C1_SEL_MASK, sel) | - FIELD_PREP(CLK_I2C1_DIV_MASK, div - 1)); + writel(FIELD_PREP_WM16(CLK_I2C1_SEL_MASK, sel) | + FIELD_PREP_WM16(CLK_I2C1_DIV_MASK, div - 1), + RK3506_CLKSEL_CON(32)); break; case CLK_I2C2: - rk_clrsetreg(RK3506_CLKSEL_CON(33), - CLK_I2C2_SEL_MASK | CLK_I2C2_DIV_MASK, - FIELD_PREP(CLK_I2C2_SEL_MASK, sel) | - FIELD_PREP(CLK_I2C2_DIV_MASK, div - 1)); + writel(FIELD_PREP_WM16(CLK_I2C2_SEL_MASK, sel) | + FIELD_PREP_WM16(CLK_I2C2_DIV_MASK, div - 1), + RK3506_CLKSEL_CON(33)); break; default: return -ENOENT; @@ -644,8 +636,8 @@ static ulong rk3506_pwm_set_rate(struct rk3506_clk_priv *priv, ulong clk_id, case CLK_PWM0: div = DIV_ROUND_UP(priv->gpll_div_100mhz, rate); assert(div - 1 <= 15); - rk_clrsetreg(RK3506_PMU_CLKSEL_CON(0), CLK_PWM0_DIV_MASK, - FIELD_PREP(CLK_PWM0_DIV_MASK, div - 1)); + writel(FIELD_PREP_WM16(CLK_PWM0_DIV_MASK, div - 1), + RK3506_PMU_CLKSEL_CON(0)); break; case CLK_PWM1: if (priv->v0pll_hz % rate == 0) { @@ -659,10 +651,9 @@ static ulong rk3506_pwm_set_rate(struct rk3506_clk_priv *priv, ulong clk_id, div = DIV_ROUND_UP(priv->gpll_div_hz, rate); } assert(div - 1 <= 15); - rk_clrsetreg(RK3506_CLKSEL_CON(33), - CLK_PWM1_SEL_MASK | CLK_PWM1_DIV_MASK, - FIELD_PREP(CLK_PWM1_SEL_MASK, sel) | - FIELD_PREP(CLK_PWM1_DIV_MASK, div - 1)); + writel(FIELD_PREP_WM16(CLK_PWM1_SEL_MASK, sel) | + FIELD_PREP_WM16(CLK_PWM1_DIV_MASK, div - 1), + RK3506_CLKSEL_CON(33)); break; default: return -ENOENT; @@ -727,16 +718,14 @@ static ulong rk3506_spi_set_rate(struct rk3506_clk_priv *priv, ulong clk_id, switch (clk_id) { case CLK_SPI0: - rk_clrsetreg(RK3506_CLKSEL_CON(34), - CLK_SPI0_SEL_MASK | CLK_SPI0_DIV_MASK, - FIELD_PREP(CLK_SPI0_SEL_MASK, sel) | - FIELD_PREP(CLK_SPI0_DIV_MASK, div - 1)); + writel(FIELD_PREP_WM16(CLK_SPI0_SEL_MASK, sel) | + FIELD_PREP_WM16(CLK_SPI0_DIV_MASK, div - 1), + RK3506_CLKSEL_CON(34)); break; case CLK_SPI1: - rk_clrsetreg(RK3506_CLKSEL_CON(34), - CLK_SPI1_SEL_MASK | CLK_SPI1_DIV_MASK, - FIELD_PREP(CLK_SPI1_SEL_MASK, sel) | - FIELD_PREP(CLK_SPI1_DIV_MASK, div - 1)); + writel(FIELD_PREP_WM16(CLK_SPI1_SEL_MASK, sel) | + FIELD_PREP_WM16(CLK_SPI1_DIV_MASK, div - 1), + RK3506_CLKSEL_CON(34)); break; default: return -ENOENT; @@ -770,7 +759,7 @@ static ulong rk3506_fspi_get_rate(struct rk3506_clk_priv *priv) static ulong rk3506_fspi_set_rate(struct rk3506_clk_priv *priv, ulong rate) { - int div, sel; + u32 div, sel; if (OSC_HZ % rate == 0) { sel = SCLK_FSPI_SEL_24M; @@ -787,10 +776,9 @@ static ulong rk3506_fspi_set_rate(struct rk3506_clk_priv *priv, ulong rate) } assert(div - 1 <= 31); - rk_clrsetreg(RK3506_CLKSEL_CON(50), - SCLK_FSPI_SEL_MASK | SCLK_FSPI_DIV_MASK, - FIELD_PREP(SCLK_FSPI_SEL_MASK, sel) | - FIELD_PREP(SCLK_FSPI_DIV_MASK, div - 1)); + writel(FIELD_PREP_WM16(SCLK_FSPI_SEL_MASK, sel) | + FIELD_PREP_WM16(SCLK_FSPI_DIV_MASK, div - 1), + RK3506_CLKSEL_CON(50)); return rk3506_fspi_get_rate(priv); } @@ -820,7 +808,7 @@ static ulong rk3506_vop_dclk_get_rate(struct rk3506_clk_priv *priv) static ulong rk3506_vop_dclk_set_rate(struct rk3506_clk_priv *priv, ulong rate) { - int div, sel; + u32 div, sel; if (OSC_HZ % rate == 0) { sel = DCLK_VOP_SEL_24M; @@ -837,10 +825,9 @@ static ulong rk3506_vop_dclk_set_rate(struct rk3506_clk_priv *priv, ulong rate) } assert(div - 1 <= 255); - rk_clrsetreg(RK3506_CLKSEL_CON(60), - DCLK_VOP_SEL_MASK | DCLK_VOP_DIV_MASK, - FIELD_PREP(DCLK_VOP_SEL_MASK, sel) | - FIELD_PREP(DCLK_VOP_DIV_MASK, div - 1)); + writel(FIELD_PREP_WM16(DCLK_VOP_SEL_MASK, sel) | + FIELD_PREP_WM16(DCLK_VOP_DIV_MASK, div - 1), + RK3506_CLKSEL_CON(60)); return rk3506_vop_dclk_get_rate(priv); } @@ -875,13 +862,13 @@ static ulong rk3506_mac_set_rate(struct rk3506_clk_priv *priv, ulong clk_id, case CLK_MAC0: case CLK_MAC1: div = DIV_ROUND_UP(priv->gpll_hz, rate); - rk_clrsetreg(RK3506_CLKSEL_CON(50), CLK_MAC_DIV_MASK, - FIELD_PREP(CLK_MAC_DIV_MASK, div - 1)); + writel(FIELD_PREP_WM16(CLK_MAC_DIV_MASK, div - 1), + RK3506_CLKSEL_CON(50)); break; case CLK_MAC_OUT: div = DIV_ROUND_UP(priv->gpll_hz, rate); - rk_clrsetreg(RK3506_PMU_CLKSEL_CON(0), CLK_MAC_OUT_DIV_MASK, - FIELD_PREP(CLK_MAC_OUT_DIV_MASK, div - 1)); + writel(FIELD_PREP_WM16(CLK_MAC_OUT_DIV_MASK, div - 1), + RK3506_PMU_CLKSEL_CON(0)); break; default: return -ENOENT; @@ -1091,16 +1078,14 @@ static void rk3506_clk_init(struct rk3506_clk_priv *priv) static void rk3506_clk_init_xpl(void) { /* Init pka crypto rate, sel=v0pll, div=3 */ - rk_clrsetreg(RK3506_SCRU_BASE + 0x0010, - CLK_PKA_CRYPTO_SEL_MASK | CLK_PKA_CRYPTO_DIV_MASK, - FIELD_PREP(CLK_PKA_CRYPTO_SEL_MASK, CLK_PKA_CRYPTO_SEL_V0PLL) | - FIELD_PREP(CLK_PKA_CRYPTO_DIV_MASK, 3)); + writel(FIELD_PREP_WM16(CLK_PKA_CRYPTO_SEL_MASK, CLK_PKA_CRYPTO_SEL_V0PLL) | + FIELD_PREP_WM16(CLK_PKA_CRYPTO_DIV_MASK, 3), + RK3506_SCRU_BASE + 0x0010); /* Change clk core src rate, sel=gpll, div=3 */ - rk_clrsetreg(RK3506_CLKSEL_CON(15), - CLK_CORE_SRC_SEL_MASK | CLK_CORE_SRC_DIV_MASK, - FIELD_PREP(CLK_CORE_SRC_SEL_MASK, CLK_CORE_SEL_GPLL) | - FIELD_PREP(CLK_CORE_SRC_DIV_MASK, 3)); + writel(FIELD_PREP_WM16(CLK_CORE_SRC_SEL_MASK, CLK_CORE_SEL_GPLL) | + FIELD_PREP_WM16(CLK_CORE_SRC_DIV_MASK, 3), + RK3506_CLKSEL_CON(15)); } static int rk3506_clk_probe(struct udevice *dev) -- 2.54.0