reset_manager.c 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  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/reset_manager.h>
  9. #include <asm/arch/fpga_manager.h>
  10. DECLARE_GLOBAL_DATA_PTR;
  11. static const struct socfpga_reset_manager *reset_manager_base =
  12. (void *)SOCFPGA_RSTMGR_ADDRESS;
  13. /* Toggle reset signal to watchdog (WDT is disabled after this operation!) */
  14. void socfpga_watchdog_reset(void)
  15. {
  16. /* assert reset for watchdog */
  17. setbits_le32(&reset_manager_base->per_mod_reset,
  18. 1 << RSTMGR_PERMODRST_L4WD0_LSB);
  19. /* deassert watchdog from reset (watchdog in not running state) */
  20. clrbits_le32(&reset_manager_base->per_mod_reset,
  21. 1 << RSTMGR_PERMODRST_L4WD0_LSB);
  22. }
  23. /*
  24. * Write the reset manager register to cause reset
  25. */
  26. void reset_cpu(ulong addr)
  27. {
  28. /* request a warm reset */
  29. writel((1 << RSTMGR_CTRL_SWWARMRSTREQ_LSB),
  30. &reset_manager_base->ctrl);
  31. /*
  32. * infinite loop here as watchdog will trigger and reset
  33. * the processor
  34. */
  35. while (1)
  36. ;
  37. }
  38. /*
  39. * Release peripherals from reset based on handoff
  40. */
  41. void reset_deassert_peripherals_handoff(void)
  42. {
  43. writel(0, &reset_manager_base->per_mod_reset);
  44. }
  45. #if defined(CONFIG_SOCFPGA_VIRTUAL_TARGET)
  46. void socfpga_bridges_reset(int enable)
  47. {
  48. /* For SoCFPGA-VT, this is NOP. */
  49. }
  50. #else
  51. #define L3REGS_REMAP_LWHPS2FPGA_MASK 0x10
  52. #define L3REGS_REMAP_HPS2FPGA_MASK 0x08
  53. #define L3REGS_REMAP_OCRAM_MASK 0x01
  54. void socfpga_bridges_reset(int enable)
  55. {
  56. const uint32_t l3mask = L3REGS_REMAP_LWHPS2FPGA_MASK |
  57. L3REGS_REMAP_HPS2FPGA_MASK |
  58. L3REGS_REMAP_OCRAM_MASK;
  59. if (enable) {
  60. /* brdmodrst */
  61. writel(0xffffffff, &reset_manager_base->brg_mod_reset);
  62. } else {
  63. /* Check signal from FPGA. */
  64. if (fpgamgr_poll_fpga_ready()) {
  65. /* FPGA not ready. Wait for watchdog timeout. */
  66. printf("%s: fpga not ready, hanging.\n", __func__);
  67. hang();
  68. }
  69. /* brdmodrst */
  70. writel(0, &reset_manager_base->brg_mod_reset);
  71. /* Remap the bridges into memory map */
  72. writel(l3mask, SOCFPGA_L3REGS_ADDRESS);
  73. }
  74. }
  75. #endif
  76. /* Change the reset state for EMAC 0 and EMAC 1 */
  77. void socfpga_emac_reset(int enable)
  78. {
  79. const void *reset = &reset_manager_base->per_mod_reset;
  80. if (enable) {
  81. setbits_le32(reset, 1 << RSTMGR_PERMODRST_EMAC0_LSB);
  82. setbits_le32(reset, 1 << RSTMGR_PERMODRST_EMAC1_LSB);
  83. } else {
  84. #if (CONFIG_EMAC_BASE == SOCFPGA_EMAC0_ADDRESS)
  85. clrbits_le32(reset, 1 << RSTMGR_PERMODRST_EMAC0_LSB);
  86. #elif (CONFIG_EMAC_BASE == SOCFPGA_EMAC1_ADDRESS)
  87. clrbits_le32(reset, 1 << RSTMGR_PERMODRST_EMAC1_LSB);
  88. #endif
  89. }
  90. }
  91. /* SPI Master enable (its held in reset by the preloader) */
  92. void socfpga_spim_enable(void)
  93. {
  94. const void *reset = &reset_manager_base->per_mod_reset;
  95. clrbits_le32(reset, (1 << RSTMGR_PERMODRST_SPIM0_LSB) |
  96. (1 << RSTMGR_PERMODRST_SPIM1_LSB));
  97. }
  98. /* Bring UART0 out of reset. */
  99. void socfpga_uart0_enable(void)
  100. {
  101. const void *reset = &reset_manager_base->per_mod_reset;
  102. clrbits_le32(reset, 1 << RSTMGR_PERMODRST_UART0_LSB);
  103. }
  104. /* Bring SDRAM controller out of reset. */
  105. void socfpga_sdram_enable(void)
  106. {
  107. const void *reset = &reset_manager_base->per_mod_reset;
  108. clrbits_le32(reset, 1 << RSTMGR_PERMODRST_SDR_LSB);
  109. }
  110. /* Bring OSC1 timer out of reset. */
  111. void socfpga_osc1timer_enable(void)
  112. {
  113. const void *reset = &reset_manager_base->per_mod_reset;
  114. clrbits_le32(reset, 1 << RSTMGR_PERMODRST_OSC1TIMER0_LSB);
  115. }