mt6797-mt6351.c 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264
  1. // SPDX-License-Identifier: GPL-2.0
  2. //
  3. // mt6797-mt6351.c -- MT6797 MT6351 ALSA SoC machine driver
  4. //
  5. // Copyright (c) 2018 MediaTek Inc.
  6. // Author: KaiChieh Chuang <[email protected]>
  7. #include <linux/module.h>
  8. #include <sound/soc.h>
  9. #include "mt6797-afe-common.h"
  10. SND_SOC_DAILINK_DEFS(playback_1,
  11. DAILINK_COMP_ARRAY(COMP_CPU("DL1")),
  12. DAILINK_COMP_ARRAY(COMP_DUMMY()),
  13. DAILINK_COMP_ARRAY(COMP_EMPTY()));
  14. SND_SOC_DAILINK_DEFS(playback_2,
  15. DAILINK_COMP_ARRAY(COMP_CPU("DL2")),
  16. DAILINK_COMP_ARRAY(COMP_DUMMY()),
  17. DAILINK_COMP_ARRAY(COMP_EMPTY()));
  18. SND_SOC_DAILINK_DEFS(playback_3,
  19. DAILINK_COMP_ARRAY(COMP_CPU("DL3")),
  20. DAILINK_COMP_ARRAY(COMP_DUMMY()),
  21. DAILINK_COMP_ARRAY(COMP_EMPTY()));
  22. SND_SOC_DAILINK_DEFS(capture_1,
  23. DAILINK_COMP_ARRAY(COMP_CPU("UL1")),
  24. DAILINK_COMP_ARRAY(COMP_DUMMY()),
  25. DAILINK_COMP_ARRAY(COMP_EMPTY()));
  26. SND_SOC_DAILINK_DEFS(capture_2,
  27. DAILINK_COMP_ARRAY(COMP_CPU("UL2")),
  28. DAILINK_COMP_ARRAY(COMP_DUMMY()),
  29. DAILINK_COMP_ARRAY(COMP_EMPTY()));
  30. SND_SOC_DAILINK_DEFS(capture_3,
  31. DAILINK_COMP_ARRAY(COMP_CPU("UL3")),
  32. DAILINK_COMP_ARRAY(COMP_DUMMY()),
  33. DAILINK_COMP_ARRAY(COMP_EMPTY()));
  34. SND_SOC_DAILINK_DEFS(capture_mono_1,
  35. DAILINK_COMP_ARRAY(COMP_CPU("UL_MONO_1")),
  36. DAILINK_COMP_ARRAY(COMP_DUMMY()),
  37. DAILINK_COMP_ARRAY(COMP_EMPTY()));
  38. SND_SOC_DAILINK_DEFS(hostless_lpbk,
  39. DAILINK_COMP_ARRAY(COMP_CPU("Hostless LPBK DAI")),
  40. DAILINK_COMP_ARRAY(COMP_DUMMY()),
  41. DAILINK_COMP_ARRAY(COMP_EMPTY()));
  42. SND_SOC_DAILINK_DEFS(hostless_speech,
  43. DAILINK_COMP_ARRAY(COMP_CPU("Hostless Speech DAI")),
  44. DAILINK_COMP_ARRAY(COMP_DUMMY()),
  45. DAILINK_COMP_ARRAY(COMP_EMPTY()));
  46. SND_SOC_DAILINK_DEFS(primary_codec,
  47. DAILINK_COMP_ARRAY(COMP_CPU("ADDA")),
  48. DAILINK_COMP_ARRAY(COMP_CODEC(NULL, "mt6351-snd-codec-aif1")),
  49. DAILINK_COMP_ARRAY(COMP_EMPTY()));
  50. SND_SOC_DAILINK_DEFS(pcm1,
  51. DAILINK_COMP_ARRAY(COMP_CPU("PCM 1")),
  52. DAILINK_COMP_ARRAY(COMP_DUMMY()),
  53. DAILINK_COMP_ARRAY(COMP_EMPTY()));
  54. SND_SOC_DAILINK_DEFS(pcm2,
  55. DAILINK_COMP_ARRAY(COMP_CPU("PCM 2")),
  56. DAILINK_COMP_ARRAY(COMP_DUMMY()),
  57. DAILINK_COMP_ARRAY(COMP_EMPTY()));
  58. static struct snd_soc_dai_link mt6797_mt6351_dai_links[] = {
  59. /* FE */
  60. {
  61. .name = "Playback_1",
  62. .stream_name = "Playback_1",
  63. .trigger = {SND_SOC_DPCM_TRIGGER_PRE,
  64. SND_SOC_DPCM_TRIGGER_PRE},
  65. .dynamic = 1,
  66. .dpcm_playback = 1,
  67. SND_SOC_DAILINK_REG(playback_1),
  68. },
  69. {
  70. .name = "Playback_2",
  71. .stream_name = "Playback_2",
  72. .trigger = {SND_SOC_DPCM_TRIGGER_PRE,
  73. SND_SOC_DPCM_TRIGGER_PRE},
  74. .dynamic = 1,
  75. .dpcm_playback = 1,
  76. SND_SOC_DAILINK_REG(playback_2),
  77. },
  78. {
  79. .name = "Playback_3",
  80. .stream_name = "Playback_3",
  81. .trigger = {SND_SOC_DPCM_TRIGGER_PRE,
  82. SND_SOC_DPCM_TRIGGER_PRE},
  83. .dynamic = 1,
  84. .dpcm_playback = 1,
  85. SND_SOC_DAILINK_REG(playback_3),
  86. },
  87. {
  88. .name = "Capture_1",
  89. .stream_name = "Capture_1",
  90. .trigger = {SND_SOC_DPCM_TRIGGER_PRE,
  91. SND_SOC_DPCM_TRIGGER_PRE},
  92. .dynamic = 1,
  93. .dpcm_capture = 1,
  94. SND_SOC_DAILINK_REG(capture_1),
  95. },
  96. {
  97. .name = "Capture_2",
  98. .stream_name = "Capture_2",
  99. .trigger = {SND_SOC_DPCM_TRIGGER_PRE,
  100. SND_SOC_DPCM_TRIGGER_PRE},
  101. .dynamic = 1,
  102. .dpcm_capture = 1,
  103. SND_SOC_DAILINK_REG(capture_2),
  104. },
  105. {
  106. .name = "Capture_3",
  107. .stream_name = "Capture_3",
  108. .trigger = {SND_SOC_DPCM_TRIGGER_PRE,
  109. SND_SOC_DPCM_TRIGGER_PRE},
  110. .dynamic = 1,
  111. .dpcm_capture = 1,
  112. SND_SOC_DAILINK_REG(capture_3),
  113. },
  114. {
  115. .name = "Capture_Mono_1",
  116. .stream_name = "Capture_Mono_1",
  117. .trigger = {SND_SOC_DPCM_TRIGGER_PRE,
  118. SND_SOC_DPCM_TRIGGER_PRE},
  119. .dynamic = 1,
  120. .dpcm_capture = 1,
  121. SND_SOC_DAILINK_REG(capture_mono_1),
  122. },
  123. {
  124. .name = "Hostless_LPBK",
  125. .stream_name = "Hostless_LPBK",
  126. .trigger = {SND_SOC_DPCM_TRIGGER_PRE,
  127. SND_SOC_DPCM_TRIGGER_PRE},
  128. .dynamic = 1,
  129. .dpcm_playback = 1,
  130. .dpcm_capture = 1,
  131. .ignore_suspend = 1,
  132. SND_SOC_DAILINK_REG(hostless_lpbk),
  133. },
  134. {
  135. .name = "Hostless_Speech",
  136. .stream_name = "Hostless_Speech",
  137. .trigger = {SND_SOC_DPCM_TRIGGER_PRE,
  138. SND_SOC_DPCM_TRIGGER_PRE},
  139. .dynamic = 1,
  140. .dpcm_playback = 1,
  141. .dpcm_capture = 1,
  142. .ignore_suspend = 1,
  143. SND_SOC_DAILINK_REG(hostless_speech),
  144. },
  145. /* BE */
  146. {
  147. .name = "Primary Codec",
  148. .no_pcm = 1,
  149. .dpcm_playback = 1,
  150. .dpcm_capture = 1,
  151. .ignore_suspend = 1,
  152. SND_SOC_DAILINK_REG(primary_codec),
  153. },
  154. {
  155. .name = "PCM 1",
  156. .no_pcm = 1,
  157. .dpcm_playback = 1,
  158. .dpcm_capture = 1,
  159. .ignore_suspend = 1,
  160. SND_SOC_DAILINK_REG(pcm1),
  161. },
  162. {
  163. .name = "PCM 2",
  164. .no_pcm = 1,
  165. .dpcm_playback = 1,
  166. .dpcm_capture = 1,
  167. .ignore_suspend = 1,
  168. SND_SOC_DAILINK_REG(pcm2),
  169. },
  170. };
  171. static struct snd_soc_card mt6797_mt6351_card = {
  172. .name = "mt6797-mt6351",
  173. .owner = THIS_MODULE,
  174. .dai_link = mt6797_mt6351_dai_links,
  175. .num_links = ARRAY_SIZE(mt6797_mt6351_dai_links),
  176. };
  177. static int mt6797_mt6351_dev_probe(struct platform_device *pdev)
  178. {
  179. struct snd_soc_card *card = &mt6797_mt6351_card;
  180. struct device_node *platform_node, *codec_node;
  181. struct snd_soc_dai_link *dai_link;
  182. int ret, i;
  183. card->dev = &pdev->dev;
  184. platform_node = of_parse_phandle(pdev->dev.of_node,
  185. "mediatek,platform", 0);
  186. if (!platform_node) {
  187. dev_err(&pdev->dev, "Property 'platform' missing or invalid\n");
  188. return -EINVAL;
  189. }
  190. for_each_card_prelinks(card, i, dai_link) {
  191. if (dai_link->platforms->name)
  192. continue;
  193. dai_link->platforms->of_node = platform_node;
  194. }
  195. codec_node = of_parse_phandle(pdev->dev.of_node,
  196. "mediatek,audio-codec", 0);
  197. if (!codec_node) {
  198. dev_err(&pdev->dev,
  199. "Property 'audio-codec' missing or invalid\n");
  200. ret = -EINVAL;
  201. goto put_platform_node;
  202. }
  203. for_each_card_prelinks(card, i, dai_link) {
  204. if (dai_link->codecs->name)
  205. continue;
  206. dai_link->codecs->of_node = codec_node;
  207. }
  208. ret = devm_snd_soc_register_card(&pdev->dev, card);
  209. if (ret)
  210. dev_err(&pdev->dev, "%s snd_soc_register_card fail %d\n",
  211. __func__, ret);
  212. of_node_put(codec_node);
  213. put_platform_node:
  214. of_node_put(platform_node);
  215. return ret;
  216. }
  217. #ifdef CONFIG_OF
  218. static const struct of_device_id mt6797_mt6351_dt_match[] = {
  219. {.compatible = "mediatek,mt6797-mt6351-sound",},
  220. {}
  221. };
  222. #endif
  223. static struct platform_driver mt6797_mt6351_driver = {
  224. .driver = {
  225. .name = "mt6797-mt6351",
  226. #ifdef CONFIG_OF
  227. .of_match_table = mt6797_mt6351_dt_match,
  228. #endif
  229. },
  230. .probe = mt6797_mt6351_dev_probe,
  231. };
  232. module_platform_driver(mt6797_mt6351_driver);
  233. /* Module information */
  234. MODULE_DESCRIPTION("MT6797 MT6351 ALSA SoC machine driver");
  235. MODULE_AUTHOR("KaiChieh Chuang <[email protected]>");
  236. MODULE_LICENSE("GPL v2");
  237. MODULE_ALIAS("mt6797 mt6351 soc card");