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)                                            \
-- 
2.53.0

Reply via email to