On 8/17/26 19:15, Sean Anderson wrote:
One of the s4 clocks has a non-integer divisor (2.5). Add support for
this.

Signed-off-by: Sean Anderson <[email protected]>
---

  drivers/clk/meson/clk_meson.c |  3 ++-
  drivers/clk/meson/clk_meson.h | 12 +++++++++---
  2 files changed, 11 insertions(+), 4 deletions(-)

diff --git a/drivers/clk/meson/clk_meson.c b/drivers/clk/meson/clk_meson.c
index de5aa5ae3c9..29615fdae77 100644
--- a/drivers/clk/meson/clk_meson.c
+++ b/drivers/clk/meson/clk_meson.c
@@ -153,7 +153,8 @@ ulong meson_clk_get_rate(struct clk *clk)
        case MESON_CLK_FIXED_DIV:
                parent.dev = clk->dev;
                parent.id = meson_clk_get_parent(clk);
-               return meson_clk_get_rate(&parent) / info->div;
+               return mult_frac(meson_clk_get_rate(&parent), info->mult,
+                                info->div);
        case MESON_CLK_EXTERNAL: {
                int ret;
                struct clk external_clk;
diff --git a/drivers/clk/meson/clk_meson.h b/drivers/clk/meson/clk_meson.h
index 990e9434126..86b272985ab 100644
--- a/drivers/clk/meson/clk_meson.h
+++ b/drivers/clk/meson/clk_meson.h
@@ -61,7 +61,7 @@ struct meson_clk {
   * @MESON_CLK_GATE: This clock is a gate
   * @MESON_CLK_MUX: This clock is a multiplexer
   * @MESON_CLK_DIV: This clock is a configurable divider
- * @MESON_CLK_FIXED_DIV: This clock is a configurable divider
+ * @MESON_CLK_FIXED_DIV: This clock is a (fractional) fixed-factor clock
   * @MESON_CLK_EXTERNAL: This is an external clock from different clock 
provider
   * @MESON_CLK_PLL: This is a PLL
   */
@@ -87,7 +87,10 @@ struct meson_clk_info {
        const char *name;
        union {
                const struct parm *parm;
-               u8 div;
+               struct {
+                       u8 mult;
+                       u8 div;
+               };
        };
        const unsigned int *parents;
        const enum meson_clk_type type;
@@ -133,13 +136,16 @@ struct meson_clk_data {
        })
/* A fixed divider */
-#define CLK_DIV_FIXED(_name, _div, _parent)                            \
+#define CLK_DIV_FIXED_FULL(_name, _mult, _div, _parent)                        
\
        (&(struct meson_clk_info){                                  \
                .parents = (const unsigned int[]) { (_parent) },        \
+               .mult = (_mult),                                        \
                .div = (_div),                                          \
                .name = (_name),                                        \
                .type = MESON_CLK_FIXED_DIV,                            \
        })
+#define CLK_DIV_FIXED(name, div, parent)                               \
+       CLK_DIV_FIXED_FULL(name, 1, div, parent)
/* An external clock */
  #define CLK_EXTERNAL(_name)                                           \

Reviewed-by: Neil Armstrong <[email protected]>

Thanks,
Neil

Reply via email to