fsl_epu.c 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  1. // SPDX-License-Identifier: GPL-2.0+
  2. /*
  3. * Copyright 2014 Freescale Semiconductor, Inc.
  4. */
  5. #include <common.h>
  6. #include <asm/io.h>
  7. #include "fsl_epu.h"
  8. struct fsm_reg_vals epu_default_val[] = {
  9. /* EPGCR (Event Processor Global Control Register) */
  10. {EPGCR, 0},
  11. /* EPECR (Event Processor Event Control Registers) */
  12. {EPECR0 + EPECR_STRIDE * 0, 0},
  13. {EPECR0 + EPECR_STRIDE * 1, 0},
  14. {EPECR0 + EPECR_STRIDE * 2, 0xF0004004},
  15. {EPECR0 + EPECR_STRIDE * 3, 0x80000084},
  16. {EPECR0 + EPECR_STRIDE * 4, 0x20000084},
  17. {EPECR0 + EPECR_STRIDE * 5, 0x08000004},
  18. {EPECR0 + EPECR_STRIDE * 6, 0x80000084},
  19. {EPECR0 + EPECR_STRIDE * 7, 0x80000084},
  20. {EPECR0 + EPECR_STRIDE * 8, 0x60000084},
  21. {EPECR0 + EPECR_STRIDE * 9, 0x08000084},
  22. {EPECR0 + EPECR_STRIDE * 10, 0x42000084},
  23. {EPECR0 + EPECR_STRIDE * 11, 0x90000084},
  24. {EPECR0 + EPECR_STRIDE * 12, 0x80000084},
  25. {EPECR0 + EPECR_STRIDE * 13, 0x08000084},
  26. {EPECR0 + EPECR_STRIDE * 14, 0x02000084},
  27. {EPECR0 + EPECR_STRIDE * 15, 0x00000004},
  28. /*
  29. * EPEVTCR (Event Processor EVT Pin Control Registers)
  30. * SCU8 triger EVT2, and SCU11 triger EVT9
  31. */
  32. {EPEVTCR0 + EPEVTCR_STRIDE * 0, 0},
  33. {EPEVTCR0 + EPEVTCR_STRIDE * 1, 0},
  34. {EPEVTCR0 + EPEVTCR_STRIDE * 2, 0x80000001},
  35. {EPEVTCR0 + EPEVTCR_STRIDE * 3, 0},
  36. {EPEVTCR0 + EPEVTCR_STRIDE * 4, 0},
  37. {EPEVTCR0 + EPEVTCR_STRIDE * 5, 0},
  38. {EPEVTCR0 + EPEVTCR_STRIDE * 6, 0},
  39. {EPEVTCR0 + EPEVTCR_STRIDE * 7, 0},
  40. {EPEVTCR0 + EPEVTCR_STRIDE * 8, 0},
  41. {EPEVTCR0 + EPEVTCR_STRIDE * 9, 0xB0000001},
  42. /* EPCMPR (Event Processor Counter Compare Registers) */
  43. {EPCMPR0 + EPCMPR_STRIDE * 0, 0},
  44. {EPCMPR0 + EPCMPR_STRIDE * 1, 0},
  45. {EPCMPR0 + EPCMPR_STRIDE * 2, 0x000000FF},
  46. {EPCMPR0 + EPCMPR_STRIDE * 3, 0},
  47. {EPCMPR0 + EPCMPR_STRIDE * 4, 0x000000FF},
  48. {EPCMPR0 + EPCMPR_STRIDE * 5, 0x00000020},
  49. {EPCMPR0 + EPCMPR_STRIDE * 6, 0},
  50. {EPCMPR0 + EPCMPR_STRIDE * 7, 0},
  51. {EPCMPR0 + EPCMPR_STRIDE * 8, 0x000000FF},
  52. {EPCMPR0 + EPCMPR_STRIDE * 9, 0x000000FF},
  53. {EPCMPR0 + EPCMPR_STRIDE * 10, 0x000000FF},
  54. {EPCMPR0 + EPCMPR_STRIDE * 11, 0x000000FF},
  55. {EPCMPR0 + EPCMPR_STRIDE * 12, 0x000000FF},
  56. {EPCMPR0 + EPCMPR_STRIDE * 13, 0},
  57. {EPCMPR0 + EPCMPR_STRIDE * 14, 0x000000FF},
  58. {EPCMPR0 + EPCMPR_STRIDE * 15, 0x000000FF},
  59. /* EPCCR (Event Processor Counter Control Registers) */
  60. {EPCCR0 + EPCCR_STRIDE * 0, 0},
  61. {EPCCR0 + EPCCR_STRIDE * 1, 0},
  62. {EPCCR0 + EPCCR_STRIDE * 2, 0x92840000},
  63. {EPCCR0 + EPCCR_STRIDE * 3, 0},
  64. {EPCCR0 + EPCCR_STRIDE * 4, 0x92840000},
  65. {EPCCR0 + EPCCR_STRIDE * 5, 0x92840000},
  66. {EPCCR0 + EPCCR_STRIDE * 6, 0},
  67. {EPCCR0 + EPCCR_STRIDE * 7, 0},
  68. {EPCCR0 + EPCCR_STRIDE * 8, 0x92840000},
  69. {EPCCR0 + EPCCR_STRIDE * 9, 0x92840000},
  70. {EPCCR0 + EPCCR_STRIDE * 10, 0x92840000},
  71. {EPCCR0 + EPCCR_STRIDE * 11, 0x92840000},
  72. {EPCCR0 + EPCCR_STRIDE * 12, 0x92840000},
  73. {EPCCR0 + EPCCR_STRIDE * 13, 0},
  74. {EPCCR0 + EPCCR_STRIDE * 14, 0x92840000},
  75. {EPCCR0 + EPCCR_STRIDE * 15, 0x92840000},
  76. /* EPSMCR (Event Processor SCU Mux Control Registers) */
  77. {EPSMCR0 + EPSMCR_STRIDE * 0, 0},
  78. {EPSMCR0 + EPSMCR_STRIDE * 1, 0},
  79. {EPSMCR0 + EPSMCR_STRIDE * 2, 0x6C700000},
  80. {EPSMCR0 + EPSMCR_STRIDE * 3, 0x2F000000},
  81. {EPSMCR0 + EPSMCR_STRIDE * 4, 0x002F0000},
  82. {EPSMCR0 + EPSMCR_STRIDE * 5, 0x00002E00},
  83. {EPSMCR0 + EPSMCR_STRIDE * 6, 0x7C000000},
  84. {EPSMCR0 + EPSMCR_STRIDE * 7, 0x30000000},
  85. {EPSMCR0 + EPSMCR_STRIDE * 8, 0x64300000},
  86. {EPSMCR0 + EPSMCR_STRIDE * 9, 0x00003000},
  87. {EPSMCR0 + EPSMCR_STRIDE * 10, 0x65000030},
  88. {EPSMCR0 + EPSMCR_STRIDE * 11, 0x31740000},
  89. {EPSMCR0 + EPSMCR_STRIDE * 12, 0x7F000000},
  90. {EPSMCR0 + EPSMCR_STRIDE * 13, 0x00003100},
  91. {EPSMCR0 + EPSMCR_STRIDE * 14, 0x00000031},
  92. {EPSMCR0 + EPSMCR_STRIDE * 15, 0x76000000},
  93. /* EPACR (Event Processor Action Control Registers) */
  94. {EPACR0 + EPACR_STRIDE * 0, 0},
  95. {EPACR0 + EPACR_STRIDE * 1, 0},
  96. {EPACR0 + EPACR_STRIDE * 2, 0},
  97. {EPACR0 + EPACR_STRIDE * 3, 0x00000080},
  98. {EPACR0 + EPACR_STRIDE * 4, 0},
  99. {EPACR0 + EPACR_STRIDE * 5, 0x00000040},
  100. {EPACR0 + EPACR_STRIDE * 6, 0},
  101. {EPACR0 + EPACR_STRIDE * 7, 0},
  102. {EPACR0 + EPACR_STRIDE * 8, 0},
  103. {EPACR0 + EPACR_STRIDE * 9, 0x0000001C},
  104. {EPACR0 + EPACR_STRIDE * 10, 0x00000020},
  105. {EPACR0 + EPACR_STRIDE * 11, 0},
  106. {EPACR0 + EPACR_STRIDE * 12, 0x00000003},
  107. {EPACR0 + EPACR_STRIDE * 13, 0x06000000},
  108. {EPACR0 + EPACR_STRIDE * 14, 0x04000000},
  109. {EPACR0 + EPACR_STRIDE * 15, 0x02000000},
  110. /* EPIMCR (Event Processor Input Mux Control Registers) */
  111. {EPIMCR0 + EPIMCR_STRIDE * 0, 0},
  112. {EPIMCR0 + EPIMCR_STRIDE * 1, 0},
  113. {EPIMCR0 + EPIMCR_STRIDE * 2, 0},
  114. {EPIMCR0 + EPIMCR_STRIDE * 3, 0},
  115. {EPIMCR0 + EPIMCR_STRIDE * 4, 0x44000000},
  116. {EPIMCR0 + EPIMCR_STRIDE * 5, 0x40000000},
  117. {EPIMCR0 + EPIMCR_STRIDE * 6, 0},
  118. {EPIMCR0 + EPIMCR_STRIDE * 7, 0},
  119. {EPIMCR0 + EPIMCR_STRIDE * 8, 0},
  120. {EPIMCR0 + EPIMCR_STRIDE * 9, 0},
  121. {EPIMCR0 + EPIMCR_STRIDE * 10, 0},
  122. {EPIMCR0 + EPIMCR_STRIDE * 11, 0},
  123. {EPIMCR0 + EPIMCR_STRIDE * 12, 0x44000000},
  124. {EPIMCR0 + EPIMCR_STRIDE * 13, 0},
  125. {EPIMCR0 + EPIMCR_STRIDE * 14, 0},
  126. {EPIMCR0 + EPIMCR_STRIDE * 15, 0},
  127. {EPIMCR0 + EPIMCR_STRIDE * 16, 0x6A000000},
  128. {EPIMCR0 + EPIMCR_STRIDE * 17, 0},
  129. {EPIMCR0 + EPIMCR_STRIDE * 18, 0},
  130. {EPIMCR0 + EPIMCR_STRIDE * 19, 0},
  131. {EPIMCR0 + EPIMCR_STRIDE * 20, 0x48000000},
  132. {EPIMCR0 + EPIMCR_STRIDE * 21, 0},
  133. {EPIMCR0 + EPIMCR_STRIDE * 22, 0x6C000000},
  134. {EPIMCR0 + EPIMCR_STRIDE * 23, 0},
  135. {EPIMCR0 + EPIMCR_STRIDE * 24, 0},
  136. {EPIMCR0 + EPIMCR_STRIDE * 25, 0},
  137. {EPIMCR0 + EPIMCR_STRIDE * 26, 0},
  138. {EPIMCR0 + EPIMCR_STRIDE * 27, 0},
  139. {EPIMCR0 + EPIMCR_STRIDE * 28, 0x76000000},
  140. {EPIMCR0 + EPIMCR_STRIDE * 29, 0},
  141. {EPIMCR0 + EPIMCR_STRIDE * 30, 0},
  142. {EPIMCR0 + EPIMCR_STRIDE * 31, 0x76000000},
  143. /* EPXTRIGCR (Event Processor Crosstrigger Control Register) */
  144. {EPXTRIGCR, 0x0000FFDF},
  145. /* end */
  146. {FSM_END_FLAG, 0},
  147. };
  148. /**
  149. * fsl_epu_setup - Setup EPU registers to default values
  150. */
  151. void fsl_epu_setup(void *epu_base)
  152. {
  153. struct fsm_reg_vals *data = epu_default_val;
  154. if (!epu_base || !data)
  155. return;
  156. while (data->offset != FSM_END_FLAG) {
  157. out_be32(epu_base + data->offset, data->value);
  158. data++;
  159. }
  160. }
  161. /**
  162. * fsl_epu_clean - Clear EPU registers
  163. */
  164. void fsl_epu_clean(void *epu_base)
  165. {
  166. u32 offset;
  167. /* follow the exact sequence to clear the registers */
  168. /* Clear EPACRn */
  169. for (offset = EPACR0; offset <= EPACR15; offset += EPACR_STRIDE)
  170. out_be32(epu_base + offset, 0);
  171. /* Clear EPEVTCRn */
  172. for (offset = EPEVTCR0; offset <= EPEVTCR9; offset += EPEVTCR_STRIDE)
  173. out_be32(epu_base + offset, 0);
  174. /* Clear EPGCR */
  175. out_be32(epu_base + EPGCR, 0);
  176. /* Clear EPSMCRn */
  177. for (offset = EPSMCR0; offset <= EPSMCR15; offset += EPSMCR_STRIDE)
  178. out_be32(epu_base + offset, 0);
  179. /* Clear EPCCRn */
  180. for (offset = EPCCR0; offset <= EPCCR31; offset += EPCCR_STRIDE)
  181. out_be32(epu_base + offset, 0);
  182. /* Clear EPCMPRn */
  183. for (offset = EPCMPR0; offset <= EPCMPR31; offset += EPCMPR_STRIDE)
  184. out_be32(epu_base + offset, 0);
  185. /* Clear EPCTRn */
  186. for (offset = EPCTR0; offset <= EPCTR31; offset += EPCTR_STRIDE)
  187. out_be32(epu_base + offset, 0);
  188. /* Clear EPIMCRn */
  189. for (offset = EPIMCR0; offset <= EPIMCR31; offset += EPIMCR_STRIDE)
  190. out_be32(epu_base + offset, 0);
  191. /* Clear EPXTRIGCRn */
  192. out_be32(epu_base + EPXTRIGCR, 0);
  193. /* Clear EPECRn */
  194. for (offset = EPECR0; offset <= EPECR15; offset += EPECR_STRIDE)
  195. out_be32(epu_base + offset, 0);
  196. }