2025-05-10 21:58:58 +08:00

311 lines
7.8 KiB
C

/* SPDX-License-Identifier: GPL-2.0 */
/*
* Copyright (c) 2022 Rockchip Electronics Co. Ltd.
* Author: Elaine Zhang <zhangqing@rock-chips.com>
*/
#ifndef _ASM_ARCH_CRU_RV1106_H
#define _ASM_ARCH_CRU_RV1106_H
#include <common.h>
#define MHz 1000000
#define KHz 1000
#define OSC_HZ (24 * MHz)
#ifdef CONFIG_SPL_KERNEL_BOOT
#define APLL_HZ (1104 * MHz)
#else
#define APLL_HZ (816 * MHz)
#endif
#define GPLL_HZ (1188 * MHz)
#define CPLL_HZ (1000 * MHz)
/* RV1106 pll id */
enum rv1106_pll_id {
APLL,
DPLL,
CPLL,
GPLL,
PLL_COUNT,
};
struct rv1106_clk_info {
unsigned long id;
char *name;
bool is_cru;
};
struct rv1106_clk_priv {
struct rv1106_cru *cru;
struct rv1106_grf *grf;
ulong gpll_hz;
ulong cpll_hz;
ulong armclk_hz;
ulong armclk_enter_hz;
ulong armclk_init_hz;
bool sync_kernel;
bool set_armclk_rate;
};
struct rv1106_grf_clk_priv {
struct rv1106_grf *grf;
};
struct rv1106_pll {
unsigned int con0;
unsigned int con1;
unsigned int con2;
unsigned int con3;
unsigned int con4;
unsigned int reserved0[3];
};
struct rv1106_cru {
unsigned int reserved0[192];
unsigned int pmu_clksel_con[8];
unsigned int reserved1[312];
unsigned int pmu_clkgate_con[3];
unsigned int reserved2[125];
unsigned int pmu_softrst_con[3];
unsigned int reserved3[15741];
struct rv1106_pll pll[4];
unsigned int reserved4[128];
unsigned int mode;
unsigned int reserved5[31];
unsigned int clksel_con[34];
unsigned int reserved6[286];
unsigned int clkgate_con[4];
unsigned int reserved7[124];
unsigned int softrst_con[3];
unsigned int reserved8[125];
unsigned int glb_cnt_th;
unsigned int glb_rst_st;
unsigned int glb_srst_fst;
unsigned int glb_srst_snd;
unsigned int glb_rst_con;
unsigned int con[2];
unsigned int sdmmc_con[2];
unsigned int emmc_con[2];
unsigned int reserved9[1461];
unsigned int peri_clksel_con[12];
unsigned int reserved10[308];
unsigned int peri_clkgate_con[8];
unsigned int reserved11[120];
unsigned int peri_softrst_con[8];
unsigned int reserved12[1592];
unsigned int vi_clksel_con[4];
unsigned int reserved13[316];
unsigned int vi_clkgate_con[3];
unsigned int reserved14[125];
unsigned int vi_softrst_con[3];
unsigned int reserved15[3645];
unsigned int core_clksel_con[5];
unsigned int reserved16[2043];
unsigned int vepu_clksel_con[2];
unsigned int reserved17[318];
unsigned int vepu_clkgate_con[3];
unsigned int reserved18[125];
unsigned int vepu_softrst_con[2];
unsigned int reserved19[1598];
unsigned int vo_clksel_con[4];
unsigned int reserved20[316];
unsigned int vo_clkgate_con[3];
unsigned int reserved21[125];
unsigned int vo_softrst_con[4];
};
check_member(rv1106_cru, vo_softrst_con[0], 0x1ca00);
struct pll_rate_table {
unsigned long rate;
unsigned int fbdiv;
unsigned int postdiv1;
unsigned int refdiv;
unsigned int postdiv2;
unsigned int dsmpd;
unsigned int frac;
};
#define RV1106_TOPCRU_BASE 0x10000
#define RV1106_SUBDDRCRU_BASE 0x1F000
#define RV1106_PLL_CON(x) ((x) * 0x4 + RV1106_TOPCRU_BASE)
#define RV1106_MODE_CON (0x280 + RV1106_TOPCRU_BASE)
#define RV1106_SUBDDRMODE_CON (0x280 + RV1106_SUBDDRCRU_BASE)
enum {
/* CRU_PMU_CLK_SEL0_CON */
CLK_I2C1_SEL_SHIFT = 6,
CLK_I2C1_SEL_MASK = 0x3 << CLK_I2C1_SEL_SHIFT,
CLK_I2C1_SEL_200M = 0,
CLK_I2C1_SEL_100M,
CLK_I2C1_SEL_24M,
CLK_I2C1_SEL_32K,
HCLK_PMU_SEL_SHIFT = 4,
HCLK_PMU_SEL_MASK = 0x3 << HCLK_PMU_SEL_SHIFT,
HCLK_PMU_SEL_200M = 0,
HCLK_PMU_SEL_100M,
HCLK_PMU_SEL_24M,
PCLK_PMU_SEL_SHIFT = 3,
PCLK_PMU_SEL_MASK = 0x1 << PCLK_PMU_SEL_SHIFT,
PCLK_PMU_SEL_100M = 0,
PCLK_PMU_SEL_24M,
/* CRU_CLK_SEL5_CON */
CLK_UART_SRC_SEL_SHIFT = 5,
CLK_UART_SRC_SEL_MASK = 0x1 << CLK_UART_SRC_SEL_SHIFT,
CLK_UART_SRC_SEL_GPLL = 0,
CLK_UART_SRC_SEL_CPLL,
CLK_UART_SRC_DIV_SHIFT = 0,
CLK_UART_SRC_DIV_MASK = 0x1f << CLK_UART_SRC_DIV_SHIFT,
/* CRU_CLK_SEL6_CON */
CLK_UART_FRAC_NUMERATOR_SHIFT = 16,
CLK_UART_FRAC_NUMERATOR_MASK = 0xffff << 16,
CLK_UART_FRAC_DENOMINATOR_SHIFT = 0,
CLK_UART_FRAC_DENOMINATOR_MASK = 0xffff,
/* CRU_CLK_SEL7_CON */
CLK_UART_SEL_SHIFT = 0,
CLK_UART_SEL_MASK = 0x3 << CLK_UART_SEL_SHIFT,
CLK_UART_SEL_SRC = 0,
CLK_UART_SEL_FRAC,
CLK_UART_SEL_XIN24M,
/* CRU_CLK_SEL23_CON */
DCLK_VOP_SEL_SHIFT = 8,
DCLK_VOP_SEL_MASK = 0x1 << DCLK_VOP_SEL_SHIFT,
DCLK_VOP_SEL_GPLL = 0,
DCLK_VOP_SEL_CPLL,
DCLK_VOP_DIV_SHIFT = 3,
DCLK_VOP_DIV_MASK = 0x1f << DCLK_VOP_DIV_SHIFT,
/* CRU_CLK_SEL24_CON */
PCLK_TOP_SEL_SHIFT = 5,
PCLK_TOP_SEL_MASK = 0x3 << PCLK_TOP_SEL_SHIFT,
PCLK_TOP_SEL_100M = 0,
PCLK_TOP_SEL_50M,
PCLK_TOP_SEL_24M,
/* CRU_PERI_CLK_SEL1_CON */
CLK_I2C3_SEL_SHIFT = 14,
CLK_I2C3_SEL_MASK = 0x3 << CLK_I2C3_SEL_SHIFT,
CLK_I2C2_SEL_SHIFT = 12,
CLK_I2C2_SEL_MASK = 0x3 << CLK_I2C2_SEL_SHIFT,
CLK_I2C0_SEL_SHIFT = 8,
CLK_I2C0_SEL_MASK = 0x3 << CLK_I2C0_SEL_SHIFT,
CLK_I2C0_SEL_200M = 0,
CLK_I2C0_SEL_100M,
CLK_I2C0_SEL_50M,
CLK_I2C0_SEL_24M,
HCLK_PERI_SEL_SHIFT = 4,
HCLK_PERI_SEL_MASK = 0x3 << HCLK_PERI_SEL_SHIFT,
HCLK_PERI_SEL_200M = 0,
HCLK_PERI_SEL_100M,
HCLK_PERI_SEL_50M,
HCLK_PERI_SEL_24M,
ACLK_PERI_SEL_SHIFT = 2,
ACLK_PERI_SEL_MASK = 0x3 << ACLK_PERI_SEL_SHIFT,
ACLK_PERI_SEL_400M = 0,
ACLK_PERI_SEL_200M,
ACLK_PERI_SEL_100M,
ACLK_PERI_SEL_24M,
PCLK_PERI_SEL_SHIFT = 0,
PCLK_PERI_SEL_MASK = 0x3 << PCLK_PERI_SEL_SHIFT,
PCLK_PERI_SEL_100M = 0,
PCLK_PERI_SEL_50M,
PCLK_PERI_SEL_24M,
/* CRU_PERI_CLK_SEL2_CON */
CLK_I2C4_SEL_SHIFT = 0,
CLK_I2C4_SEL_MASK = 0x3 << CLK_I2C4_SEL_SHIFT,
/* CRU_PERI_CLK_SEL6_CON */
CLK_PWM2_SEL_SHIFT = 11,
CLK_PWM2_SEL_MASK = 0x3 << CLK_PWM2_SEL_SHIFT,
CLK_PWM1_SEL_SHIFT = 9,
CLK_PWM1_SEL_MASK = 0x3 << CLK_PWM1_SEL_SHIFT,
CLK_PWM_SEL_100M = 0,
CLK_PWM_SEL_50M,
CLK_PWM_SEL_24M,
CLK_PKA_CRYPTO_SEL_SHIFT = 7,
CLK_PKA_CRYPTO_SEL_MASK = 0x3 << CLK_PKA_CRYPTO_SEL_SHIFT,
CLK_CORE_CRYPTO_SEL_SHIFT = 5,
CLK_CORE_CRYPTO_SEL_MASK = 0x3 << CLK_CORE_CRYPTO_SEL_SHIFT,
CLK_CRYPTO_SEL_300M = 0,
CLK_CRYPTO_SEL_200M,
CLK_CRYPTO_SEL_100M,
CLK_CRYPTO_SEL_24M,
CLK_SARADC_DIV_SHIFT = 0,
CLK_SARADC_DIV_MASK = 0x7 << CLK_SARADC_DIV_SHIFT,
CLK_SPI1_SEL_SHIFT = 3,
CLK_SPI1_SEL_MASK = 0x3 << CLK_SPI1_SEL_SHIFT,
/* CRU_PERI_CLK_SEL7_CON */
DCLK_DECOM_SEL_SHIFT = 14,
DCLK_DECOM_SEL_MASK = 0x3 << DCLK_DECOM_SEL_SHIFT,
DCLK_DECOM_SEL_400M = 0,
DCLK_DECOM_SEL_200M,
DCLK_DECOM_SEL_100M,
DCLK_DECOM_SEL_24M,
CLK_SFC_SEL_SHIFT = 12,
CLK_SFC_SEL_MASK = 0x3 << CLK_SFC_SEL_SHIFT,
CLK_SFC_SEL_500M = 0,
CLK_SFC_SEL_300M,
CLK_SFC_SEL_200M,
CLK_SFC_SEL_24M,
CLK_SFC_DIV_SHIFT = 7,
CLK_SFC_DIV_MASK = 0x1f << CLK_SFC_DIV_SHIFT,
CLK_EMMC_SEL_SHIFT = 6,
CLK_EMMC_SEL_MASK = 0x1 << CLK_EMMC_SEL_SHIFT,
CLK_MMC_SEL_400M = 0,
CLK_MMC_SEL_24M,
CLK_EMMC_DIV_SHIFT = 0,
CLK_EMMC_DIV_MASK = 0x3f << CLK_EMMC_DIV_SHIFT,
/* CRU_PERI_CLK_SEL9_CON */
ACLK_BUS_SEL_SHIFT = 0,
ACLK_BUS_SEL_MASK = 0x3 << ACLK_BUS_SEL_SHIFT,
ACLK_BUS_SEL_300M = 0,
ACLK_BUS_SEL_200M,
ACLK_BUS_SEL_100M,
ACLK_BUS_SEL_24M,
/* CRU_PERI_CLK_SEL11_CON */
CLK_PWM0_SEL_SHIFT = 0,
CLK_PWM0_SEL_MASK = 0x3 << CLK_PWM0_SEL_SHIFT,
/* CRU_VEPU_CLK_SEL0_CON */
CLK_SPI0_SEL_SHIFT = 12,
CLK_SPI0_SEL_MASK = 0x3 << CLK_SPI0_SEL_SHIFT,
CLK_SPI0_SEL_200M = 0,
CLK_SPI0_SEL_100M,
CLK_SPI0_SEL_50M,
CLK_SPI0_SEL_24M,
/* CRU_CORE_CLK_SEL0_CON */
CLK_CORE_DIV_SHIFT = 0,
CLK_CORE_DIV_MASK = 0x1f << CLK_CORE_DIV_SHIFT,
/* CRU_VI_CLK_SEL1_CON */
CLK_SDMMC_SEL_SHIFT = 14,
CLK_SDMMC_SEL_MASK = 0x1 << CLK_SDMMC_SEL_SHIFT,
CLK_SDMMC_DIV_SHIFT = 8,
CLK_SDMMC_DIV_MASK = 0x3f << CLK_SDMMC_DIV_SHIFT,
/* CRU_VO_CLK_SEL1_CON */
ACLK_VOP_SEL_SHIFT = 10,
ACLK_VOP_SEL_MASK = 0x3 << ACLK_VOP_SEL_SHIFT,
ACLK_VOP_SEL_300M = 0,
ACLK_VOP_SEL_200M,
ACLK_VOP_SEL_100M,
ACLK_VOP_SEL_24M,
/* CRU_VO_CLK_SEL3_CON */
CLK_TSADC_TSEN_DIV_SHIFT = 5,
CLK_TSADC_TSEN_DIV_MASK = 0x1F << CLK_TSADC_TSEN_DIV_SHIFT,
CLK_TSADC_DIV_SHIFT = 0,
CLK_TSADC_DIV_MASK = 0x1F << CLK_TSADC_DIV_SHIFT,
};
#endif