mt_afe_connection.c 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484
  1. /* Copyright (c) 2011-2013, The Linux Foundation. All rights reserved.
  2. *
  3. * This program is free software; you can redistribute it and/or modify
  4. * it under the terms of the GNU General Public License version 2 and
  5. * only version 2 as published by the Free Software Foundation.
  6. *
  7. * This program is distributed in the hope that it will be useful,
  8. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  10. * GNU General Public License for more details.
  11. */
  12. #include "mt_afe_reg.h"
  13. #include "mt_afe_digital_type.h"
  14. #include <linux/printk.h>
  15. /**
  16. * here define conenction table for input and output
  17. */
  18. static const char connection_table[INTER_CONN_INPUT_NUM][INTER_CONN_OUTPUT_NUM] = {
  19. /* 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
  20. 16 17 18 19 20 21 22 */
  21. {3, 3, 3, 3, 3, 3, -1, 1, 1, 1, 1, -1, -1, 1, 1, 3,
  22. 3, -1, -1, 3, 3, 1, -1}, /* I00 */
  23. {3, 3, 3, 3, 3, -1, 3, 1, 1, 1, 1, -1, -1, 1, 1, 3,
  24. 3, -1, -1, 3, 3, -1, 1}, /* I01 */
  25. {1, 1, 1, 1, 1, 1, -1, 1, 1, -1, -1, 1, -1, 1, 1, 1,
  26. 1, -1, -1, -1, -1, -1, -1}, /* I02 */
  27. {1, 1, 3, 1, 1, 1, -1, 1, -1, 1, -1, -1, -1, 1, 1, 1,
  28. 1, -1, -1, 1, 1, 1, -1}, /* I03 */
  29. {1, 1, 3, 1, 1, -1, 1, -1, 1, -1, 1, -1, -1, 1, 1, 1,
  30. 1, -1, -1, 1, 1, -1, 1}, /* I04 */
  31. {3, 3, 3, 3, 3, 1, -1, 1, -1, 1, -1, 1, -1, 1, 1, 1,
  32. 1, -1, -1, 3, 3, 1, -1}, /* I05 */
  33. {3, 3, 3, 3, 3, -1, 1, -1, 1, -1, 1, -1, 1, 1, 1, 1,
  34. 1, -1, -1, 3, 3, -1, 1}, /* I06 */
  35. {3, 3, 3, 3, 3, 1, -1, 1, -1, 1, -1, 1, -1, 1, 1, 1,
  36. 1, -1, -1, 3, 3, 1, -1}, /* I07 */
  37. {3, 3, 3, 3, 3, -1, 1, -1, 1, -1, 1, -1, 1, 1, 1, 1,
  38. 1, -1, -1, 3, 3, -1, 1}, /* I08 */
  39. {1, 1, 1, 1, 1, 1, -1, -1, -1, 1, -1, -1, 1, 1, 1,
  40. 1, 1, -1, -1, 1, 1, -1, -1}, /* I09 */
  41. {3, -1, 3, 3, -1, 1, -1, 1, -1, 1, 1, 1, 1, -1, -1, -1,
  42. -1, -1, -1, 1, -1, 1, 1}, /* I10 */
  43. {-1, 3, 3, -1, 3, -1, 1, -1, 1, 1, 1, 1, 1, -1, -1, -1,
  44. -1, -1, -1, -1, 1, 1, 1}, /* I11 */
  45. {3, -1, 3, 3, -1, 1, -1, 1, -1, 1, 1, 1, 1, -1, -1, -1,
  46. -1, -1, -1, 1, -1, 1, 1}, /* I12 */
  47. {-1, 3, 3, -1, 3, -1, 1, -1, 1, 1, 1, 1, 1, -1, -1, -1,
  48. -1, -1, -1, -1, 1, 1, 1}, /* I13 */
  49. {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
  50. -1, -1, -1, -1, -1, -1, -1}, /* I14 */
  51. {3, 3, 3, 3, 3, 3, -1, -1, -1, 1, -1, -1, -1, 1, 1, 3,
  52. 1, -1, -1, -1, -1, 1, -1}, /* I15 */
  53. {3, 3, 3, 3, 3, -1, 3, -1, -1, -1, 1, -1, -1, 1, 1, 1,
  54. 3, -1, -1, -1, -1, -1, 1}, /* I16 */
  55. {1, -1, 3, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, 1, 1,
  56. 1, -1, -1, 1, 1, 1, -1}, /* I17 */
  57. {-1, 1, 3, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, 1, 1, 1,
  58. 1, -1, -1, 1, 1, -1, 1}, /* I18 */
  59. {3, -1, 3, 3, 3, 1, -1, 1, -1, 1, -1, 1, -1, 1, 1, 1,
  60. 1, -1, -1, 1, 1, 1, -1}, /* I19 */
  61. {-1, 3, 3, 3, 3, -1, 1, -1, 1, -1, 1, -1, 1, 1, 1, 1,
  62. 1, -1, -1, 1, 1, -1, 1}, /* I20 */
  63. };
  64. /**
  65. * connection bits of certain bits
  66. */
  67. static const char connection_bits[INTER_CONN_INPUT_NUM][INTER_CONN_OUTPUT_NUM] = {
  68. /* 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
  69. 16 17 18 19 20 21 22 */
  70. {0, 16, 0, 16, 0, 16, -1, 2, 5, 8, 12, -1, -1, 2, 15, 16,
  71. 22, -1, -1, 8, 24, 30, -1}, /* I00 */
  72. {1, 17, 1, 17, 1, -1, 22, 3, 6, 9, 13, -1, -1, 3, 16, 17,
  73. 23, -1, -1, 10, 26, -1, 2}, /* I01 */
  74. {2, 18, 2, 18, 2, 17, -1, 21, 22, -1, -1, 6, -1, 4, 17, -1,
  75. 24, -1, -1, -1, -1, -1, -1}, /* I02 */
  76. {3, 19, 3, 19, 3, 18, -1, 26, -1, 0, -1, -1, -1, 5, 18, 19,
  77. 25, -1, -1, 12, 28, 31, -1}, /* I03 */
  78. {4, 20, 4, 20, 4, -1, 23, -1, 29, -1, 3, -1, -1, 6, 19, 20,
  79. 26, -1, -1, 13, 29, -1, 3}, /* I04 */
  80. {5, 21, 5, 21, 5, 19, -1, 27, -1, 1, -1, 7, -1, 16, 20, 17,
  81. 26, -1, -1, 14, 31, 8, -1}, /* I05 */
  82. {6, 22, 6, 22, 6, -1, 24, -1, 30, -1, 4, -1, 9, 17, 21, 18,
  83. 27, -1, -1, 16, 0, -1, 11}, /* I06 */
  84. {7, 23, 7, 23, 7, 20, -1, 28, -1, 2, -1, 8, -1, 18, 22, 19,
  85. 28, -1, -1, 18, 2, 9, -1}, /* I07 */
  86. {8, 24, 8, 24, 8, -1, 25, -1, 31, -1, 5, -1, 10, 19, 23, 20,
  87. 29, -1, -1, 20, 4, -1, 12}, /* I08 */
  88. {9, 25, 9, 25, 9, 21, 27, -1, -1, 10, -1, -1, 11, 7, 20, 21,
  89. 27, -1, -1, 22, 6, -1, -1}, /* I09 */
  90. {0, -1, 4, 8, -1, 12, -1, 14, -1, 26, 28, 30, 0, -1, -1, -1,
  91. -1, -1, -1, 28, -1, 0, -1}, /* I10 */
  92. {-1, 2, 6, -1, 10, -1, 13, -1, 15, 27, 29, 31, 1, -1, -1, -1,
  93. -1, -1, -1, -1, 29, 31, 1}, /* I11 */
  94. {0, -1, 4, 8, -1, 12, -1, 14, -1, 8, 10, 12, 14, -1, -1, -1,
  95. -1, -1, -1, 2, -1, -1, 6}, /* I12 */
  96. {-1, 2, 6, -1, 10, -1, 13, -1, 15, 9, 11, 13, 15, -1, -1, -1,
  97. -1, -1, -1, -1, 3, 4, 7}, /* I13 */
  98. {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
  99. -1, -1, -1, -1, -1, -1, -1}, /* I14 */
  100. {13, 18, 23, 28, 1, 6, -1, -1, -1, 10, -1, -1, -1, 9, 22, 29,
  101. 2, -1, -1, 23, -1, 10, -1}, /* I15 */
  102. {14, 19, 24, 29, 2, -1, 8, -1, -1, -1, 11, -1, -1, 10, 23, 30,
  103. 3, -1, -1, -1, -1, -1, 13}, /* I16 */
  104. {0, 19, 27, 0, 2, 22, 8, 26, -1, 30, 11, 2, -1, 11, 24, 21,
  105. 30, -1, -1, 22, 6, 0, -1}, /* I17 */
  106. {14, 3, 28, -1, 1, -1, 24, -1, 28, -1, 0, -1, 4, 12, 25, 22,
  107. 31, -1, -1, 23, 7, -1, 4}, /* I18 */
  108. {1, 19, 10, 14, 18, 23, 8, 27, -1, 31, -1, 3, -1, 13, 26, 23,
  109. 0, -1, -1, 24, 28, 1, -1}, /* I19 */
  110. {14, 4, 12, 16, 20, -1, 25, -1, 29, -1, 1, -1, 5, 14, 27, 24,
  111. 1, -1, -1, 25, 29, -1, 5}, /* I20 */
  112. };
  113. /**
  114. * connection shift bits of certain bits
  115. */
  116. static const char shift_connection_bits[INTER_CONN_INPUT_NUM][INTER_CONN_OUTPUT_NUM] = {
  117. /* 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
  118. 16 17 18 19 20 21 22 */
  119. {10, 26, 10, 26, 10, 19, -1, -1, -1, -1, -1, -1, -1, -1, -1, 31,
  120. 25, -1, -1, 9, 25, -1, -1}, /* I00 */
  121. {11, 27, 11, 27, 11, -1, 20, -1, -1, -1, -1, -1, -1, -1, -1, 16,
  122. 4, -1, -1, 11, 27, -1, -1}, /* I01 */
  123. {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
  124. -1, -1, -1, -1, -1, -1, -1}, /* I02 */
  125. {-1, -1, 25, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
  126. -1, -1, -1, -1, -1, -1, -1}, /* I03 */
  127. {-1, -1, 26, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
  128. -1, -1, -1, -1, -1, -1, -1}, /* I04 */
  129. {12, 28, 12, 28, 12, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
  130. -1, -1, -1, 15, 30, -1, -1}, /* I05 */
  131. {13, 29, 13, 29, 13, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
  132. -1, -1, -1, 17, 1, -1, -1}, /* I06 */
  133. {14, 30, 14, 30, 14, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
  134. -1, -1, -1, 19, 3, -1, -1}, /* I07 */
  135. {15, 31, 15, 31, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
  136. -1, -1, -1, 21, 5, -1, -1}, /* I08 */
  137. {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
  138. -1, -1, -1, -1, -1, -1, -1}, /* I09 */
  139. {1, -1, 5, 9, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
  140. -1, -1, -1, -1, -1, -1, -1}, /* I10 */
  141. {-1, 3, 7, -1, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
  142. -1, -1, -1, -1, -1, -1, -1}, /* I11 */
  143. {1, -1, 5, 9, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
  144. -1, -1, -1, -1, -1, -1, -1}, /* I12 */
  145. {-1, 3, 7, -1, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
  146. -1, -1, -1, -1, -1, -1, -1}, /* I13 */
  147. {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
  148. -1, -1, -1, -1, -1, -1, -1}, /* I14 */
  149. {15, 20, 25, 30, 3, 7, -1, -1, -1, 10, -1, -1, -1, -1, -1,
  150. 0, 2, -1, -1, -1, -1, -1, -1}, /* I15 */
  151. {16, 21, 26, 31, 4, -1, 9, -1, -1, -1, 11, -1, -1, -1, -1, 30,
  152. 5, -1, -1, -1, -1, -1, -1}, /* I16 */
  153. {14, 19, 30, 29, 2, -1, 8, -1, -1, -1, 11, -1, -1, -1, -1, 30,
  154. 3, -1, -1, -1, -1, -1, -1}, /* I17 */
  155. {14, 19, 31, 29, 2, -1, 8, -1, -1, -1, 11, -1, -1, -1, -1, 30,
  156. 3, -1, -1, -1, -1, -1, -1}, /* I18 */
  157. {2, 19, 11, 16, 19, -1, 8, -1, -1, -1, 11, -1, -1, -1, -1, 30,
  158. 3, -1, -1, -1, -1, -1, -1}, /* I19 */
  159. {14, 5, 13, 17, 21, -1, 8, -1, -1, -1, 11, -1, -1, -1, -1, 30,
  160. 3, -1, -1, -1, -1, -1, -1}, /* I20 */
  161. };
  162. /**
  163. * connection of register
  164. */
  165. static const short connection_reg[INTER_CONN_INPUT_NUM][INTER_CONN_OUTPUT_NUM] = {
  166. /* 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
  167. 16 17 18 19 20 21 22 */
  168. {0x20, 0x20, 0x24, 0x24, 0x28, 0x28, -1, 0x5c, -1, 0x5c, 0x5c, -1, -1, 0x448, 0x448, 0x438,
  169. 0x438, 0x5c, 0x5c, 0x464, 0x464, -1, -1}, /* I00 */
  170. {0x20, 0x20, 0x24, 0x24, 0x28, -1, 0x28, 0x5c, 0x5c, 0x5c, 0x5c, -1, -1, 0x448, 0x448,
  171. 0x438, 0x438, 0x5c, 0x5c, 0x464, 0x464, -1}, /* I01 */
  172. {-1, 0x20, 0x24, 0x24, -1, -1, 0x30, 0x30, -1, -1, -1, 0x2c, -1, 0x448, 0x448, -1,
  173. -1, 0x30, 0x30, -1, -1, -1, -1}, /* I02 */
  174. {0x20, 0x20, 0x24, 0x24, 0x28, 0x28, -1, 0x28, -1, 0x2C, -1, -1, -1, 0x448, 0x448, 0x438,
  175. 0x438, 0x30, -1, 0x464, 0x464, 0x5c, -1}, /* I03 */
  176. {0x20, 0x20, 0x24, 0x24, 0x28, -1, 0x28, -1, 0x28, -1, 0x2C, -1, -1, 0x448, 0x448, 0x438,
  177. 0x438, -1, 0x30, 0x464, 0x464, -1, 0xbc}, /* I04 */
  178. {0x20, 0x20, 0x24, 0x24, 0x28, 0x28, -1, 0x28, -1, 0x2C, -1, -1, -1, 0x420, 0x420, -1,
  179. -1, 0x30, -1, 0x464, 0x464, -1, -1}, /* I05 */
  180. {0x20, 0x20, 0x24, 0x24, 0x28, -1, 0x28, -1, 0x28, -1, 0x2C, -1, 0x2C, 0x420, 0x420, -1,
  181. -1, -1, 0x30, 0x464, -1, -1, -1}, /* I06 */
  182. {0x20, 0x20, 0x24, 0x24, 0x28, 0x28, -1, 0x28, -1, 0x2C, -1, -1, -1, 0x420, 0x420, -1,
  183. -1, 0x30, -1, 0x464, -1, -1, -1}, /* I07 */
  184. {0x20, 0x20, 0x24, 0x24, 0x28, -1, 0x28, -1, 0x28, -1, 0x2C, -1, 0x2C, 0x420, 0x420, -1,
  185. -1, -1, 0x30, 0x464, -1, -1, -1}, /* I08 */
  186. {0x20, 0x20, 0x24, 0x24, 0x28, 0x28, -1, -1, -1, 0x5c, -1, -1, 0x2C, 0x448, 0x448, 0x438,
  187. 0x438, 0x5c, 0x5c, 0x5c, 0x5c, -1, -1}, /* I09 */
  188. {0x420, -1, -1, 0x420, -1, 0x420, -1, 0x420, -1, -1, -1, -1, 0x448, -1, -1, -1,
  189. -1, 0x420, -1, 0x448, -1, 0x448, 0x44c}, /* I10 */
  190. {-1, 0x420, -1, -1, 0x420, -1, 0x420, -1, 0x420, -1, -1, -1, 0x448, -1, -1, -1,
  191. -1, -1, 0x420, -1, 0x448, 0x448, 0x44c}, /* I11 */
  192. {0x438, 0x438, -1, 0x438, -1, 0x438, -1, 0x438, -1, -1, -1, -1, -1, -1, -1, -1,
  193. -1, 0x440, -1, 0x444, -1, 0x444, 0x444}, /* I12 */
  194. {-1, 0x438, -1, -1, 0x438, -1, 0x438, -1, 0x438, -1, -1, -1, -1, -1, -1, -1,
  195. -1, -1, 0x440, -1, 0x444, 0x444, 0x444}, /* I13 */
  196. {0x2C, 0x2C, 0x2C, 0x2C, 0x30, 0x30, -1, 0x5c, 0x5c, 0x5c, -1, -1, 0x30, 0x448, 0x448,
  197. 0x438,
  198. 0x440, -1, -1, 0x5c, 0x5c, -1, -1}, /* I14 */
  199. {0x2C, 0x2C, 0x2C, 0x2C, 0x30, 0x30, -1, -1, -1, 0x30, -1, -1, -1, 0x448, 0x448, 0x438,
  200. 0x440, -1, -1, -1, -1, -1, -1}, /* I15 */
  201. {0x2C, 0x2C, 0x2C, 0x2C, 0x30, -1, 0x30, -1, -1, -1, 0x30, -1, -1, 0x448, 0x448, 0x438,
  202. 0x440, -1, -1, -1, -1, -1, -1}, /* I16 */
  203. {0x460, 0x2C, 0x2C, 0x5c, 0x30, 0x460, 0x30, 0x460, -1, 0x460, 0x30, 0x464, -1, 0x448,
  204. 0x448, 0x438,
  205. 0x440, 0x5c, -1, 0x464, -1, 0xbc, -1}, /* I17 */
  206. {0x2C, 0x460, 0x2C, 0x2C, 0x5c, -1, 0x460, -1, 0x460, -1, 0x464, -1, 0x464, 0x448, 0x448,
  207. 0x438,
  208. 0x440, -1, 0x5c, 0x464, -1, -1, 0xbc}, /* I18 */
  209. {0x460, 0x2C, 0x460, 0x460, 0x460, 0x460, 0x30, 0x460, -1, 0x460, 0x30, 0x464, -1, 0x448,
  210. 0x448, 0x438,
  211. 0x444, 0x464, -1, 0x5c, 0x5c, 0xbc, -1}, /* I19 */
  212. {0x2C, 0x460, 0x460, 0x460, 0x460, -1, 0x460, -1, 0x460, -1, 0x464, -1, 0x464, 0x448, 0x448,
  213. 0x438,
  214. 0x444, -1, 0x464, 0x5c, 0x5c, -1, 0xbc}, /* I20 */
  215. };
  216. /**
  217. * shift connection of register
  218. */
  219. static const short shift_connection_reg[INTER_CONN_INPUT_NUM][INTER_CONN_OUTPUT_NUM] = {
  220. /* 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
  221. 16 17 18 19 20 21 22 */
  222. {0x20, 0x20, 0x24, 0x24, 0x28, 0x30, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0x438,
  223. -1, -1, -1, 0x464, 0x464, -1, -1}, /* I00 */
  224. {0x20, 0x20, 0x24, 0x24, 0x28, -1, 0x30, -1, -1, -1, -1, -1, -1, -1, -1, -1,
  225. 0x440, -1, -1, 0x464, 0x464, -1, -1}, /* I01 */
  226. {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
  227. -1, -1, -1, -1, -1, -1, -1}, /* I02 */
  228. {-1, -1, 0x30, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
  229. -1, -1, -1, -1, -1, -1, -1}, /* I03 */
  230. {-1, -1, 0x30, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
  231. -1, -1, -1, -1, -1, -1, -1}, /* I04 */
  232. {0x20, 0x20, 0x24, 0x24, 0x28, -1, -1, -1, -1, -1, -1, 0x2C, -1, -1, -1, -1,
  233. -1, -1, -1, 0x464, 0x464, -1, -1}, /* I05 */
  234. {0x20, 0x20, 0x24, 0x24, 0x28, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
  235. -1, -1, -1, 0x464, -1, -1, -1}, /* I06 */
  236. {0x20, 0x20, 0x24, 0x24, 0x28, -1, -1, -1, -1, -1, -1, 0x2C, -1, -1, -1, -1,
  237. -1, -1, -1, 0x464, -1, -1, -1}, /* I07 */
  238. {0x20, 0x20, 0x24, 0x24, 0x28, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
  239. -1, -1, -1, 0x464, -1, -1, -1}, /* I08 */
  240. {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
  241. -1, -1, -1, -1, -1, -1, -1}, /* I09 */
  242. {0x420, -1, -1, 0x420, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
  243. -1, -1, -1, -1, -1, -1, -1}, /* I10 */
  244. {0x420, 0x420, -1, -1, 0x420, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
  245. -1, -1, -1, -1, -1, -1, -1}, /* I11 */
  246. {0x438, 0x438, -1, 0x438, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
  247. -1, -1, -1, -1, -1, -1, -1}, /* I12 */
  248. {-1, 0x438, -1, -1, 0x438, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
  249. -1, -1, -1, -1, -1, -1, -1}, /* I13 */
  250. {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
  251. -1, -1, -1, -1, -1, -1, -1}, /* I14 */
  252. {0x2C, 0x2C, -1, 0x2C, 0x30, 0x30, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0x440,
  253. -1, -1, -1, -1, -1, -1, -1}, /* I15 */
  254. {0x2C, 0x2C, -1, 0x2C, 0x30, -1, 0x30, -1, -1, -1, -1, -1, -1, -1, -1, -1,
  255. 0x440, -1, -1, -1, -1, -1, -1}, /* I16 */
  256. {0x2C, 0x2C, 0xbc, 0x2C, 0x30, -1, 0x30, -1, -1, -1, -1, -1, -1, -1, -1, -1,
  257. 0x440, -1, -1, -1, -1, -1, -1}, /* I17 */
  258. {0x2C, 0x2C, 0xbc, 0x2C, 0x30, -1, 0x30, -1, -1, -1, -1, -1, -1, -1, -1, -1,
  259. 0x440, -1, -1, -1, -1, -1, -1}, /* I18 */
  260. {0x460, 0x2C, 0x460, 0x460, 0x460, -1, 0x30, -1, -1, -1, -1, -1, -1, -1, -1, -1,
  261. 0x440, -1, -1, -1, -1, -1, -1}, /* I19 */
  262. {0x2C, 0x460, 0x460, 0x460, 0x460, -1, 0x30, -1, -1, -1, -1, -1, -1, -1, -1, -1,
  263. 0x440, -1, -1, -1, -1, -1, -1}, /* I20 */
  264. };
  265. /**
  266. * connection state of register
  267. */
  268. static char connection_state[INTER_CONN_INPUT_NUM][INTER_CONN_OUTPUT_NUM] = {
  269. /* 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 */
  270. {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, /* I00 */
  271. {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, /* I01 */
  272. {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, /* I02 */
  273. {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, /* I03 */
  274. {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, /* I04 */
  275. {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, /* I05 */
  276. {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, /* I06 */
  277. {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, /* I07 */
  278. {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, /* I08 */
  279. {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, /* I09 */
  280. {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, /* I10 */
  281. {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, /* I11 */
  282. {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, /* I12 */
  283. {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, /* I13 */
  284. {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, /* I14 */
  285. {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, /* I15 */
  286. {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, /* I16 */
  287. {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, /* I17 */
  288. {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, /* I18 */
  289. {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, /* I19 */
  290. {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, /* I20 */
  291. };
  292. /**
  293. * value of connection register to set for certain input
  294. */
  295. const uint32_t hdmi_connection_value[HDMI_INTER_CONN_INPUT_NUM] = {
  296. /* I_30 I_31 I_32 I_33 I_34 I_35 I_36 I_37 */
  297. 0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7
  298. };
  299. /**
  300. * mask of connection register to set for certain output
  301. */
  302. const uint32_t hdmi_connection_mask[HDMI_INTER_CONN_OUTPUT_NUM] = {
  303. /* O_30 O_31 O_32 O_33 O_34 O_35 O_36 O_37 O_38 O_39 O_40 O_41 */
  304. 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7
  305. };
  306. /**
  307. * shift bits of connection register to set for certain output
  308. */
  309. const char hdmi_connection_shift_bits[HDMI_INTER_CONN_OUTPUT_NUM] = {
  310. /* O_30 O_31 O_32 O_33 O_34 O_35 O_36 O_37 O_38 O_39 O_40 O_41 */
  311. 0, 3, 6, 9, 12, 15, 18, 21, 24, 27, 0, 3
  312. };
  313. /**
  314. * connection state of HDMI
  315. */
  316. char hdmi_connection_state[HDMI_INTER_CONN_INPUT_NUM][HDMI_INTER_CONN_OUTPUT_NUM] = {
  317. /* O_30 O_31 O_32 O_33 O_34 O_35 O_36 O_37 O_38 O_39 O_40 O_41 */
  318. {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, /* I_30 */
  319. {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, /* I_31 */
  320. {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, /* I_32 */
  321. {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, /* I_33 */
  322. {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, /* I_34 */
  323. {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, /* I_35 */
  324. {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, /* I_36 */
  325. {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} /* I_37 */
  326. };
  327. /**
  328. * connection state of HDMI
  329. */
  330. const uint32_t hdmi_connection_reg[HDMI_INTER_CONN_OUTPUT_NUM] = {
  331. /* O_30 O_31 O_32 O_33 */
  332. AFE_HDMI_CONN0, AFE_HDMI_CONN0, AFE_HDMI_CONN0, AFE_HDMI_CONN0,
  333. /* O_34 O_35 O_36 O_37 */
  334. AFE_HDMI_CONN0, AFE_HDMI_CONN0, AFE_HDMI_CONN0, AFE_HDMI_CONN0,
  335. /* O_38 O_39 O_40 O_41 */
  336. AFE_HDMI_CONN0, AFE_HDMI_CONN0, AFE_HDMI_CONN1, AFE_HDMI_CONN1
  337. };
  338. static bool check_bits_and_reg(short reg_addr, char bits)
  339. {
  340. if (reg_addr <= 0 || bits < 0) {
  341. pr_warn("reg_addr = %x bits = %d\n", reg_addr, bits);
  342. return false;
  343. }
  344. return true;
  345. }
  346. int set_hdmi_interconnection(uint32_t connection_state, uint32_t input, uint32_t output)
  347. {
  348. uint32_t input_index;
  349. uint32_t output_index;
  350. /* check if connection request is valid */
  351. if (input < HDMI_INTER_CONN_INPUT_BASE || input > HDMI_INTER_CONN_INPUT_MAX ||
  352. output < HDMI_INTER_CONN_OUTPUT_BASE || output > HDMI_INTER_CONN_OUTPUT_MAX) {
  353. return -1;
  354. }
  355. input_index = input - HDMI_INTER_CONN_INPUT_BASE;
  356. output_index = output - HDMI_INTER_CONN_OUTPUT_BASE;
  357. /* do connection */
  358. switch (connection_state) {
  359. case INTER_CONNECT:
  360. {
  361. uint32_t reg_value = hdmi_connection_value[input_index];
  362. uint32_t reg_mask = hdmi_connection_mask[output_index];
  363. uint32_t reg_shift_bits = hdmi_connection_shift_bits[output_index];
  364. uint32_t reg_conn = hdmi_connection_reg[output_index];
  365. mt_afe_set_reg(reg_conn, reg_value << reg_shift_bits,
  366. reg_mask << reg_shift_bits);
  367. hdmi_connection_state[input_index][output_index] = INTER_CONNECT;
  368. break;
  369. }
  370. case INTER_DISCONNECT:
  371. {
  372. uint32_t reg_value = hdmi_connection_value[INTER_CONN_I37 -
  373. HDMI_INTER_CONN_INPUT_BASE];
  374. uint32_t reg_mask = hdmi_connection_mask[output_index];
  375. uint32_t reg_shift_bits = hdmi_connection_shift_bits[output_index];
  376. uint32_t reg_conn = hdmi_connection_reg[output_index];
  377. mt_afe_set_reg(reg_conn, reg_value << reg_shift_bits,
  378. reg_mask << reg_shift_bits);
  379. hdmi_connection_state[input_index][output_index] = INTER_DISCONNECT;
  380. break;
  381. }
  382. default:
  383. break;
  384. }
  385. return 0;
  386. }
  387. int mt_afe_set_connection(uint32_t state, uint32_t input, uint32_t output)
  388. {
  389. int connect_bit = 0;
  390. int connect_reg = 0;
  391. pr_debug("%s state = %d input = %d output = %d\n", __func__, state, input, output);
  392. if (input >= HDMI_INTER_CONN_INPUT_BASE || output >= HDMI_INTER_CONN_OUTPUT_BASE)
  393. return set_hdmi_interconnection(state, input, output);
  394. if (unlikely(input >= INTER_CONN_INPUT_NUM || output >= INTER_CONN_OUTPUT_NUM)) {
  395. pr_warn("%s out of bound connection connection_table[%d][%d]\n", __func__, input,
  396. output);
  397. return -1;
  398. }
  399. if (unlikely(connection_table[input][output] < 0 || connection_table[input][output] == 0)) {
  400. pr_warn("%s no connection connection_table[%d][%d] = %d\n",
  401. __func__, input, output, connection_table[input][output]);
  402. return -1;
  403. }
  404. switch (state) {
  405. case INTER_DISCONNECT:
  406. if ((connection_state[input][output] &
  407. INTER_CONNECT) == INTER_CONNECT) {
  408. /* here to disconnect connect bits */
  409. connect_bit = connection_bits[input][output];
  410. connect_reg = connection_reg[input][output];
  411. if (check_bits_and_reg(connect_reg, connect_bit)) {
  412. mt_afe_set_reg(connect_reg, 0 << connect_bit, 1 << connect_bit);
  413. connection_state[input][output] &= ~(INTER_CONNECT);
  414. }
  415. }
  416. if ((connection_state[input][output] &
  417. INTER_CONNECT_SHIFT) == INTER_CONNECT_SHIFT) {
  418. /* here to disconnect connect shift bits */
  419. connect_bit = shift_connection_bits[input][output];
  420. connect_reg = shift_connection_reg[input][output];
  421. if (check_bits_and_reg(connect_reg, connect_bit)) {
  422. mt_afe_set_reg(connect_reg, 0 << connect_bit, 1 << connect_bit);
  423. connection_state[input][output] &= ~(INTER_CONNECT_SHIFT);
  424. }
  425. }
  426. break;
  427. case INTER_CONNECT:
  428. connect_bit = connection_bits[input][output];
  429. connect_reg = connection_reg[input][output];
  430. if (check_bits_and_reg(connect_reg, connect_bit)) {
  431. mt_afe_set_reg(connect_reg, 1 << connect_bit, 1 << connect_bit);
  432. pr_debug("%s set register(0x%x)[%d] to I%u->O%u connection\n",
  433. __func__, connect_reg, connect_bit, input, output);
  434. connection_state[input][output] |= INTER_CONNECT;
  435. }
  436. break;
  437. case INTER_CONNECT_SHIFT:
  438. if ((connection_table[input][output] &
  439. INTER_CONNECT_SHIFT) != INTER_CONNECT_SHIFT) {
  440. pr_warn("%s don't support shift opeartion\n", __func__);
  441. break;
  442. }
  443. connect_bit = shift_connection_bits[input][output];
  444. connect_reg = shift_connection_reg[input][output];
  445. if (check_bits_and_reg(connect_reg, connect_bit)) {
  446. mt_afe_set_reg(connect_reg, 1 << connect_bit, 1 << connect_bit);
  447. connection_state[input][output] |= INTER_CONNECT_SHIFT;
  448. }
  449. break;
  450. default:
  451. pr_warn("%s no this state state = %d\n", __func__, state);
  452. break;
  453. }
  454. return 0;
  455. }