mt6797-afe-pcm.c 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937
  1. // SPDX-License-Identifier: GPL-2.0
  2. //
  3. // Mediatek ALSA SoC AFE platform driver for 6797
  4. //
  5. // Copyright (c) 2018 MediaTek Inc.
  6. // Author: KaiChieh Chuang <kaichieh.chuang@mediatek.com>
  7. #include <linux/delay.h>
  8. #include <linux/module.h>
  9. #include <linux/mfd/syscon.h>
  10. #include <linux/of.h>
  11. #include <linux/of_address.h>
  12. #include <linux/pm_runtime.h>
  13. #include "mt6797-afe-common.h"
  14. #include "mt6797-afe-clk.h"
  15. #include "mt6797-interconnection.h"
  16. #include "mt6797-reg.h"
  17. #include "../common/mtk-afe-platform-driver.h"
  18. #include "../common/mtk-afe-fe-dai.h"
  19. enum {
  20. MTK_AFE_RATE_8K = 0,
  21. MTK_AFE_RATE_11K = 1,
  22. MTK_AFE_RATE_12K = 2,
  23. MTK_AFE_RATE_384K = 3,
  24. MTK_AFE_RATE_16K = 4,
  25. MTK_AFE_RATE_22K = 5,
  26. MTK_AFE_RATE_24K = 6,
  27. MTK_AFE_RATE_130K = 7,
  28. MTK_AFE_RATE_32K = 8,
  29. MTK_AFE_RATE_44K = 9,
  30. MTK_AFE_RATE_48K = 10,
  31. MTK_AFE_RATE_88K = 11,
  32. MTK_AFE_RATE_96K = 12,
  33. MTK_AFE_RATE_174K = 13,
  34. MTK_AFE_RATE_192K = 14,
  35. MTK_AFE_RATE_260K = 15,
  36. };
  37. enum {
  38. MTK_AFE_DAI_MEMIF_RATE_8K = 0,
  39. MTK_AFE_DAI_MEMIF_RATE_16K = 1,
  40. MTK_AFE_DAI_MEMIF_RATE_32K = 2,
  41. };
  42. enum {
  43. MTK_AFE_PCM_RATE_8K = 0,
  44. MTK_AFE_PCM_RATE_16K = 1,
  45. MTK_AFE_PCM_RATE_32K = 2,
  46. MTK_AFE_PCM_RATE_48K = 3,
  47. };
  48. unsigned int mt6797_general_rate_transform(struct device *dev,
  49. unsigned int rate)
  50. {
  51. switch (rate) {
  52. case 8000:
  53. return MTK_AFE_RATE_8K;
  54. case 11025:
  55. return MTK_AFE_RATE_11K;
  56. case 12000:
  57. return MTK_AFE_RATE_12K;
  58. case 16000:
  59. return MTK_AFE_RATE_16K;
  60. case 22050:
  61. return MTK_AFE_RATE_22K;
  62. case 24000:
  63. return MTK_AFE_RATE_24K;
  64. case 32000:
  65. return MTK_AFE_RATE_32K;
  66. case 44100:
  67. return MTK_AFE_RATE_44K;
  68. case 48000:
  69. return MTK_AFE_RATE_48K;
  70. case 88200:
  71. return MTK_AFE_RATE_88K;
  72. case 96000:
  73. return MTK_AFE_RATE_96K;
  74. case 130000:
  75. return MTK_AFE_RATE_130K;
  76. case 176400:
  77. return MTK_AFE_RATE_174K;
  78. case 192000:
  79. return MTK_AFE_RATE_192K;
  80. case 260000:
  81. return MTK_AFE_RATE_260K;
  82. default:
  83. dev_warn(dev, "%s(), rate %u invalid, use %d!!!\n",
  84. __func__, rate, MTK_AFE_RATE_48K);
  85. return MTK_AFE_RATE_48K;
  86. }
  87. }
  88. static unsigned int dai_memif_rate_transform(struct device *dev,
  89. unsigned int rate)
  90. {
  91. switch (rate) {
  92. case 8000:
  93. return MTK_AFE_DAI_MEMIF_RATE_8K;
  94. case 16000:
  95. return MTK_AFE_DAI_MEMIF_RATE_16K;
  96. case 32000:
  97. return MTK_AFE_DAI_MEMIF_RATE_32K;
  98. default:
  99. dev_warn(dev, "%s(), rate %u invalid, use %d!!!\n",
  100. __func__, rate, MTK_AFE_DAI_MEMIF_RATE_16K);
  101. return MTK_AFE_DAI_MEMIF_RATE_16K;
  102. }
  103. }
  104. unsigned int mt6797_rate_transform(struct device *dev,
  105. unsigned int rate, int aud_blk)
  106. {
  107. switch (aud_blk) {
  108. case MT6797_MEMIF_DAI:
  109. case MT6797_MEMIF_MOD_DAI:
  110. return dai_memif_rate_transform(dev, rate);
  111. default:
  112. return mt6797_general_rate_transform(dev, rate);
  113. }
  114. }
  115. static const struct snd_pcm_hardware mt6797_afe_hardware = {
  116. .info = SNDRV_PCM_INFO_MMAP |
  117. SNDRV_PCM_INFO_INTERLEAVED |
  118. SNDRV_PCM_INFO_MMAP_VALID,
  119. .formats = SNDRV_PCM_FMTBIT_S16_LE |
  120. SNDRV_PCM_FMTBIT_S24_LE |
  121. SNDRV_PCM_FMTBIT_S32_LE,
  122. .period_bytes_min = 256,
  123. .period_bytes_max = 4 * 48 * 1024,
  124. .periods_min = 2,
  125. .periods_max = 256,
  126. .buffer_bytes_max = 8 * 48 * 1024,
  127. .fifo_size = 0,
  128. };
  129. static int mt6797_memif_fs(struct snd_pcm_substream *substream,
  130. unsigned int rate)
  131. {
  132. struct snd_soc_pcm_runtime *rtd = substream->private_data;
  133. struct snd_soc_component *component =
  134. snd_soc_rtdcom_lookup(rtd, AFE_PCM_NAME);
  135. struct mtk_base_afe *afe = snd_soc_component_get_drvdata(component);
  136. int id = rtd->cpu_dai->id;
  137. return mt6797_rate_transform(afe->dev, rate, id);
  138. }
  139. static int mt6797_irq_fs(struct snd_pcm_substream *substream, unsigned int rate)
  140. {
  141. struct snd_soc_pcm_runtime *rtd = substream->private_data;
  142. struct snd_soc_component *component =
  143. snd_soc_rtdcom_lookup(rtd, AFE_PCM_NAME);
  144. struct mtk_base_afe *afe = snd_soc_component_get_drvdata(component);
  145. return mt6797_general_rate_transform(afe->dev, rate);
  146. }
  147. #define MTK_PCM_RATES (SNDRV_PCM_RATE_8000_48000 |\
  148. SNDRV_PCM_RATE_88200 |\
  149. SNDRV_PCM_RATE_96000 |\
  150. SNDRV_PCM_RATE_176400 |\
  151. SNDRV_PCM_RATE_192000)
  152. #define MTK_PCM_DAI_RATES (SNDRV_PCM_RATE_8000 |\
  153. SNDRV_PCM_RATE_16000 |\
  154. SNDRV_PCM_RATE_32000)
  155. #define MTK_PCM_FORMATS (SNDRV_PCM_FMTBIT_S16_LE |\
  156. SNDRV_PCM_FMTBIT_S24_LE |\
  157. SNDRV_PCM_FMTBIT_S32_LE)
  158. static struct snd_soc_dai_driver mt6797_memif_dai_driver[] = {
  159. /* FE DAIs: memory intefaces to CPU */
  160. {
  161. .name = "DL1",
  162. .id = MT6797_MEMIF_DL1,
  163. .playback = {
  164. .stream_name = "DL1",
  165. .channels_min = 1,
  166. .channels_max = 2,
  167. .rates = MTK_PCM_RATES,
  168. .formats = MTK_PCM_FORMATS,
  169. },
  170. .ops = &mtk_afe_fe_ops,
  171. },
  172. {
  173. .name = "DL2",
  174. .id = MT6797_MEMIF_DL2,
  175. .playback = {
  176. .stream_name = "DL2",
  177. .channels_min = 1,
  178. .channels_max = 2,
  179. .rates = MTK_PCM_RATES,
  180. .formats = MTK_PCM_FORMATS,
  181. },
  182. .ops = &mtk_afe_fe_ops,
  183. },
  184. {
  185. .name = "DL3",
  186. .id = MT6797_MEMIF_DL3,
  187. .playback = {
  188. .stream_name = "DL3",
  189. .channels_min = 1,
  190. .channels_max = 2,
  191. .rates = MTK_PCM_RATES,
  192. .formats = MTK_PCM_FORMATS,
  193. },
  194. .ops = &mtk_afe_fe_ops,
  195. },
  196. {
  197. .name = "UL1",
  198. .id = MT6797_MEMIF_VUL12,
  199. .capture = {
  200. .stream_name = "UL1",
  201. .channels_min = 1,
  202. .channels_max = 2,
  203. .rates = MTK_PCM_RATES,
  204. .formats = MTK_PCM_FORMATS,
  205. },
  206. .ops = &mtk_afe_fe_ops,
  207. },
  208. {
  209. .name = "UL2",
  210. .id = MT6797_MEMIF_AWB,
  211. .capture = {
  212. .stream_name = "UL2",
  213. .channels_min = 1,
  214. .channels_max = 2,
  215. .rates = MTK_PCM_RATES,
  216. .formats = MTK_PCM_FORMATS,
  217. },
  218. .ops = &mtk_afe_fe_ops,
  219. },
  220. {
  221. .name = "UL3",
  222. .id = MT6797_MEMIF_VUL,
  223. .capture = {
  224. .stream_name = "UL3",
  225. .channels_min = 1,
  226. .channels_max = 2,
  227. .rates = MTK_PCM_RATES,
  228. .formats = MTK_PCM_FORMATS,
  229. },
  230. .ops = &mtk_afe_fe_ops,
  231. },
  232. {
  233. .name = "UL_MONO_1",
  234. .id = MT6797_MEMIF_MOD_DAI,
  235. .capture = {
  236. .stream_name = "UL_MONO_1",
  237. .channels_min = 1,
  238. .channels_max = 1,
  239. .rates = MTK_PCM_DAI_RATES,
  240. .formats = MTK_PCM_FORMATS,
  241. },
  242. .ops = &mtk_afe_fe_ops,
  243. },
  244. {
  245. .name = "UL_MONO_2",
  246. .id = MT6797_MEMIF_DAI,
  247. .capture = {
  248. .stream_name = "UL_MONO_2",
  249. .channels_min = 1,
  250. .channels_max = 1,
  251. .rates = MTK_PCM_DAI_RATES,
  252. .formats = MTK_PCM_FORMATS,
  253. },
  254. .ops = &mtk_afe_fe_ops,
  255. },
  256. };
  257. /* dma widget & routes*/
  258. static const struct snd_kcontrol_new memif_ul1_ch1_mix[] = {
  259. SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN21,
  260. I_ADDA_UL_CH1, 1, 0),
  261. };
  262. static const struct snd_kcontrol_new memif_ul1_ch2_mix[] = {
  263. SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN22,
  264. I_ADDA_UL_CH2, 1, 0),
  265. };
  266. static const struct snd_kcontrol_new memif_ul2_ch1_mix[] = {
  267. SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN5,
  268. I_ADDA_UL_CH1, 1, 0),
  269. SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH1", AFE_CONN5,
  270. I_DL1_CH1, 1, 0),
  271. SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH1", AFE_CONN5,
  272. I_DL2_CH1, 1, 0),
  273. SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH1", AFE_CONN5,
  274. I_DL3_CH1, 1, 0),
  275. };
  276. static const struct snd_kcontrol_new memif_ul2_ch2_mix[] = {
  277. SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN6,
  278. I_ADDA_UL_CH2, 1, 0),
  279. SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH2", AFE_CONN6,
  280. I_DL1_CH2, 1, 0),
  281. SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH2", AFE_CONN6,
  282. I_DL2_CH2, 1, 0),
  283. SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH2", AFE_CONN6,
  284. I_DL3_CH2, 1, 0),
  285. };
  286. static const struct snd_kcontrol_new memif_ul3_ch1_mix[] = {
  287. SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN9,
  288. I_ADDA_UL_CH1, 1, 0),
  289. };
  290. static const struct snd_kcontrol_new memif_ul3_ch2_mix[] = {
  291. SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN10,
  292. I_ADDA_UL_CH2, 1, 0),
  293. };
  294. static const struct snd_kcontrol_new memif_ul_mono_1_mix[] = {
  295. SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN12,
  296. I_ADDA_UL_CH1, 1, 0),
  297. SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN12,
  298. I_ADDA_UL_CH2, 1, 0),
  299. };
  300. static const struct snd_kcontrol_new memif_ul_mono_2_mix[] = {
  301. SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN11,
  302. I_ADDA_UL_CH1, 1, 0),
  303. SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN11,
  304. I_ADDA_UL_CH2, 1, 0),
  305. };
  306. static const struct snd_soc_dapm_widget mt6797_memif_widgets[] = {
  307. /* memif */
  308. SND_SOC_DAPM_MIXER("UL1_CH1", SND_SOC_NOPM, 0, 0,
  309. memif_ul1_ch1_mix, ARRAY_SIZE(memif_ul1_ch1_mix)),
  310. SND_SOC_DAPM_MIXER("UL1_CH2", SND_SOC_NOPM, 0, 0,
  311. memif_ul1_ch2_mix, ARRAY_SIZE(memif_ul1_ch2_mix)),
  312. SND_SOC_DAPM_MIXER("UL2_CH1", SND_SOC_NOPM, 0, 0,
  313. memif_ul2_ch1_mix, ARRAY_SIZE(memif_ul2_ch1_mix)),
  314. SND_SOC_DAPM_MIXER("UL2_CH2", SND_SOC_NOPM, 0, 0,
  315. memif_ul2_ch2_mix, ARRAY_SIZE(memif_ul2_ch2_mix)),
  316. SND_SOC_DAPM_MIXER("UL3_CH1", SND_SOC_NOPM, 0, 0,
  317. memif_ul3_ch1_mix, ARRAY_SIZE(memif_ul3_ch1_mix)),
  318. SND_SOC_DAPM_MIXER("UL3_CH2", SND_SOC_NOPM, 0, 0,
  319. memif_ul3_ch2_mix, ARRAY_SIZE(memif_ul3_ch2_mix)),
  320. SND_SOC_DAPM_MIXER("UL_MONO_1_CH1", SND_SOC_NOPM, 0, 0,
  321. memif_ul_mono_1_mix,
  322. ARRAY_SIZE(memif_ul_mono_1_mix)),
  323. SND_SOC_DAPM_MIXER("UL_MONO_2_CH1", SND_SOC_NOPM, 0, 0,
  324. memif_ul_mono_2_mix,
  325. ARRAY_SIZE(memif_ul_mono_2_mix)),
  326. };
  327. static const struct snd_soc_dapm_route mt6797_memif_routes[] = {
  328. /* capture */
  329. {"UL1", NULL, "UL1_CH1"},
  330. {"UL1", NULL, "UL1_CH2"},
  331. {"UL1_CH1", "ADDA_UL_CH1", "ADDA Capture"},
  332. {"UL1_CH2", "ADDA_UL_CH2", "ADDA Capture"},
  333. {"UL2", NULL, "UL2_CH1"},
  334. {"UL2", NULL, "UL2_CH2"},
  335. {"UL2_CH1", "ADDA_UL_CH1", "ADDA Capture"},
  336. {"UL2_CH2", "ADDA_UL_CH2", "ADDA Capture"},
  337. {"UL3", NULL, "UL3_CH1"},
  338. {"UL3", NULL, "UL3_CH2"},
  339. {"UL3_CH1", "ADDA_UL_CH1", "ADDA Capture"},
  340. {"UL3_CH2", "ADDA_UL_CH2", "ADDA Capture"},
  341. {"UL_MONO_1", NULL, "UL_MONO_1_CH1"},
  342. {"UL_MONO_1_CH1", "ADDA_UL_CH1", "ADDA Capture"},
  343. {"UL_MONO_1_CH1", "ADDA_UL_CH2", "ADDA Capture"},
  344. {"UL_MONO_2", NULL, "UL_MONO_2_CH1"},
  345. {"UL_MONO_2_CH1", "ADDA_UL_CH1", "ADDA Capture"},
  346. {"UL_MONO_2_CH1", "ADDA_UL_CH2", "ADDA Capture"},
  347. };
  348. static const struct snd_soc_component_driver mt6797_afe_pcm_dai_component = {
  349. .name = "mt6797-afe-pcm-dai",
  350. };
  351. static const struct mtk_base_memif_data memif_data[MT6797_MEMIF_NUM] = {
  352. [MT6797_MEMIF_DL1] = {
  353. .name = "DL1",
  354. .id = MT6797_MEMIF_DL1,
  355. .reg_ofs_base = AFE_DL1_BASE,
  356. .reg_ofs_cur = AFE_DL1_CUR,
  357. .fs_reg = AFE_DAC_CON1,
  358. .fs_shift = DL1_MODE_SFT,
  359. .fs_maskbit = DL1_MODE_MASK,
  360. .mono_reg = AFE_DAC_CON1,
  361. .mono_shift = DL1_DATA_SFT,
  362. .enable_reg = AFE_DAC_CON0,
  363. .enable_shift = DL1_ON_SFT,
  364. .hd_reg = AFE_MEMIF_HD_MODE,
  365. .hd_shift = DL1_HD_SFT,
  366. .agent_disable_reg = -1,
  367. .agent_disable_shift = -1,
  368. .msb_reg = -1,
  369. .msb_shift = -1,
  370. },
  371. [MT6797_MEMIF_DL2] = {
  372. .name = "DL2",
  373. .id = MT6797_MEMIF_DL2,
  374. .reg_ofs_base = AFE_DL2_BASE,
  375. .reg_ofs_cur = AFE_DL2_CUR,
  376. .fs_reg = AFE_DAC_CON1,
  377. .fs_shift = DL2_MODE_SFT,
  378. .fs_maskbit = DL2_MODE_MASK,
  379. .mono_reg = AFE_DAC_CON1,
  380. .mono_shift = DL2_DATA_SFT,
  381. .enable_reg = AFE_DAC_CON0,
  382. .enable_shift = DL2_ON_SFT,
  383. .hd_reg = AFE_MEMIF_HD_MODE,
  384. .hd_shift = DL2_HD_SFT,
  385. .agent_disable_reg = -1,
  386. .agent_disable_shift = -1,
  387. .msb_reg = -1,
  388. .msb_shift = -1,
  389. },
  390. [MT6797_MEMIF_DL3] = {
  391. .name = "DL3",
  392. .id = MT6797_MEMIF_DL3,
  393. .reg_ofs_base = AFE_DL3_BASE,
  394. .reg_ofs_cur = AFE_DL3_CUR,
  395. .fs_reg = AFE_DAC_CON0,
  396. .fs_shift = DL3_MODE_SFT,
  397. .fs_maskbit = DL3_MODE_MASK,
  398. .mono_reg = AFE_DAC_CON1,
  399. .mono_shift = DL3_DATA_SFT,
  400. .enable_reg = AFE_DAC_CON0,
  401. .enable_shift = DL3_ON_SFT,
  402. .hd_reg = AFE_MEMIF_HD_MODE,
  403. .hd_shift = DL3_HD_SFT,
  404. .agent_disable_reg = -1,
  405. .agent_disable_shift = -1,
  406. .msb_reg = -1,
  407. .msb_shift = -1,
  408. },
  409. [MT6797_MEMIF_VUL] = {
  410. .name = "VUL",
  411. .id = MT6797_MEMIF_VUL,
  412. .reg_ofs_base = AFE_VUL_BASE,
  413. .reg_ofs_cur = AFE_VUL_CUR,
  414. .fs_reg = AFE_DAC_CON1,
  415. .fs_shift = VUL_MODE_SFT,
  416. .fs_maskbit = VUL_MODE_MASK,
  417. .mono_reg = AFE_DAC_CON1,
  418. .mono_shift = VUL_DATA_SFT,
  419. .enable_reg = AFE_DAC_CON0,
  420. .enable_shift = VUL_ON_SFT,
  421. .hd_reg = AFE_MEMIF_HD_MODE,
  422. .hd_shift = VUL_HD_SFT,
  423. .agent_disable_reg = -1,
  424. .agent_disable_shift = -1,
  425. .msb_reg = -1,
  426. .msb_shift = -1,
  427. },
  428. [MT6797_MEMIF_AWB] = {
  429. .name = "AWB",
  430. .id = MT6797_MEMIF_AWB,
  431. .reg_ofs_base = AFE_AWB_BASE,
  432. .reg_ofs_cur = AFE_AWB_CUR,
  433. .fs_reg = AFE_DAC_CON1,
  434. .fs_shift = AWB_MODE_SFT,
  435. .fs_maskbit = AWB_MODE_MASK,
  436. .mono_reg = AFE_DAC_CON1,
  437. .mono_shift = AWB_DATA_SFT,
  438. .enable_reg = AFE_DAC_CON0,
  439. .enable_shift = AWB_ON_SFT,
  440. .hd_reg = AFE_MEMIF_HD_MODE,
  441. .hd_shift = AWB_HD_SFT,
  442. .agent_disable_reg = -1,
  443. .agent_disable_shift = -1,
  444. .msb_reg = -1,
  445. .msb_shift = -1,
  446. },
  447. [MT6797_MEMIF_VUL12] = {
  448. .name = "VUL12",
  449. .id = MT6797_MEMIF_VUL12,
  450. .reg_ofs_base = AFE_VUL_D2_BASE,
  451. .reg_ofs_cur = AFE_VUL_D2_CUR,
  452. .fs_reg = AFE_DAC_CON0,
  453. .fs_shift = VUL_DATA2_MODE_SFT,
  454. .fs_maskbit = VUL_DATA2_MODE_MASK,
  455. .mono_reg = AFE_DAC_CON0,
  456. .mono_shift = VUL_DATA2_DATA_SFT,
  457. .enable_reg = AFE_DAC_CON0,
  458. .enable_shift = VUL_DATA2_ON_SFT,
  459. .hd_reg = AFE_MEMIF_HD_MODE,
  460. .hd_shift = VUL_DATA2_HD_SFT,
  461. .agent_disable_reg = -1,
  462. .agent_disable_shift = -1,
  463. .msb_reg = -1,
  464. .msb_shift = -1,
  465. },
  466. [MT6797_MEMIF_DAI] = {
  467. .name = "DAI",
  468. .id = MT6797_MEMIF_DAI,
  469. .reg_ofs_base = AFE_DAI_BASE,
  470. .reg_ofs_cur = AFE_DAI_CUR,
  471. .fs_reg = AFE_DAC_CON0,
  472. .fs_shift = DAI_MODE_SFT,
  473. .fs_maskbit = DAI_MODE_MASK,
  474. .mono_reg = -1,
  475. .mono_shift = 0,
  476. .enable_reg = AFE_DAC_CON0,
  477. .enable_shift = DAI_ON_SFT,
  478. .hd_reg = AFE_MEMIF_HD_MODE,
  479. .hd_shift = DAI_HD_SFT,
  480. .agent_disable_reg = -1,
  481. .agent_disable_shift = -1,
  482. .msb_reg = -1,
  483. .msb_shift = -1,
  484. },
  485. [MT6797_MEMIF_MOD_DAI] = {
  486. .name = "MOD_DAI",
  487. .id = MT6797_MEMIF_MOD_DAI,
  488. .reg_ofs_base = AFE_MOD_DAI_BASE,
  489. .reg_ofs_cur = AFE_MOD_DAI_CUR,
  490. .fs_reg = AFE_DAC_CON1,
  491. .fs_shift = MOD_DAI_MODE_SFT,
  492. .fs_maskbit = MOD_DAI_MODE_MASK,
  493. .mono_reg = -1,
  494. .mono_shift = 0,
  495. .enable_reg = AFE_DAC_CON0,
  496. .enable_shift = MOD_DAI_ON_SFT,
  497. .hd_reg = AFE_MEMIF_HD_MODE,
  498. .hd_shift = MOD_DAI_HD_SFT,
  499. .agent_disable_reg = -1,
  500. .agent_disable_shift = -1,
  501. .msb_reg = -1,
  502. .msb_shift = -1,
  503. },
  504. };
  505. static const struct mtk_base_irq_data irq_data[MT6797_IRQ_NUM] = {
  506. [MT6797_IRQ_1] = {
  507. .id = MT6797_IRQ_1,
  508. .irq_cnt_reg = AFE_IRQ_MCU_CNT1,
  509. .irq_cnt_shift = AFE_IRQ_MCU_CNT1_SFT,
  510. .irq_cnt_maskbit = AFE_IRQ_MCU_CNT1_MASK,
  511. .irq_fs_reg = AFE_IRQ_MCU_CON,
  512. .irq_fs_shift = IRQ1_MCU_MODE_SFT,
  513. .irq_fs_maskbit = IRQ1_MCU_MODE_MASK,
  514. .irq_en_reg = AFE_IRQ_MCU_CON,
  515. .irq_en_shift = IRQ1_MCU_ON_SFT,
  516. .irq_clr_reg = AFE_IRQ_MCU_CLR,
  517. .irq_clr_shift = IRQ1_MCU_CLR_SFT,
  518. },
  519. [MT6797_IRQ_2] = {
  520. .id = MT6797_IRQ_2,
  521. .irq_cnt_reg = AFE_IRQ_MCU_CNT2,
  522. .irq_cnt_shift = AFE_IRQ_MCU_CNT2_SFT,
  523. .irq_cnt_maskbit = AFE_IRQ_MCU_CNT2_MASK,
  524. .irq_fs_reg = AFE_IRQ_MCU_CON,
  525. .irq_fs_shift = IRQ2_MCU_MODE_SFT,
  526. .irq_fs_maskbit = IRQ2_MCU_MODE_MASK,
  527. .irq_en_reg = AFE_IRQ_MCU_CON,
  528. .irq_en_shift = IRQ2_MCU_ON_SFT,
  529. .irq_clr_reg = AFE_IRQ_MCU_CLR,
  530. .irq_clr_shift = IRQ2_MCU_CLR_SFT,
  531. },
  532. [MT6797_IRQ_3] = {
  533. .id = MT6797_IRQ_3,
  534. .irq_cnt_reg = AFE_IRQ_MCU_CNT3,
  535. .irq_cnt_shift = AFE_IRQ_MCU_CNT3_SFT,
  536. .irq_cnt_maskbit = AFE_IRQ_MCU_CNT3_MASK,
  537. .irq_fs_reg = AFE_IRQ_MCU_CON,
  538. .irq_fs_shift = IRQ3_MCU_MODE_SFT,
  539. .irq_fs_maskbit = IRQ3_MCU_MODE_MASK,
  540. .irq_en_reg = AFE_IRQ_MCU_CON,
  541. .irq_en_shift = IRQ3_MCU_ON_SFT,
  542. .irq_clr_reg = AFE_IRQ_MCU_CLR,
  543. .irq_clr_shift = IRQ3_MCU_CLR_SFT,
  544. },
  545. [MT6797_IRQ_4] = {
  546. .id = MT6797_IRQ_4,
  547. .irq_cnt_reg = AFE_IRQ_MCU_CNT4,
  548. .irq_cnt_shift = AFE_IRQ_MCU_CNT4_SFT,
  549. .irq_cnt_maskbit = AFE_IRQ_MCU_CNT4_MASK,
  550. .irq_fs_reg = AFE_IRQ_MCU_CON,
  551. .irq_fs_shift = IRQ4_MCU_MODE_SFT,
  552. .irq_fs_maskbit = IRQ4_MCU_MODE_MASK,
  553. .irq_en_reg = AFE_IRQ_MCU_CON,
  554. .irq_en_shift = IRQ4_MCU_ON_SFT,
  555. .irq_clr_reg = AFE_IRQ_MCU_CLR,
  556. .irq_clr_shift = IRQ4_MCU_CLR_SFT,
  557. },
  558. [MT6797_IRQ_7] = {
  559. .id = MT6797_IRQ_7,
  560. .irq_cnt_reg = AFE_IRQ_MCU_CNT7,
  561. .irq_cnt_shift = AFE_IRQ_MCU_CNT7_SFT,
  562. .irq_cnt_maskbit = AFE_IRQ_MCU_CNT7_MASK,
  563. .irq_fs_reg = AFE_IRQ_MCU_CON,
  564. .irq_fs_shift = IRQ7_MCU_MODE_SFT,
  565. .irq_fs_maskbit = IRQ7_MCU_MODE_MASK,
  566. .irq_en_reg = AFE_IRQ_MCU_CON,
  567. .irq_en_shift = IRQ7_MCU_ON_SFT,
  568. .irq_clr_reg = AFE_IRQ_MCU_CLR,
  569. .irq_clr_shift = IRQ7_MCU_CLR_SFT,
  570. },
  571. };
  572. static const struct regmap_config mt6797_afe_regmap_config = {
  573. .reg_bits = 32,
  574. .reg_stride = 4,
  575. .val_bits = 32,
  576. .max_register = AFE_MAX_REGISTER,
  577. };
  578. static irqreturn_t mt6797_afe_irq_handler(int irq_id, void *dev)
  579. {
  580. struct mtk_base_afe *afe = dev;
  581. struct mtk_base_afe_irq *irq;
  582. unsigned int status;
  583. unsigned int mcu_en;
  584. int ret;
  585. int i;
  586. irqreturn_t irq_ret = IRQ_HANDLED;
  587. /* get irq that is sent to MCU */
  588. regmap_read(afe->regmap, AFE_IRQ_MCU_EN, &mcu_en);
  589. ret = regmap_read(afe->regmap, AFE_IRQ_MCU_STATUS, &status);
  590. if (ret || (status & mcu_en) == 0) {
  591. dev_err(afe->dev, "%s(), irq status err, ret %d, status 0x%x, mcu_en 0x%x\n",
  592. __func__, ret, status, mcu_en);
  593. /* only clear IRQ which is sent to MCU */
  594. status = mcu_en & AFE_IRQ_STATUS_BITS;
  595. irq_ret = IRQ_NONE;
  596. goto err_irq;
  597. }
  598. for (i = 0; i < MT6797_MEMIF_NUM; i++) {
  599. struct mtk_base_afe_memif *memif = &afe->memif[i];
  600. if (!memif->substream)
  601. continue;
  602. irq = &afe->irqs[memif->irq_usage];
  603. if (status & (1 << irq->irq_data->irq_en_shift))
  604. snd_pcm_period_elapsed(memif->substream);
  605. }
  606. err_irq:
  607. /* clear irq */
  608. regmap_write(afe->regmap,
  609. AFE_IRQ_MCU_CLR,
  610. status & AFE_IRQ_STATUS_BITS);
  611. return irq_ret;
  612. }
  613. static int mt6797_afe_runtime_suspend(struct device *dev)
  614. {
  615. struct mtk_base_afe *afe = dev_get_drvdata(dev);
  616. unsigned int afe_on_retm;
  617. int retry = 0;
  618. /* disable AFE */
  619. regmap_update_bits(afe->regmap, AFE_DAC_CON0, AFE_ON_MASK_SFT, 0x0);
  620. do {
  621. regmap_read(afe->regmap, AFE_DAC_CON0, &afe_on_retm);
  622. if ((afe_on_retm & AFE_ON_RETM_MASK_SFT) == 0)
  623. break;
  624. udelay(10);
  625. } while (++retry < 100000);
  626. if (retry)
  627. dev_warn(afe->dev, "%s(), retry %d\n", __func__, retry);
  628. /* make sure all irq status are cleared */
  629. regmap_update_bits(afe->regmap, AFE_IRQ_MCU_CLR, 0xffff, 0xffff);
  630. return mt6797_afe_disable_clock(afe);
  631. }
  632. static int mt6797_afe_runtime_resume(struct device *dev)
  633. {
  634. struct mtk_base_afe *afe = dev_get_drvdata(dev);
  635. int ret;
  636. ret = mt6797_afe_enable_clock(afe);
  637. if (ret)
  638. return ret;
  639. /* irq signal to mcu only */
  640. regmap_write(afe->regmap, AFE_IRQ_MCU_EN, AFE_IRQ_MCU_EN_MASK_SFT);
  641. /* force all memif use normal mode */
  642. regmap_update_bits(afe->regmap, AFE_MEMIF_HDALIGN,
  643. 0x7ff << 16, 0x7ff << 16);
  644. /* force cpu use normal mode when access sram data */
  645. regmap_update_bits(afe->regmap, AFE_MEMIF_MSB,
  646. CPU_COMPACT_MODE_MASK_SFT, 0);
  647. /* force cpu use 8_24 format when writing 32bit data */
  648. regmap_update_bits(afe->regmap, AFE_MEMIF_MSB,
  649. CPU_HD_ALIGN_MASK_SFT, 0);
  650. /* set all output port to 24bit */
  651. regmap_update_bits(afe->regmap, AFE_CONN_24BIT,
  652. 0x3fffffff, 0x3fffffff);
  653. /* enable AFE */
  654. regmap_update_bits(afe->regmap, AFE_DAC_CON0,
  655. AFE_ON_MASK_SFT,
  656. 0x1 << AFE_ON_SFT);
  657. return 0;
  658. }
  659. static int mt6797_afe_component_probe(struct snd_soc_component *component)
  660. {
  661. return mtk_afe_add_sub_dai_control(component);
  662. }
  663. static const struct snd_soc_component_driver mt6797_afe_component = {
  664. .name = AFE_PCM_NAME,
  665. .ops = &mtk_afe_pcm_ops,
  666. .pcm_new = mtk_afe_pcm_new,
  667. .pcm_free = mtk_afe_pcm_free,
  668. .probe = mt6797_afe_component_probe,
  669. };
  670. static int mt6797_dai_memif_register(struct mtk_base_afe *afe)
  671. {
  672. struct mtk_base_afe_dai *dai;
  673. dai = devm_kzalloc(afe->dev, sizeof(*dai), GFP_KERNEL);
  674. if (!dai)
  675. return -ENOMEM;
  676. list_add(&dai->list, &afe->sub_dais);
  677. dai->dai_drivers = mt6797_memif_dai_driver;
  678. dai->num_dai_drivers = ARRAY_SIZE(mt6797_memif_dai_driver);
  679. dai->dapm_widgets = mt6797_memif_widgets;
  680. dai->num_dapm_widgets = ARRAY_SIZE(mt6797_memif_widgets);
  681. dai->dapm_routes = mt6797_memif_routes;
  682. dai->num_dapm_routes = ARRAY_SIZE(mt6797_memif_routes);
  683. return 0;
  684. }
  685. typedef int (*dai_register_cb)(struct mtk_base_afe *);
  686. static const dai_register_cb dai_register_cbs[] = {
  687. mt6797_dai_adda_register,
  688. mt6797_dai_pcm_register,
  689. mt6797_dai_hostless_register,
  690. mt6797_dai_memif_register,
  691. };
  692. static int mt6797_afe_pcm_dev_probe(struct platform_device *pdev)
  693. {
  694. struct mtk_base_afe *afe;
  695. struct mt6797_afe_private *afe_priv;
  696. struct resource *res;
  697. struct device *dev;
  698. int i, irq_id, ret;
  699. afe = devm_kzalloc(&pdev->dev, sizeof(*afe), GFP_KERNEL);
  700. if (!afe)
  701. return -ENOMEM;
  702. afe->platform_priv = devm_kzalloc(&pdev->dev, sizeof(*afe_priv),
  703. GFP_KERNEL);
  704. if (!afe->platform_priv)
  705. return -ENOMEM;
  706. afe_priv = afe->platform_priv;
  707. afe->dev = &pdev->dev;
  708. dev = afe->dev;
  709. /* initial audio related clock */
  710. ret = mt6797_init_clock(afe);
  711. if (ret) {
  712. dev_err(dev, "init clock error\n");
  713. return ret;
  714. }
  715. /* regmap init */
  716. res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
  717. afe->base_addr = devm_ioremap_resource(&pdev->dev, res);
  718. if (IS_ERR(afe->base_addr))
  719. return PTR_ERR(afe->base_addr);
  720. afe->regmap = devm_regmap_init_mmio(&pdev->dev, afe->base_addr,
  721. &mt6797_afe_regmap_config);
  722. if (IS_ERR(afe->regmap))
  723. return PTR_ERR(afe->regmap);
  724. /* init memif */
  725. afe->memif_size = MT6797_MEMIF_NUM;
  726. afe->memif = devm_kcalloc(dev, afe->memif_size, sizeof(*afe->memif),
  727. GFP_KERNEL);
  728. if (!afe->memif)
  729. return -ENOMEM;
  730. for (i = 0; i < afe->memif_size; i++) {
  731. afe->memif[i].data = &memif_data[i];
  732. afe->memif[i].irq_usage = -1;
  733. }
  734. mutex_init(&afe->irq_alloc_lock);
  735. /* irq initialize */
  736. afe->irqs_size = MT6797_IRQ_NUM;
  737. afe->irqs = devm_kcalloc(dev, afe->irqs_size, sizeof(*afe->irqs),
  738. GFP_KERNEL);
  739. if (!afe->irqs)
  740. return -ENOMEM;
  741. for (i = 0; i < afe->irqs_size; i++)
  742. afe->irqs[i].irq_data = &irq_data[i];
  743. /* request irq */
  744. irq_id = platform_get_irq(pdev, 0);
  745. if (!irq_id) {
  746. dev_err(dev, "%s no irq found\n", dev->of_node->name);
  747. return -ENXIO;
  748. }
  749. ret = devm_request_irq(dev, irq_id, mt6797_afe_irq_handler,
  750. IRQF_TRIGGER_NONE, "asys-isr", (void *)afe);
  751. if (ret) {
  752. dev_err(dev, "could not request_irq for asys-isr\n");
  753. return ret;
  754. }
  755. /* init sub_dais */
  756. INIT_LIST_HEAD(&afe->sub_dais);
  757. for (i = 0; i < ARRAY_SIZE(dai_register_cbs); i++) {
  758. ret = dai_register_cbs[i](afe);
  759. if (ret) {
  760. dev_warn(afe->dev, "dai register i %d fail, ret %d\n",
  761. i, ret);
  762. return ret;
  763. }
  764. }
  765. /* init dai_driver and component_driver */
  766. ret = mtk_afe_combine_sub_dai(afe);
  767. if (ret) {
  768. dev_warn(afe->dev, "mtk_afe_combine_sub_dai fail, ret %d\n",
  769. ret);
  770. return ret;
  771. }
  772. afe->mtk_afe_hardware = &mt6797_afe_hardware;
  773. afe->memif_fs = mt6797_memif_fs;
  774. afe->irq_fs = mt6797_irq_fs;
  775. afe->runtime_resume = mt6797_afe_runtime_resume;
  776. afe->runtime_suspend = mt6797_afe_runtime_suspend;
  777. platform_set_drvdata(pdev, afe);
  778. pm_runtime_enable(dev);
  779. if (!pm_runtime_enabled(dev))
  780. goto err_pm_disable;
  781. pm_runtime_get_sync(&pdev->dev);
  782. /* register component */
  783. ret = devm_snd_soc_register_component(dev, &mt6797_afe_component,
  784. NULL, 0);
  785. if (ret) {
  786. dev_warn(dev, "err_platform\n");
  787. goto err_pm_disable;
  788. }
  789. ret = devm_snd_soc_register_component(afe->dev,
  790. &mt6797_afe_pcm_dai_component,
  791. afe->dai_drivers,
  792. afe->num_dai_drivers);
  793. if (ret) {
  794. dev_warn(dev, "err_dai_component\n");
  795. goto err_pm_disable;
  796. }
  797. return 0;
  798. err_pm_disable:
  799. pm_runtime_disable(dev);
  800. return ret;
  801. }
  802. static int mt6797_afe_pcm_dev_remove(struct platform_device *pdev)
  803. {
  804. pm_runtime_disable(&pdev->dev);
  805. if (!pm_runtime_status_suspended(&pdev->dev))
  806. mt6797_afe_runtime_suspend(&pdev->dev);
  807. pm_runtime_put_sync(&pdev->dev);
  808. return 0;
  809. }
  810. static const struct of_device_id mt6797_afe_pcm_dt_match[] = {
  811. { .compatible = "mediatek,mt6797-audio", },
  812. {},
  813. };
  814. MODULE_DEVICE_TABLE(of, mt6797_afe_pcm_dt_match);
  815. static const struct dev_pm_ops mt6797_afe_pm_ops = {
  816. SET_RUNTIME_PM_OPS(mt6797_afe_runtime_suspend,
  817. mt6797_afe_runtime_resume, NULL)
  818. };
  819. static struct platform_driver mt6797_afe_pcm_driver = {
  820. .driver = {
  821. .name = "mt6797-audio",
  822. .of_match_table = mt6797_afe_pcm_dt_match,
  823. #ifdef CONFIG_PM
  824. .pm = &mt6797_afe_pm_ops,
  825. #endif
  826. },
  827. .probe = mt6797_afe_pcm_dev_probe,
  828. .remove = mt6797_afe_pcm_dev_remove,
  829. };
  830. module_platform_driver(mt6797_afe_pcm_driver);
  831. MODULE_DESCRIPTION("Mediatek ALSA SoC AFE platform driver for 6797");
  832. MODULE_AUTHOR("KaiChieh Chuang <kaichieh.chuang@mediatek.com>");
  833. MODULE_LICENSE("GPL v2");