acp-mach-common.c 50 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789
  1. // SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause)
  2. //
  3. // This file is provided under a dual BSD/GPLv2 license. When using or
  4. // redistributing this file, you may do so under either license.
  5. //
  6. // Copyright(c) 2021, 2023 Advanced Micro Devices, Inc.
  7. //
  8. // Authors: Ajit Kumar Pandey <AjitKumar.Pandey@amd.com>
  9. // Vijendar Mukunda <Vijendar.Mukunda@amd.com>
  10. //
  11. /*
  12. * Machine Driver Interface for ACP HW block
  13. */
  14. #include <sound/core.h>
  15. #include <sound/jack.h>
  16. #include <sound/pcm_params.h>
  17. #include <sound/soc-dapm.h>
  18. #include <sound/soc.h>
  19. #include <linux/input.h>
  20. #include <linux/module.h>
  21. #include "../../codecs/rt5682.h"
  22. #include "../../codecs/rt1019.h"
  23. #include "../../codecs/rt5682s.h"
  24. #include "../../codecs/nau8825.h"
  25. #include "../../codecs/nau8821.h"
  26. #include "acp-mach.h"
  27. #define PCO_PLAT_CLK 48000000
  28. #define RT5682_PLL_FREQ (48000 * 512)
  29. #define DUAL_CHANNEL 2
  30. #define FOUR_CHANNEL 4
  31. #define NAU8821_CODEC_DAI "nau8821-hifi"
  32. #define NAU8821_BCLK 1536000
  33. #define NAU8821_FREQ_OUT 12288000
  34. #define MAX98388_CODEC_DAI "max98388-aif1"
  35. #define TDM_MODE_ENABLE 1
  36. const struct dmi_system_id acp_quirk_table[] = {
  37. {
  38. /* Google skyrim proto-0 */
  39. .matches = {
  40. DMI_EXACT_MATCH(DMI_PRODUCT_FAMILY, "Google_Skyrim"),
  41. },
  42. .driver_data = (void *)TDM_MODE_ENABLE,
  43. },
  44. {}
  45. };
  46. EXPORT_SYMBOL_GPL(acp_quirk_table);
  47. static const unsigned int channels[] = {
  48. DUAL_CHANNEL,
  49. };
  50. static const unsigned int rates[] = {
  51. 48000,
  52. };
  53. static const struct snd_pcm_hw_constraint_list constraints_rates = {
  54. .count = ARRAY_SIZE(rates),
  55. .list = rates,
  56. .mask = 0,
  57. };
  58. static const struct snd_pcm_hw_constraint_list constraints_channels = {
  59. .count = ARRAY_SIZE(channels),
  60. .list = channels,
  61. .mask = 0,
  62. };
  63. static int acp_clk_enable(struct acp_card_drvdata *drvdata,
  64. unsigned int srate, unsigned int bclk_ratio)
  65. {
  66. clk_set_rate(drvdata->wclk, srate);
  67. clk_set_rate(drvdata->bclk, srate * bclk_ratio);
  68. return clk_prepare_enable(drvdata->wclk);
  69. }
  70. /* Declare RT5682 codec components */
  71. SND_SOC_DAILINK_DEF(rt5682,
  72. DAILINK_COMP_ARRAY(COMP_CODEC("i2c-10EC5682:00", "rt5682-aif1")));
  73. static struct snd_soc_jack rt5682_jack;
  74. static struct snd_soc_jack_pin rt5682_jack_pins[] = {
  75. {
  76. .pin = "Headphone Jack",
  77. .mask = SND_JACK_HEADPHONE,
  78. },
  79. {
  80. .pin = "Headset Mic",
  81. .mask = SND_JACK_MICROPHONE,
  82. },
  83. };
  84. static const struct snd_kcontrol_new rt5682_controls[] = {
  85. SOC_DAPM_PIN_SWITCH("Headphone Jack"),
  86. SOC_DAPM_PIN_SWITCH("Headset Mic"),
  87. };
  88. static const struct snd_soc_dapm_widget rt5682_widgets[] = {
  89. SND_SOC_DAPM_HP("Headphone Jack", NULL),
  90. SND_SOC_DAPM_MIC("Headset Mic", NULL),
  91. };
  92. static const struct snd_soc_dapm_route rt5682_map[] = {
  93. { "Headphone Jack", NULL, "HPOL" },
  94. { "Headphone Jack", NULL, "HPOR" },
  95. { "IN1P", NULL, "Headset Mic" },
  96. };
  97. /* Define card ops for RT5682 CODEC */
  98. static int acp_card_rt5682_init(struct snd_soc_pcm_runtime *rtd)
  99. {
  100. struct snd_soc_card *card = rtd->card;
  101. struct acp_card_drvdata *drvdata = card->drvdata;
  102. struct snd_soc_dai *codec_dai = snd_soc_rtd_to_codec(rtd, 0);
  103. struct snd_soc_component *component = codec_dai->component;
  104. int ret;
  105. dev_info(rtd->dev, "codec dai name = %s\n", codec_dai->name);
  106. if (drvdata->hs_codec_id != RT5682)
  107. return -EINVAL;
  108. drvdata->wclk = clk_get(component->dev, "rt5682-dai-wclk");
  109. drvdata->bclk = clk_get(component->dev, "rt5682-dai-bclk");
  110. ret = snd_soc_dapm_new_controls(&card->dapm, rt5682_widgets,
  111. ARRAY_SIZE(rt5682_widgets));
  112. if (ret) {
  113. dev_err(rtd->dev, "unable to add widget dapm controls, ret %d\n", ret);
  114. return ret;
  115. }
  116. ret = snd_soc_add_card_controls(card, rt5682_controls,
  117. ARRAY_SIZE(rt5682_controls));
  118. if (ret) {
  119. dev_err(rtd->dev, "unable to add card controls, ret %d\n", ret);
  120. return ret;
  121. }
  122. ret = snd_soc_card_jack_new_pins(card, "Headset Jack",
  123. SND_JACK_HEADSET | SND_JACK_LINEOUT |
  124. SND_JACK_BTN_0 | SND_JACK_BTN_1 |
  125. SND_JACK_BTN_2 | SND_JACK_BTN_3,
  126. &rt5682_jack,
  127. rt5682_jack_pins,
  128. ARRAY_SIZE(rt5682_jack_pins));
  129. if (ret) {
  130. dev_err(card->dev, "HP jack creation failed %d\n", ret);
  131. return ret;
  132. }
  133. snd_jack_set_key(rt5682_jack.jack, SND_JACK_BTN_0, KEY_PLAYPAUSE);
  134. snd_jack_set_key(rt5682_jack.jack, SND_JACK_BTN_1, KEY_VOICECOMMAND);
  135. snd_jack_set_key(rt5682_jack.jack, SND_JACK_BTN_2, KEY_VOLUMEUP);
  136. snd_jack_set_key(rt5682_jack.jack, SND_JACK_BTN_3, KEY_VOLUMEDOWN);
  137. ret = snd_soc_component_set_jack(component, &rt5682_jack, NULL);
  138. if (ret) {
  139. dev_err(rtd->dev, "Headset Jack call-back failed: %d\n", ret);
  140. return ret;
  141. }
  142. return snd_soc_dapm_add_routes(&rtd->card->dapm, rt5682_map, ARRAY_SIZE(rt5682_map));
  143. }
  144. static int acp_card_hs_startup(struct snd_pcm_substream *substream)
  145. {
  146. struct snd_pcm_runtime *runtime = substream->runtime;
  147. struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
  148. struct snd_soc_card *card = rtd->card;
  149. struct acp_card_drvdata *drvdata = card->drvdata;
  150. struct snd_soc_dai *codec_dai = snd_soc_rtd_to_codec(rtd, 0);
  151. int ret;
  152. unsigned int fmt;
  153. if (drvdata->tdm_mode)
  154. fmt = SND_SOC_DAIFMT_DSP_A;
  155. else
  156. fmt = SND_SOC_DAIFMT_I2S;
  157. if (drvdata->soc_mclk)
  158. fmt |= SND_SOC_DAIFMT_NB_NF | SND_SOC_DAIFMT_CBC_CFC;
  159. else
  160. fmt |= SND_SOC_DAIFMT_NB_NF | SND_SOC_DAIFMT_CBP_CFP;
  161. ret = snd_soc_dai_set_fmt(codec_dai, fmt);
  162. if (ret < 0) {
  163. dev_err(rtd->card->dev, "Failed to set dai fmt: %d\n", ret);
  164. return ret;
  165. }
  166. runtime->hw.channels_max = DUAL_CHANNEL;
  167. snd_pcm_hw_constraint_list(runtime, 0, SNDRV_PCM_HW_PARAM_CHANNELS,
  168. &constraints_channels);
  169. snd_pcm_hw_constraint_list(runtime, 0, SNDRV_PCM_HW_PARAM_RATE,
  170. &constraints_rates);
  171. return ret;
  172. }
  173. static void acp_card_shutdown(struct snd_pcm_substream *substream)
  174. {
  175. struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
  176. struct snd_soc_card *card = rtd->card;
  177. struct acp_card_drvdata *drvdata = card->drvdata;
  178. if (!drvdata->soc_mclk)
  179. clk_disable_unprepare(drvdata->wclk);
  180. }
  181. static int acp_card_rt5682_hw_params(struct snd_pcm_substream *substream,
  182. struct snd_pcm_hw_params *params)
  183. {
  184. struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
  185. struct snd_soc_card *card = rtd->card;
  186. struct acp_card_drvdata *drvdata = card->drvdata;
  187. struct snd_soc_dai *codec_dai = snd_soc_rtd_to_codec(rtd, 0);
  188. struct snd_soc_dai *cpu_dai = snd_soc_rtd_to_cpu(rtd, 0);
  189. int ret;
  190. unsigned int fmt, srate, ch, format;
  191. srate = params_rate(params);
  192. ch = params_channels(params);
  193. format = params_physical_width(params);
  194. if (drvdata->tdm_mode)
  195. fmt = SND_SOC_DAIFMT_DSP_A;
  196. else
  197. fmt = SND_SOC_DAIFMT_I2S;
  198. if (drvdata->soc_mclk)
  199. fmt |= SND_SOC_DAIFMT_NB_NF | SND_SOC_DAIFMT_CBC_CFC;
  200. else
  201. fmt |= SND_SOC_DAIFMT_NB_NF | SND_SOC_DAIFMT_CBP_CFP;
  202. ret = snd_soc_dai_set_fmt(cpu_dai, fmt);
  203. if (ret && ret != -ENOTSUPP) {
  204. dev_err(rtd->dev, "Failed to set dai fmt: %d\n", ret);
  205. return ret;
  206. }
  207. ret = snd_soc_dai_set_fmt(codec_dai, fmt);
  208. if (ret < 0) {
  209. dev_err(rtd->card->dev, "Failed to set dai fmt: %d\n", ret);
  210. return ret;
  211. }
  212. if (drvdata->tdm_mode) {
  213. /**
  214. * As codec supports slot 0 and slot 1 for playback and capture.
  215. */
  216. ret = snd_soc_dai_set_tdm_slot(cpu_dai, 0x3, 0x3, 8, 16);
  217. if (ret && ret != -ENOTSUPP) {
  218. dev_err(rtd->dev, "set TDM slot err: %d\n", ret);
  219. return ret;
  220. }
  221. ret = snd_soc_dai_set_tdm_slot(codec_dai, 0x3, 0x3, 8, 16);
  222. if (ret < 0) {
  223. dev_warn(rtd->dev, "set TDM slot err:%d\n", ret);
  224. return ret;
  225. }
  226. }
  227. ret = snd_soc_dai_set_pll(codec_dai, RT5682_PLL2, RT5682_PLL2_S_MCLK,
  228. PCO_PLAT_CLK, RT5682_PLL_FREQ);
  229. if (ret < 0) {
  230. dev_err(rtd->dev, "Failed to set codec PLL: %d\n", ret);
  231. return ret;
  232. }
  233. ret = snd_soc_dai_set_sysclk(codec_dai, RT5682_SCLK_S_PLL2,
  234. RT5682_PLL_FREQ, SND_SOC_CLOCK_IN);
  235. if (ret < 0) {
  236. dev_err(rtd->dev, "Failed to set codec SYSCLK: %d\n", ret);
  237. return ret;
  238. }
  239. if (drvdata->tdm_mode) {
  240. ret = snd_soc_dai_set_pll(codec_dai, RT5682S_PLL1, RT5682S_PLL_S_BCLK1,
  241. 6144000, 49152000);
  242. if (ret < 0) {
  243. dev_err(rtd->dev, "Failed to set codec PLL: %d\n", ret);
  244. return ret;
  245. }
  246. ret = snd_soc_dai_set_sysclk(codec_dai, RT5682S_SCLK_S_PLL1,
  247. 49152000, SND_SOC_CLOCK_IN);
  248. if (ret < 0) {
  249. dev_err(rtd->dev, "Failed to set codec SYSCLK: %d\n", ret);
  250. return ret;
  251. }
  252. }
  253. /* Set tdm/i2s1 master bclk ratio */
  254. ret = snd_soc_dai_set_bclk_ratio(codec_dai, ch * format);
  255. if (ret < 0) {
  256. dev_err(rtd->dev, "Failed to set rt5682 tdm bclk ratio: %d\n", ret);
  257. return ret;
  258. }
  259. if (!drvdata->soc_mclk) {
  260. ret = acp_clk_enable(drvdata, srate, ch * format);
  261. if (ret < 0) {
  262. dev_err(rtd->card->dev, "Failed to enable HS clk: %d\n", ret);
  263. return ret;
  264. }
  265. }
  266. return 0;
  267. }
  268. static const struct snd_soc_ops acp_card_rt5682_ops = {
  269. .startup = acp_card_hs_startup,
  270. .shutdown = acp_card_shutdown,
  271. .hw_params = acp_card_rt5682_hw_params,
  272. };
  273. /* Define RT5682S CODEC component*/
  274. SND_SOC_DAILINK_DEF(rt5682s,
  275. DAILINK_COMP_ARRAY(COMP_CODEC("i2c-RTL5682:00", "rt5682s-aif1")));
  276. static struct snd_soc_jack rt5682s_jack;
  277. static struct snd_soc_jack_pin rt5682s_jack_pins[] = {
  278. {
  279. .pin = "Headphone Jack",
  280. .mask = SND_JACK_HEADPHONE,
  281. },
  282. {
  283. .pin = "Headset Mic",
  284. .mask = SND_JACK_MICROPHONE,
  285. },
  286. };
  287. static const struct snd_kcontrol_new rt5682s_controls[] = {
  288. SOC_DAPM_PIN_SWITCH("Headphone Jack"),
  289. SOC_DAPM_PIN_SWITCH("Headset Mic"),
  290. };
  291. static const struct snd_soc_dapm_widget rt5682s_widgets[] = {
  292. SND_SOC_DAPM_HP("Headphone Jack", NULL),
  293. SND_SOC_DAPM_MIC("Headset Mic", NULL),
  294. };
  295. static const struct snd_soc_dapm_route rt5682s_map[] = {
  296. { "Headphone Jack", NULL, "HPOL" },
  297. { "Headphone Jack", NULL, "HPOR" },
  298. { "IN1P", NULL, "Headset Mic" },
  299. };
  300. static int acp_card_rt5682s_init(struct snd_soc_pcm_runtime *rtd)
  301. {
  302. struct snd_soc_card *card = rtd->card;
  303. struct acp_card_drvdata *drvdata = card->drvdata;
  304. struct snd_soc_dai *codec_dai = snd_soc_rtd_to_codec(rtd, 0);
  305. struct snd_soc_component *component = codec_dai->component;
  306. int ret;
  307. dev_info(rtd->dev, "codec dai name = %s\n", codec_dai->name);
  308. if (drvdata->hs_codec_id != RT5682S)
  309. return -EINVAL;
  310. if (!drvdata->soc_mclk) {
  311. drvdata->wclk = clk_get(component->dev, "rt5682-dai-wclk");
  312. drvdata->bclk = clk_get(component->dev, "rt5682-dai-bclk");
  313. }
  314. ret = snd_soc_dapm_new_controls(&card->dapm, rt5682s_widgets,
  315. ARRAY_SIZE(rt5682s_widgets));
  316. if (ret) {
  317. dev_err(rtd->dev, "unable to add widget dapm controls, ret %d\n", ret);
  318. return ret;
  319. }
  320. ret = snd_soc_add_card_controls(card, rt5682s_controls,
  321. ARRAY_SIZE(rt5682s_controls));
  322. if (ret) {
  323. dev_err(rtd->dev, "unable to add card controls, ret %d\n", ret);
  324. return ret;
  325. }
  326. ret = snd_soc_card_jack_new_pins(card, "Headset Jack",
  327. SND_JACK_HEADSET | SND_JACK_LINEOUT |
  328. SND_JACK_BTN_0 | SND_JACK_BTN_1 |
  329. SND_JACK_BTN_2 | SND_JACK_BTN_3,
  330. &rt5682s_jack,
  331. rt5682s_jack_pins,
  332. ARRAY_SIZE(rt5682s_jack_pins));
  333. if (ret) {
  334. dev_err(card->dev, "HP jack creation failed %d\n", ret);
  335. return ret;
  336. }
  337. snd_jack_set_key(rt5682s_jack.jack, SND_JACK_BTN_0, KEY_PLAYPAUSE);
  338. snd_jack_set_key(rt5682s_jack.jack, SND_JACK_BTN_1, KEY_VOICECOMMAND);
  339. snd_jack_set_key(rt5682s_jack.jack, SND_JACK_BTN_2, KEY_VOLUMEUP);
  340. snd_jack_set_key(rt5682s_jack.jack, SND_JACK_BTN_3, KEY_VOLUMEDOWN);
  341. ret = snd_soc_component_set_jack(component, &rt5682s_jack, NULL);
  342. if (ret) {
  343. dev_err(rtd->dev, "Headset Jack call-back failed: %d\n", ret);
  344. return ret;
  345. }
  346. return snd_soc_dapm_add_routes(&rtd->card->dapm, rt5682s_map, ARRAY_SIZE(rt5682s_map));
  347. }
  348. static int acp_card_rt5682s_hw_params(struct snd_pcm_substream *substream,
  349. struct snd_pcm_hw_params *params)
  350. {
  351. struct snd_soc_pcm_runtime *rtd = substream->private_data;
  352. struct snd_soc_card *card = rtd->card;
  353. struct acp_card_drvdata *drvdata = card->drvdata;
  354. struct snd_soc_dai *codec_dai = snd_soc_rtd_to_codec(rtd, 0);
  355. struct snd_soc_dai *cpu_dai = snd_soc_rtd_to_cpu(rtd, 0);
  356. int ret;
  357. unsigned int fmt, srate, ch, format;
  358. srate = params_rate(params);
  359. ch = params_channels(params);
  360. format = params_physical_width(params);
  361. if (drvdata->tdm_mode)
  362. fmt = SND_SOC_DAIFMT_DSP_A;
  363. else
  364. fmt = SND_SOC_DAIFMT_I2S;
  365. if (drvdata->soc_mclk)
  366. fmt |= SND_SOC_DAIFMT_NB_NF | SND_SOC_DAIFMT_CBC_CFC;
  367. else
  368. fmt |= SND_SOC_DAIFMT_NB_NF | SND_SOC_DAIFMT_CBP_CFP;
  369. ret = snd_soc_dai_set_fmt(cpu_dai, fmt);
  370. if (ret && ret != -ENOTSUPP) {
  371. dev_err(rtd->dev, "Failed to set dai fmt: %d\n", ret);
  372. return ret;
  373. }
  374. ret = snd_soc_dai_set_fmt(codec_dai, fmt);
  375. if (ret < 0) {
  376. dev_err(rtd->card->dev, "Failed to set dai fmt: %d\n", ret);
  377. return ret;
  378. }
  379. if (drvdata->tdm_mode) {
  380. /**
  381. * As codec supports slot 0 and slot 1 for playback and capture.
  382. */
  383. ret = snd_soc_dai_set_tdm_slot(cpu_dai, 0x3, 0x3, 8, 16);
  384. if (ret && ret != -ENOTSUPP) {
  385. dev_err(rtd->dev, "set TDM slot err: %d\n", ret);
  386. return ret;
  387. }
  388. ret = snd_soc_dai_set_tdm_slot(codec_dai, 0x3, 0x3, 8, 16);
  389. if (ret < 0) {
  390. dev_warn(rtd->dev, "set TDM slot err:%d\n", ret);
  391. return ret;
  392. }
  393. }
  394. ret = snd_soc_dai_set_pll(codec_dai, RT5682S_PLL2, RT5682S_PLL_S_MCLK,
  395. PCO_PLAT_CLK, RT5682_PLL_FREQ);
  396. if (ret < 0) {
  397. dev_err(rtd->dev, "Failed to set codec PLL: %d\n", ret);
  398. return ret;
  399. }
  400. ret = snd_soc_dai_set_sysclk(codec_dai, RT5682S_SCLK_S_PLL2,
  401. RT5682_PLL_FREQ, SND_SOC_CLOCK_IN);
  402. if (ret < 0) {
  403. dev_err(rtd->dev, "Failed to set codec SYSCLK: %d\n", ret);
  404. return ret;
  405. }
  406. if (drvdata->tdm_mode) {
  407. ret = snd_soc_dai_set_pll(codec_dai, RT5682S_PLL1, RT5682S_PLL_S_BCLK1,
  408. 6144000, 49152000);
  409. if (ret < 0) {
  410. dev_err(rtd->dev, "Failed to set codec PLL: %d\n", ret);
  411. return ret;
  412. }
  413. ret = snd_soc_dai_set_sysclk(codec_dai, RT5682S_SCLK_S_PLL1,
  414. 49152000, SND_SOC_CLOCK_IN);
  415. if (ret < 0) {
  416. dev_err(rtd->dev, "Failed to set codec SYSCLK: %d\n", ret);
  417. return ret;
  418. }
  419. }
  420. /* Set tdm/i2s1 master bclk ratio */
  421. ret = snd_soc_dai_set_bclk_ratio(codec_dai, ch * format);
  422. if (ret < 0) {
  423. dev_err(rtd->dev, "Failed to set rt5682 tdm bclk ratio: %d\n", ret);
  424. return ret;
  425. }
  426. clk_set_rate(drvdata->wclk, srate);
  427. clk_set_rate(drvdata->bclk, srate * ch * format);
  428. if (!drvdata->soc_mclk) {
  429. ret = acp_clk_enable(drvdata, srate, ch * format);
  430. if (ret < 0) {
  431. dev_err(rtd->card->dev, "Failed to enable HS clk: %d\n", ret);
  432. return ret;
  433. }
  434. }
  435. return 0;
  436. }
  437. static const struct snd_soc_ops acp_card_rt5682s_ops = {
  438. .startup = acp_card_hs_startup,
  439. .hw_params = acp_card_rt5682s_hw_params,
  440. };
  441. static const unsigned int dmic_channels[] = {
  442. DUAL_CHANNEL, FOUR_CHANNEL,
  443. };
  444. static const struct snd_pcm_hw_constraint_list dmic_constraints_channels = {
  445. .count = ARRAY_SIZE(dmic_channels),
  446. .list = dmic_channels,
  447. .mask = 0,
  448. };
  449. static int acp_card_dmic_startup(struct snd_pcm_substream *substream)
  450. {
  451. struct snd_pcm_runtime *runtime = substream->runtime;
  452. snd_pcm_hw_constraint_list(runtime, 0, SNDRV_PCM_HW_PARAM_CHANNELS,
  453. &dmic_constraints_channels);
  454. snd_pcm_hw_constraint_list(runtime, 0, SNDRV_PCM_HW_PARAM_RATE,
  455. &constraints_rates);
  456. return 0;
  457. }
  458. static const struct snd_soc_ops acp_card_dmic_ops = {
  459. .startup = acp_card_dmic_startup,
  460. };
  461. /* Declare RT1019 codec components */
  462. SND_SOC_DAILINK_DEF(rt1019,
  463. DAILINK_COMP_ARRAY(COMP_CODEC("i2c-10EC1019:00", "rt1019-aif"),
  464. COMP_CODEC("i2c-10EC1019:01", "rt1019-aif")));
  465. static const struct snd_kcontrol_new rt1019_controls[] = {
  466. SOC_DAPM_PIN_SWITCH("Left Spk"),
  467. SOC_DAPM_PIN_SWITCH("Right Spk"),
  468. };
  469. static const struct snd_soc_dapm_widget rt1019_widgets[] = {
  470. SND_SOC_DAPM_SPK("Left Spk", NULL),
  471. SND_SOC_DAPM_SPK("Right Spk", NULL),
  472. };
  473. static const struct snd_soc_dapm_route rt1019_map_lr[] = {
  474. { "Left Spk", NULL, "Left SPO" },
  475. { "Right Spk", NULL, "Right SPO" },
  476. };
  477. static struct snd_soc_codec_conf rt1019_conf[] = {
  478. {
  479. .dlc = COMP_CODEC_CONF("i2c-10EC1019:01"),
  480. .name_prefix = "Left",
  481. },
  482. {
  483. .dlc = COMP_CODEC_CONF("i2c-10EC1019:00"),
  484. .name_prefix = "Right",
  485. },
  486. };
  487. static int acp_card_rt1019_init(struct snd_soc_pcm_runtime *rtd)
  488. {
  489. struct snd_soc_card *card = rtd->card;
  490. struct acp_card_drvdata *drvdata = card->drvdata;
  491. int ret;
  492. if (drvdata->amp_codec_id != RT1019)
  493. return -EINVAL;
  494. ret = snd_soc_dapm_new_controls(&card->dapm, rt1019_widgets,
  495. ARRAY_SIZE(rt1019_widgets));
  496. if (ret) {
  497. dev_err(rtd->dev, "unable to add widget dapm controls, ret %d\n", ret);
  498. return ret;
  499. }
  500. ret = snd_soc_add_card_controls(card, rt1019_controls,
  501. ARRAY_SIZE(rt1019_controls));
  502. if (ret) {
  503. dev_err(rtd->dev, "unable to add card controls, ret %d\n", ret);
  504. return ret;
  505. }
  506. return snd_soc_dapm_add_routes(&rtd->card->dapm, rt1019_map_lr,
  507. ARRAY_SIZE(rt1019_map_lr));
  508. }
  509. static int acp_card_rt1019_hw_params(struct snd_pcm_substream *substream,
  510. struct snd_pcm_hw_params *params)
  511. {
  512. struct snd_soc_pcm_runtime *rtd = substream->private_data;
  513. struct snd_soc_card *card = rtd->card;
  514. struct acp_card_drvdata *drvdata = card->drvdata;
  515. struct snd_soc_dai *codec_dai;
  516. struct snd_soc_dai *cpu_dai = snd_soc_rtd_to_cpu(rtd, 0);
  517. int i, ret = 0;
  518. unsigned int fmt, srate, ch, format;
  519. srate = params_rate(params);
  520. ch = params_channels(params);
  521. format = params_physical_width(params);
  522. if (drvdata->amp_codec_id != RT1019)
  523. return -EINVAL;
  524. if (drvdata->tdm_mode)
  525. fmt = SND_SOC_DAIFMT_DSP_A;
  526. else
  527. fmt = SND_SOC_DAIFMT_I2S;
  528. if (drvdata->soc_mclk)
  529. fmt |= SND_SOC_DAIFMT_NB_NF | SND_SOC_DAIFMT_CBC_CFC;
  530. else
  531. fmt |= SND_SOC_DAIFMT_NB_NF | SND_SOC_DAIFMT_CBP_CFP;
  532. ret = snd_soc_dai_set_fmt(cpu_dai, fmt);
  533. if (ret && ret != -ENOTSUPP) {
  534. dev_err(rtd->dev, "Failed to set dai fmt: %d\n", ret);
  535. return ret;
  536. }
  537. if (drvdata->tdm_mode) {
  538. /**
  539. * As codec supports slot 2 and slot 3 for playback.
  540. */
  541. ret = snd_soc_dai_set_tdm_slot(cpu_dai, 0xC, 0, 8, 16);
  542. if (ret && ret != -ENOTSUPP) {
  543. dev_err(rtd->dev, "set TDM slot err: %d\n", ret);
  544. return ret;
  545. }
  546. }
  547. for_each_rtd_codec_dais(rtd, i, codec_dai) {
  548. if (strcmp(codec_dai->name, "rt1019-aif"))
  549. continue;
  550. if (drvdata->tdm_mode)
  551. ret = snd_soc_dai_set_pll(codec_dai, 0, RT1019_PLL_S_BCLK,
  552. TDM_CHANNELS * format * srate, 256 * srate);
  553. else
  554. ret = snd_soc_dai_set_pll(codec_dai, 0, RT1019_PLL_S_BCLK,
  555. ch * format * srate, 256 * srate);
  556. if (ret < 0)
  557. return ret;
  558. ret = snd_soc_dai_set_sysclk(codec_dai, RT1019_SCLK_S_PLL,
  559. 256 * srate, SND_SOC_CLOCK_IN);
  560. if (ret < 0)
  561. return ret;
  562. if (drvdata->tdm_mode) {
  563. ret = snd_soc_dai_set_fmt(codec_dai, SND_SOC_DAIFMT_DSP_A
  564. | SND_SOC_DAIFMT_NB_NF);
  565. if (ret < 0) {
  566. dev_err(rtd->card->dev, "Failed to set dai fmt: %d\n", ret);
  567. return ret;
  568. }
  569. /**
  570. * As codec supports slot 2 for left channel playback.
  571. */
  572. if (!strcmp(codec_dai->component->name, "i2c-10EC1019:00")) {
  573. ret = snd_soc_dai_set_tdm_slot(codec_dai, 0x4, 0x4, 8, 16);
  574. if (ret < 0)
  575. break;
  576. }
  577. /**
  578. * As codec supports slot 3 for right channel playback.
  579. */
  580. if (!strcmp(codec_dai->component->name, "i2c-10EC1019:01")) {
  581. ret = snd_soc_dai_set_tdm_slot(codec_dai, 0x8, 0x8, 8, 16);
  582. if (ret < 0)
  583. break;
  584. }
  585. }
  586. }
  587. if (!drvdata->soc_mclk) {
  588. ret = acp_clk_enable(drvdata, srate, ch * format);
  589. if (ret < 0) {
  590. dev_err(rtd->card->dev, "Failed to enable AMP clk: %d\n", ret);
  591. return ret;
  592. }
  593. }
  594. return 0;
  595. }
  596. static int acp_card_amp_startup(struct snd_pcm_substream *substream)
  597. {
  598. struct snd_pcm_runtime *runtime = substream->runtime;
  599. runtime->hw.channels_max = DUAL_CHANNEL;
  600. snd_pcm_hw_constraint_list(runtime, 0, SNDRV_PCM_HW_PARAM_CHANNELS,
  601. &constraints_channels);
  602. snd_pcm_hw_constraint_list(runtime, 0, SNDRV_PCM_HW_PARAM_RATE,
  603. &constraints_rates);
  604. return 0;
  605. }
  606. static const struct snd_soc_ops acp_card_rt1019_ops = {
  607. .startup = acp_card_amp_startup,
  608. .shutdown = acp_card_shutdown,
  609. .hw_params = acp_card_rt1019_hw_params,
  610. };
  611. /* Declare Maxim codec components */
  612. SND_SOC_DAILINK_DEF(max98360a,
  613. DAILINK_COMP_ARRAY(COMP_CODEC("MX98360A:00", "HiFi")));
  614. static const struct snd_kcontrol_new max98360a_controls[] = {
  615. SOC_DAPM_PIN_SWITCH("Spk"),
  616. };
  617. static const struct snd_soc_dapm_widget max98360a_widgets[] = {
  618. SND_SOC_DAPM_SPK("Spk", NULL),
  619. };
  620. static const struct snd_soc_dapm_route max98360a_map[] = {
  621. {"Spk", NULL, "Speaker"},
  622. };
  623. static int acp_card_maxim_init(struct snd_soc_pcm_runtime *rtd)
  624. {
  625. struct snd_soc_card *card = rtd->card;
  626. struct acp_card_drvdata *drvdata = card->drvdata;
  627. int ret;
  628. if (drvdata->amp_codec_id != MAX98360A)
  629. return -EINVAL;
  630. ret = snd_soc_dapm_new_controls(&card->dapm, max98360a_widgets,
  631. ARRAY_SIZE(max98360a_widgets));
  632. if (ret) {
  633. dev_err(rtd->dev, "unable to add widget dapm controls, ret %d\n", ret);
  634. return ret;
  635. }
  636. ret = snd_soc_add_card_controls(card, max98360a_controls,
  637. ARRAY_SIZE(max98360a_controls));
  638. if (ret) {
  639. dev_err(rtd->dev, "unable to add card controls, ret %d\n", ret);
  640. return ret;
  641. }
  642. return snd_soc_dapm_add_routes(&rtd->card->dapm, max98360a_map,
  643. ARRAY_SIZE(max98360a_map));
  644. }
  645. static int acp_card_maxim_hw_params(struct snd_pcm_substream *substream,
  646. struct snd_pcm_hw_params *params)
  647. {
  648. struct snd_soc_pcm_runtime *rtd = substream->private_data;
  649. struct snd_soc_card *card = rtd->card;
  650. struct acp_card_drvdata *drvdata = card->drvdata;
  651. struct snd_soc_dai *cpu_dai = snd_soc_rtd_to_cpu(rtd, 0);
  652. unsigned int fmt, srate, ch, format;
  653. int ret;
  654. srate = params_rate(params);
  655. ch = params_channels(params);
  656. format = params_physical_width(params);
  657. if (drvdata->tdm_mode)
  658. fmt = SND_SOC_DAIFMT_DSP_A;
  659. else
  660. fmt = SND_SOC_DAIFMT_I2S;
  661. if (drvdata->soc_mclk)
  662. fmt |= SND_SOC_DAIFMT_NB_NF | SND_SOC_DAIFMT_CBC_CFC;
  663. else
  664. fmt |= SND_SOC_DAIFMT_NB_NF | SND_SOC_DAIFMT_CBP_CFP;
  665. ret = snd_soc_dai_set_fmt(cpu_dai, fmt);
  666. if (ret && ret != -ENOTSUPP) {
  667. dev_err(rtd->dev, "Failed to set dai fmt: %d\n", ret);
  668. return ret;
  669. }
  670. if (drvdata->tdm_mode) {
  671. /**
  672. * As codec supports slot 2 and slot 3 for playback.
  673. */
  674. ret = snd_soc_dai_set_tdm_slot(cpu_dai, 0xC, 0, 8, 16);
  675. if (ret && ret != -ENOTSUPP) {
  676. dev_err(rtd->dev, "set TDM slot err: %d\n", ret);
  677. return ret;
  678. }
  679. }
  680. if (!drvdata->soc_mclk) {
  681. ret = acp_clk_enable(drvdata, srate, ch * format);
  682. if (ret < 0) {
  683. dev_err(rtd->card->dev, "Failed to enable AMP clk: %d\n", ret);
  684. return ret;
  685. }
  686. }
  687. return 0;
  688. }
  689. static const struct snd_soc_ops acp_card_maxim_ops = {
  690. .startup = acp_card_amp_startup,
  691. .shutdown = acp_card_shutdown,
  692. .hw_params = acp_card_maxim_hw_params,
  693. };
  694. SND_SOC_DAILINK_DEF(max98388,
  695. DAILINK_COMP_ARRAY(COMP_CODEC("i2c-ADS8388:00", MAX98388_CODEC_DAI),
  696. COMP_CODEC("i2c-ADS8388:01", MAX98388_CODEC_DAI)));
  697. static const struct snd_kcontrol_new max98388_controls[] = {
  698. SOC_DAPM_PIN_SWITCH("Left Spk"),
  699. SOC_DAPM_PIN_SWITCH("Right Spk"),
  700. };
  701. static const struct snd_soc_dapm_widget max98388_widgets[] = {
  702. SND_SOC_DAPM_SPK("Left Spk", NULL),
  703. SND_SOC_DAPM_SPK("Right Spk", NULL),
  704. };
  705. static const struct snd_soc_dapm_route max98388_map[] = {
  706. { "Left Spk", NULL, "Left BE_OUT" },
  707. { "Right Spk", NULL, "Right BE_OUT" },
  708. };
  709. static struct snd_soc_codec_conf max98388_conf[] = {
  710. {
  711. .dlc = COMP_CODEC_CONF("i2c-ADS8388:00"),
  712. .name_prefix = "Left",
  713. },
  714. {
  715. .dlc = COMP_CODEC_CONF("i2c-ADS8388:01"),
  716. .name_prefix = "Right",
  717. },
  718. };
  719. static const unsigned int max98388_format[] = {16};
  720. static struct snd_pcm_hw_constraint_list constraints_sample_bits_max = {
  721. .list = max98388_format,
  722. .count = ARRAY_SIZE(max98388_format),
  723. };
  724. static int acp_card_max98388_startup(struct snd_pcm_substream *substream)
  725. {
  726. struct snd_pcm_runtime *runtime = substream->runtime;
  727. runtime->hw.channels_max = DUAL_CHANNEL;
  728. snd_pcm_hw_constraint_list(runtime, 0, SNDRV_PCM_HW_PARAM_CHANNELS,
  729. &constraints_channels);
  730. snd_pcm_hw_constraint_list(runtime, 0, SNDRV_PCM_HW_PARAM_RATE,
  731. &constraints_rates);
  732. snd_pcm_hw_constraint_list(runtime, 0, SNDRV_PCM_HW_PARAM_SAMPLE_BITS,
  733. &constraints_sample_bits_max);
  734. return 0;
  735. }
  736. static int acp_card_max98388_init(struct snd_soc_pcm_runtime *rtd)
  737. {
  738. struct snd_soc_card *card = rtd->card;
  739. struct acp_card_drvdata *drvdata = card->drvdata;
  740. int ret;
  741. if (drvdata->amp_codec_id != MAX98388)
  742. return -EINVAL;
  743. ret = snd_soc_dapm_new_controls(&card->dapm, max98388_widgets,
  744. ARRAY_SIZE(max98388_widgets));
  745. if (ret) {
  746. dev_err(rtd->dev, "unable to add widget dapm controls, ret %d\n", ret);
  747. /* Don't need to add routes if widget addition failed */
  748. return ret;
  749. }
  750. ret = snd_soc_add_card_controls(card, max98388_controls,
  751. ARRAY_SIZE(max98388_controls));
  752. if (ret) {
  753. dev_err(rtd->dev, "unable to add card controls, ret %d\n", ret);
  754. return ret;
  755. }
  756. return snd_soc_dapm_add_routes(&rtd->card->dapm, max98388_map,
  757. ARRAY_SIZE(max98388_map));
  758. }
  759. static int acp_max98388_hw_params(struct snd_pcm_substream *substream,
  760. struct snd_pcm_hw_params *params)
  761. {
  762. struct snd_soc_pcm_runtime *rtd = substream->private_data;
  763. struct snd_soc_card *card = rtd->card;
  764. struct snd_soc_dai *codec_dai =
  765. snd_soc_card_get_codec_dai(card,
  766. MAX98388_CODEC_DAI);
  767. int ret;
  768. ret = snd_soc_dai_set_fmt(codec_dai,
  769. SND_SOC_DAIFMT_CBS_CFS | SND_SOC_DAIFMT_I2S |
  770. SND_SOC_DAIFMT_NB_NF);
  771. if (ret < 0)
  772. return ret;
  773. return ret;
  774. }
  775. static const struct snd_soc_ops acp_max98388_ops = {
  776. .startup = acp_card_max98388_startup,
  777. .hw_params = acp_max98388_hw_params,
  778. };
  779. /* Declare nau8825 codec components */
  780. SND_SOC_DAILINK_DEF(nau8825,
  781. DAILINK_COMP_ARRAY(COMP_CODEC("i2c-10508825:00", "nau8825-hifi")));
  782. static struct snd_soc_jack nau8825_jack;
  783. static struct snd_soc_jack_pin nau8825_jack_pins[] = {
  784. {
  785. .pin = "Headphone Jack",
  786. .mask = SND_JACK_HEADPHONE,
  787. },
  788. {
  789. .pin = "Headset Mic",
  790. .mask = SND_JACK_MICROPHONE,
  791. },
  792. };
  793. static const struct snd_kcontrol_new nau8825_controls[] = {
  794. SOC_DAPM_PIN_SWITCH("Headphone Jack"),
  795. SOC_DAPM_PIN_SWITCH("Headset Mic"),
  796. };
  797. static const struct snd_soc_dapm_widget nau8825_widgets[] = {
  798. SND_SOC_DAPM_HP("Headphone Jack", NULL),
  799. SND_SOC_DAPM_MIC("Headset Mic", NULL),
  800. };
  801. static const struct snd_soc_dapm_route nau8825_map[] = {
  802. { "Headphone Jack", NULL, "HPOL" },
  803. { "Headphone Jack", NULL, "HPOR" },
  804. };
  805. static int acp_card_nau8825_init(struct snd_soc_pcm_runtime *rtd)
  806. {
  807. struct snd_soc_card *card = rtd->card;
  808. struct acp_card_drvdata *drvdata = card->drvdata;
  809. struct snd_soc_dai *codec_dai = snd_soc_rtd_to_codec(rtd, 0);
  810. struct snd_soc_component *component = codec_dai->component;
  811. int ret;
  812. dev_info(rtd->dev, "codec dai name = %s\n", codec_dai->name);
  813. if (drvdata->hs_codec_id != NAU8825)
  814. return -EINVAL;
  815. ret = snd_soc_dapm_new_controls(&card->dapm, nau8825_widgets,
  816. ARRAY_SIZE(nau8825_widgets));
  817. if (ret) {
  818. dev_err(rtd->dev, "unable to add widget dapm controls, ret %d\n", ret);
  819. return ret;
  820. }
  821. ret = snd_soc_add_card_controls(card, nau8825_controls,
  822. ARRAY_SIZE(nau8825_controls));
  823. if (ret) {
  824. dev_err(rtd->dev, "unable to add card controls, ret %d\n", ret);
  825. return ret;
  826. }
  827. ret = snd_soc_card_jack_new_pins(card, "Headset Jack",
  828. SND_JACK_HEADSET | SND_JACK_LINEOUT |
  829. SND_JACK_BTN_0 | SND_JACK_BTN_1 |
  830. SND_JACK_BTN_2 | SND_JACK_BTN_3,
  831. &nau8825_jack,
  832. nau8825_jack_pins,
  833. ARRAY_SIZE(nau8825_jack_pins));
  834. if (ret) {
  835. dev_err(card->dev, "HP jack creation failed %d\n", ret);
  836. return ret;
  837. }
  838. snd_jack_set_key(nau8825_jack.jack, SND_JACK_BTN_0, KEY_PLAYPAUSE);
  839. snd_jack_set_key(nau8825_jack.jack, SND_JACK_BTN_1, KEY_VOICECOMMAND);
  840. snd_jack_set_key(nau8825_jack.jack, SND_JACK_BTN_2, KEY_VOLUMEUP);
  841. snd_jack_set_key(nau8825_jack.jack, SND_JACK_BTN_3, KEY_VOLUMEDOWN);
  842. ret = snd_soc_component_set_jack(component, &nau8825_jack, NULL);
  843. if (ret) {
  844. dev_err(rtd->dev, "Headset Jack call-back failed: %d\n", ret);
  845. return ret;
  846. }
  847. return snd_soc_dapm_add_routes(&rtd->card->dapm, nau8825_map, ARRAY_SIZE(nau8825_map));
  848. }
  849. static int acp_nau8825_hw_params(struct snd_pcm_substream *substream,
  850. struct snd_pcm_hw_params *params)
  851. {
  852. struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
  853. struct snd_soc_card *card = rtd->card;
  854. struct acp_card_drvdata *drvdata = card->drvdata;
  855. struct snd_soc_dai *codec_dai = snd_soc_rtd_to_codec(rtd, 0);
  856. struct snd_soc_dai *cpu_dai = snd_soc_rtd_to_cpu(rtd, 0);
  857. int ret;
  858. unsigned int fmt;
  859. ret = snd_soc_dai_set_sysclk(codec_dai, NAU8825_CLK_FLL_FS,
  860. (48000 * 256), SND_SOC_CLOCK_IN);
  861. if (ret < 0)
  862. dev_err(rtd->dev, "snd_soc_dai_set_sysclk err = %d\n", ret);
  863. ret = snd_soc_dai_set_pll(codec_dai, 0, 0, params_rate(params),
  864. params_rate(params) * 256);
  865. if (ret < 0) {
  866. dev_err(rtd->dev, "can't set FLL: %d\n", ret);
  867. return ret;
  868. }
  869. if (drvdata->tdm_mode)
  870. fmt = SND_SOC_DAIFMT_DSP_A;
  871. else
  872. fmt = SND_SOC_DAIFMT_I2S;
  873. if (drvdata->soc_mclk)
  874. fmt |= SND_SOC_DAIFMT_NB_NF | SND_SOC_DAIFMT_CBC_CFC;
  875. else
  876. fmt |= SND_SOC_DAIFMT_NB_NF | SND_SOC_DAIFMT_CBP_CFP;
  877. ret = snd_soc_dai_set_fmt(cpu_dai, fmt);
  878. if (ret && ret != -ENOTSUPP) {
  879. dev_err(rtd->dev, "Failed to set dai fmt: %d\n", ret);
  880. return ret;
  881. }
  882. ret = snd_soc_dai_set_fmt(codec_dai, fmt);
  883. if (ret < 0) {
  884. dev_err(rtd->card->dev, "Failed to set dai fmt: %d\n", ret);
  885. return ret;
  886. }
  887. if (drvdata->tdm_mode) {
  888. /**
  889. * As codec supports slot 4 and slot 5 for playback and slot 6 for capture.
  890. */
  891. ret = snd_soc_dai_set_tdm_slot(cpu_dai, 0x30, 0xC0, 8, 16);
  892. if (ret && ret != -ENOTSUPP) {
  893. dev_err(rtd->dev, "set TDM slot err: %d\n", ret);
  894. return ret;
  895. }
  896. ret = snd_soc_dai_set_tdm_slot(codec_dai, 0x40, 0x30, 8, 16);
  897. if (ret < 0) {
  898. dev_warn(rtd->dev, "set TDM slot err:%d\n", ret);
  899. return ret;
  900. }
  901. }
  902. return ret;
  903. }
  904. static int acp_nau8825_startup(struct snd_pcm_substream *substream)
  905. {
  906. struct snd_pcm_runtime *runtime = substream->runtime;
  907. runtime->hw.channels_max = 2;
  908. snd_pcm_hw_constraint_list(runtime, 0, SNDRV_PCM_HW_PARAM_CHANNELS,
  909. &constraints_channels);
  910. runtime->hw.formats = SNDRV_PCM_FMTBIT_S16_LE;
  911. snd_pcm_hw_constraint_list(runtime, 0,
  912. SNDRV_PCM_HW_PARAM_RATE, &constraints_rates);
  913. return 0;
  914. }
  915. static const struct snd_soc_ops acp_card_nau8825_ops = {
  916. .startup = acp_nau8825_startup,
  917. .hw_params = acp_nau8825_hw_params,
  918. };
  919. static int platform_clock_control(struct snd_soc_dapm_widget *w,
  920. struct snd_kcontrol *k, int event)
  921. {
  922. struct snd_soc_dapm_context *dapm = w->dapm;
  923. struct snd_soc_card *card = dapm->card;
  924. struct snd_soc_dai *codec_dai;
  925. int ret = 0;
  926. codec_dai = snd_soc_card_get_codec_dai(card, NAU8821_CODEC_DAI);
  927. if (!codec_dai) {
  928. dev_err(card->dev, "Codec dai not found\n");
  929. return -EIO;
  930. }
  931. if (SND_SOC_DAPM_EVENT_OFF(event)) {
  932. ret = snd_soc_dai_set_sysclk(codec_dai, NAU8821_CLK_INTERNAL,
  933. 0, SND_SOC_CLOCK_IN);
  934. if (ret < 0) {
  935. dev_err(card->dev, "set sysclk err = %d\n", ret);
  936. return -EIO;
  937. }
  938. } else {
  939. ret = snd_soc_dai_set_sysclk(codec_dai, NAU8821_CLK_FLL_BLK, 0,
  940. SND_SOC_CLOCK_IN);
  941. if (ret < 0)
  942. dev_err(codec_dai->dev, "can't set FS clock %d\n", ret);
  943. ret = snd_soc_dai_set_pll(codec_dai, 0, 0, NAU8821_BCLK,
  944. NAU8821_FREQ_OUT);
  945. if (ret < 0)
  946. dev_err(codec_dai->dev, "can't set FLL: %d\n", ret);
  947. }
  948. return ret;
  949. }
  950. static struct snd_soc_jack nau8821_jack;
  951. static struct snd_soc_jack_pin nau8821_jack_pins[] = {
  952. {
  953. .pin = "Headphone Jack",
  954. .mask = SND_JACK_HEADPHONE,
  955. },
  956. {
  957. .pin = "Headset Mic",
  958. .mask = SND_JACK_MICROPHONE,
  959. },
  960. };
  961. static const struct snd_kcontrol_new nau8821_controls[] = {
  962. SOC_DAPM_PIN_SWITCH("Headphone Jack"),
  963. SOC_DAPM_PIN_SWITCH("Headset Mic"),
  964. };
  965. static const struct snd_soc_dapm_widget nau8821_widgets[] = {
  966. SND_SOC_DAPM_HP("Headphone Jack", NULL),
  967. SND_SOC_DAPM_MIC("Headset Mic", NULL),
  968. SND_SOC_DAPM_MIC("Int Mic", NULL),
  969. SND_SOC_DAPM_SUPPLY("Platform Clock", SND_SOC_NOPM, 0, 0,
  970. platform_clock_control, SND_SOC_DAPM_PRE_PMU |
  971. SND_SOC_DAPM_POST_PMD),
  972. };
  973. static const struct snd_soc_dapm_route nau8821_audio_route[] = {
  974. /* HP jack connectors - unknown if we have jack detection */
  975. { "Headphone Jack", NULL, "HPOL" },
  976. { "Headphone Jack", NULL, "HPOR" },
  977. { "MICL", NULL, "Headset Mic" },
  978. { "MICR", NULL, "Headset Mic" },
  979. { "DMIC", NULL, "Int Mic" },
  980. { "Headphone Jack", NULL, "Platform Clock" },
  981. { "Headset Mic", NULL, "Platform Clock" },
  982. { "Int Mic", NULL, "Platform Clock" },
  983. };
  984. static const unsigned int nau8821_format[] = {16};
  985. static struct snd_pcm_hw_constraint_list constraints_sample_bits = {
  986. .list = nau8821_format,
  987. .count = ARRAY_SIZE(nau8821_format),
  988. };
  989. static int acp_8821_init(struct snd_soc_pcm_runtime *rtd)
  990. {
  991. struct snd_soc_card *card = rtd->card;
  992. struct snd_soc_dai *codec_dai = snd_soc_rtd_to_codec(rtd, 0);
  993. struct snd_soc_component *component = codec_dai->component;
  994. int ret;
  995. dev_info(rtd->dev, "codec dai name = %s\n", codec_dai->name);
  996. ret = snd_soc_dapm_new_controls(&card->dapm, nau8821_widgets,
  997. ARRAY_SIZE(nau8821_widgets));
  998. if (ret) {
  999. dev_err(rtd->dev, "unable to add widget dapm controls, ret %d\n", ret);
  1000. // Don't need to add routes if widget addition failed
  1001. return ret;
  1002. }
  1003. ret = snd_soc_add_card_controls(card, nau8821_controls,
  1004. ARRAY_SIZE(nau8821_controls));
  1005. if (ret) {
  1006. dev_err(rtd->dev, "unable to add card controls, ret %d\n", ret);
  1007. return ret;
  1008. }
  1009. ret = snd_soc_card_jack_new_pins(card, "Headset Jack",
  1010. SND_JACK_HEADSET | SND_JACK_LINEOUT |
  1011. SND_JACK_BTN_0 | SND_JACK_BTN_1 |
  1012. SND_JACK_BTN_2 | SND_JACK_BTN_3,
  1013. &nau8821_jack,
  1014. nau8821_jack_pins,
  1015. ARRAY_SIZE(nau8821_jack_pins));
  1016. if (ret) {
  1017. dev_err(rtd->dev, "Headset Jack creation failed %d\n", ret);
  1018. return ret;
  1019. }
  1020. snd_jack_set_key(nau8821_jack.jack, SND_JACK_BTN_0, KEY_PLAYPAUSE);
  1021. snd_jack_set_key(nau8821_jack.jack, SND_JACK_BTN_1, KEY_VOICECOMMAND);
  1022. snd_jack_set_key(nau8821_jack.jack, SND_JACK_BTN_2, KEY_VOLUMEUP);
  1023. snd_jack_set_key(nau8821_jack.jack, SND_JACK_BTN_3, KEY_VOLUMEDOWN);
  1024. nau8821_enable_jack_detect(component, &nau8821_jack);
  1025. return snd_soc_dapm_add_routes(&rtd->card->dapm, nau8821_audio_route,
  1026. ARRAY_SIZE(nau8821_audio_route));
  1027. }
  1028. static int acp_8821_startup(struct snd_pcm_substream *substream)
  1029. {
  1030. struct snd_pcm_runtime *runtime = substream->runtime;
  1031. runtime->hw.channels_max = DUAL_CHANNEL;
  1032. snd_pcm_hw_constraint_list(runtime, 0, SNDRV_PCM_HW_PARAM_CHANNELS,
  1033. &constraints_channels);
  1034. snd_pcm_hw_constraint_list(runtime, 0, SNDRV_PCM_HW_PARAM_RATE,
  1035. &constraints_rates);
  1036. snd_pcm_hw_constraint_list(substream->runtime, 0,
  1037. SNDRV_PCM_HW_PARAM_SAMPLE_BITS,
  1038. &constraints_sample_bits);
  1039. return 0;
  1040. }
  1041. static int acp_nau8821_hw_params(struct snd_pcm_substream *substream,
  1042. struct snd_pcm_hw_params *params)
  1043. {
  1044. struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
  1045. struct snd_soc_card *card = rtd->card;
  1046. struct acp_card_drvdata *drvdata = card->drvdata;
  1047. struct snd_soc_dai *codec_dai = snd_soc_rtd_to_codec(rtd, 0);
  1048. int ret;
  1049. unsigned int fmt;
  1050. if (drvdata->soc_mclk)
  1051. fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF | SND_SOC_DAIFMT_CBC_CFC;
  1052. else
  1053. fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF | SND_SOC_DAIFMT_CBP_CFP;
  1054. ret = snd_soc_dai_set_fmt(codec_dai, fmt);
  1055. if (ret < 0) {
  1056. dev_err(rtd->card->dev, "Failed to set dai fmt: %d\n", ret);
  1057. return ret;
  1058. }
  1059. ret = snd_soc_dai_set_sysclk(codec_dai, NAU8821_CLK_FLL_BLK, 0,
  1060. SND_SOC_CLOCK_IN);
  1061. if (ret < 0)
  1062. dev_err(card->dev, "can't set FS clock %d\n", ret);
  1063. ret = snd_soc_dai_set_pll(codec_dai, 0, 0, snd_soc_params_to_bclk(params),
  1064. params_rate(params) * 256);
  1065. if (ret < 0)
  1066. dev_err(card->dev, "can't set FLL: %d\n", ret);
  1067. return ret;
  1068. }
  1069. static const struct snd_soc_ops acp_8821_ops = {
  1070. .startup = acp_8821_startup,
  1071. .hw_params = acp_nau8821_hw_params,
  1072. };
  1073. SND_SOC_DAILINK_DEF(nau8821,
  1074. DAILINK_COMP_ARRAY(COMP_CODEC("i2c-NVTN2020:00",
  1075. NAU8821_CODEC_DAI)));
  1076. /* Declare DMIC codec components */
  1077. SND_SOC_DAILINK_DEF(dmic_codec,
  1078. DAILINK_COMP_ARRAY(COMP_CODEC("dmic-codec", "dmic-hifi")));
  1079. /* Declare ACP CPU components */
  1080. static struct snd_soc_dai_link_component platform_component[] = {
  1081. {
  1082. .name = "acp_asoc_renoir.0",
  1083. }
  1084. };
  1085. static struct snd_soc_dai_link_component platform_rmb_component[] = {
  1086. {
  1087. .name = "acp_asoc_rembrandt.0",
  1088. }
  1089. };
  1090. static struct snd_soc_dai_link_component platform_acp63_component[] = {
  1091. {
  1092. .name = "acp_asoc_acp63.0",
  1093. }
  1094. };
  1095. static struct snd_soc_dai_link_component platform_acp70_component[] = {
  1096. {
  1097. .name = "acp_asoc_acp70.0",
  1098. }
  1099. };
  1100. static struct snd_soc_dai_link_component sof_component[] = {
  1101. {
  1102. .name = "0000:04:00.5",
  1103. }
  1104. };
  1105. SND_SOC_DAILINK_DEF(i2s_sp,
  1106. DAILINK_COMP_ARRAY(COMP_CPU("acp-i2s-sp")));
  1107. SND_SOC_DAILINK_DEF(i2s_hs,
  1108. DAILINK_COMP_ARRAY(COMP_CPU("acp-i2s-hs")));
  1109. SND_SOC_DAILINK_DEF(sof_sp,
  1110. DAILINK_COMP_ARRAY(COMP_CPU("acp-sof-sp")));
  1111. SND_SOC_DAILINK_DEF(sof_sp_virtual,
  1112. DAILINK_COMP_ARRAY(COMP_CPU("acp-sof-sp-virtual")));
  1113. SND_SOC_DAILINK_DEF(sof_hs,
  1114. DAILINK_COMP_ARRAY(COMP_CPU("acp-sof-hs")));
  1115. SND_SOC_DAILINK_DEF(sof_hs_virtual,
  1116. DAILINK_COMP_ARRAY(COMP_CPU("acp-sof-hs-virtual")));
  1117. SND_SOC_DAILINK_DEF(sof_bt,
  1118. DAILINK_COMP_ARRAY(COMP_CPU("acp-sof-bt")));
  1119. SND_SOC_DAILINK_DEF(sof_dmic,
  1120. DAILINK_COMP_ARRAY(COMP_CPU("acp-sof-dmic")));
  1121. SND_SOC_DAILINK_DEF(pdm_dmic,
  1122. DAILINK_COMP_ARRAY(COMP_CPU("acp-pdm-dmic")));
  1123. static int acp_rtk_set_bias_level(struct snd_soc_card *card,
  1124. struct snd_soc_dapm_context *dapm,
  1125. enum snd_soc_bias_level level)
  1126. {
  1127. struct snd_soc_component *component = dapm->component;
  1128. struct acp_card_drvdata *drvdata = card->drvdata;
  1129. int ret = 0;
  1130. if (!component)
  1131. return 0;
  1132. if (strncmp(component->name, "i2c-RTL5682", 11) &&
  1133. strncmp(component->name, "i2c-10EC1019", 12))
  1134. return 0;
  1135. /*
  1136. * For Realtek's codec and amplifier components,
  1137. * the lrck and bclk must be enabled brfore their all dapms be powered on,
  1138. * and must be disabled after their all dapms be powered down
  1139. * to avoid any pop.
  1140. */
  1141. switch (level) {
  1142. case SND_SOC_BIAS_STANDBY:
  1143. if (snd_soc_dapm_get_bias_level(dapm) == SND_SOC_BIAS_OFF) {
  1144. /* Increase bclk's enable_count */
  1145. ret = clk_prepare_enable(drvdata->bclk);
  1146. if (ret < 0)
  1147. dev_err(component->dev, "Failed to enable bclk %d\n", ret);
  1148. } else {
  1149. /*
  1150. * Decrease bclk's enable_count.
  1151. * While the enable_count is 0, the bclk would be closed.
  1152. */
  1153. clk_disable_unprepare(drvdata->bclk);
  1154. }
  1155. break;
  1156. default:
  1157. break;
  1158. }
  1159. return ret;
  1160. }
  1161. int acp_sofdsp_dai_links_create(struct snd_soc_card *card)
  1162. {
  1163. struct snd_soc_dai_link *links;
  1164. struct device *dev = card->dev;
  1165. struct acp_card_drvdata *drv_data = card->drvdata;
  1166. int i = 0, num_links = 0;
  1167. if (drv_data->hs_cpu_id)
  1168. num_links++;
  1169. if (drv_data->bt_cpu_id)
  1170. num_links++;
  1171. if (drv_data->amp_cpu_id)
  1172. num_links++;
  1173. if (drv_data->dmic_cpu_id)
  1174. num_links++;
  1175. links = devm_kcalloc(dev, num_links, sizeof(struct snd_soc_dai_link), GFP_KERNEL);
  1176. if (!links)
  1177. return -ENOMEM;
  1178. if (drv_data->hs_cpu_id == I2S_SP) {
  1179. links[i].name = "acp-headset-codec";
  1180. links[i].id = HEADSET_BE_ID;
  1181. links[i].cpus = sof_sp;
  1182. links[i].num_cpus = ARRAY_SIZE(sof_sp);
  1183. links[i].platforms = sof_component;
  1184. links[i].num_platforms = ARRAY_SIZE(sof_component);
  1185. links[i].dpcm_playback = 1;
  1186. links[i].dpcm_capture = 1;
  1187. links[i].nonatomic = true;
  1188. links[i].no_pcm = 1;
  1189. if (!drv_data->hs_codec_id) {
  1190. /* Use dummy codec if codec id not specified */
  1191. links[i].codecs = &snd_soc_dummy_dlc;
  1192. links[i].num_codecs = 1;
  1193. }
  1194. if (drv_data->hs_codec_id == RT5682) {
  1195. links[i].codecs = rt5682;
  1196. links[i].num_codecs = ARRAY_SIZE(rt5682);
  1197. links[i].init = acp_card_rt5682_init;
  1198. links[i].ops = &acp_card_rt5682_ops;
  1199. }
  1200. if (drv_data->hs_codec_id == RT5682S) {
  1201. links[i].codecs = rt5682s;
  1202. links[i].num_codecs = ARRAY_SIZE(rt5682s);
  1203. links[i].init = acp_card_rt5682s_init;
  1204. links[i].ops = &acp_card_rt5682s_ops;
  1205. }
  1206. if (drv_data->hs_codec_id == NAU8821) {
  1207. links[i].codecs = nau8821;
  1208. links[i].num_codecs = ARRAY_SIZE(nau8821);
  1209. links[i].init = acp_8821_init;
  1210. links[i].ops = &acp_8821_ops;
  1211. }
  1212. i++;
  1213. }
  1214. if (drv_data->hs_cpu_id == I2S_HS) {
  1215. links[i].name = "acp-headset-codec";
  1216. links[i].id = HEADSET_BE_ID;
  1217. links[i].cpus = sof_hs;
  1218. links[i].num_cpus = ARRAY_SIZE(sof_hs);
  1219. links[i].platforms = sof_component;
  1220. links[i].num_platforms = ARRAY_SIZE(sof_component);
  1221. links[i].dpcm_playback = 1;
  1222. links[i].dpcm_capture = 1;
  1223. links[i].nonatomic = true;
  1224. links[i].no_pcm = 1;
  1225. if (!drv_data->hs_codec_id) {
  1226. /* Use dummy codec if codec id not specified */
  1227. links[i].codecs = &snd_soc_dummy_dlc;
  1228. links[i].num_codecs = 1;
  1229. }
  1230. if (drv_data->hs_codec_id == NAU8825) {
  1231. links[i].codecs = nau8825;
  1232. links[i].num_codecs = ARRAY_SIZE(nau8825);
  1233. links[i].init = acp_card_nau8825_init;
  1234. links[i].ops = &acp_card_nau8825_ops;
  1235. }
  1236. if (drv_data->hs_codec_id == RT5682S) {
  1237. links[i].codecs = rt5682s;
  1238. links[i].num_codecs = ARRAY_SIZE(rt5682s);
  1239. links[i].init = acp_card_rt5682s_init;
  1240. links[i].ops = &acp_card_rt5682s_ops;
  1241. }
  1242. i++;
  1243. }
  1244. if (drv_data->amp_cpu_id == I2S_SP) {
  1245. links[i].name = "acp-amp-codec";
  1246. links[i].id = AMP_BE_ID;
  1247. if (drv_data->platform == RENOIR) {
  1248. links[i].cpus = sof_sp;
  1249. links[i].num_cpus = ARRAY_SIZE(sof_sp);
  1250. } else {
  1251. links[i].cpus = sof_sp_virtual;
  1252. links[i].num_cpus = ARRAY_SIZE(sof_sp_virtual);
  1253. }
  1254. links[i].platforms = sof_component;
  1255. links[i].num_platforms = ARRAY_SIZE(sof_component);
  1256. links[i].dpcm_playback = 1;
  1257. links[i].nonatomic = true;
  1258. links[i].no_pcm = 1;
  1259. if (!drv_data->amp_codec_id) {
  1260. /* Use dummy codec if codec id not specified */
  1261. links[i].codecs = &snd_soc_dummy_dlc;
  1262. links[i].num_codecs = 1;
  1263. }
  1264. if (drv_data->amp_codec_id == RT1019) {
  1265. links[i].codecs = rt1019;
  1266. links[i].num_codecs = ARRAY_SIZE(rt1019);
  1267. links[i].ops = &acp_card_rt1019_ops;
  1268. links[i].init = acp_card_rt1019_init;
  1269. card->codec_conf = rt1019_conf;
  1270. card->num_configs = ARRAY_SIZE(rt1019_conf);
  1271. }
  1272. if (drv_data->amp_codec_id == MAX98360A) {
  1273. links[i].codecs = max98360a;
  1274. links[i].num_codecs = ARRAY_SIZE(max98360a);
  1275. links[i].ops = &acp_card_maxim_ops;
  1276. links[i].init = acp_card_maxim_init;
  1277. }
  1278. i++;
  1279. }
  1280. if (drv_data->amp_cpu_id == I2S_HS) {
  1281. links[i].name = "acp-amp-codec";
  1282. links[i].id = AMP_BE_ID;
  1283. links[i].cpus = sof_hs_virtual;
  1284. links[i].num_cpus = ARRAY_SIZE(sof_hs_virtual);
  1285. links[i].platforms = sof_component;
  1286. links[i].num_platforms = ARRAY_SIZE(sof_component);
  1287. links[i].dpcm_playback = 1;
  1288. links[i].nonatomic = true;
  1289. links[i].no_pcm = 1;
  1290. if (!drv_data->amp_codec_id) {
  1291. /* Use dummy codec if codec id not specified */
  1292. links[i].codecs = &snd_soc_dummy_dlc;
  1293. links[i].num_codecs = 1;
  1294. }
  1295. if (drv_data->amp_codec_id == MAX98360A) {
  1296. links[i].codecs = max98360a;
  1297. links[i].num_codecs = ARRAY_SIZE(max98360a);
  1298. links[i].ops = &acp_card_maxim_ops;
  1299. links[i].init = acp_card_maxim_init;
  1300. }
  1301. if (drv_data->amp_codec_id == MAX98388) {
  1302. links[i].dpcm_capture = 1;
  1303. links[i].codecs = max98388;
  1304. links[i].num_codecs = ARRAY_SIZE(max98388);
  1305. links[i].ops = &acp_max98388_ops;
  1306. links[i].init = acp_card_max98388_init;
  1307. card->codec_conf = max98388_conf;
  1308. card->num_configs = ARRAY_SIZE(max98388_conf);
  1309. }
  1310. if (drv_data->amp_codec_id == RT1019) {
  1311. links[i].codecs = rt1019;
  1312. links[i].num_codecs = ARRAY_SIZE(rt1019);
  1313. links[i].ops = &acp_card_rt1019_ops;
  1314. links[i].init = acp_card_rt1019_init;
  1315. card->codec_conf = rt1019_conf;
  1316. card->num_configs = ARRAY_SIZE(rt1019_conf);
  1317. }
  1318. i++;
  1319. }
  1320. if (drv_data->bt_cpu_id == I2S_BT) {
  1321. links[i].name = "acp-bt-codec";
  1322. links[i].id = BT_BE_ID;
  1323. links[i].cpus = sof_bt;
  1324. links[i].num_cpus = ARRAY_SIZE(sof_bt);
  1325. links[i].platforms = sof_component;
  1326. links[i].num_platforms = ARRAY_SIZE(sof_component);
  1327. links[i].dpcm_playback = 1;
  1328. links[i].dpcm_capture = 1;
  1329. links[i].nonatomic = true;
  1330. links[i].no_pcm = 1;
  1331. if (!drv_data->bt_codec_id) {
  1332. /* Use dummy codec if codec id not specified */
  1333. links[i].codecs = &snd_soc_dummy_dlc;
  1334. links[i].num_codecs = 1;
  1335. }
  1336. i++;
  1337. }
  1338. if (drv_data->dmic_cpu_id == DMIC) {
  1339. links[i].name = "acp-dmic-codec";
  1340. links[i].id = DMIC_BE_ID;
  1341. links[i].codecs = dmic_codec;
  1342. links[i].num_codecs = ARRAY_SIZE(dmic_codec);
  1343. links[i].cpus = sof_dmic;
  1344. links[i].num_cpus = ARRAY_SIZE(sof_dmic);
  1345. links[i].platforms = sof_component;
  1346. links[i].num_platforms = ARRAY_SIZE(sof_component);
  1347. links[i].dpcm_capture = 1;
  1348. links[i].nonatomic = true;
  1349. links[i].no_pcm = 1;
  1350. }
  1351. card->dai_link = links;
  1352. card->num_links = num_links;
  1353. card->set_bias_level = acp_rtk_set_bias_level;
  1354. return 0;
  1355. }
  1356. EXPORT_SYMBOL_NS_GPL(acp_sofdsp_dai_links_create, SND_SOC_AMD_MACH);
  1357. int acp_legacy_dai_links_create(struct snd_soc_card *card)
  1358. {
  1359. struct snd_soc_dai_link *links;
  1360. struct device *dev = card->dev;
  1361. struct acp_card_drvdata *drv_data = card->drvdata;
  1362. int i = 0, num_links = 0;
  1363. int rc;
  1364. if (drv_data->hs_cpu_id)
  1365. num_links++;
  1366. if (drv_data->amp_cpu_id)
  1367. num_links++;
  1368. if (drv_data->dmic_cpu_id)
  1369. num_links++;
  1370. links = devm_kcalloc(dev, num_links, sizeof(struct snd_soc_dai_link), GFP_KERNEL);
  1371. if (!links)
  1372. return -ENOMEM;
  1373. if (drv_data->hs_cpu_id == I2S_SP) {
  1374. links[i].name = "acp-headset-codec";
  1375. links[i].id = HEADSET_BE_ID;
  1376. links[i].cpus = i2s_sp;
  1377. links[i].num_cpus = ARRAY_SIZE(i2s_sp);
  1378. links[i].platforms = platform_component;
  1379. links[i].num_platforms = ARRAY_SIZE(platform_component);
  1380. links[i].dpcm_playback = 1;
  1381. links[i].dpcm_capture = 1;
  1382. if (!drv_data->hs_codec_id) {
  1383. /* Use dummy codec if codec id not specified */
  1384. links[i].codecs = &snd_soc_dummy_dlc;
  1385. links[i].num_codecs = 1;
  1386. }
  1387. if (drv_data->hs_codec_id == RT5682) {
  1388. links[i].codecs = rt5682;
  1389. links[i].num_codecs = ARRAY_SIZE(rt5682);
  1390. links[i].init = acp_card_rt5682_init;
  1391. links[i].ops = &acp_card_rt5682_ops;
  1392. }
  1393. if (drv_data->hs_codec_id == RT5682S) {
  1394. links[i].codecs = rt5682s;
  1395. links[i].num_codecs = ARRAY_SIZE(rt5682s);
  1396. links[i].init = acp_card_rt5682s_init;
  1397. links[i].ops = &acp_card_rt5682s_ops;
  1398. }
  1399. if (drv_data->hs_codec_id == ES83XX) {
  1400. rc = acp_ops_configure_link(card, &links[i]);
  1401. if (rc != 0) {
  1402. dev_err(dev, "Failed to configure link for ES83XX: %d\n", rc);
  1403. return rc;
  1404. }
  1405. }
  1406. i++;
  1407. }
  1408. if (drv_data->hs_cpu_id == I2S_HS) {
  1409. links[i].name = "acp-headset-codec";
  1410. links[i].id = HEADSET_BE_ID;
  1411. links[i].cpus = i2s_hs;
  1412. links[i].num_cpus = ARRAY_SIZE(i2s_hs);
  1413. if (drv_data->platform == REMBRANDT) {
  1414. links[i].platforms = platform_rmb_component;
  1415. links[i].num_platforms = ARRAY_SIZE(platform_rmb_component);
  1416. } else if (drv_data->platform == ACP63) {
  1417. links[i].platforms = platform_acp63_component;
  1418. links[i].num_platforms = ARRAY_SIZE(platform_acp63_component);
  1419. } else {
  1420. links[i].platforms = platform_component;
  1421. links[i].num_platforms = ARRAY_SIZE(platform_component);
  1422. }
  1423. links[i].dpcm_playback = 1;
  1424. links[i].dpcm_capture = 1;
  1425. if (!drv_data->hs_codec_id) {
  1426. /* Use dummy codec if codec id not specified */
  1427. links[i].codecs = &snd_soc_dummy_dlc;
  1428. links[i].num_codecs = 1;
  1429. }
  1430. if (drv_data->hs_codec_id == NAU8825) {
  1431. links[i].codecs = nau8825;
  1432. links[i].num_codecs = ARRAY_SIZE(nau8825);
  1433. links[i].init = acp_card_nau8825_init;
  1434. links[i].ops = &acp_card_nau8825_ops;
  1435. }
  1436. if (drv_data->hs_codec_id == RT5682S) {
  1437. links[i].codecs = rt5682s;
  1438. links[i].num_codecs = ARRAY_SIZE(rt5682s);
  1439. links[i].init = acp_card_rt5682s_init;
  1440. links[i].ops = &acp_card_rt5682s_ops;
  1441. }
  1442. i++;
  1443. }
  1444. if (drv_data->amp_cpu_id == I2S_SP) {
  1445. links[i].name = "acp-amp-codec";
  1446. links[i].id = AMP_BE_ID;
  1447. links[i].cpus = i2s_sp;
  1448. links[i].num_cpus = ARRAY_SIZE(i2s_sp);
  1449. links[i].platforms = platform_component;
  1450. links[i].num_platforms = ARRAY_SIZE(platform_component);
  1451. links[i].dpcm_playback = 1;
  1452. if (!drv_data->amp_codec_id) {
  1453. /* Use dummy codec if codec id not specified */
  1454. links[i].codecs = &snd_soc_dummy_dlc;
  1455. links[i].num_codecs = 1;
  1456. }
  1457. if (drv_data->amp_codec_id == RT1019) {
  1458. links[i].codecs = rt1019;
  1459. links[i].num_codecs = ARRAY_SIZE(rt1019);
  1460. links[i].ops = &acp_card_rt1019_ops;
  1461. links[i].init = acp_card_rt1019_init;
  1462. card->codec_conf = rt1019_conf;
  1463. card->num_configs = ARRAY_SIZE(rt1019_conf);
  1464. }
  1465. if (drv_data->amp_codec_id == MAX98360A) {
  1466. links[i].codecs = max98360a;
  1467. links[i].num_codecs = ARRAY_SIZE(max98360a);
  1468. links[i].ops = &acp_card_maxim_ops;
  1469. links[i].init = acp_card_maxim_init;
  1470. }
  1471. i++;
  1472. }
  1473. if (drv_data->amp_cpu_id == I2S_HS) {
  1474. links[i].name = "acp-amp-codec";
  1475. links[i].id = AMP_BE_ID;
  1476. links[i].cpus = i2s_hs;
  1477. links[i].num_cpus = ARRAY_SIZE(i2s_hs);
  1478. if (drv_data->platform == REMBRANDT) {
  1479. links[i].platforms = platform_rmb_component;
  1480. links[i].num_platforms = ARRAY_SIZE(platform_rmb_component);
  1481. } else if (drv_data->platform == ACP63) {
  1482. links[i].platforms = platform_acp63_component;
  1483. links[i].num_platforms = ARRAY_SIZE(platform_acp63_component);
  1484. } else {
  1485. links[i].platforms = platform_component;
  1486. links[i].num_platforms = ARRAY_SIZE(platform_component);
  1487. }
  1488. links[i].dpcm_playback = 1;
  1489. if (!drv_data->amp_codec_id) {
  1490. /* Use dummy codec if codec id not specified */
  1491. links[i].codecs = &snd_soc_dummy_dlc;
  1492. links[i].num_codecs = 1;
  1493. }
  1494. if (drv_data->amp_codec_id == MAX98360A) {
  1495. links[i].codecs = max98360a;
  1496. links[i].num_codecs = ARRAY_SIZE(max98360a);
  1497. links[i].ops = &acp_card_maxim_ops;
  1498. links[i].init = acp_card_maxim_init;
  1499. }
  1500. if (drv_data->amp_codec_id == RT1019) {
  1501. links[i].codecs = rt1019;
  1502. links[i].num_codecs = ARRAY_SIZE(rt1019);
  1503. links[i].ops = &acp_card_rt1019_ops;
  1504. links[i].init = acp_card_rt1019_init;
  1505. card->codec_conf = rt1019_conf;
  1506. card->num_configs = ARRAY_SIZE(rt1019_conf);
  1507. }
  1508. i++;
  1509. }
  1510. if (drv_data->dmic_cpu_id == DMIC) {
  1511. links[i].name = "acp-dmic-codec";
  1512. links[i].id = DMIC_BE_ID;
  1513. if (drv_data->dmic_codec_id == DMIC) {
  1514. links[i].codecs = dmic_codec;
  1515. links[i].num_codecs = ARRAY_SIZE(dmic_codec);
  1516. } else {
  1517. /* Use dummy codec if codec id not specified */
  1518. links[i].codecs = &snd_soc_dummy_dlc;
  1519. links[i].num_codecs = 1;
  1520. }
  1521. links[i].cpus = pdm_dmic;
  1522. links[i].num_cpus = ARRAY_SIZE(pdm_dmic);
  1523. if (drv_data->platform == REMBRANDT) {
  1524. links[i].platforms = platform_rmb_component;
  1525. links[i].num_platforms = ARRAY_SIZE(platform_rmb_component);
  1526. } else if (drv_data->platform == ACP63) {
  1527. links[i].platforms = platform_acp63_component;
  1528. links[i].num_platforms = ARRAY_SIZE(platform_acp63_component);
  1529. } else if ((drv_data->platform == ACP70) || (drv_data->platform == ACP71)) {
  1530. links[i].platforms = platform_acp70_component;
  1531. links[i].num_platforms = ARRAY_SIZE(platform_acp70_component);
  1532. } else {
  1533. links[i].platforms = platform_component;
  1534. links[i].num_platforms = ARRAY_SIZE(platform_component);
  1535. }
  1536. links[i].ops = &acp_card_dmic_ops;
  1537. links[i].dpcm_capture = 1;
  1538. }
  1539. card->dai_link = links;
  1540. card->num_links = num_links;
  1541. card->set_bias_level = acp_rtk_set_bias_level;
  1542. return 0;
  1543. }
  1544. EXPORT_SYMBOL_NS_GPL(acp_legacy_dai_links_create, SND_SOC_AMD_MACH);
  1545. MODULE_DESCRIPTION("AMD ACP Common Machine driver");
  1546. MODULE_LICENSE("GPL v2");