15b7480cdSFinley Xiao /* SPDX-License-Identifier: GPL-2.0 */ 25b7480cdSFinley Xiao /* 35b7480cdSFinley Xiao * Copyright (c) 2023 Rockchip Electronics Co. Ltd. 45b7480cdSFinley Xiao * Author: 55b7480cdSFinley Xiao * Finley Xiao <finley.xiao@rock-chips.com> 65b7480cdSFinley Xiao */ 75b7480cdSFinley Xiao 85b7480cdSFinley Xiao #ifndef _ASM_ARCH_CRU_RK3506_H 95b7480cdSFinley Xiao #define _ASM_ARCH_CRU_RK3506_H 105b7480cdSFinley Xiao 115b7480cdSFinley Xiao #define MHz 1000000 125b7480cdSFinley Xiao #define KHz 1000 135b7480cdSFinley Xiao #define OSC_HZ (24 * MHz) 145b7480cdSFinley Xiao 155b7480cdSFinley Xiao #define CPU_FREQ_HZ 589824000 165b7480cdSFinley Xiao 175b7480cdSFinley Xiao /* RK3506 pll id */ 185b7480cdSFinley Xiao enum rk3506_pll_id { 195b7480cdSFinley Xiao GPLL, 205b7480cdSFinley Xiao V0PLL, 215b7480cdSFinley Xiao V1PLL, 225b7480cdSFinley Xiao PLL_COUNT, 235b7480cdSFinley Xiao }; 245b7480cdSFinley Xiao 255b7480cdSFinley Xiao struct rk3506_clk_info { 265b7480cdSFinley Xiao unsigned long id; 275b7480cdSFinley Xiao char *name; 285b7480cdSFinley Xiao }; 295b7480cdSFinley Xiao 305b7480cdSFinley Xiao struct rk3506_clk_priv { 315b7480cdSFinley Xiao struct rk3506_cru *cru; 325b7480cdSFinley Xiao ulong gpll_hz; 335b7480cdSFinley Xiao ulong gpll_div_hz; 345b7480cdSFinley Xiao ulong gpll_div_100mhz; 355b7480cdSFinley Xiao ulong v0pll_hz; 365b7480cdSFinley Xiao ulong v0pll_div_hz; 375b7480cdSFinley Xiao ulong v1pll_hz; 385b7480cdSFinley Xiao ulong v1pll_div_hz; 395b7480cdSFinley Xiao ulong armclk_hz; 405b7480cdSFinley Xiao ulong armclk_enter_hz; 415b7480cdSFinley Xiao ulong armclk_init_hz; 425b7480cdSFinley Xiao bool sync_kernel; 435b7480cdSFinley Xiao bool set_armclk_rate; 445b7480cdSFinley Xiao }; 455b7480cdSFinley Xiao 465b7480cdSFinley Xiao struct rk3506_cru { 475b7480cdSFinley Xiao /* cru */ 485b7480cdSFinley Xiao uint32_t reserved0000[160]; /* offset 0x0 */ 495b7480cdSFinley Xiao uint32_t mode_con; /* offset 0x280 */ 505b7480cdSFinley Xiao uint32_t reserved0284[31]; /* offset 0x284 */ 515b7480cdSFinley Xiao uint32_t clksel_con[62]; /* offset 0x300 */ 525b7480cdSFinley Xiao uint32_t reserved03f8[258]; /* offset 0x3F8 */ 535b7480cdSFinley Xiao uint32_t gate_con[23]; /* offset 0x800 */ 545b7480cdSFinley Xiao uint32_t reserved085c[105]; /* offset 0x85C */ 555b7480cdSFinley Xiao uint32_t softrst_con[23]; /* offset 0xA00 */ 565b7480cdSFinley Xiao uint32_t reserved0a5c[105]; /* offset 0xA5C */ 575b7480cdSFinley Xiao uint32_t glb_cnt_th; /* offset 0xC00 */ 585b7480cdSFinley Xiao uint32_t glb_rst_st; /* offset 0xC04 */ 595b7480cdSFinley Xiao uint32_t glb_srst_fst; /* offset 0xC08 */ 605b7480cdSFinley Xiao uint32_t glb_srst_snd; /* offset 0xC0C */ 615b7480cdSFinley Xiao uint32_t glb_rst_con; /* offset 0xC10 */ 625b7480cdSFinley Xiao uint32_t reserved0c14[6]; /* offset 0xC14 */ 635b7480cdSFinley Xiao uint32_t corewfi_con; /* offset 0xC2C */ 645b7480cdSFinley Xiao uint32_t reserved0c30[15604]; /* offset 0xC30 */ 655b7480cdSFinley Xiao 665b7480cdSFinley Xiao /* pmu cru */ 675b7480cdSFinley Xiao uint32_t gpll_con[5]; /* offset 0x10000 */ 685b7480cdSFinley Xiao uint32_t reserved10014[3]; /* offset 0x10014 */ 695b7480cdSFinley Xiao uint32_t v0pll_con[5]; /* offset 0x10020 */ 705b7480cdSFinley Xiao uint32_t reserved10034[3]; /* offset 0x10034 */ 715b7480cdSFinley Xiao uint32_t v1pll_con[5]; /* offset 0x10040 */ 725b7480cdSFinley Xiao uint32_t reserved10074[171]; /* offset 0x10054 */ 735b7480cdSFinley Xiao uint32_t pmuclksel_con[7]; /* offset 0x10300 */ 745b7480cdSFinley Xiao uint32_t reserved1031c[313]; /* offset 0x1031C */ 755b7480cdSFinley Xiao uint32_t pmugate_con[3]; /* offset 0x10800 */ 765b7480cdSFinley Xiao uint32_t reserved1080c[125]; /* offset 0x1080C */ 775b7480cdSFinley Xiao uint32_t pmusoftrst_con[2]; /* offset 0x10A00 */ 785b7480cdSFinley Xiao uint32_t reserved10a08[7583]; /* offset 0x10A08 */ 795b7480cdSFinley Xiao }; 805b7480cdSFinley Xiao 815b7480cdSFinley Xiao check_member(rk3506_cru, reserved0c30[0], 0x0c30); 825b7480cdSFinley Xiao check_member(rk3506_cru, reserved10a08[0], 0x10a08); 835b7480cdSFinley Xiao 845b7480cdSFinley Xiao struct pll_rate_table { 855b7480cdSFinley Xiao unsigned long rate; 865b7480cdSFinley Xiao unsigned int fbdiv; 875b7480cdSFinley Xiao unsigned int postdiv1; 885b7480cdSFinley Xiao unsigned int refdiv; 895b7480cdSFinley Xiao unsigned int postdiv2; 905b7480cdSFinley Xiao unsigned int dsmpd; 915b7480cdSFinley Xiao unsigned int frac; 925b7480cdSFinley Xiao }; 935b7480cdSFinley Xiao 945b7480cdSFinley Xiao #define RK3506_PMU_CRU_BASE 0x10000 955b7480cdSFinley Xiao #define RK3506_PLL_CON(x) ((x) * 0x4 + RK3506_PMU_CRU_BASE) 965b7480cdSFinley Xiao #define RK3506_CLKSEL_CON(x) ((x) * 0x4 + 0x300) 975b7480cdSFinley Xiao #define RK3506_CLKGATE_CON(x) ((x) * 0x4 + 0x800) 985b7480cdSFinley Xiao #define RK3506_SOFTRST_CON(x) ((x) * 0x4 + 0xa00) 995b7480cdSFinley Xiao #define RK3506_PMU_CLKSEL_CON(x) ((x) * 0x4 + 0x300 + RK3506_PMU_CRU_BASE) 1005b7480cdSFinley Xiao #define RK3506_PMU_CLKGATE_CON(x) ((x) * 0x4 + 0x800 + RK3506_PMU_CRU_BASE) 1015b7480cdSFinley Xiao #define RK3506_MODE_CON 0x280 1025b7480cdSFinley Xiao #define RK3506_GLB_CNT_TH 0xc00 1035b7480cdSFinley Xiao #define RK3506_GLB_SRST_FST 0xc08 1045b7480cdSFinley Xiao #define RK3506_GLB_SRST_SND 0xc0c 1055b7480cdSFinley Xiao 1065b7480cdSFinley Xiao enum { 1075b7480cdSFinley Xiao /* CRU_CLKSEL_CON00 */ 1085b7480cdSFinley Xiao CLK_GPLL_DIV_SHIFT = 6, 1095b7480cdSFinley Xiao CLK_GPLL_DIV_MASK = 0xf << CLK_GPLL_DIV_SHIFT, 1105b7480cdSFinley Xiao CLK_GPLL_DIV_100M_SHIFT = 10, 1115b7480cdSFinley Xiao CLK_GPLL_DIV_100M_MASK = 0xf << CLK_GPLL_DIV_100M_SHIFT, 1125b7480cdSFinley Xiao 1135b7480cdSFinley Xiao /* CRU_CLKSEL_CON01 */ 1145b7480cdSFinley Xiao CLK_V0PLL_DIV_SHIFT = 0, 1155b7480cdSFinley Xiao CLK_V0PLL_DIV_MASK = 0xf << CLK_V0PLL_DIV_SHIFT, 1165b7480cdSFinley Xiao CLK_V1PLL_DIV_SHIFT = 4, 1175b7480cdSFinley Xiao CLK_V1PLL_DIV_MASK = 0xf << CLK_V1PLL_DIV_SHIFT, 1185b7480cdSFinley Xiao 1195b7480cdSFinley Xiao /* CRU_CLKSEL_CON15 */ 1205b7480cdSFinley Xiao CLK_CORE_SRC_DIV_SHIFT = 0, 1215b7480cdSFinley Xiao CLK_CORE_SRC_DIV_MASK = 0x1f << CLK_CORE_SRC_DIV_SHIFT, 1225b7480cdSFinley Xiao CLK_CORE_SRC_SEL_SHIFT = 5, 1235b7480cdSFinley Xiao CLK_CORE_SRC_SEL_MASK = 0x3 << CLK_CORE_SRC_SEL_SHIFT, 1245b7480cdSFinley Xiao CLK_CORE_SEL_GPLL = 0, 1255b7480cdSFinley Xiao CLK_CORE_SEL_V0PLL, 1265b7480cdSFinley Xiao CLK_CORE_SEL_V1PLL, 127*5de46d87SFinley Xiao CLK_CORE_SRC_PVTMUX_SEL_SHIFT = 8, 128*5de46d87SFinley Xiao CLK_CORE_SRC_PVTMUX_SEL_MASK = 0x1 << CLK_CORE_SRC_PVTMUX_SEL_SHIFT, 129*5de46d87SFinley Xiao CLK_CORE_SRC_PRE = 0, 130*5de46d87SFinley Xiao CLK_CORE_PVTPLL_SRC, 1315b7480cdSFinley Xiao 1325b7480cdSFinley Xiao ACLK_CORE_DIV_SHIFT = 9, 1335b7480cdSFinley Xiao ACLK_CORE_DIV_MASK = 0xf << ACLK_CORE_DIV_SHIFT, 1345b7480cdSFinley Xiao 1355b7480cdSFinley Xiao /* CRU_CLKSEL_CON16 */ 1365b7480cdSFinley Xiao PCLK_CORE_DIV_SHIFT = 0, 1375b7480cdSFinley Xiao PCLK_CORE_DIV_MASK = 0xf << PCLK_CORE_DIV_SHIFT, 1385b7480cdSFinley Xiao 1395b7480cdSFinley Xiao /* CRU_CLKSEL_CON21 */ 1405b7480cdSFinley Xiao ACLK_BUS_DIV_SHIFT = 0, 1415b7480cdSFinley Xiao ACLK_BUS_DIV_MASK = 0x1f << ACLK_BUS_DIV_SHIFT, 1425b7480cdSFinley Xiao ACLK_BUS_SEL_SHIFT = 5, 1435b7480cdSFinley Xiao ACLK_BUS_SEL_MASK = 0x3 << ACLK_BUS_SEL_SHIFT, 1445b7480cdSFinley Xiao ACLK_BUS_SEL_GPLL_DIV = 0, 1455b7480cdSFinley Xiao ACLK_BUS_SEL_V0PLL_DIV, 1465b7480cdSFinley Xiao ACLK_BUS_SEL_V1PLL_DIV, 1475b7480cdSFinley Xiao 1485b7480cdSFinley Xiao HCLK_BUS_DIV_SHIFT = 7, 1495b7480cdSFinley Xiao HCLK_BUS_DIV_MASK = 0x1f << HCLK_BUS_DIV_SHIFT, 1505b7480cdSFinley Xiao HCLK_BUS_SEL_SHIFT = 12, 1515b7480cdSFinley Xiao HCLK_BUS_SEL_MASK = 0x3 << HCLK_BUS_SEL_SHIFT, 1525b7480cdSFinley Xiao 1535b7480cdSFinley Xiao /* CRU_CLKSEL_CON22 */ 1545b7480cdSFinley Xiao PCLK_BUS_DIV_SHIFT = 0, 1555b7480cdSFinley Xiao PCLK_BUS_DIV_MASK = 0x1f << PCLK_BUS_DIV_SHIFT, 1565b7480cdSFinley Xiao PCLK_BUS_SEL_SHIFT = 5, 1575b7480cdSFinley Xiao PCLK_BUS_SEL_MASK = 0x3 << PCLK_BUS_SEL_SHIFT, 1585b7480cdSFinley Xiao 1595b7480cdSFinley Xiao /* CRU_CLKSEL_CON29 */ 1605b7480cdSFinley Xiao HCLK_LSPERI_DIV_SHIFT = 0, 1615b7480cdSFinley Xiao HCLK_LSPERI_DIV_MASK = 0x1f << HCLK_LSPERI_DIV_SHIFT, 1625b7480cdSFinley Xiao HCLK_LSPERI_SEL_SHIFT = 5, 1635b7480cdSFinley Xiao HCLK_LSPERI_SEL_MASK = 0x3 << HCLK_LSPERI_SEL_SHIFT, 1645b7480cdSFinley Xiao 1655b7480cdSFinley Xiao /* CRU_CLKSEL_CON32 */ 1665b7480cdSFinley Xiao CLK_I2C0_DIV_SHIFT = 0, 1675b7480cdSFinley Xiao CLK_I2C0_DIV_MASK = 0xf << CLK_I2C0_DIV_SHIFT, 1685b7480cdSFinley Xiao CLK_I2C0_SEL_SHIFT = 4, 1695b7480cdSFinley Xiao CLK_I2C0_SEL_MASK = 0x3 << CLK_I2C0_SEL_SHIFT, 1705b7480cdSFinley Xiao CLK_I2C_SEL_GPLL = 0, 1715b7480cdSFinley Xiao CLK_I2C_SEL_V0PLL, 1725b7480cdSFinley Xiao CLK_I2C_SEL_V1PLL, 1735b7480cdSFinley Xiao CLK_I2C1_DIV_SHIFT = 6, 1745b7480cdSFinley Xiao CLK_I2C1_DIV_MASK = 0xf << CLK_I2C1_DIV_SHIFT, 1755b7480cdSFinley Xiao CLK_I2C1_SEL_SHIFT = 10, 1765b7480cdSFinley Xiao CLK_I2C1_SEL_MASK = 0x3 << CLK_I2C1_SEL_SHIFT, 1775b7480cdSFinley Xiao 1785b7480cdSFinley Xiao /* CRU_CLKSEL_CON33 */ 1795b7480cdSFinley Xiao CLK_I2C2_DIV_SHIFT = 0, 1805b7480cdSFinley Xiao CLK_I2C2_DIV_MASK = 0xf << CLK_I2C2_DIV_SHIFT, 1815b7480cdSFinley Xiao CLK_I2C2_SEL_SHIFT = 4, 1825b7480cdSFinley Xiao CLK_I2C2_SEL_MASK = 0x3 << CLK_I2C2_SEL_SHIFT, 1835b7480cdSFinley Xiao CLK_PWM1_DIV_SHIFT = 6, 1845b7480cdSFinley Xiao CLK_PWM1_DIV_MASK = 0xf << CLK_PWM1_DIV_SHIFT, 1855b7480cdSFinley Xiao CLK_PWM1_SEL_SHIFT = 10, 1865b7480cdSFinley Xiao CLK_PWM1_SEL_MASK = 0x3 << CLK_PWM1_SEL_SHIFT, 1875b7480cdSFinley Xiao CLK_PWM1_SEL_GPLL_DIV = 0, 1885b7480cdSFinley Xiao CLK_PWM1_SEL_V0PLL_DIV, 1895b7480cdSFinley Xiao CLK_PWM1_SEL_V1PLL_DIV, 1905b7480cdSFinley Xiao 1915b7480cdSFinley Xiao /* CRU_CLKSEL_CON34 */ 1925b7480cdSFinley Xiao CLK_SPI0_DIV_SHIFT = 4, 1935b7480cdSFinley Xiao CLK_SPI0_DIV_MASK = 0xf << CLK_SPI0_DIV_SHIFT, 1945b7480cdSFinley Xiao CLK_SPI0_SEL_SHIFT = 8, 1955b7480cdSFinley Xiao CLK_SPI0_SEL_MASK = 0x3 << CLK_SPI0_SEL_SHIFT, 1965b7480cdSFinley Xiao CLK_SPI_SEL_24M = 0, 1975b7480cdSFinley Xiao CLK_SPI_SEL_GPLL_DIV, 1985b7480cdSFinley Xiao CLK_SPI_SEL_V0PLL_DIV, 1995b7480cdSFinley Xiao CLK_SPI_SEL_V1PLL_DIV, 2005b7480cdSFinley Xiao 2015b7480cdSFinley Xiao CLK_SPI1_DIV_SHIFT = 10, 2025b7480cdSFinley Xiao CLK_SPI1_DIV_MASK = 0xf << CLK_SPI1_DIV_SHIFT, 2035b7480cdSFinley Xiao CLK_SPI1_SEL_SHIFT = 14, 2045b7480cdSFinley Xiao CLK_SPI1_SEL_MASK = 0x3 << CLK_SPI1_SEL_SHIFT, 2055b7480cdSFinley Xiao 2065b7480cdSFinley Xiao /* CRU_CLKSEL_CON49 */ 2075b7480cdSFinley Xiao ACLK_HSPERI_DIV_SHIFT = 0, 2085b7480cdSFinley Xiao ACLK_HSPERI_DIV_MASK = 0x1f << ACLK_HSPERI_DIV_SHIFT, 2095b7480cdSFinley Xiao ACLK_HSPERI_SEL_SHIFT = 5, 2105b7480cdSFinley Xiao ACLK_HSPERI_SEL_MASK = 0x3 << ACLK_HSPERI_SEL_SHIFT, 2115b7480cdSFinley Xiao ACLK_HSPERI_SEL_GPLL_DIV = 0, 2125b7480cdSFinley Xiao ACLK_HSPERI_SEL_V0PLL_DIV = 1, 2135b7480cdSFinley Xiao ACLK_HSPERI_SEL_V1PLL_DIV = 2, 2145b7480cdSFinley Xiao 2155b7480cdSFinley Xiao CCLK_SDMMC_DIV_SHIFT = 7, 2165b7480cdSFinley Xiao CCLK_SDMMC_DIV_MASK = 0x3f << CCLK_SDMMC_DIV_SHIFT, 2175b7480cdSFinley Xiao CCLK_SDMMC_SEL_SHIFT = 13, 2185b7480cdSFinley Xiao CCLK_SDMMC_SEL_MASK = 0x3 << CCLK_SDMMC_SEL_SHIFT, 2195b7480cdSFinley Xiao CCLK_SDMMC_SEL_24M = 0, 2205b7480cdSFinley Xiao CCLK_SDMMC_SEL_GPLL, 2215b7480cdSFinley Xiao CCLK_SDMMC_SEL_V0PLL, 2225b7480cdSFinley Xiao CCLK_SDMMC_SEL_V1PLL, 2235b7480cdSFinley Xiao 2245b7480cdSFinley Xiao /* CRU_CLKSEL_CON50 */ 2255b7480cdSFinley Xiao SCLK_FSPI_DIV_SHIFT = 0, 2265b7480cdSFinley Xiao SCLK_FSPI_DIV_MASK = 0x1f << SCLK_FSPI_DIV_SHIFT, 2275b7480cdSFinley Xiao SCLK_FSPI_SEL_SHIFT = 5, 2285b7480cdSFinley Xiao SCLK_FSPI_SEL_MASK = 0x3 << SCLK_FSPI_SEL_SHIFT, 2295b7480cdSFinley Xiao SCLK_FSPI_SEL_24M = 0, 2305b7480cdSFinley Xiao SCLK_FSPI_SEL_GPLL, 2315b7480cdSFinley Xiao SCLK_FSPI_SEL_V0PLL, 2325b7480cdSFinley Xiao SCLK_FSPI_SEL_V1PLL, 233e434c7b0SFinley Xiao CLK_MAC_DIV_SHIFT = 7, 234e434c7b0SFinley Xiao CLK_MAC_DIV_MASK = 0x1f << CLK_MAC_DIV_SHIFT, 2355b7480cdSFinley Xiao 2365b7480cdSFinley Xiao /* CRU_CLKSEL_CON54 */ 2375b7480cdSFinley Xiao CLK_SARADC_DIV_SHIFT = 0, 2385b7480cdSFinley Xiao CLK_SARADC_DIV_MASK = 0xf << CLK_SARADC_DIV_SHIFT, 2395b7480cdSFinley Xiao CLK_SARADC_SEL_SHIFT = 4, 2405b7480cdSFinley Xiao CLK_SARADC_SEL_MASK = 0x3 << CLK_SARADC_SEL_SHIFT, 2415b7480cdSFinley Xiao CLK_SARADC_SEL_24M = 0, 2425b7480cdSFinley Xiao CLK_SARADC_SEL_400K, 2435b7480cdSFinley Xiao CLK_SARADC_SEL_32K, 2445b7480cdSFinley Xiao 2455b7480cdSFinley Xiao /* CRU_CLKSEL_CON60 */ 2465b7480cdSFinley Xiao DCLK_VOP_DIV_SHIFT = 0, 2475b7480cdSFinley Xiao DCLK_VOP_DIV_MASK = 0xff << DCLK_VOP_DIV_SHIFT, 2485b7480cdSFinley Xiao DCLK_VOP_SEL_SHIFT = 8, 2495b7480cdSFinley Xiao DCLK_VOP_SEL_MASK = 0x7 << DCLK_VOP_SEL_SHIFT, 2505b7480cdSFinley Xiao DCLK_VOP_SEL_24M = 0, 2515b7480cdSFinley Xiao DCLK_VOP_SEL_GPLL, 2525b7480cdSFinley Xiao DCLK_VOP_SEL_V0PLL, 2535b7480cdSFinley Xiao DCLK_VOP_SEL_V1PLL, 2545b7480cdSFinley Xiao DCLK_VOP_SEL_FRAC_VOIC1, 2555b7480cdSFinley Xiao DCLK_VOP_SEL_FRAC_COMMON0, 2565b7480cdSFinley Xiao DCLK_VOP_SEL_FRAC_COMMON1, 2575b7480cdSFinley Xiao DCLK_VOP_SEL_FRAC_COMMON2, 2585b7480cdSFinley Xiao 2595b7480cdSFinley Xiao /* CRU_CLKSEL_CON61 */ 2605b7480cdSFinley Xiao CLK_TSADC_DIV_SHIFT = 0, 2615b7480cdSFinley Xiao CLK_TSADC_DIV_MASK = 0xff << CLK_TSADC_DIV_SHIFT, 2625b7480cdSFinley Xiao CLK_TSADC_TSEN_DIV_SHIFT = 8, 2635b7480cdSFinley Xiao CLK_TSADC_TSEN_DIV_MASK = 0x7 << CLK_TSADC_TSEN_DIV_SHIFT, 2645b7480cdSFinley Xiao 2655b7480cdSFinley Xiao /* PMUCRU_CLKSEL_CON00 */ 2665b7480cdSFinley Xiao CLK_PWM0_DIV_SHIFT = 6, 2675b7480cdSFinley Xiao CLK_PWM0_DIV_MASK = 0xf << CLK_PWM0_DIV_SHIFT, 268e434c7b0SFinley Xiao CLK_MAC_OUT_DIV_SHIFT = 10, 269e434c7b0SFinley Xiao CLK_MAC_OUT_DIV_MASK = 0x3f << CLK_MAC_OUT_DIV_SHIFT, 2705b7480cdSFinley Xiao 2715b7480cdSFinley Xiao }; 2725b7480cdSFinley Xiao #endif 273