The MUXGRF macro from the kernel clk driver has an extra field that was
left out of the barebox driver, since it required a dynamically allocated
hashmap that might have been overly complicated to port.
Until now, this wasn't strictly necessary, but for upcoming RK3576 support
this extra parameter will be needed.
This patch introduces a simplified version of the hashmap via a simple
pointer lookup table called grfmap in struct rockchip_clk_provider.
Existing drivers only need one of the entries (grf_type_sys), which is
filled in by default.

Signed-off-by: David Jander <da...@protonic.nl>
---
 drivers/clk/rockchip/clk-rk3288.c |  2 +-
 drivers/clk/rockchip/clk-rk3568.c |  2 +-
 drivers/clk/rockchip/clk.c        |  4 +++-
 drivers/clk/rockchip/clk.h        | 15 ++++++++++++++-
 4 files changed, 19 insertions(+), 4 deletions(-)

diff --git a/drivers/clk/rockchip/clk-rk3288.c 
b/drivers/clk/rockchip/clk-rk3288.c
index b4ac2a42d5..9dceb7da0c 100644
--- a/drivers/clk/rockchip/clk-rk3288.c
+++ b/drivers/clk/rockchip/clk-rk3288.c
@@ -419,7 +419,7 @@ static struct rockchip_clk_branch rk3288_clk_branches[] 
__initdata = {
                        RK3288_CLKSEL_CON(32), 14, 2, MFLAGS, 8, 5, DFLAGS,
                        RK3288_CLKGATE_CON(3), 11, GFLAGS),
        MUXGRF(0, "aclk_vcodec_pre", mux_aclk_vcodec_pre_p, CLK_SET_RATE_PARENT,
-                       RK3288_GRF_SOC_CON(0), 7, 1, MFLAGS),
+                       RK3288_GRF_SOC_CON(0), 7, 1, MFLAGS, grf_type_sys),
        GATE(ACLK_VCODEC, "aclk_vcodec", "aclk_vcodec_pre", 0,
                RK3288_CLKGATE_CON(9), 0, GFLAGS),
 
diff --git a/drivers/clk/rockchip/clk-rk3568.c 
b/drivers/clk/rockchip/clk-rk3568.c
index cdc7b99e47..7ed5aa5213 100644
--- a/drivers/clk/rockchip/clk-rk3568.c
+++ b/drivers/clk/rockchip/clk-rk3568.c
@@ -586,7 +586,7 @@ static struct rockchip_clk_branch rk3568_clk_branches[] 
__initdata = {
                        RK3568_CLKSEL_CON(9), 6, 2, MFLAGS, 0, 5, DFLAGS,
                        RK3568_CLKGATE_CON(4), 0, GFLAGS),
        MUXGRF(CLK_DDR1X, "clk_ddr1x", clk_ddr1x_p, CLK_SET_RATE_PARENT,
-                       RK3568_CLKSEL_CON(9), 15, 1, MFLAGS),
+                       RK3568_CLKSEL_CON(9), 15, 1, MFLAGS, grf_type_sys),
 
        COMPOSITE_NOMUX(CLK_MSCH, "clk_msch", "clk_ddr1x", CLK_IGNORE_UNUSED,
                        RK3568_CLKSEL_CON(10), 0, 2, DFLAGS,
diff --git a/drivers/clk/rockchip/clk.c b/drivers/clk/rockchip/clk.c
index c833f09611..387961c829 100644
--- a/drivers/clk/rockchip/clk.c
+++ b/drivers/clk/rockchip/clk.c
@@ -332,6 +332,7 @@ struct rockchip_clk_provider *rockchip_clk_init(struct 
device_node *np,
 
        ctx->grf = syscon_regmap_lookup_by_phandle(ctx->cru_node,
                                                   "rockchip,grf");
+       ctx->grfmap[grf_type_sys] = ctx->grf;
 
        return ctx;
 
@@ -438,7 +439,8 @@ void rockchip_clk_register_branches(struct 
rockchip_clk_provider *ctx,
                case branch_muxgrf:
                        clk = rockchip_clk_register_muxgrf(list->name,
                                list->parent_names, list->num_parents,
-                               flags, ctx->grf, list->muxdiv_offset,
+                               flags, ctx->grfmap[list->grf_type],
+                               list->muxdiv_offset,
                                list->mux_shift, list->mux_width,
                                list->mux_flags);
                        break;
diff --git a/drivers/clk/rockchip/clk.h b/drivers/clk/rockchip/clk.h
index 42da038fdf..ff25de776d 100644
--- a/drivers/clk/rockchip/clk.h
+++ b/drivers/clk/rockchip/clk.h
@@ -308,6 +308,16 @@ enum rockchip_pll_type {
        .k = _k,                                                \
 }
 
+enum rockchip_grf_type {
+       grf_type_sys = 0,
+       grf_type_pmu0,
+       grf_type_pmu1,
+       grf_type_ioc,
+       grf_type_vo,
+       grf_type_vpu,
+       grf_type_num
+};
+
 /**
  * struct rockchip_clk_provider - information about clock provider
  * @reg_base: virtual address for the register base.
@@ -321,6 +331,7 @@ struct rockchip_clk_provider {
        struct clk_onecell_data clk_data;
        struct device_node *cru_node;
        struct regmap *grf;
+       struct regmap *grfmap[grf_type_num];
        struct restart_handler restart_handler;
        unsigned int reg_restart;
        spinlock_t lock;
@@ -526,6 +537,7 @@ struct rockchip_clk_branch {
        int                             gate_offset;
        u8                              gate_shift;
        u8                              gate_flags;
+       enum rockchip_grf_type          grf_type;
        struct rockchip_clk_branch      *child;
 };
 
@@ -750,7 +762,7 @@ struct rockchip_clk_branch {
                .gate_offset    = -1,                           \
        }
 
-#define MUXGRF(_id, cname, pnames, f, o, s, w, mf)             \
+#define MUXGRF(_id, cname, pnames, f, o, s, w, mf, gt)         \
        {                                                       \
                .id             = _id,                          \
                .branch_type    = branch_muxgrf,                \
@@ -763,6 +775,7 @@ struct rockchip_clk_branch {
                .mux_width      = w,                            \
                .mux_flags      = mf,                           \
                .gate_offset    = -1,                           \
+               .grf_type       = gt,                           \
        }
 
 #define DIV(_id, cname, pname, f, o, s, w, df)                 \
-- 
2.47.2


Reply via email to