1
1
// SPDX-License-Identifier: GPL-2.0
2
2
/*
3
- * Copyright 2024 NXP
3
+ * Copyright 2024-2025 NXP
4
4
*/
5
5
6
+ #include <dt-bindings/clock/nxp,imx94-clock.h>
6
7
#include <dt-bindings/clock/nxp,imx95-clock.h>
7
8
#include <linux/clk.h>
8
9
#include <linux/clk-provider.h>
@@ -156,7 +157,7 @@ static const struct imx95_blk_ctl_dev_data camblk_dev_data = {
156
157
.clk_reg_offset = 0 ,
157
158
};
158
159
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 [] = {
160
161
[IMX95_CLK_DISPMIX_LVDS_PHY_DIV ] = {
161
162
.name = "ldb_phy_div" ,
162
163
.parent_names = (const char * []){ "ldbpll" , },
@@ -213,17 +214,21 @@ static const struct imx95_blk_ctl_clk_dev_data lvds_clk_dev_data[] = {
213
214
},
214
215
};
215
216
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 ,
219
220
.clk_reg_offset = 0 ,
220
221
};
221
222
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 [] = {
223
228
[IMX95_CLK_DISPMIX_ENG0_SEL ] = {
224
229
.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 ) ,
227
232
.reg = 0 ,
228
233
.bit_idx = 0 ,
229
234
.bit_width = 2 ,
@@ -232,8 +237,8 @@ static const struct imx95_blk_ctl_clk_dev_data dispmix_csr_clk_dev_data[] = {
232
237
},
233
238
[IMX95_CLK_DISPMIX_ENG1_SEL ] = {
234
239
.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 ) ,
237
242
.reg = 0 ,
238
243
.bit_idx = 2 ,
239
244
.bit_width = 2 ,
@@ -242,9 +247,9 @@ static const struct imx95_blk_ctl_clk_dev_data dispmix_csr_clk_dev_data[] = {
242
247
}
243
248
};
244
249
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 ,
248
253
.clk_reg_offset = 0 ,
249
254
};
250
255
@@ -296,6 +301,51 @@ static const struct imx95_blk_ctl_dev_data hsio_blk_ctl_dev_data = {
296
301
.clk_reg_offset = 0 ,
297
302
};
298
303
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
+
299
349
static int imx95_bc_probe (struct platform_device * pdev )
300
350
{
301
351
struct device * dev = & pdev -> dev ;
@@ -338,8 +388,10 @@ static int imx95_bc_probe(struct platform_device *pdev)
338
388
if (!clk_hw_data )
339
389
return - ENOMEM ;
340
390
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
+ }
343
395
344
396
clk_hw_data -> num = bc_data -> num_clks ;
345
397
hws = clk_hw_data -> hws ;
@@ -379,8 +431,10 @@ static int imx95_bc_probe(struct platform_device *pdev)
379
431
goto cleanup ;
380
432
}
381
433
382
- if (pm_runtime_enabled (bc -> dev ))
434
+ if (pm_runtime_enabled (bc -> dev )) {
435
+ pm_runtime_put_sync (& pdev -> dev );
383
436
clk_disable_unprepare (bc -> clk_apb );
437
+ }
384
438
385
439
return 0 ;
386
440
@@ -391,9 +445,6 @@ static int imx95_bc_probe(struct platform_device *pdev)
391
445
clk_hw_unregister (hws [i ]);
392
446
}
393
447
394
- if (bc_data -> rpm_enabled )
395
- pm_runtime_disable (& pdev -> dev );
396
-
397
448
return ret ;
398
449
}
399
450
@@ -462,10 +513,12 @@ static const struct dev_pm_ops imx95_bc_pm_ops = {
462
513
};
463
514
464
515
static 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 },
465
518
{ .compatible = "nxp,imx95-camera-csr" , .data = & camblk_dev_data },
466
519
{ .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 },
469
522
{ .compatible = "nxp,imx95-hsio-blk-ctl" , .data = & hsio_blk_ctl_dev_data },
470
523
{ .compatible = "nxp,imx95-vpu-csr" , .data = & vpublk_dev_data },
471
524
{ .compatible = "nxp,imx95-netcmix-blk-ctrl" , .data = & netcmix_dev_data },
0 commit comments