| // Copyright 2018 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef SRC_DEVICES_CLOCK_DRIVERS_AMLOGIC_CLK_AML_G12B_BLOCKS_H_ |
| #define SRC_DEVICES_CLOCK_DRIVERS_AMLOGIC_CLK_AML_G12B_BLOCKS_H_ |
| |
| #include <soc/aml-meson/g12b-clk.h> |
| |
| #include "aml-clk-blocks.h" |
| |
| // TODO(braval): Use common bitfield header (https://fxbug.dev/42107456) when available for |
| // macros used below to avoid duplication. |
| #define BIT(pos) (1U << (pos)) |
| #define MSR_CLK_SRC_MASK 0x7f |
| #define MSR_VAL_MASK 0x000FFFFF |
| #define MSR_CLK_SRC_SHIFT 20 |
| #define MSR_ENABLE BIT(16) |
| #define MSR_CONT BIT(17) // continuous measurement. |
| #define MSR_INTR BIT(18) // interrupts. |
| #define MSR_RUN BIT(19) |
| #define MSR_BUSY BIT(31) |
| |
| constexpr uint32_t kG12bHhiSysCpuClkCntl1 = (0x57 << 2); |
| constexpr uint32_t kG12bHhiSysCpubClkCntl1 = (0x80 << 2); |
| constexpr uint32_t kG12bHhiSysCpubClkCntl = (0x82 << 2); |
| constexpr uint32_t kG12bHhiTsClkCntl = (0x64 << 2); |
| constexpr uint32_t kG12bHhiXtalDivnCntl = (0x2f << 2); |
| constexpr uint32_t kG12bDosGclkEn0 = (0x3f01 << 2); |
| constexpr uint32_t kG12bHhiGclkMpeg0 = (0x50 << 2); |
| constexpr uint32_t kG12bHhiGclkMpeg1 = (0x51 << 2); |
| constexpr uint32_t kG12bHhiGclkMpeg2 = (0x52 << 2); |
| |
| // NOTE: This list only contains the clocks in use currently and |
| // not all available clocks. |
| static constexpr meson_clk_gate_t g12b_clk_gates[] = { |
| // SYS CPU Clock gates. |
| {.reg = kG12bHhiSysCpuClkCntl1, .bit = 24}, // G12B_CLK_SYS_PLL_DIV16 |
| {.reg = kG12bHhiSysCpuClkCntl1, .bit = 1}, // G12B_CLK_SYS_CPU_CLK_DIV16 |
| {.reg = kG12bHhiXtalDivnCntl, .bit = 11}, // G12B_CLK_CAM_INCK_24M |
| |
| // SYS CPUB Clock gates. |
| {.reg = kG12bHhiSysCpubClkCntl1, .bit = 24}, // G12B_CLK_SYS_PLLB_DIV16 |
| {.reg = kG12bHhiSysCpubClkCntl1, .bit = 1}, // G12B_CLK_SYS_CPUB_CLK_DIV16 |
| |
| {.reg = kG12bDosGclkEn0, |
| .bit = 0, |
| .register_set = kMesonRegisterSetDos, |
| .mask = 0x3ff}, // G12B_CLK_DOS_GCLK_VDEC |
| {.reg = kG12bDosGclkEn0, |
| .register_set = kMesonRegisterSetDos, |
| .mask = 0x7fff << 12}, // G12B_CLK_DOS_GCLK_HCODEC |
| |
| // Mpeg0 DOS Clock gate |
| {.reg = kG12bHhiGclkMpeg0, .bit = 1}, // G12B_CLK_DOS |
| |
| // USB gates |
| {.reg = kG12bHhiGclkMpeg1, .bit = 26}, // G12B_CLK_USB |
| {.reg = kG12bHhiGclkMpeg2, .bit = 8}, // G12B_CLK_USB1_TO_DDR |
| |
| {.reg = kG12bHhiXtalDivnCntl, .bit = 12}, // G12B_CLK_25M |
| |
| {.reg = kG12bHhiGclkMpeg1, .bit = 0}, // G12B_CLK_AUDIO |
| {.reg = kG12bHhiGclkMpeg0, .bit = 26}, // G12B_CLK_EMMC_C |
| |
| {.reg = kG12bHhiTsClkCntl, .bit = 8}, // For Temperature Sensors |
| }; |
| |
| static_assert(g12b_clk::CLK_G12B_COUNT == std::size(g12b_clk_gates), |
| "g12b_clk_gates[] and g12b_clk_gate_idx_t count mismatch"); |
| |
| static meson_clk_msr_t g12b_clk_msr = { |
| .reg0_offset = (0x1 << 2), |
| .reg2_offset = (0x3 << 2), |
| }; |
| |
| static constexpr meson_cpu_clk_t g12b_cpu_clks[] = { |
| {.reg = kG12bHhiSysCpubClkCntl, .pll = SYS_PLL, .initial_hz = 1'000'000'000}, // Big Cluster |
| {.reg = kHhiSysCpuClkCntl0, .pll = SYS1_PLL, .initial_hz = 1'200'000'000}, // Little Cluster |
| }; |
| |
| // This clock table is meant only for CLK-MEASURE |
| // Indexes here, correspond to actual clk mux |
| // values written to measure respective clk. |
| static const char* const g12b_clk_table[] = { |
| "am_ring_osc_clk_out_ee[0]", // 0 |
| "am_ring_osc_clk_out_ee[1]", // 1 |
| "am_ring_osc_clk_out_ee[2]", // 2 |
| "sys_cpu_ring_osc_clk[0]", // 3 |
| "gp0_pll_clk", // 4 |
| "1'b0", // 5 |
| "cts_enci_clk", // 6 |
| "clk81", // 7 |
| "cts_encp_clk", // 8 |
| "cts_encl_clk", // 9 |
| "cts_vdac_clk", // 10 |
| "mac_eth_tx_clk", // 11 |
| "hifi_pll_clk", // 12 |
| "mod_tcon_clko", // 13 |
| "cts_FEC_CLK_0", // 14 |
| "cts_FEC_CLK_1", // 15 |
| "cts_FEC_CLK_2", // 16 |
| "sys_pll_div16", // 17 |
| "sys_cpu_clk_div16", // 18 |
| "lcd_an_clk_ph2", // 19 |
| "rtc_osc_clk_out", // 20 |
| "lcd_an_clk_ph3", // 21 |
| "mac_eth_phy_ref_clk", // 22 |
| "mpll_clk_50m", // 23 |
| "cts_eth_clk125Mhz", // 24 |
| "cts_eth_clk_rmii", // 25 |
| "sc_clk_int", // 26 |
| "co_clkin_to_mac", // 27 |
| "cts_sar_adc_clk", // 28 |
| "pcie_clk_inp", // 29 |
| "pcie_clk_inn", // 30 |
| "mpll_clk_test_out", // 31 |
| "cts_vdec_clk", // 32 |
| "sys_cpu_ring_osc_clk[1]", // 33 |
| "eth_mppll_50m_ckout", // 34 |
| "cts_mali_clk", // 35 |
| "cts_hdmi_tx_pixel_clk", // 36 |
| "cts_cdac_clk_c", // 37 |
| "cts_vdin_meas_clk", // 38 |
| "cts_bt656_clk0", // 39 |
| "1'b0", // 40 |
| "mac_eth_rx_clk_rmii", // 41 |
| "mp0_clk_out", // 42 |
| "fclk_div5", // 43 |
| "cts_pwm_B_clk", // 44 |
| "cts_pwm_A_clk", // 45 |
| "cts_vpu_clk", // 46 |
| "ddr_dpll_pt_clk", // 47 |
| "mp1_clk_out", // 48 |
| "mp2_clk_out", // 49 |
| "mp3_clk_out", // 50 |
| "cts_sd_emmc_clk_C", // 51 |
| "cts_sd_emmc_clk_B", // 52 |
| "cts_sd_emmc_clk_A", // 53 |
| "cts_vpu_clkc", // 54 |
| "vid_pll_div_clk_out", // 55 |
| "cts_wave420l_aclk", // 56 |
| "cts_wave420l_cclk", // 57 |
| "cts_wave420l_bclk", // 58 |
| "cts_hcodec_clk", // 59 |
| "1'b0", // 60 |
| "gpio_clk_msr", // 61 |
| "cts_hevcb_clk", // 62 |
| "cts_dsi_meas_clk", // 63 |
| "cts_spicc_1_clk", // 64 |
| "cts_spicc_0_clk", // 65 |
| "cts_vid_lock_clk", // 66 |
| "cts_dsi_phy_clk", // 67 |
| "cts_hdcp22_esmclk", // 68 |
| "cts_hdcp22_skpclk", // 69 |
| "cts_pwm_F_clk", // 70 |
| "cts_pwm_E_clk", // 71 |
| "cts_pwm_D_clk", // 72 |
| "cts_pwm_C_clk", // 73 |
| "1'b0", // 74 |
| "cts_hevcf_clk", // 75 |
| "1'b0", // 76 |
| "rng_ring_osc_clk[0]", // 77 |
| "rng_ring_osc_clk[1]", // 78 |
| "rng_ring_osc_clk[2]", // 79 |
| "rng_ring_osc_clk[3]", // 80 |
| "cts_vapbclk", // 81 |
| "cts_ge2d_clk", // 82 |
| "co_rx_clk", // 83 |
| "co_tx_clk", // 84 |
| "1'b0", // 85 |
| "1'b0", // 86 |
| "1'b0", // 87 |
| "1'b0", // 88 |
| "HDMI_CLK_TODIG", // 89 |
| "cts_hdmitx_sys_clk", // 90 |
| "sys_cpuB_clk_div16", // 91 |
| "sys_pllB_div16", // 92 |
| "1'b0", // 93 |
| "eth_phy_rxclk", // 94 |
| "eth_phy_plltxclk", // 95 |
| "cts_vpu_clkb", // 96 |
| "cts_vpu_clkb_tmp", // 97 |
| "cts_ts_clk", // 98 |
| "am_ring_osc_clk_out_ee[3]", // 99 |
| "am_ring_osc_clk_out_ee[4]", // 100 |
| "am_ring_osc_clk_out_ee[5]", // 101 |
| "am_ring_osc_clk_out_ee[6]", // 102 |
| "am_ring_osc_clk_out_ee[7]", // 103 |
| "am_ring_osc_clk_out_ee[8]", // 104 |
| "am_ring_osc_clk_out_ee[9]", // 105 |
| "ephy_test_clk", // 106 |
| "au_dac_clk_g128x", // 107 |
| "c_alocker_in_clk", // 108 |
| "c_alocker_out_clk", // 109 |
| "audio_tdmout_c_sclk", // 110 |
| "audio_tdmout_b_sclk", // 111 |
| "audio_tdmout_a_sclk", // 112 |
| "audio_tdmin_lb_sclk", // 113 |
| "audio_tdmin_c_sclk", // 114 |
| "audio_tdmin_b_sclk", // 115 |
| "audio_tdmin_a_sclk", // 116 |
| "audio_resample_clk", // 117 |
| "audio_pdm_sysclk", // 118 |
| "audio_spdifout_b_mst_clk", // 119 |
| "audio_spdifout_mst_clk", // 120 |
| "audio_spdifin_mst_clk", // 121 |
| "mod_audio_pdm_dclk_o", // 122 |
| "cts_gdc_axi_clk", // 123 |
| "cts_gdc_core_clk", // 124 |
| "mipi_csi_phy0_clk_out", // 125 |
| "mipi_csi_phy1_clk_out", // 126 |
| }; |
| |
| #endif // SRC_DEVICES_CLOCK_DRIVERS_AMLOGIC_CLK_AML_G12B_BLOCKS_H_ |