1b4966a7dSSam Shih // SPDX-License-Identifier: GPL-2.0 2ec97d23cSSam Shih /* 3ec97d23cSSam Shih * Copyright (c) 2021 MediaTek Inc. 4ec97d23cSSam Shih * Author: Sam Shih <sam.shih@mediatek.com> 5ec97d23cSSam Shih * Author: Wenzhen Yu <wenzhen.yu@mediatek.com> 6ec97d23cSSam Shih */ 7ec97d23cSSam Shih 8ec97d23cSSam Shih #include <linux/clk-provider.h> 9ec97d23cSSam Shih #include <linux/of.h> 10ec97d23cSSam Shih #include <linux/of_address.h> 11ec97d23cSSam Shih #include <linux/of_device.h> 12ec97d23cSSam Shih #include <linux/platform_device.h> 13ec97d23cSSam Shih #include "clk-mtk.h" 14ec97d23cSSam Shih #include "clk-gate.h" 15ec97d23cSSam Shih #include "clk-mux.h" 16ec97d23cSSam Shih 17ec97d23cSSam Shih #include <dt-bindings/clock/mt7986-clk.h> 18ec97d23cSSam Shih #include <linux/clk.h> 19ec97d23cSSam Shih 20ec97d23cSSam Shih static DEFINE_SPINLOCK(mt7986_clk_lock); 21ec97d23cSSam Shih 22ec97d23cSSam Shih static const struct mtk_fixed_clk top_fixed_clks[] = { 23ec97d23cSSam Shih FIXED_CLK(CLK_TOP_XTAL, "top_xtal", "clkxtal", 40000000), 24ec97d23cSSam Shih FIXED_CLK(CLK_TOP_JTAG, "top_jtag", "clkxtal", 50000000), 25ec97d23cSSam Shih }; 26ec97d23cSSam Shih 27ec97d23cSSam Shih static const struct mtk_fixed_factor top_divs[] = { 28ec97d23cSSam Shih /* XTAL */ 29ec97d23cSSam Shih FACTOR(CLK_TOP_XTAL_D2, "top_xtal_d2", "top_xtal", 1, 2), 30ec97d23cSSam Shih FACTOR(CLK_TOP_RTC_32K, "top_rtc_32k", "top_xtal", 1, 1250), 31ec97d23cSSam Shih FACTOR(CLK_TOP_RTC_32P7K, "top_rtc_32p7k", "top_xtal", 1, 1220), 32ec97d23cSSam Shih /* MPLL */ 33ec97d23cSSam Shih FACTOR(CLK_TOP_MPLL_D2, "top_mpll_d2", "mpll", 1, 2), 34ec97d23cSSam Shih FACTOR(CLK_TOP_MPLL_D4, "top_mpll_d4", "mpll", 1, 4), 35ec97d23cSSam Shih FACTOR(CLK_TOP_MPLL_D8, "top_mpll_d8", "mpll", 1, 8), 36ec97d23cSSam Shih FACTOR(CLK_TOP_MPLL_D8_D2, "top_mpll_d8_d2", "mpll", 1, 16), 37ec97d23cSSam Shih FACTOR(CLK_TOP_MPLL_D3_D2, "top_mpll_d3_d2", "mpll", 1, 6), 38ec97d23cSSam Shih /* MMPLL */ 39ec97d23cSSam Shih FACTOR(CLK_TOP_MMPLL_D2, "top_mmpll_d2", "mmpll", 1, 2), 40ec97d23cSSam Shih FACTOR(CLK_TOP_MMPLL_D4, "top_mmpll_d4", "mmpll", 1, 4), 41ec97d23cSSam Shih FACTOR(CLK_TOP_MMPLL_D8, "top_mmpll_d8", "mmpll", 1, 8), 42ec97d23cSSam Shih FACTOR(CLK_TOP_MMPLL_D8_D2, "top_mmpll_d8_d2", "mmpll", 1, 16), 43ec97d23cSSam Shih FACTOR(CLK_TOP_MMPLL_D3_D8, "top_mmpll_d3_d8", "mmpll", 1, 24), 44ec97d23cSSam Shih FACTOR(CLK_TOP_MMPLL_U2PHY, "top_mmpll_u2phy", "mmpll", 1, 30), 45ec97d23cSSam Shih /* APLL2 */ 46ec97d23cSSam Shih FACTOR(CLK_TOP_APLL2_D4, "top_apll2_d4", "apll2", 1, 4), 47ec97d23cSSam Shih /* NET1PLL */ 48ec97d23cSSam Shih FACTOR(CLK_TOP_NET1PLL_D4, "top_net1pll_d4", "net1pll", 1, 4), 49ec97d23cSSam Shih FACTOR(CLK_TOP_NET1PLL_D5, "top_net1pll_d5", "net1pll", 1, 5), 50ec97d23cSSam Shih FACTOR(CLK_TOP_NET1PLL_D5_D2, "top_net1pll_d5_d2", "net1pll", 1, 10), 51ec97d23cSSam Shih FACTOR(CLK_TOP_NET1PLL_D5_D4, "top_net1pll_d5_d4", "net1pll", 1, 20), 52ec97d23cSSam Shih FACTOR(CLK_TOP_NET1PLL_D8_D2, "top_net1pll_d8_d2", "net1pll", 1, 16), 53ec97d23cSSam Shih FACTOR(CLK_TOP_NET1PLL_D8_D4, "top_net1pll_d8_d4", "net1pll", 1, 32), 54ec97d23cSSam Shih /* NET2PLL */ 55ec97d23cSSam Shih FACTOR(CLK_TOP_NET2PLL_D4, "top_net2pll_d4", "net2pll", 1, 4), 56ec97d23cSSam Shih FACTOR(CLK_TOP_NET2PLL_D4_D2, "top_net2pll_d4_d2", "net2pll", 1, 8), 57ec97d23cSSam Shih FACTOR(CLK_TOP_NET2PLL_D3_D2, "top_net2pll_d3_d2", "net2pll", 1, 2), 58ec97d23cSSam Shih /* WEDMCUPLL */ 59ec97d23cSSam Shih FACTOR(CLK_TOP_WEDMCUPLL_D5_D2, "top_wedmcupll_d5_d2", "wedmcupll", 1, 60ec97d23cSSam Shih 10), 61ec97d23cSSam Shih }; 62ec97d23cSSam Shih 63ec97d23cSSam Shih static const char *const nfi1x_parents[] __initconst = { "top_xtal", 64ec97d23cSSam Shih "top_mmpll_d8", 65ec97d23cSSam Shih "top_net1pll_d8_d2", 66ec97d23cSSam Shih "top_net2pll_d3_d2", 67ec97d23cSSam Shih "top_mpll_d4", 68ec97d23cSSam Shih "top_mmpll_d8_d2", 69ec97d23cSSam Shih "top_wedmcupll_d5_d2", 70ec97d23cSSam Shih "top_mpll_d8" }; 71ec97d23cSSam Shih 72ec97d23cSSam Shih static const char *const spinfi_parents[] __initconst = { 73ec97d23cSSam Shih "top_xtal_d2", "top_xtal", "top_net1pll_d5_d4", 74ec97d23cSSam Shih "top_mpll_d4", "top_mmpll_d8_d2", "top_wedmcupll_d5_d2", 75ec97d23cSSam Shih "top_mmpll_d3_d8", "top_mpll_d8" 76ec97d23cSSam Shih }; 77ec97d23cSSam Shih 78ec97d23cSSam Shih static const char *const spi_parents[] __initconst = { 79ec97d23cSSam Shih "top_xtal", "top_mpll_d2", "top_mmpll_d8", 80ec97d23cSSam Shih "top_net1pll_d8_d2", "top_net2pll_d3_d2", "top_net1pll_d5_d4", 81ec97d23cSSam Shih "top_mpll_d4", "top_wedmcupll_d5_d2" 82ec97d23cSSam Shih }; 83ec97d23cSSam Shih 84ec97d23cSSam Shih static const char *const uart_parents[] __initconst = { "top_xtal", 85ec97d23cSSam Shih "top_mpll_d8", 86ec97d23cSSam Shih "top_mpll_d8_d2" }; 87ec97d23cSSam Shih 88ec97d23cSSam Shih static const char *const pwm_parents[] __initconst = { 89ec97d23cSSam Shih "top_xtal", "top_net1pll_d8_d2", "top_net1pll_d5_d4", "top_mpll_d4" 90ec97d23cSSam Shih }; 91ec97d23cSSam Shih 92ec97d23cSSam Shih static const char *const i2c_parents[] __initconst = { 93ec97d23cSSam Shih "top_xtal", "top_net1pll_d5_d4", "top_mpll_d4", "top_net1pll_d8_d4" 94ec97d23cSSam Shih }; 95ec97d23cSSam Shih 96ec97d23cSSam Shih static const char *const pextp_tl_ck_parents[] __initconst = { 97ec97d23cSSam Shih "top_xtal", "top_net1pll_d5_d4", "top_net2pll_d4_d2", "top_rtc_32k" 98ec97d23cSSam Shih }; 99ec97d23cSSam Shih 100ec97d23cSSam Shih static const char *const emmc_250m_parents[] __initconst = { 101ec97d23cSSam Shih "top_xtal", "top_net1pll_d5_d2" 102ec97d23cSSam Shih }; 103ec97d23cSSam Shih 104ec97d23cSSam Shih static const char *const emmc_416m_parents[] __initconst = { "top_xtal", 105ec97d23cSSam Shih "mpll" }; 106ec97d23cSSam Shih 107ec97d23cSSam Shih static const char *const f_26m_adc_parents[] __initconst = { "top_xtal", 108ec97d23cSSam Shih "top_mpll_d8_d2" }; 109ec97d23cSSam Shih 110ec97d23cSSam Shih static const char *const dramc_md32_parents[] __initconst = { "top_xtal", 111ec97d23cSSam Shih "top_mpll_d2" }; 112ec97d23cSSam Shih 113ec97d23cSSam Shih static const char *const sysaxi_parents[] __initconst = { "top_xtal", 114ec97d23cSSam Shih "top_net1pll_d8_d2", 115ec97d23cSSam Shih "top_net2pll_d4" }; 116ec97d23cSSam Shih 117ec97d23cSSam Shih static const char *const sysapb_parents[] __initconst = { "top_xtal", 118ec97d23cSSam Shih "top_mpll_d3_d2", 119ec97d23cSSam Shih "top_net2pll_d4_d2" }; 120ec97d23cSSam Shih 121ec97d23cSSam Shih static const char *const arm_db_main_parents[] __initconst = { 122ec97d23cSSam Shih "top_xtal", "top_net2pll_d3_d2" 123ec97d23cSSam Shih }; 124ec97d23cSSam Shih 125ec97d23cSSam Shih static const char *const arm_db_jtsel_parents[] __initconst = { "top_jtag", 126ec97d23cSSam Shih "top_xtal" }; 127ec97d23cSSam Shih 128ec97d23cSSam Shih static const char *const netsys_parents[] __initconst = { "top_xtal", 129ec97d23cSSam Shih "top_mmpll_d4" }; 130ec97d23cSSam Shih 131ec97d23cSSam Shih static const char *const netsys_500m_parents[] __initconst = { 132ec97d23cSSam Shih "top_xtal", "top_net1pll_d5" 133ec97d23cSSam Shih }; 134ec97d23cSSam Shih 135ec97d23cSSam Shih static const char *const netsys_mcu_parents[] __initconst = { 136ec97d23cSSam Shih "top_xtal", "wedmcupll", "top_mmpll_d2", "top_net1pll_d4", 137ec97d23cSSam Shih "top_net1pll_d5" 138ec97d23cSSam Shih }; 139ec97d23cSSam Shih 140ec97d23cSSam Shih static const char *const netsys_2x_parents[] __initconst = { 141ec97d23cSSam Shih "top_xtal", "net2pll", "wedmcupll", "top_mmpll_d2" 142ec97d23cSSam Shih }; 143ec97d23cSSam Shih 144ec97d23cSSam Shih static const char *const sgm_325m_parents[] __initconst = { "top_xtal", 145ec97d23cSSam Shih "sgmpll" }; 146ec97d23cSSam Shih 147ec97d23cSSam Shih static const char *const sgm_reg_parents[] __initconst = { 148ec97d23cSSam Shih "top_xtal", "top_net1pll_d8_d4" 149ec97d23cSSam Shih }; 150ec97d23cSSam Shih 151ec97d23cSSam Shih static const char *const a1sys_parents[] __initconst = { "top_xtal", 152ec97d23cSSam Shih "top_apll2_d4" }; 153ec97d23cSSam Shih 154ec97d23cSSam Shih static const char *const conn_mcusys_parents[] __initconst = { "top_xtal", 155ec97d23cSSam Shih "top_mmpll_d2" }; 156ec97d23cSSam Shih 157ec97d23cSSam Shih static const char *const eip_b_parents[] __initconst = { "top_xtal", 158ec97d23cSSam Shih "net2pll" }; 159ec97d23cSSam Shih 160ec97d23cSSam Shih static const char *const aud_l_parents[] __initconst = { "top_xtal", "apll2", 161ec97d23cSSam Shih "top_mpll_d8_d2" }; 162ec97d23cSSam Shih 163ec97d23cSSam Shih static const char *const a_tuner_parents[] __initconst = { "top_xtal", 164ec97d23cSSam Shih "top_apll2_d4", 165ec97d23cSSam Shih "top_mpll_d8_d2" }; 166ec97d23cSSam Shih 167ec97d23cSSam Shih static const char *const u2u3_sys_parents[] __initconst = { 168ec97d23cSSam Shih "top_xtal", "top_net1pll_d5_d4" 169ec97d23cSSam Shih }; 170ec97d23cSSam Shih 171ec97d23cSSam Shih static const char *const da_u2_refsel_parents[] __initconst = { 172ec97d23cSSam Shih "top_xtal", "top_mmpll_u2phy" 173ec97d23cSSam Shih }; 174ec97d23cSSam Shih 175ec97d23cSSam Shih static const struct mtk_mux top_muxes[] = { 176ec97d23cSSam Shih /* CLK_CFG_0 */ 177ec97d23cSSam Shih MUX_GATE_CLR_SET_UPD(CLK_TOP_NFI1X_SEL, "nfi1x_sel", nfi1x_parents, 178ec97d23cSSam Shih 0x000, 0x004, 0x008, 0, 3, 7, 0x1C0, 0), 179ec97d23cSSam Shih MUX_GATE_CLR_SET_UPD(CLK_TOP_SPINFI_SEL, "spinfi_sel", spinfi_parents, 180ec97d23cSSam Shih 0x000, 0x004, 0x008, 8, 3, 15, 0x1C0, 1), 181ec97d23cSSam Shih MUX_GATE_CLR_SET_UPD(CLK_TOP_SPI_SEL, "spi_sel", spi_parents, 0x000, 182ec97d23cSSam Shih 0x004, 0x008, 16, 3, 23, 0x1C0, 2), 183ec97d23cSSam Shih MUX_GATE_CLR_SET_UPD(CLK_TOP_SPIM_MST_SEL, "spim_mst_sel", spi_parents, 184ec97d23cSSam Shih 0x000, 0x004, 0x008, 24, 3, 31, 0x1C0, 3), 185ec97d23cSSam Shih /* CLK_CFG_1 */ 186ec97d23cSSam Shih MUX_GATE_CLR_SET_UPD(CLK_TOP_UART_SEL, "uart_sel", uart_parents, 0x010, 187ec97d23cSSam Shih 0x014, 0x018, 0, 2, 7, 0x1C0, 4), 188ec97d23cSSam Shih MUX_GATE_CLR_SET_UPD(CLK_TOP_PWM_SEL, "pwm_sel", pwm_parents, 0x010, 189ec97d23cSSam Shih 0x014, 0x018, 8, 2, 15, 0x1C0, 5), 190ec97d23cSSam Shih MUX_GATE_CLR_SET_UPD(CLK_TOP_I2C_SEL, "i2c_sel", i2c_parents, 0x010, 191ec97d23cSSam Shih 0x014, 0x018, 16, 2, 23, 0x1C0, 6), 192ec97d23cSSam Shih MUX_GATE_CLR_SET_UPD(CLK_TOP_PEXTP_TL_SEL, "pextp_tl_ck_sel", 193ec97d23cSSam Shih pextp_tl_ck_parents, 0x010, 0x014, 0x018, 24, 2, 194ec97d23cSSam Shih 31, 0x1C0, 7), 195ec97d23cSSam Shih /* CLK_CFG_2 */ 196ec97d23cSSam Shih MUX_GATE_CLR_SET_UPD(CLK_TOP_EMMC_250M_SEL, "emmc_250m_sel", 197ec97d23cSSam Shih emmc_250m_parents, 0x020, 0x024, 0x028, 0, 1, 7, 198ec97d23cSSam Shih 0x1C0, 8), 199ec97d23cSSam Shih MUX_GATE_CLR_SET_UPD(CLK_TOP_EMMC_416M_SEL, "emmc_416m_sel", 200ec97d23cSSam Shih emmc_416m_parents, 0x020, 0x024, 0x028, 8, 1, 15, 201ec97d23cSSam Shih 0x1C0, 9), 202ec97d23cSSam Shih MUX_GATE_CLR_SET_UPD(CLK_TOP_F_26M_ADC_SEL, "f_26m_adc_sel", 203ec97d23cSSam Shih f_26m_adc_parents, 0x020, 0x024, 0x028, 16, 1, 23, 204ec97d23cSSam Shih 0x1C0, 10), 205a0c3ef25SAngeloGioacchino Del Regno MUX_GATE_CLR_SET_UPD_FLAGS(CLK_TOP_DRAMC_SEL, "dramc_sel", 206a0c3ef25SAngeloGioacchino Del Regno f_26m_adc_parents, 0x020, 0x024, 0x028, 207a0c3ef25SAngeloGioacchino Del Regno 24, 1, 31, 0x1C0, 11, 208a0c3ef25SAngeloGioacchino Del Regno CLK_IS_CRITICAL | CLK_SET_RATE_PARENT), 209ec97d23cSSam Shih /* CLK_CFG_3 */ 210a0c3ef25SAngeloGioacchino Del Regno MUX_GATE_CLR_SET_UPD_FLAGS(CLK_TOP_DRAMC_MD32_SEL, "dramc_md32_sel", 211a0c3ef25SAngeloGioacchino Del Regno dramc_md32_parents, 0x030, 0x034, 0x038, 212a0c3ef25SAngeloGioacchino Del Regno 0, 1, 7, 0x1C0, 12, 213a0c3ef25SAngeloGioacchino Del Regno CLK_IS_CRITICAL | CLK_SET_RATE_PARENT), 214a0c3ef25SAngeloGioacchino Del Regno MUX_GATE_CLR_SET_UPD_FLAGS(CLK_TOP_SYSAXI_SEL, "sysaxi_sel", 215a0c3ef25SAngeloGioacchino Del Regno sysaxi_parents, 0x030, 0x034, 0x038, 216a0c3ef25SAngeloGioacchino Del Regno 8, 2, 15, 0x1C0, 13, 217a0c3ef25SAngeloGioacchino Del Regno CLK_IS_CRITICAL | CLK_SET_RATE_PARENT), 218a0c3ef25SAngeloGioacchino Del Regno MUX_GATE_CLR_SET_UPD_FLAGS(CLK_TOP_SYSAPB_SEL, "sysapb_sel", 219a0c3ef25SAngeloGioacchino Del Regno sysapb_parents, 0x030, 0x034, 0x038, 220a0c3ef25SAngeloGioacchino Del Regno 16, 2, 23, 0x1C0, 14, 221a0c3ef25SAngeloGioacchino Del Regno CLK_IS_CRITICAL | CLK_SET_RATE_PARENT), 222ec97d23cSSam Shih MUX_GATE_CLR_SET_UPD(CLK_TOP_ARM_DB_MAIN_SEL, "arm_db_main_sel", 223ec97d23cSSam Shih arm_db_main_parents, 0x030, 0x034, 0x038, 24, 1, 224ec97d23cSSam Shih 31, 0x1C0, 15), 225ec97d23cSSam Shih /* CLK_CFG_4 */ 226ec97d23cSSam Shih MUX_GATE_CLR_SET_UPD(CLK_TOP_ARM_DB_JTSEL, "arm_db_jtsel", 227ec97d23cSSam Shih arm_db_jtsel_parents, 0x040, 0x044, 0x048, 0, 1, 7, 228ec97d23cSSam Shih 0x1C0, 16), 229ec97d23cSSam Shih MUX_GATE_CLR_SET_UPD(CLK_TOP_NETSYS_SEL, "netsys_sel", netsys_parents, 230ec97d23cSSam Shih 0x040, 0x044, 0x048, 8, 1, 15, 0x1C0, 17), 231ec97d23cSSam Shih MUX_GATE_CLR_SET_UPD(CLK_TOP_NETSYS_500M_SEL, "netsys_500m_sel", 232ec97d23cSSam Shih netsys_500m_parents, 0x040, 0x044, 0x048, 16, 1, 233ec97d23cSSam Shih 23, 0x1C0, 18), 234ec97d23cSSam Shih MUX_GATE_CLR_SET_UPD(CLK_TOP_NETSYS_MCU_SEL, "netsys_mcu_sel", 235ec97d23cSSam Shih netsys_mcu_parents, 0x040, 0x044, 0x048, 24, 3, 31, 236ec97d23cSSam Shih 0x1C0, 19), 237ec97d23cSSam Shih /* CLK_CFG_5 */ 238ec97d23cSSam Shih MUX_GATE_CLR_SET_UPD(CLK_TOP_NETSYS_2X_SEL, "netsys_2x_sel", 239ec97d23cSSam Shih netsys_2x_parents, 0x050, 0x054, 0x058, 0, 2, 7, 240ec97d23cSSam Shih 0x1C0, 20), 241ec97d23cSSam Shih MUX_GATE_CLR_SET_UPD(CLK_TOP_SGM_325M_SEL, "sgm_325m_sel", 242ec97d23cSSam Shih sgm_325m_parents, 0x050, 0x054, 0x058, 8, 1, 15, 243ec97d23cSSam Shih 0x1C0, 21), 244a0c3ef25SAngeloGioacchino Del Regno MUX_GATE_CLR_SET_UPD_FLAGS(CLK_TOP_SGM_REG_SEL, "sgm_reg_sel", 245a0c3ef25SAngeloGioacchino Del Regno sgm_reg_parents, 0x050, 0x054, 0x058, 246a0c3ef25SAngeloGioacchino Del Regno 16, 1, 23, 0x1C0, 22, 247a0c3ef25SAngeloGioacchino Del Regno CLK_IS_CRITICAL | CLK_SET_RATE_PARENT), 248ec97d23cSSam Shih MUX_GATE_CLR_SET_UPD(CLK_TOP_A1SYS_SEL, "a1sys_sel", a1sys_parents, 249ec97d23cSSam Shih 0x050, 0x054, 0x058, 24, 1, 31, 0x1C0, 23), 250ec97d23cSSam Shih /* CLK_CFG_6 */ 251ec97d23cSSam Shih MUX_GATE_CLR_SET_UPD(CLK_TOP_CONN_MCUSYS_SEL, "conn_mcusys_sel", 252ec97d23cSSam Shih conn_mcusys_parents, 0x060, 0x064, 0x068, 0, 1, 7, 253ec97d23cSSam Shih 0x1C0, 24), 254ec97d23cSSam Shih MUX_GATE_CLR_SET_UPD(CLK_TOP_EIP_B_SEL, "eip_b_sel", eip_b_parents, 255ec97d23cSSam Shih 0x060, 0x064, 0x068, 8, 1, 15, 0x1C0, 25), 256ec97d23cSSam Shih MUX_GATE_CLR_SET_UPD(CLK_TOP_PCIE_PHY_SEL, "pcie_phy_sel", 257ec97d23cSSam Shih f_26m_adc_parents, 0x060, 0x064, 0x068, 16, 1, 23, 258ec97d23cSSam Shih 0x1C0, 26), 259ec97d23cSSam Shih MUX_GATE_CLR_SET_UPD(CLK_TOP_USB3_PHY_SEL, "usb3_phy_sel", 260ec97d23cSSam Shih f_26m_adc_parents, 0x060, 0x064, 0x068, 24, 1, 31, 261ec97d23cSSam Shih 0x1C0, 27), 262ec97d23cSSam Shih /* CLK_CFG_7 */ 263a0c3ef25SAngeloGioacchino Del Regno MUX_GATE_CLR_SET_UPD_FLAGS(CLK_TOP_F26M_SEL, "csw_f26m_sel", 264a0c3ef25SAngeloGioacchino Del Regno f_26m_adc_parents, 0x070, 0x074, 0x078, 265a0c3ef25SAngeloGioacchino Del Regno 0, 1, 7, 0x1C0, 28, 266a0c3ef25SAngeloGioacchino Del Regno CLK_IS_CRITICAL | CLK_SET_RATE_PARENT), 267ec97d23cSSam Shih MUX_GATE_CLR_SET_UPD(CLK_TOP_AUD_L_SEL, "aud_l_sel", aud_l_parents, 268ec97d23cSSam Shih 0x070, 0x074, 0x078, 8, 2, 15, 0x1C0, 29), 269ec97d23cSSam Shih MUX_GATE_CLR_SET_UPD(CLK_TOP_A_TUNER_SEL, "a_tuner_sel", 270ec97d23cSSam Shih a_tuner_parents, 0x070, 0x074, 0x078, 16, 2, 23, 271ec97d23cSSam Shih 0x1C0, 30), 272ec97d23cSSam Shih MUX_GATE_CLR_SET_UPD(CLK_TOP_U2U3_SEL, "u2u3_sel", f_26m_adc_parents, 273ec97d23cSSam Shih 0x070, 0x074, 0x078, 24, 1, 31, 0x1C4, 0), 274ec97d23cSSam Shih /* CLK_CFG_8 */ 275ec97d23cSSam Shih MUX_GATE_CLR_SET_UPD(CLK_TOP_U2U3_SYS_SEL, "u2u3_sys_sel", 276ec97d23cSSam Shih u2u3_sys_parents, 0x080, 0x084, 0x088, 0, 1, 7, 277ec97d23cSSam Shih 0x1C4, 1), 278ec97d23cSSam Shih MUX_GATE_CLR_SET_UPD(CLK_TOP_U2U3_XHCI_SEL, "u2u3_xhci_sel", 279ec97d23cSSam Shih u2u3_sys_parents, 0x080, 0x084, 0x088, 8, 1, 15, 280ec97d23cSSam Shih 0x1C4, 2), 281ec97d23cSSam Shih MUX_GATE_CLR_SET_UPD(CLK_TOP_DA_U2_REFSEL, "da_u2_refsel", 282ec97d23cSSam Shih da_u2_refsel_parents, 0x080, 0x084, 0x088, 16, 1, 283ec97d23cSSam Shih 23, 0x1C4, 3), 284ec97d23cSSam Shih MUX_GATE_CLR_SET_UPD(CLK_TOP_DA_U2_CK_1P_SEL, "da_u2_ck_1p_sel", 285ec97d23cSSam Shih da_u2_refsel_parents, 0x080, 0x084, 0x088, 24, 1, 286ec97d23cSSam Shih 31, 0x1C4, 4), 287ec97d23cSSam Shih /* CLK_CFG_9 */ 288ec97d23cSSam Shih MUX_GATE_CLR_SET_UPD(CLK_TOP_AP2CNN_HOST_SEL, "ap2cnn_host_sel", 289ec97d23cSSam Shih sgm_reg_parents, 0x090, 0x094, 0x098, 0, 1, 7, 290ec97d23cSSam Shih 0x1C4, 5), 291ec97d23cSSam Shih }; 292ec97d23cSSam Shih 2939d8d1fe5SAngeloGioacchino Del Regno static const struct mtk_clk_desc topck_desc = { 2949d8d1fe5SAngeloGioacchino Del Regno .fixed_clks = top_fixed_clks, 2959d8d1fe5SAngeloGioacchino Del Regno .num_fixed_clks = ARRAY_SIZE(top_fixed_clks), 2969d8d1fe5SAngeloGioacchino Del Regno .factor_clks = top_divs, 2979d8d1fe5SAngeloGioacchino Del Regno .num_factor_clks = ARRAY_SIZE(top_divs), 2989d8d1fe5SAngeloGioacchino Del Regno .mux_clks = top_muxes, 2999d8d1fe5SAngeloGioacchino Del Regno .num_mux_clks = ARRAY_SIZE(top_muxes), 3009d8d1fe5SAngeloGioacchino Del Regno .clk_lock = &mt7986_clk_lock, 3019d8d1fe5SAngeloGioacchino Del Regno }; 302ec97d23cSSam Shih 303ec97d23cSSam Shih static const struct of_device_id of_match_clk_mt7986_topckgen[] = { 3049d8d1fe5SAngeloGioacchino Del Regno { .compatible = "mediatek,mt7986-topckgen", .data = &topck_desc }, 3059d8d1fe5SAngeloGioacchino Del Regno { /* sentinel */ } 306ec97d23cSSam Shih }; 307*65c9ad77SAngeloGioacchino Del Regno MODULE_DEVICE_TABLE(of, of_match_clk_mt7986_topckgen); 308ec97d23cSSam Shih 309ec97d23cSSam Shih static struct platform_driver clk_mt7986_topckgen_drv = { 3109d8d1fe5SAngeloGioacchino Del Regno .probe = mtk_clk_simple_probe, 3119d8d1fe5SAngeloGioacchino Del Regno .remove = mtk_clk_simple_remove, 312ec97d23cSSam Shih .driver = { 313ec97d23cSSam Shih .name = "clk-mt7986-topckgen", 314ec97d23cSSam Shih .of_match_table = of_match_clk_mt7986_topckgen, 315ec97d23cSSam Shih }, 316ec97d23cSSam Shih }; 317164d240dSAngeloGioacchino Del Regno module_platform_driver(clk_mt7986_topckgen_drv); 318a451da86SAngeloGioacchino Del Regno MODULE_LICENSE("GPL"); 319