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

417 lines
12 KiB
C

/* SPDX-License-Identifier: GPL-2.0 */
/*
* Copyright (c) 2022 Rockchip Electronics Co. Ltd.
* Author:
* Elaine Zhang <zhangqing@rock-chips.com>
* Finley Xiao <finley.xiao@rock-chips.com>
*/
#ifndef _ASM_ARCH_CRU_RK3562_H
#define _ASM_ARCH_CRU_RK3562_H
#define MHz 1000000
#define KHz 1000
#define OSC_HZ (24 * MHz)
#define CPU_PVTPLL_HZ (1008 * MHz)
#define APLL_HZ (600 * MHz)
#define GPLL_HZ (1188 * MHz)
#define CPLL_HZ (1000 * MHz)
#define HPLL_HZ (1000 * MHz)
/* RK3562 pll id */
enum rk3562_pll_id {
APLL,
GPLL,
VPLL,
HPLL,
CPLL,
DPLL,
PLL_COUNT,
};
struct rk3562_clk_info {
unsigned long id;
char *name;
};
struct rk3562_clk_priv {
struct rk3562_cru *cru;
ulong gpll_hz;
ulong vpll_hz;
ulong hpll_hz;
ulong cpll_hz;
ulong armclk_hz;
ulong armclk_enter_hz;
ulong armclk_init_hz;
bool sync_kernel;
bool set_armclk_rate;
};
struct rk3562_cru {
/* top cru */
uint32_t apll_con[5];
uint32_t reserved0014[19];
uint32_t gpll_con[5];
uint32_t reserved0074[3];
uint32_t vpll_con[5];
uint32_t reserved0094[3];
uint32_t hpll_con[5];
uint32_t reserved00b4[19];
uint32_t clksel_con[48];
uint32_t reserved01c0[80];
uint32_t gate_con[28];
uint32_t reserved370[36];
uint32_t softrst_con[28];
uint32_t reserved0470[100];
uint32_t mode_con[1];
uint32_t reserved0604[3];
uint32_t glb_cnt_th;
uint32_t glb_srst_fst;
uint32_t glb_srst_snd;
uint32_t glb_rst_con;
uint32_t glb_rst_st;
unsigned int sdmmc0_con[2];
unsigned int sdmmc1_con[2];
uint32_t reserved0634[2];
unsigned int emmc_con[1];
uint32_t reserved0640[15984];
/* pmu0 cru */
uint32_t reserved10000[64];
uint32_t pmu0clksel_con[4];
uint32_t reserved10110[28];
uint32_t pmu0gate_con[3];
uint32_t reserved1018c[29];
uint32_t pmu0softrst_con[3];
uint32_t reserved1020c[8061];
/* pmu1 cru */
uint32_t reserved18000[16];
uint32_t cpll_con[5];
uint32_t reserved18054[43];
uint32_t pmu1clksel_con[7];
uint32_t reserved1811c[25];
uint32_t pmu1gate_con[4];
uint32_t reserved18190[28];
uint32_t pmu1softrst_con[3];
uint32_t reserved1820c[93];
uint32_t pmu1mode_con[1];
uint32_t reserved18384[7967];
/* ddr cru */
uint32_t reserved20000[64];
uint32_t ddrclksel_con[2];
uint32_t reserved20108[30];
uint32_t ddrgate_con[2];
uint32_t reserved20188[30];
uint32_t ddrsoftrst_con[2];
uint32_t reserved20208[8062];
/* subddr cru */
uint32_t reserved28000[8];
uint32_t dpll_con[5];
uint32_t reserved28034[51];
uint32_t sudbddrclksel_con[1];
uint32_t reserved28104[31];
uint32_t subddrgate_con[1];
uint32_t reserved28184[31];
uint32_t sudbddrsoftrst_con[1];
uint32_t reserved28204[95];
uint32_t subddrmode_con[1];
uint32_t reserved28384[7967];
/* peri cru */
uint32_t reserved30000[64];
uint32_t periclksel_con[48];
uint32_t reserved301c0[80];
uint32_t perigate_con[18];
uint32_t reserved30348[46];
uint32_t perisoftrst_con[18];
uint32_t reserved30448[143];
};
check_member(rk3562_cru, reserved0640[0], 0x00640);
check_member(rk3562_cru, reserved1020c[0], 0x1020c);
check_member(rk3562_cru, reserved18384[0], 0x18384);
check_member(rk3562_cru, reserved20208[0], 0x20208);
check_member(rk3562_cru, reserved28384[0], 0x28384);
check_member(rk3562_cru, reserved30448[0], 0x30448);
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 RK3562_PMU0_CRU_BASE 0x10000
#define RK3562_PMU1_CRU_BASE 0x18000
#define RK3562_DDR_CRU_BASE 0x20000
#define RK3562_SUBDDR_CRU_BASE 0x28000
#define RK3562_PERI_CRU_BASE 0x30000
#define RK3562_PLL_CON(x) ((x) * 0x4)
#define RK3562_PMU1_PLL_CON(x) ((x) * 0x4 + RK3562_PMU1_CRU_BASE + 0x40)
#define RK3562_SUBDDR_PLL_CON(x) ((x) * 0x4 + RK3562_SUBDDR_CRU_BASE + 0x20)
#define RK3562_MODE_CON 0x600
#define RK3562_PMU1_MODE_CON (RK3562_PMU1_CRU_BASE + 0x380)
#define RK3562_SUBDDR_MODE_CON (RK3562_SUBDDR_CRU_BASE + 0x380)
#define RK3562_GLB_SRST_FST 0x614
#define RK3562_GLB_SRST_SND 0x618
#define RK3562_GLB_RST_CON 0x61c
#define RK3562_GLB_RST_ST 0x620
enum {
/* CRU_CLKSEL_CON10 */
CLK_CORE_PRE_DIV_SHIFT = 0,
CLK_CORE_PRE_DIV_MASK = 0x1f << CLK_CORE_PRE_DIV_SHIFT,
/* CRU_CLKSEL_CON11 */
ACLK_CORE_PRE_DIV_SHIFT = 0,
ACLK_CORE_PRE_DIV_MASK = 0x7 << ACLK_CORE_PRE_DIV_SHIFT,
CLK_SCANHS_ACLKM_CORE_DIV_SHIFT = 8,
CLK_SCANHS_ACLKM_CORE_DIV_MASK = 0x7 << CLK_SCANHS_ACLKM_CORE_DIV_SHIFT,
/* CRU_CLKSEL_CON12 */
PCLK_DBG_PRE_DIV_SHIFT = 0,
PCLK_DBG_PRE_DIV_MASK = 0xf << PCLK_DBG_PRE_DIV_SHIFT,
CLK_SCANHS_PCLK_DBG_DIV_SHIFT = 8,
CLK_SCANHS_PCLK_DBG_DIV_MASK = 0xf << CLK_SCANHS_PCLK_DBG_DIV_SHIFT,
/* CRU_CLKSEL_CON28 */
ACLK_VOP_DIV_SHIFT = 0,
ACLK_VOP_DIV_MASK = 0x1f << ACLK_VOP_DIV_SHIFT,
ACLK_VOP_SEL_SHIFT = 6,
ACLK_VOP_SEL_MASK = 0x3 << ACLK_VOP_SEL_SHIFT,
ACLK_VOP_SEL_GPLL = 0,
ACLK_VOP_SEL_CPLL,
ACLK_VOP_SEL_VPLL,
ACLK_VOP_SEL_HPLL,
/* CRU_CLKSEL_CON30 */
DCLK_VOP_DIV_SHIFT = 0,
DCLK_VOP_DIV_MASK = 0xff << DCLK_VOP_DIV_SHIFT,
DCLK_VOP_SEL_SHIFT = 14,
DCLK_VOP_SEL_MASK = 0x3 << DCLK_VOP_SEL_SHIFT,
DCLK_VOP_SEL_GPLL = 0,
DCLK_VOP_SEL_HPLL,
DCLK_VOP_SEL_VPLL,
DCLK_VOP_SEL_APLL,
/* CRU_CLKSEL_CON31 */
DCLK_VOP1_DIV_SHIFT = 0,
DCLK_VOP1_DIV_MASK = 0xff << DCLK_VOP1_DIV_SHIFT,
DCLK_VOP1_SEL_SHIFT = 14,
DCLK_VOP1_SEL_MASK = 0x3 << DCLK_VOP1_SEL_SHIFT,
/* CRU_CLKSEL_CON40 */
ACLK_BUS_DIV_SHIFT = 0,
ACLK_BUS_DIV_MASK = 0x1f << ACLK_BUS_DIV_SHIFT,
ACLK_BUS_SEL_SHIFT = 7,
ACLK_BUS_SEL_MASK = 0x1 << ACLK_BUS_SEL_SHIFT,
ACLK_BUS_SEL_GPLL = 0,
ACLK_BUS_SEL_CPLL,
HCLK_BUS_DIV_SHIFT = 8,
HCLK_BUS_DIV_MASK = 0x3f << HCLK_BUS_DIV_SHIFT,
HCLK_BUS_SEL_SHIFT = 15,
HCLK_BUS_SEL_MASK = 0x1 << HCLK_BUS_SEL_SHIFT,
/* CRU_CLKSEL_CON41 */
PCLK_BUS_DIV_SHIFT = 0,
PCLK_BUS_DIV_MASK = 0x1f << PCLK_BUS_DIV_SHIFT,
PCLK_BUS_SEL_SHIFT = 7,
PCLK_BUS_SEL_MASK = 0x1 << PCLK_BUS_SEL_SHIFT,
CLK_I2C_SEL_SHIFT = 8,
CLK_I2C_SEL_MASK = 0x3 << CLK_I2C_SEL_SHIFT,
CLK_I2C_SEL_200M = 0,
CLK_I2C_SEL_100M,
CLK_I2C_SEL_50M,
CLK_I2C_SEL_24M,
DCLK_BUS_GPIO_SEL_SHIFT = 15,
DCLK_BUS_GPIO_SEL_MASK = 0x1 << DCLK_BUS_GPIO_SEL_SHIFT,
/* CRU_CLKSEL_CON43 */
CLK_TSADC_DIV_SHIFT = 0,
CLK_TSADC_DIV_MASK = 0x7ff << CLK_TSADC_DIV_SHIFT,
CLK_TSADC_TSEN_DIV_SHIFT = 11,
CLK_TSADC_TSEN_DIV_MASK = 0x1f << CLK_TSADC_TSEN_DIV_SHIFT,
/* CRU_CLKSEL_CON44 */
CLK_SARADC_VCCIO156_DIV_SHIFT = 0,
CLK_SARADC_VCCIO156_DIV_MASK = 0xfff << CLK_SARADC_VCCIO156_DIV_SHIFT,
/* CRU_CLKSEL_CON45 */
CLK_GMAC_125M_SEL_SHIFT = 8,
CLK_GMAC_125M_SEL_MASK = 0x1 << CLK_GMAC_125M_SEL_SHIFT,
CLK_GMAC_125M = 0,
CLK_GMAC_24M,
CLK_GMAC_50M_SEL_SHIFT = 7,
CLK_GMAC_50M_SEL_MASK = 0x1 << CLK_GMAC_50M_SEL_SHIFT,
CLK_GMAC_50M = 0,
/* CRU_CLKSEL_CON46 */
CLK_GMAC_ETH_OUT2IO_SEL_SHIFT = 7,
CLK_GMAC_ETH_OUT2IO_SEL_MASK = 0x1 << CLK_GMAC_ETH_OUT2IO_SEL_SHIFT,
CLK_GMAC_ETH_OUT2IO_GPLL = 0,
CLK_GMAC_ETH_OUT2IO_CPLL,
CLK_GMAC_ETH_OUT2IO_DIV_SHIFT = 0,
CLK_GMAC_ETH_OUT2IO_DIV_MASK = 0x7f,
/* PMU0CRU_CLKSEL_CON03 */
CLK_PMU0_I2C0_DIV_SHIFT = 8,
CLK_PMU0_I2C0_DIV_MASK = 0x1f << CLK_PMU0_I2C0_DIV_SHIFT,
CLK_PMU0_I2C0_SEL_SHIFT = 14,
CLK_PMU0_I2C0_SEL_MASK = 0x3 << CLK_PMU0_I2C0_SEL_SHIFT,
CLK_PMU0_I2C0_SEL_200M = 0,
CLK_PMU0_I2C0_SEL_24M,
CLK_PMU0_I2C0_SEL_32K,
/* PMU1CRU_CLKSEL_CON02 */
CLK_PMU1_UART0_SRC_DIV_SHIFT = 0,
CLK_PMU1_UART0_SRC_DIV_MASK = 0xf << CLK_PMU1_UART0_SRC_DIV_SHIFT,
CLK_PMU1_UART0_SEL_SHIFT = 6,
CLK_PMU1_UART0_SEL_MASK = 0x3 << CLK_PMU1_UART0_SEL_SHIFT,
/* PMU1CRU_CLKSEL_CON04 */
CLK_PMU1_SPI0_DIV_SHIFT = 0,
CLK_PMU1_SPI0_DIV_MASK = 0x3 << CLK_PMU1_SPI0_DIV_SHIFT,
CLK_PMU1_SPI0_SEL_SHIFT = 6,
CLK_PMU1_SPI0_SEL_MASK = 0x3 << CLK_PMU1_SPI0_SEL_SHIFT,
CLK_PMU1_SPI0_SEL_200M = 0,
CLK_PMU1_SPI0_SEL_24M,
CLK_PMU1_SPI0_SEL_32K,
CLK_PMU1_PWM0_DIV_SHIFT = 8,
CLK_PMU1_PWM0_DIV_MASK = 0x3 << CLK_PMU1_PWM0_DIV_SHIFT,
CLK_PMU1_PWM0_SEL_SHIFT = 14,
CLK_PMU1_PWM0_SEL_MASK = 0x3 << CLK_PMU1_PWM0_SEL_SHIFT,
CLK_PMU1_PWM0_SEL_200M = 0,
CLK_PMU1_PWM0_SEL_24M,
CLK_PMU1_PWM0_SEL_32K,
/* PERICRU_CLKSEL_CON00 */
ACLK_PERI_DIV_SHIFT = 0,
ACLK_PERI_DIV_MASK = 0x1f << ACLK_PERI_DIV_SHIFT,
ACLK_PERI_SEL_SHIFT = 7,
ACLK_PERI_SEL_MASK = 0x1 << ACLK_PERI_SEL_SHIFT,
ACLK_PERI_SEL_GPLL = 0,
ACLK_PERI_SEL_CPLL,
HCLK_PERI_DIV_SHIFT = 8,
HCLK_PERI_DIV_MASK = 0x3f << HCLK_PERI_DIV_SHIFT,
HCLK_PERI_SEL_SHIFT = 15,
HCLK_PERI_SEL_MASK = 0x1 << HCLK_PERI_SEL_SHIFT,
/* PERICRU_CLKSEL_CON01 */
PCLK_PERI_DIV_SHIFT = 0,
PCLK_PERI_DIV_MASK = 0x1f << PCLK_PERI_DIV_SHIFT,
PCLK_PERI_SEL_SHIFT = 7,
PCLK_PERI_SEL_MASK = 0x1 << PCLK_PERI_SEL_SHIFT,
CLK_SAI0_SRC_DIV_SHIFT = 8,
CLK_SAI0_SRC_DIV_MASK = 0x3f << CLK_SAI0_SRC_DIV_SHIFT,
CLK_SAI0_SRC_SEL_SHIFT = 14,
CLK_SAI0_SRC_SEL_MASK = 0x3 << CLK_SAI0_SRC_SEL_SHIFT,
/* PERICRU_CLKSEL_CON16 */
CCLK_SDMMC0_DIV_SHIFT = 0,
CCLK_SDMMC0_DIV_MASK = 0xff << CCLK_SDMMC0_DIV_SHIFT,
CCLK_SDMMC0_SEL_SHIFT = 14,
CCLK_SDMMC0_SEL_MASK = 0x3 << CCLK_SDMMC0_SEL_SHIFT,
CCLK_SDMMC_SEL_GPLL = 0,
CCLK_SDMMC_SEL_CPLL,
CCLK_SDMMC_SEL_24M,
CCLK_SDMMC_SEL_HPLL,
/* PERICRU_CLKSEL_CON17 */
CCLK_SDMMC1_DIV_SHIFT = 0,
CCLK_SDMMC1_DIV_MASK = 0xff << CCLK_SDMMC1_DIV_SHIFT,
CCLK_SDMMC1_SEL_SHIFT = 14,
CCLK_SDMMC1_SEL_MASK = 0x3 << CCLK_SDMMC1_SEL_SHIFT,
/* PERICRU_CLKSEL_CON18 */
CCLK_EMMC_DIV_SHIFT = 0,
CCLK_EMMC_DIV_MASK = 0xff << CCLK_EMMC_DIV_SHIFT,
CCLK_EMMC_SEL_SHIFT = 14,
CCLK_EMMC_SEL_MASK = 0x3 << CCLK_EMMC_SEL_SHIFT,
CCLK_EMMC_SEL_GPLL = 0,
CCLK_EMMC_SEL_CPLL,
CCLK_EMMC_SEL_24M,
CCLK_EMMC_SEL_HPLL,
/* PERICRU_CLKSEL_CON19 */
BCLK_EMMC_DIV_SHIFT = 8,
BCLK_EMMC_DIV_MASK = 0x7f << BCLK_EMMC_DIV_SHIFT,
BCLK_EMMC_SEL_SHIFT = 15,
BCLK_EMMC_SEL_MASK = 0x1 << BCLK_EMMC_SEL_SHIFT,
BCLK_EMMC_SEL_GPLL = 0,
BCLK_EMMC_SEL_CPLL,
/* PERICRU_CLKSEL_CON20 */
SCLK_SFC_DIV_SHIFT = 0,
SCLK_SFC_DIV_MASK = 0xff << SCLK_SFC_DIV_SHIFT,
SCLK_SFC_SEL_SHIFT = 8,
SCLK_SFC_SEL_MASK = 0x3 << SCLK_SFC_SEL_SHIFT,
SCLK_SFC_SRC_SEL_GPLL = 0,
SCLK_SFC_SRC_SEL_CPLL,
SCLK_SFC_SRC_SEL_24M,
CLK_SPI1_SEL_SHIFT = 12,
CLK_SPI1_SEL_MASK = 0x3 << CLK_SPI1_SEL_SHIFT,
CLK_SPI_SEL_200M = 0,
CLK_SPI_SEL_100M,
CLK_SPI_SEL_50M,
CLK_SPI_SEL_24M,
CLK_SPI2_SEL_SHIFT = 14,
CLK_SPI2_SEL_MASK = 0x3 << CLK_SPI2_SEL_SHIFT,
/* PERICRU_CLKSEL_CON21 */
CLK_UART_SRC_DIV_SHIFT = 0,
CLK_UART_SRC_DIV_MASK = 0x7f << CLK_UART_SRC_DIV_SHIFT,
CLK_UART_SRC_SEL_SHIFT = 8,
CLK_UART_SRC_SEL_MASK = 0x1 << CLK_UART_SRC_SEL_SHIFT,
CLK_UART_SRC_SEL_GPLL = 0,
CLK_UART_SRC_SEL_CPLL,
CLK_UART_SEL_SHIFT = 14,
CLK_UART_SEL_MASK = 0x3 << CLK_UART_SEL_SHIFT,
CLK_UART_SEL_SRC = 0,
CLK_UART_SEL_FRAC,
CLK_UART_SEL_XIN24M,
/* PERICRU_CLKSEL_CON22 */
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,
/* PERICRU_CLKSEL_CON40 */
CLK_PWM1_PERI_SEL_SHIFT = 0,
CLK_PWM1_PERI_SEL_MASK = 0x3 << CLK_PWM1_PERI_SEL_SHIFT,
CLK_PWM_SEL_100M = 0,
CLK_PWM_SEL_50M,
CLK_PWM_SEL_24M,
CLK_PWM2_PERI_SEL_SHIFT = 6,
CLK_PWM2_PERI_SEL_MASK = 0x3 << CLK_PWM2_PERI_SEL_SHIFT,
CLK_PWM3_PERI_SEL_SHIFT = 8,
CLK_PWM3_PERI_SEL_MASK = 0x3 << CLK_PWM3_PERI_SEL_SHIFT,
/* PERICRU_CLKSEL_CON43 */
CLK_CORE_CRYPTO_SEL_SHIFT = 0,
CLK_CORE_CRYPTO_SEL_MASK = 0x3 << CLK_CORE_CRYPTO_SEL_SHIFT,
CLK_CORE_CRYPTO_SEL_200M = 0,
CLK_CORE_CRYPTO_SEL_100M,
CLK_CORE_CRYPTO_SEL_24M,
CLK_PKA_CRYPTO_SEL_SHIFT = 6,
CLK_PKA_CRYPTO_SEL_MASK = 0x3 << CLK_PKA_CRYPTO_SEL_SHIFT,
CLK_PKA_CRYPTO_SEL_300M = 0,
CLK_PKA_CRYPTO_SEL_200M,
CLK_PKA_CRYPTO_SEL_100M,
CLK_PKA_CRYPTO_SEL_24M,
TCLK_PERI_WDT_SEL_SHIFT = 15,
TCLK_PERI_WDT_SEL_MASK = 0x1 << TCLK_PERI_WDT_SEL_SHIFT,
/* PERICRU_CLKSEL_CON46 */
CLK_SARADC_DIV_SHIFT = 0,
CLK_SARADC_DIV_MASK = 0xfff << CLK_SARADC_DIV_SHIFT,
};
#endif