mt8195-dai-adda.c 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * MediaTek ALSA SoC Audio DAI ADDA Control
  4. *
  5. * Copyright (c) 2021 MediaTek Inc.
  6. * Author: Bicycle Tsai <[email protected]>
  7. * Trevor Wu <[email protected]>
  8. */
  9. #include <linux/delay.h>
  10. #include <linux/regmap.h>
  11. #include "mt8195-afe-clk.h"
  12. #include "mt8195-afe-common.h"
  13. #include "mt8195-reg.h"
  14. #define ADDA_DL_GAIN_LOOPBACK 0x1800
  15. #define ADDA_HIRES_THRES 48000
  16. enum {
  17. SUPPLY_SEQ_CLOCK_SEL,
  18. SUPPLY_SEQ_CLOCK_ON,
  19. SUPPLY_SEQ_ADDA_DL_ON,
  20. SUPPLY_SEQ_ADDA_MTKAIF_CFG,
  21. SUPPLY_SEQ_ADDA_UL_ON,
  22. SUPPLY_SEQ_ADDA_AFE_ON,
  23. };
  24. enum {
  25. MTK_AFE_ADDA_DL_RATE_8K = 0,
  26. MTK_AFE_ADDA_DL_RATE_11K = 1,
  27. MTK_AFE_ADDA_DL_RATE_12K = 2,
  28. MTK_AFE_ADDA_DL_RATE_16K = 3,
  29. MTK_AFE_ADDA_DL_RATE_22K = 4,
  30. MTK_AFE_ADDA_DL_RATE_24K = 5,
  31. MTK_AFE_ADDA_DL_RATE_32K = 6,
  32. MTK_AFE_ADDA_DL_RATE_44K = 7,
  33. MTK_AFE_ADDA_DL_RATE_48K = 8,
  34. MTK_AFE_ADDA_DL_RATE_96K = 9,
  35. MTK_AFE_ADDA_DL_RATE_192K = 10,
  36. };
  37. enum {
  38. MTK_AFE_ADDA_UL_RATE_8K = 0,
  39. MTK_AFE_ADDA_UL_RATE_16K = 1,
  40. MTK_AFE_ADDA_UL_RATE_32K = 2,
  41. MTK_AFE_ADDA_UL_RATE_48K = 3,
  42. MTK_AFE_ADDA_UL_RATE_96K = 4,
  43. MTK_AFE_ADDA_UL_RATE_192K = 5,
  44. };
  45. enum {
  46. DELAY_DATA_MISO1 = 0,
  47. DELAY_DATA_MISO0 = 1,
  48. DELAY_DATA_MISO2 = 1,
  49. };
  50. enum {
  51. MTK_AFE_ADDA,
  52. MTK_AFE_ADDA6,
  53. };
  54. struct mtk_dai_adda_priv {
  55. bool hires_required;
  56. };
  57. static unsigned int afe_adda_dl_rate_transform(struct mtk_base_afe *afe,
  58. unsigned int rate)
  59. {
  60. switch (rate) {
  61. case 8000:
  62. return MTK_AFE_ADDA_DL_RATE_8K;
  63. case 11025:
  64. return MTK_AFE_ADDA_DL_RATE_11K;
  65. case 12000:
  66. return MTK_AFE_ADDA_DL_RATE_12K;
  67. case 16000:
  68. return MTK_AFE_ADDA_DL_RATE_16K;
  69. case 22050:
  70. return MTK_AFE_ADDA_DL_RATE_22K;
  71. case 24000:
  72. return MTK_AFE_ADDA_DL_RATE_24K;
  73. case 32000:
  74. return MTK_AFE_ADDA_DL_RATE_32K;
  75. case 44100:
  76. return MTK_AFE_ADDA_DL_RATE_44K;
  77. case 48000:
  78. return MTK_AFE_ADDA_DL_RATE_48K;
  79. case 96000:
  80. return MTK_AFE_ADDA_DL_RATE_96K;
  81. case 192000:
  82. return MTK_AFE_ADDA_DL_RATE_192K;
  83. default:
  84. dev_info(afe->dev, "%s(), rate %d invalid, use 48kHz!!!\n",
  85. __func__, rate);
  86. return MTK_AFE_ADDA_DL_RATE_48K;
  87. }
  88. }
  89. static unsigned int afe_adda_ul_rate_transform(struct mtk_base_afe *afe,
  90. unsigned int rate)
  91. {
  92. switch (rate) {
  93. case 8000:
  94. return MTK_AFE_ADDA_UL_RATE_8K;
  95. case 16000:
  96. return MTK_AFE_ADDA_UL_RATE_16K;
  97. case 32000:
  98. return MTK_AFE_ADDA_UL_RATE_32K;
  99. case 48000:
  100. return MTK_AFE_ADDA_UL_RATE_48K;
  101. case 96000:
  102. return MTK_AFE_ADDA_UL_RATE_96K;
  103. case 192000:
  104. return MTK_AFE_ADDA_UL_RATE_192K;
  105. default:
  106. dev_info(afe->dev, "%s(), rate %d invalid, use 48kHz!!!\n",
  107. __func__, rate);
  108. return MTK_AFE_ADDA_UL_RATE_48K;
  109. }
  110. }
  111. static int mt8195_adda_mtkaif_init(struct mtk_base_afe *afe)
  112. {
  113. struct mt8195_afe_private *afe_priv = afe->platform_priv;
  114. struct mtkaif_param *param = &afe_priv->mtkaif_params;
  115. int delay_data;
  116. int delay_cycle;
  117. unsigned int mask = 0;
  118. unsigned int val = 0;
  119. /* set rx protocol 2 & mtkaif_rxif_clkinv_adc inverse */
  120. mask = (MTKAIF_RXIF_CLKINV_ADC | MTKAIF_RXIF_PROTOCOL2);
  121. val = (MTKAIF_RXIF_CLKINV_ADC | MTKAIF_RXIF_PROTOCOL2);
  122. regmap_update_bits(afe->regmap, AFE_ADDA_MTKAIF_CFG0, mask, val);
  123. regmap_update_bits(afe->regmap, AFE_ADDA6_MTKAIF_CFG0, mask, val);
  124. mask = RG_RX_PROTOCOL2;
  125. val = RG_RX_PROTOCOL2;
  126. regmap_update_bits(afe->regmap, AFE_AUD_PAD_TOP, mask, val);
  127. if (!param->mtkaif_calibration_ok) {
  128. dev_info(afe->dev, "%s(), calibration fail\n", __func__);
  129. return 0;
  130. }
  131. /* set delay for ch1, ch2 */
  132. if (param->mtkaif_phase_cycle[MT8195_MTKAIF_MISO_0] >=
  133. param->mtkaif_phase_cycle[MT8195_MTKAIF_MISO_1]) {
  134. delay_data = DELAY_DATA_MISO1;
  135. delay_cycle =
  136. param->mtkaif_phase_cycle[MT8195_MTKAIF_MISO_0] -
  137. param->mtkaif_phase_cycle[MT8195_MTKAIF_MISO_1];
  138. } else {
  139. delay_data = DELAY_DATA_MISO0;
  140. delay_cycle =
  141. param->mtkaif_phase_cycle[MT8195_MTKAIF_MISO_1] -
  142. param->mtkaif_phase_cycle[MT8195_MTKAIF_MISO_0];
  143. }
  144. val = 0;
  145. mask = (MTKAIF_RXIF_DELAY_DATA | MTKAIF_RXIF_DELAY_CYCLE_MASK);
  146. val |= MTKAIF_RXIF_DELAY_CYCLE(delay_cycle) &
  147. MTKAIF_RXIF_DELAY_CYCLE_MASK;
  148. val |= delay_data << MTKAIF_RXIF_DELAY_DATA_SHIFT;
  149. regmap_update_bits(afe->regmap, AFE_ADDA_MTKAIF_RX_CFG2, mask, val);
  150. /* set delay between ch3 and ch2 */
  151. if (param->mtkaif_phase_cycle[MT8195_MTKAIF_MISO_2] >=
  152. param->mtkaif_phase_cycle[MT8195_MTKAIF_MISO_1]) {
  153. delay_data = DELAY_DATA_MISO1;
  154. delay_cycle =
  155. param->mtkaif_phase_cycle[MT8195_MTKAIF_MISO_2] -
  156. param->mtkaif_phase_cycle[MT8195_MTKAIF_MISO_1];
  157. } else {
  158. delay_data = DELAY_DATA_MISO2;
  159. delay_cycle =
  160. param->mtkaif_phase_cycle[MT8195_MTKAIF_MISO_1] -
  161. param->mtkaif_phase_cycle[MT8195_MTKAIF_MISO_2];
  162. }
  163. val = 0;
  164. mask = (MTKAIF_RXIF_DELAY_DATA | MTKAIF_RXIF_DELAY_CYCLE_MASK);
  165. val |= MTKAIF_RXIF_DELAY_CYCLE(delay_cycle) &
  166. MTKAIF_RXIF_DELAY_CYCLE_MASK;
  167. val |= delay_data << MTKAIF_RXIF_DELAY_DATA_SHIFT;
  168. regmap_update_bits(afe->regmap, AFE_ADDA6_MTKAIF_RX_CFG2, mask, val);
  169. return 0;
  170. }
  171. static int mtk_adda_mtkaif_cfg_event(struct snd_soc_dapm_widget *w,
  172. struct snd_kcontrol *kcontrol,
  173. int event)
  174. {
  175. struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
  176. struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
  177. dev_dbg(afe->dev, "%s(), name %s, event 0x%x\n",
  178. __func__, w->name, event);
  179. switch (event) {
  180. case SND_SOC_DAPM_PRE_PMU:
  181. mt8195_adda_mtkaif_init(afe);
  182. break;
  183. default:
  184. break;
  185. }
  186. return 0;
  187. }
  188. static int mtk_adda_dl_event(struct snd_soc_dapm_widget *w,
  189. struct snd_kcontrol *kcontrol,
  190. int event)
  191. {
  192. struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
  193. struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
  194. dev_dbg(afe->dev, "%s(), name %s, event 0x%x\n",
  195. __func__, w->name, event);
  196. switch (event) {
  197. case SND_SOC_DAPM_POST_PMD:
  198. /* should delayed 1/fs(smallest is 8k) = 125us before afe off */
  199. usleep_range(125, 135);
  200. break;
  201. default:
  202. break;
  203. }
  204. return 0;
  205. }
  206. static void mtk_adda_ul_mictype(struct mtk_base_afe *afe, int adda, bool dmic)
  207. {
  208. unsigned int reg = 0;
  209. unsigned int mask = 0;
  210. unsigned int val = 0;
  211. switch (adda) {
  212. case MTK_AFE_ADDA:
  213. reg = AFE_ADDA_UL_SRC_CON0;
  214. break;
  215. case MTK_AFE_ADDA6:
  216. reg = AFE_ADDA6_UL_SRC_CON0;
  217. break;
  218. default:
  219. dev_info(afe->dev, "%s(), wrong parameter\n", __func__);
  220. return;
  221. }
  222. mask = (UL_SDM3_LEVEL_CTL | UL_MODE_3P25M_CH1_CTL |
  223. UL_MODE_3P25M_CH2_CTL);
  224. /* turn on dmic, ch1, ch2 */
  225. if (dmic)
  226. val = mask;
  227. regmap_update_bits(afe->regmap, reg, mask, val);
  228. }
  229. static int mtk_adda_ul_event(struct snd_soc_dapm_widget *w,
  230. struct snd_kcontrol *kcontrol,
  231. int event)
  232. {
  233. struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
  234. struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
  235. struct mt8195_afe_private *afe_priv = afe->platform_priv;
  236. struct mtkaif_param *param = &afe_priv->mtkaif_params;
  237. dev_dbg(afe->dev, "%s(), name %s, event 0x%x\n",
  238. __func__, w->name, event);
  239. switch (event) {
  240. case SND_SOC_DAPM_PRE_PMU:
  241. mtk_adda_ul_mictype(afe, MTK_AFE_ADDA, param->mtkaif_dmic_on);
  242. break;
  243. case SND_SOC_DAPM_POST_PMD:
  244. /* should delayed 1/fs(smallest is 8k) = 125us before afe off */
  245. usleep_range(125, 135);
  246. break;
  247. default:
  248. break;
  249. }
  250. return 0;
  251. }
  252. static int mtk_adda6_ul_event(struct snd_soc_dapm_widget *w,
  253. struct snd_kcontrol *kcontrol,
  254. int event)
  255. {
  256. struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
  257. struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
  258. struct mt8195_afe_private *afe_priv = afe->platform_priv;
  259. struct mtkaif_param *param = &afe_priv->mtkaif_params;
  260. unsigned int val;
  261. dev_dbg(afe->dev, "%s(), name %s, event 0x%x\n",
  262. __func__, w->name, event);
  263. switch (event) {
  264. case SND_SOC_DAPM_PRE_PMU:
  265. mtk_adda_ul_mictype(afe, MTK_AFE_ADDA6, param->mtkaif_dmic_on);
  266. val = (param->mtkaif_adda6_only ?
  267. ADDA6_MTKAIF_RX_SYNC_WORD2_DISABLE : 0);
  268. regmap_update_bits(afe->regmap,
  269. AFE_ADDA_MTKAIF_SYNCWORD_CFG,
  270. ADDA6_MTKAIF_RX_SYNC_WORD2_DISABLE,
  271. val);
  272. break;
  273. case SND_SOC_DAPM_POST_PMD:
  274. /* should delayed 1/fs(smallest is 8k) = 125us before afe off */
  275. usleep_range(125, 135);
  276. break;
  277. default:
  278. break;
  279. }
  280. return 0;
  281. }
  282. static int mtk_audio_hires_event(struct snd_soc_dapm_widget *w,
  283. struct snd_kcontrol *kcontrol,
  284. int event)
  285. {
  286. struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
  287. struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
  288. struct mt8195_afe_private *afe_priv = afe->platform_priv;
  289. struct clk *clk = afe_priv->clk[MT8195_CLK_TOP_AUDIO_H_SEL];
  290. struct clk *clk_parent;
  291. dev_dbg(afe->dev, "%s(), name %s, event 0x%x\n",
  292. __func__, w->name, event);
  293. switch (event) {
  294. case SND_SOC_DAPM_PRE_PMU:
  295. clk_parent = afe_priv->clk[MT8195_CLK_TOP_APLL1];
  296. break;
  297. case SND_SOC_DAPM_POST_PMD:
  298. clk_parent = afe_priv->clk[MT8195_CLK_XTAL_26M];
  299. break;
  300. default:
  301. return 0;
  302. }
  303. mt8195_afe_set_clk_parent(afe, clk, clk_parent);
  304. return 0;
  305. }
  306. static struct mtk_dai_adda_priv *get_adda_priv_by_name(struct mtk_base_afe *afe,
  307. const char *name)
  308. {
  309. struct mt8195_afe_private *afe_priv = afe->platform_priv;
  310. int dai_id;
  311. if (strstr(name, "aud_adc_hires"))
  312. dai_id = MT8195_AFE_IO_UL_SRC1;
  313. else if (strstr(name, "aud_adda6_adc_hires"))
  314. dai_id = MT8195_AFE_IO_UL_SRC2;
  315. else if (strstr(name, "aud_dac_hires"))
  316. dai_id = MT8195_AFE_IO_DL_SRC;
  317. else
  318. return NULL;
  319. return afe_priv->dai_priv[dai_id];
  320. }
  321. static int mtk_afe_adda_hires_connect(struct snd_soc_dapm_widget *source,
  322. struct snd_soc_dapm_widget *sink)
  323. {
  324. struct snd_soc_dapm_widget *w = source;
  325. struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
  326. struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
  327. struct mtk_dai_adda_priv *adda_priv;
  328. adda_priv = get_adda_priv_by_name(afe, w->name);
  329. if (!adda_priv) {
  330. dev_info(afe->dev, "adda_priv == NULL");
  331. return 0;
  332. }
  333. return (adda_priv->hires_required) ? 1 : 0;
  334. }
  335. static const struct snd_kcontrol_new mtk_dai_adda_o176_mix[] = {
  336. SOC_DAPM_SINGLE_AUTODISABLE("I000 Switch", AFE_CONN176, 0, 1, 0),
  337. SOC_DAPM_SINGLE_AUTODISABLE("I002 Switch", AFE_CONN176, 2, 1, 0),
  338. SOC_DAPM_SINGLE_AUTODISABLE("I020 Switch", AFE_CONN176, 20, 1, 0),
  339. SOC_DAPM_SINGLE_AUTODISABLE("I022 Switch", AFE_CONN176, 22, 1, 0),
  340. SOC_DAPM_SINGLE_AUTODISABLE("I070 Switch", AFE_CONN176_2, 6, 1, 0),
  341. };
  342. static const struct snd_kcontrol_new mtk_dai_adda_o177_mix[] = {
  343. SOC_DAPM_SINGLE_AUTODISABLE("I001 Switch", AFE_CONN177, 1, 1, 0),
  344. SOC_DAPM_SINGLE_AUTODISABLE("I003 Switch", AFE_CONN177, 3, 1, 0),
  345. SOC_DAPM_SINGLE_AUTODISABLE("I021 Switch", AFE_CONN177, 21, 1, 0),
  346. SOC_DAPM_SINGLE_AUTODISABLE("I023 Switch", AFE_CONN177, 23, 1, 0),
  347. SOC_DAPM_SINGLE_AUTODISABLE("I071 Switch", AFE_CONN177_2, 7, 1, 0),
  348. };
  349. static const char * const adda_dlgain_mux_map[] = {
  350. "Bypass", "Connect",
  351. };
  352. static SOC_ENUM_SINGLE_DECL(adda_dlgain_mux_map_enum,
  353. SND_SOC_NOPM, 0,
  354. adda_dlgain_mux_map);
  355. static const struct snd_kcontrol_new adda_dlgain_mux_control =
  356. SOC_DAPM_ENUM("DL_GAIN_MUX", adda_dlgain_mux_map_enum);
  357. static const struct snd_soc_dapm_widget mtk_dai_adda_widgets[] = {
  358. SND_SOC_DAPM_MIXER("I168", SND_SOC_NOPM, 0, 0, NULL, 0),
  359. SND_SOC_DAPM_MIXER("I169", SND_SOC_NOPM, 0, 0, NULL, 0),
  360. SND_SOC_DAPM_MIXER("I170", SND_SOC_NOPM, 0, 0, NULL, 0),
  361. SND_SOC_DAPM_MIXER("I171", SND_SOC_NOPM, 0, 0, NULL, 0),
  362. SND_SOC_DAPM_MIXER("O176", SND_SOC_NOPM, 0, 0,
  363. mtk_dai_adda_o176_mix,
  364. ARRAY_SIZE(mtk_dai_adda_o176_mix)),
  365. SND_SOC_DAPM_MIXER("O177", SND_SOC_NOPM, 0, 0,
  366. mtk_dai_adda_o177_mix,
  367. ARRAY_SIZE(mtk_dai_adda_o177_mix)),
  368. SND_SOC_DAPM_SUPPLY_S("ADDA Enable", SUPPLY_SEQ_ADDA_AFE_ON,
  369. AFE_ADDA_UL_DL_CON0,
  370. ADDA_AFE_ON_SHIFT, 0,
  371. NULL,
  372. 0),
  373. SND_SOC_DAPM_SUPPLY_S("ADDA Playback Enable", SUPPLY_SEQ_ADDA_DL_ON,
  374. AFE_ADDA_DL_SRC2_CON0,
  375. DL_2_SRC_ON_TMP_CTRL_PRE_SHIFT, 0,
  376. mtk_adda_dl_event,
  377. SND_SOC_DAPM_POST_PMD),
  378. SND_SOC_DAPM_SUPPLY_S("ADDA Capture Enable", SUPPLY_SEQ_ADDA_UL_ON,
  379. AFE_ADDA_UL_SRC_CON0,
  380. UL_SRC_ON_TMP_CTL_SHIFT, 0,
  381. mtk_adda_ul_event,
  382. SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
  383. SND_SOC_DAPM_SUPPLY_S("ADDA6 Capture Enable", SUPPLY_SEQ_ADDA_UL_ON,
  384. AFE_ADDA6_UL_SRC_CON0,
  385. UL_SRC_ON_TMP_CTL_SHIFT, 0,
  386. mtk_adda6_ul_event,
  387. SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
  388. SND_SOC_DAPM_SUPPLY_S("AUDIO_HIRES", SUPPLY_SEQ_CLOCK_SEL,
  389. SND_SOC_NOPM,
  390. 0, 0,
  391. mtk_audio_hires_event,
  392. SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
  393. SND_SOC_DAPM_SUPPLY_S("ADDA_MTKAIF_CFG", SUPPLY_SEQ_ADDA_MTKAIF_CFG,
  394. SND_SOC_NOPM,
  395. 0, 0,
  396. mtk_adda_mtkaif_cfg_event,
  397. SND_SOC_DAPM_PRE_PMU),
  398. SND_SOC_DAPM_MUX("DL_GAIN_MUX", SND_SOC_NOPM, 0, 0,
  399. &adda_dlgain_mux_control),
  400. SND_SOC_DAPM_PGA("DL_GAIN", AFE_ADDA_DL_SRC2_CON0,
  401. DL_2_GAIN_ON_CTL_PRE_SHIFT, 0, NULL, 0),
  402. SND_SOC_DAPM_INPUT("ADDA_INPUT"),
  403. SND_SOC_DAPM_OUTPUT("ADDA_OUTPUT"),
  404. SND_SOC_DAPM_CLOCK_SUPPLY("aud_dac"),
  405. SND_SOC_DAPM_CLOCK_SUPPLY("aud_adc"),
  406. SND_SOC_DAPM_CLOCK_SUPPLY("aud_adda6_adc"),
  407. SND_SOC_DAPM_CLOCK_SUPPLY("aud_dac_hires"),
  408. SND_SOC_DAPM_CLOCK_SUPPLY("aud_adc_hires"),
  409. SND_SOC_DAPM_CLOCK_SUPPLY("aud_adda6_adc_hires"),
  410. };
  411. static const struct snd_soc_dapm_route mtk_dai_adda_routes[] = {
  412. {"ADDA Capture", NULL, "ADDA Enable"},
  413. {"ADDA Capture", NULL, "ADDA Capture Enable"},
  414. {"ADDA Capture", NULL, "ADDA_MTKAIF_CFG"},
  415. {"ADDA Capture", NULL, "aud_adc"},
  416. {"ADDA Capture", NULL, "aud_adc_hires", mtk_afe_adda_hires_connect},
  417. {"aud_adc_hires", NULL, "AUDIO_HIRES"},
  418. {"ADDA6 Capture", NULL, "ADDA Enable"},
  419. {"ADDA6 Capture", NULL, "ADDA6 Capture Enable"},
  420. {"ADDA6 Capture", NULL, "ADDA_MTKAIF_CFG"},
  421. {"ADDA6 Capture", NULL, "aud_adda6_adc"},
  422. {"ADDA6 Capture", NULL, "aud_adda6_adc_hires",
  423. mtk_afe_adda_hires_connect},
  424. {"aud_adda6_adc_hires", NULL, "AUDIO_HIRES"},
  425. {"I168", NULL, "ADDA Capture"},
  426. {"I169", NULL, "ADDA Capture"},
  427. {"I170", NULL, "ADDA6 Capture"},
  428. {"I171", NULL, "ADDA6 Capture"},
  429. {"ADDA Playback", NULL, "ADDA Enable"},
  430. {"ADDA Playback", NULL, "ADDA Playback Enable"},
  431. {"ADDA Playback", NULL, "aud_dac"},
  432. {"ADDA Playback", NULL, "aud_dac_hires", mtk_afe_adda_hires_connect},
  433. {"aud_dac_hires", NULL, "AUDIO_HIRES"},
  434. {"DL_GAIN", NULL, "O176"},
  435. {"DL_GAIN", NULL, "O177"},
  436. {"DL_GAIN_MUX", "Bypass", "O176"},
  437. {"DL_GAIN_MUX", "Bypass", "O177"},
  438. {"DL_GAIN_MUX", "Connect", "DL_GAIN"},
  439. {"ADDA Playback", NULL, "DL_GAIN_MUX"},
  440. {"O176", "I000 Switch", "I000"},
  441. {"O177", "I001 Switch", "I001"},
  442. {"O176", "I002 Switch", "I002"},
  443. {"O177", "I003 Switch", "I003"},
  444. {"O176", "I020 Switch", "I020"},
  445. {"O177", "I021 Switch", "I021"},
  446. {"O176", "I022 Switch", "I022"},
  447. {"O177", "I023 Switch", "I023"},
  448. {"O176", "I070 Switch", "I070"},
  449. {"O177", "I071 Switch", "I071"},
  450. {"ADDA Capture", NULL, "ADDA_INPUT"},
  451. {"ADDA6 Capture", NULL, "ADDA_INPUT"},
  452. {"ADDA_OUTPUT", NULL, "ADDA Playback"},
  453. };
  454. static int mt8195_adda_dl_gain_put(struct snd_kcontrol *kcontrol,
  455. struct snd_ctl_elem_value *ucontrol)
  456. {
  457. struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);
  458. struct mtk_base_afe *afe = snd_soc_component_get_drvdata(component);
  459. unsigned int reg = AFE_ADDA_DL_SRC2_CON1;
  460. unsigned int mask = DL_2_GAIN_CTL_PRE_MASK;
  461. unsigned int value = (unsigned int)(ucontrol->value.integer.value[0]);
  462. regmap_update_bits(afe->regmap, reg, mask, DL_2_GAIN_CTL_PRE(value));
  463. return 0;
  464. }
  465. static int mt8195_adda_dl_gain_get(struct snd_kcontrol *kcontrol,
  466. struct snd_ctl_elem_value *ucontrol)
  467. {
  468. struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);
  469. struct mtk_base_afe *afe = snd_soc_component_get_drvdata(component);
  470. unsigned int reg = AFE_ADDA_DL_SRC2_CON1;
  471. unsigned int mask = DL_2_GAIN_CTL_PRE_MASK;
  472. unsigned int value = 0;
  473. regmap_read(afe->regmap, reg, &value);
  474. ucontrol->value.integer.value[0] = ((value & mask) >>
  475. DL_2_GAIN_CTL_PRE_SHIFT);
  476. return 0;
  477. }
  478. static int mt8195_adda6_only_get(struct snd_kcontrol *kcontrol,
  479. struct snd_ctl_elem_value *ucontrol)
  480. {
  481. struct snd_soc_component *cmpnt = snd_soc_kcontrol_component(kcontrol);
  482. struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
  483. struct mt8195_afe_private *afe_priv = afe->platform_priv;
  484. struct mtkaif_param *param = &afe_priv->mtkaif_params;
  485. ucontrol->value.integer.value[0] = param->mtkaif_adda6_only;
  486. return 0;
  487. }
  488. static int mt8195_adda6_only_set(struct snd_kcontrol *kcontrol,
  489. struct snd_ctl_elem_value *ucontrol)
  490. {
  491. struct snd_soc_component *cmpnt = snd_soc_kcontrol_component(kcontrol);
  492. struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
  493. struct mt8195_afe_private *afe_priv = afe->platform_priv;
  494. struct mtkaif_param *param = &afe_priv->mtkaif_params;
  495. int mtkaif_adda6_only;
  496. mtkaif_adda6_only = ucontrol->value.integer.value[0];
  497. dev_info(afe->dev, "%s(), kcontrol name %s, mtkaif_adda6_only %d\n",
  498. __func__, kcontrol->id.name, mtkaif_adda6_only);
  499. param->mtkaif_adda6_only = mtkaif_adda6_only;
  500. return 0;
  501. }
  502. static int mt8195_adda_dmic_get(struct snd_kcontrol *kcontrol,
  503. struct snd_ctl_elem_value *ucontrol)
  504. {
  505. struct snd_soc_component *cmpnt = snd_soc_kcontrol_component(kcontrol);
  506. struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
  507. struct mt8195_afe_private *afe_priv = afe->platform_priv;
  508. struct mtkaif_param *param = &afe_priv->mtkaif_params;
  509. ucontrol->value.integer.value[0] = param->mtkaif_dmic_on;
  510. return 0;
  511. }
  512. static int mt8195_adda_dmic_set(struct snd_kcontrol *kcontrol,
  513. struct snd_ctl_elem_value *ucontrol)
  514. {
  515. struct snd_soc_component *cmpnt = snd_soc_kcontrol_component(kcontrol);
  516. struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
  517. struct mt8195_afe_private *afe_priv = afe->platform_priv;
  518. struct mtkaif_param *param = &afe_priv->mtkaif_params;
  519. int dmic_on;
  520. dmic_on = ucontrol->value.integer.value[0];
  521. dev_dbg(afe->dev, "%s(), kcontrol name %s, dmic_on %d\n",
  522. __func__, kcontrol->id.name, dmic_on);
  523. param->mtkaif_dmic_on = dmic_on;
  524. return 0;
  525. }
  526. static const struct snd_kcontrol_new mtk_dai_adda_controls[] = {
  527. SOC_SINGLE_EXT("ADDA_DL_Gain", SND_SOC_NOPM, 0, 65535, 0,
  528. mt8195_adda_dl_gain_get, mt8195_adda_dl_gain_put),
  529. SOC_SINGLE_BOOL_EXT("MTKAIF_DMIC", 0,
  530. mt8195_adda_dmic_get, mt8195_adda_dmic_set),
  531. SOC_SINGLE_BOOL_EXT("MTKAIF_ADDA6_ONLY", 0,
  532. mt8195_adda6_only_get,
  533. mt8195_adda6_only_set),
  534. };
  535. static int mtk_dai_da_configure(struct mtk_base_afe *afe,
  536. unsigned int rate, int id)
  537. {
  538. unsigned int val = 0;
  539. unsigned int mask = 0;
  540. /* set sampling rate */
  541. mask |= DL_2_INPUT_MODE_CTL_MASK;
  542. val |= DL_2_INPUT_MODE_CTL(afe_adda_dl_rate_transform(afe, rate));
  543. /* turn off saturation */
  544. mask |= DL_2_CH1_SATURATION_EN_CTL;
  545. mask |= DL_2_CH2_SATURATION_EN_CTL;
  546. /* turn off mute function */
  547. mask |= DL_2_MUTE_CH1_OFF_CTL_PRE;
  548. mask |= DL_2_MUTE_CH2_OFF_CTL_PRE;
  549. val |= DL_2_MUTE_CH1_OFF_CTL_PRE;
  550. val |= DL_2_MUTE_CH2_OFF_CTL_PRE;
  551. /* set voice input data if input sample rate is 8k or 16k */
  552. mask |= DL_2_VOICE_MODE_CTL_PRE;
  553. if (rate == 8000 || rate == 16000)
  554. val |= DL_2_VOICE_MODE_CTL_PRE;
  555. regmap_update_bits(afe->regmap, AFE_ADDA_DL_SRC2_CON0, mask, val);
  556. mask = 0;
  557. val = 0;
  558. /* new 2nd sdm */
  559. mask |= DL_USE_NEW_2ND_SDM;
  560. val |= DL_USE_NEW_2ND_SDM;
  561. regmap_update_bits(afe->regmap, AFE_ADDA_DL_SDM_DCCOMP_CON, mask, val);
  562. return 0;
  563. }
  564. static int mtk_dai_ad_configure(struct mtk_base_afe *afe,
  565. unsigned int rate, int id)
  566. {
  567. unsigned int val = 0;
  568. unsigned int mask = 0;
  569. mask |= UL_VOICE_MODE_CTL_MASK;
  570. val |= UL_VOICE_MODE_CTL(afe_adda_ul_rate_transform(afe, rate));
  571. switch (id) {
  572. case MT8195_AFE_IO_UL_SRC1:
  573. regmap_update_bits(afe->regmap, AFE_ADDA_UL_SRC_CON0,
  574. mask, val);
  575. break;
  576. case MT8195_AFE_IO_UL_SRC2:
  577. regmap_update_bits(afe->regmap, AFE_ADDA6_UL_SRC_CON0,
  578. mask, val);
  579. break;
  580. default:
  581. break;
  582. }
  583. return 0;
  584. }
  585. static int mtk_dai_adda_hw_params(struct snd_pcm_substream *substream,
  586. struct snd_pcm_hw_params *params,
  587. struct snd_soc_dai *dai)
  588. {
  589. struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
  590. struct mt8195_afe_private *afe_priv = afe->platform_priv;
  591. struct mtk_dai_adda_priv *adda_priv = afe_priv->dai_priv[dai->id];
  592. unsigned int rate = params_rate(params);
  593. int id = dai->id;
  594. int ret = 0;
  595. dev_dbg(afe->dev, "%s(), id %d, stream %d, rate %d\n",
  596. __func__, id, substream->stream, rate);
  597. if (rate > ADDA_HIRES_THRES)
  598. adda_priv->hires_required = 1;
  599. else
  600. adda_priv->hires_required = 0;
  601. if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
  602. ret = mtk_dai_da_configure(afe, rate, id);
  603. else
  604. ret = mtk_dai_ad_configure(afe, rate, id);
  605. return ret;
  606. }
  607. static const struct snd_soc_dai_ops mtk_dai_adda_ops = {
  608. .hw_params = mtk_dai_adda_hw_params,
  609. };
  610. /* dai driver */
  611. #define MTK_ADDA_PLAYBACK_RATES (SNDRV_PCM_RATE_8000_48000 |\
  612. SNDRV_PCM_RATE_96000 |\
  613. SNDRV_PCM_RATE_192000)
  614. #define MTK_ADDA_CAPTURE_RATES (SNDRV_PCM_RATE_8000 |\
  615. SNDRV_PCM_RATE_16000 |\
  616. SNDRV_PCM_RATE_32000 |\
  617. SNDRV_PCM_RATE_48000 |\
  618. SNDRV_PCM_RATE_96000 |\
  619. SNDRV_PCM_RATE_192000)
  620. #define MTK_ADDA_FORMATS (SNDRV_PCM_FMTBIT_S16_LE |\
  621. SNDRV_PCM_FMTBIT_S24_LE |\
  622. SNDRV_PCM_FMTBIT_S32_LE)
  623. static struct snd_soc_dai_driver mtk_dai_adda_driver[] = {
  624. {
  625. .name = "DL_SRC",
  626. .id = MT8195_AFE_IO_DL_SRC,
  627. .playback = {
  628. .stream_name = "ADDA Playback",
  629. .channels_min = 1,
  630. .channels_max = 2,
  631. .rates = MTK_ADDA_PLAYBACK_RATES,
  632. .formats = MTK_ADDA_FORMATS,
  633. },
  634. .ops = &mtk_dai_adda_ops,
  635. },
  636. {
  637. .name = "UL_SRC1",
  638. .id = MT8195_AFE_IO_UL_SRC1,
  639. .capture = {
  640. .stream_name = "ADDA Capture",
  641. .channels_min = 1,
  642. .channels_max = 2,
  643. .rates = MTK_ADDA_CAPTURE_RATES,
  644. .formats = MTK_ADDA_FORMATS,
  645. },
  646. .ops = &mtk_dai_adda_ops,
  647. },
  648. {
  649. .name = "UL_SRC2",
  650. .id = MT8195_AFE_IO_UL_SRC2,
  651. .capture = {
  652. .stream_name = "ADDA6 Capture",
  653. .channels_min = 1,
  654. .channels_max = 2,
  655. .rates = MTK_ADDA_CAPTURE_RATES,
  656. .formats = MTK_ADDA_FORMATS,
  657. },
  658. .ops = &mtk_dai_adda_ops,
  659. },
  660. };
  661. static int init_adda_priv_data(struct mtk_base_afe *afe)
  662. {
  663. struct mt8195_afe_private *afe_priv = afe->platform_priv;
  664. struct mtk_dai_adda_priv *adda_priv;
  665. static const int adda_dai_list[] = {
  666. MT8195_AFE_IO_DL_SRC,
  667. MT8195_AFE_IO_UL_SRC1,
  668. MT8195_AFE_IO_UL_SRC2
  669. };
  670. int i;
  671. for (i = 0; i < ARRAY_SIZE(adda_dai_list); i++) {
  672. adda_priv = devm_kzalloc(afe->dev,
  673. sizeof(struct mtk_dai_adda_priv),
  674. GFP_KERNEL);
  675. if (!adda_priv)
  676. return -ENOMEM;
  677. afe_priv->dai_priv[adda_dai_list[i]] = adda_priv;
  678. }
  679. return 0;
  680. }
  681. int mt8195_dai_adda_register(struct mtk_base_afe *afe)
  682. {
  683. struct mtk_base_afe_dai *dai;
  684. dai = devm_kzalloc(afe->dev, sizeof(*dai), GFP_KERNEL);
  685. if (!dai)
  686. return -ENOMEM;
  687. list_add(&dai->list, &afe->sub_dais);
  688. dai->dai_drivers = mtk_dai_adda_driver;
  689. dai->num_dai_drivers = ARRAY_SIZE(mtk_dai_adda_driver);
  690. dai->dapm_widgets = mtk_dai_adda_widgets;
  691. dai->num_dapm_widgets = ARRAY_SIZE(mtk_dai_adda_widgets);
  692. dai->dapm_routes = mtk_dai_adda_routes;
  693. dai->num_dapm_routes = ARRAY_SIZE(mtk_dai_adda_routes);
  694. dai->controls = mtk_dai_adda_controls;
  695. dai->num_controls = ARRAY_SIZE(mtk_dai_adda_controls);
  696. return init_adda_priv_data(afe);
  697. }