Dear Marek, > From: Marek Vasut <ma...@denx.de> > Sent: mardi 12 mai 2020 19:07 > > There are two speed grades of the STM32MP1, the A/C and D/F, the former can > run up to 650 MHz, the later at up to 800 MHz. Allow specifying PLL config for > both in the DT, so that it is possible to cater for boards which can be > populated > with either SoC. > > Signed-off-by: Marek Vasut <ma...@denx.de> > Cc: Patrick Delaunay <patrick.delau...@st.com> > Cc: Patrice Chotard <patrice.chot...@st.com> > --- > drivers/clk/clk_stm32mp1.c | 30 ++++++++++++++++++++++++++---- > 1 file changed, 26 insertions(+), 4 deletions(-) > > diff --git a/drivers/clk/clk_stm32mp1.c b/drivers/clk/clk_stm32mp1.c index > 50df8425bf..cecc06638e 100644 > --- a/drivers/clk/clk_stm32mp1.c > +++ b/drivers/clk/clk_stm32mp1.c > @@ -4,6 +4,7 @@ > */ > > #include <common.h> > +#include <asm/arch/sys_proto.h> > #include <clk-uclass.h> > #include <div64.h> > #include <dm.h> > @@ -1464,6 +1465,12 @@ static void pll_csg(struct stm32mp1_clk_priv *priv, int > pll_id, u32 *csg) > setbits_le32(priv->base + pll[pll_id].pllxcr, RCC_PLLNCR_SSCG_CTRL); > } > > +static __maybe_unused int stm32mp1_is_df(void) { > + /* ID bit 7 is set on 15x{D,F}xx and not on 15x{A,C}xx */ > + return get_cpu_type() & BIT(7); > +} > + > static __maybe_unused int pll_set_rate(struct udevice *dev, > int pll_id, > int div_id, > @@ -1491,8 +1498,13 @@ static __maybe_unused int pll_set_rate(struct > udevice *dev, > > ret = ofnode_read_u32_array(plloff, "cfg", > pllcfg, PLLCFG_NB); > - if (ret < 0) > - return -FDT_ERR_NOTFOUND; > + if (ret < 0) { > + ret = ofnode_read_u32_array(plloff, > + stm32mp1_is_df() ? "cfg-df" : "cfg-ac", > + pllcfg, PLLCFG_NB); > + if (ret < 0) > + return -FDT_ERR_NOTFOUND; > + } > > fck_ref = pll_get_fref_ck(priv, pll_id); > > @@ -1687,8 +1699,13 @@ static int stm32mp1_clktree(struct udevice *dev) > ret = ofnode_read_u32_array(plloff[i], "cfg", > pllcfg[i], PLLCFG_NB); > if (ret < 0) { > - debug("field cfg invalid: error %d\n", ret); > - return -FDT_ERR_NOTFOUND; > + ret = ofnode_read_u32_array(plloff[i], > + stm32mp1_is_df() ? "cfg-df" : "cfg-ac", > + pllcfg[i], PLLCFG_NB); > + if (ret < 0) { > + debug("field cfg invalid: error %d\n", ret); > + return -FDT_ERR_NOTFOUND; > + } > } > } > > @@ -1783,6 +1800,11 @@ static int stm32mp1_clktree(struct udevice *dev) > continue; > > fracv = ofnode_read_u32_default(plloff[i], "frac", 0); > + if (!fracv) { > + fracv = ofnode_read_u32_default(plloff[i], > + stm32mp1_is_df() ? "frac-df" : > "frac-ac", > + 0); > + } > pll_config(priv, i, pllcfg[i], fracv); > ret = ofnode_read_u32_array(plloff[i], "csg", csg, PLLCSG_NB); > if (!ret) { > -- > 2.25.1
The 2 speed grade will be supported with OPP information and HW support,present in kernel device tree (upstream in progress) I port this patch in U-Boot with: http://patchwork.ozlabs.org/project/uboot/patch/20200421171123.2.Id3620aec4deb419f1c1a5876b865556e86d3aba1@changeid/ Please check the full serie stm32mp1: use OPP information for PLL1 settings in SPL http://patchwork.ozlabs.org/project/uboot/list/?series=171767 PLL1 settings are now computed in SPL and no more read from DT. Regards Patrick