1*05a21721SMasahiro Yamada /* 2*05a21721SMasahiro Yamada * Copyright (C) 2013 Altera Corporation <www.altera.com> 3*05a21721SMasahiro Yamada * 4*05a21721SMasahiro Yamada * SPDX-License-Identifier: GPL-2.0+ 5*05a21721SMasahiro Yamada */ 6*05a21721SMasahiro Yamada 7*05a21721SMasahiro Yamada 8*05a21721SMasahiro Yamada #include <common.h> 9*05a21721SMasahiro Yamada #include <asm/io.h> 10*05a21721SMasahiro Yamada #include <asm/arch/freeze_controller.h> 11*05a21721SMasahiro Yamada #include <asm/arch/timer.h> 12*05a21721SMasahiro Yamada #include <asm/errno.h> 13*05a21721SMasahiro Yamada 14*05a21721SMasahiro Yamada DECLARE_GLOBAL_DATA_PTR; 15*05a21721SMasahiro Yamada 16*05a21721SMasahiro Yamada static const struct socfpga_freeze_controller *freeze_controller_base = 17*05a21721SMasahiro Yamada (void *)(SOCFPGA_SYSMGR_ADDRESS + SYSMGR_FRZCTRL_ADDRESS); 18*05a21721SMasahiro Yamada 19*05a21721SMasahiro Yamada /* 20*05a21721SMasahiro Yamada * Default state from cold reset is FREEZE_ALL; the global 21*05a21721SMasahiro Yamada * flag is set to TRUE to indicate the IO banks are frozen 22*05a21721SMasahiro Yamada */ 23*05a21721SMasahiro Yamada static uint32_t frzctrl_channel_freeze[FREEZE_CHANNEL_NUM] 24*05a21721SMasahiro Yamada = { FREEZE_CTRL_FROZEN, FREEZE_CTRL_FROZEN, 25*05a21721SMasahiro Yamada FREEZE_CTRL_FROZEN, FREEZE_CTRL_FROZEN}; 26*05a21721SMasahiro Yamada 27*05a21721SMasahiro Yamada /* Freeze HPS IOs */ 28*05a21721SMasahiro Yamada void sys_mgr_frzctrl_freeze_req(void) 29*05a21721SMasahiro Yamada { 30*05a21721SMasahiro Yamada u32 ioctrl_reg_offset; 31*05a21721SMasahiro Yamada u32 reg_value; 32*05a21721SMasahiro Yamada u32 reg_cfg_mask; 33*05a21721SMasahiro Yamada u32 channel_id; 34*05a21721SMasahiro Yamada 35*05a21721SMasahiro Yamada /* select software FSM */ 36*05a21721SMasahiro Yamada writel(SYSMGR_FRZCTRL_SRC_VIO1_ENUM_SW, &freeze_controller_base->src); 37*05a21721SMasahiro Yamada 38*05a21721SMasahiro Yamada /* Freeze channel 0 to 2 */ 39*05a21721SMasahiro Yamada for (channel_id = 0; channel_id <= 2; channel_id++) { 40*05a21721SMasahiro Yamada ioctrl_reg_offset = (u32)( 41*05a21721SMasahiro Yamada &freeze_controller_base->vioctrl + channel_id); 42*05a21721SMasahiro Yamada 43*05a21721SMasahiro Yamada /* 44*05a21721SMasahiro Yamada * Assert active low enrnsl, plniotri 45*05a21721SMasahiro Yamada * and niotri signals 46*05a21721SMasahiro Yamada */ 47*05a21721SMasahiro Yamada reg_cfg_mask = 48*05a21721SMasahiro Yamada SYSMGR_FRZCTRL_VIOCTRL_SLEW_MASK 49*05a21721SMasahiro Yamada | SYSMGR_FRZCTRL_VIOCTRL_WKPULLUP_MASK 50*05a21721SMasahiro Yamada | SYSMGR_FRZCTRL_VIOCTRL_TRISTATE_MASK; 51*05a21721SMasahiro Yamada clrbits_le32(ioctrl_reg_offset, reg_cfg_mask); 52*05a21721SMasahiro Yamada 53*05a21721SMasahiro Yamada /* 54*05a21721SMasahiro Yamada * Note: Delay for 20ns at min 55*05a21721SMasahiro Yamada * Assert active low bhniotri signal and de-assert 56*05a21721SMasahiro Yamada * active high csrdone 57*05a21721SMasahiro Yamada */ 58*05a21721SMasahiro Yamada reg_cfg_mask 59*05a21721SMasahiro Yamada = SYSMGR_FRZCTRL_VIOCTRL_BUSHOLD_MASK 60*05a21721SMasahiro Yamada | SYSMGR_FRZCTRL_VIOCTRL_CFG_MASK; 61*05a21721SMasahiro Yamada clrbits_le32(ioctrl_reg_offset, reg_cfg_mask); 62*05a21721SMasahiro Yamada 63*05a21721SMasahiro Yamada /* Set global flag to indicate channel is frozen */ 64*05a21721SMasahiro Yamada frzctrl_channel_freeze[channel_id] = FREEZE_CTRL_FROZEN; 65*05a21721SMasahiro Yamada } 66*05a21721SMasahiro Yamada 67*05a21721SMasahiro Yamada /* Freeze channel 3 */ 68*05a21721SMasahiro Yamada /* 69*05a21721SMasahiro Yamada * Assert active low enrnsl, plniotri and 70*05a21721SMasahiro Yamada * niotri signals 71*05a21721SMasahiro Yamada */ 72*05a21721SMasahiro Yamada reg_cfg_mask 73*05a21721SMasahiro Yamada = SYSMGR_FRZCTRL_HIOCTRL_SLEW_MASK 74*05a21721SMasahiro Yamada | SYSMGR_FRZCTRL_HIOCTRL_WKPULLUP_MASK 75*05a21721SMasahiro Yamada | SYSMGR_FRZCTRL_HIOCTRL_TRISTATE_MASK; 76*05a21721SMasahiro Yamada clrbits_le32(&freeze_controller_base->hioctrl, reg_cfg_mask); 77*05a21721SMasahiro Yamada 78*05a21721SMasahiro Yamada /* 79*05a21721SMasahiro Yamada * assert active low bhniotri & nfrzdrv signals, 80*05a21721SMasahiro Yamada * de-assert active high csrdone and assert 81*05a21721SMasahiro Yamada * active high frzreg and nfrzdrv signals 82*05a21721SMasahiro Yamada */ 83*05a21721SMasahiro Yamada reg_value = readl(&freeze_controller_base->hioctrl); 84*05a21721SMasahiro Yamada reg_cfg_mask 85*05a21721SMasahiro Yamada = SYSMGR_FRZCTRL_HIOCTRL_BUSHOLD_MASK 86*05a21721SMasahiro Yamada | SYSMGR_FRZCTRL_HIOCTRL_CFG_MASK; 87*05a21721SMasahiro Yamada reg_value 88*05a21721SMasahiro Yamada = (reg_value & ~reg_cfg_mask) 89*05a21721SMasahiro Yamada | SYSMGR_FRZCTRL_HIOCTRL_REGRST_MASK 90*05a21721SMasahiro Yamada | SYSMGR_FRZCTRL_HIOCTRL_OCTRST_MASK; 91*05a21721SMasahiro Yamada writel(reg_value, &freeze_controller_base->hioctrl); 92*05a21721SMasahiro Yamada 93*05a21721SMasahiro Yamada /* 94*05a21721SMasahiro Yamada * assert active high reinit signal and de-assert 95*05a21721SMasahiro Yamada * active high pllbiasen signals 96*05a21721SMasahiro Yamada */ 97*05a21721SMasahiro Yamada reg_value = readl(&freeze_controller_base->hioctrl); 98*05a21721SMasahiro Yamada reg_value 99*05a21721SMasahiro Yamada = (reg_value & 100*05a21721SMasahiro Yamada ~SYSMGR_FRZCTRL_HIOCTRL_OCT_CFGEN_CALSTART_MASK) 101*05a21721SMasahiro Yamada | SYSMGR_FRZCTRL_HIOCTRL_DLLRST_MASK; 102*05a21721SMasahiro Yamada writel(reg_value, &freeze_controller_base->hioctrl); 103*05a21721SMasahiro Yamada 104*05a21721SMasahiro Yamada /* Set global flag to indicate channel is frozen */ 105*05a21721SMasahiro Yamada frzctrl_channel_freeze[channel_id] = FREEZE_CTRL_FROZEN; 106*05a21721SMasahiro Yamada } 107*05a21721SMasahiro Yamada 108*05a21721SMasahiro Yamada /* Unfreeze/Thaw HPS IOs */ 109*05a21721SMasahiro Yamada void sys_mgr_frzctrl_thaw_req(void) 110*05a21721SMasahiro Yamada { 111*05a21721SMasahiro Yamada u32 ioctrl_reg_offset; 112*05a21721SMasahiro Yamada u32 reg_cfg_mask; 113*05a21721SMasahiro Yamada u32 reg_value; 114*05a21721SMasahiro Yamada u32 channel_id; 115*05a21721SMasahiro Yamada 116*05a21721SMasahiro Yamada /* select software FSM */ 117*05a21721SMasahiro Yamada writel(SYSMGR_FRZCTRL_SRC_VIO1_ENUM_SW, &freeze_controller_base->src); 118*05a21721SMasahiro Yamada 119*05a21721SMasahiro Yamada /* Thaw channel 0 to 2 */ 120*05a21721SMasahiro Yamada for (channel_id = 0; channel_id <= 2; channel_id++) { 121*05a21721SMasahiro Yamada ioctrl_reg_offset 122*05a21721SMasahiro Yamada = (u32)(&freeze_controller_base->vioctrl + channel_id); 123*05a21721SMasahiro Yamada 124*05a21721SMasahiro Yamada /* 125*05a21721SMasahiro Yamada * Assert active low bhniotri signal and 126*05a21721SMasahiro Yamada * de-assert active high csrdone 127*05a21721SMasahiro Yamada */ 128*05a21721SMasahiro Yamada reg_cfg_mask 129*05a21721SMasahiro Yamada = SYSMGR_FRZCTRL_VIOCTRL_BUSHOLD_MASK 130*05a21721SMasahiro Yamada | SYSMGR_FRZCTRL_VIOCTRL_CFG_MASK; 131*05a21721SMasahiro Yamada setbits_le32(ioctrl_reg_offset, reg_cfg_mask); 132*05a21721SMasahiro Yamada 133*05a21721SMasahiro Yamada /* 134*05a21721SMasahiro Yamada * Note: Delay for 20ns at min 135*05a21721SMasahiro Yamada * de-assert active low plniotri and niotri signals 136*05a21721SMasahiro Yamada */ 137*05a21721SMasahiro Yamada reg_cfg_mask 138*05a21721SMasahiro Yamada = SYSMGR_FRZCTRL_VIOCTRL_WKPULLUP_MASK 139*05a21721SMasahiro Yamada | SYSMGR_FRZCTRL_VIOCTRL_TRISTATE_MASK; 140*05a21721SMasahiro Yamada setbits_le32(ioctrl_reg_offset, reg_cfg_mask); 141*05a21721SMasahiro Yamada 142*05a21721SMasahiro Yamada /* 143*05a21721SMasahiro Yamada * Note: Delay for 20ns at min 144*05a21721SMasahiro Yamada * de-assert active low enrnsl signal 145*05a21721SMasahiro Yamada */ 146*05a21721SMasahiro Yamada setbits_le32(ioctrl_reg_offset, 147*05a21721SMasahiro Yamada SYSMGR_FRZCTRL_VIOCTRL_SLEW_MASK); 148*05a21721SMasahiro Yamada 149*05a21721SMasahiro Yamada /* Set global flag to indicate channel is thawed */ 150*05a21721SMasahiro Yamada frzctrl_channel_freeze[channel_id] = FREEZE_CTRL_THAWED; 151*05a21721SMasahiro Yamada } 152*05a21721SMasahiro Yamada 153*05a21721SMasahiro Yamada /* Thaw channel 3 */ 154*05a21721SMasahiro Yamada /* de-assert active high reinit signal */ 155*05a21721SMasahiro Yamada clrbits_le32(&freeze_controller_base->hioctrl, 156*05a21721SMasahiro Yamada SYSMGR_FRZCTRL_HIOCTRL_DLLRST_MASK); 157*05a21721SMasahiro Yamada 158*05a21721SMasahiro Yamada /* 159*05a21721SMasahiro Yamada * Note: Delay for 40ns at min 160*05a21721SMasahiro Yamada * assert active high pllbiasen signals 161*05a21721SMasahiro Yamada */ 162*05a21721SMasahiro Yamada setbits_le32(&freeze_controller_base->hioctrl, 163*05a21721SMasahiro Yamada SYSMGR_FRZCTRL_HIOCTRL_OCT_CFGEN_CALSTART_MASK); 164*05a21721SMasahiro Yamada 165*05a21721SMasahiro Yamada /* 166*05a21721SMasahiro Yamada * Delay 1000 intosc. intosc is based on eosc1 167*05a21721SMasahiro Yamada * Use worst case which is fatest eosc1=50MHz, delay required 168*05a21721SMasahiro Yamada * is 1/50MHz * 1000 = 20us 169*05a21721SMasahiro Yamada */ 170*05a21721SMasahiro Yamada udelay(20); 171*05a21721SMasahiro Yamada 172*05a21721SMasahiro Yamada /* 173*05a21721SMasahiro Yamada * de-assert active low bhniotri signals, 174*05a21721SMasahiro Yamada * assert active high csrdone and nfrzdrv signal 175*05a21721SMasahiro Yamada */ 176*05a21721SMasahiro Yamada reg_value = readl(&freeze_controller_base->hioctrl); 177*05a21721SMasahiro Yamada reg_value = (reg_value 178*05a21721SMasahiro Yamada | SYSMGR_FRZCTRL_HIOCTRL_BUSHOLD_MASK 179*05a21721SMasahiro Yamada | SYSMGR_FRZCTRL_HIOCTRL_CFG_MASK) 180*05a21721SMasahiro Yamada & ~SYSMGR_FRZCTRL_HIOCTRL_OCTRST_MASK; 181*05a21721SMasahiro Yamada writel(reg_value, &freeze_controller_base->hioctrl); 182*05a21721SMasahiro Yamada 183*05a21721SMasahiro Yamada /* 184*05a21721SMasahiro Yamada * Delay 33 intosc 185*05a21721SMasahiro Yamada * Use worst case which is fatest eosc1=50MHz, delay required 186*05a21721SMasahiro Yamada * is 1/50MHz * 33 = 660ns ~= 1us 187*05a21721SMasahiro Yamada */ 188*05a21721SMasahiro Yamada udelay(1); 189*05a21721SMasahiro Yamada 190*05a21721SMasahiro Yamada /* de-assert active low plniotri and niotri signals */ 191*05a21721SMasahiro Yamada reg_cfg_mask 192*05a21721SMasahiro Yamada = SYSMGR_FRZCTRL_HIOCTRL_WKPULLUP_MASK 193*05a21721SMasahiro Yamada | SYSMGR_FRZCTRL_HIOCTRL_TRISTATE_MASK; 194*05a21721SMasahiro Yamada 195*05a21721SMasahiro Yamada setbits_le32(&freeze_controller_base->hioctrl, reg_cfg_mask); 196*05a21721SMasahiro Yamada 197*05a21721SMasahiro Yamada /* 198*05a21721SMasahiro Yamada * Note: Delay for 40ns at min 199*05a21721SMasahiro Yamada * de-assert active high frzreg signal 200*05a21721SMasahiro Yamada */ 201*05a21721SMasahiro Yamada clrbits_le32(&freeze_controller_base->hioctrl, 202*05a21721SMasahiro Yamada SYSMGR_FRZCTRL_HIOCTRL_REGRST_MASK); 203*05a21721SMasahiro Yamada 204*05a21721SMasahiro Yamada /* 205*05a21721SMasahiro Yamada * Note: Delay for 40ns at min 206*05a21721SMasahiro Yamada * de-assert active low enrnsl signal 207*05a21721SMasahiro Yamada */ 208*05a21721SMasahiro Yamada setbits_le32(&freeze_controller_base->hioctrl, 209*05a21721SMasahiro Yamada SYSMGR_FRZCTRL_HIOCTRL_SLEW_MASK); 210*05a21721SMasahiro Yamada 211*05a21721SMasahiro Yamada /* Set global flag to indicate channel is thawed */ 212*05a21721SMasahiro Yamada frzctrl_channel_freeze[channel_id] = FREEZE_CTRL_THAWED; 213*05a21721SMasahiro Yamada } 214