developer | 15adbbf | 2021-05-24 22:20:07 +0800 | [diff] [blame] | 1 | /*
|
| 2 | * Copyright (c) 2021 MediaTek Inc.
|
| 3 | * Author: Wenzhen Yu<Yenzhen.Yu@mediatek.com>
|
| 4 | *
|
| 5 | * This program is free software; you can redistribute it and/or modify
|
| 6 | * it under the terms of the GNU General Public License version 2 as
|
| 7 | * published by the Free Software Foundation.
|
| 8 | *
|
| 9 | * This program is distributed in the hope that it will be useful,
|
| 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
| 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
| 12 | * GNU General Public License for more details.
|
| 13 | */
|
| 14 |
|
| 15 | #include <linux/clk.h>
|
| 16 | #include <linux/delay.h>
|
| 17 | #include <linux/of.h>
|
| 18 | #include <linux/of_address.h>
|
| 19 | #include <linux/slab.h>
|
| 20 | #include <linux/mfd/syscon.h>
|
| 21 |
|
| 22 | #include "clk-mtk.h"
|
| 23 | #include "clk-gate.h"
|
| 24 | #include "clk-mux.h"
|
| 25 |
|
| 26 |
|
| 27 | #include <dt-bindings/clock/mt7986-clk.h>
|
| 28 |
|
| 29 | static DEFINE_SPINLOCK(mt7986_clk_lock);
|
| 30 |
|
| 31 |
|
| 32 |
|
| 33 | static const struct mtk_fixed_factor infra_divs[] __initconst = {
|
| 34 | FACTOR(CK_INFRA_CK_F26M, "infra_ck_f26m", "csw_f26m_sel", 1, 1),
|
| 35 | FACTOR(CK_INFRA_UART, "infra_uart", "uart_sel", 1, 1),
|
| 36 | FACTOR(CK_INFRA_ISPI0, "infra_ispi0", "spi_sel", 1, 1),
|
| 37 | FACTOR(CK_INFRA_I2C, "infra_i2c", "i2c_sel", 1, 1),
|
| 38 | FACTOR(CK_INFRA_ISPI1, "infra_ispi1", "spinfi_sel", 1, 1),
|
| 39 | FACTOR(CK_INFRA_PWM, "infra_pwm", "pwm_sel", 1, 1),
|
| 40 | FACTOR(CK_INFRA_66M_MCK, "infra_66m_mck", "sysaxi_sel", 1, 2),
|
| 41 | FACTOR(CK_INFRA_CK_F32K, "infra_ck_f32k", "cb_rtc_32p7k", 1, 1),
|
developer | b006d57 | 2021-06-07 16:29:44 +0800 | [diff] [blame] | 42 | FACTOR(CK_INFRA_PCIE_CK, "infra_pcie", "pextp_tl_ck_sel", 1, 1),
|
developer | 15adbbf | 2021-05-24 22:20:07 +0800 | [diff] [blame] | 43 | FACTOR(CK_INFRA_PWM_BCK, "infra_pwm_bck", "infra_pwm_bsel", 1, 1),
|
| 44 | FACTOR(CK_INFRA_PWM_CK1, "infra_pwm_ck1", "infra_pwm1_sel", 1, 1),
|
| 45 | FACTOR(CK_INFRA_PWM_CK2, "infra_pwm_ck2", "infra_pwm2_sel", 1, 1),
|
| 46 | FACTOR(CK_INFRA_133M_HCK, "infra_133m_hck", "sysaxi", 1, 1),
|
| 47 | FACTOR(CK_INFRA_EIP_CK, "infra_eip", "eip_b", 1, 1),
|
| 48 | FACTOR(CK_INFRA_66M_PHCK, "infra_66m_phck", "infra_133m_hck", 1, 1),
|
| 49 | FACTOR(CK_INFRA_FAUD_L_CK, "infra_faud_l", "aud_l", 1, 1),
|
| 50 | FACTOR(CK_INFRA_FAUD_AUD_CK, "infra_faud_aud", "a1sys", 1, 1),
|
| 51 | FACTOR(CK_INFRA_FAUD_EG2_CK, "infra_faud_eg2", "a_tuner", 1, 1),
|
| 52 | FACTOR(CK_INFRA_I2CS_CK, "infra_i2cs", "i2c_bck", 1, 1),
|
| 53 | FACTOR(CK_INFRA_MUX_UART0, "infra_mux_uart0", "infra_uart0_sel", 1, 1),
|
| 54 | FACTOR(CK_INFRA_MUX_UART1, "infra_mux_uart1", "infra_uart1_sel", 1, 1),
|
| 55 | FACTOR(CK_INFRA_MUX_UART2, "infra_mux_uart2", "infra_uart2_sel", 1, 1),
|
| 56 | FACTOR(CK_INFRA_NFI_CK, "infra_nfi", "nfi1x", 1, 1),
|
| 57 | FACTOR(CK_INFRA_SPINFI_CK, "infra_spinfi", "spinfi_bck", 1, 1),
|
| 58 | FACTOR(CK_INFRA_MUX_SPI0, "infra_mux_spi0", "infra_spi0_sel", 1, 1),
|
| 59 | FACTOR(CK_INFRA_MUX_SPI1, "infra_mux_spi1", "infra_spi1_sel", 1, 1),
|
| 60 | FACTOR(CK_INFRA_RTC_32K, "infra_rtc_32k", "cb_rtc_32k", 1, 1),
|
| 61 | FACTOR(CK_INFRA_FMSDC_CK, "infra_fmsdc", "emmc_416m", 1, 1),
|
| 62 | FACTOR(CK_INFRA_FMSDC_HCK_CK, "infra_fmsdc_hck", "emmc_250m", 1, 1),
|
| 63 | FACTOR(CK_INFRA_PERI_133M, "infra_peri_133m", "sysaxi", 1, 1),
|
| 64 | FACTOR(CK_INFRA_133M_PHCK, "infra_133m_phck", "sysaxi", 1, 1),
|
| 65 | FACTOR(CK_INFRA_USB_SYS_CK, "infra_usb_sys", "u2u3_sys", 1, 1),
|
| 66 | FACTOR(CK_INFRA_USB_CK, "infra_usb", "u2u3_ref", 1, 1),
|
| 67 | FACTOR(CK_INFRA_USB_XHCI_CK, "infra_usb_xhci", "u2u3_xhci", 1, 1),
|
| 68 | FACTOR(CK_INFRA_PCIE_GFMUX_TL_O_PRE, "infra_pcie_mux", "pextp_tl", 1, 1),
|
| 69 | FACTOR(CK_INFRA_F26M_CK0, "infra_f26m_ck0", "csw_f26m", 1, 1),
|
developer | 9d4b4eb | 2021-06-17 10:04:26 +0800 | [diff] [blame] | 70 | FACTOR(CK_INFRA_HD_133M, "infra_hd_133m", "sysaxi", 1, 1),
|
developer | 15adbbf | 2021-05-24 22:20:07 +0800 | [diff] [blame] | 71 | };
|
| 72 |
|
| 73 | static const struct mtk_fixed_factor top_divs[] __initconst = {
|
| 74 | FACTOR(CK_TOP_CB_CKSQ_40M, "cb_cksq_40m", "clkxtal", 1, 1),
|
| 75 | FACTOR(CK_TOP_CB_M_416M, "cb_m_416m", "mpll", 1, 1),
|
| 76 | FACTOR(CK_TOP_CB_M_D2, "cb_m_d2", "mpll", 1, 2),
|
| 77 | FACTOR(CK_TOP_CB_M_D4, "cb_m_d4", "mpll", 1, 4),
|
| 78 | FACTOR(CK_TOP_CB_M_D8, "cb_m_d8", "mpll", 1, 8),
|
| 79 | FACTOR(CK_TOP_M_D8_D2, "m_d8_d2", "mpll", 1, 16),
|
| 80 | FACTOR(CK_TOP_M_D3_D2, "m_d3_d2", "mpll", 1, 2),
|
| 81 | FACTOR(CK_TOP_CB_MM_D2, "cb_mm_d2", "mmpll", 1, 2),
|
| 82 | FACTOR(CK_TOP_CB_MM_D4, "cb_mm_d4", "mmpll", 1, 4),
|
| 83 | FACTOR(CK_TOP_CB_MM_D8, "cb_mm_d8", "mmpll", 1, 8),
|
| 84 | FACTOR(CK_TOP_MM_D8_D2, "mm_d8_d2", "mmpll", 1, 16),
|
| 85 | FACTOR(CK_TOP_MM_D3_D8, "mm_d3_d8", "mmpll", 1, 8),
|
| 86 | FACTOR(CK_TOP_CB_U2_PHYD_CK, "cb_u2_phyd", "mmpll", 1, 30),
|
| 87 | FACTOR(CK_TOP_CB_APLL2_196M, "cb_apll2_196m", "apll2", 1, 1),
|
| 88 | FACTOR(CK_TOP_APLL2_D4, "apll2_d4", "apll2", 1, 4),
|
| 89 | FACTOR(CK_TOP_CB_NET1_D4, "cb_net1_d4", "net1pll", 1, 4),
|
| 90 | FACTOR(CK_TOP_CB_NET1_D5, "cb_net1_d5", "net1pll", 1, 5),
|
| 91 | FACTOR(CK_TOP_NET1_D5_D2, "net1_d5_d2", "net1pll", 1, 10),
|
| 92 | FACTOR(CK_TOP_NET1_D5_D4, "net1_d5_d4", "net1pll", 1, 20),
|
| 93 | FACTOR(CK_TOP_NET1_D8_D2, "net1_d8_d2", "net1pll", 1, 16),
|
| 94 | FACTOR(CK_TOP_NET1_D8_D4, "net1_d8_d4", "net1pll", 1, 32),
|
| 95 | FACTOR(CK_TOP_CB_NET2_800M, "cb_net2_800m", "net2pll", 1, 1),
|
| 96 | FACTOR(CK_TOP_CB_NET2_D4, "cb_net2_d4", "net2pll", 1, 4),
|
| 97 | FACTOR(CK_TOP_NET2_D4_D2, "net2_d4_d2", "net2pll", 1, 8),
|
| 98 | FACTOR(CK_TOP_NET2_D3_D2, "net2_d3_d2", "net2pll", 1, 2),
|
| 99 | FACTOR(CK_TOP_CB_WEDMCU_760M, "cb_wedmcu_760m", "wedmcupll", 1, 1),
|
| 100 | FACTOR(CK_TOP_WEDMCU_D5_D2, "wedmcu_d5_d2", "wedmcupll", 1, 10),
|
| 101 | FACTOR(CK_TOP_CB_SGM_325M, "cb_sgm_325m", "sgmpll", 1, 1),
|
| 102 | FACTOR(CK_TOP_CB_CKSQ_40M_D2, "cb_cksq_40m_d2", "cb_cksq_40m", 1, 2),
|
| 103 | FACTOR(CK_TOP_CB_RTC_32K, "cb_rtc_32k", "cb_cksq_40m", 1, 1250),
|
| 104 | FACTOR(CK_TOP_CB_RTC_32P7K, "cb_rtc_32p7k", "cb_cksq_40m", 1, 1220),
|
| 105 | FACTOR(CK_TOP_NFI1X, "nfi1x", "nfi1x_sel", 1, 1),
|
| 106 | FACTOR(CK_TOP_USB_EQ_RX250M, "usb_eq_rx250m", "cb_cksq_40m", 1, 1),
|
| 107 | FACTOR(CK_TOP_USB_TX250M, "usb_tx250m", "cb_cksq_40m", 1, 1),
|
| 108 | FACTOR(CK_TOP_USB_LN0_CK, "usb_ln0", "cb_cksq_40m", 1, 1),
|
| 109 | FACTOR(CK_TOP_USB_CDR_CK, "usb_cdr", "cb_cksq_40m", 1, 1),
|
| 110 | FACTOR(CK_TOP_SPINFI_BCK, "spinfi_bck", "spinfi_sel", 1, 1),
|
| 111 | FACTOR(CK_TOP_I2C_BCK, "i2c_bck", "i2c_sel", 1, 1),
|
| 112 | FACTOR(CK_TOP_PEXTP_TL, "pextp_tl", "pextp_tl_ck_sel", 1, 1),
|
| 113 | FACTOR(CK_TOP_EMMC_250M, "emmc_250m", "emmc_250m_sel", 1, 1),
|
| 114 | FACTOR(CK_TOP_EMMC_416M, "emmc_416m", "emmc_416m_sel", 1, 1),
|
| 115 | FACTOR(CK_TOP_F_26M_ADC_CK, "f_26m_adc", "f_26m_adc_sel", 1, 1),
|
| 116 | FACTOR(CK_TOP_SYSAXI, "sysaxi", "sysaxi_sel", 1, 1),
|
| 117 | FACTOR(CK_TOP_NETSYS_WED_MCU, "netsys_wed_mcu", "netsys_mcu_sel", 1, 1),
|
| 118 | FACTOR(CK_TOP_NETSYS_2X, "netsys_2x", "netsys_2x_sel", 1, 1),
|
| 119 | FACTOR(CK_TOP_SGM_325M, "sgm_325m", "sgm_325m_sel", 1, 1),
|
| 120 | FACTOR(CK_TOP_A1SYS, "a1sys", "a1sys_sel", 1, 1),
|
| 121 | FACTOR(CK_TOP_EIP_B, "eip_b", "eip_b_sel", 1, 1),
|
| 122 | FACTOR(CK_TOP_F26M, "csw_f26m", "csw_f26m_sel", 1, 1),
|
| 123 | FACTOR(CK_TOP_AUD_L, "aud_l", "aud_l_sel", 1, 1),
|
| 124 | FACTOR(CK_TOP_A_TUNER, "a_tuner", "a_tuner_sel", 1, 1),
|
| 125 | FACTOR(CK_TOP_U2U3_REF, "u2u3_ref", "u2u3_sel", 1, 1),
|
| 126 | FACTOR(CK_TOP_U2U3_SYS, "u2u3_sys", "u2u3_sys_sel", 1, 1),
|
| 127 | FACTOR(CK_TOP_U2U3_XHCI, "u2u3_xhci", "u2u3_xhci_sel", 1, 1),
|
| 128 | FACTOR(CK_TOP_AP2CNN_HOST, "ap2cnn_host", "ap2cnn_host_sel", 1, 1),
|
| 129 | };
|
| 130 |
|
| 131 | static const char * const nfi1x_parents[] __initconst = {
|
| 132 | "cb_cksq_40m",
|
| 133 | "cb_mm_d8",
|
| 134 | "net1_d8_d2",
|
| 135 | "net2_d3_d2",
|
| 136 | "cb_m_d4",
|
| 137 | "mm_d8_d2",
|
| 138 | "wedmcu_d5_d2",
|
| 139 | "cb_m_d8"
|
| 140 | };
|
| 141 |
|
| 142 | static const char * const spinfi_parents[] __initconst = {
|
| 143 | "cb_cksq_40m_d2",
|
| 144 | "cb_cksq_40m",
|
| 145 | "net1_d5_d4",
|
| 146 | "cb_m_d4",
|
| 147 | "mm_d8_d2",
|
| 148 | "wedmcu_d5_d2",
|
| 149 | "mm_d3_d8",
|
| 150 | "cb_m_d8"
|
| 151 | };
|
| 152 |
|
| 153 | static const char * const spi_parents[] __initconst = {
|
| 154 | "cb_cksq_40m",
|
| 155 | "cb_m_d2",
|
| 156 | "cb_mm_d8",
|
| 157 | "net1_d8_d2",
|
| 158 | "net2_d3_d2",
|
| 159 | "net1_d5_d4",
|
| 160 | "cb_m_d4",
|
| 161 | "wedmcu_d5_d2"
|
| 162 | };
|
| 163 |
|
| 164 | static const char * const uart_parents[] __initconst = {
|
| 165 | "cb_cksq_40m",
|
| 166 | "cb_m_d8",
|
| 167 | "m_d8_d2"
|
| 168 | };
|
| 169 |
|
| 170 | static const char * const pwm_parents[] __initconst = {
|
| 171 | "cb_cksq_40m",
|
| 172 | "net1_d8_d2",
|
| 173 | "net1_d5_d4",
|
| 174 | "cb_m_d4"
|
| 175 | };
|
| 176 |
|
| 177 | static const char * const i2c_parents[] __initconst = {
|
| 178 | "cb_cksq_40m",
|
| 179 | "net1_d5_d4",
|
| 180 | "cb_m_d4",
|
| 181 | "net1_d8_d4"
|
| 182 | };
|
| 183 |
|
| 184 | static const char * const pextp_tl_ck_parents[] __initconst = {
|
| 185 | "cb_cksq_40m",
|
| 186 | "net1_d5_d4",
|
| 187 | "net2_d4_d2",
|
| 188 | "cb_rtc_32k"
|
| 189 | };
|
| 190 |
|
| 191 | static const char * const emmc_250m_parents[] __initconst = {
|
| 192 | "cb_cksq_40m",
|
| 193 | "net1_d5_d2"
|
| 194 | };
|
| 195 |
|
| 196 | static const char * const emmc_416m_parents[] __initconst = {
|
| 197 | "cb_cksq_40m",
|
| 198 | "cb_m_416m"
|
| 199 | };
|
| 200 |
|
| 201 | static const char * const f_26m_adc_parents[] __initconst = {
|
| 202 | "cb_cksq_40m",
|
| 203 | "m_d8_d2"
|
| 204 | };
|
| 205 |
|
| 206 | static const char * const dramc_md32_parents[] __initconst = {
|
| 207 | "cb_cksq_40m",
|
| 208 | "cb_m_d2"
|
| 209 | };
|
| 210 |
|
| 211 | static const char * const sysaxi_parents[] __initconst = {
|
| 212 | "cb_cksq_40m",
|
| 213 | "net1_d8_d2",
|
| 214 | "cb_net2_d4"
|
| 215 | };
|
| 216 |
|
| 217 | static const char * const sysapb_parents[] __initconst = {
|
| 218 | "cb_cksq_40m",
|
| 219 | "m_d3_d2",
|
| 220 | "net2_d4_d2"
|
| 221 | };
|
| 222 |
|
| 223 | static const char * const arm_db_main_parents[] __initconst = {
|
| 224 | "cb_cksq_40m",
|
| 225 | "net2_d3_d2"
|
| 226 | };
|
| 227 |
|
| 228 | static const char * const arm_db_jtsel_parents[] __initconst = {
|
| 229 | "cb_jtck_50m",
|
| 230 | "cb_cksq_40m"
|
| 231 | };
|
| 232 |
|
| 233 | static const char * const netsys_parents[] __initconst = {
|
| 234 | "cb_cksq_40m",
|
| 235 | "cb_mm_d4"
|
| 236 | };
|
| 237 |
|
| 238 | static const char * const netsys_500m_parents[] __initconst = {
|
| 239 | "cb_cksq_40m",
|
| 240 | "cb_net1_d5"
|
| 241 | };
|
| 242 |
|
| 243 | static const char * const netsys_mcu_parents[] __initconst = {
|
| 244 | "cb_cksq_40m",
|
| 245 | "cb_wedmcu_760m",
|
| 246 | "cb_mm_d2",
|
| 247 | "cb_net1_d4",
|
| 248 | "cb_net1_d5"
|
| 249 | };
|
| 250 |
|
| 251 | static const char * const netsys_2x_parents[] __initconst = {
|
| 252 | "cb_cksq_40m",
|
| 253 | "cb_net2_800m",
|
| 254 | "cb_wedmcu_760m",
|
| 255 | "cb_mm_d2"
|
| 256 | };
|
| 257 |
|
| 258 | static const char * const sgm_325m_parents[] __initconst = {
|
| 259 | "cb_cksq_40m",
|
| 260 | "cb_sgm_325m"
|
| 261 | };
|
| 262 |
|
| 263 | static const char * const sgm_reg_parents[] __initconst = {
|
| 264 | "cb_cksq_40m",
|
| 265 | "net1_d8_d4"
|
| 266 | };
|
| 267 |
|
| 268 | static const char * const a1sys_parents[] __initconst = {
|
| 269 | "cb_cksq_40m",
|
| 270 | "apll2_d4"
|
| 271 | };
|
| 272 |
|
| 273 | static const char * const conn_mcusys_parents[] __initconst = {
|
| 274 | "cb_cksq_40m",
|
| 275 | "cb_mm_d2"
|
| 276 | };
|
| 277 |
|
| 278 | static const char * const eip_b_parents[] __initconst = {
|
| 279 | "cb_cksq_40m",
|
| 280 | "cb_net2_800m"
|
| 281 | };
|
| 282 |
|
| 283 | static const char * const aud_l_parents[] __initconst = {
|
| 284 | "cb_cksq_40m",
|
| 285 | "cb_apll2_196m",
|
| 286 | "m_d8_d2"
|
| 287 | };
|
| 288 |
|
| 289 | static const char * const a_tuner_parents[] __initconst = {
|
| 290 | "cb_cksq_40m",
|
| 291 | "apll2_d4",
|
| 292 | "m_d8_d2"
|
| 293 | };
|
| 294 |
|
| 295 | static const char * const u2u3_sys_parents[] __initconst = {
|
| 296 | "cb_cksq_40m",
|
| 297 | "net1_d5_d4"
|
| 298 | };
|
| 299 |
|
| 300 | static const char * const da_u2_refsel_parents[] __initconst = {
|
| 301 | "cb_cksq_40m",
|
| 302 | "cb_u2_phyd"
|
| 303 | };
|
| 304 |
|
| 305 | static const struct mtk_mux top_muxes[] = {
|
| 306 | /* CLK_CFG_0 */
|
| 307 | MUX_GATE_CLR_SET_UPD(CK_TOP_NFI1X_SEL, "nfi1x_sel",
|
| 308 | nfi1x_parents, 0x000, 0x004, 0x008, 0, 3, 7, 0x1C0, 0),
|
| 309 | MUX_GATE_CLR_SET_UPD(CK_TOP_SPINFI_SEL, "spinfi_sel",
|
| 310 | spinfi_parents, 0x000, 0x004, 0x008, 8, 3, 15, 0x1C0, 1),
|
| 311 | MUX_GATE_CLR_SET_UPD(CK_TOP_SPI_SEL, "spi_sel",
|
| 312 | spi_parents, 0x000, 0x004, 0x008, 16, 3, 23, 0x1C0, 2),
|
| 313 | MUX_GATE_CLR_SET_UPD(CK_TOP_SPIM_MST_SEL, "spim_mst_sel",
|
| 314 | spi_parents, 0x000, 0x004, 0x008, 24, 3, 31, 0x1C0, 3),
|
| 315 | /* CLK_CFG_1 */
|
| 316 | MUX_GATE_CLR_SET_UPD(CK_TOP_UART_SEL, "uart_sel",
|
| 317 | uart_parents, 0x010, 0x014, 0x018, 0, 2, 7, 0x1C0, 4),
|
| 318 | MUX_GATE_CLR_SET_UPD(CK_TOP_PWM_SEL, "pwm_sel",
|
| 319 | pwm_parents, 0x010, 0x014, 0x018, 8, 2, 15, 0x1C0, 5),
|
| 320 | MUX_GATE_CLR_SET_UPD(CK_TOP_I2C_SEL, "i2c_sel",
|
| 321 | i2c_parents, 0x010, 0x014, 0x018, 16, 2, 23, 0x1C0, 6),
|
| 322 | MUX_GATE_CLR_SET_UPD(CK_TOP_PEXTP_TL_SEL, "pextp_tl_ck_sel",
|
| 323 | pextp_tl_ck_parents, 0x010, 0x014, 0x018, 24, 2, 31, 0x1C0, 7),
|
| 324 | /* CLK_CFG_2 */
|
| 325 | MUX_GATE_CLR_SET_UPD(CK_TOP_EMMC_250M_SEL, "emmc_250m_sel",
|
| 326 | emmc_250m_parents, 0x020, 0x024, 0x028, 0, 1, 7, 0x1C0, 8),
|
| 327 | MUX_GATE_CLR_SET_UPD(CK_TOP_EMMC_416M_SEL, "emmc_416m_sel",
|
| 328 | emmc_416m_parents, 0x020, 0x024, 0x028, 8, 1, 15, 0x1C0, 9),
|
| 329 | MUX_GATE_CLR_SET_UPD(CK_TOP_F_26M_ADC_SEL, "f_26m_adc_sel",
|
| 330 | f_26m_adc_parents, 0x020, 0x024, 0x028, 16, 1, 23, 0x1C0, 10),
|
| 331 | MUX_GATE_CLR_SET_UPD(CK_TOP_DRAMC_SEL, "dramc_sel",
|
| 332 | f_26m_adc_parents, 0x020, 0x024, 0x028, 24, 1, 31, 0x1C0, 11),
|
| 333 | /* CLK_CFG_3 */
|
| 334 | MUX_GATE_CLR_SET_UPD(CK_TOP_DRAMC_MD32_SEL, "dramc_md32_sel",
|
| 335 | dramc_md32_parents, 0x030, 0x034, 0x038, 0, 1, 7, 0x1C0, 12),
|
| 336 | MUX_GATE_CLR_SET_UPD(CK_TOP_SYSAXI_SEL, "sysaxi_sel",
|
| 337 | sysaxi_parents, 0x030, 0x034, 0x038, 8, 2, 15, 0x1C0, 13),
|
| 338 | MUX_GATE_CLR_SET_UPD(CK_TOP_SYSAPB_SEL, "sysapb_sel",
|
| 339 | sysapb_parents, 0x030, 0x034, 0x038, 16, 2, 23, 0x1C0, 14),
|
| 340 | MUX_GATE_CLR_SET_UPD(CK_TOP_ARM_DB_MAIN_SEL, "arm_db_main_sel",
|
| 341 | arm_db_main_parents, 0x030, 0x034, 0x038, 24, 1, 31, 0x1C0, 15),
|
| 342 | /* CLK_CFG_4 */
|
| 343 | MUX_GATE_CLR_SET_UPD(CK_TOP_ARM_DB_JTSEL, "arm_db_jtsel",
|
| 344 | arm_db_jtsel_parents, 0x040, 0x044, 0x048, 0, 1, 7, 0x1C0, 16),
|
| 345 | MUX_GATE_CLR_SET_UPD(CK_TOP_NETSYS_SEL, "netsys_sel",
|
| 346 | netsys_parents, 0x040, 0x044, 0x048, 8, 1, 15, 0x1C0, 17),
|
| 347 | MUX_GATE_CLR_SET_UPD(CK_TOP_NETSYS_500M_SEL, "netsys_500m_sel",
|
| 348 | netsys_500m_parents, 0x040, 0x044, 0x048, 16, 1, 23, 0x1C0, 18),
|
| 349 | MUX_GATE_CLR_SET_UPD(CK_TOP_NETSYS_MCU_SEL, "netsys_mcu_sel",
|
| 350 | netsys_mcu_parents, 0x040, 0x044, 0x048, 24, 3, 31, 0x1C0, 19),
|
| 351 | /* CLK_CFG_5 */
|
| 352 | MUX_GATE_CLR_SET_UPD(CK_TOP_NETSYS_2X_SEL, "netsys_2x_sel",
|
| 353 | netsys_2x_parents, 0x050, 0x054, 0x058, 0, 2, 7, 0x1C0, 20),
|
| 354 | MUX_GATE_CLR_SET_UPD(CK_TOP_SGM_325M_SEL, "sgm_325m_sel",
|
| 355 | sgm_325m_parents, 0x050, 0x054, 0x058, 8, 1, 15, 0x1C0, 21),
|
| 356 | MUX_GATE_CLR_SET_UPD(CK_TOP_SGM_REG_SEL, "sgm_reg_sel",
|
| 357 | sgm_reg_parents, 0x050, 0x054, 0x058, 16, 1, 23, 0x1C0, 22),
|
| 358 | MUX_GATE_CLR_SET_UPD(CK_TOP_A1SYS_SEL, "a1sys_sel",
|
| 359 | a1sys_parents, 0x050, 0x054, 0x058, 24, 1, 31, 0x1C0, 23),
|
| 360 | /* CLK_CFG_6 */
|
| 361 | MUX_GATE_CLR_SET_UPD(CK_TOP_CONN_MCUSYS_SEL, "conn_mcusys_sel",
|
| 362 | conn_mcusys_parents, 0x060, 0x064, 0x068, 0, 1, 7, 0x1C0, 24),
|
| 363 | MUX_GATE_CLR_SET_UPD(CK_TOP_EIP_B_SEL, "eip_b_sel",
|
| 364 | eip_b_parents, 0x060, 0x064, 0x068, 8, 1, 15, 0x1C0, 25),
|
| 365 | MUX_GATE_CLR_SET_UPD(CK_TOP_PCIE_PHY_SEL, "pcie_phy_sel",
|
| 366 | f_26m_adc_parents, 0x060, 0x064, 0x068, 16, 1, 23, 0x1C0, 26),
|
| 367 | MUX_GATE_CLR_SET_UPD(CK_TOP_USB3_PHY_SEL, "usb3_phy_sel",
|
| 368 | f_26m_adc_parents, 0x060, 0x064, 0x068, 24, 1, 31, 0x1C0, 27),
|
| 369 | /* CLK_CFG_7 */
|
| 370 | MUX_GATE_CLR_SET_UPD(CK_TOP_F26M_SEL, "csw_f26m_sel",
|
| 371 | f_26m_adc_parents, 0x070, 0x074, 0x078, 0, 1, 7, 0x1C0, 28),
|
| 372 | MUX_GATE_CLR_SET_UPD(CK_TOP_AUD_L_SEL, "aud_l_sel",
|
| 373 | aud_l_parents, 0x070, 0x074, 0x078, 8, 2, 15, 0x1C0, 29),
|
| 374 | MUX_GATE_CLR_SET_UPD(CK_TOP_A_TUNER_SEL, "a_tuner_sel",
|
| 375 | a_tuner_parents, 0x070, 0x074, 0x078, 16, 2, 23, 0x1C0, 30),
|
| 376 | MUX_GATE_CLR_SET_UPD(CK_TOP_U2U3_SEL, "u2u3_sel",
|
| 377 | f_26m_adc_parents, 0x070, 0x074, 0x078, 24, 1, 31, 0x1C4, 0),
|
| 378 | /* CLK_CFG_8 */
|
| 379 | MUX_GATE_CLR_SET_UPD(CK_TOP_U2U3_SYS_SEL, "u2u3_sys_sel",
|
| 380 | u2u3_sys_parents, 0x080, 0x084, 0x088, 0, 1, 7, 0x1C4, 1),
|
| 381 | MUX_GATE_CLR_SET_UPD(CK_TOP_U2U3_XHCI_SEL, "u2u3_xhci_sel",
|
| 382 | u2u3_sys_parents, 0x080, 0x084, 0x088, 8, 1, 15, 0x1C4, 2),
|
| 383 | MUX_GATE_CLR_SET_UPD(CK_TOP_DA_U2_REFSEL, "da_u2_refsel",
|
| 384 | da_u2_refsel_parents, 0x080, 0x084, 0x088, 16, 1, 23, 0x1C4, 3),
|
| 385 | MUX_GATE_CLR_SET_UPD(CK_TOP_DA_U2_CK_1P_SEL, "da_u2_ck_1p_sel",
|
| 386 | da_u2_refsel_parents, 0x080, 0x084, 0x088, 24, 1, 31, 0x1C4, 4),
|
| 387 | /* CLK_CFG_9 */
|
| 388 | MUX_GATE_CLR_SET_UPD(CK_TOP_AP2CNN_HOST_SEL, "ap2cnn_host_sel",
|
| 389 | sgm_reg_parents, 0x090, 0x094, 0x098, 0, 1, 7, 0x1C4, 5),
|
| 390 | };
|
| 391 |
|
| 392 | static const char * const infra_uart0_parents[] __initconst = {
|
| 393 | "infra_ck_f26m",
|
| 394 | "infra_uart"
|
| 395 | };
|
| 396 |
|
| 397 | static const char * const infra_spi0_parents[] __initconst = {
|
developer | b006d57 | 2021-06-07 16:29:44 +0800 | [diff] [blame] | 398 | "infra_i2c",
|
| 399 | "infra_ispi0"
|
developer | 15adbbf | 2021-05-24 22:20:07 +0800 | [diff] [blame] | 400 | };
|
| 401 |
|
| 402 | static const char * const infra_spi1_parents[] __initconst = {
|
developer | b006d57 | 2021-06-07 16:29:44 +0800 | [diff] [blame] | 403 | "infra_i2c",
|
| 404 | "infra_ispi1"
|
developer | 15adbbf | 2021-05-24 22:20:07 +0800 | [diff] [blame] | 405 | };
|
| 406 |
|
developer | 15adbbf | 2021-05-24 22:20:07 +0800 | [diff] [blame] | 407 | static const char * const infra_pwm_bsel_parents[] __initconst = {
|
| 408 | "infra_ck_f32k",
|
| 409 | "infra_ck_f26m",
|
| 410 | "infra_66m_mck",
|
| 411 | "infra_pwm"
|
| 412 | };
|
| 413 |
|
| 414 | static const char * const infra_pcie_parents[] __initconst = {
|
developer | b006d57 | 2021-06-07 16:29:44 +0800 | [diff] [blame] | 415 | "infra_ck_f32k",
|
developer | 15adbbf | 2021-05-24 22:20:07 +0800 | [diff] [blame] | 416 | "infra_ck_f26m",
|
developer | b006d57 | 2021-06-07 16:29:44 +0800 | [diff] [blame] | 417 | "cb_cksq_40m",
|
| 418 | "infra_pcie"
|
developer | 15adbbf | 2021-05-24 22:20:07 +0800 | [diff] [blame] | 419 | };
|
| 420 |
|
| 421 | static const struct mtk_mux infra_muxes[] = {
|
| 422 | /* MODULE_CLK_SEL_0 */
|
| 423 | MUX_GATE_CLR_SET_UPD(CK_INFRA_UART0_SEL, "infra_uart0_sel",
|
| 424 | infra_uart0_parents, 0x0018, 0x0010, 0x0014, 0, 1, -1, -1, -1),
|
| 425 | MUX_GATE_CLR_SET_UPD(CK_INFRA_UART1_SEL, "infra_uart1_sel",
|
| 426 | infra_uart0_parents, 0x0018, 0x0010, 0x0014, 1, 1, -1, -1, -1),
|
| 427 | MUX_GATE_CLR_SET_UPD(CK_INFRA_UART2_SEL, "infra_uart2_sel",
|
| 428 | infra_uart0_parents, 0x0018, 0x0010, 0x0014, 2, 1, -1, -1, -1),
|
| 429 | MUX_GATE_CLR_SET_UPD(CK_INFRA_SPI0_SEL, "infra_spi0_sel",
|
| 430 | infra_spi0_parents, 0x0018, 0x0010, 0x0014, 4, 1, -1, -1, -1),
|
| 431 | MUX_GATE_CLR_SET_UPD(CK_INFRA_SPI1_SEL, "infra_spi1_sel",
|
| 432 | infra_spi1_parents, 0x0018, 0x0010, 0x0014, 5, 1, -1, -1, -1),
|
| 433 | MUX_GATE_CLR_SET_UPD(CK_INFRA_PWM1_SEL, "infra_pwm1_sel",
|
developer | b006d57 | 2021-06-07 16:29:44 +0800 | [diff] [blame] | 434 | infra_pwm_bsel_parents, 0x0018, 0x0010, 0x0014, 9, 2, -1, -1, -1),
|
developer | 15adbbf | 2021-05-24 22:20:07 +0800 | [diff] [blame] | 435 | MUX_GATE_CLR_SET_UPD(CK_INFRA_PWM2_SEL, "infra_pwm2_sel",
|
developer | b006d57 | 2021-06-07 16:29:44 +0800 | [diff] [blame] | 436 | infra_pwm_bsel_parents, 0x0018, 0x0010, 0x0014, 11, 2, -1, -1, -1),
|
developer | 15adbbf | 2021-05-24 22:20:07 +0800 | [diff] [blame] | 437 | MUX_GATE_CLR_SET_UPD(CK_INFRA_PWM_BSEL, "infra_pwm_bsel",
|
| 438 | infra_pwm_bsel_parents, 0x0018, 0x0010, 0x0014, 13, 2, -1, -1, -1),
|
| 439 | /* MODULE_CLK_SEL_1 */
|
| 440 | MUX_GATE_CLR_SET_UPD(CK_INFRA_PCIE_SEL, "infra_pcie_sel",
|
| 441 | infra_pcie_parents, 0x0028, 0x0020, 0x0024, 0, 2, -1, -1, -1),
|
| 442 | };
|
| 443 |
|
| 444 |
|
| 445 |
|
| 446 | static const struct mtk_gate_regs infra0_cg_regs = {
|
| 447 | .set_ofs = 0x40,
|
| 448 | .clr_ofs = 0x44,
|
| 449 | .sta_ofs = 0x48,
|
| 450 | };
|
| 451 |
|
| 452 | static const struct mtk_gate_regs infra1_cg_regs = {
|
| 453 | .set_ofs = 0x50,
|
| 454 | .clr_ofs = 0x54,
|
| 455 | .sta_ofs = 0x58,
|
| 456 | };
|
| 457 |
|
| 458 | static const struct mtk_gate_regs infra2_cg_regs = {
|
| 459 | .set_ofs = 0x60,
|
| 460 | .clr_ofs = 0x64,
|
| 461 | .sta_ofs = 0x68,
|
| 462 | };
|
| 463 |
|
| 464 | #define GATE_INFRA0(_id, _name, _parent, _shift) { \
|
| 465 | .id = _id, \
|
| 466 | .name = _name, \
|
| 467 | .parent_name = _parent, \
|
| 468 | .regs = &infra0_cg_regs, \
|
| 469 | .shift = _shift, \
|
| 470 | .ops = &mtk_clk_gate_ops_setclr, \
|
| 471 | }
|
| 472 |
|
| 473 | #define GATE_INFRA1(_id, _name, _parent, _shift) { \
|
| 474 | .id = _id, \
|
| 475 | .name = _name, \
|
| 476 | .parent_name = _parent, \
|
| 477 | .regs = &infra1_cg_regs, \
|
| 478 | .shift = _shift, \
|
| 479 | .ops = &mtk_clk_gate_ops_setclr, \
|
| 480 | }
|
| 481 |
|
| 482 | #define GATE_INFRA2(_id, _name, _parent, _shift) { \
|
| 483 | .id = _id, \
|
| 484 | .name = _name, \
|
| 485 | .parent_name = _parent, \
|
| 486 | .regs = &infra2_cg_regs, \
|
| 487 | .shift = _shift, \
|
| 488 | .ops = &mtk_clk_gate_ops_setclr, \
|
| 489 | }
|
| 490 |
|
| 491 | static const struct mtk_gate infra_clks[] __initconst = {
|
| 492 | /* INFRA0 */
|
| 493 | GATE_INFRA0(CK_INFRA_GPT_STA, "infra_gpt_sta", "infra_66m_mck", 0),
|
| 494 | GATE_INFRA0(CK_INFRA_PWM_HCK, "infra_pwm_hck", "infra_66m_mck", 1),
|
| 495 | GATE_INFRA0(CK_INFRA_PWM_STA, "infra_pwm_sta", "infra_pwm_bck", 2),
|
| 496 | GATE_INFRA0(CK_INFRA_PWM1_CK, "infra_pwm1", "infra_pwm_ck1", 3),
|
| 497 | GATE_INFRA0(CK_INFRA_PWM2_CK, "infra_pwm2", "infra_pwm_ck2", 4),
|
| 498 | GATE_INFRA0(CK_INFRA_CQ_DMA_CK, "infra_cq_dma", "infra_133m_hck", 6),
|
| 499 | GATE_INFRA0(CK_INFRA_EIP97_CK, "infra_eip97", "infra_eip", 7),
|
| 500 | GATE_INFRA0(CK_INFRA_AUD_BUS_CK, "infra_aud_bus", "infra_66m_phck", 8),
|
| 501 | GATE_INFRA0(CK_INFRA_AUD_26M_CK, "infra_aud_26m", "infra_ck_f26m", 9),
|
| 502 | GATE_INFRA0(CK_INFRA_AUD_L_CK, "infra_aud_l", "infra_faud_l", 10),
|
| 503 | GATE_INFRA0(CK_INFRA_AUD_AUD_CK, "infra_aud_aud", "infra_faud_aud", 11),
|
| 504 | GATE_INFRA0(CK_INFRA_AUD_EG2_CK, "infra_aud_eg2", "infra_faud_eg2", 13),
|
| 505 | GATE_INFRA0(CK_INFRA_DRAMC_26M_CK, "infra_dramc_26m", "infra_ck_f26m", 14),
|
| 506 | GATE_INFRA0(CK_INFRA_DBG_CK, "infra_dbg", "infra_66m_mck", 15),
|
| 507 | GATE_INFRA0(CK_INFRA_AP_DMA_CK, "infra_ap_dma", "infra_66m_mck", 16),
|
| 508 | GATE_INFRA0(CK_INFRA_SEJ_CK, "infra_sej", "infra_66m_mck", 24),
|
| 509 | GATE_INFRA0(CK_INFRA_SEJ_13M_CK, "infra_sej_13m", "infra_ck_f26m", 25),
|
developer | 9d4b4eb | 2021-06-17 10:04:26 +0800 | [diff] [blame] | 510 | GATE_INFRA0(CK_INFRA_TRNG_CK, "infra_trng", "infra_hd_133m", 26),
|
developer | 15adbbf | 2021-05-24 22:20:07 +0800 | [diff] [blame] | 511 | /* INFRA1 */
|
| 512 | GATE_INFRA1(CK_INFRA_THERM_CK, "infra_therm", "infra_ck_f26m", 0),
|
| 513 | GATE_INFRA1(CK_INFRA_I2CO_CK, "infra_i2co", "infra_i2cs", 1),
|
| 514 | GATE_INFRA1(CK_INFRA_UART0_CK, "infra_uart0", "infra_mux_uart0", 2),
|
| 515 | GATE_INFRA1(CK_INFRA_UART1_CK, "infra_uart1", "infra_mux_uart1", 3),
|
| 516 | GATE_INFRA1(CK_INFRA_UART2_CK, "infra_uart2", "infra_mux_uart2", 4),
|
| 517 | GATE_INFRA1(CK_INFRA_NFI1_CK, "infra_nfi1", "infra_nfi", 8),
|
| 518 | GATE_INFRA1(CK_INFRA_SPINFI1_CK, "infra_spinfi1", "infra_spinfi", 9),
|
| 519 | GATE_INFRA1(CK_INFRA_NFI_HCK_CK, "infra_nfi_hck", "infra_66m_mck", 10),
|
| 520 | GATE_INFRA1(CK_INFRA_SPI0_CK, "infra_spi0", "infra_mux_spi0", 11),
|
| 521 | GATE_INFRA1(CK_INFRA_SPI1_CK, "infra_spi1", "infra_mux_spi1", 12),
|
| 522 | GATE_INFRA1(CK_INFRA_SPI0_HCK_CK, "infra_spi0_hck", "infra_66m_mck", 13),
|
| 523 | GATE_INFRA1(CK_INFRA_SPI1_HCK_CK, "infra_spi1_hck", "infra_66m_mck", 14),
|
| 524 | GATE_INFRA1(CK_INFRA_FRTC_CK, "infra_frtc", "infra_rtc_32k", 15),
|
| 525 | GATE_INFRA1(CK_INFRA_MSDC_CK, "infra_msdc", "infra_fmsdc", 16),
|
| 526 | GATE_INFRA1(CK_INFRA_MSDC_HCK_CK, "infra_msdc_hck", "infra_fmsdc_hck", 17),
|
| 527 | GATE_INFRA1(CK_INFRA_MSDC_133M_CK, "infra_msdc_133m", "infra_peri_133m", 18),
|
| 528 | GATE_INFRA1(CK_INFRA_MSDC_66M_CK, "infra_msdc_66m", "infra_66m_phck", 19),
|
| 529 | GATE_INFRA1(CK_INFRA_ADC_26M_CK, "infra_adc_26m", "csw_f26m", 20),
|
| 530 | GATE_INFRA1(CK_INFRA_ADC_FRC_CK, "infra_adc_frc", "csw_f26m", 21),
|
| 531 | GATE_INFRA1(CK_INFRA_FBIST2FPC_CK, "infra_fbist2fpc", "infra_nfi", 23),
|
| 532 | /* INFRA2 */
|
| 533 | GATE_INFRA2(CK_INFRA_IUSB_133_CK, "infra_iusb_133", "infra_133m_phck", 0),
|
| 534 | GATE_INFRA2(CK_INFRA_IUSB_66M_CK, "infra_iusb_66m", "infra_66m_phck", 1),
|
| 535 | GATE_INFRA2(CK_INFRA_IUSB_SYS_CK, "infra_iusb_sys", "infra_usb_sys", 2),
|
| 536 | GATE_INFRA2(CK_INFRA_IUSB_CK, "infra_iusb", "infra_usb", 3),
|
| 537 | GATE_INFRA2(CK_INFRA_IPCIE_CK, "infra_ipcie", "infra_pcie_mux", 12),
|
developer | 0fffed6 | 2021-06-29 14:17:11 +0800 | [diff] [blame^] | 538 | GATE_INFRA2(CK_INFRA_IPCIE_PIPE_CK, "infra_ipcie_pipe", "cb_cksq_40m", 13),
|
developer | 15adbbf | 2021-05-24 22:20:07 +0800 | [diff] [blame] | 539 | GATE_INFRA2(CK_INFRA_IPCIER_CK, "infra_ipcier", "infra_f26m_ck0", 14),
|
| 540 | GATE_INFRA2(CK_INFRA_IPCIEB_CK, "infra_ipcieb", "infra_133m_phck", 15),
|
| 541 | };
|
| 542 |
|
| 543 | static const struct mtk_gate_regs sgmii0_cg_regs = {
|
| 544 | .set_ofs = 0xE4,
|
| 545 | .clr_ofs = 0xE4,
|
| 546 | .sta_ofs = 0xE4,
|
| 547 | };
|
| 548 |
|
| 549 | #define GATE_SGMII0(_id, _name, _parent, _shift) { \
|
| 550 | .id = _id, \
|
| 551 | .name = _name, \
|
| 552 | .parent_name = _parent, \
|
| 553 | .regs = &sgmii0_cg_regs, \
|
| 554 | .shift = _shift, \
|
| 555 | .ops = &mtk_clk_gate_ops_no_setclr_inv, \
|
| 556 | }
|
| 557 |
|
| 558 | static const struct mtk_gate sgmii0_clks[] __initconst = {
|
| 559 | GATE_SGMII0(CK_SGM0_TX_EN, "sgm0_tx_en", "usb_tx250m", 2),
|
| 560 | GATE_SGMII0(CK_SGM0_RX_EN, "sgm0_rx_en", "usb_eq_rx250m", 3),
|
| 561 | GATE_SGMII0(CK_SGM0_CK0_EN, "sgm0_ck0_en", "usb_ln0", 4),
|
| 562 | GATE_SGMII0(CK_SGM0_CDR_CK0_EN, "sgm0_cdr_ck0_en", "usb_cdr", 5),
|
| 563 | };
|
| 564 |
|
| 565 | static const struct mtk_gate_regs sgmii1_cg_regs = {
|
| 566 | .set_ofs = 0xE4,
|
| 567 | .clr_ofs = 0xE4,
|
| 568 | .sta_ofs = 0xE4,
|
| 569 | };
|
| 570 |
|
| 571 | #define GATE_SGMII1(_id, _name, _parent, _shift) { \
|
| 572 | .id = _id, \
|
| 573 | .name = _name, \
|
| 574 | .parent_name = _parent, \
|
| 575 | .regs = &sgmii1_cg_regs, \
|
| 576 | .shift = _shift, \
|
| 577 | .ops = &mtk_clk_gate_ops_no_setclr_inv, \
|
| 578 | }
|
| 579 |
|
| 580 | static const struct mtk_gate sgmii1_clks[] __initconst = {
|
| 581 | GATE_SGMII1(CK_SGM1_TX_EN, "sgm1_tx_en", "usb_tx250m", 2),
|
| 582 | GATE_SGMII1(CK_SGM1_RX_EN, "sgm1_rx_en", "usb_eq_rx250m", 3),
|
| 583 | GATE_SGMII1(CK_SGM1_CK1_EN, "sgm1_ck1_en", "usb_ln0", 4),
|
| 584 | GATE_SGMII1(CK_SGM1_CDR_CK1_EN, "sgm1_cdr_ck1_en", "usb_cdr", 5),
|
| 585 | };
|
| 586 |
|
| 587 | static const struct mtk_gate_regs eth_cg_regs = {
|
| 588 | .set_ofs = 0x30,
|
| 589 | .clr_ofs = 0x30,
|
| 590 | .sta_ofs = 0x30,
|
| 591 | };
|
| 592 |
|
| 593 | #define GATE_ETH(_id, _name, _parent, _shift) { \
|
| 594 | .id = _id, \
|
| 595 | .name = _name, \
|
| 596 | .parent_name = _parent, \
|
| 597 | .regs = ð_cg_regs, \
|
| 598 | .shift = _shift, \
|
| 599 | .ops = &mtk_clk_gate_ops_no_setclr_inv, \
|
| 600 | }
|
| 601 |
|
| 602 | static const struct mtk_gate eth_clks[] __initconst = {
|
| 603 | GATE_ETH(CK_ETH_FE_EN, "eth_fe_en", "netsys_2x", 6),
|
| 604 | GATE_ETH(CK_ETH_GP2_EN, "eth_gp2_en", "sgm_325m", 7),
|
| 605 | GATE_ETH(CK_ETH_GP1_EN, "eth_gp1_en", "sgm_325m", 8),
|
| 606 | GATE_ETH(CK_ETH_WOCPU1_EN, "eth_wocpu1_en", "netsys_wed_mcu", 14),
|
| 607 | GATE_ETH(CK_ETH_WOCPU0_EN, "eth_wocpu0_en", "netsys_wed_mcu", 15),
|
| 608 | };
|
| 609 |
|
| 610 | #define MT7986_PLL_FMAX (2500UL * MHZ)
|
| 611 |
|
| 612 | #define CON0_MT7986_RST_BAR BIT(27)
|
| 613 |
|
| 614 | #define PLL_B(_id, _name, _reg, _pwr_reg, _en_mask, _flags, _pcwbits, \
|
| 615 | _pd_reg, _pd_shift, _tuner_reg, _pcw_reg, \
|
| 616 | _pcw_shift, _div_table, _parent_name) { \
|
| 617 | .id = _id, \
|
| 618 | .name = _name, \
|
| 619 | .reg = _reg, \
|
| 620 | .pwr_reg = _pwr_reg, \
|
| 621 | .en_mask = _en_mask, \
|
| 622 | .flags = _flags, \
|
| 623 | .rst_bar_mask = CON0_MT7986_RST_BAR, \
|
| 624 | .fmax = MT7986_PLL_FMAX, \
|
| 625 | .pcwbits = _pcwbits, \
|
| 626 | .pd_reg = _pd_reg, \
|
| 627 | .pd_shift = _pd_shift, \
|
| 628 | .tuner_reg = _tuner_reg, \
|
| 629 | .pcw_reg = _pcw_reg, \
|
| 630 | .pcw_shift = _pcw_shift, \
|
| 631 | .div_table = _div_table, \
|
| 632 | .parent_name = _parent_name, \
|
| 633 | }
|
| 634 |
|
| 635 | #define PLL(_id, _name, _reg, _pwr_reg, _en_mask, _flags, _pcwbits, \
|
| 636 | _pd_reg, _pd_shift, _tuner_reg, _pcw_reg, \
|
| 637 | _pcw_shift, _parent_name) \
|
| 638 | PLL_B(_id, _name, _reg, _pwr_reg, _en_mask, _flags, _pcwbits, \
|
| 639 | _pd_reg, _pd_shift, _tuner_reg, _pcw_reg, _pcw_shift, \
|
| 640 | NULL, _parent_name)
|
| 641 |
|
| 642 | static const struct mtk_pll_data plls[] = {
|
| 643 | PLL(CK_APMIXED_ARMPLL, "armpll", 0x0200, 0x020C, 0x00000001,
|
| 644 | 0, 32, 0x0200, 4, 0, 0x0204, 0, "clkxtal"),
|
| 645 | PLL(CK_APMIXED_NET2PLL, "net2pll", 0x0210, 0x021C, 0x00000001,
|
| 646 | 0, 32, 0x0210, 4, 0, 0x0214, 0, "clkxtal"),
|
| 647 | PLL(CK_APMIXED_MMPLL, "mmpll", 0x0220, 0x022C, 0x00000001,
|
| 648 | 0, 32, 0x0220, 4, 0, 0x0224, 0, "clkxtal"),
|
| 649 | PLL(CK_APMIXED_SGMPLL, "sgmpll", 0x0230, 0x023c, 0x00000001,
|
| 650 | 0, 32, 0x0230, 4, 0, 0x0234, 0, "clkxtal"),
|
| 651 | PLL(CK_APMIXED_WEDMCUPLL, "wedmcupll", 0x0240, 0x024c, 0x00000001,
|
| 652 | 0, 32, 0x0240, 4, 0, 0x0244, 0, "clkxtal"),
|
| 653 | PLL(CK_APMIXED_NET1PLL, "net1pll", 0x0250, 0x025c, 0x00000001,
|
| 654 | 0, 32, 0x0250, 4, 0, 0x0254, 0, "clkxtal"),
|
| 655 | PLL(CK_APMIXED_MPLL, "mpll", 0x0260, 0x0270, 0x00000001,
|
| 656 | 0, 32, 0x0260, 4, 0, 0x0264, 0, "clkxtal"),
|
| 657 | PLL(CK_APMIXED_APLL2, "apll2", 0x0278, 0x0288, 0x00000001,
|
| 658 | 0, 32, 0x0278, 4, 0, 0x027c, 0, "clkxtal"),
|
| 659 | };
|
| 660 |
|
| 661 | static struct clk_onecell_data *mt7986_top_clk_data __initdata;
|
| 662 | static struct clk_onecell_data *mt7986_pll_clk_data __initdata;
|
| 663 |
|
| 664 | static void __init mtk_clk_enable_critical(void)
|
| 665 | {
|
| 666 | if (!mt7986_top_clk_data || !mt7986_pll_clk_data)
|
| 667 | return;
|
| 668 |
|
| 669 | clk_prepare_enable(mt7986_pll_clk_data->clks[CK_APMIXED_ARMPLL]);
|
developer | 0fffed6 | 2021-06-29 14:17:11 +0800 | [diff] [blame^] | 670 | clk_prepare_enable(mt7986_top_clk_data->clks[CK_TOP_SYSAXI_SEL]);
|
| 671 | clk_prepare_enable(mt7986_top_clk_data->clks[CK_TOP_SYSAPB_SEL]);
|
| 672 | clk_prepare_enable(mt7986_top_clk_data->clks[CK_TOP_DRAMC_SEL]);
|
| 673 | clk_prepare_enable(mt7986_top_clk_data->clks[CK_TOP_DRAMC_MD32_SEL]);
|
developer | 15adbbf | 2021-05-24 22:20:07 +0800 | [diff] [blame] | 674 | }
|
| 675 |
|
| 676 | static void __init mtk_infracfg_init(struct device_node *node)
|
| 677 | {
|
| 678 | int r;
|
| 679 |
|
| 680 |
|
| 681 | mt7986_top_clk_data = mtk_alloc_clk_data(CLK_INFRA_NR_CLK);
|
| 682 |
|
| 683 | mtk_clk_register_factors(infra_divs, ARRAY_SIZE(infra_divs), mt7986_top_clk_data);
|
| 684 |
|
| 685 | r = of_clk_add_provider(node, of_clk_src_onecell_get, mt7986_top_clk_data);
|
| 686 |
|
| 687 | if (r)
|
| 688 | pr_err("%s(): could not register clock provider: %d\n",
|
| 689 | __func__, r);
|
| 690 |
|
| 691 | mtk_clk_enable_critical();
|
| 692 | }
|
| 693 | CLK_OF_DECLARE(mtk_infracfg, "mediatek,mt7986-infracfg", mtk_infracfg_init);
|
| 694 |
|
| 695 | static void __init mtk_topckgen_init(struct device_node *node)
|
| 696 | {
|
| 697 | int r;
|
| 698 | void __iomem *base;
|
| 699 |
|
| 700 | base = of_iomap(node, 0);
|
| 701 | if (!base) {
|
| 702 | pr_err("%s(): ioremap failed\n", __func__);
|
| 703 | return;
|
| 704 | }
|
| 705 |
|
| 706 | mt7986_top_clk_data = mtk_alloc_clk_data(CLK_TOP_NR_CLK);
|
| 707 |
|
| 708 | mtk_clk_register_factors(top_divs, ARRAY_SIZE(top_divs), mt7986_top_clk_data);
|
| 709 | mtk_clk_register_muxes(top_muxes, ARRAY_SIZE(top_muxes), node, &mt7986_clk_lock, mt7986_top_clk_data);
|
| 710 |
|
| 711 | r = of_clk_add_provider(node, of_clk_src_onecell_get, mt7986_top_clk_data);
|
| 712 |
|
| 713 | if (r)
|
| 714 | pr_err("%s(): could not register clock provider: %d\n",
|
| 715 | __func__, r);
|
| 716 |
|
| 717 | mtk_clk_enable_critical();
|
| 718 | }
|
| 719 | CLK_OF_DECLARE(mtk_topckgen, "mediatek,mt7986-topckgen", mtk_topckgen_init);
|
| 720 |
|
| 721 | static void __init mtk_infracfg_ao_init(struct device_node *node)
|
| 722 | {
|
| 723 | struct clk_onecell_data *clk_data;
|
| 724 | int r;
|
| 725 | void __iomem *base;
|
| 726 |
|
| 727 | base = of_iomap(node, 0);
|
| 728 | if (!base) {
|
| 729 | pr_err("%s(): ioremap failed\n", __func__);
|
| 730 | return;
|
| 731 | }
|
| 732 |
|
developer | b006d57 | 2021-06-07 16:29:44 +0800 | [diff] [blame] | 733 | clk_data = mtk_alloc_clk_data(CLK_INFRA_AO_NR_CLK);
|
developer | 15adbbf | 2021-05-24 22:20:07 +0800 | [diff] [blame] | 734 |
|
| 735 | mtk_clk_register_muxes(infra_muxes, ARRAY_SIZE(infra_muxes), node, &mt7986_clk_lock, clk_data);
|
| 736 | mtk_clk_register_gates(node, infra_clks, ARRAY_SIZE(infra_clks), clk_data);
|
| 737 |
|
| 738 | r = of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
|
| 739 |
|
| 740 | if (r)
|
| 741 | pr_err("%s(): could not register clock provider: %d\n",
|
| 742 | __func__, r);
|
| 743 | }
|
| 744 | CLK_OF_DECLARE(mtk_infracfg_ao, "mediatek,mt7986-infracfg_ao", mtk_infracfg_ao_init);
|
| 745 |
|
| 746 | static void __init mtk_apmixedsys_init(struct device_node *node)
|
| 747 | {
|
| 748 | int r;
|
| 749 |
|
| 750 | mt7986_pll_clk_data = mtk_alloc_clk_data(CLK_APMIXED_NR_CLK);
|
| 751 |
|
| 752 | mtk_clk_register_plls(node, plls, ARRAY_SIZE(plls), mt7986_pll_clk_data);
|
| 753 |
|
| 754 | r = of_clk_add_provider(node, of_clk_src_onecell_get, mt7986_pll_clk_data);
|
| 755 |
|
| 756 | if (r)
|
| 757 | pr_err("%s(): could not register clock provider: %d\n",
|
| 758 | __func__, r);
|
| 759 |
|
| 760 | mtk_clk_enable_critical();
|
| 761 | }
|
| 762 | CLK_OF_DECLARE(mtk_apmixedsys, "mediatek,mt7986-apmixedsys", mtk_apmixedsys_init);
|
| 763 |
|
| 764 | static void __init mtk_sgmiisys_0_init(struct device_node *node)
|
| 765 | {
|
| 766 | struct clk_onecell_data *clk_data;
|
| 767 | int r;
|
| 768 |
|
| 769 | clk_data = mtk_alloc_clk_data(CLK_SGMII0_NR_CLK);
|
| 770 |
|
| 771 | mtk_clk_register_gates(node, sgmii0_clks, ARRAY_SIZE(sgmii0_clks), clk_data);
|
| 772 |
|
| 773 | r = of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
|
| 774 |
|
| 775 | if (r)
|
| 776 | pr_err("%s(): could not register clock provider: %d\n",
|
| 777 | __func__, r);
|
| 778 | }
|
| 779 | CLK_OF_DECLARE(mtk_sgmiisys_0, "mediatek,mt7986-sgmiisys_0", mtk_sgmiisys_0_init);
|
| 780 |
|
| 781 | static void __init mtk_sgmiisys_1_init(struct device_node *node)
|
| 782 | {
|
| 783 | struct clk_onecell_data *clk_data;
|
| 784 | int r;
|
| 785 |
|
| 786 | clk_data = mtk_alloc_clk_data(CLK_SGMII1_NR_CLK);
|
| 787 |
|
| 788 | mtk_clk_register_gates(node, sgmii1_clks, ARRAY_SIZE(sgmii1_clks), clk_data);
|
| 789 |
|
| 790 | r = of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
|
| 791 |
|
| 792 | if (r)
|
| 793 | pr_err("%s(): could not register clock provider: %d\n",
|
| 794 | __func__, r);
|
| 795 | }
|
| 796 | CLK_OF_DECLARE(mtk_sgmiisys_1, "mediatek,mt7986-sgmiisys_1", mtk_sgmiisys_1_init);
|
| 797 |
|
| 798 | static void __init mtk_ethsys_init(struct device_node *node)
|
| 799 | {
|
| 800 | struct clk_onecell_data *clk_data;
|
| 801 | int r;
|
| 802 |
|
| 803 | clk_data = mtk_alloc_clk_data(CLK_ETH_NR_CLK);
|
| 804 |
|
| 805 | mtk_clk_register_gates(node, eth_clks, ARRAY_SIZE(eth_clks), clk_data);
|
| 806 |
|
| 807 | r = of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
|
| 808 |
|
| 809 | if (r)
|
| 810 | pr_err("%s(): could not register clock provider: %d\n",
|
| 811 | __func__, r);
|
| 812 | }
|
| 813 | CLK_OF_DECLARE(mtk_ethsys, "mediatek,mt7986-ethsys_ck", mtk_ethsys_init);
|
| 814 |
|