[PATCH v1] clk: samsung: update CPU clk registration

Will McVicker willmcvicker at google.com
Mon Oct 25 09:19:23 PDT 2021


On Fri, Oct 15, 2021 at 12:05 PM Will McVicker <willmcvicker at google.com> wrote:
>
> Convert the remaining exynos clock drivers to use
> samsung_clk_register_cpu() or if possible use
> samsung_cmu_register_one(). With this we can now make
> exynos_register_cpu_clock() a static function so that future CPU clock
> registration changes will use the samsung common clock driver.
>
> The main benefit of this change is that it standardizes the CPU clock
> registration for the samsung clock drivers.
>
> Signed-off-by: Will McVicker <willmcvicker at google.com>
> ---
>  drivers/clk/samsung/clk-cpu.c        |  2 +-
>  drivers/clk/samsung/clk-cpu.h        |  7 ----
>  drivers/clk/samsung/clk-exynos3250.c | 54 ++++++++++++++--------------
>  drivers/clk/samsung/clk-exynos4.c    | 25 +++++++------
>  drivers/clk/samsung/clk-exynos5250.c | 13 +++----
>  drivers/clk/samsung/clk-exynos5420.c | 27 +++++++++-----
>  6 files changed, 67 insertions(+), 61 deletions(-)
>
> diff --git a/drivers/clk/samsung/clk-cpu.c b/drivers/clk/samsung/clk-cpu.c
> index 7f20d9aedaa9..3e62ade120c5 100644
> --- a/drivers/clk/samsung/clk-cpu.c
> +++ b/drivers/clk/samsung/clk-cpu.c
> @@ -400,7 +400,7 @@ static int exynos5433_cpuclk_notifier_cb(struct notifier_block *nb,
>  }
>
>  /* helper function to register a CPU clock */
> -int __init exynos_register_cpu_clock(struct samsung_clk_provider *ctx,
> +static int __init exynos_register_cpu_clock(struct samsung_clk_provider *ctx,
>                 unsigned int lookup_id, const char *name,
>                 const struct clk_hw *parent, const struct clk_hw *alt_parent,
>                 unsigned long offset, const struct exynos_cpuclk_cfg_data *cfg,
> diff --git a/drivers/clk/samsung/clk-cpu.h b/drivers/clk/samsung/clk-cpu.h
> index af74686db9ef..fc9f67a3b22e 100644
> --- a/drivers/clk/samsung/clk-cpu.h
> +++ b/drivers/clk/samsung/clk-cpu.h
> @@ -62,11 +62,4 @@ struct exynos_cpuclk {
>  #define CLK_CPU_HAS_E5433_REGS_LAYOUT  (1 << 2)
>  };
>
> -int __init exynos_register_cpu_clock(struct samsung_clk_provider *ctx,
> -                       unsigned int lookup_id, const char *name,
> -                       const struct clk_hw *parent, const struct clk_hw *alt_parent,
> -                       unsigned long offset,
> -                       const struct exynos_cpuclk_cfg_data *cfg,
> -                       unsigned long num_cfgs, unsigned long flags);
> -
>  #endif /* __SAMSUNG_CLK_CPU_H */
> diff --git a/drivers/clk/samsung/clk-exynos3250.c b/drivers/clk/samsung/clk-exynos3250.c
> index 17df7f9755aa..6cc65ccf867c 100644
> --- a/drivers/clk/samsung/clk-exynos3250.c
> +++ b/drivers/clk/samsung/clk-exynos3250.c
> @@ -748,6 +748,31 @@ static const struct samsung_pll_clock exynos3250_plls[] __initconst = {
>                         UPLL_LOCK, UPLL_CON0, exynos3250_pll_rates),
>  };
>
> +#define E3250_CPU_DIV0(apll, pclk_dbg, atb, corem)                     \
> +               (((apll) << 24) | ((pclk_dbg) << 20) | ((atb) << 16) |  \
> +               ((corem) << 4))
> +#define E3250_CPU_DIV1(hpm, copy)                                      \
> +               (((hpm) << 4) | ((copy) << 0))
> +
> +static const struct exynos_cpuclk_cfg_data e3250_armclk_d[] __initconst = {
> +       { 1000000, E3250_CPU_DIV0(1, 7, 4, 1), E3250_CPU_DIV1(7, 7), },
> +       {  900000, E3250_CPU_DIV0(1, 7, 3, 1), E3250_CPU_DIV1(7, 7), },
> +       {  800000, E3250_CPU_DIV0(1, 7, 3, 1), E3250_CPU_DIV1(7, 7), },
> +       {  700000, E3250_CPU_DIV0(1, 7, 3, 1), E3250_CPU_DIV1(7, 7), },
> +       {  600000, E3250_CPU_DIV0(1, 7, 3, 1), E3250_CPU_DIV1(7, 7), },
> +       {  500000, E3250_CPU_DIV0(1, 7, 3, 1), E3250_CPU_DIV1(7, 7), },
> +       {  400000, E3250_CPU_DIV0(1, 7, 3, 1), E3250_CPU_DIV1(7, 7), },
> +       {  300000, E3250_CPU_DIV0(1, 5, 3, 1), E3250_CPU_DIV1(7, 7), },
> +       {  200000, E3250_CPU_DIV0(1, 3, 3, 1), E3250_CPU_DIV1(7, 7), },
> +       {  100000, E3250_CPU_DIV0(1, 1, 1, 1), E3250_CPU_DIV1(7, 7), },
> +       {  0 },
> +};
> +
> +static const struct samsung_cpu_clock exynos3250_cpu_clks[] __initconst = {
> +       CPU_CLK(CLK_ARM_CLK, "armclk", CLK_MOUT_APLL, CLK_MOUT_MPLL_USER_C,
> +                       CLK_CPU_HAS_DIV1, 0x14200, e3250_armclk_d),
> +};
> +
>  static void __init exynos3_core_down_clock(void __iomem *reg_base)
>  {
>         unsigned int tmp;
> @@ -780,46 +805,21 @@ static const struct samsung_cmu_info cmu_info __initconst = {
>         .nr_gate_clks           = ARRAY_SIZE(gate_clks),
>         .fixed_factor_clks      = fixed_factor_clks,
>         .nr_fixed_factor_clks   = ARRAY_SIZE(fixed_factor_clks),
> +       .cpu_clks               = exynos3250_cpu_clks,
> +       .nr_cpu_clks            = ARRAY_SIZE(exynos3250_cpu_clks),
>         .nr_clk_ids             = CLK_NR_CLKS,
>         .clk_regs               = exynos3250_cmu_clk_regs,
>         .nr_clk_regs            = ARRAY_SIZE(exynos3250_cmu_clk_regs),
>  };
>
> -#define E3250_CPU_DIV0(apll, pclk_dbg, atb, corem)                     \
> -               (((apll) << 24) | ((pclk_dbg) << 20) | ((atb) << 16) |  \
> -               ((corem) << 4))
> -#define E3250_CPU_DIV1(hpm, copy)                                      \
> -               (((hpm) << 4) | ((copy) << 0))
> -
> -static const struct exynos_cpuclk_cfg_data e3250_armclk_d[] __initconst = {
> -       { 1000000, E3250_CPU_DIV0(1, 7, 4, 1), E3250_CPU_DIV1(7, 7), },
> -       {  900000, E3250_CPU_DIV0(1, 7, 3, 1), E3250_CPU_DIV1(7, 7), },
> -       {  800000, E3250_CPU_DIV0(1, 7, 3, 1), E3250_CPU_DIV1(7, 7), },
> -       {  700000, E3250_CPU_DIV0(1, 7, 3, 1), E3250_CPU_DIV1(7, 7), },
> -       {  600000, E3250_CPU_DIV0(1, 7, 3, 1), E3250_CPU_DIV1(7, 7), },
> -       {  500000, E3250_CPU_DIV0(1, 7, 3, 1), E3250_CPU_DIV1(7, 7), },
> -       {  400000, E3250_CPU_DIV0(1, 7, 3, 1), E3250_CPU_DIV1(7, 7), },
> -       {  300000, E3250_CPU_DIV0(1, 5, 3, 1), E3250_CPU_DIV1(7, 7), },
> -       {  200000, E3250_CPU_DIV0(1, 3, 3, 1), E3250_CPU_DIV1(7, 7), },
> -       {  100000, E3250_CPU_DIV0(1, 1, 1, 1), E3250_CPU_DIV1(7, 7), },
> -       {  0 },
> -};
> -
>  static void __init exynos3250_cmu_init(struct device_node *np)
>  {
>         struct samsung_clk_provider *ctx;
> -       struct clk_hw **hws;
>
>         ctx = samsung_cmu_register_one(np, &cmu_info);
>         if (!ctx)
>                 return;
>
> -       hws = ctx->clk_data.hws;
> -       exynos_register_cpu_clock(ctx, CLK_ARM_CLK, "armclk",
> -                       hws[CLK_MOUT_APLL], hws[CLK_MOUT_MPLL_USER_C],
> -                       0x14200, e3250_armclk_d, ARRAY_SIZE(e3250_armclk_d),
> -                       CLK_CPU_HAS_DIV1);
> -
>         exynos3_core_down_clock(ctx->reg_base);
>  }
>  CLK_OF_DECLARE(exynos3250_cmu, "samsung,exynos3250-cmu", exynos3250_cmu_init);
> diff --git a/drivers/clk/samsung/clk-exynos4.c b/drivers/clk/samsung/clk-exynos4.c
> index bf13e29a655c..9e98d59eb716 100644
> --- a/drivers/clk/samsung/clk-exynos4.c
> +++ b/drivers/clk/samsung/clk-exynos4.c
> @@ -1228,12 +1228,21 @@ static const struct exynos_cpuclk_cfg_data e4412_armclk_d[] __initconst = {
>         {  0 },
>  };
>
> +static const struct samsung_cpu_clock exynos4210_cpu_clks[] __initconst = {
> +       CPU_CLK(CLK_ARM_CLK, "armclk", CLK_MOUT_APLL, CLK_SCLK_MPLL,
> +                       CLK_CPU_NEEDS_DEBUG_ALT_DIV | CLK_CPU_HAS_DIV1, 0x14200, e4210_armclk_d),
> +};
> +
> +static const struct samsung_cpu_clock exynos4412_cpu_clks[] __initconst = {
> +       CPU_CLK(CLK_ARM_CLK, "armclk", CLK_MOUT_APLL, CLK_MOUT_MPLL_USER_C,
> +                       CLK_CPU_NEEDS_DEBUG_ALT_DIV | CLK_CPU_HAS_DIV1, 0x14200, e4412_armclk_d),
> +};
> +
>  /* register exynos4 clocks */
>  static void __init exynos4_clk_init(struct device_node *np,
>                                     enum exynos4_soc soc)
>  {
>         struct samsung_clk_provider *ctx;
> -       struct clk_hw **hws;
>
>         exynos4_soc = soc;
>
> @@ -1242,7 +1251,6 @@ static void __init exynos4_clk_init(struct device_node *np,
>                 panic("%s: failed to map registers\n", __func__);
>
>         ctx = samsung_clk_init(np, reg_base, CLK_NR_CLKS);
> -       hws = ctx->clk_data.hws;
>
>         samsung_clk_of_register_fixed_ext(ctx, exynos4_fixed_rate_ext_clks,
>                         ARRAY_SIZE(exynos4_fixed_rate_ext_clks),
> @@ -1304,10 +1312,8 @@ static void __init exynos4_clk_init(struct device_node *np,
>                 samsung_clk_register_fixed_factor(ctx,
>                         exynos4210_fixed_factor_clks,
>                         ARRAY_SIZE(exynos4210_fixed_factor_clks));
> -               exynos_register_cpu_clock(ctx, CLK_ARM_CLK, "armclk",
> -                       hws[CLK_MOUT_APLL], hws[CLK_SCLK_MPLL], 0x14200,
> -                       e4210_armclk_d, ARRAY_SIZE(e4210_armclk_d),
> -                       CLK_CPU_NEEDS_DEBUG_ALT_DIV | CLK_CPU_HAS_DIV1);
> +               samsung_clk_register_cpu(ctx, exynos4210_cpu_clks,
> +                               ARRAY_SIZE(exynos4210_cpu_clks));
>         } else {
>                 samsung_clk_register_mux(ctx, exynos4x12_mux_clks,
>                         ARRAY_SIZE(exynos4x12_mux_clks));
> @@ -1318,11 +1324,8 @@ static void __init exynos4_clk_init(struct device_node *np,
>                 samsung_clk_register_fixed_factor(ctx,
>                         exynos4x12_fixed_factor_clks,
>                         ARRAY_SIZE(exynos4x12_fixed_factor_clks));
> -
> -               exynos_register_cpu_clock(ctx, CLK_ARM_CLK, "armclk",
> -                       hws[CLK_MOUT_APLL], hws[CLK_MOUT_MPLL_USER_C], 0x14200,
> -                       e4412_armclk_d, ARRAY_SIZE(e4412_armclk_d),
> -                       CLK_CPU_NEEDS_DEBUG_ALT_DIV | CLK_CPU_HAS_DIV1);
> +               samsung_clk_register_cpu(ctx, exynos4412_cpu_clks,
> +                               ARRAY_SIZE(exynos4412_cpu_clks));
>         }
>
>         if (soc == EXYNOS4X12)
> diff --git a/drivers/clk/samsung/clk-exynos5250.c b/drivers/clk/samsung/clk-exynos5250.c
> index 06588fab408a..0baf28312231 100644
> --- a/drivers/clk/samsung/clk-exynos5250.c
> +++ b/drivers/clk/samsung/clk-exynos5250.c
> @@ -772,6 +772,11 @@ static const struct exynos_cpuclk_cfg_data exynos5250_armclk_d[] __initconst = {
>         {  0 },
>  };
>
> +static const struct samsung_cpu_clock exynos5250_cpu_clks[] __initconst = {
> +       CPU_CLK(CLK_ARM_CLK, "armclk", CLK_MOUT_APLL, CLK_MOUT_MPLL, CLK_CPU_HAS_DIV1, 0x200,
> +                       exynos5250_armclk_d),
> +};
> +
>  static const struct of_device_id ext_clk_match[] __initconst = {
>         { .compatible = "samsung,clock-xxti", .data = (void *)0, },
>         { },
> @@ -782,7 +787,6 @@ static void __init exynos5250_clk_init(struct device_node *np)
>  {
>         struct samsung_clk_provider *ctx;
>         unsigned int tmp;
> -       struct clk_hw **hws;
>
>         if (np) {
>                 reg_base = of_iomap(np, 0);
> @@ -793,7 +797,6 @@ static void __init exynos5250_clk_init(struct device_node *np)
>         }
>
>         ctx = samsung_clk_init(np, reg_base, CLK_NR_CLKS);
> -       hws = ctx->clk_data.hws;
>
>         samsung_clk_of_register_fixed_ext(ctx, exynos5250_fixed_rate_ext_clks,
>                         ARRAY_SIZE(exynos5250_fixed_rate_ext_clks),
> @@ -822,10 +825,8 @@ static void __init exynos5250_clk_init(struct device_node *np)
>                         ARRAY_SIZE(exynos5250_div_clks));
>         samsung_clk_register_gate(ctx, exynos5250_gate_clks,
>                         ARRAY_SIZE(exynos5250_gate_clks));
> -       exynos_register_cpu_clock(ctx, CLK_ARM_CLK, "armclk",
> -                       hws[CLK_MOUT_APLL], hws[CLK_MOUT_MPLL], 0x200,
> -                       exynos5250_armclk_d, ARRAY_SIZE(exynos5250_armclk_d),
> -                       CLK_CPU_HAS_DIV1);
> +       samsung_clk_register_cpu(ctx, exynos5250_cpu_clks,
> +                       ARRAY_SIZE(exynos5250_cpu_clks));
>
>         /*
>          * Enable arm clock down (in idle) and set arm divider
> diff --git a/drivers/clk/samsung/clk-exynos5420.c b/drivers/clk/samsung/clk-exynos5420.c
> index 3ccd4eabd2a6..83607b384665 100644
> --- a/drivers/clk/samsung/clk-exynos5420.c
> +++ b/drivers/clk/samsung/clk-exynos5420.c
> @@ -1551,6 +1551,20 @@ static const struct exynos_cpuclk_cfg_data exynos5420_kfcclk_d[] __initconst = {
>         {  0 },
>  };
>
> +static const struct samsung_cpu_clock exynos5420_cpu_clks[] __initconst = {
> +       CPU_CLK(CLK_ARM_CLK, "armclk", CLK_MOUT_APLL, CLK_MOUT_MSPLL_CPU, 0, 0x200,
> +                       exynos5420_eglclk_d),
> +       CPU_CLK(CLK_KFC_CLK, "kfcclk", CLK_MOUT_KPLL, CLK_MOUT_MSPLL_KFC, 0, 0x28200,
> +                       exynos5420_kfcclk_d),
> +};
> +
> +static const struct samsung_cpu_clock exynos5800_cpu_clks[] __initconst = {
> +       CPU_CLK(CLK_ARM_CLK, "armclk", CLK_MOUT_APLL, CLK_MOUT_MSPLL_CPU, 0, 0x200,
> +                       exynos5800_eglclk_d),
> +       CPU_CLK(CLK_KFC_CLK, "kfcclk", CLK_MOUT_KPLL, CLK_MOUT_MSPLL_KFC, 0, 0x28200,
> +                       exynos5420_kfcclk_d),
> +};
> +
>  static const struct of_device_id ext_clk_match[] __initconst = {
>         { .compatible = "samsung,exynos5420-oscclk", .data = (void *)0, },
>         { },
> @@ -1625,17 +1639,12 @@ static void __init exynos5x_clk_init(struct device_node *np,
>         }
>
>         if (soc == EXYNOS5420) {
> -               exynos_register_cpu_clock(ctx, CLK_ARM_CLK, "armclk",
> -                       hws[CLK_MOUT_APLL], hws[CLK_MOUT_MSPLL_CPU], 0x200,
> -                       exynos5420_eglclk_d, ARRAY_SIZE(exynos5420_eglclk_d), 0);
> +               samsung_clk_register_cpu(ctx, exynos5420_cpu_clks,
> +                               ARRAY_SIZE(exynos5420_cpu_clks));
>         } else {
> -               exynos_register_cpu_clock(ctx, CLK_ARM_CLK, "armclk",
> -                       hws[CLK_MOUT_APLL], hws[CLK_MOUT_MSPLL_CPU], 0x200,
> -                       exynos5800_eglclk_d, ARRAY_SIZE(exynos5800_eglclk_d), 0);
> +               samsung_clk_register_cpu(ctx, exynos5800_cpu_clks,
> +                               ARRAY_SIZE(exynos5800_cpu_clks));
>         }
> -       exynos_register_cpu_clock(ctx, CLK_KFC_CLK, "kfcclk",
> -               hws[CLK_MOUT_KPLL], hws[CLK_MOUT_MSPLL_KFC],  0x28200,
> -               exynos5420_kfcclk_d, ARRAY_SIZE(exynos5420_kfcclk_d), 0);
>
>         samsung_clk_extended_sleep_init(reg_base,
>                 exynos5x_clk_regs, ARRAY_SIZE(exynos5x_clk_regs),
> --
> 2.33.0.1079.g6e70778dc9-goog
>

Gentle reminder for review on this patch please.

Thanks,
Will



More information about the linux-arm-kernel mailing list