blob: fde69deebcb522ae4f9b22e3f86030e019a5c1b2 [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 == countof(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 == countof(sm1_muxes),
"sm1_clk_muxes and CLK_SM1_MUX_COUNT count mismatch");
// clang-format off
#endif // SRC_DEVICES_CLOCK_DRIVERS_AMLOGIC_CLK_AML_SM1_BLOCKS_H_