dcgu.c 5.5 KB

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