11// SPDX-License-Identifier: GPL-2.0
22/*
3- * Copyright 2024 NXP
3+ * Copyright 2024-2025 NXP
44 */
55
6+ #include <dt-bindings/clock/nxp,imx94-clock.h>
67#include <dt-bindings/clock/nxp,imx95-clock.h>
78#include <linux/clk.h>
89#include <linux/clk-provider.h>
@@ -156,7 +157,7 @@ static const struct imx95_blk_ctl_dev_data camblk_dev_data = {
156157 .clk_reg_offset = 0 ,
157158};
158159
159- static const struct imx95_blk_ctl_clk_dev_data lvds_clk_dev_data [] = {
160+ static const struct imx95_blk_ctl_clk_dev_data imx95_lvds_clk_dev_data [] = {
160161 [IMX95_CLK_DISPMIX_LVDS_PHY_DIV ] = {
161162 .name = "ldb_phy_div" ,
162163 .parent_names = (const char * []){ "ldbpll" , },
@@ -213,17 +214,21 @@ static const struct imx95_blk_ctl_clk_dev_data lvds_clk_dev_data[] = {
213214 },
214215};
215216
216- static const struct imx95_blk_ctl_dev_data lvds_csr_dev_data = {
217- .num_clks = ARRAY_SIZE (lvds_clk_dev_data ),
218- .clk_dev_data = lvds_clk_dev_data ,
217+ static const struct imx95_blk_ctl_dev_data imx95_lvds_csr_dev_data = {
218+ .num_clks = ARRAY_SIZE (imx95_lvds_clk_dev_data ),
219+ .clk_dev_data = imx95_lvds_clk_dev_data ,
219220 .clk_reg_offset = 0 ,
220221};
221222
222- static const struct imx95_blk_ctl_clk_dev_data dispmix_csr_clk_dev_data [] = {
223+ static const char * const imx95_disp_engine_parents [] = {
224+ "videopll1" , "dsi_pll" , "ldb_pll_div7"
225+ };
226+
227+ static const struct imx95_blk_ctl_clk_dev_data imx95_dispmix_csr_clk_dev_data [] = {
223228 [IMX95_CLK_DISPMIX_ENG0_SEL ] = {
224229 .name = "disp_engine0_sel" ,
225- .parent_names = ( const char * []){ "videopll1" , "dsi_pll" , "ldb_pll_div7" , } ,
226- .num_parents = 4 ,
230+ .parent_names = imx95_disp_engine_parents ,
231+ .num_parents = ARRAY_SIZE ( imx95_disp_engine_parents ) ,
227232 .reg = 0 ,
228233 .bit_idx = 0 ,
229234 .bit_width = 2 ,
@@ -232,8 +237,8 @@ static const struct imx95_blk_ctl_clk_dev_data dispmix_csr_clk_dev_data[] = {
232237 },
233238 [IMX95_CLK_DISPMIX_ENG1_SEL ] = {
234239 .name = "disp_engine1_sel" ,
235- .parent_names = ( const char * []){ "videopll1" , "dsi_pll" , "ldb_pll_div7" , } ,
236- .num_parents = 4 ,
240+ .parent_names = imx95_disp_engine_parents ,
241+ .num_parents = ARRAY_SIZE ( imx95_disp_engine_parents ) ,
237242 .reg = 0 ,
238243 .bit_idx = 2 ,
239244 .bit_width = 2 ,
@@ -242,9 +247,9 @@ static const struct imx95_blk_ctl_clk_dev_data dispmix_csr_clk_dev_data[] = {
242247 }
243248};
244249
245- static const struct imx95_blk_ctl_dev_data dispmix_csr_dev_data = {
246- .num_clks = ARRAY_SIZE (dispmix_csr_clk_dev_data ),
247- .clk_dev_data = dispmix_csr_clk_dev_data ,
250+ static const struct imx95_blk_ctl_dev_data imx95_dispmix_csr_dev_data = {
251+ .num_clks = ARRAY_SIZE (imx95_dispmix_csr_clk_dev_data ),
252+ .clk_dev_data = imx95_dispmix_csr_clk_dev_data ,
248253 .clk_reg_offset = 0 ,
249254};
250255
@@ -296,6 +301,51 @@ static const struct imx95_blk_ctl_dev_data hsio_blk_ctl_dev_data = {
296301 .clk_reg_offset = 0 ,
297302};
298303
304+ static const struct imx95_blk_ctl_clk_dev_data imx94_lvds_clk_dev_data [] = {
305+ [IMX94_CLK_DISPMIX_LVDS_CLK_GATE ] = {
306+ .name = "lvds_clk_gate" ,
307+ .parent_names = (const char * []){ "ldbpll" , },
308+ .num_parents = 1 ,
309+ .reg = 0 ,
310+ .bit_idx = 1 ,
311+ .bit_width = 1 ,
312+ .type = CLK_GATE ,
313+ .flags = CLK_SET_RATE_PARENT ,
314+ .flags2 = CLK_GATE_SET_TO_DISABLE ,
315+ },
316+ };
317+
318+ static const struct imx95_blk_ctl_dev_data imx94_lvds_csr_dev_data = {
319+ .num_clks = ARRAY_SIZE (imx94_lvds_clk_dev_data ),
320+ .clk_dev_data = imx94_lvds_clk_dev_data ,
321+ .clk_reg_offset = 0 ,
322+ .rpm_enabled = true,
323+ };
324+
325+ static const char * const imx94_disp_engine_parents [] = {
326+ "disppix" , "ldb_pll_div7"
327+ };
328+
329+ static const struct imx95_blk_ctl_clk_dev_data imx94_dispmix_csr_clk_dev_data [] = {
330+ [IMX94_CLK_DISPMIX_CLK_SEL ] = {
331+ .name = "disp_clk_sel" ,
332+ .parent_names = imx94_disp_engine_parents ,
333+ .num_parents = ARRAY_SIZE (imx94_disp_engine_parents ),
334+ .reg = 0 ,
335+ .bit_idx = 1 ,
336+ .bit_width = 1 ,
337+ .type = CLK_MUX ,
338+ .flags = CLK_SET_RATE_NO_REPARENT | CLK_SET_RATE_PARENT ,
339+ },
340+ };
341+
342+ static const struct imx95_blk_ctl_dev_data imx94_dispmix_csr_dev_data = {
343+ .num_clks = ARRAY_SIZE (imx94_dispmix_csr_clk_dev_data ),
344+ .clk_dev_data = imx94_dispmix_csr_clk_dev_data ,
345+ .clk_reg_offset = 0 ,
346+ .rpm_enabled = true,
347+ };
348+
299349static int imx95_bc_probe (struct platform_device * pdev )
300350{
301351 struct device * dev = & pdev -> dev ;
@@ -338,8 +388,10 @@ static int imx95_bc_probe(struct platform_device *pdev)
338388 if (!clk_hw_data )
339389 return - ENOMEM ;
340390
341- if (bc_data -> rpm_enabled )
342- pm_runtime_enable (& pdev -> dev );
391+ if (bc_data -> rpm_enabled ) {
392+ devm_pm_runtime_enable (& pdev -> dev );
393+ pm_runtime_resume_and_get (& pdev -> dev );
394+ }
343395
344396 clk_hw_data -> num = bc_data -> num_clks ;
345397 hws = clk_hw_data -> hws ;
@@ -379,8 +431,10 @@ static int imx95_bc_probe(struct platform_device *pdev)
379431 goto cleanup ;
380432 }
381433
382- if (pm_runtime_enabled (bc -> dev ))
434+ if (pm_runtime_enabled (bc -> dev )) {
435+ pm_runtime_put_sync (& pdev -> dev );
383436 clk_disable_unprepare (bc -> clk_apb );
437+ }
384438
385439 return 0 ;
386440
@@ -391,9 +445,6 @@ static int imx95_bc_probe(struct platform_device *pdev)
391445 clk_hw_unregister (hws [i ]);
392446 }
393447
394- if (bc_data -> rpm_enabled )
395- pm_runtime_disable (& pdev -> dev );
396-
397448 return ret ;
398449}
399450
@@ -462,10 +513,12 @@ static const struct dev_pm_ops imx95_bc_pm_ops = {
462513};
463514
464515static const struct of_device_id imx95_bc_of_match [] = {
516+ { .compatible = "nxp,imx94-display-csr" , .data = & imx94_dispmix_csr_dev_data },
517+ { .compatible = "nxp,imx94-lvds-csr" , .data = & imx94_lvds_csr_dev_data },
465518 { .compatible = "nxp,imx95-camera-csr" , .data = & camblk_dev_data },
466519 { .compatible = "nxp,imx95-display-master-csr" , },
467- { .compatible = "nxp,imx95-lvds -csr" , .data = & lvds_csr_dev_data },
468- { .compatible = "nxp,imx95-display -csr" , .data = & dispmix_csr_dev_data },
520+ { .compatible = "nxp,imx95-display -csr" , .data = & imx95_dispmix_csr_dev_data },
521+ { .compatible = "nxp,imx95-lvds -csr" , .data = & imx95_lvds_csr_dev_data },
469522 { .compatible = "nxp,imx95-hsio-blk-ctl" , .data = & hsio_blk_ctl_dev_data },
470523 { .compatible = "nxp,imx95-vpu-csr" , .data = & vpublk_dev_data },
471524 { .compatible = "nxp,imx95-netcmix-blk-ctrl" , .data = & netcmix_dev_data },
0 commit comments