[PATCH 1/3] clk: imx8mq: add PLL monitor output
Abel Vesa
abel.vesa at nxp.com
Mon Jan 25 13:24:41 EST 2021
On 21-01-25 20:19:07, Abel Vesa wrote:
> On 21-01-25 18:41:33, Lucas Stach wrote:
> > The PLL monitor is mentioned as a debug feature in the reference manual,
> > but there are some boards that use this clock output as a reference clock
> > for board level components. Add support for those clocks in the clock
> > driver, so this clock output can be used properly.
> >
> > Note that the VIDEO1, GPU and VPU mux inputs are rotated compared to the
> > description in the reference manual. The order in this patch has been
> > empirically validated.
> >
> > Signed-off-by: Lucas Stach <l.stach at pengutronix.de>
> > ---
> > drivers/clk/imx/clk-imx8mq.c | 22 ++++++++++++++++++++++
> > include/dt-bindings/clock/imx8mq-clock.h | 16 +++++++++++++++-
> > 2 files changed, 37 insertions(+), 1 deletion(-)
> >
> > diff --git a/drivers/clk/imx/clk-imx8mq.c b/drivers/clk/imx/clk-imx8mq.c
> > index 779ea69e639c..4dd4ae9d022b 100644
> > --- a/drivers/clk/imx/clk-imx8mq.c
> > +++ b/drivers/clk/imx/clk-imx8mq.c
> > @@ -270,6 +270,14 @@ static const char * const imx8mq_clko1_sels[] = {"osc_25m", "sys1_pll_800m", "os
> > static const char * const imx8mq_clko2_sels[] = {"osc_25m", "sys2_pll_200m", "sys1_pll_400m", "sys2_pll_166m",
> > "sys3_pll_out", "audio_pll1_out", "video_pll1_out", "ckil", };
> >
> > +static const char * const pllout_monitor_sels[] = {"osc_25m", "osc_27m", "dummy", "dummy", "ckil",
> > + "audio_pll1_out_monitor", "audio_pll2_out_monitor",
> > + "video_pll1_out_monitor", "gpu_pll_out_monitor",
> > + "vpu_pll_out_monitor", "arm_pll_out_monitor",
> > + "sys_pll1_out_monitor", "sys_pll2_out_monitor",
> > + "sys_pll3_out_monitor", "dram_pll_out_monitor",
> > + "video_pll2_out_monitor", };
> > +
> > static struct clk_hw_onecell_data *clk_hw_data;
> > static struct clk_hw **hws;
> >
> > @@ -399,6 +407,20 @@ static int imx8mq_clocks_probe(struct platform_device *pdev)
> > hws[IMX8MQ_SYS2_PLL_500M] = imx_clk_hw_fixed_factor("sys2_pll_500m", "sys2_pll_500m_cg", 1, 2);
> > hws[IMX8MQ_SYS2_PLL_1000M] = imx_clk_hw_fixed_factor("sys2_pll_1000m", "sys2_pll_1000m_cg", 1, 1);
> >
> > + hws[IMX8MQ_CLK_MON_AUDIO_PLL1_DIV] = imx_clk_hw_divider("audio_pll1_out_monitor", "audio_pll1_bypass", base + 0x78, 0, 3);
> > + hws[IMX8MQ_CLK_MON_AUDIO_PLL2_DIV] = imx_clk_hw_divider("audio_pll2_out_monitor", "audio_pll2_bypass", base + 0x78, 4, 3);
> > + hws[IMX8MQ_CLK_MON_VIDEO_PLL1_DIV] = imx_clk_hw_divider("video_pll1_out_monitor", "video_pll1_bypass", base + 0x78, 8, 3);
> > + hws[IMX8MQ_CLK_MON_GPU_PLL_DIV] = imx_clk_hw_divider("gpu_pll_out_monitor", "gpu_pll_bypass", base + 0x78, 12, 3);
> > + hws[IMX8MQ_CLK_MON_VPU_PLL_DIV] = imx_clk_hw_divider("vpu_pll_out_monitor", "vpu_pll_bypass", base + 0x78, 16, 3);
> > + hws[IMX8MQ_CLK_MON_ARM_PLL_DIV] = imx_clk_hw_divider("arm_pll_out_monitor", "arm_pll_bypass", base + 0x78, 20, 3);
> > + hws[IMX8MQ_CLK_MON_SYS_PLL1_DIV] = imx_clk_hw_divider("sys_pll1_out_monitor", "sys1_pll_out", base + 0x7c, 0, 3);
> > + hws[IMX8MQ_CLK_MON_SYS_PLL2_DIV] = imx_clk_hw_divider("sys_pll2_out_monitor", "sys2_pll_out", base + 0x7c, 4, 3);
> > + hws[IMX8MQ_CLK_MON_SYS_PLL3_DIV] = imx_clk_hw_divider("sys_pll3_out_monitor", "sys3_pll_out", base + 0x7c, 8, 3);
> > + hws[IMX8MQ_CLK_MON_DRAM_PLL_DIV] = imx_clk_hw_divider("dram_pll_out_monitor", "dram_pll_out", base + 0x7c, 12, 3);
> > + hws[IMX8MQ_CLK_MON_VIDEO_PLL2_DIV] = imx_clk_hw_divider("video_pll2_out_monitor", "video2_pll_out", base + 0x7c, 16, 3);
> > + hws[IMX8MQ_CLK_MON_SEL] = imx_clk_hw_mux("pllout_monitor_sel", base + 0x74, 0, 4, pllout_monitor_sels, ARRAY_SIZE(pllout_monitor_sels));
> > + hws[IMX8MQ_CLK_MON_CLK2_OUT] = imx_clk_hw_gate("pllout_monitor_clk2", "pllout_monitor_sel", base + 0x74, 4);
> > +
> > np = dev->of_node;
> > base = devm_platform_ioremap_resource(pdev, 0);
> > if (WARN_ON(IS_ERR(base)))
> > diff --git a/include/dt-bindings/clock/imx8mq-clock.h b/include/dt-bindings/clock/imx8mq-clock.h
> > index 9b8045d75b8b..82e907ce7bdd 100644
> > --- a/include/dt-bindings/clock/imx8mq-clock.h
> > +++ b/include/dt-bindings/clock/imx8mq-clock.h
> > @@ -431,6 +431,20 @@
> >
> > #define IMX8MQ_CLK_A53_CORE 289
>
> This goes through a different tree.
>
Scratch that.
> > -#define IMX8MQ_CLK_END 290
> > +#define IMX8MQ_CLK_MON_AUDIO_PLL1_DIV 290
> > +#define IMX8MQ_CLK_MON_AUDIO_PLL2_DIV 291
> > +#define IMX8MQ_CLK_MON_VIDEO_PLL1_DIV 292
> > +#define IMX8MQ_CLK_MON_GPU_PLL_DIV 293
> > +#define IMX8MQ_CLK_MON_VPU_PLL_DIV 294
> > +#define IMX8MQ_CLK_MON_ARM_PLL_DIV 295
> > +#define IMX8MQ_CLK_MON_SYS_PLL1_DIV 296
> > +#define IMX8MQ_CLK_MON_SYS_PLL2_DIV 297
> > +#define IMX8MQ_CLK_MON_SYS_PLL3_DIV 298
> > +#define IMX8MQ_CLK_MON_DRAM_PLL_DIV 299
> > +#define IMX8MQ_CLK_MON_VIDEO_PLL2_DIV 300
> > +#define IMX8MQ_CLK_MON_SEL 301
> > +#define IMX8MQ_CLK_MON_CLK2_OUT 302
> > +
> > +#define IMX8MQ_CLK_END 303
> >
> > #endif /* __DT_BINDINGS_CLOCK_IMX8MQ_H */
> > --
> > 2.20.1
> >
>
> Everything else looks good to me.
>
> Reviewed-by: Abel Vesa <abel.vesa at nxp.com>
More information about the linux-arm-kernel
mailing list