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

Merge tag 'renesas-clk-for-v6.9-tag1' of git://git.kernel.org/pub/scm/linux/kernel/git/geert/renesas-drivers into clk-renesas

Pull Renesas clk driver updates from Geert Uytterhoeven:

- Ignore all clocks which are assigned to a non-Linux system
- Add watchdog clock on RZ/G3S
- Add camera (CRU) clock and reset on RZ/G2UL
- Add support for the R-Car V4M (R8A779H0) SoC
- Miscellaneous fixes and improvements

* tag 'renesas-clk-for-v6.9-tag1' of git://git.kernel.org/pub/scm/linux/kernel/git/geert/renesas-drivers:
clk: renesas: r8a779h0: Add I2C clocks
clk: renesas: r8a779h0: Add watchdog clock
clk: renesas: r8a779h0: Add PFC/GPIO clocks
clk: renesas: r8a779g0: Fix PCIe clock name
clk: renesas: cpg-mssr: Add support for R-Car V4M
clk: renesas: rcar-gen4: Add support for FRQCRC1
clk: renesas: r9a07g043: Add clock and reset entries for CRU
clk: renesas: r9a08g045: Add clock and reset support for watchdog
dt-bindings: clock: Add R8A779H0 V4M CPG Core Clock Definitions
dt-bindings: clock: renesas,cpg-mssr: Document R-Car V4M support
dt-bindings: power: Add r8a779h0 SYSC power domain definitions
dt-bindings: power: renesas,rcar-sysc: Document R-Car V4M support
clk: renesas: mstp: Remove obsolete clkdev registration
clk: renesas: cpg-mssr: Ignore all clocks assigned to non-Linux system
of: Add for_each_reserved_child_of_node()
of: Add of_get_next_status_child() and makes more generic of_get_next
of: Add __of_device_is_status() and makes more generic status check

