Skip to content

Commit 6702d17

Browse files
Andre-ARMwens
authored andcommitted
clk: sunxi-ng: a523: add video mod clocks
Add the clocks driving the various video subsystems of the SoC: the "DE" display engine, the "DI" deinterlacer, the "G2D" 2D graphics system, the Mali "GPU", the "VE" video engine, its associated IOMMU, as well as the clocks for the various video output drivers (HDMI, DP, LCDs). Signed-off-by: Andre Przywara <andre.przywara@arm.com> Reviewed-by: Jernej Skrabec <jernej.skrabec@gmail.com> Link: https://patch.msgid.link/20250307002628.10684-8-andre.przywara@arm.com Signed-off-by: Chen-Yu Tsai <wens@csie.org>
1 parent e6f4b4b commit 6702d17

File tree

1 file changed

+238
-0
lines changed

1 file changed

+238
-0
lines changed

drivers/clk/sunxi-ng/ccu-sun55i-a523.c

Lines changed: 238 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -364,6 +364,208 @@ static SUNXI_CCU_M_DATA_WITH_MUX(apb1_clk, "apb1", apb1_parents, 0x524,
364364
24, 3, /* mux */
365365
0);
366366

367+
368+
/**************************************************************************
369+
* mod clocks *
370+
**************************************************************************/
371+
372+
static const struct clk_hw *de_parents[] = {
373+
&pll_periph0_300M_clk.hw,
374+
&pll_periph0_400M_clk.hw,
375+
&pll_video3_4x_clk.common.hw,
376+
&pll_video3_3x_clk.hw,
377+
};
378+
379+
static SUNXI_CCU_M_HW_WITH_MUX_GATE(de_clk, "de", de_parents, 0x600,
380+
0, 5, /* M */
381+
24, 3, /* mux */
382+
BIT(31), /* gate */
383+
CLK_SET_RATE_PARENT);
384+
385+
static const struct clk_hw *di_parents[] = {
386+
&pll_periph0_300M_clk.hw,
387+
&pll_periph0_400M_clk.hw,
388+
&pll_video0_4x_clk.common.hw,
389+
&pll_video1_4x_clk.common.hw,
390+
};
391+
392+
static SUNXI_CCU_M_HW_WITH_MUX_GATE(di_clk, "di", di_parents, 0x620,
393+
0, 5, /* M */
394+
24, 3, /* mux */
395+
BIT(31), /* gate */
396+
CLK_SET_RATE_PARENT);
397+
398+
static const struct clk_hw *g2d_parents[] = {
399+
&pll_periph0_400M_clk.hw,
400+
&pll_periph0_300M_clk.hw,
401+
&pll_video0_4x_clk.common.hw,
402+
&pll_video1_4x_clk.common.hw,
403+
};
404+
405+
static SUNXI_CCU_M_HW_WITH_MUX_GATE(g2d_clk, "g2d", g2d_parents, 0x630,
406+
0, 5, /* M */
407+
24, 3, /* mux */
408+
BIT(31), /* gate */
409+
0);
410+
411+
static const struct clk_hw *gpu_parents[] = {
412+
&pll_gpu_clk.common.hw,
413+
&pll_periph0_800M_clk.common.hw,
414+
&pll_periph0_600M_clk.hw,
415+
&pll_periph0_400M_clk.hw,
416+
&pll_periph0_300M_clk.hw,
417+
&pll_periph0_200M_clk.hw,
418+
};
419+
420+
static SUNXI_CCU_M_HW_WITH_MUX_GATE(gpu_clk, "gpu", gpu_parents, 0x670,
421+
0, 4, /* M */
422+
24, 3, /* mux */
423+
BIT(31), /* gate */
424+
CLK_SET_RATE_PARENT);
425+
426+
static const struct clk_hw *ve_parents[] = {
427+
&pll_ve_clk.common.hw,
428+
&pll_periph0_480M_clk.common.hw,
429+
&pll_periph0_400M_clk.hw,
430+
&pll_periph0_300M_clk.hw,
431+
};
432+
static SUNXI_CCU_M_HW_WITH_MUX_GATE(ve_clk, "ve", ve_parents, 0x690,
433+
0, 5, /* M */
434+
24, 3, /* mux */
435+
BIT(31), /* gate */
436+
CLK_SET_RATE_PARENT);
437+
438+
static const struct clk_parent_data iommu_parents[] = {
439+
{ .hw = &pll_periph0_600M_clk.hw },
440+
{ .hw = &pll_ddr_clk.common.hw },
441+
{ .hw = &pll_periph0_480M_clk.common.hw },
442+
{ .hw = &pll_periph0_400M_clk.hw },
443+
{ .hw = &pll_periph0_150M_clk.hw },
444+
{ .fw_name = "hosc" },
445+
};
446+
447+
static SUNXI_CCU_MP_DATA_WITH_MUX_GATE_FEAT(iommu_clk, "iommu", iommu_parents,
448+
0x7b0,
449+
0, 5, /* M */
450+
0, 0, /* no P */
451+
24, 3, /* mux */
452+
BIT(31), /* gate */
453+
CLK_SET_RATE_PARENT,
454+
CCU_FEATURE_UPDATE_BIT);
455+
456+
static SUNXI_CCU_GATE_DATA(hdmi_24M_clk, "hdmi-24M", osc24M, 0xb04, BIT(31), 0);
457+
458+
static SUNXI_CCU_GATE_HWS_WITH_PREDIV(hdmi_cec_32k_clk, "hdmi-cec-32k",
459+
pll_periph0_2x_hws,
460+
0xb10, BIT(30), 36621, 0);
461+
462+
static const struct clk_parent_data hdmi_cec_parents[] = {
463+
{ .fw_name = "losc" },
464+
{ .hw = &hdmi_cec_32k_clk.common.hw },
465+
};
466+
static SUNXI_CCU_MUX_DATA_WITH_GATE(hdmi_cec_clk, "hdmi-cec", hdmi_cec_parents,
467+
0xb10,
468+
24, 1, /* mux */
469+
BIT(31), /* gate */
470+
0);
471+
472+
static const struct clk_parent_data mipi_dsi_parents[] = {
473+
{ .fw_name = "hosc" },
474+
{ .hw = &pll_periph0_200M_clk.hw },
475+
{ .hw = &pll_periph0_150M_clk.hw },
476+
};
477+
static SUNXI_CCU_M_DATA_WITH_MUX_GATE(mipi_dsi0_clk, "mipi-dsi0",
478+
mipi_dsi_parents, 0xb24,
479+
0, 5, /* M */
480+
24, 3, /* mux */
481+
BIT(31), /* gate */
482+
0);
483+
484+
static SUNXI_CCU_M_DATA_WITH_MUX_GATE(mipi_dsi1_clk, "mipi-dsi1",
485+
mipi_dsi_parents, 0xb28,
486+
0, 5, /* M */
487+
24, 3, /* mux */
488+
BIT(31), /* gate */
489+
0);
490+
491+
static const struct clk_hw *tcon_parents[] = {
492+
&pll_video0_4x_clk.common.hw,
493+
&pll_video1_4x_clk.common.hw,
494+
&pll_video2_4x_clk.common.hw,
495+
&pll_video3_4x_clk.common.hw,
496+
&pll_periph0_2x_clk.common.hw,
497+
&pll_video0_3x_clk.hw,
498+
&pll_video1_3x_clk.hw,
499+
};
500+
static SUNXI_CCU_M_HW_WITH_MUX_GATE(tcon_lcd0_clk, "tcon-lcd0", tcon_parents,
501+
0xb60,
502+
0, 5, /* M */
503+
24, 3, /* mux */
504+
BIT(31), /* gate */
505+
CLK_SET_RATE_PARENT);
506+
507+
static SUNXI_CCU_M_HW_WITH_MUX_GATE(tcon_lcd1_clk, "tcon-lcd1", tcon_parents,
508+
0xb64,
509+
0, 5, /* M */
510+
24, 3, /* mux */
511+
BIT(31), /* gate */
512+
CLK_SET_RATE_PARENT);
513+
514+
static const struct clk_hw *tcon_tv_parents[] = {
515+
&pll_video0_4x_clk.common.hw,
516+
&pll_video1_4x_clk.common.hw,
517+
&pll_video2_4x_clk.common.hw,
518+
&pll_video3_4x_clk.common.hw,
519+
&pll_periph0_2x_clk.common.hw,
520+
};
521+
static SUNXI_CCU_M_HW_WITH_MUX_GATE(tcon_lcd2_clk, "tcon-lcd2",
522+
tcon_tv_parents, 0xb68,
523+
0, 5, /* M */
524+
24, 3, /* mux */
525+
BIT(31), /* gate */
526+
CLK_SET_RATE_PARENT);
527+
528+
static SUNXI_CCU_M_HW_WITH_MUX_GATE(combophy_dsi0_clk, "combophy-dsi0",
529+
tcon_parents, 0xb6c,
530+
0, 5, /* M */
531+
24, 3, /* mux */
532+
BIT(31), /* gate */
533+
CLK_SET_RATE_PARENT);
534+
535+
static SUNXI_CCU_M_HW_WITH_MUX_GATE(combophy_dsi1_clk, "combophy-dsi1",
536+
tcon_parents, 0xb70,
537+
0, 5, /* M */
538+
24, 3, /* mux */
539+
BIT(31), /* gate */
540+
CLK_SET_RATE_PARENT);
541+
542+
static SUNXI_CCU_M_HW_WITH_MUX_GATE(tcon_tv0_clk, "tcon-tv0", tcon_tv_parents,
543+
0xb80,
544+
0, 4, /* M */
545+
24, 3, /* mux */
546+
BIT(31), /* gate */
547+
CLK_SET_RATE_PARENT);
548+
549+
static SUNXI_CCU_M_HW_WITH_MUX_GATE(tcon_tv1_clk, "tcon-tv1", tcon_tv_parents,
550+
0xb84,
551+
0, 4, /* M */
552+
24, 3, /* mux */
553+
BIT(31), /* gate */
554+
CLK_SET_RATE_PARENT);
555+
556+
static const struct clk_hw *edp_parents[] = {
557+
&pll_video0_4x_clk.common.hw,
558+
&pll_video1_4x_clk.common.hw,
559+
&pll_video2_4x_clk.common.hw,
560+
&pll_video3_4x_clk.common.hw,
561+
&pll_periph0_2x_clk.common.hw,
562+
};
563+
static SUNXI_CCU_M_HW_WITH_MUX_GATE(edp_clk, "edp", edp_parents, 0xbb0,
564+
0, 4, /* M */
565+
24, 3, /* mux */
566+
BIT(31), /* gate */
567+
CLK_SET_RATE_PARENT);
568+
367569
/*
368570
* Contains all clocks that are controlled by a hardware register. They
369571
* have a (sunxi) .common member, which needs to be initialised by the common
@@ -394,6 +596,23 @@ static struct ccu_common *sun55i_a523_ccu_clks[] = {
394596
&ahb_clk.common,
395597
&apb0_clk.common,
396598
&apb1_clk.common,
599+
&de_clk.common,
600+
&di_clk.common,
601+
&g2d_clk.common,
602+
&gpu_clk.common,
603+
&ve_clk.common,
604+
&iommu_clk.common,
605+
&hdmi_24M_clk.common,
606+
&hdmi_cec_32k_clk.common,
607+
&hdmi_cec_clk.common,
608+
&mipi_dsi0_clk.common,
609+
&mipi_dsi1_clk.common,
610+
&tcon_lcd0_clk.common,
611+
&tcon_lcd1_clk.common,
612+
&tcon_lcd2_clk.common,
613+
&tcon_tv0_clk.common,
614+
&tcon_tv1_clk.common,
615+
&edp_clk.common,
397616
};
398617

399618
static struct clk_hw_onecell_data sun55i_a523_hw_clks = {
@@ -420,6 +639,7 @@ static struct clk_hw_onecell_data sun55i_a523_hw_clks = {
420639
[CLK_PLL_PERIPH1_200M] = &pll_periph1_200M_clk.hw,
421640
[CLK_PLL_PERIPH1_160M] = &pll_periph1_160M_clk.hw,
422641
[CLK_PLL_PERIPH1_150M] = &pll_periph1_150M_clk.hw,
642+
[CLK_PLL_GPU] = &pll_gpu_clk.common.hw,
423643
[CLK_PLL_VIDEO0_8X] = &pll_video0_8x_clk.common.hw,
424644
[CLK_PLL_VIDEO0_4X] = &pll_video0_4x_clk.common.hw,
425645
[CLK_PLL_VIDEO0_3X] = &pll_video0_3x_clk.hw,
@@ -442,6 +662,24 @@ static struct clk_hw_onecell_data sun55i_a523_hw_clks = {
442662
[CLK_AHB] = &ahb_clk.common.hw,
443663
[CLK_APB0] = &apb0_clk.common.hw,
444664
[CLK_APB1] = &apb1_clk.common.hw,
665+
[CLK_DE] = &de_clk.common.hw,
666+
[CLK_DI] = &di_clk.common.hw,
667+
[CLK_G2D] = &g2d_clk.common.hw,
668+
[CLK_GPU] = &gpu_clk.common.hw,
669+
[CLK_VE] = &ve_clk.common.hw,
670+
[CLK_HDMI_24M] = &hdmi_24M_clk.common.hw,
671+
[CLK_HDMI_CEC_32K] = &hdmi_cec_32k_clk.common.hw,
672+
[CLK_HDMI_CEC] = &hdmi_cec_clk.common.hw,
673+
[CLK_MIPI_DSI0] = &mipi_dsi0_clk.common.hw,
674+
[CLK_MIPI_DSI1] = &mipi_dsi1_clk.common.hw,
675+
[CLK_TCON_LCD0] = &tcon_lcd0_clk.common.hw,
676+
[CLK_TCON_LCD1] = &tcon_lcd1_clk.common.hw,
677+
[CLK_TCON_LCD2] = &tcon_lcd2_clk.common.hw,
678+
[CLK_COMBOPHY_DSI0] = &combophy_dsi0_clk.common.hw,
679+
[CLK_COMBOPHY_DSI1] = &combophy_dsi1_clk.common.hw,
680+
[CLK_TCON_TV0] = &tcon_tv0_clk.common.hw,
681+
[CLK_TCON_TV1] = &tcon_tv1_clk.common.hw,
682+
[CLK_EDP] = &edp_clk.common.hw,
445683
},
446684
};
447685

0 commit comments

Comments
 (0)