freeze_controller.c 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  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/clock_manager.h>
  9. #include <asm/arch/freeze_controller.h>
  10. #include <linux/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. unsigned long eosc1_freq;
  100. /* select software FSM */
  101. writel(SYSMGR_FRZCTRL_SRC_VIO1_ENUM_SW, &freeze_controller_base->src);
  102. /* Thaw channel 0 to 2 */
  103. for (channel_id = 0; channel_id <= 2; channel_id++) {
  104. ioctrl_reg_offset
  105. = (u32)(&freeze_controller_base->vioctrl + channel_id);
  106. /*
  107. * Assert active low bhniotri signal and
  108. * de-assert active high csrdone
  109. */
  110. reg_cfg_mask
  111. = SYSMGR_FRZCTRL_VIOCTRL_BUSHOLD_MASK
  112. | SYSMGR_FRZCTRL_VIOCTRL_CFG_MASK;
  113. setbits_le32(ioctrl_reg_offset, reg_cfg_mask);
  114. /*
  115. * Note: Delay for 20ns at min
  116. * de-assert active low plniotri and niotri signals
  117. */
  118. reg_cfg_mask
  119. = SYSMGR_FRZCTRL_VIOCTRL_WKPULLUP_MASK
  120. | SYSMGR_FRZCTRL_VIOCTRL_TRISTATE_MASK;
  121. setbits_le32(ioctrl_reg_offset, reg_cfg_mask);
  122. /*
  123. * Note: Delay for 20ns at min
  124. * de-assert active low enrnsl signal
  125. */
  126. setbits_le32(ioctrl_reg_offset,
  127. SYSMGR_FRZCTRL_VIOCTRL_SLEW_MASK);
  128. /* Set global flag to indicate channel is thawed */
  129. frzctrl_channel_freeze[channel_id] = FREEZE_CTRL_THAWED;
  130. }
  131. /* Thaw channel 3 */
  132. /* de-assert active high reinit signal */
  133. clrbits_le32(&freeze_controller_base->hioctrl,
  134. SYSMGR_FRZCTRL_HIOCTRL_DLLRST_MASK);
  135. /*
  136. * Note: Delay for 40ns at min
  137. * assert active high pllbiasen signals
  138. */
  139. setbits_le32(&freeze_controller_base->hioctrl,
  140. SYSMGR_FRZCTRL_HIOCTRL_OCT_CFGEN_CALSTART_MASK);
  141. /* Delay 1000 intosc cycles. The intosc is based on eosc1. */
  142. eosc1_freq = cm_get_osc_clk_hz(1) / 1000; /* kHz */
  143. udelay(DIV_ROUND_UP(1000000, eosc1_freq));
  144. /*
  145. * de-assert active low bhniotri signals,
  146. * assert active high csrdone and nfrzdrv signal
  147. */
  148. reg_value = readl(&freeze_controller_base->hioctrl);
  149. reg_value = (reg_value
  150. | SYSMGR_FRZCTRL_HIOCTRL_BUSHOLD_MASK
  151. | SYSMGR_FRZCTRL_HIOCTRL_CFG_MASK)
  152. & ~SYSMGR_FRZCTRL_HIOCTRL_OCTRST_MASK;
  153. writel(reg_value, &freeze_controller_base->hioctrl);
  154. /*
  155. * Delay 33 intosc
  156. * Use worst case which is fatest eosc1=50MHz, delay required
  157. * is 1/50MHz * 33 = 660ns ~= 1us
  158. */
  159. udelay(1);
  160. /* de-assert active low plniotri and niotri signals */
  161. reg_cfg_mask
  162. = SYSMGR_FRZCTRL_HIOCTRL_WKPULLUP_MASK
  163. | SYSMGR_FRZCTRL_HIOCTRL_TRISTATE_MASK;
  164. setbits_le32(&freeze_controller_base->hioctrl, reg_cfg_mask);
  165. /*
  166. * Note: Delay for 40ns at min
  167. * de-assert active high frzreg signal
  168. */
  169. clrbits_le32(&freeze_controller_base->hioctrl,
  170. SYSMGR_FRZCTRL_HIOCTRL_REGRST_MASK);
  171. /*
  172. * Note: Delay for 40ns at min
  173. * de-assert active low enrnsl signal
  174. */
  175. setbits_le32(&freeze_controller_base->hioctrl,
  176. SYSMGR_FRZCTRL_HIOCTRL_SLEW_MASK);
  177. /* Set global flag to indicate channel is thawed */
  178. frzctrl_channel_freeze[channel_id] = FREEZE_CTRL_THAWED;
  179. }