1 // SPDX-License-Identifier: GPL-2.0-only
2 // Copyright(c) 2019 Intel Corporation.
5 * Intel Cometlake I2S Machine driver for RT1011 + RT5682 codec
8 #include <linux/input.h>
9 #include <linux/module.h>
10 #include <linux/platform_device.h>
11 #include <linux/clk.h>
12 #include <linux/dmi.h>
13 #include <linux/slab.h>
14 #include <linux/acpi.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/rt5682.h>
21 #include <sound/soc-acpi.h>
22 #include "../../codecs/rt1011.h"
23 #include "../../codecs/rt5682.h"
24 #include "../../codecs/hdac_hdmi.h"
25 #include "hda_dsp_common.h"
27 /* The platform clock outputs 24Mhz clock to codec as I2S MCLK */
28 #define CML_PLAT_CLK 24000000
29 #define CML_RT1011_CODEC_DAI "rt1011-aif"
30 #define CML_RT5682_CODEC_DAI "rt5682-aif1"
33 #define SOF_RT1011_SPEAKER_WL BIT(0)
34 #define SOF_RT1011_SPEAKER_WR BIT(1)
35 #define SOF_RT1011_SPEAKER_TL BIT(2)
36 #define SOF_RT1011_SPEAKER_TR BIT(3)
38 /* Default: Woofer speakers */
39 static unsigned long sof_rt1011_quirk
= SOF_RT1011_SPEAKER_WL
|
40 SOF_RT1011_SPEAKER_WR
;
42 static int sof_rt1011_quirk_cb(const struct dmi_system_id
*id
)
44 sof_rt1011_quirk
= (unsigned long)id
->driver_data
;
48 static const struct dmi_system_id sof_rt1011_quirk_table
[] = {
50 .callback
= sof_rt1011_quirk_cb
,
52 DMI_MATCH(DMI_SYS_VENDOR
, "Google"),
53 DMI_MATCH(DMI_PRODUCT_NAME
, "Helios"),
55 .driver_data
= (void *)(SOF_RT1011_SPEAKER_WL
| SOF_RT1011_SPEAKER_WR
|
56 SOF_RT1011_SPEAKER_TL
| SOF_RT1011_SPEAKER_TR
),
62 static struct snd_soc_jack hdmi_jack
[3];
65 struct list_head head
;
66 struct snd_soc_dai
*codec_dai
;
71 char codec_name
[SND_ACPI_I2C_ID_LEN
];
72 struct snd_soc_jack headset
;
73 struct list_head hdmi_pcm_list
;
74 bool common_hdmi_codec_drv
;
77 static const struct snd_kcontrol_new cml_controls
[] = {
78 SOC_DAPM_PIN_SWITCH("Headphone Jack"),
79 SOC_DAPM_PIN_SWITCH("Headset Mic"),
80 SOC_DAPM_PIN_SWITCH("WL Ext Spk"),
81 SOC_DAPM_PIN_SWITCH("WR Ext Spk"),
84 static const struct snd_kcontrol_new cml_rt1011_tt_controls
[] = {
85 SOC_DAPM_PIN_SWITCH("TL Ext Spk"),
86 SOC_DAPM_PIN_SWITCH("TR Ext Spk"),
89 static const struct snd_soc_dapm_widget cml_rt1011_rt5682_widgets
[] = {
90 SND_SOC_DAPM_SPK("WL Ext Spk", NULL
),
91 SND_SOC_DAPM_SPK("WR Ext Spk", NULL
),
92 SND_SOC_DAPM_HP("Headphone Jack", NULL
),
93 SND_SOC_DAPM_MIC("Headset Mic", NULL
),
94 SND_SOC_DAPM_MIC("SoC DMIC", NULL
),
97 static const struct snd_soc_dapm_widget cml_rt1011_tt_widgets
[] = {
98 SND_SOC_DAPM_SPK("TL Ext Spk", NULL
),
99 SND_SOC_DAPM_SPK("TR Ext Spk", NULL
),
102 static const struct snd_soc_dapm_route cml_rt1011_rt5682_map
[] = {
104 {"WL Ext Spk", NULL
, "WL SPO"},
105 {"WR Ext Spk", NULL
, "WR SPO"},
107 /* HP jack connectors - unknown if we have jack detection */
108 { "Headphone Jack", NULL
, "HPOL" },
109 { "Headphone Jack", NULL
, "HPOR" },
112 { "IN1P", NULL
, "Headset Mic" },
115 {"DMic", NULL
, "SoC DMIC"},
118 static const struct snd_soc_dapm_route cml_rt1011_tt_map
[] = {
120 {"TL Ext Spk", NULL
, "TL SPO" },
121 {"TR Ext Spk", NULL
, "TR SPO" },
124 static int cml_rt5682_codec_init(struct snd_soc_pcm_runtime
*rtd
)
126 struct card_private
*ctx
= snd_soc_card_get_drvdata(rtd
->card
);
127 struct snd_soc_component
*component
= asoc_rtd_to_codec(rtd
, 0)->component
;
128 struct snd_soc_jack
*jack
;
131 /* need to enable ASRC function for 24MHz mclk rate */
132 rt5682_sel_asrc_clk_src(component
, RT5682_DA_STEREO1_FILTER
|
133 RT5682_AD_STEREO1_FILTER
,
134 RT5682_CLK_SEL_I2S1_ASRC
);
137 * Headset buttons map to the google Reference headset.
138 * These can be configured by userspace.
140 ret
= snd_soc_card_jack_new(rtd
->card
, "Headset Jack",
141 SND_JACK_HEADSET
| SND_JACK_BTN_0
|
142 SND_JACK_BTN_1
| SND_JACK_BTN_2
|
144 &ctx
->headset
, NULL
, 0);
146 dev_err(rtd
->dev
, "Headset Jack creation failed: %d\n", ret
);
150 jack
= &ctx
->headset
;
152 snd_jack_set_key(jack
->jack
, SND_JACK_BTN_0
, KEY_PLAYPAUSE
);
153 snd_jack_set_key(jack
->jack
, SND_JACK_BTN_1
, KEY_VOICECOMMAND
);
154 snd_jack_set_key(jack
->jack
, SND_JACK_BTN_2
, KEY_VOLUMEUP
);
155 snd_jack_set_key(jack
->jack
, SND_JACK_BTN_3
, KEY_VOLUMEDOWN
);
156 ret
= snd_soc_component_set_jack(component
, jack
, NULL
);
158 dev_err(rtd
->dev
, "Headset Jack call-back failed: %d\n", ret
);
163 static void cml_rt5682_codec_exit(struct snd_soc_pcm_runtime
*rtd
)
165 struct snd_soc_component
*component
= asoc_rtd_to_codec(rtd
, 0)->component
;
167 snd_soc_component_set_jack(component
, NULL
, NULL
);
170 static int cml_rt1011_spk_init(struct snd_soc_pcm_runtime
*rtd
)
173 struct snd_soc_card
*card
= rtd
->card
;
175 if (sof_rt1011_quirk
& (SOF_RT1011_SPEAKER_TL
|
176 SOF_RT1011_SPEAKER_TR
)) {
178 ret
= snd_soc_add_card_controls(card
, cml_rt1011_tt_controls
,
179 ARRAY_SIZE(cml_rt1011_tt_controls
));
183 ret
= snd_soc_dapm_new_controls(&card
->dapm
,
184 cml_rt1011_tt_widgets
,
185 ARRAY_SIZE(cml_rt1011_tt_widgets
));
189 ret
= snd_soc_dapm_add_routes(&card
->dapm
, cml_rt1011_tt_map
,
190 ARRAY_SIZE(cml_rt1011_tt_map
));
199 static int cml_rt5682_hw_params(struct snd_pcm_substream
*substream
,
200 struct snd_pcm_hw_params
*params
)
202 struct snd_soc_pcm_runtime
*rtd
= asoc_substream_to_rtd(substream
);
203 struct snd_soc_dai
*codec_dai
= asoc_rtd_to_codec(rtd
, 0);
204 int clk_id
, clk_freq
, pll_out
, ret
;
206 clk_id
= RT5682_PLL1_S_MCLK
;
207 clk_freq
= CML_PLAT_CLK
;
209 pll_out
= params_rate(params
) * 512;
211 ret
= snd_soc_dai_set_pll(codec_dai
, 0, clk_id
, clk_freq
, pll_out
);
213 dev_warn(rtd
->dev
, "snd_soc_dai_set_pll err = %d\n", ret
);
215 /* Configure sysclk for codec */
216 ret
= snd_soc_dai_set_sysclk(codec_dai
, RT5682_SCLK_S_PLL1
,
217 pll_out
, SND_SOC_CLOCK_IN
);
219 dev_warn(rtd
->dev
, "snd_soc_dai_set_sysclk err = %d\n", ret
);
222 * slot_width should be equal or large than data length, set them
225 ret
= snd_soc_dai_set_tdm_slot(codec_dai
, 0x0, 0x0, 2,
226 params_width(params
));
228 dev_warn(rtd
->dev
, "set TDM slot err:%d\n", ret
);
232 static int cml_rt1011_hw_params(struct snd_pcm_substream
*substream
,
233 struct snd_pcm_hw_params
*params
)
235 struct snd_soc_pcm_runtime
*rtd
= asoc_substream_to_rtd(substream
);
236 struct snd_soc_dai
*codec_dai
;
237 struct snd_soc_card
*card
= rtd
->card
;
238 int srate
, i
, ret
= 0;
240 srate
= params_rate(params
);
242 for_each_rtd_codec_dais(rtd
, i
, codec_dai
) {
244 /* 100 Fs to drive 24 bit data */
245 ret
= snd_soc_dai_set_pll(codec_dai
, 0, RT1011_PLL1_S_BCLK
,
246 100 * srate
, 256 * srate
);
248 dev_err(card
->dev
, "codec_dai clock not set\n");
252 ret
= snd_soc_dai_set_sysclk(codec_dai
,
253 RT1011_FS_SYS_PRE_S_PLL1
,
254 256 * srate
, SND_SOC_CLOCK_IN
);
256 dev_err(card
->dev
, "codec_dai clock not set\n");
261 * Codec TDM is configured as 24 bit capture/ playback.
262 * 2 CH PB is done over 4 codecs - 2 Woofers and 2 Tweeters.
263 * The Left woofer and tweeter plays the Left playback data
264 * and similar by the Right.
265 * Hence 2 codecs (1 T and 1 W pair) share same Rx slot.
266 * The feedback is captured for each codec individually.
267 * Hence all 4 codecs use 1 Tx slot each for feedback.
269 if (sof_rt1011_quirk
& (SOF_RT1011_SPEAKER_WL
|
270 SOF_RT1011_SPEAKER_WR
)) {
271 if (!strcmp(codec_dai
->component
->name
, "i2c-10EC1011:00")) {
272 ret
= snd_soc_dai_set_tdm_slot(codec_dai
,
278 if (!strcmp(codec_dai
->component
->name
, "i2c-10EC1011:01")) {
279 ret
= snd_soc_dai_set_tdm_slot(codec_dai
,
286 if (sof_rt1011_quirk
& (SOF_RT1011_SPEAKER_TL
|
287 SOF_RT1011_SPEAKER_TR
)) {
288 if (!strcmp(codec_dai
->component
->name
, "i2c-10EC1011:02")) {
289 ret
= snd_soc_dai_set_tdm_slot(codec_dai
,
295 if (!strcmp(codec_dai
->component
->name
, "i2c-10EC1011:03")) {
296 ret
= snd_soc_dai_set_tdm_slot(codec_dai
,
305 "set codec TDM slot for %s failed with error %d\n",
306 codec_dai
->component
->name
, ret
);
310 static struct snd_soc_ops cml_rt5682_ops
= {
311 .hw_params
= cml_rt5682_hw_params
,
314 static const struct snd_soc_ops cml_rt1011_ops
= {
315 .hw_params
= cml_rt1011_hw_params
,
318 static int sof_card_late_probe(struct snd_soc_card
*card
)
320 struct card_private
*ctx
= snd_soc_card_get_drvdata(card
);
321 struct snd_soc_component
*component
= NULL
;
322 char jack_name
[NAME_SIZE
];
323 struct hdmi_pcm
*pcm
;
326 if (list_empty(&ctx
->hdmi_pcm_list
))
329 if (ctx
->common_hdmi_codec_drv
) {
330 pcm
= list_first_entry(&ctx
->hdmi_pcm_list
, struct hdmi_pcm
,
332 component
= pcm
->codec_dai
->component
;
333 return hda_dsp_hdmi_build_controls(card
, component
);
336 list_for_each_entry(pcm
, &ctx
->hdmi_pcm_list
, head
) {
337 component
= pcm
->codec_dai
->component
;
338 snprintf(jack_name
, sizeof(jack_name
),
339 "HDMI/DP, pcm=%d Jack", pcm
->device
);
340 ret
= snd_soc_card_jack_new(card
, jack_name
,
341 SND_JACK_AVOUT
, &hdmi_jack
[i
],
346 ret
= hdac_hdmi_jack_init(pcm
->codec_dai
, pcm
->device
,
354 return hdac_hdmi_jack_port_init(component
, &card
->dapm
);
357 static int hdmi_init(struct snd_soc_pcm_runtime
*rtd
)
359 struct card_private
*ctx
= snd_soc_card_get_drvdata(rtd
->card
);
360 struct snd_soc_dai
*dai
= asoc_rtd_to_codec(rtd
, 0);
361 struct hdmi_pcm
*pcm
;
363 pcm
= devm_kzalloc(rtd
->card
->dev
, sizeof(*pcm
), GFP_KERNEL
);
367 pcm
->device
= dai
->id
;
368 pcm
->codec_dai
= dai
;
370 list_add_tail(&pcm
->head
, &ctx
->hdmi_pcm_list
);
375 /* Cometlake digital audio interface glue - connects codec <--> CPU */
377 SND_SOC_DAILINK_DEF(ssp0_pin
,
378 DAILINK_COMP_ARRAY(COMP_CPU("SSP0 Pin")));
379 SND_SOC_DAILINK_DEF(ssp0_codec
,
380 DAILINK_COMP_ARRAY(COMP_CODEC("i2c-10EC5682:00",
381 CML_RT5682_CODEC_DAI
)));
383 SND_SOC_DAILINK_DEF(ssp1_pin
,
384 DAILINK_COMP_ARRAY(COMP_CPU("SSP1 Pin")));
385 SND_SOC_DAILINK_DEF(ssp1_codec_2spk
,
387 /* WL */ COMP_CODEC("i2c-10EC1011:00", CML_RT1011_CODEC_DAI
),
388 /* WR */ COMP_CODEC("i2c-10EC1011:01", CML_RT1011_CODEC_DAI
)));
389 SND_SOC_DAILINK_DEF(ssp1_codec_4spk
,
391 /* WL */ COMP_CODEC("i2c-10EC1011:00", CML_RT1011_CODEC_DAI
),
392 /* WR */ COMP_CODEC("i2c-10EC1011:01", CML_RT1011_CODEC_DAI
),
393 /* TL */ COMP_CODEC("i2c-10EC1011:02", CML_RT1011_CODEC_DAI
),
394 /* TR */ COMP_CODEC("i2c-10EC1011:03", CML_RT1011_CODEC_DAI
)));
397 SND_SOC_DAILINK_DEF(dmic_pin
,
398 DAILINK_COMP_ARRAY(COMP_CPU("DMIC01 Pin")));
400 SND_SOC_DAILINK_DEF(dmic16k_pin
,
401 DAILINK_COMP_ARRAY(COMP_CPU("DMIC16k Pin")));
403 SND_SOC_DAILINK_DEF(dmic_codec
,
404 DAILINK_COMP_ARRAY(COMP_CODEC("dmic-codec", "dmic-hifi")));
406 SND_SOC_DAILINK_DEF(idisp1_pin
,
407 DAILINK_COMP_ARRAY(COMP_CPU("iDisp1 Pin")));
408 SND_SOC_DAILINK_DEF(idisp1_codec
,
409 DAILINK_COMP_ARRAY(COMP_CODEC("ehdaudio0D2", "intel-hdmi-hifi1")));
411 SND_SOC_DAILINK_DEF(idisp2_pin
,
412 DAILINK_COMP_ARRAY(COMP_CPU("iDisp2 Pin")));
413 SND_SOC_DAILINK_DEF(idisp2_codec
,
414 DAILINK_COMP_ARRAY(COMP_CODEC("ehdaudio0D2", "intel-hdmi-hifi2")));
416 SND_SOC_DAILINK_DEF(idisp3_pin
,
417 DAILINK_COMP_ARRAY(COMP_CPU("iDisp3 Pin")));
418 SND_SOC_DAILINK_DEF(idisp3_codec
,
419 DAILINK_COMP_ARRAY(COMP_CODEC("ehdaudio0D2", "intel-hdmi-hifi3")));
421 SND_SOC_DAILINK_DEF(platform
,
422 DAILINK_COMP_ARRAY(COMP_PLATFORM("0000:00:1f.3")));
424 static struct snd_soc_dai_link cml_rt1011_rt5682_dailink
[] = {
425 /* Back End DAI links */
428 .name
= "SSP0-Codec",
430 .init
= cml_rt5682_codec_init
,
431 .exit
= cml_rt5682_codec_exit
,
432 .ignore_pmdown_time
= 1,
433 .ops
= &cml_rt5682_ops
,
437 SND_SOC_DAILINK_REG(ssp0_pin
, ssp0_codec
, platform
),
445 SND_SOC_DAILINK_REG(dmic_pin
, dmic_codec
, platform
),
453 SND_SOC_DAILINK_REG(dmic16k_pin
, dmic_codec
, platform
),
461 SND_SOC_DAILINK_REG(idisp1_pin
, idisp1_codec
, platform
),
469 SND_SOC_DAILINK_REG(idisp2_pin
, idisp2_codec
, platform
),
477 SND_SOC_DAILINK_REG(idisp3_pin
, idisp3_codec
, platform
),
481 * SSP1 - Codec : added to end of list ensuring
482 * reuse of common topologies for other end points
483 * and changing only SSP1's codec
485 .name
= "SSP1-Codec",
488 .dpcm_capture
= 1, /* Capture stream provides Feedback */
490 .init
= cml_rt1011_spk_init
,
491 .ops
= &cml_rt1011_ops
,
492 SND_SOC_DAILINK_REG(ssp1_pin
, ssp1_codec_2spk
, platform
),
496 static struct snd_soc_codec_conf rt1011_conf
[] = {
498 .dlc
= COMP_CODEC_CONF("i2c-10EC1011:00"),
502 .dlc
= COMP_CODEC_CONF("i2c-10EC1011:01"),
505 /* single configuration structure for 2 and 4 channels */
507 .dlc
= COMP_CODEC_CONF("i2c-10EC1011:02"),
511 .dlc
= COMP_CODEC_CONF("i2c-10EC1011:03"),
516 /* Cometlake audio machine driver for RT1011 and RT5682 */
517 static struct snd_soc_card snd_soc_card_cml
= {
518 .name
= "cml_rt1011_rt5682",
519 .owner
= THIS_MODULE
,
520 .dai_link
= cml_rt1011_rt5682_dailink
,
521 .num_links
= ARRAY_SIZE(cml_rt1011_rt5682_dailink
),
522 .codec_conf
= rt1011_conf
,
523 .num_configs
= ARRAY_SIZE(rt1011_conf
),
524 .dapm_widgets
= cml_rt1011_rt5682_widgets
,
525 .num_dapm_widgets
= ARRAY_SIZE(cml_rt1011_rt5682_widgets
),
526 .dapm_routes
= cml_rt1011_rt5682_map
,
527 .num_dapm_routes
= ARRAY_SIZE(cml_rt1011_rt5682_map
),
528 .controls
= cml_controls
,
529 .num_controls
= ARRAY_SIZE(cml_controls
),
530 .fully_routed
= true,
531 .late_probe
= sof_card_late_probe
,
534 static int snd_cml_rt1011_probe(struct platform_device
*pdev
)
536 struct snd_soc_dai_link
*dai_link
;
537 struct card_private
*ctx
;
538 struct snd_soc_acpi_mach
*mach
;
539 const char *platform_name
;
542 ctx
= devm_kzalloc(&pdev
->dev
, sizeof(*ctx
), GFP_KERNEL
);
546 INIT_LIST_HEAD(&ctx
->hdmi_pcm_list
);
547 mach
= pdev
->dev
.platform_data
;
548 snd_soc_card_cml
.dev
= &pdev
->dev
;
549 platform_name
= mach
->mach_params
.platform
;
551 dmi_check_system(sof_rt1011_quirk_table
);
553 dev_dbg(&pdev
->dev
, "sof_rt1011_quirk = %lx\n", sof_rt1011_quirk
);
555 /* when 4 speaker is available, update codec config */
556 if (sof_rt1011_quirk
& (SOF_RT1011_SPEAKER_TL
|
557 SOF_RT1011_SPEAKER_TR
)) {
558 for_each_card_prelinks(&snd_soc_card_cml
, i
, dai_link
) {
559 if (!strcmp(dai_link
->codecs
[0].dai_name
,
560 CML_RT1011_CODEC_DAI
)) {
561 dai_link
->codecs
= ssp1_codec_4spk
;
562 dai_link
->num_codecs
= ARRAY_SIZE(ssp1_codec_4spk
);
567 /* set platform name for each dailink */
568 ret
= snd_soc_fixup_dai_links_platform_name(&snd_soc_card_cml
,
573 ctx
->common_hdmi_codec_drv
= mach
->mach_params
.common_hdmi_codec_drv
;
575 snd_soc_card_set_drvdata(&snd_soc_card_cml
, ctx
);
577 return devm_snd_soc_register_card(&pdev
->dev
, &snd_soc_card_cml
);
580 static struct platform_driver snd_cml_rt1011_rt5682_driver
= {
581 .probe
= snd_cml_rt1011_probe
,
583 .name
= "cml_rt1011_rt5682",
584 .pm
= &snd_soc_pm_ops
,
587 module_platform_driver(snd_cml_rt1011_rt5682_driver
);
589 /* Module information */
590 MODULE_DESCRIPTION("Cometlake Audio Machine driver - RT1011 and RT5682 in I2S mode");
591 MODULE_AUTHOR("Naveen Manohar <naveen.m@intel.com>");
592 MODULE_AUTHOR("Sathya Prakash M R <sathya.prakash.m.r@intel.com>");
593 MODULE_AUTHOR("Shuming Fan <shumingf@realtek.com>");
594 MODULE_AUTHOR("Mac Chiang <mac.chiang@intel.com>");
595 MODULE_LICENSE("GPL v2");
596 MODULE_ALIAS("platform:cml_rt1011_rt5682");