blob: dfa235bd67388f97c9798bcf8d6bdf84f350601f [file] [log] [blame]
// Copyright 2020 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_SM1_BLOCKS_H_
#define SRC_DEVICES_CLOCK_DRIVERS_AMLOGIC_CLK_AML_SM1_BLOCKS_H_
#include <soc/aml-meson/sm1-clk.h>
#include "aml-clk-blocks.h"
#include "aml-g12a-blocks.h"
namespace sm1_clk {
constexpr uint32_t kHhiGp1PllCntl0 = 0x18;
constexpr uint32_t kHhiSysCpuClkCntl5 = 0x87;
constexpr uint32_t kHhiSysCpuClkCntl6 = 0x88;
constexpr uint32_t kDosGclkEn0 = (0x3f01 << 2);
} // namespace sm1_clk
static constexpr meson_clk_gate_t sm1_clk_gates[] = {
// SYS CPU Clock gates.
{.reg = kHhiSysCpuClkCntl1, .bit = 24}, // CLK_SYS_PLL_DIV16
{.reg = kHhiSysCpuClkCntl1, .bit = 1}, // CLK_SYS_CPU_CLK_DIV16
{.reg = kHhiGclkMpeg0, .bit = 0}, // CLK_DDR
{.reg = kHhiGclkMpeg0, .bit = 1}, // CLK_DOS
{.reg = kHhiGclkMpeg0, .bit = 2}, // CLK_ALOCKER
{.reg = kHhiGclkMpeg0, .bit = 3}, // CLK_MIPI_DSI_HOST
{.reg = kHhiGclkMpeg0, .bit = 4}, // CLK_ETH_PHY
{.reg = kHhiGclkMpeg0, .bit = 5}, // CLK_ISA
{.reg = kHhiGclkMpeg0, .bit = 6}, // CLK_PL301
{.reg = kHhiGclkMpeg0, .bit = 7}, // CLK_PERIPHS
{.reg = kHhiGclkMpeg0, .bit = 8}, // CLK_SPICC_0
{.reg = kHhiGclkMpeg0, .bit = 9}, // CLK_I2C
{.reg = kHhiGclkMpeg0, .bit = 10}, // CLK_SANA
{.reg = kHhiGclkMpeg0, .bit = 11}, // CLK_SD
{.reg = kHhiGclkMpeg0, .bit = 12}, // CLK_RNG0
{.reg = kHhiGclkMpeg0, .bit = 13}, // CLK_UART0
{.reg = kHhiGclkMpeg0, .bit = 14}, // CLK_SPICC_1
{.reg = kHhiGclkMpeg0, .bit = 19}, // CLK_HIU_REG
{.reg = kHhiGclkMpeg0, .bit = 20}, // CLK_MIPI_DSI_PHY
{.reg = kHhiGclkMpeg0, .bit = 23}, // CLK_ASSIST_MISC
{.reg = kHhiGclkMpeg0, .bit = 24}, // CLK_EMMC_A
{.reg = kHhiGclkMpeg0, .bit = 25}, // CLK_EMMC_B
{.reg = kHhiGclkMpeg0, .bit = 26}, // CLK_EMMC_C
{.reg = kHhiGclkMpeg0, .bit = 28}, // CLK_ACODEC
{.reg = kHhiGclkMpeg1, .bit = 0}, // CLK_AUDIO
{.reg = kHhiGclkMpeg1, .bit = 3}, // CLK_ETH_CORE
{.reg = kHhiGclkMpeg1, .bit = 4}, // CLK_DEMUX
{.reg = kHhiGclkMpeg1, .bit = 11}, // CLK_AIFIFO
{.reg = kHhiGclkMpeg1, .bit = 13}, // CLK_ADC
{.reg = kHhiGclkMpeg1, .bit = 16}, // CLK_UART1
{.reg = kHhiGclkMpeg1, .bit = 20}, // CLK_G2D
{.reg = kHhiGclkMpeg1, .bit = 23}, // CLK_RESET
{.reg = kHhiGclkMpeg1, .bit = 24}, // CLK_PCIE_COMB
{.reg = kHhiGclkMpeg1, .bit = 25}, // CLK_PARSER
{.reg = kHhiGclkMpeg1, .bit = 26}, // CLK_USB_GENERAL
{.reg = kHhiGclkMpeg1, .bit = 27}, // CLK_PCIE_PHY
{.reg = kHhiGclkMpeg1, .bit = 29}, // CLK_AHB_ARB0
{.reg = kHhiGclkMpeg2, .bit = 1}, // CLK_AHB_DATA_BUS
{.reg = kHhiGclkMpeg2, .bit = 2}, // CLK_AHB_CTRL_BUS
{.reg = kHhiGclkMpeg2, .bit = 3}, // CLK_HTX_HDCP22
{.reg = kHhiGclkMpeg2, .bit = 4}, // CLK_HTX_PCLK
{.reg = kHhiGclkMpeg2, .bit = 6}, // CLK_BT656
{.reg = kHhiGclkMpeg2, .bit = 8}, // CLK_USB1_TO_DDR
{.reg = kHhiGclkMpeg2, .bit = 11}, // CLK_MMC_PCLK
{.reg = kHhiGclkMpeg2, .bit = 15}, // CLK_UART2
{.reg = kHhiGclkMpeg2, .bit = 25}, // CLK_VPU_INTR
{.reg = kHhiGclkMpeg2, .bit = 30}, // CLK_GIC
{.reg = kHhiGclk2Other, .bit = 1}, // CLK_VCLK2_VENCI0
{.reg = kHhiGclk2Other, .bit = 2}, // CLK_VCLK2_VENCI1
{.reg = kHhiGclk2Other, .bit = 3}, // CLK_VCLK2_VENCP0
{.reg = kHhiGclk2Other, .bit = 4}, // CLK_VCLK2_VENCP1
{.reg = kHhiGclk2Other, .bit = 5}, // CLK_VCLK2_VENCT0
{.reg = kHhiGclk2Other, .bit = 6}, // CLK_VCLK2_VENCT1
{.reg = kHhiGclk2Other, .bit = 7}, // CLK_VCLK2_OTHER
{.reg = kHhiGclk2Other, .bit = 8}, // CLK_VCLK2_ENCI
{.reg = kHhiGclk2Other, .bit = 9}, // CLK_VCLK2_ENCP
{.reg = kHhiGclk2Other, .bit = 10}, // CLK_DAC_CLK
{.reg = kHhiGclk2Other, .bit = 14}, // CLK_AOCLK_GATE
{.reg = kHhiGclk2Other, .bit = 16}, // CLK_IEC958_GATE
{.reg = kHhiGclk2Other, .bit = 20}, // CLK_ENC480P
{.reg = kHhiGclk2Other, .bit = 21}, // CLK_RNG1
{.reg = kHhiGclk2Other, .bit = 22}, // CLK_VCLK2_ENCT
{.reg = kHhiGclk2Other, .bit = 23}, // CLK_VCLK2_ENCL
{.reg = kHhiGclk2Other, .bit = 24}, // CLK_VCLK2_VENCLMMC
{.reg = kHhiGclk2Other, .bit = 25}, // CLK_VCLK2_VENCL
{.reg = kHhiGclk2Other, .bit = 26}, // CLK_VCLK2_OTHER1
{.reg = kHhiGclkSpMpeg, .bit = 1}, // CLK_EFUSE
{.reg = kHhiMpegClkCntl, .bit = 7}, // CLK_81
{.reg = kHhiXtalDivnCntl, .bit = 11}, // CLK_24M
{.reg = kHhiGenClkCntl, .bit = 11}, // CLK_GEN_CLK
{.reg = kHhiTsClkCntl, .bit = 8}, // CLK_TS_CLK
{.reg = kHhiSpiccClkCntl, .bit = 6}, // CLK_SPICC0_GATE
{.reg = kHhiSpiccClkCntl, .bit = 22}, // CLK_SPICC1_GATE
{.reg = kDosGclkEn0,
.bit = 0,
.register_set = kMesonRegisterSetDos,
.mask = 0x3ff}, // CLK_DOS_GCLK_VDEC
// SM1 Specific Clock Gates.
{.reg = kHhiGclkMpeg1, .bit = 18}, // CLK_CSI_DIG
{.reg = kHhiGclkMpeg1, .bit = 19}, // CLK_NNA
{.reg = kHhiGclkMpeg1, .bit = 28}, // CLK_PARSER1
{.reg = kHhiGclkMpeg2, .bit = 16}, // CLK_CSI_HOST
{.reg = kHhiGclkMpeg2, .bit = 17}, // CLK_CSI_ADPAT
{.reg = kHhiGclkMpeg2, .bit = 22}, // CLK_TEMP_SENSOR
{.reg = kHhiGclkMpeg2, .bit = 29}, // CLK_CSI_PHY
};
static_assert(sm1_clk::CLK_SM1_GATE_COUNT == std::size(sm1_clk_gates),
"sm1_clk_gates[] and CLK_SM1_COUNT count mismatch");
static constexpr uint32_t kGenClkSelInputs[] = {0, 5, 6, 7, 20, 21, 22, 23, 24, 25, 26, 27, 28};
static constexpr uint32_t kClk81Inputs[] = {6, 5, 7};
static constexpr meson_clk_mux_t sm1_muxes[] = {
{.reg = kHhiGenClkCntl,
.mask = 0x1f,
.shift = 12,
.n_inputs = 13,
.inputs = kGenClkSelInputs}, // CLK_GEN_CLK_SEL
{.reg = kHhiVipnanoqClkCntl,
.mask = 0x7,
.shift = 9,
.n_inputs = 8,
.inputs = nullptr}, // CLK_CTS_VIPNANOQ_CORE_CLK_MUX
{.reg = kHhiVipnanoqClkCntl,
.mask = 0x7,
.shift = 25,
.n_inputs = 8,
.inputs = nullptr}, // CLK_CTS_VIPNANOQ_AXI_CLK_MUX
{.reg = sm1_clk::kHhiSysCpuClkCntl5,
.mask = 0x3,
.shift = 0,
.n_inputs = 4,
.inputs = nullptr}, // CLK_DSU_PRE_SRC0
{.reg = sm1_clk::kHhiSysCpuClkCntl5,
.mask = 0x3,
.shift = 16,
.n_inputs = 4,
.inputs = nullptr}, // CLK_DSU_PRE_SRC1
{.reg = sm1_clk::kHhiSysCpuClkCntl5,
.mask = 0x1,
.shift = 18,
.n_inputs = 2,
.inputs = nullptr}, // CLK_DSU_PRE1
{.reg = sm1_clk::kHhiSysCpuClkCntl5,
.mask = 0x1,
.shift = 10,
.n_inputs = 2,
.inputs = nullptr}, // CLK_DSU_PRE_POST
{.reg = sm1_clk::kHhiSysCpuClkCntl5,
.mask = 0x1,
.shift = 11,
.n_inputs = 2,
.inputs = nullptr}, // CLK_DSU_PRE_CLK
{.reg = sm1_clk::kHhiSysCpuClkCntl6,
.mask = 0x1,
.shift = 27,
.n_inputs = 2,
.inputs = nullptr}, // CLK_DSU_CLK
{.reg = kHhiMpegClkCntl,
.mask = 0x7,
.shift = 12,
.n_inputs = 3,
.inputs = kClk81Inputs}, // CLK_MPEG_CLK_SEL
};
static_assert(sm1_clk::CLK_SM1_MUX_COUNT == std::size(sm1_muxes),
"sm1_clk_muxes and CLK_SM1_MUX_COUNT count mismatch");
static constexpr meson_clk_msr_t sm1_clk_msr = {
.reg0_offset = (0x1 << 2),
.reg2_offset = (0x3 << 2),
};
static const char* const sm1_clk_table[] = {
"am_ring_osc_clk_out_ee[0]",
"am_ring_osc_clk_out_ee[1]",
"am_ring_osc_clk_out_ee[2]",
"am_ring_osc_clk_out_ee[3]",
"gp0_pll_clk",
"gp1_pll_clk",
"cts_enci_clk",
"clk81",
"cts_encp_clk",
"cts_encl_clk",
"cts_vdac_clk",
"mac_eth_tx_clk",
"hifi_pll_clk",
"mod_tcon_clko",
"cts_FEC_CLK_0",
"cts_FEC_CLK_1",
"cts_FEC_CLK_2",
"sys_pll_div16",
"sys_cpu_clk_div16",
"lcd_an_clk_ph2",
"rtc_osc_clk_out",
"lcd_an_clk_ph3",
"mac_eth_phy_ref_clk",
"mpll_clk_50m",
"cts_eth_clk125Mhz",
"cts_eth_clk_rmii",
"sc_clk_int",
"co_clkin_to_mac",
"cts_sar_adc_clk",
"pcie_clk_inp",
"pcie_clk_inn",
"mpll_clk_test_out",
"cts_vdec_clk",
"1'b0",
"eth_mppll_50m_ckout",
"cts_mali_clk",
"cts_hdmi_tx_pixel_clk",
"cts_cdac_clk_c",
"cts_vdin_meas_clk",
"cts_bt656_clk0",
"arm_ring_osc_clk_out[4]",
"mac_eth_rx_clk_rmii",
"mp0_clk_out",
"fclk_div5",
"cts_pwm_B_clk",
"cts_pwm_A_clk",
"cts_vpu_clk",
"ddr_dpll_pt_clk",
"mp1_clk_out",
"mp2_clk_out",
"mp3_clk_out",
"cts_sd_emmc_clk_C",
"cts_sd_emmc_clk_B",
"cts_sd_emmc_clk_A",
"cts_vpu_clkc",
"vid_pll_div_clk_out",
"cts_wave420l_aclk",
"cts_wave420l_cclk",
"cts_wave420l_bclk",
"cts_hcodec_clk",
"arm_ring_osc_clk_out[5]",
"gpio_clk_msr",
"cts_hevcb_clk",
"cts_dsi_meas_clk",
"cts_spicc_1_clk",
"cts_spicc_0_clk",
"cts_vid_lock_clk",
"cts_dsi_phy_clk",
"cts_hdcp22_esmclk",
"cts_hdcp22_skpclk",
"cts_pwm_F_clk",
"cts_pwm_E_clk",
"cts_pwm_D_clk",
"cts_pwm_C_clk",
"arm_ring_osc_clk_out[6]",
"cts_hevcf_clk",
"arm_ring_osc_clk_out[7]",
"rng_ring_osc_clk[0]",
"rng_ring_osc_clk[1]",
"rng_ring_osc_clk[2]",
"rng_ring_osc_clk[3]",
"cts_vapbclk",
"cts_ge2d_clk",
"co_rx_clk",
"co_tx_clk",
"arm_ring_osc_clk_out[8]",
"arm_ring_osc_clk_out[9]",
"mipi_csi_phy_clk",
"csi2_adapt_clk",
"HDMI_CLK_TODIG",
"cts_hdmitx_sys_clk",
"nna_core_clk",
"nna_axi_clk",
"vad_clk",
"eth_phy_rxclk",
"eth_phy_plltxclk",
"cts_vpu_clkb",
"cts_vpu_clkb_tmp",
"cts_ts_clk",
"arm_ring_osc_clk_out[10]",
"arm_ring_osc_clk_out[11]",
"arm_ring_osc_clk_out[12]",
"arm_ring_osc_clk_out[13]",
"arm_ring_osc_clk_out[14]",
"arm_ring_osc_clk_out[15]",
"arm_ring_osc_clk_out[16]",
"ephy_test_clk",
"au_dac_clk_g128x",
"c_alocker_in_clk",
"c_alocker_out_clk",
"audio_tdmout_c_sclk",
"audio_tdmout_b_sclk",
"audio_tdmout_a_sclk",
"audio_tdmin_lb_sclk",
"audio_tdmin_c_sclk",
"audio_tdmin_b_sclk",
"audio_tdmin_a_sclk",
"audio_resampleA_clk",
"audio_pdm_sysclk",
"audio_spdifout_b_mst_clk",
"audio_spdifout_mst_clk",
"audio_spdifin_mst_clk",
"mod_audio_pdm_dclk_o",
"audio_resampled_clk",
"earcx_pll_(dma",
"earcrx_pll_test_clk",
"csi_phy0_clk_out",
"clk_csi2_data",
};
// clang-format off
#endif // SRC_DEVICES_CLOCK_DRIVERS_AMLOGIC_CLK_AML_SM1_BLOCKS_H_