/* SPDX-License-Identifier: GPL-2.0 */ /* * Copyright (c) 2022 Rockchip Electronics Co. Ltd. * Author: * Elaine Zhang * Finley Xiao */ #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