mirror of
https://github.com/opnsense/src.git
synced 2026-04-15 14:29:58 -04:00
allwinner: aw_clk_nm: Add prediv value
Some NM clocks needs a fixed prediv value applied to the parent frequency on some conditions. Add support for it.
This commit is contained in:
parent
b1e0bc1210
commit
ffa4898125
3 changed files with 21 additions and 2 deletions
|
|
@ -66,6 +66,7 @@ struct aw_clk_init {
|
|||
#define AW_CLK_SCALE_CHANGE 0x0010
|
||||
#define AW_CLK_HAS_FRAC 0x0020
|
||||
#define AW_CLK_HAS_UPDATE 0x0040
|
||||
#define AW_CLK_HAS_PREDIV 0x0080
|
||||
|
||||
#define AW_CLK_FACTOR_POWER_OF_TWO 0x0001
|
||||
#define AW_CLK_FACTOR_ZERO_BASED 0x0002
|
||||
|
|
|
|||
|
|
@ -52,6 +52,7 @@ struct aw_clk_nm_sc {
|
|||
|
||||
struct aw_clk_factor m;
|
||||
struct aw_clk_factor n;
|
||||
struct aw_clk_factor prediv;
|
||||
struct aw_clk_frac frac;
|
||||
|
||||
uint32_t mux_shift;
|
||||
|
|
@ -278,7 +279,7 @@ static int
|
|||
aw_clk_nm_recalc(struct clknode *clk, uint64_t *freq)
|
||||
{
|
||||
struct aw_clk_nm_sc *sc;
|
||||
uint32_t val, m, n;
|
||||
uint32_t val, m, n, prediv;
|
||||
|
||||
sc = clknode_get_softc(clk);
|
||||
|
||||
|
|
@ -294,8 +295,12 @@ aw_clk_nm_recalc(struct clknode *clk, uint64_t *freq)
|
|||
} else {
|
||||
m = aw_clk_get_factor(val, &sc->m);
|
||||
n = aw_clk_get_factor(val, &sc->n);
|
||||
if (sc->flags & AW_CLK_HAS_PREDIV)
|
||||
prediv = aw_clk_get_factor(val, &sc->prediv);
|
||||
else
|
||||
prediv = 1;
|
||||
|
||||
*freq = *freq / n / m;
|
||||
*freq = *freq / prediv / n / m;
|
||||
}
|
||||
|
||||
return (0);
|
||||
|
|
@ -340,6 +345,18 @@ aw_clk_nm_register(struct clkdom *clkdom, struct aw_clk_nm_def *clkdef)
|
|||
sc->n.value = clkdef->n.value;
|
||||
sc->n.flags = clkdef->n.flags;
|
||||
|
||||
sc->prediv.shift = clkdef->prediv.shift;
|
||||
sc->prediv.width = clkdef->prediv.width;
|
||||
sc->prediv.mask = ((1 << sc->prediv.width) - 1) << sc->prediv.shift;
|
||||
sc->prediv.value = clkdef->prediv.value;
|
||||
sc->prediv.flags = clkdef->prediv.flags;
|
||||
sc->prediv.cond_shift = clkdef->prediv.cond_shift;
|
||||
if (clkdef->prediv.cond_width != 0)
|
||||
sc->prediv.cond_mask = ((1 << clkdef->prediv.cond_width) - 1) << sc->prediv.shift;
|
||||
else
|
||||
sc->prediv.cond_mask = clkdef->prediv.cond_mask;
|
||||
sc->prediv.cond_value = clkdef->prediv.cond_value;
|
||||
|
||||
sc->frac.freq0 = clkdef->frac.freq0;
|
||||
sc->frac.freq1 = clkdef->frac.freq1;
|
||||
sc->frac.mode_sel = 1 << clkdef->frac.mode_sel;
|
||||
|
|
|
|||
|
|
@ -37,6 +37,7 @@ struct aw_clk_nm_def {
|
|||
|
||||
struct aw_clk_factor m;
|
||||
struct aw_clk_factor n;
|
||||
struct aw_clk_factor prediv;
|
||||
struct aw_clk_frac frac;
|
||||
|
||||
uint32_t mux_shift;
|
||||
|
|
|
|||
Loading…
Reference in a new issue