// 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_
