clk: renesas: rzv2h: Add macro for defining static dividers
authorLad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com>
Mon, 7 Apr 2025 16:51:55 +0000 (17:51 +0100)
committerGeert Uytterhoeven <geert+renesas@glider.be>
Tue, 22 Apr 2025 09:27:12 +0000 (11:27 +0200)
Unlike dynamic dividers, static dividers do not have a monitor bit.
Introduce the `DEF_CSDIV()` macro for defining static dividers, ensuring
consistency with existing dynamic divider macros.

Additionally, introduce the `CSDIV_NO_MON` macro to indicate the absence
of a monitor bit, allowing the monitoring step to be skipped when `mon`
is set to `CSDIV_NO_MON`.

Note, `rzv2h_cpg_ddiv_clk_register()` will be re-used instead of generic
`clk_hw_register_divider_table()` for registering satic dividers as some
of the static dividers require RMW operations.

Signed-off-by: Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com>
Reviewed-by: Geert Uytterhoeven <geert+renesas@glider.be>
Link: https://lore.kernel.org/20250407165202.197570-3-prabhakar.mahadev-lad.rj@bp.renesas.com
Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
drivers/clk/renesas/rzv2h-cpg.c
drivers/clk/renesas/rzv2h-cpg.h

index e95bdc35c17954838a0fbfc3ebc3df60de0c8555..eefa31c162d4f3720492cfaee7f13477dd759b4e 100644 (file)
@@ -298,6 +298,9 @@ static inline int rzv2h_cpg_wait_ddiv_clk_update_done(void __iomem *base, u8 mon
        u32 bitmask = BIT(mon);
        u32 val;
 
+       if (mon == CSDIV_NO_MON)
+               return 0;
+
        return readl_poll_timeout_atomic(base + CPG_CLKSTATUS0, val, !(val & bitmask), 10, 200);
 }
 
index 567774019d70589567a58f8a0bae6916ee6f6972..5e9295d31093d8cab705dd0a88e1e7f511b92d2f 100644 (file)
@@ -45,6 +45,14 @@ struct ddiv {
        unsigned int monbit:5;
 };
 
+/*
+ * On RZ/V2H(P), the dynamic divider clock supports up to 19 monitor bits,
+ * while on RZ/G3E, it supports up to 16 monitor bits. Use the maximum value
+ * `0x1f` to indicate that monitor bits are not supported for static divider
+ * clocks.
+ */
+#define CSDIV_NO_MON   (0x1f)
+
 #define DDIV_PACK(_offset, _shift, _width, _monbit) \
        ((struct ddiv){ \
                .offset = _offset, \
@@ -150,6 +158,8 @@ enum clk_types {
                .parent = _parent, \
                .dtable = _dtable, \
                .flag = CLK_DIVIDER_HIWORD_MASK)
+#define DEF_CSDIV(_name, _id, _parent, _ddiv_packed, _dtable) \
+       DEF_DDIV(_name, _id, _parent, _ddiv_packed, _dtable)
 #define DEF_SMUX(_name, _id, _smux_packed, _parent_names) \
        DEF_TYPE(_name, _id, CLK_TYPE_SMUX, \
                 .cfg.smux = _smux_packed, \