1045029cbSKever Yang /* 2045029cbSKever Yang * (C) Copyright 2017 Rockchip Electronics Co., Ltd. 3045029cbSKever Yang * 4045029cbSKever Yang * SPDX-License-Identifier: GPL-2.0+ 5045029cbSKever Yang */ 6045029cbSKever Yang #ifndef _ASM_ARCH_CRU_RK322X_H 7045029cbSKever Yang #define _ASM_ARCH_CRU_RK322X_H 8045029cbSKever Yang 9045029cbSKever Yang #include <common.h> 10045029cbSKever Yang 11809e91fdSElaine Zhang #define MHz 1000 * 1000 12045029cbSKever Yang #define OSC_HZ (24 * MHz) 13c85f17a6SKever Yang #define APLL_HZ (600 * MHz) 14809e91fdSElaine Zhang #define GPLL_HZ (1200 * MHz) 15809e91fdSElaine Zhang #define CPLL_HZ (500 * MHz) 16809e91fdSElaine Zhang #define ACLK_BUS_HZ (150 * MHz) 17809e91fdSElaine Zhang #define ACLK_PERI_HZ (150 * MHz) 18045029cbSKever Yang 19045029cbSKever Yang /* Private data for the clock driver - used by rockchip_get_cru() */ 20045029cbSKever Yang struct rk322x_clk_priv { 21045029cbSKever Yang struct rk322x_cru *cru; 22809e91fdSElaine Zhang ulong gpll_hz; 23809e91fdSElaine Zhang ulong cpll_hz; 242401c256SElaine Zhang ulong armclk_hz; 252401c256SElaine Zhang ulong armclk_enter_hz; 262401c256SElaine Zhang ulong armclk_init_hz; 272401c256SElaine Zhang bool sync_kernel; 282401c256SElaine Zhang bool set_armclk_rate; 29045029cbSKever Yang }; 30045029cbSKever Yang 31045029cbSKever Yang struct rk322x_cru { 32045029cbSKever Yang struct rk322x_pll { 33045029cbSKever Yang unsigned int con0; 34045029cbSKever Yang unsigned int con1; 35045029cbSKever Yang unsigned int con2; 36045029cbSKever Yang } pll[4]; 37045029cbSKever Yang unsigned int reserved0[4]; 38045029cbSKever Yang unsigned int cru_mode_con; 39045029cbSKever Yang unsigned int cru_clksel_con[35]; 40045029cbSKever Yang unsigned int cru_clkgate_con[16]; 41045029cbSKever Yang unsigned int cru_softrst_con[9]; 42045029cbSKever Yang unsigned int cru_misc_con; 43045029cbSKever Yang unsigned int reserved1[2]; 44045029cbSKever Yang unsigned int cru_glb_cnt_th; 45045029cbSKever Yang unsigned int reserved2[3]; 46045029cbSKever Yang unsigned int cru_glb_rst_st; 47045029cbSKever Yang unsigned int reserved3[(0x1c0 - 0x150) / 4 - 1]; 48045029cbSKever Yang unsigned int cru_sdmmc_con[2]; 49045029cbSKever Yang unsigned int cru_sdio_con[2]; 50045029cbSKever Yang unsigned int reserved4[2]; 51045029cbSKever Yang unsigned int cru_emmc_con[2]; 52045029cbSKever Yang unsigned int reserved5[4]; 53045029cbSKever Yang unsigned int cru_glb_srst_fst_value; 54045029cbSKever Yang unsigned int cru_glb_srst_snd_value; 55045029cbSKever Yang unsigned int cru_pll_mask_con; 56045029cbSKever Yang }; 57045029cbSKever Yang check_member(rk322x_cru, cru_pll_mask_con, 0x01f8); 58045029cbSKever Yang 59809e91fdSElaine Zhang enum rk322x_pll_id { 60809e91fdSElaine Zhang APLL, 61809e91fdSElaine Zhang DPLL, 62809e91fdSElaine Zhang CPLL, 63809e91fdSElaine Zhang GPLL, 64809e91fdSElaine Zhang NPLL, 65809e91fdSElaine Zhang PLL_COUNT, 66045029cbSKever Yang }; 67045029cbSKever Yang 68809e91fdSElaine Zhang struct rk322x_clk_info { 69809e91fdSElaine Zhang unsigned long id; 70809e91fdSElaine Zhang char *name; 71809e91fdSElaine Zhang bool is_cru; 72809e91fdSElaine Zhang }; 73809e91fdSElaine Zhang 74809e91fdSElaine Zhang #define RK2928_PLL_CON(x) ((x) * 0x4) 75809e91fdSElaine Zhang #define RK2928_MODE_CON 0x40 76809e91fdSElaine Zhang 77045029cbSKever Yang enum { 78045029cbSKever Yang /* CRU_CLK_SEL0_CON */ 79045029cbSKever Yang BUS_ACLK_PLL_SEL_SHIFT = 13, 80045029cbSKever Yang BUS_ACLK_PLL_SEL_MASK = 3 << BUS_ACLK_PLL_SEL_SHIFT, 81809e91fdSElaine Zhang BUS_ACLK_PLL_SEL_CPLL = 0, 82045029cbSKever Yang BUS_ACLK_PLL_SEL_GPLL, 83045029cbSKever Yang BUS_ACLK_PLL_SEL_HDMIPLL, 84045029cbSKever Yang BUS_ACLK_DIV_SHIFT = 8, 85045029cbSKever Yang BUS_ACLK_DIV_MASK = 0x1f << BUS_ACLK_DIV_SHIFT, 86045029cbSKever Yang CORE_CLK_PLL_SEL_SHIFT = 6, 87045029cbSKever Yang CORE_CLK_PLL_SEL_MASK = 3 << CORE_CLK_PLL_SEL_SHIFT, 88045029cbSKever Yang CORE_CLK_PLL_SEL_APLL = 0, 89045029cbSKever Yang CORE_CLK_PLL_SEL_GPLL, 90045029cbSKever Yang CORE_CLK_PLL_SEL_DPLL, 91045029cbSKever Yang CORE_DIV_CON_SHIFT = 0, 92045029cbSKever Yang CORE_DIV_CON_MASK = 0x1f << CORE_DIV_CON_SHIFT, 93045029cbSKever Yang 94045029cbSKever Yang /* CRU_CLK_SEL1_CON */ 95045029cbSKever Yang BUS_PCLK_DIV_SHIFT = 12, 96045029cbSKever Yang BUS_PCLK_DIV_MASK = 7 << BUS_PCLK_DIV_SHIFT, 97045029cbSKever Yang BUS_HCLK_DIV_SHIFT = 8, 98045029cbSKever Yang BUS_HCLK_DIV_MASK = 3 << BUS_HCLK_DIV_SHIFT, 99045029cbSKever Yang CORE_ACLK_DIV_SHIFT = 4, 100045029cbSKever Yang CORE_ACLK_DIV_MASK = 7 << CORE_ACLK_DIV_SHIFT, 101045029cbSKever Yang CORE_PERI_DIV_SHIFT = 0, 102045029cbSKever Yang CORE_PERI_DIV_MASK = 0xf << CORE_PERI_DIV_SHIFT, 103045029cbSKever Yang 104045029cbSKever Yang /* CRU_CLKSEL5_CON */ 105045029cbSKever Yang GMAC_OUT_PLL_SHIFT = 15, 106045029cbSKever Yang GMAC_OUT_PLL_MASK = 1 << GMAC_OUT_PLL_SHIFT, 107045029cbSKever Yang GMAC_OUT_DIV_SHIFT = 8, 108045029cbSKever Yang GMAC_OUT_DIV_MASK = 0x1f << GMAC_OUT_DIV_SHIFT, 109045029cbSKever Yang MAC_PLL_SEL_SHIFT = 7, 110045029cbSKever Yang MAC_PLL_SEL_MASK = 1 << MAC_PLL_SEL_SHIFT, 111045029cbSKever Yang RMII_EXTCLK_SLE_SHIFT = 5, 112045029cbSKever Yang RMII_EXTCLK_SEL_MASK = 1 << RMII_EXTCLK_SLE_SHIFT, 113045029cbSKever Yang RMII_EXTCLK_SEL_INT = 0, 114045029cbSKever Yang RMII_EXTCLK_SEL_EXT, 115045029cbSKever Yang CLK_MAC_DIV_SHIFT = 0, 116045029cbSKever Yang CLK_MAC_DIV_MASK = 0x1f << CLK_MAC_DIV_SHIFT, 117045029cbSKever Yang 118045029cbSKever Yang /* CRU_CLKSEL10_CON */ 119045029cbSKever Yang PERI_PCLK_DIV_SHIFT = 12, 120045029cbSKever Yang PERI_PCLK_DIV_MASK = 7 << PERI_PCLK_DIV_SHIFT, 121045029cbSKever Yang PERI_PLL_SEL_SHIFT = 10, 122045029cbSKever Yang PERI_PLL_SEL_MASK = 3 << PERI_PLL_SEL_SHIFT, 123045029cbSKever Yang PERI_PLL_CPLL = 0, 124045029cbSKever Yang PERI_PLL_GPLL, 125045029cbSKever Yang PERI_PLL_HDMIPLL, 126045029cbSKever Yang PERI_HCLK_DIV_SHIFT = 8, 127045029cbSKever Yang PERI_HCLK_DIV_MASK = 3 << PERI_HCLK_DIV_SHIFT, 128045029cbSKever Yang PERI_ACLK_DIV_SHIFT = 0, 129045029cbSKever Yang PERI_ACLK_DIV_MASK = 0x1f << PERI_ACLK_DIV_SHIFT, 130045029cbSKever Yang 131045029cbSKever Yang /* CRU_CLKSEL11_CON */ 132045029cbSKever Yang EMMC_PLL_SHIFT = 12, 133045029cbSKever Yang EMMC_PLL_MASK = 3 << EMMC_PLL_SHIFT, 134a80b3b03SKever Yang EMMC_SEL_CPLL = 0, 135045029cbSKever Yang EMMC_SEL_GPLL, 136045029cbSKever Yang EMMC_SEL_24M, 137045029cbSKever Yang SDIO_PLL_SHIFT = 10, 138045029cbSKever Yang SDIO_PLL_MASK = 3 << SDIO_PLL_SHIFT, 139a80b3b03SKever Yang SDIO_SEL_CPLL = 0, 140045029cbSKever Yang SDIO_SEL_GPLL, 141045029cbSKever Yang SDIO_SEL_24M, 142045029cbSKever Yang MMC0_PLL_SHIFT = 8, 143045029cbSKever Yang MMC0_PLL_MASK = 3 << MMC0_PLL_SHIFT, 144a80b3b03SKever Yang MMC0_SEL_CPLL = 0, 145045029cbSKever Yang MMC0_SEL_GPLL, 146045029cbSKever Yang MMC0_SEL_24M, 147045029cbSKever Yang MMC0_DIV_SHIFT = 0, 148045029cbSKever Yang MMC0_DIV_MASK = 0xff << MMC0_DIV_SHIFT, 149045029cbSKever Yang 150045029cbSKever Yang /* CRU_CLKSEL12_CON */ 151045029cbSKever Yang EMMC_DIV_SHIFT = 8, 152045029cbSKever Yang EMMC_DIV_MASK = 0xff << EMMC_DIV_SHIFT, 153045029cbSKever Yang SDIO_DIV_SHIFT = 0, 154045029cbSKever Yang SDIO_DIV_MASK = 0xff << SDIO_DIV_SHIFT, 155045029cbSKever Yang 156a7c5f873SElaine Zhang /* CLKSEL_CON24 */ 157a7c5f873SElaine Zhang CRYPTO_PLL_SEL_SHIFT = 5, 158a7c5f873SElaine Zhang CRYPTO_PLL_SEL_MASK = 0x1 << CRYPTO_PLL_SEL_SHIFT, 159a7c5f873SElaine Zhang CRYPTO_PLL_SEL_CPLL = 0, 160a7c5f873SElaine Zhang CRYPTO_PLL_SEL_GPLL, 161a7c5f873SElaine Zhang CRYPTO_DIV_SHIFT = 0, 162a7c5f873SElaine Zhang CRYPTO_DIV_MASK = 0x1f << CRYPTO_DIV_SHIFT, 163a7c5f873SElaine Zhang 164*403d8d4cSElaine Zhang /* CLKSEL_CON25 */ 165*403d8d4cSElaine Zhang SPI_PLL_SEL_SHIFT = 8, 166*403d8d4cSElaine Zhang SPI_PLL_SEL_MASK = 0x1 << SPI_PLL_SEL_SHIFT, 167*403d8d4cSElaine Zhang SPI_PLL_SEL_CPLL = 0, 168*403d8d4cSElaine Zhang SPI_PLL_SEL_GPLL, 169*403d8d4cSElaine Zhang SPI_DIV_SHIFT = 0, 170*403d8d4cSElaine Zhang SPI_DIV_MASK = 0x7f << SPI_DIV_SHIFT, 171*403d8d4cSElaine Zhang 172045029cbSKever Yang /* CRU_CLKSEL26_CON */ 173045029cbSKever Yang DDR_CLK_PLL_SEL_SHIFT = 8, 174045029cbSKever Yang DDR_CLK_PLL_SEL_MASK = 3 << DDR_CLK_PLL_SEL_SHIFT, 175045029cbSKever Yang DDR_CLK_SEL_DPLL = 0, 176045029cbSKever Yang DDR_CLK_SEL_GPLL, 177045029cbSKever Yang DDR_CLK_SEL_APLL, 178045029cbSKever Yang DDR_DIV_SEL_SHIFT = 0, 179045029cbSKever Yang DDR_DIV_SEL_MASK = 3 << DDR_DIV_SEL_SHIFT, 180045029cbSKever Yang 181045029cbSKever Yang /* CRU_CLKSEL27_CON */ 182809e91fdSElaine Zhang DCLK_LCDC_PLL_SEL_GPLL = 0, 183809e91fdSElaine Zhang DCLK_LCDC_PLL_SEL_CPLL = 1, 184809e91fdSElaine Zhang DCLK_LCDC_PLL_SEL_SHIFT = 0, 185809e91fdSElaine Zhang DCLK_LCDC_PLL_SEL_MASK = 1 << DCLK_LCDC_PLL_SEL_SHIFT, 186809e91fdSElaine Zhang DCLK_LCDC_SEL_HDMIPHY = 0, 187809e91fdSElaine Zhang DCLK_LCDC_SEL_PLL = 1, 188809e91fdSElaine Zhang DCLK_LCDC_SEL_SHIFT = 1, 189809e91fdSElaine Zhang DCLK_LCDC_SEL_MASK = 1 << DCLK_LCDC_SEL_SHIFT, 190809e91fdSElaine Zhang DCLK_LCDC_DIV_CON_SHIFT = 8, 191809e91fdSElaine Zhang DCLK_LCDC_DIV_CON_MASK = 0xFf << DCLK_LCDC_DIV_CON_SHIFT, 192045029cbSKever Yang 193045029cbSKever Yang /* CRU_CLKSEL29_CON */ 194045029cbSKever Yang GMAC_CLK_SRC_SHIFT = 12, 195045029cbSKever Yang GMAC_CLK_SRC_MASK = 1 << GMAC_CLK_SRC_SHIFT, 196045029cbSKever Yang 197809e91fdSElaine Zhang /* CRU_CLKSEL33_CON */ 198809e91fdSElaine Zhang ACLK_VOP_PLL_SEL_SHIFT = 5, 199809e91fdSElaine Zhang ACLK_VOP_PLL_SEL_MASK = 0x3 << ACLK_VOP_PLL_SEL_SHIFT, 200809e91fdSElaine Zhang ACLK_VOP_PLL_SEL_CPLL = 0, 201809e91fdSElaine Zhang ACLK_VOP_PLL_SEL_GPLL = 1, 202809e91fdSElaine Zhang ACLK_VOP_PLL_SEL_HDMIPHY = 2, 203809e91fdSElaine Zhang ACLK_VOP_DIV_CON_SHIFT = 0, 204809e91fdSElaine Zhang ACLK_VOP_DIV_CON_MASK = 0x1f << ACLK_VOP_DIV_CON_SHIFT, 205809e91fdSElaine Zhang 206045029cbSKever Yang /* CRU_SOFTRST5_CON */ 207045029cbSKever Yang DDRCTRL_PSRST_SHIFT = 11, 208045029cbSKever Yang DDRCTRL_SRST_SHIFT = 10, 209045029cbSKever Yang DDRPHY_PSRST_SHIFT = 9, 210045029cbSKever Yang DDRPHY_SRST_SHIFT = 8, 211045029cbSKever Yang }; 212045029cbSKever Yang #endif 213