Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

authored by

Lucas Stach and committed by
Shawn Guo
75a352bc 62a7c1c4

+37 -1
+22
drivers/clk/imx/clk-imx8mq.c
··· 270 270 static const char * const imx8mq_clko2_sels[] = {"osc_25m", "sys2_pll_200m", "sys1_pll_400m", "sys2_pll_166m", 271 271 "sys3_pll_out", "audio_pll1_out", "video_pll1_out", "ckil", }; 272 272 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 + 273 281 static struct clk_hw_onecell_data *clk_hw_data; 274 282 static struct clk_hw **hws; 275 283 ··· 406 398 hws[IMX8MQ_SYS2_PLL_333M] = imx_clk_hw_fixed_factor("sys2_pll_333m", "sys2_pll_333m_cg", 1, 3); 407 399 hws[IMX8MQ_SYS2_PLL_500M] = imx_clk_hw_fixed_factor("sys2_pll_500m", "sys2_pll_500m_cg", 1, 2); 408 400 hws[IMX8MQ_SYS2_PLL_1000M] = imx_clk_hw_fixed_factor("sys2_pll_1000m", "sys2_pll_1000m_cg", 1, 1); 401 + 402 + hws[IMX8MQ_CLK_MON_AUDIO_PLL1_DIV] = imx_clk_hw_divider("audio_pll1_out_monitor", "audio_pll1_bypass", base + 0x78, 0, 3); 403 + hws[IMX8MQ_CLK_MON_AUDIO_PLL2_DIV] = imx_clk_hw_divider("audio_pll2_out_monitor", "audio_pll2_bypass", base + 0x78, 4, 3); 404 + hws[IMX8MQ_CLK_MON_VIDEO_PLL1_DIV] = imx_clk_hw_divider("video_pll1_out_monitor", "video_pll1_bypass", base + 0x78, 8, 3); 405 + hws[IMX8MQ_CLK_MON_GPU_PLL_DIV] = imx_clk_hw_divider("gpu_pll_out_monitor", "gpu_pll_bypass", base + 0x78, 12, 3); 406 + hws[IMX8MQ_CLK_MON_VPU_PLL_DIV] = imx_clk_hw_divider("vpu_pll_out_monitor", "vpu_pll_bypass", base + 0x78, 16, 3); 407 + hws[IMX8MQ_CLK_MON_ARM_PLL_DIV] = imx_clk_hw_divider("arm_pll_out_monitor", "arm_pll_bypass", base + 0x78, 20, 3); 408 + hws[IMX8MQ_CLK_MON_SYS_PLL1_DIV] = imx_clk_hw_divider("sys_pll1_out_monitor", "sys1_pll_out", base + 0x7c, 0, 3); 409 + hws[IMX8MQ_CLK_MON_SYS_PLL2_DIV] = imx_clk_hw_divider("sys_pll2_out_monitor", "sys2_pll_out", base + 0x7c, 4, 3); 410 + hws[IMX8MQ_CLK_MON_SYS_PLL3_DIV] = imx_clk_hw_divider("sys_pll3_out_monitor", "sys3_pll_out", base + 0x7c, 8, 3); 411 + hws[IMX8MQ_CLK_MON_DRAM_PLL_DIV] = imx_clk_hw_divider("dram_pll_out_monitor", "dram_pll_out", base + 0x7c, 12, 3); 412 + hws[IMX8MQ_CLK_MON_VIDEO_PLL2_DIV] = imx_clk_hw_divider("video_pll2_out_monitor", "video2_pll_out", base + 0x7c, 16, 3); 413 + hws[IMX8MQ_CLK_MON_SEL] = imx_clk_hw_mux("pllout_monitor_sel", base + 0x74, 0, 4, pllout_monitor_sels, ARRAY_SIZE(pllout_monitor_sels)); 414 + hws[IMX8MQ_CLK_MON_CLK2_OUT] = imx_clk_hw_gate("pllout_monitor_clk2", "pllout_monitor_sel", base + 0x74, 4); 409 415 410 416 np = dev->of_node; 411 417 base = devm_platform_ioremap_resource(pdev, 0);
+15 -1
include/dt-bindings/clock/imx8mq-clock.h
··· 431 431 432 432 #define IMX8MQ_CLK_A53_CORE 289 433 433 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 435 449 436 450 #endif /* __DT_BINDINGS_CLOCK_IMX8MQ_H */