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:
Emmanuel Vadot 2018-04-07 15:38:42 +00:00
parent b1e0bc1210
commit ffa4898125
3 changed files with 21 additions and 2 deletions

View file

@ -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

View file

@ -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;

View file

@ -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;