blob: d3dbb7af43b747b3015e512d5ce76048af7c6e55 [file] [log] [blame]
// 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 (fxbug.dev/32378) 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
};
static_assert(g12b_clk::CLK_G12B_COUNT == countof(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_