This source file includes following definitions.
- platform_clock_control
- kabylake_rt5663_fe_init
- kabylake_rt5663_codec_init
- kabylake_rt5663_max98927_codec_init
- kabylake_hdmi_init
- kabylake_hdmi1_init
- kabylake_hdmi2_init
- kabylake_hdmi3_init
- kabylake_5663_hdmi1_init
- kabylake_5663_hdmi2_init
- kbl_fe_startup
- kabylake_ssp_fixup
- kabylake_rt5663_hw_params
- kabylake_dmic_fixup
- kabylake_ssp0_hw_params
- kabylake_dmic_startup
- kabylake_refcap_startup
- kabylake_card_late_probe
- kabylake_audio_probe
1
2
3
4
5
6
7
8
9
10
11
12 #include <linux/input.h>
13 #include <linux/module.h>
14 #include <linux/platform_device.h>
15 #include <sound/core.h>
16 #include <sound/jack.h>
17 #include <sound/pcm.h>
18 #include <sound/pcm_params.h>
19 #include <sound/soc.h>
20 #include <sound/soc-acpi.h>
21 #include "../../codecs/rt5663.h"
22 #include "../../codecs/hdac_hdmi.h"
23 #include <linux/clk.h>
24 #include <linux/clk-provider.h>
25 #include <linux/clkdev.h>
26
27 #define KBL_REALTEK_CODEC_DAI "rt5663-aif"
28 #define KBL_MAXIM_CODEC_DAI "max98927-aif1"
29 #define DMIC_CH(p) p->list[p->count-1]
30 #define MAXIM_DEV0_NAME "i2c-MX98927:00"
31 #define MAXIM_DEV1_NAME "i2c-MX98927:01"
32
33 static struct snd_soc_card *kabylake_audio_card;
34 static const struct snd_pcm_hw_constraint_list *dmic_constraints;
35 static struct snd_soc_jack skylake_hdmi[3];
36
37 struct kbl_hdmi_pcm {
38 struct list_head head;
39 struct snd_soc_dai *codec_dai;
40 int device;
41 };
42
43 struct kbl_rt5663_private {
44 struct snd_soc_jack kabylake_headset;
45 struct list_head hdmi_pcm_list;
46 struct clk *mclk;
47 struct clk *sclk;
48 };
49
50 enum {
51 KBL_DPCM_AUDIO_PB = 0,
52 KBL_DPCM_AUDIO_CP,
53 KBL_DPCM_AUDIO_HS_PB,
54 KBL_DPCM_AUDIO_ECHO_REF_CP,
55 KBL_DPCM_AUDIO_REF_CP,
56 KBL_DPCM_AUDIO_DMIC_CP,
57 KBL_DPCM_AUDIO_HDMI1_PB,
58 KBL_DPCM_AUDIO_HDMI2_PB,
59 KBL_DPCM_AUDIO_HDMI3_PB,
60 };
61
62 static const struct snd_kcontrol_new kabylake_controls[] = {
63 SOC_DAPM_PIN_SWITCH("Headphone Jack"),
64 SOC_DAPM_PIN_SWITCH("Headset Mic"),
65 SOC_DAPM_PIN_SWITCH("Left Spk"),
66 SOC_DAPM_PIN_SWITCH("Right Spk"),
67 };
68
69 static int platform_clock_control(struct snd_soc_dapm_widget *w,
70 struct snd_kcontrol *k, int event)
71 {
72 struct snd_soc_dapm_context *dapm = w->dapm;
73 struct snd_soc_card *card = dapm->card;
74 struct kbl_rt5663_private *priv = snd_soc_card_get_drvdata(card);
75 int ret = 0;
76
77
78
79
80
81
82 switch (event) {
83 case SND_SOC_DAPM_PRE_PMU:
84
85 ret = clk_set_rate(priv->mclk, 24000000);
86 if (ret < 0) {
87 dev_err(card->dev, "Can't set rate for mclk, err: %d\n",
88 ret);
89 return ret;
90 }
91
92 ret = clk_prepare_enable(priv->mclk);
93 if (ret < 0) {
94 dev_err(card->dev, "Can't enable mclk, err: %d\n", ret);
95 return ret;
96 }
97
98
99 ret = clk_set_rate(priv->sclk, 3072000);
100 if (ret < 0) {
101 dev_err(card->dev, "Can't set rate for sclk, err: %d\n",
102 ret);
103 clk_disable_unprepare(priv->mclk);
104 return ret;
105 }
106
107 ret = clk_prepare_enable(priv->sclk);
108 if (ret < 0) {
109 dev_err(card->dev, "Can't enable sclk, err: %d\n", ret);
110 clk_disable_unprepare(priv->mclk);
111 }
112 break;
113 case SND_SOC_DAPM_POST_PMD:
114 clk_disable_unprepare(priv->mclk);
115 clk_disable_unprepare(priv->sclk);
116 break;
117 default:
118 return 0;
119 }
120
121 return 0;
122 }
123
124 static const struct snd_soc_dapm_widget kabylake_widgets[] = {
125 SND_SOC_DAPM_HP("Headphone Jack", NULL),
126 SND_SOC_DAPM_MIC("Headset Mic", NULL),
127 SND_SOC_DAPM_SPK("Left Spk", NULL),
128 SND_SOC_DAPM_SPK("Right Spk", NULL),
129 SND_SOC_DAPM_MIC("SoC DMIC", NULL),
130 SND_SOC_DAPM_SPK("HDMI1", NULL),
131 SND_SOC_DAPM_SPK("HDMI2", NULL),
132 SND_SOC_DAPM_SPK("HDMI3", NULL),
133 SND_SOC_DAPM_SUPPLY("Platform Clock", SND_SOC_NOPM, 0, 0,
134 platform_clock_control, SND_SOC_DAPM_PRE_PMU |
135 SND_SOC_DAPM_POST_PMD),
136 };
137
138 static const struct snd_soc_dapm_route kabylake_map[] = {
139
140 { "Headphone Jack", NULL, "Platform Clock" },
141 { "Headphone Jack", NULL, "HPOL" },
142 { "Headphone Jack", NULL, "HPOR" },
143
144
145 { "Left Spk", NULL, "Left BE_OUT" },
146 { "Right Spk", NULL, "Right BE_OUT" },
147
148
149 { "Headset Mic", NULL, "Platform Clock" },
150 { "IN1P", NULL, "Headset Mic" },
151 { "IN1N", NULL, "Headset Mic" },
152 { "DMic", NULL, "SoC DMIC" },
153
154
155 { "Left HiFi Playback", NULL, "ssp0 Tx" },
156 { "Right HiFi Playback", NULL, "ssp0 Tx" },
157 { "ssp0 Tx", NULL, "spk_out" },
158
159 { "AIF Playback", NULL, "ssp1 Tx" },
160 { "ssp1 Tx", NULL, "codec1_out" },
161
162 { "hs_in", NULL, "ssp1 Rx" },
163 { "ssp1 Rx", NULL, "AIF Capture" },
164
165
166 { "codec0_fb_in", NULL, "ssp0 Rx"},
167 { "ssp0 Rx", NULL, "Left HiFi Capture" },
168 { "ssp0 Rx", NULL, "Right HiFi Capture" },
169
170
171 { "dmic01_hifi", NULL, "DMIC01 Rx" },
172 { "DMIC01 Rx", NULL, "DMIC AIF" },
173
174 { "hifi3", NULL, "iDisp3 Tx"},
175 { "iDisp3 Tx", NULL, "iDisp3_out"},
176 { "hifi2", NULL, "iDisp2 Tx"},
177 { "iDisp2 Tx", NULL, "iDisp2_out"},
178 { "hifi1", NULL, "iDisp1 Tx"},
179 { "iDisp1 Tx", NULL, "iDisp1_out"},
180 };
181
182 enum {
183 KBL_DPCM_AUDIO_5663_PB = 0,
184 KBL_DPCM_AUDIO_5663_CP,
185 KBL_DPCM_AUDIO_5663_HDMI1_PB,
186 KBL_DPCM_AUDIO_5663_HDMI2_PB,
187 };
188
189 static const struct snd_kcontrol_new kabylake_5663_controls[] = {
190 SOC_DAPM_PIN_SWITCH("Headphone Jack"),
191 SOC_DAPM_PIN_SWITCH("Headset Mic"),
192 };
193
194 static const struct snd_soc_dapm_widget kabylake_5663_widgets[] = {
195 SND_SOC_DAPM_HP("Headphone Jack", NULL),
196 SND_SOC_DAPM_MIC("Headset Mic", NULL),
197 SND_SOC_DAPM_SPK("DP", NULL),
198 SND_SOC_DAPM_SPK("HDMI", NULL),
199 SND_SOC_DAPM_SUPPLY("Platform Clock", SND_SOC_NOPM, 0, 0,
200 platform_clock_control, SND_SOC_DAPM_PRE_PMU |
201 SND_SOC_DAPM_POST_PMD),
202 };
203
204 static const struct snd_soc_dapm_route kabylake_5663_map[] = {
205 { "Headphone Jack", NULL, "Platform Clock" },
206 { "Headphone Jack", NULL, "HPOL" },
207 { "Headphone Jack", NULL, "HPOR" },
208
209
210 { "Headset Mic", NULL, "Platform Clock" },
211 { "IN1P", NULL, "Headset Mic" },
212 { "IN1N", NULL, "Headset Mic" },
213
214 { "HDMI", NULL, "hif5 Output" },
215 { "DP", NULL, "hif6 Output" },
216
217
218 { "AIF Playback", NULL, "ssp1 Tx" },
219 { "ssp1 Tx", NULL, "codec1_out" },
220
221 { "codec0_in", NULL, "ssp1 Rx" },
222 { "ssp1 Rx", NULL, "AIF Capture" },
223
224 { "hifi2", NULL, "iDisp2 Tx"},
225 { "iDisp2 Tx", NULL, "iDisp2_out"},
226 { "hifi1", NULL, "iDisp1 Tx"},
227 { "iDisp1 Tx", NULL, "iDisp1_out"},
228 };
229
230 static struct snd_soc_codec_conf max98927_codec_conf[] = {
231 {
232 .dev_name = MAXIM_DEV0_NAME,
233 .name_prefix = "Right",
234 },
235 {
236 .dev_name = MAXIM_DEV1_NAME,
237 .name_prefix = "Left",
238 },
239 };
240
241 static int kabylake_rt5663_fe_init(struct snd_soc_pcm_runtime *rtd)
242 {
243 int ret;
244 struct snd_soc_dapm_context *dapm;
245 struct snd_soc_component *component = rtd->cpu_dai->component;
246
247 dapm = snd_soc_component_get_dapm(component);
248 ret = snd_soc_dapm_ignore_suspend(dapm, "Reference Capture");
249 if (ret) {
250 dev_err(rtd->dev, "Ref Cap ignore suspend failed %d\n", ret);
251 return ret;
252 }
253
254 return ret;
255 }
256
257 static int kabylake_rt5663_codec_init(struct snd_soc_pcm_runtime *rtd)
258 {
259 int ret;
260 struct kbl_rt5663_private *ctx = snd_soc_card_get_drvdata(rtd->card);
261 struct snd_soc_component *component = rtd->codec_dai->component;
262 struct snd_soc_jack *jack;
263
264
265
266
267
268 ret = snd_soc_card_jack_new(kabylake_audio_card, "Headset Jack",
269 SND_JACK_HEADSET | SND_JACK_BTN_0 | SND_JACK_BTN_1 |
270 SND_JACK_BTN_2 | SND_JACK_BTN_3, &ctx->kabylake_headset,
271 NULL, 0);
272 if (ret) {
273 dev_err(rtd->dev, "Headset Jack creation failed %d\n", ret);
274 return ret;
275 }
276
277 jack = &ctx->kabylake_headset;
278 snd_jack_set_key(jack->jack, SND_JACK_BTN_0, KEY_PLAYPAUSE);
279 snd_jack_set_key(jack->jack, SND_JACK_BTN_1, KEY_VOICECOMMAND);
280 snd_jack_set_key(jack->jack, SND_JACK_BTN_2, KEY_VOLUMEUP);
281 snd_jack_set_key(jack->jack, SND_JACK_BTN_3, KEY_VOLUMEDOWN);
282
283 snd_soc_component_set_jack(component, &ctx->kabylake_headset, NULL);
284
285 return ret;
286 }
287
288 static int kabylake_rt5663_max98927_codec_init(struct snd_soc_pcm_runtime *rtd)
289 {
290 int ret;
291
292 ret = kabylake_rt5663_codec_init(rtd);
293 if (ret)
294 return ret;
295
296 ret = snd_soc_dapm_ignore_suspend(&rtd->card->dapm, "SoC DMIC");
297 if (ret) {
298 dev_err(rtd->dev, "SoC DMIC ignore suspend failed %d\n", ret);
299 return ret;
300 }
301
302 return ret;
303 }
304
305 static int kabylake_hdmi_init(struct snd_soc_pcm_runtime *rtd, int device)
306 {
307 struct kbl_rt5663_private *ctx = snd_soc_card_get_drvdata(rtd->card);
308 struct snd_soc_dai *dai = rtd->codec_dai;
309 struct kbl_hdmi_pcm *pcm;
310
311 pcm = devm_kzalloc(rtd->card->dev, sizeof(*pcm), GFP_KERNEL);
312 if (!pcm)
313 return -ENOMEM;
314
315 pcm->device = device;
316 pcm->codec_dai = dai;
317
318 list_add_tail(&pcm->head, &ctx->hdmi_pcm_list);
319
320 return 0;
321 }
322
323 static int kabylake_hdmi1_init(struct snd_soc_pcm_runtime *rtd)
324 {
325 return kabylake_hdmi_init(rtd, KBL_DPCM_AUDIO_HDMI1_PB);
326 }
327
328 static int kabylake_hdmi2_init(struct snd_soc_pcm_runtime *rtd)
329 {
330 return kabylake_hdmi_init(rtd, KBL_DPCM_AUDIO_HDMI2_PB);
331 }
332
333 static int kabylake_hdmi3_init(struct snd_soc_pcm_runtime *rtd)
334 {
335 return kabylake_hdmi_init(rtd, KBL_DPCM_AUDIO_HDMI3_PB);
336 }
337
338 static int kabylake_5663_hdmi1_init(struct snd_soc_pcm_runtime *rtd)
339 {
340 return kabylake_hdmi_init(rtd, KBL_DPCM_AUDIO_5663_HDMI1_PB);
341 }
342
343 static int kabylake_5663_hdmi2_init(struct snd_soc_pcm_runtime *rtd)
344 {
345 return kabylake_hdmi_init(rtd, KBL_DPCM_AUDIO_5663_HDMI2_PB);
346 }
347
348 static unsigned int rates[] = {
349 48000,
350 };
351
352 static const struct snd_pcm_hw_constraint_list constraints_rates = {
353 .count = ARRAY_SIZE(rates),
354 .list = rates,
355 .mask = 0,
356 };
357
358 static unsigned int channels[] = {
359 2,
360 };
361
362 static const struct snd_pcm_hw_constraint_list constraints_channels = {
363 .count = ARRAY_SIZE(channels),
364 .list = channels,
365 .mask = 0,
366 };
367
368 static int kbl_fe_startup(struct snd_pcm_substream *substream)
369 {
370 struct snd_pcm_runtime *runtime = substream->runtime;
371
372
373
374
375
376
377
378
379 runtime->hw.channels_max = 2;
380 snd_pcm_hw_constraint_list(runtime, 0, SNDRV_PCM_HW_PARAM_CHANNELS,
381 &constraints_channels);
382
383 runtime->hw.formats = SNDRV_PCM_FMTBIT_S16_LE;
384 snd_pcm_hw_constraint_msbits(runtime, 0, 16, 16);
385
386 snd_pcm_hw_constraint_list(runtime, 0,
387 SNDRV_PCM_HW_PARAM_RATE, &constraints_rates);
388
389 return 0;
390 }
391
392 static const struct snd_soc_ops kabylake_rt5663_fe_ops = {
393 .startup = kbl_fe_startup,
394 };
395
396 static int kabylake_ssp_fixup(struct snd_soc_pcm_runtime *rtd,
397 struct snd_pcm_hw_params *params)
398 {
399 struct snd_interval *rate = hw_param_interval(params,
400 SNDRV_PCM_HW_PARAM_RATE);
401 struct snd_interval *channels = hw_param_interval(params,
402 SNDRV_PCM_HW_PARAM_CHANNELS);
403 struct snd_mask *fmt = hw_param_mask(params, SNDRV_PCM_HW_PARAM_FORMAT);
404 struct snd_soc_dpcm *dpcm = container_of(
405 params, struct snd_soc_dpcm, hw_params);
406 struct snd_soc_dai_link *fe_dai_link = dpcm->fe->dai_link;
407 struct snd_soc_dai_link *be_dai_link = dpcm->be->dai_link;
408
409
410
411
412 if (!strcmp(fe_dai_link->name, "Kbl Audio Port") ||
413 !strcmp(fe_dai_link->name, "Kbl Audio Headset Playback") ||
414 !strcmp(fe_dai_link->name, "Kbl Audio Capture Port")) {
415 rate->min = rate->max = 48000;
416 channels->min = channels->max = 2;
417 snd_mask_none(fmt);
418 snd_mask_set_format(fmt, SNDRV_PCM_FORMAT_S24_LE);
419 }
420
421
422
423
424 if (!strcmp(be_dai_link->name, "SSP0-Codec"))
425 snd_mask_set_format(fmt, SNDRV_PCM_FORMAT_S16_LE);
426
427 return 0;
428 }
429
430 static int kabylake_rt5663_hw_params(struct snd_pcm_substream *substream,
431 struct snd_pcm_hw_params *params)
432 {
433 struct snd_soc_pcm_runtime *rtd = substream->private_data;
434 struct snd_soc_dai *codec_dai = rtd->codec_dai;
435 int ret;
436
437
438 rt5663_sel_asrc_clk_src(codec_dai->component,
439 RT5663_DA_STEREO_FILTER | RT5663_AD_STEREO_FILTER,
440 RT5663_CLK_SEL_I2S1_ASRC);
441
442 ret = snd_soc_dai_set_sysclk(codec_dai,
443 RT5663_SCLK_S_MCLK, 24576000, SND_SOC_CLOCK_IN);
444 if (ret < 0)
445 dev_err(rtd->dev, "snd_soc_dai_set_sysclk err = %d\n", ret);
446
447 return ret;
448 }
449
450 static struct snd_soc_ops kabylake_rt5663_ops = {
451 .hw_params = kabylake_rt5663_hw_params,
452 };
453
454 static int kabylake_dmic_fixup(struct snd_soc_pcm_runtime *rtd,
455 struct snd_pcm_hw_params *params)
456 {
457 struct snd_interval *channels = hw_param_interval(params,
458 SNDRV_PCM_HW_PARAM_CHANNELS);
459
460 if (params_channels(params) == 2 || DMIC_CH(dmic_constraints) == 2)
461 channels->min = channels->max = 2;
462 else
463 channels->min = channels->max = 4;
464
465 return 0;
466 }
467
468 static int kabylake_ssp0_hw_params(struct snd_pcm_substream *substream,
469 struct snd_pcm_hw_params *params)
470 {
471 struct snd_soc_pcm_runtime *rtd = substream->private_data;
472 struct snd_soc_dai *codec_dai;
473 int ret = 0, j;
474
475 for_each_rtd_codec_dai(rtd, j, codec_dai) {
476 if (!strcmp(codec_dai->component->name, MAXIM_DEV0_NAME)) {
477
478
479
480 ret = snd_soc_dai_set_tdm_slot(codec_dai, 0x30, 3, 8, 16);
481 if (ret < 0) {
482 dev_err(rtd->dev, "set TDM slot err:%d\n", ret);
483 return ret;
484 }
485 }
486 if (!strcmp(codec_dai->component->name, MAXIM_DEV1_NAME)) {
487
488
489
490 ret = snd_soc_dai_set_tdm_slot(codec_dai, 0xC0, 3, 8, 16);
491 if (ret < 0) {
492 dev_err(rtd->dev, "set TDM slot err:%d\n", ret);
493 return ret;
494 }
495 }
496 }
497 return ret;
498 }
499
500 static struct snd_soc_ops kabylake_ssp0_ops = {
501 .hw_params = kabylake_ssp0_hw_params,
502 };
503
504 static unsigned int channels_dmic[] = {
505 2, 4,
506 };
507
508 static struct snd_pcm_hw_constraint_list constraints_dmic_channels = {
509 .count = ARRAY_SIZE(channels_dmic),
510 .list = channels_dmic,
511 .mask = 0,
512 };
513
514 static const unsigned int dmic_2ch[] = {
515 2,
516 };
517
518 static const struct snd_pcm_hw_constraint_list constraints_dmic_2ch = {
519 .count = ARRAY_SIZE(dmic_2ch),
520 .list = dmic_2ch,
521 .mask = 0,
522 };
523
524 static int kabylake_dmic_startup(struct snd_pcm_substream *substream)
525 {
526 struct snd_pcm_runtime *runtime = substream->runtime;
527
528 runtime->hw.channels_max = DMIC_CH(dmic_constraints);
529 snd_pcm_hw_constraint_list(runtime, 0, SNDRV_PCM_HW_PARAM_CHANNELS,
530 dmic_constraints);
531
532 return snd_pcm_hw_constraint_list(substream->runtime, 0,
533 SNDRV_PCM_HW_PARAM_RATE, &constraints_rates);
534 }
535
536 static struct snd_soc_ops kabylake_dmic_ops = {
537 .startup = kabylake_dmic_startup,
538 };
539
540 static unsigned int rates_16000[] = {
541 16000,
542 };
543
544 static const struct snd_pcm_hw_constraint_list constraints_16000 = {
545 .count = ARRAY_SIZE(rates_16000),
546 .list = rates_16000,
547 };
548
549 static const unsigned int ch_mono[] = {
550 1,
551 };
552
553 static const struct snd_pcm_hw_constraint_list constraints_refcap = {
554 .count = ARRAY_SIZE(ch_mono),
555 .list = ch_mono,
556 };
557
558 static int kabylake_refcap_startup(struct snd_pcm_substream *substream)
559 {
560 substream->runtime->hw.channels_max = 1;
561 snd_pcm_hw_constraint_list(substream->runtime, 0,
562 SNDRV_PCM_HW_PARAM_CHANNELS,
563 &constraints_refcap);
564
565 return snd_pcm_hw_constraint_list(substream->runtime, 0,
566 SNDRV_PCM_HW_PARAM_RATE,
567 &constraints_16000);
568 }
569
570 static struct snd_soc_ops skylake_refcap_ops = {
571 .startup = kabylake_refcap_startup,
572 };
573
574 SND_SOC_DAILINK_DEF(dummy,
575 DAILINK_COMP_ARRAY(COMP_DUMMY()));
576
577 SND_SOC_DAILINK_DEF(system,
578 DAILINK_COMP_ARRAY(COMP_CPU("System Pin")));
579
580 SND_SOC_DAILINK_DEF(system2,
581 DAILINK_COMP_ARRAY(COMP_CPU("System Pin2")));
582
583 SND_SOC_DAILINK_DEF(echoref,
584 DAILINK_COMP_ARRAY(COMP_CPU("Echoref Pin")));
585
586 SND_SOC_DAILINK_DEF(reference,
587 DAILINK_COMP_ARRAY(COMP_CPU("Reference Pin")));
588
589 SND_SOC_DAILINK_DEF(dmic,
590 DAILINK_COMP_ARRAY(COMP_CPU("DMIC Pin")));
591
592 SND_SOC_DAILINK_DEF(hdmi1,
593 DAILINK_COMP_ARRAY(COMP_CPU("HDMI1 Pin")));
594
595 SND_SOC_DAILINK_DEF(hdmi2,
596 DAILINK_COMP_ARRAY(COMP_CPU("HDMI2 Pin")));
597
598 SND_SOC_DAILINK_DEF(hdmi3,
599 DAILINK_COMP_ARRAY(COMP_CPU("HDMI3 Pin")));
600
601 SND_SOC_DAILINK_DEF(ssp0_pin,
602 DAILINK_COMP_ARRAY(COMP_CPU("SSP0 Pin")));
603 SND_SOC_DAILINK_DEF(ssp0_codec,
604 DAILINK_COMP_ARRAY(
605 COMP_CODEC(MAXIM_DEV0_NAME, KBL_MAXIM_CODEC_DAI),
606 COMP_CODEC(MAXIM_DEV1_NAME, KBL_MAXIM_CODEC_DAI)));
607
608 SND_SOC_DAILINK_DEF(ssp1_pin,
609 DAILINK_COMP_ARRAY(COMP_CPU("SSP1 Pin")));
610 SND_SOC_DAILINK_DEF(ssp1_codec,
611 DAILINK_COMP_ARRAY(COMP_CODEC("i2c-10EC5663:00",
612 KBL_REALTEK_CODEC_DAI)));
613
614 SND_SOC_DAILINK_DEF(dmic01_pin,
615 DAILINK_COMP_ARRAY(COMP_CPU("DMIC01 Pin")));
616 SND_SOC_DAILINK_DEF(dmic_codec,
617 DAILINK_COMP_ARRAY(COMP_CODEC("dmic-codec", "dmic-hifi")));
618
619 SND_SOC_DAILINK_DEF(idisp1_pin,
620 DAILINK_COMP_ARRAY(COMP_CPU("iDisp1 Pin")));
621 SND_SOC_DAILINK_DEF(idisp1_codec,
622 DAILINK_COMP_ARRAY(COMP_CODEC("ehdaudio0D2", "intel-hdmi-hifi1")));
623
624 SND_SOC_DAILINK_DEF(idisp2_pin,
625 DAILINK_COMP_ARRAY(COMP_CPU("iDisp2 Pin")));
626 SND_SOC_DAILINK_DEF(idisp2_codec,
627 DAILINK_COMP_ARRAY(COMP_CODEC("ehdaudio0D2", "intel-hdmi-hifi2")));
628
629 SND_SOC_DAILINK_DEF(idisp3_pin,
630 DAILINK_COMP_ARRAY(COMP_CPU("iDisp3 Pin")));
631 SND_SOC_DAILINK_DEF(idisp3_codec,
632 DAILINK_COMP_ARRAY(COMP_CODEC("ehdaudio0D2", "intel-hdmi-hifi3")));
633
634 SND_SOC_DAILINK_DEF(platform,
635 DAILINK_COMP_ARRAY(COMP_PLATFORM("0000:00:1f.3")));
636
637
638 static struct snd_soc_dai_link kabylake_dais[] = {
639
640 [KBL_DPCM_AUDIO_PB] = {
641 .name = "Kbl Audio Port",
642 .stream_name = "Audio",
643 .dynamic = 1,
644 .nonatomic = 1,
645 .init = kabylake_rt5663_fe_init,
646 .trigger = {
647 SND_SOC_DPCM_TRIGGER_POST, SND_SOC_DPCM_TRIGGER_POST},
648 .dpcm_playback = 1,
649 .ops = &kabylake_rt5663_fe_ops,
650 SND_SOC_DAILINK_REG(system, dummy, platform),
651 },
652 [KBL_DPCM_AUDIO_CP] = {
653 .name = "Kbl Audio Capture Port",
654 .stream_name = "Audio Record",
655 .dynamic = 1,
656 .nonatomic = 1,
657 .trigger = {
658 SND_SOC_DPCM_TRIGGER_POST, SND_SOC_DPCM_TRIGGER_POST},
659 .dpcm_capture = 1,
660 .ops = &kabylake_rt5663_fe_ops,
661 SND_SOC_DAILINK_REG(system, dummy, platform),
662 },
663 [KBL_DPCM_AUDIO_HS_PB] = {
664 .name = "Kbl Audio Headset Playback",
665 .stream_name = "Headset Audio",
666 .dpcm_playback = 1,
667 .nonatomic = 1,
668 .dynamic = 1,
669 SND_SOC_DAILINK_REG(system2, dummy, platform),
670 },
671 [KBL_DPCM_AUDIO_ECHO_REF_CP] = {
672 .name = "Kbl Audio Echo Reference cap",
673 .stream_name = "Echoreference Capture",
674 .init = NULL,
675 .capture_only = 1,
676 .nonatomic = 1,
677 SND_SOC_DAILINK_REG(echoref, dummy, platform),
678 },
679 [KBL_DPCM_AUDIO_REF_CP] = {
680 .name = "Kbl Audio Reference cap",
681 .stream_name = "Wake on Voice",
682 .init = NULL,
683 .dpcm_capture = 1,
684 .nonatomic = 1,
685 .dynamic = 1,
686 .ops = &skylake_refcap_ops,
687 SND_SOC_DAILINK_REG(reference, dummy, platform),
688 },
689 [KBL_DPCM_AUDIO_DMIC_CP] = {
690 .name = "Kbl Audio DMIC cap",
691 .stream_name = "dmiccap",
692 .init = NULL,
693 .dpcm_capture = 1,
694 .nonatomic = 1,
695 .dynamic = 1,
696 .ops = &kabylake_dmic_ops,
697 SND_SOC_DAILINK_REG(dmic, dummy, platform),
698 },
699 [KBL_DPCM_AUDIO_HDMI1_PB] = {
700 .name = "Kbl HDMI Port1",
701 .stream_name = "Hdmi1",
702 .dpcm_playback = 1,
703 .init = NULL,
704 .trigger = {
705 SND_SOC_DPCM_TRIGGER_POST, SND_SOC_DPCM_TRIGGER_POST},
706 .nonatomic = 1,
707 .dynamic = 1,
708 SND_SOC_DAILINK_REG(hdmi1, dummy, platform),
709 },
710 [KBL_DPCM_AUDIO_HDMI2_PB] = {
711 .name = "Kbl HDMI Port2",
712 .stream_name = "Hdmi2",
713 .dpcm_playback = 1,
714 .init = NULL,
715 .trigger = {
716 SND_SOC_DPCM_TRIGGER_POST, SND_SOC_DPCM_TRIGGER_POST},
717 .nonatomic = 1,
718 .dynamic = 1,
719 SND_SOC_DAILINK_REG(hdmi2, dummy, platform),
720 },
721 [KBL_DPCM_AUDIO_HDMI3_PB] = {
722 .name = "Kbl HDMI Port3",
723 .stream_name = "Hdmi3",
724 .trigger = {
725 SND_SOC_DPCM_TRIGGER_POST, SND_SOC_DPCM_TRIGGER_POST},
726 .dpcm_playback = 1,
727 .init = NULL,
728 .nonatomic = 1,
729 .dynamic = 1,
730 SND_SOC_DAILINK_REG(hdmi3, dummy, platform),
731 },
732
733
734 {
735
736 .name = "SSP0-Codec",
737 .id = 0,
738 .no_pcm = 1,
739 .dai_fmt = SND_SOC_DAIFMT_DSP_B |
740 SND_SOC_DAIFMT_NB_NF |
741 SND_SOC_DAIFMT_CBS_CFS,
742 .ignore_pmdown_time = 1,
743 .be_hw_params_fixup = kabylake_ssp_fixup,
744 .dpcm_playback = 1,
745 .ops = &kabylake_ssp0_ops,
746 SND_SOC_DAILINK_REG(ssp0_pin, ssp0_codec, platform),
747 },
748 {
749
750 .name = "SSP1-Codec",
751 .id = 1,
752 .no_pcm = 1,
753 .init = kabylake_rt5663_max98927_codec_init,
754 .dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF |
755 SND_SOC_DAIFMT_CBS_CFS,
756 .ignore_pmdown_time = 1,
757 .be_hw_params_fixup = kabylake_ssp_fixup,
758 .ops = &kabylake_rt5663_ops,
759 .dpcm_playback = 1,
760 .dpcm_capture = 1,
761 SND_SOC_DAILINK_REG(ssp1_pin, ssp1_codec, platform),
762 },
763 {
764 .name = "dmic01",
765 .id = 2,
766 .be_hw_params_fixup = kabylake_dmic_fixup,
767 .ignore_suspend = 1,
768 .dpcm_capture = 1,
769 .no_pcm = 1,
770 SND_SOC_DAILINK_REG(dmic01_pin, dmic_codec, platform),
771 },
772 {
773 .name = "iDisp1",
774 .id = 3,
775 .dpcm_playback = 1,
776 .init = kabylake_hdmi1_init,
777 .no_pcm = 1,
778 SND_SOC_DAILINK_REG(idisp1_pin, idisp1_codec, platform),
779 },
780 {
781 .name = "iDisp2",
782 .id = 4,
783 .init = kabylake_hdmi2_init,
784 .dpcm_playback = 1,
785 .no_pcm = 1,
786 SND_SOC_DAILINK_REG(idisp2_pin, idisp2_codec, platform),
787 },
788 {
789 .name = "iDisp3",
790 .id = 5,
791 .init = kabylake_hdmi3_init,
792 .dpcm_playback = 1,
793 .no_pcm = 1,
794 SND_SOC_DAILINK_REG(idisp3_pin, idisp3_codec, platform),
795 },
796 };
797
798 static struct snd_soc_dai_link kabylake_5663_dais[] = {
799
800 [KBL_DPCM_AUDIO_5663_PB] = {
801 .name = "Kbl Audio Port",
802 .stream_name = "Audio",
803 .dynamic = 1,
804 .nonatomic = 1,
805 .trigger = {
806 SND_SOC_DPCM_TRIGGER_POST, SND_SOC_DPCM_TRIGGER_POST},
807 .dpcm_playback = 1,
808 .ops = &kabylake_rt5663_fe_ops,
809 SND_SOC_DAILINK_REG(system, dummy, platform),
810 },
811 [KBL_DPCM_AUDIO_5663_CP] = {
812 .name = "Kbl Audio Capture Port",
813 .stream_name = "Audio Record",
814 .dynamic = 1,
815 .nonatomic = 1,
816 .trigger = {
817 SND_SOC_DPCM_TRIGGER_POST, SND_SOC_DPCM_TRIGGER_POST},
818 .dpcm_capture = 1,
819 .ops = &kabylake_rt5663_fe_ops,
820 SND_SOC_DAILINK_REG(system, dummy, platform),
821 },
822 [KBL_DPCM_AUDIO_5663_HDMI1_PB] = {
823 .name = "Kbl HDMI Port1",
824 .stream_name = "Hdmi1",
825 .dpcm_playback = 1,
826 .init = NULL,
827 .trigger = {
828 SND_SOC_DPCM_TRIGGER_POST, SND_SOC_DPCM_TRIGGER_POST},
829 .nonatomic = 1,
830 .dynamic = 1,
831 SND_SOC_DAILINK_REG(hdmi1, dummy, platform),
832 },
833 [KBL_DPCM_AUDIO_5663_HDMI2_PB] = {
834 .name = "Kbl HDMI Port2",
835 .stream_name = "Hdmi2",
836 .dpcm_playback = 1,
837 .init = NULL,
838 .trigger = {
839 SND_SOC_DPCM_TRIGGER_POST, SND_SOC_DPCM_TRIGGER_POST},
840 .nonatomic = 1,
841 .dynamic = 1,
842 SND_SOC_DAILINK_REG(hdmi2, dummy, platform),
843 },
844
845
846 {
847
848 .name = "SSP1-Codec",
849 .id = 0,
850 .no_pcm = 1,
851 .init = kabylake_rt5663_codec_init,
852 .dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF |
853 SND_SOC_DAIFMT_CBS_CFS,
854 .ignore_pmdown_time = 1,
855 .be_hw_params_fixup = kabylake_ssp_fixup,
856 .ops = &kabylake_rt5663_ops,
857 .dpcm_playback = 1,
858 .dpcm_capture = 1,
859 SND_SOC_DAILINK_REG(ssp1_pin, ssp1_codec, platform),
860 },
861 {
862 .name = "iDisp1",
863 .id = 1,
864 .dpcm_playback = 1,
865 .init = kabylake_5663_hdmi1_init,
866 .no_pcm = 1,
867 SND_SOC_DAILINK_REG(idisp1_pin, idisp1_codec, platform),
868 },
869 {
870 .name = "iDisp2",
871 .id = 2,
872 .init = kabylake_5663_hdmi2_init,
873 .dpcm_playback = 1,
874 .no_pcm = 1,
875 SND_SOC_DAILINK_REG(idisp2_pin, idisp2_codec, platform),
876 },
877 };
878
879 #define NAME_SIZE 32
880 static int kabylake_card_late_probe(struct snd_soc_card *card)
881 {
882 struct kbl_rt5663_private *ctx = snd_soc_card_get_drvdata(card);
883 struct kbl_hdmi_pcm *pcm;
884 struct snd_soc_component *component = NULL;
885 int err, i = 0;
886 char jack_name[NAME_SIZE];
887
888 list_for_each_entry(pcm, &ctx->hdmi_pcm_list, head) {
889 component = pcm->codec_dai->component;
890 snprintf(jack_name, sizeof(jack_name),
891 "HDMI/DP, pcm=%d Jack", pcm->device);
892 err = snd_soc_card_jack_new(card, jack_name,
893 SND_JACK_AVOUT, &skylake_hdmi[i],
894 NULL, 0);
895
896 if (err)
897 return err;
898
899 err = hdac_hdmi_jack_init(pcm->codec_dai, pcm->device,
900 &skylake_hdmi[i]);
901 if (err < 0)
902 return err;
903
904 i++;
905 }
906
907 if (!component)
908 return -EINVAL;
909
910 return hdac_hdmi_jack_port_init(component, &card->dapm);
911 }
912
913
914 static struct snd_soc_card kabylake_audio_card_rt5663_m98927 = {
915 .name = "kblrt5663max",
916 .owner = THIS_MODULE,
917 .dai_link = kabylake_dais,
918 .num_links = ARRAY_SIZE(kabylake_dais),
919 .controls = kabylake_controls,
920 .num_controls = ARRAY_SIZE(kabylake_controls),
921 .dapm_widgets = kabylake_widgets,
922 .num_dapm_widgets = ARRAY_SIZE(kabylake_widgets),
923 .dapm_routes = kabylake_map,
924 .num_dapm_routes = ARRAY_SIZE(kabylake_map),
925 .codec_conf = max98927_codec_conf,
926 .num_configs = ARRAY_SIZE(max98927_codec_conf),
927 .fully_routed = true,
928 .late_probe = kabylake_card_late_probe,
929 };
930
931
932 static struct snd_soc_card kabylake_audio_card_rt5663 = {
933 .name = "kblrt5663",
934 .owner = THIS_MODULE,
935 .dai_link = kabylake_5663_dais,
936 .num_links = ARRAY_SIZE(kabylake_5663_dais),
937 .controls = kabylake_5663_controls,
938 .num_controls = ARRAY_SIZE(kabylake_5663_controls),
939 .dapm_widgets = kabylake_5663_widgets,
940 .num_dapm_widgets = ARRAY_SIZE(kabylake_5663_widgets),
941 .dapm_routes = kabylake_5663_map,
942 .num_dapm_routes = ARRAY_SIZE(kabylake_5663_map),
943 .fully_routed = true,
944 .late_probe = kabylake_card_late_probe,
945 };
946
947 static int kabylake_audio_probe(struct platform_device *pdev)
948 {
949 struct kbl_rt5663_private *ctx;
950 struct snd_soc_acpi_mach *mach;
951 int ret;
952
953 ctx = devm_kzalloc(&pdev->dev, sizeof(*ctx), GFP_KERNEL);
954 if (!ctx)
955 return -ENOMEM;
956
957 INIT_LIST_HEAD(&ctx->hdmi_pcm_list);
958
959 kabylake_audio_card =
960 (struct snd_soc_card *)pdev->id_entry->driver_data;
961
962 kabylake_audio_card->dev = &pdev->dev;
963 snd_soc_card_set_drvdata(kabylake_audio_card, ctx);
964
965 mach = (&pdev->dev)->platform_data;
966 if (mach)
967 dmic_constraints = mach->mach_params.dmic_num == 2 ?
968 &constraints_dmic_2ch : &constraints_dmic_channels;
969
970 ctx->mclk = devm_clk_get(&pdev->dev, "ssp1_mclk");
971 if (IS_ERR(ctx->mclk)) {
972 ret = PTR_ERR(ctx->mclk);
973 if (ret == -ENOENT) {
974 dev_info(&pdev->dev,
975 "Failed to get ssp1_sclk, defer probe\n");
976 return -EPROBE_DEFER;
977 }
978
979 dev_err(&pdev->dev, "Failed to get ssp1_mclk with err:%d\n",
980 ret);
981 return ret;
982 }
983
984 ctx->sclk = devm_clk_get(&pdev->dev, "ssp1_sclk");
985 if (IS_ERR(ctx->sclk)) {
986 ret = PTR_ERR(ctx->sclk);
987 if (ret == -ENOENT) {
988 dev_info(&pdev->dev,
989 "Failed to get ssp1_sclk, defer probe\n");
990 return -EPROBE_DEFER;
991 }
992
993 dev_err(&pdev->dev, "Failed to get ssp1_sclk with err:%d\n",
994 ret);
995 return ret;
996 }
997
998 return devm_snd_soc_register_card(&pdev->dev, kabylake_audio_card);
999 }
1000
1001 static const struct platform_device_id kbl_board_ids[] = {
1002 {
1003 .name = "kbl_rt5663",
1004 .driver_data = (kernel_ulong_t)&kabylake_audio_card_rt5663,
1005 },
1006 {
1007 .name = "kbl_rt5663_m98927",
1008 .driver_data =
1009 (kernel_ulong_t)&kabylake_audio_card_rt5663_m98927,
1010 },
1011 { }
1012 };
1013
1014 static struct platform_driver kabylake_audio = {
1015 .probe = kabylake_audio_probe,
1016 .driver = {
1017 .name = "kbl_rt5663_m98927",
1018 .pm = &snd_soc_pm_ops,
1019 },
1020 .id_table = kbl_board_ids,
1021 };
1022
1023 module_platform_driver(kabylake_audio)
1024
1025
1026 MODULE_DESCRIPTION("Audio Machine driver-RT5663 & MAX98927 in I2S mode");
1027 MODULE_AUTHOR("Naveen M <naveen.m@intel.com>");
1028 MODULE_AUTHOR("Harsha Priya <harshapriya.n@intel.com>");
1029 MODULE_LICENSE("GPL v2");
1030 MODULE_ALIAS("platform:kbl_rt5663");
1031 MODULE_ALIAS("platform:kbl_rt5663_m98927");