1 // SPDX-License-Identifier: GPL-2.0 2 /* 3 * RZ/V2M Clock Pulse Generator / Module Standby and Software Reset 4 * 5 * Copyright (C) 2022 Renesas Electronics Corp. 6 * 7 * Based on r9a07g044-cpg.c 8 */ 9 10 #include <linux/clk-provider.h> 11 #include <linux/device.h> 12 #include <linux/init.h> 13 #include <linux/kernel.h> 14 15 #include <dt-bindings/clock/r9a09g011-cpg.h> 16 17 #include "rzg2l-cpg.h" 18 19 #define DIV_A DDIV_PACK(0x200, 0, 3) 20 #define DIV_B DDIV_PACK(0x204, 0, 2) 21 #define DIV_D DDIV_PACK(0x204, 4, 2) 22 #define DIV_E DDIV_PACK(0x204, 8, 1) 23 #define DIV_W DDIV_PACK(0x328, 0, 3) 24 25 #define SEL_B SEL_PLL_PACK(0x214, 0, 1) 26 #define SEL_CSI0 SEL_PLL_PACK(0x330, 0, 1) 27 #define SEL_CSI4 SEL_PLL_PACK(0x330, 4, 1) 28 #define SEL_D SEL_PLL_PACK(0x214, 1, 1) 29 #define SEL_E SEL_PLL_PACK(0x214, 2, 1) 30 #define SEL_SDI SEL_PLL_PACK(0x300, 0, 1) 31 #define SEL_W0 SEL_PLL_PACK(0x32C, 0, 1) 32 33 enum clk_ids { 34 /* Core Clock Outputs exported to DT */ 35 LAST_DT_CORE_CLK = 0, 36 37 /* External Input Clocks */ 38 CLK_EXTAL, 39 40 /* Internal Core Clocks */ 41 CLK_MAIN, 42 CLK_MAIN_24, 43 CLK_MAIN_2, 44 CLK_PLL1, 45 CLK_PLL2, 46 CLK_PLL2_800, 47 CLK_PLL2_400, 48 CLK_PLL2_200, 49 CLK_PLL2_100, 50 CLK_PLL4, 51 CLK_DIV_A, 52 CLK_DIV_B, 53 CLK_DIV_D, 54 CLK_DIV_E, 55 CLK_DIV_W, 56 CLK_SEL_B, 57 CLK_SEL_B_D2, 58 CLK_SEL_CSI0, 59 CLK_SEL_CSI4, 60 CLK_SEL_D, 61 CLK_SEL_E, 62 CLK_SEL_SDI, 63 CLK_SEL_W0, 64 65 /* Module Clocks */ 66 MOD_CLK_BASE 67 }; 68 69 /* Divider tables */ 70 static const struct clk_div_table dtable_diva[] = { 71 {0, 1}, 72 {1, 2}, 73 {2, 3}, 74 {3, 4}, 75 {4, 6}, 76 {5, 12}, 77 {6, 24}, 78 {0, 0}, 79 }; 80 81 static const struct clk_div_table dtable_divb[] = { 82 {0, 1}, 83 {1, 2}, 84 {2, 4}, 85 {3, 8}, 86 {0, 0}, 87 }; 88 89 static const struct clk_div_table dtable_divd[] = { 90 {0, 1}, 91 {1, 2}, 92 {2, 4}, 93 {0, 0}, 94 }; 95 96 static const struct clk_div_table dtable_divw[] = { 97 {0, 6}, 98 {1, 7}, 99 {2, 8}, 100 {3, 9}, 101 {4, 10}, 102 {5, 11}, 103 {6, 12}, 104 {0, 0}, 105 }; 106 107 /* Mux clock tables */ 108 static const char * const sel_b[] = { ".main", ".divb" }; 109 static const char * const sel_csi[] = { ".main_24", ".main" }; 110 static const char * const sel_d[] = { ".main", ".divd" }; 111 static const char * const sel_e[] = { ".main", ".dive" }; 112 static const char * const sel_w[] = { ".main", ".divw" }; 113 static const char * const sel_sdi[] = { ".main", ".pll2_200" }; 114 115 static const struct cpg_core_clk r9a09g011_core_clks[] __initconst = { 116 /* External Clock Inputs */ 117 DEF_INPUT("extal", CLK_EXTAL), 118 119 /* Internal Core Clocks */ 120 DEF_FIXED(".main", CLK_MAIN, CLK_EXTAL, 1, 1), 121 DEF_FIXED(".main_24", CLK_MAIN_24, CLK_MAIN, 1, 2), 122 DEF_FIXED(".main_2", CLK_MAIN_2, CLK_MAIN, 1, 24), 123 DEF_FIXED(".pll1", CLK_PLL1, CLK_MAIN_2, 498, 1), 124 DEF_FIXED(".pll2", CLK_PLL2, CLK_MAIN_2, 800, 1), 125 DEF_FIXED(".pll2_800", CLK_PLL2_800, CLK_PLL2, 1, 2), 126 DEF_FIXED(".pll2_400", CLK_PLL2_400, CLK_PLL2_800, 1, 2), 127 DEF_FIXED(".pll2_200", CLK_PLL2_200, CLK_PLL2_800, 1, 4), 128 DEF_FIXED(".pll2_100", CLK_PLL2_100, CLK_PLL2_800, 1, 8), 129 DEF_SAMPLL(".pll4", CLK_PLL4, CLK_MAIN_2, CPG_SAM_PLL_CONF(0x100)), 130 131 DEF_DIV_RO(".diva", CLK_DIV_A, CLK_PLL1, DIV_A, dtable_diva), 132 DEF_DIV_RO(".divb", CLK_DIV_B, CLK_PLL2_400, DIV_B, dtable_divb), 133 DEF_DIV_RO(".divd", CLK_DIV_D, CLK_PLL2_200, DIV_D, dtable_divd), 134 DEF_DIV_RO(".dive", CLK_DIV_E, CLK_PLL2_100, DIV_E, NULL), 135 DEF_DIV_RO(".divw", CLK_DIV_W, CLK_PLL4, DIV_W, dtable_divw), 136 137 DEF_MUX_RO(".selb", CLK_SEL_B, SEL_B, sel_b), 138 DEF_MUX_RO(".seld", CLK_SEL_D, SEL_D, sel_d), 139 DEF_MUX_RO(".sele", CLK_SEL_E, SEL_E, sel_e), 140 DEF_MUX(".selsdi", CLK_SEL_SDI, SEL_SDI, sel_sdi), 141 DEF_MUX(".selcsi0", CLK_SEL_CSI0, SEL_CSI0, sel_csi), 142 DEF_MUX(".selcsi4", CLK_SEL_CSI4, SEL_CSI4, sel_csi), 143 DEF_MUX(".selw0", CLK_SEL_W0, SEL_W0, sel_w), 144 145 DEF_FIXED(".selb_d2", CLK_SEL_B_D2, CLK_SEL_B, 1, 2), 146 }; 147 148 static const struct rzg2l_mod_clk r9a09g011_mod_clks[] __initconst = { 149 DEF_MOD("pfc", R9A09G011_PFC_PCLK, CLK_MAIN, 0x400, 2, 0), 150 DEF_MOD("gic", R9A09G011_GIC_CLK, CLK_SEL_B_D2, 0x400, 5, 0), 151 DEF_MOD("sdi0_aclk", R9A09G011_SDI0_ACLK, CLK_SEL_D, 0x408, 0, 0), 152 DEF_MOD("sdi0_imclk", R9A09G011_SDI0_IMCLK, CLK_SEL_SDI, 0x408, 1, 0), 153 DEF_MOD("sdi0_imclk2", R9A09G011_SDI0_IMCLK2, CLK_SEL_SDI, 0x408, 2, 0), 154 DEF_MOD("sdi0_clk_hs", R9A09G011_SDI0_CLK_HS, CLK_PLL2_800, 0x408, 3, 0), 155 DEF_MOD("sdi1_aclk", R9A09G011_SDI1_ACLK, CLK_SEL_D, 0x408, 4, 0), 156 DEF_MOD("sdi1_imclk", R9A09G011_SDI1_IMCLK, CLK_SEL_SDI, 0x408, 5, 0), 157 DEF_MOD("sdi1_imclk2", R9A09G011_SDI1_IMCLK2, CLK_SEL_SDI, 0x408, 6, 0), 158 DEF_MOD("sdi1_clk_hs", R9A09G011_SDI1_CLK_HS, CLK_PLL2_800, 0x408, 7, 0), 159 DEF_MOD("emm_aclk", R9A09G011_EMM_ACLK, CLK_SEL_D, 0x408, 8, 0), 160 DEF_MOD("emm_imclk", R9A09G011_EMM_IMCLK, CLK_SEL_SDI, 0x408, 9, 0), 161 DEF_MOD("emm_imclk2", R9A09G011_EMM_IMCLK2, CLK_SEL_SDI, 0x408, 10, 0), 162 DEF_MOD("emm_clk_hs", R9A09G011_EMM_CLK_HS, CLK_PLL2_800, 0x408, 11, 0), 163 DEF_COUPLED("eth_axi", R9A09G011_ETH0_CLK_AXI, CLK_PLL2_200, 0x40c, 8, 0), 164 DEF_COUPLED("eth_chi", R9A09G011_ETH0_CLK_CHI, CLK_PLL2_100, 0x40c, 8, 0), 165 DEF_MOD("eth_clk_gptp", R9A09G011_ETH0_GPTP_EXT, CLK_PLL2_100, 0x40c, 9, 0), 166 DEF_MOD("usb_aclk_h", R9A09G011_USB_ACLK_H, CLK_SEL_D, 0x40c, 4, 0), 167 DEF_MOD("usb_aclk_p", R9A09G011_USB_ACLK_P, CLK_SEL_D, 0x40c, 5, 0), 168 DEF_MOD("usb_pclk", R9A09G011_USB_PCLK, CLK_SEL_E, 0x40c, 6, 0), 169 DEF_MOD("syc_cnt_clk", R9A09G011_SYC_CNT_CLK, CLK_MAIN_24, 0x41c, 12, 0), 170 DEF_MOD("iic_pclk0", R9A09G011_IIC_PCLK0, CLK_SEL_E, 0x420, 12, 0), 171 DEF_MOD("cperi_grpb", R9A09G011_CPERI_GRPB_PCLK, CLK_SEL_E, 0x424, 0, 0), 172 DEF_MOD("tim_clk_8", R9A09G011_TIM8_CLK, CLK_MAIN_2, 0x424, 4, 0), 173 DEF_MOD("tim_clk_9", R9A09G011_TIM9_CLK, CLK_MAIN_2, 0x424, 5, 0), 174 DEF_MOD("tim_clk_10", R9A09G011_TIM10_CLK, CLK_MAIN_2, 0x424, 6, 0), 175 DEF_MOD("tim_clk_11", R9A09G011_TIM11_CLK, CLK_MAIN_2, 0x424, 7, 0), 176 DEF_MOD("tim_clk_12", R9A09G011_TIM12_CLK, CLK_MAIN_2, 0x424, 8, 0), 177 DEF_MOD("tim_clk_13", R9A09G011_TIM13_CLK, CLK_MAIN_2, 0x424, 9, 0), 178 DEF_MOD("tim_clk_14", R9A09G011_TIM14_CLK, CLK_MAIN_2, 0x424, 10, 0), 179 DEF_MOD("tim_clk_15", R9A09G011_TIM15_CLK, CLK_MAIN_2, 0x424, 11, 0), 180 DEF_MOD("iic_pclk1", R9A09G011_IIC_PCLK1, CLK_SEL_E, 0x424, 12, 0), 181 DEF_MOD("cperi_grpc", R9A09G011_CPERI_GRPC_PCLK, CLK_SEL_E, 0x428, 0, 0), 182 DEF_MOD("tim_clk_16", R9A09G011_TIM16_CLK, CLK_MAIN_2, 0x428, 4, 0), 183 DEF_MOD("tim_clk_17", R9A09G011_TIM17_CLK, CLK_MAIN_2, 0x428, 5, 0), 184 DEF_MOD("tim_clk_18", R9A09G011_TIM18_CLK, CLK_MAIN_2, 0x428, 6, 0), 185 DEF_MOD("tim_clk_19", R9A09G011_TIM19_CLK, CLK_MAIN_2, 0x428, 7, 0), 186 DEF_MOD("tim_clk_20", R9A09G011_TIM20_CLK, CLK_MAIN_2, 0x428, 8, 0), 187 DEF_MOD("tim_clk_21", R9A09G011_TIM21_CLK, CLK_MAIN_2, 0x428, 9, 0), 188 DEF_MOD("tim_clk_22", R9A09G011_TIM22_CLK, CLK_MAIN_2, 0x428, 10, 0), 189 DEF_MOD("tim_clk_23", R9A09G011_TIM23_CLK, CLK_MAIN_2, 0x428, 11, 0), 190 DEF_MOD("wdt0_pclk", R9A09G011_WDT0_PCLK, CLK_SEL_E, 0x428, 12, 0), 191 DEF_MOD("wdt0_clk", R9A09G011_WDT0_CLK, CLK_MAIN, 0x428, 13, 0), 192 DEF_MOD("cperi_grpf", R9A09G011_CPERI_GRPF_PCLK, CLK_SEL_E, 0x434, 0, 0), 193 DEF_MOD("pwm8_clk", R9A09G011_PWM8_CLK, CLK_MAIN, 0x434, 4, 0), 194 DEF_MOD("pwm9_clk", R9A09G011_PWM9_CLK, CLK_MAIN, 0x434, 5, 0), 195 DEF_MOD("pwm10_clk", R9A09G011_PWM10_CLK, CLK_MAIN, 0x434, 6, 0), 196 DEF_MOD("pwm11_clk", R9A09G011_PWM11_CLK, CLK_MAIN, 0x434, 7, 0), 197 DEF_MOD("pwm12_clk", R9A09G011_PWM12_CLK, CLK_MAIN, 0x434, 8, 0), 198 DEF_MOD("pwm13_clk", R9A09G011_PWM13_CLK, CLK_MAIN, 0x434, 9, 0), 199 DEF_MOD("pwm14_clk", R9A09G011_PWM14_CLK, CLK_MAIN, 0x434, 10, 0), 200 DEF_MOD("cperi_grpg", R9A09G011_CPERI_GRPG_PCLK, CLK_SEL_E, 0x438, 0, 0), 201 DEF_MOD("cperi_grph", R9A09G011_CPERI_GRPH_PCLK, CLK_SEL_E, 0x438, 1, 0), 202 DEF_MOD("urt_pclk", R9A09G011_URT_PCLK, CLK_SEL_E, 0x438, 4, 0), 203 DEF_MOD("urt0_clk", R9A09G011_URT0_CLK, CLK_SEL_W0, 0x438, 5, 0), 204 DEF_MOD("csi0_clk", R9A09G011_CSI0_CLK, CLK_SEL_CSI0, 0x438, 8, 0), 205 DEF_MOD("csi4_clk", R9A09G011_CSI4_CLK, CLK_SEL_CSI4, 0x438, 12, 0), 206 DEF_MOD("ca53", R9A09G011_CA53_CLK, CLK_DIV_A, 0x448, 0, 0), 207 }; 208 209 static const struct rzg2l_reset r9a09g011_resets[] = { 210 DEF_RST(R9A09G011_PFC_PRESETN, 0x600, 2), 211 DEF_RST_MON(R9A09G011_SDI0_IXRST, 0x608, 0, 6), 212 DEF_RST_MON(R9A09G011_SDI1_IXRST, 0x608, 1, 7), 213 DEF_RST_MON(R9A09G011_EMM_IXRST, 0x608, 2, 8), 214 DEF_RST(R9A09G011_USB_PRESET_N, 0x608, 7), 215 DEF_RST(R9A09G011_USB_DRD_RESET, 0x608, 8), 216 DEF_RST(R9A09G011_USB_ARESETN_P, 0x608, 9), 217 DEF_RST(R9A09G011_USB_ARESETN_H, 0x608, 10), 218 DEF_RST_MON(R9A09G011_ETH0_RST_HW_N, 0x608, 11, 11), 219 DEF_RST_MON(R9A09G011_SYC_RST_N, 0x610, 9, 13), 220 DEF_RST(R9A09G011_TIM_GPB_PRESETN, 0x614, 1), 221 DEF_RST(R9A09G011_TIM_GPC_PRESETN, 0x614, 2), 222 DEF_RST_MON(R9A09G011_PWM_GPF_PRESETN, 0x614, 5, 23), 223 DEF_RST_MON(R9A09G011_CSI_GPG_PRESETN, 0x614, 6, 22), 224 DEF_RST_MON(R9A09G011_CSI_GPH_PRESETN, 0x614, 7, 23), 225 DEF_RST(R9A09G011_IIC_GPA_PRESETN, 0x614, 8), 226 DEF_RST(R9A09G011_IIC_GPB_PRESETN, 0x614, 9), 227 DEF_RST_MON(R9A09G011_WDT0_PRESETN, 0x614, 12, 19), 228 }; 229 230 static const unsigned int r9a09g011_crit_mod_clks[] __initconst = { 231 MOD_CLK_BASE + R9A09G011_CA53_CLK, 232 MOD_CLK_BASE + R9A09G011_CPERI_GRPB_PCLK, 233 MOD_CLK_BASE + R9A09G011_CPERI_GRPC_PCLK, 234 MOD_CLK_BASE + R9A09G011_CPERI_GRPF_PCLK, 235 MOD_CLK_BASE + R9A09G011_CPERI_GRPG_PCLK, 236 MOD_CLK_BASE + R9A09G011_CPERI_GRPH_PCLK, 237 MOD_CLK_BASE + R9A09G011_GIC_CLK, 238 MOD_CLK_BASE + R9A09G011_SYC_CNT_CLK, 239 MOD_CLK_BASE + R9A09G011_URT_PCLK, 240 }; 241 242 const struct rzg2l_cpg_info r9a09g011_cpg_info = { 243 /* Core Clocks */ 244 .core_clks = r9a09g011_core_clks, 245 .num_core_clks = ARRAY_SIZE(r9a09g011_core_clks), 246 .last_dt_core_clk = LAST_DT_CORE_CLK, 247 .num_total_core_clks = MOD_CLK_BASE, 248 249 /* Critical Module Clocks */ 250 .crit_mod_clks = r9a09g011_crit_mod_clks, 251 .num_crit_mod_clks = ARRAY_SIZE(r9a09g011_crit_mod_clks), 252 253 /* Module Clocks */ 254 .mod_clks = r9a09g011_mod_clks, 255 .num_mod_clks = ARRAY_SIZE(r9a09g011_mod_clks), 256 .num_hw_mod_clks = R9A09G011_CA53_CLK + 1, 257 258 /* Resets */ 259 .resets = r9a09g011_resets, 260 .num_resets = ARRAY_SIZE(r9a09g011_resets), 261 262 .has_clk_mon_regs = false, 263 }; 264