Skip to content

Commit 75a352b

Browse files
lynxeye-devShawn Guo
authored andcommitted
clk: imx8mq: add PLL monitor output
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@pengutronix.de> Reviewed-by: Abel Vesa <abel.vesa@nxp.com> Signed-off-by: Shawn Guo <shawnguo@kernel.org>
1 parent 62a7c1c commit 75a352b

2 files changed

Lines changed: 37 additions & 1 deletion

File tree

drivers/clk/imx/clk-imx8mq.c

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -270,6 +270,14 @@ static const char * const imx8mq_clko1_sels[] = {"osc_25m", "sys1_pll_800m", "os
270270
static const char * const imx8mq_clko2_sels[] = {"osc_25m", "sys2_pll_200m", "sys1_pll_400m", "sys2_pll_166m",
271271
"sys3_pll_out", "audio_pll1_out", "video_pll1_out", "ckil", };
272272

273+
static const char * const pllout_monitor_sels[] = {"osc_25m", "osc_27m", "dummy", "dummy", "ckil",
274+
"audio_pll1_out_monitor", "audio_pll2_out_monitor",
275+
"video_pll1_out_monitor", "gpu_pll_out_monitor",
276+
"vpu_pll_out_monitor", "arm_pll_out_monitor",
277+
"sys_pll1_out_monitor", "sys_pll2_out_monitor",
278+
"sys_pll3_out_monitor", "dram_pll_out_monitor",
279+
"video_pll2_out_monitor", };
280+
273281
static struct clk_hw_onecell_data *clk_hw_data;
274282
static struct clk_hw **hws;
275283

@@ -399,6 +407,20 @@ static int imx8mq_clocks_probe(struct platform_device *pdev)
399407
hws[IMX8MQ_SYS2_PLL_500M] = imx_clk_hw_fixed_factor("sys2_pll_500m", "sys2_pll_500m_cg", 1, 2);
400408
hws[IMX8MQ_SYS2_PLL_1000M] = imx_clk_hw_fixed_factor("sys2_pll_1000m", "sys2_pll_1000m_cg", 1, 1);
401409

410+
hws[IMX8MQ_CLK_MON_AUDIO_PLL1_DIV] = imx_clk_hw_divider("audio_pll1_out_monitor", "audio_pll1_bypass", base + 0x78, 0, 3);
411+
hws[IMX8MQ_CLK_MON_AUDIO_PLL2_DIV] = imx_clk_hw_divider("audio_pll2_out_monitor", "audio_pll2_bypass", base + 0x78, 4, 3);
412+
hws[IMX8MQ_CLK_MON_VIDEO_PLL1_DIV] = imx_clk_hw_divider("video_pll1_out_monitor", "video_pll1_bypass", base + 0x78, 8, 3);
413+
hws[IMX8MQ_CLK_MON_GPU_PLL_DIV] = imx_clk_hw_divider("gpu_pll_out_monitor", "gpu_pll_bypass", base + 0x78, 12, 3);
414+
hws[IMX8MQ_CLK_MON_VPU_PLL_DIV] = imx_clk_hw_divider("vpu_pll_out_monitor", "vpu_pll_bypass", base + 0x78, 16, 3);
415+
hws[IMX8MQ_CLK_MON_ARM_PLL_DIV] = imx_clk_hw_divider("arm_pll_out_monitor", "arm_pll_bypass", base + 0x78, 20, 3);
416+
hws[IMX8MQ_CLK_MON_SYS_PLL1_DIV] = imx_clk_hw_divider("sys_pll1_out_monitor", "sys1_pll_out", base + 0x7c, 0, 3);
417+
hws[IMX8MQ_CLK_MON_SYS_PLL2_DIV] = imx_clk_hw_divider("sys_pll2_out_monitor", "sys2_pll_out", base + 0x7c, 4, 3);
418+
hws[IMX8MQ_CLK_MON_SYS_PLL3_DIV] = imx_clk_hw_divider("sys_pll3_out_monitor", "sys3_pll_out", base + 0x7c, 8, 3);
419+
hws[IMX8MQ_CLK_MON_DRAM_PLL_DIV] = imx_clk_hw_divider("dram_pll_out_monitor", "dram_pll_out", base + 0x7c, 12, 3);
420+
hws[IMX8MQ_CLK_MON_VIDEO_PLL2_DIV] = imx_clk_hw_divider("video_pll2_out_monitor", "video2_pll_out", base + 0x7c, 16, 3);
421+
hws[IMX8MQ_CLK_MON_SEL] = imx_clk_hw_mux("pllout_monitor_sel", base + 0x74, 0, 4, pllout_monitor_sels, ARRAY_SIZE(pllout_monitor_sels));
422+
hws[IMX8MQ_CLK_MON_CLK2_OUT] = imx_clk_hw_gate("pllout_monitor_clk2", "pllout_monitor_sel", base + 0x74, 4);
423+
402424
np = dev->of_node;
403425
base = devm_platform_ioremap_resource(pdev, 0);
404426
if (WARN_ON(IS_ERR(base)))

include/dt-bindings/clock/imx8mq-clock.h

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -431,6 +431,20 @@
431431

432432
#define IMX8MQ_CLK_A53_CORE 289
433433

434-
#define IMX8MQ_CLK_END 290
434+
#define IMX8MQ_CLK_MON_AUDIO_PLL1_DIV 290
435+
#define IMX8MQ_CLK_MON_AUDIO_PLL2_DIV 291
436+
#define IMX8MQ_CLK_MON_VIDEO_PLL1_DIV 292
437+
#define IMX8MQ_CLK_MON_GPU_PLL_DIV 293
438+
#define IMX8MQ_CLK_MON_VPU_PLL_DIV 294
439+
#define IMX8MQ_CLK_MON_ARM_PLL_DIV 295
440+
#define IMX8MQ_CLK_MON_SYS_PLL1_DIV 296
441+
#define IMX8MQ_CLK_MON_SYS_PLL2_DIV 297
442+
#define IMX8MQ_CLK_MON_SYS_PLL3_DIV 298
443+
#define IMX8MQ_CLK_MON_DRAM_PLL_DIV 299
444+
#define IMX8MQ_CLK_MON_VIDEO_PLL2_DIV 300
445+
#define IMX8MQ_CLK_MON_SEL 301
446+
#define IMX8MQ_CLK_MON_CLK2_OUT 302
447+
448+
#define IMX8MQ_CLK_END 303
435449

436450
#endif /* __DT_BINDINGS_CLOCK_IMX8MQ_H */

0 commit comments

Comments
 (0)