[PATCH 6/9] clk: meson: Support fractional fixed-factor clocks
Sean Anderson <[email protected]>
| Newsgroups | org.u-boot-project.lists.u-boot |
|---|---|
| Message-ID | <[email protected]> |
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