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