freeze_controller.c 5.6 KB

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