+657 -59
+1
Documentation/devicetree/bindings/clock/renesas,cpg-mssr.yaml
··· 50 50 - renesas,r8a779a0-cpg-mssr # R-Car V3U 51 51 - renesas,r8a779f0-cpg-mssr # R-Car S4-8 52 52 - renesas,r8a779g0-cpg-mssr # R-Car V4H 53 + - renesas,r8a779h0-cpg-mssr # R-Car V4M 53 54 54 55 reg: 55 56 maxItems: 1
+1
Documentation/devicetree/bindings/power/renesas,rcar-sysc.yaml
··· 45 45 - renesas,r8a779a0-sysc # R-Car V3U 46 46 - renesas,r8a779f0-sysc # R-Car S4-8 47 47 - renesas,r8a779g0-sysc # R-Car V4H 48 + - renesas,r8a779h0-sysc # R-Car V4M 48 49 49 50 reg: 50 51 maxItems: 1
+5
drivers/clk/renesas/Kconfig
··· 33 33 select CLK_R8A779A0 if ARCH_R8A779A0 34 34 select CLK_R8A779F0 if ARCH_R8A779F0 35 35 select CLK_R8A779G0 if ARCH_R8A779G0 36 + select CLK_R8A779H0 if ARCH_R8A779H0 36 37 select CLK_R9A06G032 if ARCH_R9A06G032 37 38 select CLK_R9A07G043 if ARCH_R9A07G043 38 39 select CLK_R9A07G044 if ARCH_R9A07G044 ··· 164 163 165 164 config CLK_R8A779G0 166 165 bool "R-Car V4H clock support" if COMPILE_TEST 166 + select CLK_RCAR_GEN4_CPG 167 + 168 + config CLK_R8A779H0 169 + bool "R-Car V4M clock support" if COMPILE_TEST 167 170 select CLK_RCAR_GEN4_CPG 168 171 169 172 config CLK_R9A06G032
+1
drivers/clk/renesas/Makefile
··· 30 30 obj-$(CONFIG_CLK_R8A779A0) += r8a779a0-cpg-mssr.o 31 31 obj-$(CONFIG_CLK_R8A779F0) += r8a779f0-cpg-mssr.o 32 32 obj-$(CONFIG_CLK_R8A779G0) += r8a779g0-cpg-mssr.o 33 + obj-$(CONFIG_CLK_R8A779H0) += r8a779h0-cpg-mssr.o 33 34 obj-$(CONFIG_CLK_R9A06G032) += r9a06g032-clocks.o 34 35 obj-$(CONFIG_CLK_R9A07G043) += r9a07g043-cpg.o 35 36 obj-$(CONFIG_CLK_R9A07G044) += r9a07g044-cpg.o
+3 -13
drivers/clk/renesas/clk-mstp.c
··· 10 10 11 11 #include <linux/clk.h> 12 12 #include <linux/clk-provider.h> 13 - #include <linux/clkdev.h> 14 13 #include <linux/clk/renesas.h> 15 14 #include <linux/device.h> 16 15 #include <linux/io.h> ··· 18 19 #include <linux/of_address.h> 19 20 #include <linux/pm_clock.h> 20 21 #include <linux/pm_domain.h> 22 + #include <linux/slab.h> 21 23 #include <linux/spinlock.h> 22 24 23 25 /* ··· 237 237 238 238 clks[clkidx] = cpg_mstp_clock_register(name, parent_name, 239 239 clkidx, group); 240 - if (!IS_ERR(clks[clkidx])) { 240 + if (!IS_ERR(clks[clkidx])) 241 241 group->data.clk_num = max(group->data.clk_num, 242 242 clkidx + 1); 243 - /* 244 - * Register a clkdev to let board code retrieve the 245 - * clock by name and register aliases for non-DT 246 - * devices. 247 - * 248 - * FIXME: Remove this when all devices that require a 249 - * clock will be instantiated from DT. 250 - */ 251 - clk_register_clkdev(clks[clkidx], name, NULL); 252 - } else { 243 + else 253 244 pr_err("%s: failed to register %pOFn %s clock (%ld)\n", 254 245 __func__, np, name, PTR_ERR(clks[clkidx])); 255 - } 256 246 } 257 247 258 248 of_clk_add_provider(np, of_clk_src_onecell_get, &group->data);
+1 -1
drivers/clk/renesas/r8a779g0-cpg-mssr.c
··· 193 193 DEF_MOD("msi4", 622, R8A779G0_CLK_MSO), 194 194 DEF_MOD("msi5", 623, R8A779G0_CLK_MSO), 195 195 DEF_MOD("pciec0", 624, R8A779G0_CLK_S0D2_HSC), 196 - DEF_MOD("pscie1", 625, R8A779G0_CLK_S0D2_HSC), 196 + DEF_MOD("pciec1", 625, R8A779G0_CLK_S0D2_HSC), 197 197 DEF_MOD("pwm", 628, R8A779G0_CLK_SASYNCPERD4), 198 198 DEF_MOD("rpc-if", 629, R8A779G0_CLK_RPCD2), 199 199 DEF_MOD("scif0", 702, R8A779G0_CLK_SASYNCPERD4),
+249
drivers/clk/renesas/r8a779h0-cpg-mssr.c
··· 1 + // SPDX-License-Identifier: GPL-2.0 2 + /* 3 + * r8a779h0 Clock Pulse Generator / Module Standby and Software Reset 4 + * 5 + * Copyright (C) 2023 Renesas Electronics Corp. 6 + * 7 + * Based on r8a779g0-cpg-mssr.c 8 + */ 9 + 10 + #include <linux/bitfield.h> 11 + #include <linux/clk.h> 12 + #include <linux/clk-provider.h> 13 + #include <linux/device.h> 14 + #include <linux/err.h> 15 + #include <linux/kernel.h> 16 + #include <linux/soc/renesas/rcar-rst.h> 17 + 18 + #include <dt-bindings/clock/renesas,r8a779h0-cpg-mssr.h> 19 + 20 + #include "renesas-cpg-mssr.h" 21 + #include "rcar-gen4-cpg.h" 22 + 23 + enum clk_ids { 24 + /* Core Clock Outputs exported to DT */ 25 + LAST_DT_CORE_CLK = R8A779H0_CLK_R, 26 + 27 + /* External Input Clocks */ 28 + CLK_EXTAL, 29 + CLK_EXTALR, 30 + 31 + /* Internal Core Clocks */ 32 + CLK_MAIN, 33 + CLK_PLL1, 34 + CLK_PLL2, 35 + CLK_PLL3, 36 + CLK_PLL4, 37 + CLK_PLL5, 38 + CLK_PLL6, 39 + CLK_PLL1_DIV2, 40 + CLK_PLL2_DIV2, 41 + CLK_PLL3_DIV2, 42 + CLK_PLL4_DIV2, 43 + CLK_PLL4_DIV5, 44 + CLK_PLL5_DIV2, 45 + CLK_PLL5_DIV4, 46 + CLK_PLL6_DIV2, 47 + CLK_S0, 48 + CLK_S0_VIO, 49 + CLK_S0_VC, 50 + CLK_S0_HSC, 51 + CLK_SASYNCPER, 52 + CLK_SV_VIP, 53 + CLK_SV_IR, 54 + CLK_IMPASRC, 55 + CLK_IMPBSRC, 56 + CLK_VIOSRC, 57 + CLK_VCSRC, 58 + CLK_SDSRC, 59 + CLK_RPCSRC, 60 + CLK_OCO, 61 + 62 + /* Module Clocks */ 63 + MOD_CLK_BASE 64 + }; 65 + 66 + static const struct cpg_core_clk r8a779h0_core_clks[] = { 67 + /* External Clock Inputs */ 68 + DEF_INPUT("extal", CLK_EXTAL), 69 + DEF_INPUT("extalr", CLK_EXTALR), 70 + 71 + /* Internal Core Clocks */ 72 + DEF_BASE(".main", CLK_MAIN, CLK_TYPE_GEN4_MAIN, CLK_EXTAL), 73 + DEF_BASE(".pll1", CLK_PLL1, CLK_TYPE_GEN4_PLL1, CLK_MAIN), 74 + DEF_BASE(".pll2", CLK_PLL2, CLK_TYPE_GEN4_PLL2, CLK_MAIN), 75 + DEF_BASE(".pll3", CLK_PLL3, CLK_TYPE_GEN4_PLL3, CLK_MAIN), 76 + DEF_BASE(".pll4", CLK_PLL4, CLK_TYPE_GEN4_PLL4, CLK_MAIN), 77 + DEF_BASE(".pll5", CLK_PLL5, CLK_TYPE_GEN4_PLL5, CLK_MAIN), 78 + DEF_BASE(".pll6", CLK_PLL6, CLK_TYPE_GEN4_PLL6, CLK_MAIN), 79 + 80 + DEF_FIXED(".pll1_div2", CLK_PLL1_DIV2, CLK_PLL1, 2, 1), 81 + DEF_FIXED(".pll2_div2", CLK_PLL2_DIV2, CLK_PLL2, 2, 1), 82 + DEF_FIXED(".pll3_div2", CLK_PLL3_DIV2, CLK_PLL3, 2, 1), 83 + DEF_FIXED(".pll4_div2", CLK_PLL4_DIV2, CLK_PLL4, 2, 1), 84 + DEF_FIXED(".pll4_div5", CLK_PLL4_DIV5, CLK_PLL4, 5, 1), 85 + DEF_FIXED(".pll5_div2", CLK_PLL5_DIV2, CLK_PLL5, 2, 1), 86 + DEF_FIXED(".pll5_div4", CLK_PLL5_DIV4, CLK_PLL5_DIV2, 2, 1), 87 + DEF_FIXED(".pll6_div2", CLK_PLL6_DIV2, CLK_PLL6, 2, 1), 88 + DEF_FIXED(".s0", CLK_S0, CLK_PLL1_DIV2, 2, 1), 89 + DEF_FIXED(".s0_vio", CLK_S0_VIO, CLK_PLL1_DIV2, 2, 1), 90 + DEF_FIXED(".s0_vc", CLK_S0_VC, CLK_PLL1_DIV2, 2, 1), 91 + DEF_FIXED(".s0_hsc", CLK_S0_HSC, CLK_PLL1_DIV2, 2, 1), 92 + DEF_FIXED(".sasyncper", CLK_SASYNCPER, CLK_PLL5_DIV4, 3, 1), 93 + DEF_FIXED(".sv_vip", CLK_SV_VIP, CLK_PLL1, 5, 1), 94 + DEF_FIXED(".sv_ir", CLK_SV_IR, CLK_PLL1, 5, 1), 95 + DEF_FIXED(".impasrc", CLK_IMPASRC, CLK_PLL1_DIV2, 2, 1), 96 + DEF_FIXED(".impbsrc", CLK_IMPBSRC, CLK_PLL1, 4, 1), 97 + DEF_FIXED(".viosrc", CLK_VIOSRC, CLK_PLL1, 6, 1), 98 + DEF_FIXED(".vcsrc", CLK_VCSRC, CLK_PLL1, 6, 1), 99 + DEF_BASE(".sdsrc", CLK_SDSRC, CLK_TYPE_GEN4_SDSRC, CLK_PLL5), 100 + DEF_BASE(".rpcsrc", CLK_RPCSRC, CLK_TYPE_GEN4_RPCSRC, CLK_PLL5), 101 + DEF_RATE(".oco", CLK_OCO, 32768), 102 + 103 + /* Core Clock Outputs */ 104 + DEF_GEN4_Z("zc0", R8A779H0_CLK_ZC0, CLK_TYPE_GEN4_Z, CLK_PLL2_DIV2, 2, 0), 105 + DEF_GEN4_Z("zc1", R8A779H0_CLK_ZC1, CLK_TYPE_GEN4_Z, CLK_PLL2_DIV2, 2, 8), 106 + DEF_GEN4_Z("zc2", R8A779H0_CLK_ZC2, CLK_TYPE_GEN4_Z, CLK_PLL2_DIV2, 2, 32), 107 + DEF_GEN4_Z("zc3", R8A779H0_CLK_ZC3, CLK_TYPE_GEN4_Z, CLK_PLL2_DIV2, 2, 40), 108 + DEF_FIXED("s0d2", R8A779H0_CLK_S0D2, CLK_S0, 2, 1), 109 + DEF_FIXED("s0d3", R8A779H0_CLK_S0D3, CLK_S0, 3, 1), 110 + DEF_FIXED("s0d4", R8A779H0_CLK_S0D4, CLK_S0, 4, 1), 111 + DEF_FIXED("cl16m", R8A779H0_CLK_CL16M, CLK_S0, 48, 1), 112 + DEF_FIXED("s0d2_rt", R8A779H0_CLK_S0D2_RT, CLK_S0, 2, 1), 113 + DEF_FIXED("s0d3_rt", R8A779H0_CLK_S0D3_RT, CLK_S0, 3, 1), 114 + DEF_FIXED("s0d4_rt", R8A779H0_CLK_S0D4_RT, CLK_S0, 4, 1), 115 + DEF_FIXED("s0d6_rt", R8A779H0_CLK_S0D6_RT, CLK_S0, 6, 1), 116 + DEF_FIXED("cl16m_rt", R8A779H0_CLK_CL16M_RT, CLK_S0, 48, 1), 117 + DEF_FIXED("s0d2_per", R8A779H0_CLK_S0D2_PER, CLK_S0, 2, 1), 118 + DEF_FIXED("s0d3_per", R8A779H0_CLK_S0D3_PER, CLK_S0, 3, 1), 119 + DEF_FIXED("s0d4_per", R8A779H0_CLK_S0D4_PER, CLK_S0, 4, 1), 120 + DEF_FIXED("s0d6_per", R8A779H0_CLK_S0D6_PER, CLK_S0, 6, 1), 121 + DEF_FIXED("s0d12_per", R8A779H0_CLK_S0D12_PER, CLK_S0, 12, 1), 122 + DEF_FIXED("s0d24_per", R8A779H0_CLK_S0D24_PER, CLK_S0, 24, 1), 123 + DEF_FIXED("cl16m_per", R8A779H0_CLK_CL16M_PER, CLK_S0, 48, 1), 124 + DEF_FIXED("s0d2_mm", R8A779H0_CLK_S0D2_MM, CLK_S0, 2, 1), 125 + DEF_FIXED("s0d4_mm", R8A779H0_CLK_S0D4_MM, CLK_S0, 4, 1), 126 + DEF_FIXED("cl16m_mm", R8A779H0_CLK_CL16M_MM, CLK_S0, 48, 1), 127 + DEF_FIXED("s0d2_u3dg", R8A779H0_CLK_S0D2_U3DG, CLK_S0, 2, 1), 128 + DEF_FIXED("s0d4_u3dg", R8A779H0_CLK_S0D4_U3DG, CLK_S0, 4, 1), 129 + DEF_FIXED("s0d1_vio", R8A779H0_CLK_S0D1_VIO, CLK_S0_VIO, 1, 1), 130 + DEF_FIXED("s0d2_vio", R8A779H0_CLK_S0D2_VIO, CLK_S0_VIO, 2, 1), 131 + DEF_FIXED("s0d4_vio", R8A779H0_CLK_S0D4_VIO, CLK_S0_VIO, 4, 1), 132 + DEF_FIXED("s0d8_vio", R8A779H0_CLK_S0D8_VIO, CLK_S0_VIO, 8, 1), 133 + DEF_FIXED("s0d1_vc", R8A779H0_CLK_S0D1_VC, CLK_S0_VC, 1, 1), 134 + DEF_FIXED("s0d2_vc", R8A779H0_CLK_S0D2_VC, CLK_S0_VC, 2, 1), 135 + DEF_FIXED("s0d4_vc", R8A779H0_CLK_S0D4_VC, CLK_S0_VC, 4, 1), 136 + DEF_FIXED("s0d1_hsc", R8A779H0_CLK_S0D1_HSC, CLK_S0_HSC, 1, 1), 137 + DEF_FIXED("s0d2_hsc", R8A779H0_CLK_S0D2_HSC, CLK_S0_HSC, 2, 1), 138 + DEF_FIXED("s0d4_hsc", R8A779H0_CLK_S0D4_HSC, CLK_S0_HSC, 4, 1), 139 + DEF_FIXED("s0d8_hsc", R8A779H0_CLK_S0D8_HSC, CLK_S0_HSC, 8, 1), 140 + DEF_FIXED("cl16m_hsc", R8A779H0_CLK_CL16M_HSC, CLK_S0_HSC, 48, 1), 141 + DEF_FIXED("sasyncrt", R8A779H0_CLK_SASYNCRT, CLK_PLL5_DIV4, 48, 1), 142 + DEF_FIXED("sasyncperd1", R8A779H0_CLK_SASYNCPERD1, CLK_SASYNCPER, 1, 1), 143 + DEF_FIXED("sasyncperd2", R8A779H0_CLK_SASYNCPERD2, CLK_SASYNCPER, 2, 1), 144 + DEF_FIXED("sasyncperd4", R8A779H0_CLK_SASYNCPERD4, CLK_SASYNCPER, 4, 1), 145 + DEF_FIXED("svd1_vip", R8A779H0_CLK_SVD1_VIP, CLK_SV_VIP, 1, 1), 146 + DEF_FIXED("svd2_vip", R8A779H0_CLK_SVD2_VIP, CLK_SV_VIP, 2, 1), 147 + DEF_FIXED("svd1_ir", R8A779H0_CLK_SVD1_IR, CLK_SV_IR, 1, 1), 148 + DEF_FIXED("svd2_ir", R8A779H0_CLK_SVD2_IR, CLK_SV_IR, 2, 1), 149 + DEF_FIXED("cbfusa", R8A779H0_CLK_CBFUSA, CLK_EXTAL, 2, 1), 150 + DEF_FIXED("cpex", R8A779H0_CLK_CPEX, CLK_EXTAL, 2, 1), 151 + DEF_FIXED("cp", R8A779H0_CLK_CP, CLK_EXTAL, 2, 1), 152 + DEF_FIXED("impad1", R8A779H0_CLK_IMPAD1, CLK_IMPASRC, 1, 1), 153 + DEF_FIXED("impad4", R8A779H0_CLK_IMPAD4, CLK_IMPASRC, 4, 1), 154 + DEF_FIXED("impb", R8A779H0_CLK_IMPB, CLK_IMPBSRC, 1, 1), 155 + DEF_FIXED("viobusd1", R8A779H0_CLK_VIOBUSD1, CLK_VIOSRC, 1, 1), 156 + DEF_FIXED("viobusd2", R8A779H0_CLK_VIOBUSD2, CLK_VIOSRC, 2, 1), 157 + DEF_FIXED("vcbusd1", R8A779H0_CLK_VCBUSD1, CLK_VCSRC, 1, 1), 158 + DEF_FIXED("vcbusd2", R8A779H0_CLK_VCBUSD2, CLK_VCSRC, 2, 1), 159 + DEF_DIV6P1("canfd", R8A779H0_CLK_CANFD, CLK_PLL5_DIV4, 0x878), 160 + DEF_DIV6P1("csi", R8A779H0_CLK_CSI, CLK_PLL5_DIV4, 0x880), 161 + DEF_FIXED("dsiref", R8A779H0_CLK_DSIREF, CLK_PLL5_DIV4, 48, 1), 162 + DEF_DIV6P1("dsiext", R8A779H0_CLK_DSIEXT, CLK_PLL5_DIV4, 0x884), 163 + DEF_DIV6P1("mso", R8A779H0_CLK_MSO, CLK_PLL5_DIV4, 0x87c), 164 + 165 + DEF_GEN4_SDH("sd0h", R8A779H0_CLK_SD0H, CLK_SDSRC, 0x870), 166 + DEF_GEN4_SD("sd0", R8A779H0_CLK_SD0, R8A779H0_CLK_SD0H, 0x870), 167 + 168 + DEF_BASE("rpc", R8A779H0_CLK_RPC, CLK_TYPE_GEN4_RPC, CLK_RPCSRC), 169 + DEF_BASE("rpcd2", R8A779H0_CLK_RPCD2, CLK_TYPE_GEN4_RPCD2, R8A779H0_CLK_RPC), 170 + 171 + DEF_GEN4_OSC("osc", R8A779H0_CLK_OSC, CLK_EXTAL, 8), 172 + DEF_GEN4_MDSEL("r", R8A779H0_CLK_R, 29, CLK_EXTALR, 1, CLK_OCO, 1), 173 + }; 174 + 175 + static const struct mssr_mod_clk r8a779h0_mod_clks[] = { 176 + DEF_MOD("hscif0", 514, R8A779H0_CLK_SASYNCPERD1), 177 + DEF_MOD("hscif1", 515, R8A779H0_CLK_SASYNCPERD1), 178 + DEF_MOD("hscif2", 516, R8A779H0_CLK_SASYNCPERD1), 179 + DEF_MOD("hscif3", 517, R8A779H0_CLK_SASYNCPERD1), 180 + DEF_MOD("i2c0", 518, R8A779H0_CLK_S0D6_PER), 181 + DEF_MOD("i2c1", 519, R8A779H0_CLK_S0D6_PER), 182 + DEF_MOD("i2c2", 520, R8A779H0_CLK_S0D6_PER), 183 + DEF_MOD("i2c3", 521, R8A779H0_CLK_S0D6_PER), 184 + DEF_MOD("wdt1:wdt0", 907, R8A779H0_CLK_R), 185 + DEF_MOD("pfc0", 915, R8A779H0_CLK_CP), 186 + DEF_MOD("pfc1", 916, R8A779H0_CLK_CP), 187 + DEF_MOD("pfc2", 917, R8A779H0_CLK_CP), 188 + }; 189 + 190 + /* 191 + * CPG Clock Data 192 + */ 193 + /* 194 + * MD EXTAL PLL1 PLL2 PLL3 PLL4 PLL5 PLL6 OSC 195 + * 14 13 (MHz) 196 + * ------------------------------------------------------------------------ 197 + * 0 0 16.66 / 1 x192 x204 x192 x144 x192 x168 /16 198 + * 0 1 20 / 1 x160 x170 x160 x120 x160 x140 /19 199 + * 1 0 Prohibited setting 200 + * 1 1 33.33 / 2 x192 x204 x192 x144 x192 x168 /32 201 + */ 202 + #define CPG_PLL_CONFIG_INDEX(md) ((((md) & BIT(14)) >> 13) | \ 203 + (((md) & BIT(13)) >> 13)) 204 + 205 + static const struct rcar_gen4_cpg_pll_config cpg_pll_configs[4] = { 206 + /* EXTAL div PLL1 mult/div PLL2 mult/div PLL3 mult/div PLL4 mult/div PLL5 mult/div PLL6 mult/div OSC prediv */ 207 + { 1, 192, 1, 240, 1, 192, 1, 240, 1, 192, 1, 168, 1, 16, }, 208 + { 1, 160, 1, 200, 1, 160, 1, 200, 1, 160, 1, 140, 1, 19, }, 209 + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, 210 + { 2, 192, 1, 240, 1, 192, 1, 240, 1, 192, 1, 168, 1, 32, }, 211 + }; 212 + 213 + static int __init r8a779h0_cpg_mssr_init(struct device *dev) 214 + { 215 + const struct rcar_gen4_cpg_pll_config *cpg_pll_config; 216 + u32 cpg_mode; 217 + int error; 218 + 219 + error = rcar_rst_read_mode_pins(&cpg_mode); 220 + if (error) 221 + return error; 222 + 223 + cpg_pll_config = &cpg_pll_configs[CPG_PLL_CONFIG_INDEX(cpg_mode)]; 224 + if (!cpg_pll_config->extal_div) { 225 + dev_err(dev, "Prohibited setting (cpg_mode=0x%x)\n", cpg_mode); 226 + return -EINVAL; 227 + } 228 + 229 + return rcar_gen4_cpg_init(cpg_pll_config, CLK_EXTALR, cpg_mode); 230 + } 231 + 232 + const struct cpg_mssr_info r8a779h0_cpg_mssr_info __initconst = { 233 + /* Core Clocks */ 234 + .core_clks = r8a779h0_core_clks, 235 + .num_core_clks = ARRAY_SIZE(r8a779h0_core_clks), 236 + .last_dt_core_clk = LAST_DT_CORE_CLK, 237 + .num_total_core_clks = MOD_CLK_BASE, 238 + 239 + /* Module Clocks */ 240 + .mod_clks = r8a779h0_mod_clks, 241 + .num_mod_clks = ARRAY_SIZE(r8a779h0_mod_clks), 242 + .num_hw_mod_clks = 30 * 32, 243 + 244 + /* Callbacks */ 245 + .init = r8a779h0_cpg_mssr_init, 246 + .cpg_clk_register = rcar_gen4_cpg_clk_register, 247 + 248 + .reg_layout = CLK_REG_LAYOUT_RCAR_GEN4, 249 + };
+31
drivers/clk/renesas/r9a07g043-cpg.c
··· 48 48 CLK_SEL_PLL3_3, 49 49 CLK_DIV_PLL3_C, 50 50 #ifdef CONFIG_ARM64 51 + CLK_M2_DIV2, 51 52 CLK_PLL5, 52 53 CLK_PLL5_500, 53 54 CLK_PLL5_250, ··· 143 142 mtable_sdhi, 0, rzg2l_cpg_sd_clk_mux_notifier), 144 143 DEF_FIXED("SD0_DIV4", CLK_SD0_DIV4, R9A07G043_CLK_SD0, 1, 4), 145 144 DEF_FIXED("SD1_DIV4", CLK_SD1_DIV4, R9A07G043_CLK_SD1, 1, 4), 145 + #ifdef CONFIG_ARM64 146 + DEF_FIXED("M2", R9A07G043_CLK_M2, CLK_PLL3_533, 1, 2), 147 + DEF_FIXED("M2_DIV2", CLK_M2_DIV2, R9A07G043_CLK_M2, 1, 2), 148 + #endif 146 149 }; 147 150 148 151 static struct rzg2l_mod_clk r9a07g043_mod_clks[] = { ··· 200 195 0x554, 6), 201 196 DEF_MOD("sdhi1_aclk", R9A07G043_SDHI1_ACLK, R9A07G043_CLK_P1, 202 197 0x554, 7), 198 + #ifdef CONFIG_ARM64 199 + DEF_MOD("cru_sysclk", R9A07G043_CRU_SYSCLK, CLK_M2_DIV2, 200 + 0x564, 0), 201 + DEF_MOD("cru_vclk", R9A07G043_CRU_VCLK, R9A07G043_CLK_M2, 202 + 0x564, 1), 203 + DEF_MOD("cru_pclk", R9A07G043_CRU_PCLK, R9A07G043_CLK_ZT, 204 + 0x564, 2), 205 + DEF_MOD("cru_aclk", R9A07G043_CRU_ACLK, R9A07G043_CLK_M0, 206 + 0x564, 3), 207 + #endif 203 208 DEF_MOD("ssi0_pclk", R9A07G043_SSI0_PCLK2, R9A07G043_CLK_P0, 204 209 0x570, 0), 205 210 DEF_MOD("ssi0_sfr", R9A07G043_SSI0_PCLK_SFR, R9A07G043_CLK_P0, ··· 301 286 DEF_RST(R9A07G043_SPI_RST, 0x850, 0), 302 287 DEF_RST(R9A07G043_SDHI0_IXRST, 0x854, 0), 303 288 DEF_RST(R9A07G043_SDHI1_IXRST, 0x854, 1), 289 + #ifdef CONFIG_ARM64 290 + DEF_RST(R9A07G043_CRU_CMN_RSTB, 0x864, 0), 291 + DEF_RST(R9A07G043_CRU_PRESETN, 0x864, 1), 292 + DEF_RST(R9A07G043_CRU_ARESETN, 0x864, 2), 293 + #endif 304 294 DEF_RST(R9A07G043_SSI0_RST_M2_REG, 0x870, 0), 305 295 DEF_RST(R9A07G043_SSI1_RST_M2_REG, 0x870, 1), 306 296 DEF_RST(R9A07G043_SSI2_RST_M2_REG, 0x870, 2), ··· 351 331 MOD_CLK_BASE + R9A07G043_DMAC_ACLK, 352 332 }; 353 333 334 + #ifdef CONFIG_ARM64 335 + static const unsigned int r9a07g043_no_pm_mod_clks[] = { 336 + MOD_CLK_BASE + R9A07G043_CRU_SYSCLK, 337 + MOD_CLK_BASE + R9A07G043_CRU_VCLK, 338 + }; 339 + #endif 340 + 354 341 const struct rzg2l_cpg_info r9a07g043_cpg_info = { 355 342 /* Core Clocks */ 356 343 .core_clks = r9a07g043_core_clks, ··· 374 347 .num_mod_clks = ARRAY_SIZE(r9a07g043_mod_clks), 375 348 #ifdef CONFIG_ARM64 376 349 .num_hw_mod_clks = R9A07G043_TSU_PCLK + 1, 350 + 351 + /* No PM Module Clocks */ 352 + .no_pm_mod_clks = r9a07g043_no_pm_mod_clks, 353 + .num_no_pm_mod_clks = ARRAY_SIZE(r9a07g043_no_pm_mod_clks), 377 354 #endif 378 355 #ifdef CONFIG_RISCV 379 356 .num_hw_mod_clks = R9A07G043_IAX45_PCLK + 1,
+3
drivers/clk/renesas/r9a08g045-cpg.c
··· 193 193 DEF_MOD("ia55_pclk", R9A08G045_IA55_PCLK, R9A08G045_CLK_P2, 0x518, 0), 194 194 DEF_MOD("ia55_clk", R9A08G045_IA55_CLK, R9A08G045_CLK_P1, 0x518, 1), 195 195 DEF_MOD("dmac_aclk", R9A08G045_DMAC_ACLK, R9A08G045_CLK_P3, 0x52c, 0), 196 + DEF_MOD("wdt0_pclk", R9A08G045_WDT0_PCLK, R9A08G045_CLK_P0, 0x548, 0), 197 + DEF_MOD("wdt0_clk", R9A08G045_WDT0_CLK, R9A08G045_OSCCLK, 0x548, 1), 196 198 DEF_MOD("sdhi0_imclk", R9A08G045_SDHI0_IMCLK, CLK_SD0_DIV4, 0x554, 0), 197 199 DEF_MOD("sdhi0_imclk2", R9A08G045_SDHI0_IMCLK2, CLK_SD0_DIV4, 0x554, 1), 198 200 DEF_MOD("sdhi0_clk_hs", R9A08G045_SDHI0_CLK_HS, R9A08G045_CLK_SD0, 0x554, 2), ··· 221 219 DEF_RST(R9A08G045_GIC600_GICRESET_N, 0x814, 0), 222 220 DEF_RST(R9A08G045_GIC600_DBG_GICRESET_N, 0x814, 1), 223 221 DEF_RST(R9A08G045_IA55_RESETN, 0x818, 0), 222 + DEF_RST(R9A08G045_WDT0_PRESETN, 0x848, 0), 224 223 DEF_RST(R9A08G045_SDHI0_IXRST, 0x854, 0), 225 224 DEF_RST(R9A08G045_SDHI1_IXRST, 0x854, 1), 226 225 DEF_RST(R9A08G045_SDHI2_IXRST, 0x854, 2),
+8 -2
drivers/clk/renesas/rcar-gen4-cpg.c
··· 179 179 */ 180 180 #define CPG_FRQCRB 0x00000804 181 181 #define CPG_FRQCRB_KICK BIT(31) 182 - #define CPG_FRQCRC 0x00000808 182 + #define CPG_FRQCRC0 0x00000808 183 + #define CPG_FRQCRC1 0x000008e0 183 184 184 185 struct cpg_z_clk { 185 186 struct clk_hw hw; ··· 305 304 init.parent_names = &parent_name; 306 305 init.num_parents = 1; 307 306 308 - zclk->reg = reg + CPG_FRQCRC; 307 + if (offset < 32) { 308 + zclk->reg = reg + CPG_FRQCRC0; 309 + } else { 310 + zclk->reg = reg + CPG_FRQCRC1; 311 + offset -= 32; 312 + } 309 313 zclk->kick_reg = reg + CPG_FRQCRB; 310 314 zclk->hw.init = &init; 311 315 zclk->mask = GENMASK(offset + 4, offset);
+110 -7
drivers/clk/renesas/renesas-cpg-mssr.c
··· 142 142 * @reset_clear_regs: Pointer to reset clearing registers array 143 143 * @smstpcr_saved: [].mask: Mask of SMSTPCR[] bits under our control 144 144 * [].val: Saved values of SMSTPCR[] 145 + * @reserved_ids: Temporary used, reserved id list 146 + * @num_reserved_ids: Temporary used, number of reserved id list 145 147 * @clks: Array containing all Core and Module Clocks 146 148 */ 147 149 struct cpg_mssr_priv { ··· 169 167 u32 mask; 170 168 u32 val; 171 169 } smstpcr_saved[ARRAY_SIZE(mstpsr_for_gen4)]; 170 + 171 + unsigned int *reserved_ids; 172 + unsigned int num_reserved_ids; 172 173 173 174 struct clk *clks[]; 174 175 }; ··· 457 452 init.flags |= CLK_IS_CRITICAL; 458 453 break; 459 454 } 455 + 456 + /* 457 + * Ignore reserved device. 458 + * see 459 + * cpg_mssr_reserved_init() 460 + */ 461 + for (i = 0; i < priv->num_reserved_ids; i++) { 462 + if (id == priv->reserved_ids[i]) { 463 + dev_info(dev, "Ignore Linux non-assigned mod (%s)\n", mod->name); 464 + init.flags |= CLK_IGNORE_UNUSED; 465 + break; 466 + } 467 + } 460 468 461 469 clk = clk_register(NULL, &clock->hw); 462 470 if (IS_ERR(clk)) ··· 872 854 .data = &r8a779g0_cpg_mssr_info, 873 855 }, 874 856 #endif 857 + #ifdef CONFIG_CLK_R8A779H0 858 + { 859 + .compatible = "renesas,r8a779h0-cpg-mssr", 860 + .data = &r8a779h0_cpg_mssr_info, 861 + }, 862 + #endif 875 863 { /* sentinel */ } 876 864 }; 877 865 ··· 973 949 #define DEV_PM_OPS NULL 974 950 #endif /* CONFIG_PM_SLEEP && CONFIG_ARM_PSCI_FW */ 975 951 952 + static void __init cpg_mssr_reserved_exit(struct cpg_mssr_priv *priv) 953 + { 954 + kfree(priv->reserved_ids); 955 + } 956 + 957 + static int __init cpg_mssr_reserved_init(struct cpg_mssr_priv *priv, 958 + const struct cpg_mssr_info *info) 959 + { 960 + struct device_node *soc = of_find_node_by_path("/soc"); 961 + struct device_node *node; 962 + uint32_t args[MAX_PHANDLE_ARGS]; 963 + unsigned int *ids = NULL; 964 + unsigned int num = 0; 965 + 966 + /* 967 + * Because clk_disable_unused() will disable all unused clocks, the device which is assigned 968 + * to a non-Linux system will be disabled when Linux is booted. 969 + * 970 + * To avoid such situation, renesas-cpg-mssr assumes the device which has 971 + * status = "reserved" is assigned to a non-Linux system, and adds CLK_IGNORE_UNUSED flag 972 + * to its CPG_MOD clocks. 973 + * see also 974 + * cpg_mssr_register_mod_clk() 975 + * 976 + * scif5: serial@e6f30000 { 977 + * ... 978 + * => clocks = <&cpg CPG_MOD 202>, 979 + * <&cpg CPG_CORE R8A7795_CLK_S3D1>, 980 + * <&scif_clk>; 981 + * ... 982 + * status = "reserved"; 983 + * }; 984 + */ 985 + for_each_reserved_child_of_node(soc, node) { 986 + struct of_phandle_iterator it; 987 + int rc; 988 + 989 + of_for_each_phandle(&it, rc, node, "clocks", "#clock-cells", -1) { 990 + int idx; 991 + 992 + if (it.node != priv->np) 993 + continue; 994 + 995 + if (of_phandle_iterator_args(&it, args, MAX_PHANDLE_ARGS) != 2) 996 + continue; 997 + 998 + if (args[0] != CPG_MOD) 999 + continue; 1000 + 1001 + ids = krealloc_array(ids, (num + 1), sizeof(*ids), GFP_KERNEL); 1002 + if (!ids) { 1003 + of_node_put(it.node); 1004 + return -ENOMEM; 1005 + } 1006 + 1007 + if (priv->reg_layout == CLK_REG_LAYOUT_RZ_A) 1008 + idx = MOD_CLK_PACK_10(args[1]); /* for DEF_MOD_STB() */ 1009 + else 1010 + idx = MOD_CLK_PACK(args[1]); /* for DEF_MOD() */ 1011 + 1012 + ids[num] = info->num_total_core_clks + idx; 1013 + 1014 + num++; 1015 + } 1016 + } 1017 + 1018 + priv->num_reserved_ids = num; 1019 + priv->reserved_ids = ids; 1020 + 1021 + return 0; 1022 + } 1023 + 976 1024 static int __init cpg_mssr_common_init(struct device *dev, 977 1025 struct device_node *np, 978 1026 const struct cpg_mssr_info *info) ··· 1099 1003 for (i = 0; i < nclks; i++) 1100 1004 priv->clks[i] = ERR_PTR(-ENOENT); 1101 1005 1102 - error = of_clk_add_provider(np, cpg_mssr_clk_src_twocell_get, priv); 1006 + error = cpg_mssr_reserved_init(priv, info); 1103 1007 if (error) 1104 1008 goto out_err; 1009 + 1010 + error = of_clk_add_provider(np, cpg_mssr_clk_src_twocell_get, priv); 1011 + if (error) 1012 + goto reserve_err; 1105 1013 1106 1014 cpg_mssr_priv = priv; 1107 1015 1108 1016 return 0; 1109 1017 1018 + reserve_err: 1019 + cpg_mssr_reserved_exit(priv); 1110 1020 out_err: 1111 1021 if (priv->base) 1112 1022 iounmap(priv->base); ··· 1172 1070 cpg_mssr_del_clk_provider, 1173 1071 np); 1174 1072 if (error) 1175 - return error; 1073 + goto reserve_exit; 1176 1074 1177 1075 error = cpg_mssr_add_clk_domain(dev, info->core_pm_clks, 1178 1076 info->num_core_pm_clks); 1179 1077 if (error) 1180 - return error; 1078 + goto reserve_exit; 1181 1079 1182 1080 /* Reset Controller not supported for Standby Control SoCs */ 1183 1081 if (priv->reg_layout == CLK_REG_LAYOUT_RZ_A) 1184 - return 0; 1082 + goto reserve_exit; 1185 1083 1186 1084 error = cpg_mssr_reset_controller_register(priv); 1187 - if (error) 1188 - return error; 1189 1085 1190 - return 0; 1086 + reserve_exit: 1087 + cpg_mssr_reserved_exit(priv); 1088 + 1089 + return error; 1191 1090 } 1192 1091 1193 1092 static struct platform_driver cpg_mssr_driver = {
+1
drivers/clk/renesas/renesas-cpg-mssr.h
··· 180 180 extern const struct cpg_mssr_info r8a779a0_cpg_mssr_info; 181 181 extern const struct cpg_mssr_info r8a779f0_cpg_mssr_info; 182 182 extern const struct cpg_mssr_info r8a779g0_cpg_mssr_info; 183 + extern const struct cpg_mssr_info r8a779h0_cpg_mssr_info; 183 184 184 185 void __init cpg_mssr_early_init(struct device_node *np, 185 186 const struct cpg_mssr_info *info);
+87 -36
drivers/of/base.c
··· 415 415 } 416 416 EXPORT_SYMBOL(of_machine_is_compatible); 417 417 418 + static bool __of_device_is_status(const struct device_node *device, 419 + const char * const*strings) 420 + { 421 + const char *status; 422 + int statlen; 423 + 424 + if (!device) 425 + return false; 426 + 427 + status = __of_get_property(device, "status", &statlen); 428 + if (status == NULL) 429 + return false; 430 + 431 + if (statlen > 0) { 432 + while (*strings) { 433 + unsigned int len = strlen(*strings); 434 + 435 + if ((*strings)[len - 1] == '-') { 436 + if (!strncmp(status, *strings, len)) 437 + return true; 438 + } else { 439 + if (!strcmp(status, *strings)) 440 + return true; 441 + } 442 + strings++; 443 + } 444 + } 445 + 446 + return false; 447 + } 448 + 418 449 /** 419 450 * __of_device_is_available - check if a device is available for use 420 451 * ··· 456 425 */ 457 426 static bool __of_device_is_available(const struct device_node *device) 458 427 { 459 - const char *status; 460 - int statlen; 428 + static const char * const ok[] = {"okay", "ok", NULL}; 461 429 462 430 if (!device) 463 431 return false; 464 432 465 - status = __of_get_property(device, "status", &statlen); 466 - if (status == NULL) 467 - return true; 433 + return !__of_get_property(device, "status", NULL) || 434 + __of_device_is_status(device, ok); 435 + } 468 436 469 - if (statlen > 0) { 470 - if (!strcmp(status, "okay") || !strcmp(status, "ok")) 471 - return true; 472 - } 437 + /** 438 + * __of_device_is_reserved - check if a device is reserved 439 + * 440 + * @device: Node to check for availability, with locks already held 441 + * 442 + * Return: True if the status property is set to "reserved", false otherwise 443 + */ 444 + static bool __of_device_is_reserved(const struct device_node *device) 445 + { 446 + static const char * const reserved[] = {"reserved", NULL}; 473 447 474 - return false; 448 + return __of_device_is_status(device, reserved); 475 449 } 476 450 477 451 /** ··· 510 474 */ 511 475 static bool __of_device_is_fail(const struct device_node *device) 512 476 { 513 - const char *status; 477 + static const char * const fail[] = {"fail", "fail-", NULL}; 514 478 515 - if (!device) 516 - return false; 517 - 518 - status = __of_get_property(device, "status", NULL); 519 - if (status == NULL) 520 - return false; 521 - 522 - return !strcmp(status, "fail") || !strncmp(status, "fail-", 5); 479 + return __of_device_is_status(device, fail); 523 480 } 524 481 525 482 /** ··· 626 597 } 627 598 EXPORT_SYMBOL(of_get_next_child); 628 599 600 + static struct device_node *of_get_next_status_child(const struct device_node *node, 601 + struct device_node *prev, 602 + bool (*checker)(const struct device_node *)) 603 + { 604 + struct device_node *next; 605 + unsigned long flags; 606 + 607 + if (!node) 608 + return NULL; 609 + 610 + raw_spin_lock_irqsave(&devtree_lock, flags); 611 + next = prev ? prev->sibling : node->child; 612 + for (; next; next = next->sibling) { 613 + if (!checker(next)) 614 + continue; 615 + if (of_node_get(next)) 616 + break; 617 + } 618 + of_node_put(prev); 619 + raw_spin_unlock_irqrestore(&devtree_lock, flags); 620 + return next; 621 + } 622 + 629 623 /** 630 624 * of_get_next_available_child - Find the next available child node 631 625 * @node: parent node ··· 660 608 struct device_node *of_get_next_available_child(const struct device_node *node, 661 609 struct device_node *prev) 662 610 { 663 - struct device_node *next; 664 - unsigned long flags; 665 - 666 - if (!node) 667 - return NULL; 668 - 669 - raw_spin_lock_irqsave(&devtree_lock, flags); 670 - next = prev ? prev->sibling : node->child; 671 - for (; next; next = next->sibling) { 672 - if (!__of_device_is_available(next)) 673 - continue; 674 - if (of_node_get(next)) 675 - break; 676 - } 677 - of_node_put(prev); 678 - raw_spin_unlock_irqrestore(&devtree_lock, flags); 679 - return next; 611 + return of_get_next_status_child(node, prev, __of_device_is_available); 680 612 } 681 613 EXPORT_SYMBOL(of_get_next_available_child); 614 + 615 + /** 616 + * of_get_next_reserved_child - Find the next reserved child node 617 + * @node: parent node 618 + * @prev: previous child of the parent node, or NULL to get first 619 + * 620 + * This function is like of_get_next_child(), except that it 621 + * automatically skips any disabled nodes (i.e. status = "disabled"). 622 + */ 623 + struct device_node *of_get_next_reserved_child(const struct device_node *node, 624 + struct device_node *prev) 625 + { 626 + return of_get_next_status_child(node, prev, __of_device_is_reserved); 627 + } 628 + EXPORT_SYMBOL(of_get_next_reserved_child); 682 629 683 630 /** 684 631 * of_get_next_cpu_node - Iterate on cpu nodes
+96
include/dt-bindings/clock/renesas,r8a779h0-cpg-mssr.h
··· 1 + /* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */ 2 + /* 3 + * Copyright (C) 2023 Renesas Electronics Corp. 4 + */ 5 + #ifndef __DT_BINDINGS_CLOCK_RENESAS_R8A779H0_CPG_MSSR_H__ 6 + #define __DT_BINDINGS_CLOCK_RENESAS_R8A779H0_CPG_MSSR_H__ 7 + 8 + #include <dt-bindings/clock/renesas-cpg-mssr.h> 9 + 10 + /* r8a779h0 CPG Core Clocks */ 11 + 12 + #define R8A779H0_CLK_ZX 0 13 + #define R8A779H0_CLK_ZD 1 14 + #define R8A779H0_CLK_ZS 2 15 + #define R8A779H0_CLK_ZT 3 16 + #define R8A779H0_CLK_ZTR 4 17 + #define R8A779H0_CLK_S0D2 5 18 + #define R8A779H0_CLK_S0D3 6 19 + #define R8A779H0_CLK_S0D4 7 20 + #define R8A779H0_CLK_S0D1_VIO 8 21 + #define R8A779H0_CLK_S0D2_VIO 9 22 + #define R8A779H0_CLK_S0D4_VIO 10 23 + #define R8A779H0_CLK_S0D8_VIO 11 24 + #define R8A779H0_CLK_VIOBUSD1 12 25 + #define R8A779H0_CLK_VIOBUSD2 13 26 + #define R8A779H0_CLK_S0D1_VC 14 27 + #define R8A779H0_CLK_S0D2_VC 15 28 + #define R8A779H0_CLK_S0D4_VC 16 29 + #define R8A779H0_CLK_VCBUSD1 17 30 + #define R8A779H0_CLK_VCBUSD2 18 31 + #define R8A779H0_CLK_S0D2_MM 19 32 + #define R8A779H0_CLK_S0D4_MM 20 33 + #define R8A779H0_CLK_S0D2_U3DG 21 34 + #define R8A779H0_CLK_S0D4_U3DG 22 35 + #define R8A779H0_CLK_S0D2_RT 23 36 + #define R8A779H0_CLK_S0D3_RT 24 37 + #define R8A779H0_CLK_S0D4_RT 25 38 + #define R8A779H0_CLK_S0D6_RT 26 39 + #define R8A779H0_CLK_S0D2_PER 27 40 + #define R8A779H0_CLK_S0D3_PER 28 41 + #define R8A779H0_CLK_S0D4_PER 29 42 + #define R8A779H0_CLK_S0D6_PER 30 43 + #define R8A779H0_CLK_S0D12_PER 31 44 + #define R8A779H0_CLK_S0D24_PER 32 45 + #define R8A779H0_CLK_S0D1_HSC 33 46 + #define R8A779H0_CLK_S0D2_HSC 34 47 + #define R8A779H0_CLK_S0D4_HSC 35 48 + #define R8A779H0_CLK_S0D8_HSC 36 49 + #define R8A779H0_CLK_SVD1_IR 37 50 + #define R8A779H0_CLK_SVD2_IR 38 51 + #define R8A779H0_CLK_IMPAD1 39 52 + #define R8A779H0_CLK_IMPAD4 40 53 + #define R8A779H0_CLK_IMPB 41 54 + #define R8A779H0_CLK_SVD1_VIP 42 55 + #define R8A779H0_CLK_SVD2_VIP 43 56 + #define R8A779H0_CLK_CL 44 57 + #define R8A779H0_CLK_CL16M 45 58 + #define R8A779H0_CLK_CL16M_MM 46 59 + #define R8A779H0_CLK_CL16M_RT 47 60 + #define R8A779H0_CLK_CL16M_PER 48 61 + #define R8A779H0_CLK_CL16M_HSC 49 62 + #define R8A779H0_CLK_ZC0 50 63 + #define R8A779H0_CLK_ZC1 51 64 + #define R8A779H0_CLK_ZC2 52 65 + #define R8A779H0_CLK_ZC3 53 66 + #define R8A779H0_CLK_ZB3 54 67 + #define R8A779H0_CLK_ZB3D2 55 68 + #define R8A779H0_CLK_ZB3D4 56 69 + #define R8A779H0_CLK_ZG 57 70 + #define R8A779H0_CLK_SD0H 58 71 + #define R8A779H0_CLK_SD0 59 72 + #define R8A779H0_CLK_RPC 60 73 + #define R8A779H0_CLK_RPCD2 61 74 + #define R8A779H0_CLK_MSO 62 75 + #define R8A779H0_CLK_CANFD 63 76 + #define R8A779H0_CLK_CSI 64 77 + #define R8A779H0_CLK_FRAY 65 78 + #define R8A779H0_CLK_IPC 66 79 + #define R8A779H0_CLK_SASYNCRT 67 80 + #define R8A779H0_CLK_SASYNCPERD1 68 81 + #define R8A779H0_CLK_SASYNCPERD2 69 82 + #define R8A779H0_CLK_SASYNCPERD4 70 83 + #define R8A779H0_CLK_DSIEXT 71 84 + #define R8A779H0_CLK_DSIREF 72 85 + #define R8A779H0_CLK_ADGH 73 86 + #define R8A779H0_CLK_OSC 74 87 + #define R8A779H0_CLK_ZR0 75 88 + #define R8A779H0_CLK_ZR1 76 89 + #define R8A779H0_CLK_ZR2 77 90 + #define R8A779H0_CLK_RGMII 78 91 + #define R8A779H0_CLK_CPEX 79 92 + #define R8A779H0_CLK_CP 80 93 + #define R8A779H0_CLK_CBFUSA 81 94 + #define R8A779H0_CLK_R 82 95 + 96 + #endif /* __DT_BINDINGS_CLOCK_RENESAS_R8A779H0_CPG_MSSR_H__ */
+49
include/dt-bindings/power/renesas,r8a779h0-sysc.h
··· 1 + /* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */ 2 + /* 3 + * Copyright (C) 2023 Renesas Electronics Corp. 4 + */ 5 + #ifndef __DT_BINDINGS_POWER_RENESAS_R8A779H0_SYSC_H__ 6 + #define __DT_BINDINGS_POWER_RENESAS_R8A779H0_SYSC_H__ 7 + 8 + /* 9 + * These power domain indices match the Power Domain Register Numbers (PDR) 10 + */ 11 + 12 + #define R8A779H0_PD_A1E0D0C0 0 13 + #define R8A779H0_PD_A1E0D0C1 1 14 + #define R8A779H0_PD_A1E0D0C2 2 15 + #define R8A779H0_PD_A1E0D0C3 3 16 + #define R8A779H0_PD_A2E0D0 16 17 + #define R8A779H0_PD_A3CR0 21 18 + #define R8A779H0_PD_A3CR1 22 19 + #define R8A779H0_PD_A3CR2 23 20 + #define R8A779H0_PD_A33DGA 24 21 + #define R8A779H0_PD_A23DGB 25 22 + #define R8A779H0_PD_C4 31 23 + #define R8A779H0_PD_A1DSP0 33 24 + #define R8A779H0_PD_A2IMP01 34 25 + #define R8A779H0_PD_A2PSC 35 26 + #define R8A779H0_PD_A2CV0 36 27 + #define R8A779H0_PD_A2CV1 37 28 + #define R8A779H0_PD_A3IMR0 38 29 + #define R8A779H0_PD_A3IMR1 39 30 + #define R8A779H0_PD_A3VC 40 31 + #define R8A779H0_PD_A2CN0 42 32 + #define R8A779H0_PD_A1CN0 44 33 + #define R8A779H0_PD_A1DSP1 45 34 + #define R8A779H0_PD_A2DMA 47 35 + #define R8A779H0_PD_A2CV2 48 36 + #define R8A779H0_PD_A2CV3 49 37 + #define R8A779H0_PD_A3IMR2 50 38 + #define R8A779H0_PD_A3IMR3 51 39 + #define R8A779H0_PD_A3PCI 52 40 + #define R8A779H0_PD_A2PCIPHY 53 41 + #define R8A779H0_PD_A3VIP0 56 42 + #define R8A779H0_PD_A3VIP2 58 43 + #define R8A779H0_PD_A3ISP0 60 44 + #define R8A779H0_PD_A3DUL 62 45 + 46 + /* Always-on power area */ 47 + #define R8A779H0_PD_ALWAYS_ON 64 48 + 49 + #endif /* __DT_BINDINGS_POWER_RENESAS_R8A779H0_SYSC_H__ */
+11
include/linux/of.h
··· 294 294 struct device_node *prev); 295 295 extern struct device_node *of_get_next_available_child( 296 296 const struct device_node *node, struct device_node *prev); 297 + extern struct device_node *of_get_next_reserved_child( 298 + const struct device_node *node, struct device_node *prev); 297 299 298 300 extern struct device_node *of_get_compatible_child(const struct device_node *parent, 299 301 const char *compatible); ··· 538 536 } 539 537 540 538 static inline struct device_node *of_get_next_available_child( 539 + const struct device_node *node, struct device_node *prev) 540 + { 541 + return NULL; 542 + } 543 + 544 + static inline struct device_node *of_get_next_reserved_child( 541 545 const struct device_node *node, struct device_node *prev) 542 546 { 543 547 return NULL; ··· 1439 1431 #define for_each_available_child_of_node(parent, child) \ 1440 1432 for (child = of_get_next_available_child(parent, NULL); child != NULL; \ 1441 1433 child = of_get_next_available_child(parent, child)) 1434 + #define for_each_reserved_child_of_node(parent, child) \ 1435 + for (child = of_get_next_reserved_child(parent, NULL); child != NULL; \ 1436 + child = of_get_next_reserved_child(parent, child)) 1442 1437 1443 1438 #define for_each_of_cpu_node(cpu) \ 1444 1439 for (cpu = of_get_next_cpu_node(NULL); cpu != NULL; \