fsl_anatop_ai.c 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357
  1. /*
  2. * Copyright 2019 NXP
  3. * All rights reserved.
  4. *
  5. * SPDX-License-Identifier: BSD-3-Clause
  6. */
  7. #include "fsl_anatop_ai.h"
  8. /* Component ID definition, used by tools. */
  9. #ifndef FSL_COMPONENT_ID
  10. #define FSL_COMPONENT_ID "platform.drivers.anatop_ai"
  11. #endif
  12. uint32_t ANATOP_AI_Access(anatop_ai_itf_t itf, bool isWrite, anatop_ai_reg_t addr, uint32_t wdata)
  13. {
  14. uint32_t temp;
  15. uint32_t rdata;
  16. uint32_t pre_toggle_done;
  17. uint32_t toggle_done;
  18. switch (itf)
  19. {
  20. case kAI_Itf_Ldo:
  21. if (isWrite)
  22. {
  23. ANADIG_MISC->VDDSOC_AI_CTRL &= ~ANADIG_MISC_VDDSOC_AI_CTRL_VDDSOC_AIRWB_MASK;
  24. temp = ANADIG_MISC->VDDSOC_AI_CTRL;
  25. temp &= ~ANADIG_MISC_VDDSOC_AI_CTRL_VDDSOC_AI_ADDR_MASK;
  26. temp |= ((uint32_t)addr << ANADIG_MISC_VDDSOC_AI_CTRL_VDDSOC_AI_ADDR_SHIFT) &
  27. ANADIG_MISC_VDDSOC_AI_CTRL_VDDSOC_AI_ADDR_MASK;
  28. ANADIG_MISC->VDDSOC_AI_CTRL = temp;
  29. ANADIG_MISC->VDDSOC_AI_WDATA = wdata; /* write ai data */
  30. ANADIG_PMU->PMU_LDO_PLL ^= ANADIG_PMU_PMU_LDO_PLL_LDO_PLL_AI_TOGGLE_MASK; /* toggle */
  31. }
  32. else /* read */
  33. {
  34. temp = ANADIG_MISC->VDDSOC_AI_CTRL;
  35. temp &= ~ANADIG_MISC_VDDSOC_AI_CTRL_VDDSOC_AIRWB_MASK;
  36. temp |= (1UL << ANADIG_MISC_VDDSOC_AI_CTRL_VDDSOC_AIRWB_SHIFT) &
  37. ANADIG_MISC_VDDSOC_AI_CTRL_VDDSOC_AIRWB_MASK;
  38. ANADIG_MISC->VDDSOC_AI_CTRL = temp;
  39. temp = ANADIG_MISC->VDDSOC_AI_CTRL;
  40. temp &= ~ANADIG_MISC_VDDSOC_AI_CTRL_VDDSOC_AI_ADDR_MASK;
  41. temp |= ((uint32_t)addr << ANADIG_MISC_VDDSOC_AI_CTRL_VDDSOC_AI_ADDR_SHIFT) &
  42. ANADIG_MISC_VDDSOC_AI_CTRL_VDDSOC_AI_ADDR_MASK;
  43. ANADIG_MISC->VDDSOC_AI_CTRL = temp;
  44. ANADIG_PMU->PMU_LDO_PLL ^= ANADIG_PMU_PMU_LDO_PLL_LDO_PLL_AI_TOGGLE_MASK; /* toggle */
  45. rdata = ANADIG_MISC->VDDSOC_AI_RDATA; /* read data */
  46. return rdata;
  47. }
  48. break;
  49. case kAI_Itf_1g:
  50. if (isWrite)
  51. {
  52. pre_toggle_done =
  53. ANADIG_MISC->VDDSOC2PLL_AI_CTRL_1G &
  54. ANADIG_MISC_VDDSOC2PLL_AI_CTRL_1G_VDDSOC2PLL_AITOGGLE_DONE_1G_MASK; /* get pre_toggle_done */
  55. ANADIG_MISC->VDDSOC2PLL_AI_CTRL_1G &= ~ANADIG_MISC_VDDSOC2PLL_AI_CTRL_1G_VDDSOC2PLL_AIRWB_1G_MASK;
  56. temp = ANADIG_MISC->VDDSOC2PLL_AI_CTRL_1G;
  57. temp &= ~ANADIG_MISC_VDDSOC2PLL_AI_CTRL_1G_VDDSOC2PLL_AIADDR_1G_MASK;
  58. temp |= ((uint32_t)addr << ANADIG_MISC_VDDSOC2PLL_AI_CTRL_1G_VDDSOC2PLL_AIADDR_1G_SHIFT) &
  59. ANADIG_MISC_VDDSOC2PLL_AI_CTRL_1G_VDDSOC2PLL_AIADDR_1G_MASK;
  60. ANADIG_MISC->VDDSOC2PLL_AI_CTRL_1G = temp;
  61. ANADIG_MISC->VDDSOC2PLL_AI_WDATA_1G = wdata; /* write ai data */
  62. ANADIG_MISC->VDDSOC2PLL_AI_CTRL_1G ^=
  63. ANADIG_MISC_VDDSOC2PLL_AI_CTRL_1G_VDDSOC2PLL_AITOGGLE_1G_MASK; /* toggle */
  64. do
  65. {
  66. toggle_done =
  67. (ANADIG_MISC->VDDSOC2PLL_AI_CTRL_1G &
  68. ANADIG_MISC_VDDSOC2PLL_AI_CTRL_1G_VDDSOC2PLL_AITOGGLE_DONE_1G_MASK); /* wait toggle done
  69. toggle */
  70. } while (toggle_done == pre_toggle_done);
  71. }
  72. else
  73. {
  74. pre_toggle_done =
  75. (ANADIG_MISC->VDDSOC2PLL_AI_CTRL_1G &
  76. ANADIG_MISC_VDDSOC2PLL_AI_CTRL_1G_VDDSOC2PLL_AITOGGLE_DONE_1G_MASK); /* get pre_toggle_done */
  77. temp = ANADIG_MISC->VDDSOC2PLL_AI_CTRL_1G;
  78. temp &= ~ANADIG_MISC_VDDSOC2PLL_AI_CTRL_1G_VDDSOC2PLL_AIRWB_1G_MASK;
  79. temp |= (1UL << ANADIG_MISC_VDDSOC2PLL_AI_CTRL_1G_VDDSOC2PLL_AIRWB_1G_SHIFT) &
  80. ANADIG_MISC_VDDSOC2PLL_AI_CTRL_1G_VDDSOC2PLL_AIRWB_1G_MASK;
  81. ANADIG_MISC->VDDSOC2PLL_AI_CTRL_1G = temp;
  82. temp = ANADIG_MISC->VDDSOC2PLL_AI_CTRL_1G;
  83. temp &= ~ANADIG_MISC_VDDSOC2PLL_AI_CTRL_1G_VDDSOC2PLL_AIADDR_1G_MASK;
  84. temp |= ((uint32_t)addr << ANADIG_MISC_VDDSOC2PLL_AI_CTRL_1G_VDDSOC2PLL_AIADDR_1G_SHIFT) &
  85. ANADIG_MISC_VDDSOC2PLL_AI_CTRL_1G_VDDSOC2PLL_AIADDR_1G_MASK;
  86. ANADIG_MISC->VDDSOC2PLL_AI_CTRL_1G = temp;
  87. ANADIG_MISC->VDDSOC2PLL_AI_CTRL_1G ^=
  88. ANADIG_MISC_VDDSOC2PLL_AI_CTRL_1G_VDDSOC2PLL_AITOGGLE_1G_MASK; /* toggle */
  89. do
  90. {
  91. toggle_done =
  92. (ANADIG_MISC->VDDSOC2PLL_AI_CTRL_1G &
  93. ANADIG_MISC_VDDSOC2PLL_AI_CTRL_1G_VDDSOC2PLL_AITOGGLE_DONE_1G_MASK); /* wait toggle done
  94. toggle */
  95. } while (toggle_done == pre_toggle_done);
  96. rdata = ANADIG_MISC->VDDSOC2PLL_AI_RDATA_1G; /* read data */
  97. return rdata;
  98. }
  99. break;
  100. case kAI_Itf_Audio:
  101. if (isWrite)
  102. {
  103. pre_toggle_done =
  104. ANADIG_MISC->VDDSOC2PLL_AI_CTRL_AUDIO &
  105. ANADIG_MISC_VDDSOC2PLL_AI_CTRL_AUDIO_VDDSOC2PLL_AITOGGLE_DONE_AUDIO_MASK; /* get pre_toggle_done */
  106. ANADIG_MISC->VDDSOC2PLL_AI_CTRL_AUDIO &=
  107. ~ANADIG_MISC_VDDSOC2PLL_AI_CTRL_AUDIO_VDDSOC2PLL_AIRWB_AUDIO_MASK;
  108. temp = ANADIG_MISC->VDDSOC2PLL_AI_CTRL_AUDIO;
  109. temp &= ~ANADIG_MISC_VDDSOC2PLL_AI_CTRL_AUDIO_VDDSOC2PLL_AI_ADDR_AUDIO_MASK;
  110. temp |= ((uint32_t)addr << ANADIG_MISC_VDDSOC2PLL_AI_CTRL_AUDIO_VDDSOC2PLL_AI_ADDR_AUDIO_SHIFT) &
  111. ANADIG_MISC_VDDSOC2PLL_AI_CTRL_AUDIO_VDDSOC2PLL_AI_ADDR_AUDIO_MASK;
  112. ANADIG_MISC->VDDSOC2PLL_AI_CTRL_AUDIO = temp;
  113. ANADIG_MISC->VDDSOC2PLL_AI_WDATA_AUDIO = wdata; /* write ai data */
  114. ANADIG_MISC->VDDSOC2PLL_AI_CTRL_AUDIO ^=
  115. ANADIG_MISC_VDDSOC2PLL_AI_CTRL_AUDIO_VDDSOC2PLL_AITOGGLE_AUDIO_MASK; /* toggle */
  116. do
  117. {
  118. toggle_done =
  119. (ANADIG_MISC->VDDSOC2PLL_AI_CTRL_AUDIO &
  120. ANADIG_MISC_VDDSOC2PLL_AI_CTRL_AUDIO_VDDSOC2PLL_AITOGGLE_DONE_AUDIO_MASK); /* wait toggle done
  121. toggle */
  122. } while (toggle_done == pre_toggle_done);
  123. ANADIG_MISC->VDDSOC2PLL_AI_CTRL_AUDIO &=
  124. ~ANADIG_MISC_VDDSOC2PLL_AI_CTRL_AUDIO_VDDSOC2PLL_AIRWB_AUDIO_MASK;
  125. }
  126. else
  127. {
  128. pre_toggle_done =
  129. (ANADIG_MISC->VDDSOC2PLL_AI_CTRL_AUDIO &
  130. ANADIG_MISC_VDDSOC2PLL_AI_CTRL_AUDIO_VDDSOC2PLL_AITOGGLE_DONE_AUDIO_MASK); /* get pre_toggle_done
  131. */
  132. temp = ANADIG_MISC->VDDSOC2PLL_AI_CTRL_AUDIO;
  133. temp &= ~ANADIG_MISC_VDDSOC2PLL_AI_CTRL_AUDIO_VDDSOC2PLL_AIRWB_AUDIO_MASK;
  134. temp |= (1UL << ANADIG_MISC_VDDSOC2PLL_AI_CTRL_AUDIO_VDDSOC2PLL_AIRWB_AUDIO_SHIFT) &
  135. ANADIG_MISC_VDDSOC2PLL_AI_CTRL_AUDIO_VDDSOC2PLL_AIRWB_AUDIO_MASK;
  136. ANADIG_MISC->VDDSOC2PLL_AI_CTRL_AUDIO = temp;
  137. temp = ANADIG_MISC->VDDSOC2PLL_AI_CTRL_AUDIO;
  138. temp &= ~ANADIG_MISC_VDDSOC2PLL_AI_CTRL_AUDIO_VDDSOC2PLL_AI_ADDR_AUDIO_MASK;
  139. temp |= ((uint32_t)addr << ANADIG_MISC_VDDSOC2PLL_AI_CTRL_AUDIO_VDDSOC2PLL_AI_ADDR_AUDIO_SHIFT) &
  140. ANADIG_MISC_VDDSOC2PLL_AI_CTRL_AUDIO_VDDSOC2PLL_AI_ADDR_AUDIO_MASK;
  141. ANADIG_MISC->VDDSOC2PLL_AI_CTRL_AUDIO = temp;
  142. ANADIG_MISC->VDDSOC2PLL_AI_CTRL_AUDIO ^=
  143. ANADIG_MISC_VDDSOC2PLL_AI_CTRL_AUDIO_VDDSOC2PLL_AITOGGLE_AUDIO_MASK; /* toggle */
  144. do
  145. {
  146. toggle_done =
  147. ANADIG_MISC->VDDSOC2PLL_AI_CTRL_AUDIO &
  148. ANADIG_MISC_VDDSOC2PLL_AI_CTRL_AUDIO_VDDSOC2PLL_AITOGGLE_DONE_AUDIO_MASK; /* wait toggle done
  149. toggle */
  150. } while (toggle_done == pre_toggle_done);
  151. rdata = ANADIG_MISC->VDDSOC2PLL_AI_RDATA_AUDIO; /* read data */
  152. return rdata;
  153. }
  154. break;
  155. case kAI_Itf_Video:
  156. if (isWrite)
  157. {
  158. pre_toggle_done =
  159. ANADIG_MISC->VDDSOC2PLL_AI_CTRL_VIDEO &
  160. ANADIG_MISC_VDDSOC2PLL_AI_CTRL_VIDEO_VDDSOC2PLL_AITOGGLE_DONE_VIDEO_MASK; /* get pre_toggle_done */
  161. ANADIG_MISC->VDDSOC2PLL_AI_CTRL_VIDEO &=
  162. ~ANADIG_MISC_VDDSOC2PLL_AI_CTRL_VIDEO_VDDSOC2PLL_AIRWB_VIDEO_MASK;
  163. temp = ANADIG_MISC->VDDSOC2PLL_AI_CTRL_VIDEO;
  164. temp &= ~ANADIG_MISC_VDDSOC2PLL_AI_CTRL_VIDEO_VDDSOC2PLL_AIADDR_VIDEO_MASK;
  165. temp |= ((uint32_t)addr << ANADIG_MISC_VDDSOC2PLL_AI_CTRL_VIDEO_VDDSOC2PLL_AIADDR_VIDEO_SHIFT) &
  166. ANADIG_MISC_VDDSOC2PLL_AI_CTRL_VIDEO_VDDSOC2PLL_AIADDR_VIDEO_MASK;
  167. ANADIG_MISC->VDDSOC2PLL_AI_CTRL_VIDEO = temp;
  168. ANADIG_MISC->VDDSOC2PLL_AI_WDATA_VIDEO = wdata; /* write ai data */
  169. ANADIG_MISC->VDDSOC2PLL_AI_CTRL_VIDEO ^=
  170. ANADIG_MISC_VDDSOC2PLL_AI_CTRL_VIDEO_VDDSOC2PLL_AITOGGLE_VIDEO_MASK; /* toggle */
  171. do
  172. {
  173. toggle_done =
  174. ANADIG_MISC->VDDSOC2PLL_AI_CTRL_VIDEO &
  175. ANADIG_MISC_VDDSOC2PLL_AI_CTRL_VIDEO_VDDSOC2PLL_AITOGGLE_DONE_VIDEO_MASK; /* wait toggle done
  176. toggle */
  177. } while (toggle_done == pre_toggle_done);
  178. ANADIG_MISC->VDDSOC2PLL_AI_CTRL_VIDEO &=
  179. ~ANADIG_MISC_VDDSOC2PLL_AI_CTRL_VIDEO_VDDSOC2PLL_AIRWB_VIDEO_MASK;
  180. }
  181. else
  182. {
  183. pre_toggle_done =
  184. ANADIG_MISC->VDDSOC2PLL_AI_CTRL_VIDEO &
  185. ANADIG_MISC_VDDSOC2PLL_AI_CTRL_VIDEO_VDDSOC2PLL_AITOGGLE_DONE_VIDEO_MASK; /* get pre_toggle_done */
  186. temp = ANADIG_MISC->VDDSOC2PLL_AI_CTRL_VIDEO;
  187. temp &= ~ANADIG_MISC_VDDSOC2PLL_AI_CTRL_VIDEO_VDDSOC2PLL_AIRWB_VIDEO_MASK;
  188. temp |= (1UL << ANADIG_MISC_VDDSOC2PLL_AI_CTRL_VIDEO_VDDSOC2PLL_AIRWB_VIDEO_SHIFT) &
  189. ANADIG_MISC_VDDSOC2PLL_AI_CTRL_VIDEO_VDDSOC2PLL_AIRWB_VIDEO_MASK;
  190. ANADIG_MISC->VDDSOC2PLL_AI_CTRL_VIDEO = temp;
  191. temp = ANADIG_MISC->VDDSOC2PLL_AI_CTRL_VIDEO;
  192. temp &= ~ANADIG_MISC_VDDSOC2PLL_AI_CTRL_VIDEO_VDDSOC2PLL_AIADDR_VIDEO_MASK;
  193. temp |= ((uint32_t)addr << ANADIG_MISC_VDDSOC2PLL_AI_CTRL_VIDEO_VDDSOC2PLL_AIADDR_VIDEO_SHIFT) &
  194. ANADIG_MISC_VDDSOC2PLL_AI_CTRL_VIDEO_VDDSOC2PLL_AIADDR_VIDEO_MASK;
  195. ANADIG_MISC->VDDSOC2PLL_AI_CTRL_VIDEO = temp;
  196. ANADIG_MISC->VDDSOC2PLL_AI_CTRL_VIDEO ^=
  197. ANADIG_MISC_VDDSOC2PLL_AI_CTRL_VIDEO_VDDSOC2PLL_AITOGGLE_VIDEO_MASK; /* toggle */
  198. do
  199. {
  200. toggle_done =
  201. ANADIG_MISC->VDDSOC2PLL_AI_CTRL_VIDEO &
  202. ANADIG_MISC_VDDSOC2PLL_AI_CTRL_VIDEO_VDDSOC2PLL_AITOGGLE_DONE_VIDEO_MASK; /* wait toggle done
  203. toggle */
  204. } while (toggle_done == pre_toggle_done);
  205. rdata = ANADIG_MISC->VDDSOC2PLL_AI_RDATA_VIDEO; /* read data */
  206. return rdata;
  207. }
  208. break;
  209. case kAI_Itf_400m:
  210. if (isWrite)
  211. {
  212. pre_toggle_done =
  213. ANADIG_MISC->VDDLPSR_AI400M_CTRL &
  214. ANADIG_MISC_VDDLPSR_AI400M_CTRL_VDDLPSR_AITOGGLE_DONE_400M_MASK; /* get pre_toggle_done */
  215. ANADIG_MISC->VDDLPSR_AI400M_CTRL &= ~ANADIG_MISC_VDDLPSR_AI400M_CTRL_VDDLPSR_AI400M_RWB_MASK;
  216. temp = ANADIG_MISC->VDDLPSR_AI400M_CTRL;
  217. temp &= ~ANADIG_MISC_VDDLPSR_AI400M_CTRL_VDDLPSR_AI400M_ADDR_MASK;
  218. temp |= ((uint32_t)addr << ANADIG_MISC_VDDLPSR_AI400M_CTRL_VDDLPSR_AI400M_ADDR_SHIFT) &
  219. ANADIG_MISC_VDDLPSR_AI400M_CTRL_VDDLPSR_AI400M_ADDR_MASK;
  220. ANADIG_MISC->VDDLPSR_AI400M_CTRL = temp;
  221. ANADIG_MISC->VDDLPSR_AI400M_WDATA = wdata; /* write ai data */
  222. ANADIG_MISC->VDDLPSR_AI400M_CTRL ^=
  223. ANADIG_MISC_VDDLPSR_AI400M_CTRL_VDDLPSR_AITOGGLE_400M_MASK; /* toggle */
  224. do
  225. {
  226. toggle_done =
  227. ANADIG_MISC->VDDLPSR_AI400M_CTRL &
  228. ANADIG_MISC_VDDLPSR_AI400M_CTRL_VDDLPSR_AITOGGLE_DONE_400M_MASK; /* wait toggle done toggle */
  229. } while (toggle_done == pre_toggle_done);
  230. }
  231. else
  232. {
  233. pre_toggle_done =
  234. ANADIG_MISC->VDDLPSR_AI400M_CTRL &
  235. ANADIG_MISC_VDDLPSR_AI400M_CTRL_VDDLPSR_AITOGGLE_DONE_400M_MASK; /* get pre_toggle_done */
  236. temp = ANADIG_MISC->VDDLPSR_AI400M_CTRL;
  237. temp &= ~ANADIG_MISC_VDDLPSR_AI400M_CTRL_VDDLPSR_AI400M_RWB_MASK;
  238. temp |= (1UL << ANADIG_MISC_VDDLPSR_AI400M_CTRL_VDDLPSR_AI400M_RWB_SHIFT) &
  239. ANADIG_MISC_VDDLPSR_AI400M_CTRL_VDDLPSR_AI400M_RWB_MASK;
  240. ANADIG_MISC->VDDLPSR_AI400M_CTRL = temp;
  241. temp = ANADIG_MISC->VDDLPSR_AI400M_CTRL;
  242. temp &= ~ANADIG_MISC_VDDLPSR_AI400M_CTRL_VDDLPSR_AI400M_ADDR_MASK;
  243. temp |= ((uint32_t)addr << ANADIG_MISC_VDDLPSR_AI400M_CTRL_VDDLPSR_AI400M_ADDR_SHIFT) &
  244. ANADIG_MISC_VDDLPSR_AI400M_CTRL_VDDLPSR_AI400M_ADDR_MASK;
  245. ANADIG_MISC->VDDLPSR_AI400M_CTRL = temp;
  246. ANADIG_MISC->VDDLPSR_AI400M_CTRL ^=
  247. ANADIG_MISC_VDDLPSR_AI400M_CTRL_VDDLPSR_AITOGGLE_400M_MASK; /* toggle */
  248. do
  249. {
  250. toggle_done =
  251. ANADIG_MISC->VDDLPSR_AI400M_CTRL &
  252. ANADIG_MISC_VDDLPSR_AI400M_CTRL_VDDLPSR_AITOGGLE_DONE_400M_MASK; /* wait toggle done toggle */
  253. } while (toggle_done == pre_toggle_done);
  254. rdata = ANADIG_MISC->VDDLPSR_AI400M_RDATA; /* read data */
  255. return rdata;
  256. }
  257. break;
  258. case kAI_Itf_Temp:
  259. if (isWrite)
  260. {
  261. ANADIG_MISC->VDDLPSR_AI_CTRL &= ~ANADIG_MISC_VDDLPSR_AI_CTRL_VDDLPSR_AIRWB_MASK;
  262. temp = ANADIG_MISC->VDDLPSR_AI_CTRL;
  263. temp &= ~ANADIG_MISC_VDDLPSR_AI_CTRL_VDDLPSR_AI_ADDR_MASK;
  264. temp |= ((uint32_t)addr << ANADIG_MISC_VDDLPSR_AI_CTRL_VDDLPSR_AI_ADDR_SHIFT) &
  265. ANADIG_MISC_VDDLPSR_AI_CTRL_VDDLPSR_AI_ADDR_MASK;
  266. ANADIG_MISC->VDDLPSR_AI_CTRL = temp;
  267. ANADIG_MISC->VDDLPSR_AI_WDATA = wdata; /* write ai data */
  268. ANADIG_TEMPSENSOR->TEMPSENSOR ^= ANADIG_TEMPSENSOR_TEMPSENSOR_TEMPSNS_AI_TOGGLE_MASK; /* toggle */
  269. }
  270. else
  271. {
  272. temp = ANADIG_MISC->VDDLPSR_AI_CTRL;
  273. temp &= ~ANADIG_MISC_VDDLPSR_AI_CTRL_VDDLPSR_AIRWB_MASK;
  274. temp |= (1UL << ANADIG_MISC_VDDLPSR_AI_CTRL_VDDLPSR_AIRWB_SHIFT) &
  275. ANADIG_MISC_VDDLPSR_AI_CTRL_VDDLPSR_AIRWB_MASK;
  276. ANADIG_MISC->VDDLPSR_AI_CTRL = temp;
  277. temp = ANADIG_MISC->VDDLPSR_AI_CTRL;
  278. temp &= ~ANADIG_MISC_VDDLPSR_AI_CTRL_VDDLPSR_AI_ADDR_MASK;
  279. temp |= ((uint32_t)addr << ANADIG_MISC_VDDLPSR_AI_CTRL_VDDLPSR_AI_ADDR_SHIFT) &
  280. ANADIG_MISC_VDDLPSR_AI_CTRL_VDDLPSR_AI_ADDR_MASK;
  281. ANADIG_MISC->VDDLPSR_AI_CTRL = temp;
  282. ANADIG_TEMPSENSOR->TEMPSENSOR ^= ANADIG_TEMPSENSOR_TEMPSENSOR_TEMPSNS_AI_TOGGLE_MASK; /* toggle */
  283. rdata = ANADIG_MISC->VDDLPSR_AI_RDATA_TMPSNS; /* read data */
  284. return rdata;
  285. }
  286. break;
  287. case kAI_Itf_Bandgap:
  288. if (isWrite)
  289. {
  290. ANADIG_MISC->VDDLPSR_AI_CTRL &= ~ANADIG_MISC_VDDLPSR_AI_CTRL_VDDLPSR_AIRWB_MASK;
  291. temp = ANADIG_MISC->VDDLPSR_AI_CTRL;
  292. temp &= ~ANADIG_MISC_VDDLPSR_AI_CTRL_VDDLPSR_AI_ADDR_MASK;
  293. temp |= ((uint32_t)addr << ANADIG_MISC_VDDLPSR_AI_CTRL_VDDLPSR_AI_ADDR_SHIFT) &
  294. ANADIG_MISC_VDDLPSR_AI_CTRL_VDDLPSR_AI_ADDR_MASK;
  295. ANADIG_MISC->VDDLPSR_AI_CTRL = temp;
  296. ANADIG_MISC->VDDLPSR_AI_WDATA = wdata; /* write ai data */
  297. ANADIG_PMU->PMU_REF_CTRL ^= ANADIG_PMU_PMU_REF_CTRL_REF_AI_TOGGLE_MASK; /* toggle */
  298. }
  299. else
  300. {
  301. temp = ANADIG_MISC->VDDLPSR_AI_CTRL;
  302. temp &= ~ANADIG_MISC_VDDLPSR_AI_CTRL_VDDLPSR_AIRWB_MASK;
  303. temp |= (1UL << ANADIG_MISC_VDDLPSR_AI_CTRL_VDDLPSR_AIRWB_SHIFT) &
  304. ANADIG_MISC_VDDLPSR_AI_CTRL_VDDLPSR_AIRWB_MASK;
  305. ANADIG_MISC->VDDLPSR_AI_CTRL = temp;
  306. temp = ANADIG_MISC->VDDLPSR_AI_CTRL;
  307. temp &= ~ANADIG_MISC_VDDLPSR_AI_CTRL_VDDLPSR_AI_ADDR_MASK;
  308. temp |= ((uint32_t)addr << ANADIG_MISC_VDDLPSR_AI_CTRL_VDDLPSR_AI_ADDR_SHIFT) &
  309. ANADIG_MISC_VDDLPSR_AI_CTRL_VDDLPSR_AI_ADDR_MASK;
  310. ANADIG_MISC->VDDLPSR_AI_CTRL = temp;
  311. ANADIG_PMU->PMU_REF_CTRL ^= ANADIG_PMU_PMU_REF_CTRL_REF_AI_TOGGLE_MASK; /* toggle */
  312. rdata = ANADIG_MISC->VDDLPSR_AI_RDATA_REFTOP; /* read data */
  313. return rdata;
  314. }
  315. break;
  316. default:
  317. /* This branch should never be hit. */
  318. break;
  319. }
  320. return 0;
  321. }
  322. void ANATOP_AI_Write(anatop_ai_itf_t itf, anatop_ai_reg_t addr, uint32_t wdata)
  323. {
  324. (void)ANATOP_AI_Access(itf, true, addr, wdata);
  325. }
  326. uint32_t ANATOP_AI_Read(anatop_ai_itf_t itf, anatop_ai_reg_t addr)
  327. {
  328. uint32_t rdata;
  329. rdata = ANATOP_AI_Access(itf, false, addr, 0);
  330. return rdata;
  331. }
  332. void ANATOP_AI_WriteWithMaskShift(
  333. anatop_ai_itf_t itf, anatop_ai_reg_t addr, uint32_t wdata, uint32_t mask, uint32_t shift)
  334. {
  335. uint32_t rdata;
  336. rdata = ANATOP_AI_Read(itf, addr);
  337. rdata = (rdata & (~mask)) | ((wdata << shift) & mask);
  338. ANATOP_AI_Write(itf, addr, rdata);
  339. }