dcgu.c 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244
  1. // SPDX-License-Identifier: GPL-2.0+
  2. /*
  3. * (C) Copyright 2009 Stefan Roese <sr@denx.de>, DENX Software Engineering
  4. *
  5. * Original Author Guenter Gebhardt
  6. * Copyright (C) 2006 Micronas GmbH
  7. */
  8. #include <common.h>
  9. #include <linux/errno.h>
  10. #include "vct.h"
  11. int dcgu_set_clk_switch(enum dcgu_hw_module module, enum dcgu_switch setup)
  12. {
  13. u32 enable;
  14. union dcgu_clk_en1 en1;
  15. union dcgu_clk_en2 en2;
  16. switch (setup) {
  17. case DCGU_SWITCH_ON:
  18. enable = 1;
  19. break;
  20. case DCGU_SWITCH_OFF:
  21. enable = 0;
  22. break;
  23. default:
  24. printf("%s:%i:Invalid clock switch: %i\n", __FILE__, __LINE__,
  25. setup);
  26. return -EINVAL;
  27. }
  28. if (module == DCGU_HW_MODULE_CPU)
  29. en2.reg = reg_read(DCGU_CLK_EN2(DCGU_BASE));
  30. else
  31. en1.reg = reg_read(DCGU_CLK_EN1(DCGU_BASE));
  32. switch (module) {
  33. case DCGU_HW_MODULE_MSMC:
  34. en1.bits.en_clkmsmc = enable;
  35. break;
  36. case DCGU_HW_MODULE_SSI_S:
  37. en1.bits.en_clkssi_s = enable;
  38. break;
  39. case DCGU_HW_MODULE_SSI_M:
  40. en1.bits.en_clkssi_m = enable;
  41. break;
  42. case DCGU_HW_MODULE_SMC:
  43. en1.bits.en_clksmc = enable;
  44. break;
  45. case DCGU_HW_MODULE_EBI:
  46. en1.bits.en_clkebi = enable;
  47. break;
  48. case DCGU_HW_MODULE_USB_PLL:
  49. en1.bits.en_usbpll = enable;
  50. break;
  51. case DCGU_HW_MODULE_USB_60:
  52. en1.bits.en_clkusb60 = enable;
  53. break;
  54. case DCGU_HW_MODULE_USB_24:
  55. en1.bits.en_clkusb24 = enable;
  56. break;
  57. case DCGU_HW_MODULE_UART_2:
  58. en1.bits.en_clkuart2 = enable;
  59. break;
  60. case DCGU_HW_MODULE_UART_1:
  61. en1.bits.en_clkuart1 = enable;
  62. break;
  63. case DCGU_HW_MODULE_PERI:
  64. en1.bits.en_clkperi20 = enable;
  65. break;
  66. case DCGU_HW_MODULE_CPU:
  67. en2.bits.en_clkcpu = enable;
  68. break;
  69. case DCGU_HW_MODULE_I2S:
  70. en1.bits.en_clk_i2s_dly = enable;
  71. break;
  72. case DCGU_HW_MODULE_ABP_SCC:
  73. en1.bits.en_clk_scc_abp = enable;
  74. break;
  75. case DCGU_HW_MODULE_SPDIF:
  76. en1.bits.en_clk_dtv_spdo = enable;
  77. break;
  78. case DCGU_HW_MODULE_AD:
  79. en1.bits.en_clkad = enable;
  80. break;
  81. case DCGU_HW_MODULE_MVD:
  82. en1.bits.en_clkmvd = enable;
  83. break;
  84. case DCGU_HW_MODULE_TSD:
  85. en1.bits.en_clktsd = enable;
  86. break;
  87. case DCGU_HW_MODULE_GA:
  88. en1.bits.en_clkga = enable;
  89. break;
  90. case DCGU_HW_MODULE_DVP:
  91. en1.bits.en_clkdvp = enable;
  92. break;
  93. case DCGU_HW_MODULE_MR2:
  94. en1.bits.en_clkmr2 = enable;
  95. break;
  96. case DCGU_HW_MODULE_MR1:
  97. en1.bits.en_clkmr1 = enable;
  98. break;
  99. default:
  100. printf("%s:%i:Invalid hardware module: %i\n", __FILE__,
  101. __LINE__, module);
  102. return -EINVAL;
  103. }
  104. /*
  105. * The reg_read() following the reg_write() below forces the write to
  106. * be really done on the bus.
  107. * Otherwise the clock may not be switched on when this API function
  108. * returns, which may cause an bus error if a registers of the hardware
  109. * module connected to the clock is accessed.
  110. */
  111. if (module == DCGU_HW_MODULE_CPU) {
  112. reg_write(DCGU_CLK_EN2(DCGU_BASE), en2.reg);
  113. en2.reg = reg_read(DCGU_CLK_EN2(DCGU_BASE));
  114. } else {
  115. reg_write(DCGU_CLK_EN1(DCGU_BASE), en1.reg);
  116. en1.reg = reg_read(DCGU_CLK_EN1(DCGU_BASE));
  117. }
  118. return 0;
  119. }
  120. int dcgu_set_reset_switch(enum dcgu_hw_module module, enum dcgu_switch setup)
  121. {
  122. union dcgu_reset_unit1 val;
  123. u32 enable;
  124. switch (setup) {
  125. case DCGU_SWITCH_ON:
  126. enable = 1;
  127. break;
  128. case DCGU_SWITCH_OFF:
  129. enable = 0;
  130. break;
  131. default:
  132. printf("%s:%i:Invalid reset switch: %i\n", __FILE__, __LINE__,
  133. setup);
  134. return -EINVAL;
  135. }
  136. val.reg = reg_read(DCGU_RESET_UNIT1(DCGU_BASE));
  137. switch (module) {
  138. case DCGU_HW_MODULE_MSMC:
  139. val.bits.swreset_clkmsmc = enable;
  140. break;
  141. case DCGU_HW_MODULE_SSI_S:
  142. val.bits.swreset_clkssi_s = enable;
  143. break;
  144. case DCGU_HW_MODULE_SSI_M:
  145. val.bits.swreset_clkssi_m = enable;
  146. break;
  147. case DCGU_HW_MODULE_SMC:
  148. val.bits.swreset_clksmc = enable;
  149. break;
  150. case DCGU_HW_MODULE_EBI:
  151. val.bits.swreset_clkebi = enable;
  152. break;
  153. case DCGU_HW_MODULE_USB_60:
  154. val.bits.swreset_clkusb60 = enable;
  155. break;
  156. case DCGU_HW_MODULE_USB_24:
  157. val.bits.swreset_clkusb24 = enable;
  158. break;
  159. case DCGU_HW_MODULE_UART_2:
  160. val.bits.swreset_clkuart2 = enable;
  161. break;
  162. case DCGU_HW_MODULE_UART_1:
  163. val.bits.swreset_clkuart1 = enable;
  164. break;
  165. case DCGU_HW_MODULE_PWM:
  166. val.bits.swreset_pwm = enable;
  167. break;
  168. case DCGU_HW_MODULE_GPT:
  169. val.bits.swreset_gpt = enable;
  170. break;
  171. case DCGU_HW_MODULE_I2C2:
  172. val.bits.swreset_i2c2 = enable;
  173. break;
  174. case DCGU_HW_MODULE_I2C1:
  175. val.bits.swreset_i2c1 = enable;
  176. break;
  177. case DCGU_HW_MODULE_GPIO2:
  178. val.bits.swreset_gpio2 = enable;
  179. break;
  180. case DCGU_HW_MODULE_GPIO1:
  181. val.bits.swreset_gpio1 = enable;
  182. break;
  183. case DCGU_HW_MODULE_CPU:
  184. val.bits.swreset_clkcpu = enable;
  185. break;
  186. case DCGU_HW_MODULE_I2S:
  187. val.bits.swreset_clk_i2s_dly = enable;
  188. break;
  189. case DCGU_HW_MODULE_ABP_SCC:
  190. val.bits.swreset_clk_scc_abp = enable;
  191. break;
  192. case DCGU_HW_MODULE_SPDIF:
  193. val.bits.swreset_clk_dtv_spdo = enable;
  194. break;
  195. case DCGU_HW_MODULE_AD:
  196. val.bits.swreset_clkad = enable;
  197. break;
  198. case DCGU_HW_MODULE_MVD:
  199. val.bits.swreset_clkmvd = enable;
  200. break;
  201. case DCGU_HW_MODULE_TSD:
  202. val.bits.swreset_clktsd = enable;
  203. break;
  204. case DCGU_HW_MODULE_TSIO:
  205. val.bits.swreset_clktsio = enable;
  206. break;
  207. case DCGU_HW_MODULE_GA:
  208. val.bits.swreset_clkga = enable;
  209. break;
  210. case DCGU_HW_MODULE_MPC:
  211. val.bits.swreset_clkmpc = enable;
  212. break;
  213. case DCGU_HW_MODULE_CVE:
  214. val.bits.swreset_clkcve = enable;
  215. break;
  216. case DCGU_HW_MODULE_DVP:
  217. val.bits.swreset_clkdvp = enable;
  218. break;
  219. case DCGU_HW_MODULE_MR2:
  220. val.bits.swreset_clkmr2 = enable;
  221. break;
  222. case DCGU_HW_MODULE_MR1:
  223. val.bits.swreset_clkmr1 = enable;
  224. break;
  225. default:
  226. printf("%s:%i:Invalid hardware module: %i\n", __FILE__,
  227. __LINE__, module);
  228. return -EINVAL;
  229. }
  230. reg_write(DCGU_RESET_UNIT1(DCGU_BASE), val.reg);
  231. return 0;
  232. }