q6routing.c 46 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170
  1. // SPDX-License-Identifier: GPL-2.0
  2. // Copyright (c) 2011-2017, The Linux Foundation. All rights reserved.
  3. // Copyright (c) 2018, Linaro Limited
  4. #include <linux/init.h>
  5. #include <linux/err.h>
  6. #include <linux/module.h>
  7. #include <linux/platform_device.h>
  8. #include <linux/of_platform.h>
  9. #include <linux/bitops.h>
  10. #include <linux/mutex.h>
  11. #include <linux/of_device.h>
  12. #include <linux/slab.h>
  13. #include <sound/core.h>
  14. #include <sound/soc.h>
  15. #include <sound/soc-dapm.h>
  16. #include <sound/pcm.h>
  17. #include <sound/control.h>
  18. #include <sound/asound.h>
  19. #include <sound/pcm_params.h>
  20. #include "q6afe.h"
  21. #include "q6asm.h"
  22. #include "q6adm.h"
  23. #include "q6routing.h"
  24. #define DRV_NAME "q6routing-component"
  25. #define Q6ROUTING_RX_MIXERS(id) \
  26. SOC_SINGLE_EXT("MultiMedia1", id, \
  27. MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,\
  28. msm_routing_put_audio_mixer), \
  29. SOC_SINGLE_EXT("MultiMedia2", id, \
  30. MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer,\
  31. msm_routing_put_audio_mixer), \
  32. SOC_SINGLE_EXT("MultiMedia3", id, \
  33. MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer,\
  34. msm_routing_put_audio_mixer), \
  35. SOC_SINGLE_EXT("MultiMedia4", id, \
  36. MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer,\
  37. msm_routing_put_audio_mixer), \
  38. SOC_SINGLE_EXT("MultiMedia5", id, \
  39. MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer,\
  40. msm_routing_put_audio_mixer), \
  41. SOC_SINGLE_EXT("MultiMedia6", id, \
  42. MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer,\
  43. msm_routing_put_audio_mixer), \
  44. SOC_SINGLE_EXT("MultiMedia7", id, \
  45. MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer,\
  46. msm_routing_put_audio_mixer), \
  47. SOC_SINGLE_EXT("MultiMedia8", id, \
  48. MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer,\
  49. msm_routing_put_audio_mixer),
  50. #define Q6ROUTING_RX_DAPM_ROUTE(mix_name, s) \
  51. { mix_name, "MultiMedia1", "MM_DL1" }, \
  52. { mix_name, "MultiMedia2", "MM_DL2" }, \
  53. { mix_name, "MultiMedia3", "MM_DL3" }, \
  54. { mix_name, "MultiMedia4", "MM_DL4" }, \
  55. { mix_name, "MultiMedia5", "MM_DL5" }, \
  56. { mix_name, "MultiMedia6", "MM_DL6" }, \
  57. { mix_name, "MultiMedia7", "MM_DL7" }, \
  58. { mix_name, "MultiMedia8", "MM_DL8" }, \
  59. { s, NULL, mix_name }
  60. #define Q6ROUTING_TX_DAPM_ROUTE(mix_name) \
  61. { mix_name, "PRI_MI2S_TX", "PRI_MI2S_TX" }, \
  62. { mix_name, "SEC_MI2S_TX", "SEC_MI2S_TX" }, \
  63. { mix_name, "QUAT_MI2S_TX", "QUAT_MI2S_TX" }, \
  64. { mix_name, "QUIN_MI2S_TX", "QUIN_MI2S_TX" }, \
  65. { mix_name, "TERT_MI2S_TX", "TERT_MI2S_TX" }, \
  66. { mix_name, "SLIMBUS_0_TX", "SLIMBUS_0_TX" }, \
  67. { mix_name, "SLIMBUS_1_TX", "SLIMBUS_1_TX" }, \
  68. { mix_name, "SLIMBUS_2_TX", "SLIMBUS_2_TX" }, \
  69. { mix_name, "SLIMBUS_3_TX", "SLIMBUS_3_TX" }, \
  70. { mix_name, "SLIMBUS_4_TX", "SLIMBUS_4_TX" }, \
  71. { mix_name, "SLIMBUS_5_TX", "SLIMBUS_5_TX" }, \
  72. { mix_name, "SLIMBUS_6_TX", "SLIMBUS_6_TX" }, \
  73. { mix_name, "PRIMARY_TDM_TX_0", "PRIMARY_TDM_TX_0"}, \
  74. { mix_name, "PRIMARY_TDM_TX_1", "PRIMARY_TDM_TX_1"}, \
  75. { mix_name, "PRIMARY_TDM_TX_2", "PRIMARY_TDM_TX_2"}, \
  76. { mix_name, "PRIMARY_TDM_TX_3", "PRIMARY_TDM_TX_3"}, \
  77. { mix_name, "PRIMARY_TDM_TX_4", "PRIMARY_TDM_TX_4"}, \
  78. { mix_name, "PRIMARY_TDM_TX_5", "PRIMARY_TDM_TX_5"}, \
  79. { mix_name, "PRIMARY_TDM_TX_6", "PRIMARY_TDM_TX_6"}, \
  80. { mix_name, "PRIMARY_TDM_TX_7", "PRIMARY_TDM_TX_7"}, \
  81. { mix_name, "SEC_TDM_TX_0", "SEC_TDM_TX_0"}, \
  82. { mix_name, "SEC_TDM_TX_1", "SEC_TDM_TX_1"}, \
  83. { mix_name, "SEC_TDM_TX_2", "SEC_TDM_TX_2"}, \
  84. { mix_name, "SEC_TDM_TX_3", "SEC_TDM_TX_3"}, \
  85. { mix_name, "SEC_TDM_TX_4", "SEC_TDM_TX_4"}, \
  86. { mix_name, "SEC_TDM_TX_5", "SEC_TDM_TX_5"}, \
  87. { mix_name, "SEC_TDM_TX_6", "SEC_TDM_TX_6"}, \
  88. { mix_name, "SEC_TDM_TX_7", "SEC_TDM_TX_7"}, \
  89. { mix_name, "TERT_TDM_TX_0", "TERT_TDM_TX_0"}, \
  90. { mix_name, "TERT_TDM_TX_1", "TERT_TDM_TX_1"}, \
  91. { mix_name, "TERT_TDM_TX_2", "TERT_TDM_TX_2"}, \
  92. { mix_name, "TERT_TDM_TX_3", "TERT_TDM_TX_3"}, \
  93. { mix_name, "TERT_TDM_TX_4", "TERT_TDM_TX_4"}, \
  94. { mix_name, "TERT_TDM_TX_5", "TERT_TDM_TX_5"}, \
  95. { mix_name, "TERT_TDM_TX_6", "TERT_TDM_TX_6"}, \
  96. { mix_name, "TERT_TDM_TX_7", "TERT_TDM_TX_7"}, \
  97. { mix_name, "QUAT_TDM_TX_0", "QUAT_TDM_TX_0"}, \
  98. { mix_name, "QUAT_TDM_TX_1", "QUAT_TDM_TX_1"}, \
  99. { mix_name, "QUAT_TDM_TX_2", "QUAT_TDM_TX_2"}, \
  100. { mix_name, "QUAT_TDM_TX_3", "QUAT_TDM_TX_3"}, \
  101. { mix_name, "QUAT_TDM_TX_4", "QUAT_TDM_TX_4"}, \
  102. { mix_name, "QUAT_TDM_TX_5", "QUAT_TDM_TX_5"}, \
  103. { mix_name, "QUAT_TDM_TX_6", "QUAT_TDM_TX_6"}, \
  104. { mix_name, "QUAT_TDM_TX_7", "QUAT_TDM_TX_7"}, \
  105. { mix_name, "QUIN_TDM_TX_0", "QUIN_TDM_TX_0"}, \
  106. { mix_name, "QUIN_TDM_TX_1", "QUIN_TDM_TX_1"}, \
  107. { mix_name, "QUIN_TDM_TX_2", "QUIN_TDM_TX_2"}, \
  108. { mix_name, "QUIN_TDM_TX_3", "QUIN_TDM_TX_3"}, \
  109. { mix_name, "QUIN_TDM_TX_4", "QUIN_TDM_TX_4"}, \
  110. { mix_name, "QUIN_TDM_TX_5", "QUIN_TDM_TX_5"}, \
  111. { mix_name, "QUIN_TDM_TX_6", "QUIN_TDM_TX_6"}, \
  112. { mix_name, "QUIN_TDM_TX_7", "QUIN_TDM_TX_7"}, \
  113. { mix_name, "WSA_CODEC_DMA_TX_0", "WSA_CODEC_DMA_TX_0"}, \
  114. { mix_name, "WSA_CODEC_DMA_TX_1", "WSA_CODEC_DMA_TX_1"}, \
  115. { mix_name, "WSA_CODEC_DMA_TX_2", "WSA_CODEC_DMA_TX_2"}, \
  116. { mix_name, "VA_CODEC_DMA_TX_0", "VA_CODEC_DMA_TX_0"}, \
  117. { mix_name, "VA_CODEC_DMA_TX_1", "VA_CODEC_DMA_TX_1"}, \
  118. { mix_name, "VA_CODEC_DMA_TX_2", "VA_CODEC_DMA_TX_2"}, \
  119. { mix_name, "TX_CODEC_DMA_TX_0", "TX_CODEC_DMA_TX_0"}, \
  120. { mix_name, "TX_CODEC_DMA_TX_1", "TX_CODEC_DMA_TX_1"}, \
  121. { mix_name, "TX_CODEC_DMA_TX_2", "TX_CODEC_DMA_TX_2"}, \
  122. { mix_name, "TX_CODEC_DMA_TX_3", "TX_CODEC_DMA_TX_3"}, \
  123. { mix_name, "TX_CODEC_DMA_TX_4", "TX_CODEC_DMA_TX_4"}, \
  124. { mix_name, "TX_CODEC_DMA_TX_5", "TX_CODEC_DMA_TX_5"}
  125. #define Q6ROUTING_TX_MIXERS(id) \
  126. SOC_SINGLE_EXT("PRI_MI2S_TX", PRIMARY_MI2S_TX, \
  127. id, 1, 0, msm_routing_get_audio_mixer, \
  128. msm_routing_put_audio_mixer), \
  129. SOC_SINGLE_EXT("SEC_MI2S_TX", SECONDARY_MI2S_TX, \
  130. id, 1, 0, msm_routing_get_audio_mixer, \
  131. msm_routing_put_audio_mixer), \
  132. SOC_SINGLE_EXT("TERT_MI2S_TX", TERTIARY_MI2S_TX, \
  133. id, 1, 0, msm_routing_get_audio_mixer, \
  134. msm_routing_put_audio_mixer), \
  135. SOC_SINGLE_EXT("QUAT_MI2S_TX", QUATERNARY_MI2S_TX, \
  136. id, 1, 0, msm_routing_get_audio_mixer, \
  137. msm_routing_put_audio_mixer), \
  138. SOC_SINGLE_EXT("QUIN_MI2S_TX", QUINARY_MI2S_TX, \
  139. id, 1, 0, msm_routing_get_audio_mixer, \
  140. msm_routing_put_audio_mixer), \
  141. SOC_SINGLE_EXT("SLIMBUS_0_TX", SLIMBUS_0_TX, \
  142. id, 1, 0, msm_routing_get_audio_mixer, \
  143. msm_routing_put_audio_mixer), \
  144. SOC_SINGLE_EXT("SLIMBUS_1_TX", SLIMBUS_1_TX, \
  145. id, 1, 0, msm_routing_get_audio_mixer, \
  146. msm_routing_put_audio_mixer), \
  147. SOC_SINGLE_EXT("SLIMBUS_2_TX", SLIMBUS_2_TX, \
  148. id, 1, 0, msm_routing_get_audio_mixer, \
  149. msm_routing_put_audio_mixer), \
  150. SOC_SINGLE_EXT("SLIMBUS_3_TX", SLIMBUS_3_TX, \
  151. id, 1, 0, msm_routing_get_audio_mixer, \
  152. msm_routing_put_audio_mixer), \
  153. SOC_SINGLE_EXT("SLIMBUS_4_TX", SLIMBUS_4_TX, \
  154. id, 1, 0, msm_routing_get_audio_mixer, \
  155. msm_routing_put_audio_mixer), \
  156. SOC_SINGLE_EXT("SLIMBUS_5_TX", SLIMBUS_5_TX, \
  157. id, 1, 0, msm_routing_get_audio_mixer, \
  158. msm_routing_put_audio_mixer), \
  159. SOC_SINGLE_EXT("SLIMBUS_6_TX", SLIMBUS_6_TX, \
  160. id, 1, 0, msm_routing_get_audio_mixer, \
  161. msm_routing_put_audio_mixer), \
  162. SOC_SINGLE_EXT("PRIMARY_TDM_TX_0", PRIMARY_TDM_TX_0, \
  163. id, 1, 0, msm_routing_get_audio_mixer, \
  164. msm_routing_put_audio_mixer), \
  165. SOC_SINGLE_EXT("PRIMARY_TDM_TX_1", PRIMARY_TDM_TX_1, \
  166. id, 1, 0, msm_routing_get_audio_mixer, \
  167. msm_routing_put_audio_mixer), \
  168. SOC_SINGLE_EXT("PRIMARY_TDM_TX_2", PRIMARY_TDM_TX_2, \
  169. id, 1, 0, msm_routing_get_audio_mixer, \
  170. msm_routing_put_audio_mixer), \
  171. SOC_SINGLE_EXT("PRIMARY_TDM_TX_3", PRIMARY_TDM_TX_3, \
  172. id, 1, 0, msm_routing_get_audio_mixer, \
  173. msm_routing_put_audio_mixer), \
  174. SOC_SINGLE_EXT("PRIMARY_TDM_TX_4", PRIMARY_TDM_TX_4, \
  175. id, 1, 0, msm_routing_get_audio_mixer, \
  176. msm_routing_put_audio_mixer), \
  177. SOC_SINGLE_EXT("PRIMARY_TDM_TX_5", PRIMARY_TDM_TX_5, \
  178. id, 1, 0, msm_routing_get_audio_mixer, \
  179. msm_routing_put_audio_mixer), \
  180. SOC_SINGLE_EXT("PRIMARY_TDM_TX_6", PRIMARY_TDM_TX_6, \
  181. id, 1, 0, msm_routing_get_audio_mixer, \
  182. msm_routing_put_audio_mixer), \
  183. SOC_SINGLE_EXT("PRIMARY_TDM_TX_7", PRIMARY_TDM_TX_7, \
  184. id, 1, 0, msm_routing_get_audio_mixer, \
  185. msm_routing_put_audio_mixer), \
  186. SOC_SINGLE_EXT("SEC_TDM_TX_0", SECONDARY_TDM_TX_0, \
  187. id, 1, 0, msm_routing_get_audio_mixer, \
  188. msm_routing_put_audio_mixer), \
  189. SOC_SINGLE_EXT("SEC_TDM_TX_1", SECONDARY_TDM_TX_1, \
  190. id, 1, 0, msm_routing_get_audio_mixer, \
  191. msm_routing_put_audio_mixer), \
  192. SOC_SINGLE_EXT("SEC_TDM_TX_2", SECONDARY_TDM_TX_2, \
  193. id, 1, 0, msm_routing_get_audio_mixer, \
  194. msm_routing_put_audio_mixer), \
  195. SOC_SINGLE_EXT("SEC_TDM_TX_3", SECONDARY_TDM_TX_3, \
  196. id, 1, 0, msm_routing_get_audio_mixer, \
  197. msm_routing_put_audio_mixer), \
  198. SOC_SINGLE_EXT("SEC_TDM_TX_4", SECONDARY_TDM_TX_4, \
  199. id, 1, 0, msm_routing_get_audio_mixer, \
  200. msm_routing_put_audio_mixer), \
  201. SOC_SINGLE_EXT("SEC_TDM_TX_5", SECONDARY_TDM_TX_5, \
  202. id, 1, 0, msm_routing_get_audio_mixer, \
  203. msm_routing_put_audio_mixer), \
  204. SOC_SINGLE_EXT("SEC_TDM_TX_6", SECONDARY_TDM_TX_6, \
  205. id, 1, 0, msm_routing_get_audio_mixer, \
  206. msm_routing_put_audio_mixer), \
  207. SOC_SINGLE_EXT("SEC_TDM_TX_7", SECONDARY_TDM_TX_7, \
  208. id, 1, 0, msm_routing_get_audio_mixer, \
  209. msm_routing_put_audio_mixer), \
  210. SOC_SINGLE_EXT("TERT_TDM_TX_0", TERTIARY_TDM_TX_0, \
  211. id, 1, 0, msm_routing_get_audio_mixer, \
  212. msm_routing_put_audio_mixer), \
  213. SOC_SINGLE_EXT("TERT_TDM_TX_1", TERTIARY_TDM_TX_1, \
  214. id, 1, 0, msm_routing_get_audio_mixer, \
  215. msm_routing_put_audio_mixer), \
  216. SOC_SINGLE_EXT("TERT_TDM_TX_2", TERTIARY_TDM_TX_2, \
  217. id, 1, 0, msm_routing_get_audio_mixer, \
  218. msm_routing_put_audio_mixer), \
  219. SOC_SINGLE_EXT("TERT_TDM_TX_3", TERTIARY_TDM_TX_3, \
  220. id, 1, 0, msm_routing_get_audio_mixer, \
  221. msm_routing_put_audio_mixer), \
  222. SOC_SINGLE_EXT("TERT_TDM_TX_4", TERTIARY_TDM_TX_4, \
  223. id, 1, 0, msm_routing_get_audio_mixer, \
  224. msm_routing_put_audio_mixer), \
  225. SOC_SINGLE_EXT("TERT_TDM_TX_5", TERTIARY_TDM_TX_5, \
  226. id, 1, 0, msm_routing_get_audio_mixer, \
  227. msm_routing_put_audio_mixer), \
  228. SOC_SINGLE_EXT("TERT_TDM_TX_6", TERTIARY_TDM_TX_6, \
  229. id, 1, 0, msm_routing_get_audio_mixer, \
  230. msm_routing_put_audio_mixer), \
  231. SOC_SINGLE_EXT("TERT_TDM_TX_7", TERTIARY_TDM_TX_7, \
  232. id, 1, 0, msm_routing_get_audio_mixer, \
  233. msm_routing_put_audio_mixer), \
  234. SOC_SINGLE_EXT("QUAT_TDM_TX_0", QUATERNARY_TDM_TX_0, \
  235. id, 1, 0, msm_routing_get_audio_mixer, \
  236. msm_routing_put_audio_mixer), \
  237. SOC_SINGLE_EXT("QUAT_TDM_TX_1", QUATERNARY_TDM_TX_1, \
  238. id, 1, 0, msm_routing_get_audio_mixer, \
  239. msm_routing_put_audio_mixer), \
  240. SOC_SINGLE_EXT("QUAT_TDM_TX_2", QUATERNARY_TDM_TX_2, \
  241. id, 1, 0, msm_routing_get_audio_mixer, \
  242. msm_routing_put_audio_mixer), \
  243. SOC_SINGLE_EXT("QUAT_TDM_TX_3", QUATERNARY_TDM_TX_3, \
  244. id, 1, 0, msm_routing_get_audio_mixer, \
  245. msm_routing_put_audio_mixer), \
  246. SOC_SINGLE_EXT("QUAT_TDM_TX_4", QUATERNARY_TDM_TX_4, \
  247. id, 1, 0, msm_routing_get_audio_mixer, \
  248. msm_routing_put_audio_mixer), \
  249. SOC_SINGLE_EXT("QUAT_TDM_TX_5", QUATERNARY_TDM_TX_5, \
  250. id, 1, 0, msm_routing_get_audio_mixer, \
  251. msm_routing_put_audio_mixer), \
  252. SOC_SINGLE_EXT("QUAT_TDM_TX_6", QUATERNARY_TDM_TX_6, \
  253. id, 1, 0, msm_routing_get_audio_mixer, \
  254. msm_routing_put_audio_mixer), \
  255. SOC_SINGLE_EXT("QUAT_TDM_TX_7", QUATERNARY_TDM_TX_7, \
  256. id, 1, 0, msm_routing_get_audio_mixer, \
  257. msm_routing_put_audio_mixer), \
  258. SOC_SINGLE_EXT("QUIN_TDM_TX_0", QUINARY_TDM_TX_0, \
  259. id, 1, 0, msm_routing_get_audio_mixer, \
  260. msm_routing_put_audio_mixer), \
  261. SOC_SINGLE_EXT("QUIN_TDM_TX_1", QUINARY_TDM_TX_1, \
  262. id, 1, 0, msm_routing_get_audio_mixer, \
  263. msm_routing_put_audio_mixer), \
  264. SOC_SINGLE_EXT("QUIN_TDM_TX_2", QUINARY_TDM_TX_2, \
  265. id, 1, 0, msm_routing_get_audio_mixer, \
  266. msm_routing_put_audio_mixer), \
  267. SOC_SINGLE_EXT("QUIN_TDM_TX_3", QUINARY_TDM_TX_3, \
  268. id, 1, 0, msm_routing_get_audio_mixer, \
  269. msm_routing_put_audio_mixer), \
  270. SOC_SINGLE_EXT("QUIN_TDM_TX_4", QUINARY_TDM_TX_4, \
  271. id, 1, 0, msm_routing_get_audio_mixer, \
  272. msm_routing_put_audio_mixer), \
  273. SOC_SINGLE_EXT("QUIN_TDM_TX_5", QUINARY_TDM_TX_5, \
  274. id, 1, 0, msm_routing_get_audio_mixer, \
  275. msm_routing_put_audio_mixer), \
  276. SOC_SINGLE_EXT("QUIN_TDM_TX_6", QUINARY_TDM_TX_6, \
  277. id, 1, 0, msm_routing_get_audio_mixer, \
  278. msm_routing_put_audio_mixer), \
  279. SOC_SINGLE_EXT("QUIN_TDM_TX_7", QUINARY_TDM_TX_7, \
  280. id, 1, 0, msm_routing_get_audio_mixer, \
  281. msm_routing_put_audio_mixer), \
  282. SOC_SINGLE_EXT("WSA_CODEC_DMA_TX_0", WSA_CODEC_DMA_TX_0, \
  283. id, 1, 0, msm_routing_get_audio_mixer, \
  284. msm_routing_put_audio_mixer), \
  285. SOC_SINGLE_EXT("WSA_CODEC_DMA_TX_1", WSA_CODEC_DMA_TX_1, \
  286. id, 1, 0, msm_routing_get_audio_mixer, \
  287. msm_routing_put_audio_mixer), \
  288. SOC_SINGLE_EXT("WSA_CODEC_DMA_TX_2", WSA_CODEC_DMA_TX_2, \
  289. id, 1, 0, msm_routing_get_audio_mixer, \
  290. msm_routing_put_audio_mixer), \
  291. SOC_SINGLE_EXT("VA_CODEC_DMA_TX_0", VA_CODEC_DMA_TX_0, \
  292. id, 1, 0, msm_routing_get_audio_mixer, \
  293. msm_routing_put_audio_mixer), \
  294. SOC_SINGLE_EXT("VA_CODEC_DMA_TX_1", VA_CODEC_DMA_TX_1, \
  295. id, 1, 0, msm_routing_get_audio_mixer, \
  296. msm_routing_put_audio_mixer), \
  297. SOC_SINGLE_EXT("VA_CODEC_DMA_TX_2", VA_CODEC_DMA_TX_2, \
  298. id, 1, 0, msm_routing_get_audio_mixer, \
  299. msm_routing_put_audio_mixer), \
  300. SOC_SINGLE_EXT("TX_CODEC_DMA_TX_0", TX_CODEC_DMA_TX_0, \
  301. id, 1, 0, msm_routing_get_audio_mixer, \
  302. msm_routing_put_audio_mixer), \
  303. SOC_SINGLE_EXT("TX_CODEC_DMA_TX_1", TX_CODEC_DMA_TX_1, \
  304. id, 1, 0, msm_routing_get_audio_mixer, \
  305. msm_routing_put_audio_mixer), \
  306. SOC_SINGLE_EXT("TX_CODEC_DMA_TX_2", TX_CODEC_DMA_TX_2, \
  307. id, 1, 0, msm_routing_get_audio_mixer, \
  308. msm_routing_put_audio_mixer), \
  309. SOC_SINGLE_EXT("TX_CODEC_DMA_TX_3", TX_CODEC_DMA_TX_3, \
  310. id, 1, 0, msm_routing_get_audio_mixer, \
  311. msm_routing_put_audio_mixer), \
  312. SOC_SINGLE_EXT("TX_CODEC_DMA_TX_4", TX_CODEC_DMA_TX_4, \
  313. id, 1, 0, msm_routing_get_audio_mixer, \
  314. msm_routing_put_audio_mixer), \
  315. SOC_SINGLE_EXT("TX_CODEC_DMA_TX_5", TX_CODEC_DMA_TX_5, \
  316. id, 1, 0, msm_routing_get_audio_mixer, \
  317. msm_routing_put_audio_mixer),
  318. struct session_data {
  319. int state;
  320. int port_id;
  321. int path_type;
  322. int app_type;
  323. int acdb_id;
  324. int sample_rate;
  325. int bits_per_sample;
  326. int channels;
  327. int perf_mode;
  328. int numcopps;
  329. int fedai_id;
  330. unsigned long copp_map;
  331. struct q6copp *copps[MAX_COPPS_PER_PORT];
  332. };
  333. struct msm_routing_data {
  334. struct session_data sessions[MAX_SESSIONS];
  335. struct session_data port_data[AFE_MAX_PORTS];
  336. struct device *dev;
  337. struct mutex lock;
  338. };
  339. static struct msm_routing_data *routing_data;
  340. /**
  341. * q6routing_stream_open() - Register a new stream for route setup
  342. *
  343. * @fedai_id: Frontend dai id.
  344. * @perf_mode: Performance mode.
  345. * @stream_id: ASM stream id to map.
  346. * @stream_type: Direction of stream
  347. *
  348. * Return: Will be an negative on error or a zero on success.
  349. */
  350. int q6routing_stream_open(int fedai_id, int perf_mode,
  351. int stream_id, int stream_type)
  352. {
  353. int j, topology, num_copps = 0;
  354. struct route_payload payload;
  355. struct q6copp *copp;
  356. int copp_idx;
  357. struct session_data *session, *pdata;
  358. if (!routing_data) {
  359. pr_err("Routing driver not yet ready\n");
  360. return -EINVAL;
  361. }
  362. session = &routing_data->sessions[stream_id - 1];
  363. if (session->port_id < 0) {
  364. dev_err(routing_data->dev, "Routing not setup for MultiMedia%d Session\n",
  365. session->fedai_id);
  366. return -EINVAL;
  367. }
  368. pdata = &routing_data->port_data[session->port_id];
  369. mutex_lock(&routing_data->lock);
  370. session->fedai_id = fedai_id;
  371. session->path_type = pdata->path_type;
  372. session->sample_rate = pdata->sample_rate;
  373. session->channels = pdata->channels;
  374. session->bits_per_sample = pdata->bits_per_sample;
  375. payload.num_copps = 0; /* only RX needs to use payload */
  376. topology = NULL_COPP_TOPOLOGY;
  377. copp = q6adm_open(routing_data->dev, session->port_id,
  378. session->path_type, session->sample_rate,
  379. session->channels, topology, perf_mode,
  380. session->bits_per_sample, 0, 0);
  381. if (IS_ERR_OR_NULL(copp)) {
  382. mutex_unlock(&routing_data->lock);
  383. return -EINVAL;
  384. }
  385. copp_idx = q6adm_get_copp_id(copp);
  386. set_bit(copp_idx, &session->copp_map);
  387. session->copps[copp_idx] = copp;
  388. for_each_set_bit(j, &session->copp_map, MAX_COPPS_PER_PORT) {
  389. payload.port_id[num_copps] = session->port_id;
  390. payload.copp_idx[num_copps] = j;
  391. num_copps++;
  392. }
  393. if (num_copps) {
  394. payload.num_copps = num_copps;
  395. payload.session_id = stream_id;
  396. q6adm_matrix_map(routing_data->dev, session->path_type,
  397. payload, perf_mode);
  398. }
  399. mutex_unlock(&routing_data->lock);
  400. return 0;
  401. }
  402. EXPORT_SYMBOL_GPL(q6routing_stream_open);
  403. static struct session_data *get_session_from_id(struct msm_routing_data *data,
  404. int fedai_id)
  405. {
  406. int i;
  407. for (i = 0; i < MAX_SESSIONS; i++) {
  408. if (fedai_id == data->sessions[i].fedai_id)
  409. return &data->sessions[i];
  410. }
  411. return NULL;
  412. }
  413. /**
  414. * q6routing_stream_close() - Deregister a stream
  415. *
  416. * @fedai_id: Frontend dai id.
  417. * @stream_type: Direction of stream
  418. *
  419. * Return: Will be an negative on error or a zero on success.
  420. */
  421. void q6routing_stream_close(int fedai_id, int stream_type)
  422. {
  423. struct session_data *session;
  424. int idx;
  425. session = get_session_from_id(routing_data, fedai_id);
  426. if (!session)
  427. return;
  428. for_each_set_bit(idx, &session->copp_map, MAX_COPPS_PER_PORT) {
  429. if (session->copps[idx]) {
  430. q6adm_close(routing_data->dev, session->copps[idx]);
  431. session->copps[idx] = NULL;
  432. }
  433. }
  434. session->fedai_id = -1;
  435. session->copp_map = 0;
  436. }
  437. EXPORT_SYMBOL_GPL(q6routing_stream_close);
  438. static int msm_routing_get_audio_mixer(struct snd_kcontrol *kcontrol,
  439. struct snd_ctl_elem_value *ucontrol)
  440. {
  441. struct snd_soc_dapm_context *dapm =
  442. snd_soc_dapm_kcontrol_dapm(kcontrol);
  443. struct soc_mixer_control *mc =
  444. (struct soc_mixer_control *)kcontrol->private_value;
  445. int session_id = mc->shift;
  446. struct snd_soc_component *c = snd_soc_dapm_to_component(dapm);
  447. struct msm_routing_data *priv = dev_get_drvdata(c->dev);
  448. struct session_data *session = &priv->sessions[session_id];
  449. if (session->port_id == mc->reg)
  450. ucontrol->value.integer.value[0] = 1;
  451. else
  452. ucontrol->value.integer.value[0] = 0;
  453. return 0;
  454. }
  455. static int msm_routing_put_audio_mixer(struct snd_kcontrol *kcontrol,
  456. struct snd_ctl_elem_value *ucontrol)
  457. {
  458. struct snd_soc_dapm_context *dapm =
  459. snd_soc_dapm_kcontrol_dapm(kcontrol);
  460. struct snd_soc_component *c = snd_soc_dapm_to_component(dapm);
  461. struct msm_routing_data *data = dev_get_drvdata(c->dev);
  462. struct soc_mixer_control *mc =
  463. (struct soc_mixer_control *)kcontrol->private_value;
  464. struct snd_soc_dapm_update *update = NULL;
  465. int be_id = mc->reg;
  466. int session_id = mc->shift;
  467. struct session_data *session = &data->sessions[session_id];
  468. if (ucontrol->value.integer.value[0]) {
  469. if (session->port_id == be_id)
  470. return 0;
  471. session->port_id = be_id;
  472. snd_soc_dapm_mixer_update_power(dapm, kcontrol, 1, update);
  473. } else {
  474. if (session->port_id == -1 || session->port_id != be_id)
  475. return 0;
  476. session->port_id = -1;
  477. snd_soc_dapm_mixer_update_power(dapm, kcontrol, 0, update);
  478. }
  479. return 1;
  480. }
  481. static const struct snd_kcontrol_new hdmi_mixer_controls[] = {
  482. Q6ROUTING_RX_MIXERS(HDMI_RX) };
  483. static const struct snd_kcontrol_new display_port_mixer_controls[] = {
  484. Q6ROUTING_RX_MIXERS(DISPLAY_PORT_RX) };
  485. static const struct snd_kcontrol_new primary_mi2s_rx_mixer_controls[] = {
  486. Q6ROUTING_RX_MIXERS(PRIMARY_MI2S_RX) };
  487. static const struct snd_kcontrol_new secondary_mi2s_rx_mixer_controls[] = {
  488. Q6ROUTING_RX_MIXERS(SECONDARY_MI2S_RX) };
  489. static const struct snd_kcontrol_new quaternary_mi2s_rx_mixer_controls[] = {
  490. Q6ROUTING_RX_MIXERS(QUATERNARY_MI2S_RX) };
  491. static const struct snd_kcontrol_new quinary_mi2s_rx_mixer_controls[] = {
  492. Q6ROUTING_RX_MIXERS(QUINARY_MI2S_RX) };
  493. static const struct snd_kcontrol_new tertiary_mi2s_rx_mixer_controls[] = {
  494. Q6ROUTING_RX_MIXERS(TERTIARY_MI2S_RX) };
  495. static const struct snd_kcontrol_new slimbus_rx_mixer_controls[] = {
  496. Q6ROUTING_RX_MIXERS(SLIMBUS_0_RX) };
  497. static const struct snd_kcontrol_new slimbus_1_rx_mixer_controls[] = {
  498. Q6ROUTING_RX_MIXERS(SLIMBUS_1_RX) };
  499. static const struct snd_kcontrol_new slimbus_2_rx_mixer_controls[] = {
  500. Q6ROUTING_RX_MIXERS(SLIMBUS_2_RX) };
  501. static const struct snd_kcontrol_new slimbus_3_rx_mixer_controls[] = {
  502. Q6ROUTING_RX_MIXERS(SLIMBUS_3_RX) };
  503. static const struct snd_kcontrol_new slimbus_4_rx_mixer_controls[] = {
  504. Q6ROUTING_RX_MIXERS(SLIMBUS_4_RX) };
  505. static const struct snd_kcontrol_new slimbus_5_rx_mixer_controls[] = {
  506. Q6ROUTING_RX_MIXERS(SLIMBUS_5_RX) };
  507. static const struct snd_kcontrol_new slimbus_6_rx_mixer_controls[] = {
  508. Q6ROUTING_RX_MIXERS(SLIMBUS_6_RX) };
  509. static const struct snd_kcontrol_new pri_tdm_rx_0_mixer_controls[] = {
  510. Q6ROUTING_RX_MIXERS(PRIMARY_TDM_RX_0) };
  511. static const struct snd_kcontrol_new pri_tdm_rx_1_mixer_controls[] = {
  512. Q6ROUTING_RX_MIXERS(PRIMARY_TDM_RX_1) };
  513. static const struct snd_kcontrol_new pri_tdm_rx_2_mixer_controls[] = {
  514. Q6ROUTING_RX_MIXERS(PRIMARY_TDM_RX_2) };
  515. static const struct snd_kcontrol_new pri_tdm_rx_3_mixer_controls[] = {
  516. Q6ROUTING_RX_MIXERS(PRIMARY_TDM_RX_3) };
  517. static const struct snd_kcontrol_new pri_tdm_rx_4_mixer_controls[] = {
  518. Q6ROUTING_RX_MIXERS(PRIMARY_TDM_RX_4) };
  519. static const struct snd_kcontrol_new pri_tdm_rx_5_mixer_controls[] = {
  520. Q6ROUTING_RX_MIXERS(PRIMARY_TDM_RX_5) };
  521. static const struct snd_kcontrol_new pri_tdm_rx_6_mixer_controls[] = {
  522. Q6ROUTING_RX_MIXERS(PRIMARY_TDM_RX_6) };
  523. static const struct snd_kcontrol_new pri_tdm_rx_7_mixer_controls[] = {
  524. Q6ROUTING_RX_MIXERS(PRIMARY_TDM_RX_7) };
  525. static const struct snd_kcontrol_new sec_tdm_rx_0_mixer_controls[] = {
  526. Q6ROUTING_RX_MIXERS(SECONDARY_TDM_RX_0) };
  527. static const struct snd_kcontrol_new sec_tdm_rx_1_mixer_controls[] = {
  528. Q6ROUTING_RX_MIXERS(SECONDARY_TDM_RX_1) };
  529. static const struct snd_kcontrol_new sec_tdm_rx_2_mixer_controls[] = {
  530. Q6ROUTING_RX_MIXERS(SECONDARY_TDM_RX_2) };
  531. static const struct snd_kcontrol_new sec_tdm_rx_3_mixer_controls[] = {
  532. Q6ROUTING_RX_MIXERS(SECONDARY_TDM_RX_3) };
  533. static const struct snd_kcontrol_new sec_tdm_rx_4_mixer_controls[] = {
  534. Q6ROUTING_RX_MIXERS(SECONDARY_TDM_RX_4) };
  535. static const struct snd_kcontrol_new sec_tdm_rx_5_mixer_controls[] = {
  536. Q6ROUTING_RX_MIXERS(SECONDARY_TDM_RX_5) };
  537. static const struct snd_kcontrol_new sec_tdm_rx_6_mixer_controls[] = {
  538. Q6ROUTING_RX_MIXERS(SECONDARY_TDM_RX_6) };
  539. static const struct snd_kcontrol_new sec_tdm_rx_7_mixer_controls[] = {
  540. Q6ROUTING_RX_MIXERS(SECONDARY_TDM_RX_7) };
  541. static const struct snd_kcontrol_new tert_tdm_rx_0_mixer_controls[] = {
  542. Q6ROUTING_RX_MIXERS(TERTIARY_TDM_RX_0) };
  543. static const struct snd_kcontrol_new tert_tdm_rx_1_mixer_controls[] = {
  544. Q6ROUTING_RX_MIXERS(TERTIARY_TDM_RX_1) };
  545. static const struct snd_kcontrol_new tert_tdm_rx_2_mixer_controls[] = {
  546. Q6ROUTING_RX_MIXERS(TERTIARY_TDM_RX_2) };
  547. static const struct snd_kcontrol_new tert_tdm_rx_3_mixer_controls[] = {
  548. Q6ROUTING_RX_MIXERS(TERTIARY_TDM_RX_3) };
  549. static const struct snd_kcontrol_new tert_tdm_rx_4_mixer_controls[] = {
  550. Q6ROUTING_RX_MIXERS(TERTIARY_TDM_RX_4) };
  551. static const struct snd_kcontrol_new tert_tdm_rx_5_mixer_controls[] = {
  552. Q6ROUTING_RX_MIXERS(TERTIARY_TDM_RX_5) };
  553. static const struct snd_kcontrol_new tert_tdm_rx_6_mixer_controls[] = {
  554. Q6ROUTING_RX_MIXERS(TERTIARY_TDM_RX_6) };
  555. static const struct snd_kcontrol_new tert_tdm_rx_7_mixer_controls[] = {
  556. Q6ROUTING_RX_MIXERS(TERTIARY_TDM_RX_7) };
  557. static const struct snd_kcontrol_new quat_tdm_rx_0_mixer_controls[] = {
  558. Q6ROUTING_RX_MIXERS(QUATERNARY_TDM_RX_0) };
  559. static const struct snd_kcontrol_new quat_tdm_rx_1_mixer_controls[] = {
  560. Q6ROUTING_RX_MIXERS(QUATERNARY_TDM_RX_1) };
  561. static const struct snd_kcontrol_new quat_tdm_rx_2_mixer_controls[] = {
  562. Q6ROUTING_RX_MIXERS(QUATERNARY_TDM_RX_2) };
  563. static const struct snd_kcontrol_new quat_tdm_rx_3_mixer_controls[] = {
  564. Q6ROUTING_RX_MIXERS(QUATERNARY_TDM_RX_3) };
  565. static const struct snd_kcontrol_new quat_tdm_rx_4_mixer_controls[] = {
  566. Q6ROUTING_RX_MIXERS(QUATERNARY_TDM_RX_4) };
  567. static const struct snd_kcontrol_new quat_tdm_rx_5_mixer_controls[] = {
  568. Q6ROUTING_RX_MIXERS(QUATERNARY_TDM_RX_5) };
  569. static const struct snd_kcontrol_new quat_tdm_rx_6_mixer_controls[] = {
  570. Q6ROUTING_RX_MIXERS(QUATERNARY_TDM_RX_6) };
  571. static const struct snd_kcontrol_new quat_tdm_rx_7_mixer_controls[] = {
  572. Q6ROUTING_RX_MIXERS(QUATERNARY_TDM_RX_7) };
  573. static const struct snd_kcontrol_new quin_tdm_rx_0_mixer_controls[] = {
  574. Q6ROUTING_RX_MIXERS(QUINARY_TDM_RX_0) };
  575. static const struct snd_kcontrol_new quin_tdm_rx_1_mixer_controls[] = {
  576. Q6ROUTING_RX_MIXERS(QUINARY_TDM_RX_1) };
  577. static const struct snd_kcontrol_new quin_tdm_rx_2_mixer_controls[] = {
  578. Q6ROUTING_RX_MIXERS(QUINARY_TDM_RX_2) };
  579. static const struct snd_kcontrol_new quin_tdm_rx_3_mixer_controls[] = {
  580. Q6ROUTING_RX_MIXERS(QUINARY_TDM_RX_3) };
  581. static const struct snd_kcontrol_new quin_tdm_rx_4_mixer_controls[] = {
  582. Q6ROUTING_RX_MIXERS(QUINARY_TDM_RX_4) };
  583. static const struct snd_kcontrol_new quin_tdm_rx_5_mixer_controls[] = {
  584. Q6ROUTING_RX_MIXERS(QUINARY_TDM_RX_5) };
  585. static const struct snd_kcontrol_new quin_tdm_rx_6_mixer_controls[] = {
  586. Q6ROUTING_RX_MIXERS(QUINARY_TDM_RX_6) };
  587. static const struct snd_kcontrol_new quin_tdm_rx_7_mixer_controls[] = {
  588. Q6ROUTING_RX_MIXERS(QUINARY_TDM_RX_7) };
  589. static const struct snd_kcontrol_new wsa_codec_dma_rx_0_mixer_controls[] = {
  590. Q6ROUTING_RX_MIXERS(WSA_CODEC_DMA_RX_0) };
  591. static const struct snd_kcontrol_new wsa_codec_dma_rx_1_mixer_controls[] = {
  592. Q6ROUTING_RX_MIXERS(WSA_CODEC_DMA_RX_1) };
  593. static const struct snd_kcontrol_new rx_codec_dma_rx_0_mixer_controls[] = {
  594. Q6ROUTING_RX_MIXERS(RX_CODEC_DMA_RX_0) };
  595. static const struct snd_kcontrol_new rx_codec_dma_rx_1_mixer_controls[] = {
  596. Q6ROUTING_RX_MIXERS(RX_CODEC_DMA_RX_1) };
  597. static const struct snd_kcontrol_new rx_codec_dma_rx_2_mixer_controls[] = {
  598. Q6ROUTING_RX_MIXERS(RX_CODEC_DMA_RX_2) };
  599. static const struct snd_kcontrol_new rx_codec_dma_rx_3_mixer_controls[] = {
  600. Q6ROUTING_RX_MIXERS(RX_CODEC_DMA_RX_3) };
  601. static const struct snd_kcontrol_new rx_codec_dma_rx_4_mixer_controls[] = {
  602. Q6ROUTING_RX_MIXERS(RX_CODEC_DMA_RX_4) };
  603. static const struct snd_kcontrol_new rx_codec_dma_rx_5_mixer_controls[] = {
  604. Q6ROUTING_RX_MIXERS(RX_CODEC_DMA_RX_5) };
  605. static const struct snd_kcontrol_new rxcodec_dma_rx_6_mixer_controls[] = {
  606. Q6ROUTING_RX_MIXERS(RX_CODEC_DMA_RX_6) };
  607. static const struct snd_kcontrol_new rx_codec_dma_rx_7_mixer_controls[] = {
  608. Q6ROUTING_RX_MIXERS(RX_CODEC_DMA_RX_7) };
  609. static const struct snd_kcontrol_new mmul1_mixer_controls[] = {
  610. Q6ROUTING_TX_MIXERS(MSM_FRONTEND_DAI_MULTIMEDIA1) };
  611. static const struct snd_kcontrol_new mmul2_mixer_controls[] = {
  612. Q6ROUTING_TX_MIXERS(MSM_FRONTEND_DAI_MULTIMEDIA2) };
  613. static const struct snd_kcontrol_new mmul3_mixer_controls[] = {
  614. Q6ROUTING_TX_MIXERS(MSM_FRONTEND_DAI_MULTIMEDIA3) };
  615. static const struct snd_kcontrol_new mmul4_mixer_controls[] = {
  616. Q6ROUTING_TX_MIXERS(MSM_FRONTEND_DAI_MULTIMEDIA4) };
  617. static const struct snd_kcontrol_new mmul5_mixer_controls[] = {
  618. Q6ROUTING_TX_MIXERS(MSM_FRONTEND_DAI_MULTIMEDIA5) };
  619. static const struct snd_kcontrol_new mmul6_mixer_controls[] = {
  620. Q6ROUTING_TX_MIXERS(MSM_FRONTEND_DAI_MULTIMEDIA6) };
  621. static const struct snd_kcontrol_new mmul7_mixer_controls[] = {
  622. Q6ROUTING_TX_MIXERS(MSM_FRONTEND_DAI_MULTIMEDIA7) };
  623. static const struct snd_kcontrol_new mmul8_mixer_controls[] = {
  624. Q6ROUTING_TX_MIXERS(MSM_FRONTEND_DAI_MULTIMEDIA8) };
  625. static const struct snd_soc_dapm_widget msm_qdsp6_widgets[] = {
  626. /* Mixer definitions */
  627. SND_SOC_DAPM_MIXER("HDMI Mixer", SND_SOC_NOPM, 0, 0,
  628. hdmi_mixer_controls,
  629. ARRAY_SIZE(hdmi_mixer_controls)),
  630. SND_SOC_DAPM_MIXER("DISPLAY_PORT_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
  631. display_port_mixer_controls,
  632. ARRAY_SIZE(display_port_mixer_controls)),
  633. SND_SOC_DAPM_MIXER("SLIMBUS_0_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
  634. slimbus_rx_mixer_controls,
  635. ARRAY_SIZE(slimbus_rx_mixer_controls)),
  636. SND_SOC_DAPM_MIXER("SLIMBUS_1_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
  637. slimbus_1_rx_mixer_controls,
  638. ARRAY_SIZE(slimbus_1_rx_mixer_controls)),
  639. SND_SOC_DAPM_MIXER("SLIMBUS_2_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
  640. slimbus_2_rx_mixer_controls,
  641. ARRAY_SIZE(slimbus_2_rx_mixer_controls)),
  642. SND_SOC_DAPM_MIXER("SLIMBUS_3_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
  643. slimbus_3_rx_mixer_controls,
  644. ARRAY_SIZE(slimbus_3_rx_mixer_controls)),
  645. SND_SOC_DAPM_MIXER("SLIMBUS_4_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
  646. slimbus_4_rx_mixer_controls,
  647. ARRAY_SIZE(slimbus_4_rx_mixer_controls)),
  648. SND_SOC_DAPM_MIXER("SLIMBUS_5_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
  649. slimbus_5_rx_mixer_controls,
  650. ARRAY_SIZE(slimbus_5_rx_mixer_controls)),
  651. SND_SOC_DAPM_MIXER("SLIMBUS_6_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
  652. slimbus_6_rx_mixer_controls,
  653. ARRAY_SIZE(slimbus_6_rx_mixer_controls)),
  654. SND_SOC_DAPM_MIXER("PRI_MI2S_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
  655. primary_mi2s_rx_mixer_controls,
  656. ARRAY_SIZE(primary_mi2s_rx_mixer_controls)),
  657. SND_SOC_DAPM_MIXER("SEC_MI2S_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
  658. secondary_mi2s_rx_mixer_controls,
  659. ARRAY_SIZE(secondary_mi2s_rx_mixer_controls)),
  660. SND_SOC_DAPM_MIXER("QUAT_MI2S_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
  661. quaternary_mi2s_rx_mixer_controls,
  662. ARRAY_SIZE(quaternary_mi2s_rx_mixer_controls)),
  663. SND_SOC_DAPM_MIXER("QUIN_MI2S_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
  664. quinary_mi2s_rx_mixer_controls,
  665. ARRAY_SIZE(quinary_mi2s_rx_mixer_controls)),
  666. SND_SOC_DAPM_MIXER("TERT_MI2S_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
  667. tertiary_mi2s_rx_mixer_controls,
  668. ARRAY_SIZE(tertiary_mi2s_rx_mixer_controls)),
  669. SND_SOC_DAPM_MIXER("PRIMARY_TDM_RX_0 Audio Mixer", SND_SOC_NOPM, 0, 0,
  670. pri_tdm_rx_0_mixer_controls,
  671. ARRAY_SIZE(pri_tdm_rx_0_mixer_controls)),
  672. SND_SOC_DAPM_MIXER("PRIMARY_TDM_RX_1 Audio Mixer", SND_SOC_NOPM, 0, 0,
  673. pri_tdm_rx_1_mixer_controls,
  674. ARRAY_SIZE(pri_tdm_rx_1_mixer_controls)),
  675. SND_SOC_DAPM_MIXER("PRIMARY_TDM_RX_2 Audio Mixer", SND_SOC_NOPM, 0, 0,
  676. pri_tdm_rx_2_mixer_controls,
  677. ARRAY_SIZE(pri_tdm_rx_2_mixer_controls)),
  678. SND_SOC_DAPM_MIXER("PRIMARY_TDM_RX_3 Audio Mixer", SND_SOC_NOPM, 0, 0,
  679. pri_tdm_rx_3_mixer_controls,
  680. ARRAY_SIZE(pri_tdm_rx_3_mixer_controls)),
  681. SND_SOC_DAPM_MIXER("PRIMARY_TDM_RX_4 Audio Mixer", SND_SOC_NOPM, 0, 0,
  682. pri_tdm_rx_4_mixer_controls,
  683. ARRAY_SIZE(pri_tdm_rx_4_mixer_controls)),
  684. SND_SOC_DAPM_MIXER("PRIMARY_TDM_RX_5 Audio Mixer", SND_SOC_NOPM, 0, 0,
  685. pri_tdm_rx_5_mixer_controls,
  686. ARRAY_SIZE(pri_tdm_rx_5_mixer_controls)),
  687. SND_SOC_DAPM_MIXER("PRIMARY_TDM_RX_6 Audio Mixer", SND_SOC_NOPM, 0, 0,
  688. pri_tdm_rx_6_mixer_controls,
  689. ARRAY_SIZE(pri_tdm_rx_6_mixer_controls)),
  690. SND_SOC_DAPM_MIXER("PRIMARY_TDM_RX_7 Audio Mixer", SND_SOC_NOPM, 0, 0,
  691. pri_tdm_rx_7_mixer_controls,
  692. ARRAY_SIZE(pri_tdm_rx_7_mixer_controls)),
  693. SND_SOC_DAPM_MIXER("SEC_TDM_RX_0 Audio Mixer", SND_SOC_NOPM, 0, 0,
  694. sec_tdm_rx_0_mixer_controls,
  695. ARRAY_SIZE(sec_tdm_rx_0_mixer_controls)),
  696. SND_SOC_DAPM_MIXER("SEC_TDM_RX_1 Audio Mixer", SND_SOC_NOPM, 0, 0,
  697. sec_tdm_rx_1_mixer_controls,
  698. ARRAY_SIZE(sec_tdm_rx_1_mixer_controls)),
  699. SND_SOC_DAPM_MIXER("SEC_TDM_RX_2 Audio Mixer", SND_SOC_NOPM, 0, 0,
  700. sec_tdm_rx_2_mixer_controls,
  701. ARRAY_SIZE(sec_tdm_rx_2_mixer_controls)),
  702. SND_SOC_DAPM_MIXER("SEC_TDM_RX_3 Audio Mixer", SND_SOC_NOPM, 0, 0,
  703. sec_tdm_rx_3_mixer_controls,
  704. ARRAY_SIZE(sec_tdm_rx_3_mixer_controls)),
  705. SND_SOC_DAPM_MIXER("SEC_TDM_RX_4 Audio Mixer", SND_SOC_NOPM, 0, 0,
  706. sec_tdm_rx_4_mixer_controls,
  707. ARRAY_SIZE(sec_tdm_rx_4_mixer_controls)),
  708. SND_SOC_DAPM_MIXER("SEC_TDM_RX_5 Audio Mixer", SND_SOC_NOPM, 0, 0,
  709. sec_tdm_rx_5_mixer_controls,
  710. ARRAY_SIZE(sec_tdm_rx_5_mixer_controls)),
  711. SND_SOC_DAPM_MIXER("SEC_TDM_RX_6 Audio Mixer", SND_SOC_NOPM, 0, 0,
  712. sec_tdm_rx_6_mixer_controls,
  713. ARRAY_SIZE(sec_tdm_rx_6_mixer_controls)),
  714. SND_SOC_DAPM_MIXER("SEC_TDM_RX_7 Audio Mixer", SND_SOC_NOPM, 0, 0,
  715. sec_tdm_rx_7_mixer_controls,
  716. ARRAY_SIZE(sec_tdm_rx_7_mixer_controls)),
  717. SND_SOC_DAPM_MIXER("TERT_TDM_RX_0 Audio Mixer", SND_SOC_NOPM, 0, 0,
  718. tert_tdm_rx_0_mixer_controls,
  719. ARRAY_SIZE(tert_tdm_rx_0_mixer_controls)),
  720. SND_SOC_DAPM_MIXER("TERT_TDM_RX_1 Audio Mixer", SND_SOC_NOPM, 0, 0,
  721. tert_tdm_rx_1_mixer_controls,
  722. ARRAY_SIZE(tert_tdm_rx_1_mixer_controls)),
  723. SND_SOC_DAPM_MIXER("TERT_TDM_RX_2 Audio Mixer", SND_SOC_NOPM, 0, 0,
  724. tert_tdm_rx_2_mixer_controls,
  725. ARRAY_SIZE(tert_tdm_rx_2_mixer_controls)),
  726. SND_SOC_DAPM_MIXER("TERT_TDM_RX_3 Audio Mixer", SND_SOC_NOPM, 0, 0,
  727. tert_tdm_rx_3_mixer_controls,
  728. ARRAY_SIZE(tert_tdm_rx_3_mixer_controls)),
  729. SND_SOC_DAPM_MIXER("TERT_TDM_RX_4 Audio Mixer", SND_SOC_NOPM, 0, 0,
  730. tert_tdm_rx_4_mixer_controls,
  731. ARRAY_SIZE(tert_tdm_rx_4_mixer_controls)),
  732. SND_SOC_DAPM_MIXER("TERT_TDM_RX_5 Audio Mixer", SND_SOC_NOPM, 0, 0,
  733. tert_tdm_rx_5_mixer_controls,
  734. ARRAY_SIZE(tert_tdm_rx_5_mixer_controls)),
  735. SND_SOC_DAPM_MIXER("TERT_TDM_RX_6 Audio Mixer", SND_SOC_NOPM, 0, 0,
  736. tert_tdm_rx_6_mixer_controls,
  737. ARRAY_SIZE(tert_tdm_rx_6_mixer_controls)),
  738. SND_SOC_DAPM_MIXER("TERT_TDM_RX_7 Audio Mixer", SND_SOC_NOPM, 0, 0,
  739. tert_tdm_rx_7_mixer_controls,
  740. ARRAY_SIZE(tert_tdm_rx_7_mixer_controls)),
  741. SND_SOC_DAPM_MIXER("QUAT_TDM_RX_0 Audio Mixer", SND_SOC_NOPM, 0, 0,
  742. quat_tdm_rx_0_mixer_controls,
  743. ARRAY_SIZE(quat_tdm_rx_0_mixer_controls)),
  744. SND_SOC_DAPM_MIXER("QUAT_TDM_RX_1 Audio Mixer", SND_SOC_NOPM, 0, 0,
  745. quat_tdm_rx_1_mixer_controls,
  746. ARRAY_SIZE(quat_tdm_rx_1_mixer_controls)),
  747. SND_SOC_DAPM_MIXER("QUAT_TDM_RX_2 Audio Mixer", SND_SOC_NOPM, 0, 0,
  748. quat_tdm_rx_2_mixer_controls,
  749. ARRAY_SIZE(quat_tdm_rx_2_mixer_controls)),
  750. SND_SOC_DAPM_MIXER("QUAT_TDM_RX_3 Audio Mixer", SND_SOC_NOPM, 0, 0,
  751. quat_tdm_rx_3_mixer_controls,
  752. ARRAY_SIZE(quat_tdm_rx_3_mixer_controls)),
  753. SND_SOC_DAPM_MIXER("QUAT_TDM_RX_4 Audio Mixer", SND_SOC_NOPM, 0, 0,
  754. quat_tdm_rx_4_mixer_controls,
  755. ARRAY_SIZE(quat_tdm_rx_4_mixer_controls)),
  756. SND_SOC_DAPM_MIXER("QUAT_TDM_RX_5 Audio Mixer", SND_SOC_NOPM, 0, 0,
  757. quat_tdm_rx_5_mixer_controls,
  758. ARRAY_SIZE(quat_tdm_rx_5_mixer_controls)),
  759. SND_SOC_DAPM_MIXER("QUAT_TDM_RX_6 Audio Mixer", SND_SOC_NOPM, 0, 0,
  760. quat_tdm_rx_6_mixer_controls,
  761. ARRAY_SIZE(quat_tdm_rx_6_mixer_controls)),
  762. SND_SOC_DAPM_MIXER("QUAT_TDM_RX_7 Audio Mixer", SND_SOC_NOPM, 0, 0,
  763. quat_tdm_rx_7_mixer_controls,
  764. ARRAY_SIZE(quat_tdm_rx_7_mixer_controls)),
  765. SND_SOC_DAPM_MIXER("QUIN_TDM_RX_0 Audio Mixer", SND_SOC_NOPM, 0, 0,
  766. quin_tdm_rx_0_mixer_controls,
  767. ARRAY_SIZE(quin_tdm_rx_0_mixer_controls)),
  768. SND_SOC_DAPM_MIXER("QUIN_TDM_RX_1 Audio Mixer", SND_SOC_NOPM, 0, 0,
  769. quin_tdm_rx_1_mixer_controls,
  770. ARRAY_SIZE(quin_tdm_rx_1_mixer_controls)),
  771. SND_SOC_DAPM_MIXER("QUIN_TDM_RX_2 Audio Mixer", SND_SOC_NOPM, 0, 0,
  772. quin_tdm_rx_2_mixer_controls,
  773. ARRAY_SIZE(quin_tdm_rx_2_mixer_controls)),
  774. SND_SOC_DAPM_MIXER("QUIN_TDM_RX_3 Audio Mixer", SND_SOC_NOPM, 0, 0,
  775. quin_tdm_rx_3_mixer_controls,
  776. ARRAY_SIZE(quin_tdm_rx_3_mixer_controls)),
  777. SND_SOC_DAPM_MIXER("QUIN_TDM_RX_4 Audio Mixer", SND_SOC_NOPM, 0, 0,
  778. quin_tdm_rx_4_mixer_controls,
  779. ARRAY_SIZE(quin_tdm_rx_4_mixer_controls)),
  780. SND_SOC_DAPM_MIXER("QUIN_TDM_RX_5 Audio Mixer", SND_SOC_NOPM, 0, 0,
  781. quin_tdm_rx_5_mixer_controls,
  782. ARRAY_SIZE(quin_tdm_rx_5_mixer_controls)),
  783. SND_SOC_DAPM_MIXER("QUIN_TDM_RX_6 Audio Mixer", SND_SOC_NOPM, 0, 0,
  784. quin_tdm_rx_6_mixer_controls,
  785. ARRAY_SIZE(quin_tdm_rx_6_mixer_controls)),
  786. SND_SOC_DAPM_MIXER("QUIN_TDM_RX_7 Audio Mixer", SND_SOC_NOPM, 0, 0,
  787. quin_tdm_rx_7_mixer_controls,
  788. ARRAY_SIZE(quin_tdm_rx_7_mixer_controls)),
  789. SND_SOC_DAPM_MIXER("WSA_CODEC_DMA_RX_0 Audio Mixer", SND_SOC_NOPM, 0, 0,
  790. wsa_codec_dma_rx_0_mixer_controls,
  791. ARRAY_SIZE(wsa_codec_dma_rx_0_mixer_controls)),
  792. SND_SOC_DAPM_MIXER("WSA_CODEC_DMA_RX_1 Audio Mixer", SND_SOC_NOPM, 0, 0,
  793. wsa_codec_dma_rx_1_mixer_controls,
  794. ARRAY_SIZE(wsa_codec_dma_rx_1_mixer_controls)),
  795. SND_SOC_DAPM_MIXER("RX_CODEC_DMA_RX_0 Audio Mixer", SND_SOC_NOPM, 0, 0,
  796. rx_codec_dma_rx_0_mixer_controls,
  797. ARRAY_SIZE(rx_codec_dma_rx_0_mixer_controls)),
  798. SND_SOC_DAPM_MIXER("RX_CODEC_DMA_RX_1 Audio Mixer", SND_SOC_NOPM, 0, 0,
  799. rx_codec_dma_rx_1_mixer_controls,
  800. ARRAY_SIZE(rx_codec_dma_rx_1_mixer_controls)),
  801. SND_SOC_DAPM_MIXER("RX_CODEC_DMA_RX_2 Audio Mixer", SND_SOC_NOPM, 0, 0,
  802. rx_codec_dma_rx_2_mixer_controls,
  803. ARRAY_SIZE(rx_codec_dma_rx_2_mixer_controls)),
  804. SND_SOC_DAPM_MIXER("RX_CODEC_DMA_RX_3 Audio Mixer", SND_SOC_NOPM, 0, 0,
  805. rx_codec_dma_rx_3_mixer_controls,
  806. ARRAY_SIZE(rx_codec_dma_rx_3_mixer_controls)),
  807. SND_SOC_DAPM_MIXER("RX_CODEC_DMA_RX_4 Audio Mixer", SND_SOC_NOPM, 0, 0,
  808. rx_codec_dma_rx_4_mixer_controls,
  809. ARRAY_SIZE(rx_codec_dma_rx_4_mixer_controls)),
  810. SND_SOC_DAPM_MIXER("RX_CODEC_DMA_RX_5 Audio Mixer", SND_SOC_NOPM, 0, 0,
  811. rx_codec_dma_rx_5_mixer_controls,
  812. ARRAY_SIZE(rx_codec_dma_rx_5_mixer_controls)),
  813. SND_SOC_DAPM_MIXER("RX_CODEC_DMA_RX_6 Audio Mixer", SND_SOC_NOPM, 0, 0,
  814. rxcodec_dma_rx_6_mixer_controls,
  815. ARRAY_SIZE(rxcodec_dma_rx_6_mixer_controls)),
  816. SND_SOC_DAPM_MIXER("RX_CODEC_DMA_RX_7 Audio Mixer", SND_SOC_NOPM, 0, 0,
  817. rx_codec_dma_rx_7_mixer_controls,
  818. ARRAY_SIZE(rx_codec_dma_rx_7_mixer_controls)),
  819. SND_SOC_DAPM_MIXER("MultiMedia1 Mixer", SND_SOC_NOPM, 0, 0,
  820. mmul1_mixer_controls, ARRAY_SIZE(mmul1_mixer_controls)),
  821. SND_SOC_DAPM_MIXER("MultiMedia2 Mixer", SND_SOC_NOPM, 0, 0,
  822. mmul2_mixer_controls, ARRAY_SIZE(mmul2_mixer_controls)),
  823. SND_SOC_DAPM_MIXER("MultiMedia3 Mixer", SND_SOC_NOPM, 0, 0,
  824. mmul3_mixer_controls, ARRAY_SIZE(mmul3_mixer_controls)),
  825. SND_SOC_DAPM_MIXER("MultiMedia4 Mixer", SND_SOC_NOPM, 0, 0,
  826. mmul4_mixer_controls, ARRAY_SIZE(mmul4_mixer_controls)),
  827. SND_SOC_DAPM_MIXER("MultiMedia5 Mixer", SND_SOC_NOPM, 0, 0,
  828. mmul5_mixer_controls, ARRAY_SIZE(mmul5_mixer_controls)),
  829. SND_SOC_DAPM_MIXER("MultiMedia6 Mixer", SND_SOC_NOPM, 0, 0,
  830. mmul6_mixer_controls, ARRAY_SIZE(mmul6_mixer_controls)),
  831. SND_SOC_DAPM_MIXER("MultiMedia7 Mixer", SND_SOC_NOPM, 0, 0,
  832. mmul7_mixer_controls, ARRAY_SIZE(mmul7_mixer_controls)),
  833. SND_SOC_DAPM_MIXER("MultiMedia8 Mixer", SND_SOC_NOPM, 0, 0,
  834. mmul8_mixer_controls, ARRAY_SIZE(mmul8_mixer_controls)),
  835. };
  836. static const struct snd_soc_dapm_route intercon[] = {
  837. Q6ROUTING_RX_DAPM_ROUTE("HDMI Mixer", "HDMI_RX"),
  838. Q6ROUTING_RX_DAPM_ROUTE("DISPLAY_PORT_RX Audio Mixer",
  839. "DISPLAY_PORT_RX"),
  840. Q6ROUTING_RX_DAPM_ROUTE("SLIMBUS_0_RX Audio Mixer", "SLIMBUS_0_RX"),
  841. Q6ROUTING_RX_DAPM_ROUTE("SLIMBUS_1_RX Audio Mixer", "SLIMBUS_1_RX"),
  842. Q6ROUTING_RX_DAPM_ROUTE("SLIMBUS_2_RX Audio Mixer", "SLIMBUS_2_RX"),
  843. Q6ROUTING_RX_DAPM_ROUTE("SLIMBUS_3_RX Audio Mixer", "SLIMBUS_3_RX"),
  844. Q6ROUTING_RX_DAPM_ROUTE("SLIMBUS_4_RX Audio Mixer", "SLIMBUS_4_RX"),
  845. Q6ROUTING_RX_DAPM_ROUTE("SLIMBUS_5_RX Audio Mixer", "SLIMBUS_5_RX"),
  846. Q6ROUTING_RX_DAPM_ROUTE("SLIMBUS_6_RX Audio Mixer", "SLIMBUS_6_RX"),
  847. Q6ROUTING_RX_DAPM_ROUTE("QUAT_MI2S_RX Audio Mixer", "QUAT_MI2S_RX"),
  848. Q6ROUTING_RX_DAPM_ROUTE("QUIN_MI2S_RX Audio Mixer", "QUIN_MI2S_RX"),
  849. Q6ROUTING_RX_DAPM_ROUTE("TERT_MI2S_RX Audio Mixer", "TERT_MI2S_RX"),
  850. Q6ROUTING_RX_DAPM_ROUTE("SEC_MI2S_RX Audio Mixer", "SEC_MI2S_RX"),
  851. Q6ROUTING_RX_DAPM_ROUTE("PRI_MI2S_RX Audio Mixer", "PRI_MI2S_RX"),
  852. Q6ROUTING_RX_DAPM_ROUTE("PRIMARY_TDM_RX_0 Audio Mixer",
  853. "PRIMARY_TDM_RX_0"),
  854. Q6ROUTING_RX_DAPM_ROUTE("PRIMARY_TDM_RX_1 Audio Mixer",
  855. "PRIMARY_TDM_RX_1"),
  856. Q6ROUTING_RX_DAPM_ROUTE("PRIMARY_TDM_RX_2 Audio Mixer",
  857. "PRIMARY_TDM_RX_2"),
  858. Q6ROUTING_RX_DAPM_ROUTE("PRIMARY_TDM_RX_3 Audio Mixer",
  859. "PRIMARY_TDM_RX_3"),
  860. Q6ROUTING_RX_DAPM_ROUTE("PRIMARY_TDM_RX_4 Audio Mixer",
  861. "PRIMARY_TDM_RX_4"),
  862. Q6ROUTING_RX_DAPM_ROUTE("PRIMARY_TDM_RX_5 Audio Mixer",
  863. "PRIMARY_TDM_RX_5"),
  864. Q6ROUTING_RX_DAPM_ROUTE("PRIMARY_TDM_RX_6 Audio Mixer",
  865. "PRIMARY_TDM_RX_6"),
  866. Q6ROUTING_RX_DAPM_ROUTE("PRIMARY_TDM_RX_7 Audio Mixer",
  867. "PRIMARY_TDM_RX_7"),
  868. Q6ROUTING_RX_DAPM_ROUTE("SEC_TDM_RX_0 Audio Mixer", "SEC_TDM_RX_0"),
  869. Q6ROUTING_RX_DAPM_ROUTE("SEC_TDM_RX_1 Audio Mixer", "SEC_TDM_RX_1"),
  870. Q6ROUTING_RX_DAPM_ROUTE("SEC_TDM_RX_2 Audio Mixer", "SEC_TDM_RX_2"),
  871. Q6ROUTING_RX_DAPM_ROUTE("SEC_TDM_RX_3 Audio Mixer", "SEC_TDM_RX_3"),
  872. Q6ROUTING_RX_DAPM_ROUTE("SEC_TDM_RX_4 Audio Mixer", "SEC_TDM_RX_4"),
  873. Q6ROUTING_RX_DAPM_ROUTE("SEC_TDM_RX_5 Audio Mixer", "SEC_TDM_RX_5"),
  874. Q6ROUTING_RX_DAPM_ROUTE("SEC_TDM_RX_6 Audio Mixer", "SEC_TDM_RX_6"),
  875. Q6ROUTING_RX_DAPM_ROUTE("SEC_TDM_RX_7 Audio Mixer", "SEC_TDM_RX_7"),
  876. Q6ROUTING_RX_DAPM_ROUTE("TERT_TDM_RX_0 Audio Mixer", "TERT_TDM_RX_0"),
  877. Q6ROUTING_RX_DAPM_ROUTE("TERT_TDM_RX_1 Audio Mixer", "TERT_TDM_RX_1"),
  878. Q6ROUTING_RX_DAPM_ROUTE("TERT_TDM_RX_2 Audio Mixer", "TERT_TDM_RX_2"),
  879. Q6ROUTING_RX_DAPM_ROUTE("TERT_TDM_RX_3 Audio Mixer", "TERT_TDM_RX_3"),
  880. Q6ROUTING_RX_DAPM_ROUTE("TERT_TDM_RX_4 Audio Mixer", "TERT_TDM_RX_4"),
  881. Q6ROUTING_RX_DAPM_ROUTE("TERT_TDM_RX_5 Audio Mixer", "TERT_TDM_RX_5"),
  882. Q6ROUTING_RX_DAPM_ROUTE("TERT_TDM_RX_6 Audio Mixer", "TERT_TDM_RX_6"),
  883. Q6ROUTING_RX_DAPM_ROUTE("TERT_TDM_RX_7 Audio Mixer", "TERT_TDM_RX_7"),
  884. Q6ROUTING_RX_DAPM_ROUTE("QUAT_TDM_RX_0 Audio Mixer", "QUAT_TDM_RX_0"),
  885. Q6ROUTING_RX_DAPM_ROUTE("QUAT_TDM_RX_1 Audio Mixer", "QUAT_TDM_RX_1"),
  886. Q6ROUTING_RX_DAPM_ROUTE("QUAT_TDM_RX_2 Audio Mixer", "QUAT_TDM_RX_2"),
  887. Q6ROUTING_RX_DAPM_ROUTE("QUAT_TDM_RX_3 Audio Mixer", "QUAT_TDM_RX_3"),
  888. Q6ROUTING_RX_DAPM_ROUTE("QUAT_TDM_RX_4 Audio Mixer", "QUAT_TDM_RX_4"),
  889. Q6ROUTING_RX_DAPM_ROUTE("QUAT_TDM_RX_5 Audio Mixer", "QUAT_TDM_RX_5"),
  890. Q6ROUTING_RX_DAPM_ROUTE("QUAT_TDM_RX_6 Audio Mixer", "QUAT_TDM_RX_6"),
  891. Q6ROUTING_RX_DAPM_ROUTE("QUAT_TDM_RX_7 Audio Mixer", "QUAT_TDM_RX_7"),
  892. Q6ROUTING_RX_DAPM_ROUTE("QUIN_TDM_RX_0 Audio Mixer", "QUIN_TDM_RX_0"),
  893. Q6ROUTING_RX_DAPM_ROUTE("QUIN_TDM_RX_1 Audio Mixer", "QUIN_TDM_RX_1"),
  894. Q6ROUTING_RX_DAPM_ROUTE("QUIN_TDM_RX_2 Audio Mixer", "QUIN_TDM_RX_2"),
  895. Q6ROUTING_RX_DAPM_ROUTE("QUIN_TDM_RX_3 Audio Mixer", "QUIN_TDM_RX_3"),
  896. Q6ROUTING_RX_DAPM_ROUTE("QUIN_TDM_RX_4 Audio Mixer", "QUIN_TDM_RX_4"),
  897. Q6ROUTING_RX_DAPM_ROUTE("QUIN_TDM_RX_5 Audio Mixer", "QUIN_TDM_RX_5"),
  898. Q6ROUTING_RX_DAPM_ROUTE("QUIN_TDM_RX_6 Audio Mixer", "QUIN_TDM_RX_6"),
  899. Q6ROUTING_RX_DAPM_ROUTE("QUIN_TDM_RX_7 Audio Mixer", "QUIN_TDM_RX_7"),
  900. Q6ROUTING_RX_DAPM_ROUTE("WSA_CODEC_DMA_RX_0 Audio Mixer", "WSA_CODEC_DMA_RX_0"),
  901. Q6ROUTING_RX_DAPM_ROUTE("WSA_CODEC_DMA_RX_1 Audio Mixer", "WSA_CODEC_DMA_RX_1"),
  902. Q6ROUTING_RX_DAPM_ROUTE("RX_CODEC_DMA_RX_0 Audio Mixer", "RX_CODEC_DMA_RX_0"),
  903. Q6ROUTING_RX_DAPM_ROUTE("RX_CODEC_DMA_RX_1 Audio Mixer", "RX_CODEC_DMA_RX_1"),
  904. Q6ROUTING_RX_DAPM_ROUTE("RX_CODEC_DMA_RX_2 Audio Mixer", "RX_CODEC_DMA_RX_2"),
  905. Q6ROUTING_RX_DAPM_ROUTE("RX_CODEC_DMA_RX_3 Audio Mixer", "RX_CODEC_DMA_RX_3"),
  906. Q6ROUTING_RX_DAPM_ROUTE("RX_CODEC_DMA_RX_4 Audio Mixer", "RX_CODEC_DMA_RX_4"),
  907. Q6ROUTING_RX_DAPM_ROUTE("RX_CODEC_DMA_RX_5 Audio Mixer", "RX_CODEC_DMA_RX_5"),
  908. Q6ROUTING_RX_DAPM_ROUTE("RX_CODEC_DMA_RX_6 Audio Mixer", "RX_CODEC_DMA_RX_6"),
  909. Q6ROUTING_RX_DAPM_ROUTE("RX_CODEC_DMA_RX_7 Audio Mixer", "RX_CODEC_DMA_RX_7"),
  910. Q6ROUTING_TX_DAPM_ROUTE("MultiMedia1 Mixer"),
  911. Q6ROUTING_TX_DAPM_ROUTE("MultiMedia2 Mixer"),
  912. Q6ROUTING_TX_DAPM_ROUTE("MultiMedia3 Mixer"),
  913. Q6ROUTING_TX_DAPM_ROUTE("MultiMedia4 Mixer"),
  914. Q6ROUTING_TX_DAPM_ROUTE("MultiMedia5 Mixer"),
  915. Q6ROUTING_TX_DAPM_ROUTE("MultiMedia6 Mixer"),
  916. Q6ROUTING_TX_DAPM_ROUTE("MultiMedia7 Mixer"),
  917. Q6ROUTING_TX_DAPM_ROUTE("MultiMedia8 Mixer"),
  918. {"MM_UL1", NULL, "MultiMedia1 Mixer"},
  919. {"MM_UL2", NULL, "MultiMedia2 Mixer"},
  920. {"MM_UL3", NULL, "MultiMedia3 Mixer"},
  921. {"MM_UL4", NULL, "MultiMedia4 Mixer"},
  922. {"MM_UL5", NULL, "MultiMedia5 Mixer"},
  923. {"MM_UL6", NULL, "MultiMedia6 Mixer"},
  924. {"MM_UL7", NULL, "MultiMedia7 Mixer"},
  925. {"MM_UL8", NULL, "MultiMedia8 Mixer"},
  926. };
  927. static int routing_hw_params(struct snd_soc_component *component,
  928. struct snd_pcm_substream *substream,
  929. struct snd_pcm_hw_params *params)
  930. {
  931. struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
  932. struct msm_routing_data *data = dev_get_drvdata(component->dev);
  933. unsigned int be_id = asoc_rtd_to_cpu(rtd, 0)->id;
  934. struct session_data *session;
  935. int path_type;
  936. if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
  937. path_type = ADM_PATH_PLAYBACK;
  938. else
  939. path_type = ADM_PATH_LIVE_REC;
  940. if (be_id >= AFE_MAX_PORTS)
  941. return -EINVAL;
  942. session = &data->port_data[be_id];
  943. mutex_lock(&data->lock);
  944. session->path_type = path_type;
  945. session->sample_rate = params_rate(params);
  946. session->channels = params_channels(params);
  947. switch (params_format(params)) {
  948. case SNDRV_PCM_FORMAT_S16_LE:
  949. session->bits_per_sample = 16;
  950. break;
  951. case SNDRV_PCM_FORMAT_S24_LE:
  952. session->bits_per_sample = 24;
  953. break;
  954. default:
  955. break;
  956. }
  957. mutex_unlock(&data->lock);
  958. return 0;
  959. }
  960. static int msm_routing_probe(struct snd_soc_component *c)
  961. {
  962. int i;
  963. for (i = 0; i < MAX_SESSIONS; i++) {
  964. routing_data->sessions[i].port_id = -1;
  965. routing_data->sessions[i].fedai_id = -1;
  966. }
  967. return 0;
  968. }
  969. static unsigned int q6routing_reg_read(struct snd_soc_component *component,
  970. unsigned int reg)
  971. {
  972. /* default value */
  973. return 0;
  974. }
  975. static int q6routing_reg_write(struct snd_soc_component *component,
  976. unsigned int reg, unsigned int val)
  977. {
  978. /* dummy */
  979. return 0;
  980. }
  981. static const struct snd_soc_component_driver msm_soc_routing_component = {
  982. .probe = msm_routing_probe,
  983. .name = DRV_NAME,
  984. .hw_params = routing_hw_params,
  985. .dapm_widgets = msm_qdsp6_widgets,
  986. .num_dapm_widgets = ARRAY_SIZE(msm_qdsp6_widgets),
  987. .dapm_routes = intercon,
  988. .num_dapm_routes = ARRAY_SIZE(intercon),
  989. .read = q6routing_reg_read,
  990. .write = q6routing_reg_write,
  991. };
  992. static int q6pcm_routing_probe(struct platform_device *pdev)
  993. {
  994. struct device *dev = &pdev->dev;
  995. routing_data = kzalloc(sizeof(*routing_data), GFP_KERNEL);
  996. if (!routing_data)
  997. return -ENOMEM;
  998. routing_data->dev = dev;
  999. mutex_init(&routing_data->lock);
  1000. dev_set_drvdata(dev, routing_data);
  1001. return devm_snd_soc_register_component(dev, &msm_soc_routing_component,
  1002. NULL, 0);
  1003. }
  1004. static int q6pcm_routing_remove(struct platform_device *pdev)
  1005. {
  1006. kfree(routing_data);
  1007. routing_data = NULL;
  1008. return 0;
  1009. }
  1010. #ifdef CONFIG_OF
  1011. static const struct of_device_id q6pcm_routing_device_id[] = {
  1012. { .compatible = "qcom,q6adm-routing" },
  1013. {},
  1014. };
  1015. MODULE_DEVICE_TABLE(of, q6pcm_routing_device_id);
  1016. #endif
  1017. static struct platform_driver q6pcm_routing_platform_driver = {
  1018. .driver = {
  1019. .name = "q6routing",
  1020. .of_match_table = of_match_ptr(q6pcm_routing_device_id),
  1021. },
  1022. .probe = q6pcm_routing_probe,
  1023. .remove = q6pcm_routing_remove,
  1024. };
  1025. module_platform_driver(q6pcm_routing_platform_driver);
  1026. MODULE_DESCRIPTION("Q6 Routing platform");
  1027. MODULE_LICENSE("GPL v2");