13
13
#include "clk.h"
14
14
15
15
/*
16
- * GATE with additional linked clock. Downstream enables the linked clock
17
- * (via runtime PM) whenever the gate is enabled. The downstream implementation
18
- * does this via separate clock nodes for each of the linked gate clocks,
19
- * which leaks parts of the clock tree into DT. It is unclear why this is
20
- * actually needed and things work without it for simple use cases. Thus
21
- * the linked clock is ignored for now.
16
+ * Recent Rockchip SoCs have a new hardware block called Native Interface
17
+ * Unit (NIU), which gates clocks to devices behind them. These effectively
18
+ * need two parent clocks.
19
+ *
20
+ * Downstream enables the linked clock via runtime PM whenever the gate is
21
+ * enabled. This implementation uses separate clock nodes for each of the
22
+ * linked gate clocks, which leaks parts of the clock tree into DT.
23
+ *
24
+ * The GATE_LINK macro instead takes the second parent via 'linkname', but
25
+ * ignores the information. Once the clock framework is ready to handle it, the
26
+ * information should be passed on here. But since these clocks are required to
27
+ * access multiple relevant IP blocks, such as PCIe or USB, we mark all linked
28
+ * clocks critical until a better solution is available. This will waste some
29
+ * power, but avoids leaking implementation details into DT or hanging the
30
+ * system.
22
31
*/
23
32
#define GATE_LINK (_id , cname , pname , linkname , f , o , b , gf ) \
24
33
GATE(_id, cname, pname, f, o, b, gf)
34
+ #define RK3588_LINKED_CLK CLK_IS_CRITICAL
25
35
26
36
27
37
#define RK3588_GRF_SOC_STATUS0 0x600
@@ -1446,7 +1456,7 @@ static struct rockchip_clk_branch rk3588_clk_branches[] __initdata = {
1446
1456
COMPOSITE_NODIV (HCLK_NVM_ROOT , "hclk_nvm_root" , mux_200m_100m_50m_24m_p , 0 ,
1447
1457
RK3588_CLKSEL_CON (77 ), 0 , 2 , MFLAGS ,
1448
1458
RK3588_CLKGATE_CON (31 ), 0 , GFLAGS ),
1449
- COMPOSITE (ACLK_NVM_ROOT , "aclk_nvm_root" , gpll_cpll_p , 0 ,
1459
+ COMPOSITE (ACLK_NVM_ROOT , "aclk_nvm_root" , gpll_cpll_p , RK3588_LINKED_CLK ,
1450
1460
RK3588_CLKSEL_CON (77 ), 7 , 1 , MFLAGS , 2 , 5 , DFLAGS ,
1451
1461
RK3588_CLKGATE_CON (31 ), 1 , GFLAGS ),
1452
1462
GATE (ACLK_EMMC , "aclk_emmc" , "aclk_nvm_root" , 0 ,
@@ -1675,13 +1685,13 @@ static struct rockchip_clk_branch rk3588_clk_branches[] __initdata = {
1675
1685
RK3588_CLKGATE_CON (42 ), 9 , GFLAGS ),
1676
1686
1677
1687
/* vdpu */
1678
- COMPOSITE (ACLK_VDPU_ROOT , "aclk_vdpu_root" , gpll_cpll_aupll_p , 0 ,
1688
+ COMPOSITE (ACLK_VDPU_ROOT , "aclk_vdpu_root" , gpll_cpll_aupll_p , RK3588_LINKED_CLK ,
1679
1689
RK3588_CLKSEL_CON (98 ), 5 , 2 , MFLAGS , 0 , 5 , DFLAGS ,
1680
1690
RK3588_CLKGATE_CON (44 ), 0 , GFLAGS ),
1681
1691
COMPOSITE_NODIV (ACLK_VDPU_LOW_ROOT , "aclk_vdpu_low_root" , mux_400m_200m_100m_24m_p , 0 ,
1682
1692
RK3588_CLKSEL_CON (98 ), 7 , 2 , MFLAGS ,
1683
1693
RK3588_CLKGATE_CON (44 ), 1 , GFLAGS ),
1684
- COMPOSITE_NODIV (HCLK_VDPU_ROOT , "hclk_vdpu_root" , mux_200m_100m_50m_24m_p , 0 ,
1694
+ COMPOSITE_NODIV (HCLK_VDPU_ROOT , "hclk_vdpu_root" , mux_200m_100m_50m_24m_p , RK3588_LINKED_CLK ,
1685
1695
RK3588_CLKSEL_CON (98 ), 9 , 2 , MFLAGS ,
1686
1696
RK3588_CLKGATE_CON (44 ), 2 , GFLAGS ),
1687
1697
COMPOSITE (ACLK_JPEG_DECODER_ROOT , "aclk_jpeg_decoder_root" , gpll_cpll_aupll_spll_p , 0 ,
@@ -1732,9 +1742,9 @@ static struct rockchip_clk_branch rk3588_clk_branches[] __initdata = {
1732
1742
COMPOSITE (ACLK_RKVENC0_ROOT , "aclk_rkvenc0_root" , gpll_cpll_npll_p , 0 ,
1733
1743
RK3588_CLKSEL_CON (102 ), 7 , 2 , MFLAGS , 2 , 5 , DFLAGS ,
1734
1744
RK3588_CLKGATE_CON (47 ), 1 , GFLAGS ),
1735
- GATE (HCLK_RKVENC0 , "hclk_rkvenc0" , "hclk_rkvenc0_root" , 0 ,
1745
+ GATE (HCLK_RKVENC0 , "hclk_rkvenc0" , "hclk_rkvenc0_root" , RK3588_LINKED_CLK ,
1736
1746
RK3588_CLKGATE_CON (47 ), 4 , GFLAGS ),
1737
- GATE (ACLK_RKVENC0 , "aclk_rkvenc0" , "aclk_rkvenc0_root" , 0 ,
1747
+ GATE (ACLK_RKVENC0 , "aclk_rkvenc0" , "aclk_rkvenc0_root" , RK3588_LINKED_CLK ,
1738
1748
RK3588_CLKGATE_CON (47 ), 5 , GFLAGS ),
1739
1749
COMPOSITE (CLK_RKVENC0_CORE , "clk_rkvenc0_core" , gpll_cpll_aupll_npll_p , 0 ,
1740
1750
RK3588_CLKSEL_CON (102 ), 14 , 2 , MFLAGS , 9 , 5 , DFLAGS ,
@@ -1744,10 +1754,10 @@ static struct rockchip_clk_branch rk3588_clk_branches[] __initdata = {
1744
1754
RK3588_CLKGATE_CON (48 ), 6 , GFLAGS ),
1745
1755
1746
1756
/* vi */
1747
- COMPOSITE (ACLK_VI_ROOT , "aclk_vi_root" , gpll_cpll_npll_aupll_spll_p , 0 ,
1757
+ COMPOSITE (ACLK_VI_ROOT , "aclk_vi_root" , gpll_cpll_npll_aupll_spll_p , RK3588_LINKED_CLK ,
1748
1758
RK3588_CLKSEL_CON (106 ), 5 , 3 , MFLAGS , 0 , 5 , DFLAGS ,
1749
1759
RK3588_CLKGATE_CON (49 ), 0 , GFLAGS ),
1750
- COMPOSITE_NODIV (HCLK_VI_ROOT , "hclk_vi_root" , mux_200m_100m_50m_24m_p , 0 ,
1760
+ COMPOSITE_NODIV (HCLK_VI_ROOT , "hclk_vi_root" , mux_200m_100m_50m_24m_p , RK3588_LINKED_CLK ,
1751
1761
RK3588_CLKSEL_CON (106 ), 8 , 2 , MFLAGS ,
1752
1762
RK3588_CLKGATE_CON (49 ), 1 , GFLAGS ),
1753
1763
COMPOSITE_NODIV (PCLK_VI_ROOT , "pclk_vi_root" , mux_100m_50m_24m_p , 0 ,
@@ -1919,10 +1929,10 @@ static struct rockchip_clk_branch rk3588_clk_branches[] __initdata = {
1919
1929
COMPOSITE (ACLK_VOP_ROOT , "aclk_vop_root" , gpll_cpll_dmyaupll_npll_spll_p , 0 ,
1920
1930
RK3588_CLKSEL_CON (110 ), 5 , 3 , MFLAGS , 0 , 5 , DFLAGS ,
1921
1931
RK3588_CLKGATE_CON (52 ), 0 , GFLAGS ),
1922
- COMPOSITE_NODIV (ACLK_VOP_LOW_ROOT , "aclk_vop_low_root" , mux_400m_200m_100m_24m_p , 0 ,
1932
+ COMPOSITE_NODIV (ACLK_VOP_LOW_ROOT , "aclk_vop_low_root" , mux_400m_200m_100m_24m_p , RK3588_LINKED_CLK ,
1923
1933
RK3588_CLKSEL_CON (110 ), 8 , 2 , MFLAGS ,
1924
1934
RK3588_CLKGATE_CON (52 ), 1 , GFLAGS ),
1925
- COMPOSITE_NODIV (HCLK_VOP_ROOT , "hclk_vop_root" , mux_200m_100m_50m_24m_p , 0 ,
1935
+ COMPOSITE_NODIV (HCLK_VOP_ROOT , "hclk_vop_root" , mux_200m_100m_50m_24m_p , RK3588_LINKED_CLK ,
1926
1936
RK3588_CLKSEL_CON (110 ), 10 , 2 , MFLAGS ,
1927
1937
RK3588_CLKGATE_CON (52 ), 2 , GFLAGS ),
1928
1938
COMPOSITE_NODIV (PCLK_VOP_ROOT , "pclk_vop_root" , mux_100m_50m_24m_p , 0 ,
@@ -2425,7 +2435,7 @@ static struct rockchip_clk_branch rk3588_clk_branches[] __initdata = {
2425
2435
2426
2436
GATE_LINK (ACLK_ISP1_PRE , "aclk_isp1_pre" , "aclk_isp1_root" , "aclk_vi_root" , 0 , RK3588_CLKGATE_CON (26 ), 6 , GFLAGS ),
2427
2437
GATE_LINK (HCLK_ISP1_PRE , "hclk_isp1_pre" , "hclk_isp1_root" , "hclk_vi_root" , 0 , RK3588_CLKGATE_CON (26 ), 8 , GFLAGS ),
2428
- GATE_LINK (HCLK_NVM , "hclk_nvm" , "hclk_nvm_root" , "aclk_nvm_root" , 0 , RK3588_CLKGATE_CON (31 ), 2 , GFLAGS ),
2438
+ GATE_LINK (HCLK_NVM , "hclk_nvm" , "hclk_nvm_root" , "aclk_nvm_root" , RK3588_LINKED_CLK , RK3588_CLKGATE_CON (31 ), 2 , GFLAGS ),
2429
2439
GATE_LINK (ACLK_USB , "aclk_usb" , "aclk_usb_root" , "aclk_vo1usb_top_root" , 0 , RK3588_CLKGATE_CON (42 ), 2 , GFLAGS ),
2430
2440
GATE_LINK (HCLK_USB , "hclk_usb" , "hclk_usb_root" , "hclk_vo1usb_top_root" , 0 , RK3588_CLKGATE_CON (42 ), 3 , GFLAGS ),
2431
2441
GATE_LINK (ACLK_JPEG_DECODER_PRE , "aclk_jpeg_decoder_pre" , "aclk_jpeg_decoder_root" , "aclk_vdpu_root" , 0 , RK3588_CLKGATE_CON (44 ), 7 , GFLAGS ),
0 commit comments