1*91f16700Schasinglulu /* 2*91f16700Schasinglulu * Copyright (c) 2016-2021, ARM Limited and Contributors. All rights reserved. 3*91f16700Schasinglulu * 4*91f16700Schasinglulu * SPDX-License-Identifier: BSD-3-Clause 5*91f16700Schasinglulu */ 6*91f16700Schasinglulu 7*91f16700Schasinglulu #ifndef SOC_H 8*91f16700Schasinglulu #define SOC_H 9*91f16700Schasinglulu 10*91f16700Schasinglulu #include <lib/utils.h> 11*91f16700Schasinglulu 12*91f16700Schasinglulu #define GLB_SRST_FST_CFG_VAL 0xfdb9 13*91f16700Schasinglulu #define GLB_SRST_SND_CFG_VAL 0xeca8 14*91f16700Schasinglulu 15*91f16700Schasinglulu #define PMUCRU_PPLL_CON(n) ((n) * 4) 16*91f16700Schasinglulu #define CRU_PLL_CON(pll_id, n) ((pll_id) * 0x20 + (n) * 4) 17*91f16700Schasinglulu #define PLL_MODE_MSK 0x03 18*91f16700Schasinglulu #define PLL_MODE_SHIFT 0x08 19*91f16700Schasinglulu #define PLL_BYPASS_MSK 0x01 20*91f16700Schasinglulu #define PLL_BYPASS_SHIFT 0x01 21*91f16700Schasinglulu #define PLL_PWRDN_MSK 0x01 22*91f16700Schasinglulu #define PLL_PWRDN_SHIFT 0x0 23*91f16700Schasinglulu #define PLL_BYPASS BIT(1) 24*91f16700Schasinglulu #define PLL_PWRDN BIT(0) 25*91f16700Schasinglulu 26*91f16700Schasinglulu #define NO_PLL_BYPASS (0x00) 27*91f16700Schasinglulu #define NO_PLL_PWRDN (0x00) 28*91f16700Schasinglulu 29*91f16700Schasinglulu #define FBDIV(n) ((0xfff << 16) | n) 30*91f16700Schasinglulu #define POSTDIV2(n) ((0x7 << (12 + 16)) | (n << 12)) 31*91f16700Schasinglulu #define POSTDIV1(n) ((0x7 << (8 + 16)) | (n << 8)) 32*91f16700Schasinglulu #define REFDIV(n) ((0x3F << 16) | n) 33*91f16700Schasinglulu #define PLL_LOCK(n) ((n >> 31) & 0x1) 34*91f16700Schasinglulu 35*91f16700Schasinglulu #define PLL_SLOW_MODE BITS_WITH_WMASK(SLOW_MODE,\ 36*91f16700Schasinglulu PLL_MODE_MSK, PLL_MODE_SHIFT) 37*91f16700Schasinglulu 38*91f16700Schasinglulu #define PLL_NOMAL_MODE BITS_WITH_WMASK(NORMAL_MODE,\ 39*91f16700Schasinglulu PLL_MODE_MSK, PLL_MODE_SHIFT) 40*91f16700Schasinglulu 41*91f16700Schasinglulu #define PLL_BYPASS_MODE BIT_WITH_WMSK(PLL_BYPASS_SHIFT) 42*91f16700Schasinglulu #define PLL_NO_BYPASS_MODE WMSK_BIT(PLL_BYPASS_SHIFT) 43*91f16700Schasinglulu 44*91f16700Schasinglulu #define PLL_CON_COUNT 0x06 45*91f16700Schasinglulu #define CRU_CLKSEL_COUNT 108 46*91f16700Schasinglulu #define CRU_CLKSEL_CON(n) (0x100 + (n) * 4) 47*91f16700Schasinglulu 48*91f16700Schasinglulu #define PMUCRU_CLKSEL_CONUT 0x06 49*91f16700Schasinglulu #define PMUCRU_CLKSEL_OFFSET 0x080 50*91f16700Schasinglulu #define REG_SIZE 0x04 51*91f16700Schasinglulu #define REG_SOC_WMSK 0xffff0000 52*91f16700Schasinglulu #define CLK_GATE_MASK 0x01 53*91f16700Schasinglulu 54*91f16700Schasinglulu #define PMUCRU_GATE_COUNT 0x03 55*91f16700Schasinglulu #define CRU_GATE_COUNT 0x23 56*91f16700Schasinglulu #define PMUCRU_GATE_CON(n) (0x100 + (n) * 4) 57*91f16700Schasinglulu #define CRU_GATE_CON(n) (0x300 + (n) * 4) 58*91f16700Schasinglulu 59*91f16700Schasinglulu #define PMUCRU_RSTNHOLD_CON0 0x120 60*91f16700Schasinglulu enum { 61*91f16700Schasinglulu PRESETN_NOC_PMU_HOLD = 1, 62*91f16700Schasinglulu PRESETN_INTMEM_PMU_HOLD, 63*91f16700Schasinglulu HRESETN_CM0S_PMU_HOLD, 64*91f16700Schasinglulu HRESETN_CM0S_NOC_PMU_HOLD, 65*91f16700Schasinglulu DRESETN_CM0S_PMU_HOLD, 66*91f16700Schasinglulu POESETN_CM0S_PMU_HOLD, 67*91f16700Schasinglulu PRESETN_SPI3_HOLD, 68*91f16700Schasinglulu RESETN_SPI3_HOLD, 69*91f16700Schasinglulu PRESETN_TIMER_PMU_0_1_HOLD, 70*91f16700Schasinglulu RESETN_TIMER_PMU_0_HOLD, 71*91f16700Schasinglulu RESETN_TIMER_PMU_1_HOLD, 72*91f16700Schasinglulu PRESETN_UART_M0_PMU_HOLD, 73*91f16700Schasinglulu RESETN_UART_M0_PMU_HOLD, 74*91f16700Schasinglulu PRESETN_WDT_PMU_HOLD 75*91f16700Schasinglulu }; 76*91f16700Schasinglulu 77*91f16700Schasinglulu #define PMUCRU_RSTNHOLD_CON1 0x124 78*91f16700Schasinglulu enum { 79*91f16700Schasinglulu PRESETN_I2C0_HOLD, 80*91f16700Schasinglulu PRESETN_I2C4_HOLD, 81*91f16700Schasinglulu PRESETN_I2C8_HOLD, 82*91f16700Schasinglulu PRESETN_MAILBOX_PMU_HOLD, 83*91f16700Schasinglulu PRESETN_RKPWM_PMU_HOLD, 84*91f16700Schasinglulu PRESETN_PMUGRF_HOLD, 85*91f16700Schasinglulu PRESETN_SGRF_HOLD, 86*91f16700Schasinglulu PRESETN_GPIO0_HOLD, 87*91f16700Schasinglulu PRESETN_GPIO1_HOLD, 88*91f16700Schasinglulu PRESETN_CRU_PMU_HOLD, 89*91f16700Schasinglulu PRESETN_INTR_ARB_HOLD, 90*91f16700Schasinglulu PRESETN_PVTM_PMU_HOLD, 91*91f16700Schasinglulu RESETN_I2C0_HOLD, 92*91f16700Schasinglulu RESETN_I2C4_HOLD, 93*91f16700Schasinglulu RESETN_I2C8_HOLD 94*91f16700Schasinglulu }; 95*91f16700Schasinglulu 96*91f16700Schasinglulu enum plls_id { 97*91f16700Schasinglulu ALPLL_ID = 0, 98*91f16700Schasinglulu ABPLL_ID, 99*91f16700Schasinglulu DPLL_ID, 100*91f16700Schasinglulu CPLL_ID, 101*91f16700Schasinglulu GPLL_ID, 102*91f16700Schasinglulu NPLL_ID, 103*91f16700Schasinglulu VPLL_ID, 104*91f16700Schasinglulu PPLL_ID, 105*91f16700Schasinglulu END_PLL_ID, 106*91f16700Schasinglulu }; 107*91f16700Schasinglulu 108*91f16700Schasinglulu #define CLST_L_CPUS_MSK (0xf) 109*91f16700Schasinglulu #define CLST_B_CPUS_MSK (0x3) 110*91f16700Schasinglulu 111*91f16700Schasinglulu enum pll_work_mode { 112*91f16700Schasinglulu SLOW_MODE = 0x00, 113*91f16700Schasinglulu NORMAL_MODE = 0x01, 114*91f16700Schasinglulu DEEP_SLOW_MODE = 0x02, 115*91f16700Schasinglulu }; 116*91f16700Schasinglulu 117*91f16700Schasinglulu enum glb_sft_reset { 118*91f16700Schasinglulu PMU_RST_BY_FIRST_SFT, 119*91f16700Schasinglulu PMU_RST_BY_SECOND_SFT = BIT(2), 120*91f16700Schasinglulu PMU_RST_NOT_BY_SFT = BIT(3), 121*91f16700Schasinglulu }; 122*91f16700Schasinglulu 123*91f16700Schasinglulu struct pll_div { 124*91f16700Schasinglulu uint32_t mhz; 125*91f16700Schasinglulu uint32_t refdiv; 126*91f16700Schasinglulu uint32_t fbdiv; 127*91f16700Schasinglulu uint32_t postdiv1; 128*91f16700Schasinglulu uint32_t postdiv2; 129*91f16700Schasinglulu uint32_t frac; 130*91f16700Schasinglulu uint32_t freq; 131*91f16700Schasinglulu }; 132*91f16700Schasinglulu 133*91f16700Schasinglulu struct deepsleep_data_s { 134*91f16700Schasinglulu uint32_t plls_con[END_PLL_ID][PLL_CON_COUNT]; 135*91f16700Schasinglulu uint32_t cru_gate_con[CRU_GATE_COUNT]; 136*91f16700Schasinglulu uint32_t pmucru_gate_con[PMUCRU_GATE_COUNT]; 137*91f16700Schasinglulu }; 138*91f16700Schasinglulu 139*91f16700Schasinglulu struct pmu_sleep_data { 140*91f16700Schasinglulu uint32_t pmucru_rstnhold_con0; 141*91f16700Schasinglulu uint32_t pmucru_rstnhold_con1; 142*91f16700Schasinglulu }; 143*91f16700Schasinglulu 144*91f16700Schasinglulu /************************************************** 145*91f16700Schasinglulu * pmugrf reg, offset 146*91f16700Schasinglulu **************************************************/ 147*91f16700Schasinglulu #define PMUGRF_OSREG(n) (0x300 + (n) * 4) 148*91f16700Schasinglulu #define PMUGRF_GPIO0A_P 0x040 149*91f16700Schasinglulu #define PMUGRF_GPIO1A_P 0x050 150*91f16700Schasinglulu 151*91f16700Schasinglulu /************************************************** 152*91f16700Schasinglulu * DCF reg, offset 153*91f16700Schasinglulu **************************************************/ 154*91f16700Schasinglulu #define DCF_DCF_CTRL 0x0 155*91f16700Schasinglulu #define DCF_DCF_ADDR 0x8 156*91f16700Schasinglulu #define DCF_DCF_ISR 0xc 157*91f16700Schasinglulu #define DCF_DCF_TOSET 0x14 158*91f16700Schasinglulu #define DCF_DCF_TOCMD 0x18 159*91f16700Schasinglulu #define DCF_DCF_CMD_CFG 0x1c 160*91f16700Schasinglulu 161*91f16700Schasinglulu /* DCF_DCF_ISR */ 162*91f16700Schasinglulu #define DCF_TIMEOUT (1 << 2) 163*91f16700Schasinglulu #define DCF_ERR (1 << 1) 164*91f16700Schasinglulu #define DCF_DONE (1 << 0) 165*91f16700Schasinglulu 166*91f16700Schasinglulu /* DCF_DCF_CTRL */ 167*91f16700Schasinglulu #define DCF_VOP_HW_EN (1 << 2) 168*91f16700Schasinglulu #define DCF_STOP (1 << 1) 169*91f16700Schasinglulu #define DCF_START (1 << 0) 170*91f16700Schasinglulu 171*91f16700Schasinglulu #define CYCL_24M_CNT_US(us) (24 * us) 172*91f16700Schasinglulu #define CYCL_24M_CNT_MS(ms) (ms * CYCL_24M_CNT_US(1000)) 173*91f16700Schasinglulu #define CYCL_32K_CNT_MS(ms) (ms * 32) 174*91f16700Schasinglulu 175*91f16700Schasinglulu /************************************************** 176*91f16700Schasinglulu * cru reg, offset 177*91f16700Schasinglulu **************************************************/ 178*91f16700Schasinglulu #define CRU_SOFTRST_CON(n) (0x400 + (n) * 4) 179*91f16700Schasinglulu 180*91f16700Schasinglulu #define CRU_DMAC0_RST BIT_WITH_WMSK(3) 181*91f16700Schasinglulu /* reset release*/ 182*91f16700Schasinglulu #define CRU_DMAC0_RST_RLS WMSK_BIT(3) 183*91f16700Schasinglulu 184*91f16700Schasinglulu #define CRU_DMAC1_RST BIT_WITH_WMSK(4) 185*91f16700Schasinglulu /* reset release*/ 186*91f16700Schasinglulu #define CRU_DMAC1_RST_RLS WMSK_BIT(4) 187*91f16700Schasinglulu 188*91f16700Schasinglulu #define CRU_GLB_RST_CON 0x0510 189*91f16700Schasinglulu #define CRU_GLB_SRST_FST 0x0500 190*91f16700Schasinglulu #define CRU_GLB_SRST_SND 0x0504 191*91f16700Schasinglulu 192*91f16700Schasinglulu #define CRU_CLKGATE_CON(n) (0x300 + n * 4) 193*91f16700Schasinglulu #define PCLK_GPIO2_GATE_SHIFT 3 194*91f16700Schasinglulu #define PCLK_GPIO3_GATE_SHIFT 4 195*91f16700Schasinglulu #define PCLK_GPIO4_GATE_SHIFT 5 196*91f16700Schasinglulu 197*91f16700Schasinglulu /************************************************** 198*91f16700Schasinglulu * pmu cru reg, offset 199*91f16700Schasinglulu **************************************************/ 200*91f16700Schasinglulu #define CRU_PMU_RSTHOLD_CON(n) (0x120 + n * 4) 201*91f16700Schasinglulu /* reset hold*/ 202*91f16700Schasinglulu #define CRU_PMU_SGRF_RST_HOLD BIT_WITH_WMSK(6) 203*91f16700Schasinglulu /* reset hold release*/ 204*91f16700Schasinglulu #define CRU_PMU_SGRF_RST_RLS WMSK_BIT(6) 205*91f16700Schasinglulu 206*91f16700Schasinglulu #define CRU_PMU_WDTRST_MSK (0x1 << 4) 207*91f16700Schasinglulu #define CRU_PMU_WDTRST_EN 0x0 208*91f16700Schasinglulu 209*91f16700Schasinglulu #define CRU_PMU_FIRST_SFTRST_MSK (0x3 << 2) 210*91f16700Schasinglulu #define CRU_PMU_FIRST_SFTRST_EN 0x0 211*91f16700Schasinglulu 212*91f16700Schasinglulu #define CRU_PMU_CLKGATE_CON(n) (0x100 + n * 4) 213*91f16700Schasinglulu #define PCLK_GPIO0_GATE_SHIFT 3 214*91f16700Schasinglulu #define PCLK_GPIO1_GATE_SHIFT 4 215*91f16700Schasinglulu 216*91f16700Schasinglulu #define CPU_BOOT_ADDR_WMASK 0xffff0000 217*91f16700Schasinglulu #define CPU_BOOT_ADDR_ALIGN 16 218*91f16700Schasinglulu 219*91f16700Schasinglulu #define GRF_IOMUX_2BIT_MASK 0x3 220*91f16700Schasinglulu #define GRF_IOMUX_GPIO 0x0 221*91f16700Schasinglulu 222*91f16700Schasinglulu #define GRF_GPIO4C2_IOMUX_SHIFT 4 223*91f16700Schasinglulu #define GRF_GPIO4C2_IOMUX_PWM 0x1 224*91f16700Schasinglulu #define GRF_GPIO4C6_IOMUX_SHIFT 12 225*91f16700Schasinglulu #define GRF_GPIO4C6_IOMUX_PWM 0x1 226*91f16700Schasinglulu 227*91f16700Schasinglulu #define PWM_CNT(n) (0x0000 + 0x10 * (n)) 228*91f16700Schasinglulu #define PWM_PERIOD_HPR(n) (0x0004 + 0x10 * (n)) 229*91f16700Schasinglulu #define PWM_DUTY_LPR(n) (0x0008 + 0x10 * (n)) 230*91f16700Schasinglulu #define PWM_CTRL(n) (0x000c + 0x10 * (n)) 231*91f16700Schasinglulu 232*91f16700Schasinglulu #define PWM_DISABLE (0 << 0) 233*91f16700Schasinglulu #define PWM_ENABLE (1 << 0) 234*91f16700Schasinglulu 235*91f16700Schasinglulu /* grf reg offset */ 236*91f16700Schasinglulu #define GRF_USBPHY0_CTRL0 0x4480 237*91f16700Schasinglulu #define GRF_USBPHY0_CTRL2 0x4488 238*91f16700Schasinglulu #define GRF_USBPHY0_CTRL3 0x448c 239*91f16700Schasinglulu #define GRF_USBPHY0_CTRL12 0x44b0 240*91f16700Schasinglulu #define GRF_USBPHY0_CTRL13 0x44b4 241*91f16700Schasinglulu #define GRF_USBPHY0_CTRL15 0x44bc 242*91f16700Schasinglulu #define GRF_USBPHY0_CTRL16 0x44c0 243*91f16700Schasinglulu 244*91f16700Schasinglulu #define GRF_USBPHY1_CTRL0 0x4500 245*91f16700Schasinglulu #define GRF_USBPHY1_CTRL2 0x4508 246*91f16700Schasinglulu #define GRF_USBPHY1_CTRL3 0x450c 247*91f16700Schasinglulu #define GRF_USBPHY1_CTRL12 0x4530 248*91f16700Schasinglulu #define GRF_USBPHY1_CTRL13 0x4534 249*91f16700Schasinglulu #define GRF_USBPHY1_CTRL15 0x453c 250*91f16700Schasinglulu #define GRF_USBPHY1_CTRL16 0x4540 251*91f16700Schasinglulu 252*91f16700Schasinglulu #define GRF_GPIO2A_IOMUX 0xe000 253*91f16700Schasinglulu #define GRF_GPIO2A_P 0xe040 254*91f16700Schasinglulu #define GRF_GPIO3A_P 0xe050 255*91f16700Schasinglulu #define GRF_GPIO4A_P 0xe060 256*91f16700Schasinglulu #define GRF_GPIO2D_HE 0xe18c 257*91f16700Schasinglulu #define GRF_DDRC0_CON0 0xe380 258*91f16700Schasinglulu #define GRF_DDRC0_CON1 0xe384 259*91f16700Schasinglulu #define GRF_DDRC1_CON0 0xe388 260*91f16700Schasinglulu #define GRF_DDRC1_CON1 0xe38c 261*91f16700Schasinglulu #define GRF_SOC_CON_BASE 0xe200 262*91f16700Schasinglulu #define GRF_SOC_CON(n) (GRF_SOC_CON_BASE + (n) * 4) 263*91f16700Schasinglulu #define GRF_IO_VSEL 0xe640 264*91f16700Schasinglulu 265*91f16700Schasinglulu #define CRU_CLKSEL_CON0 0x0100 266*91f16700Schasinglulu #define CRU_CLKSEL_CON6 0x0118 267*91f16700Schasinglulu #define CRU_SDIO0_CON1 0x058c 268*91f16700Schasinglulu #define PMUCRU_CLKSEL_CON0 0x0080 269*91f16700Schasinglulu #define PMUCRU_CLKGATE_CON2 0x0108 270*91f16700Schasinglulu #define PMUCRU_SOFTRST_CON0 0x0110 271*91f16700Schasinglulu #define PMUCRU_GATEDIS_CON0 0x0130 272*91f16700Schasinglulu #define PMUCRU_SOFTRST_CON(n) (PMUCRU_SOFTRST_CON0 + (n) * 4) 273*91f16700Schasinglulu 274*91f16700Schasinglulu /* export related and operating SoC APIs */ 275*91f16700Schasinglulu void __dead2 soc_global_soft_reset(void); 276*91f16700Schasinglulu void disable_dvfs_plls(void); 277*91f16700Schasinglulu void disable_nodvfs_plls(void); 278*91f16700Schasinglulu void enable_dvfs_plls(void); 279*91f16700Schasinglulu void enable_nodvfs_plls(void); 280*91f16700Schasinglulu void prepare_abpll_for_ddrctrl(void); 281*91f16700Schasinglulu void restore_abpll(void); 282*91f16700Schasinglulu void clk_gate_con_save(void); 283*91f16700Schasinglulu void clk_gate_con_disable(void); 284*91f16700Schasinglulu void clk_gate_con_restore(void); 285*91f16700Schasinglulu void set_pmu_rsthold(void); 286*91f16700Schasinglulu void pmu_sgrf_rst_hld(void); 287*91f16700Schasinglulu __pmusramfunc void pmu_sgrf_rst_hld_release(void); 288*91f16700Schasinglulu __pmusramfunc void restore_pmu_rsthold(void); 289*91f16700Schasinglulu #endif /* SOC_H */ 290