1 // SPDX-License-Identifier: GPL-2.0-only 2 // Copyright(c) 2019-2020 Intel Corporation. 3 4 /* 5 * Intel SOF Machine Driver with Realtek rt5682 Codec 6 * and speaker codec MAX98357A or RT1015. 7 */ 8 #include <linux/i2c.h> 9 #include <linux/input.h> 10 #include <linux/module.h> 11 #include <linux/platform_device.h> 12 #include <linux/clk.h> 13 #include <linux/dmi.h> 14 #include <sound/core.h> 15 #include <sound/jack.h> 16 #include <sound/pcm.h> 17 #include <sound/pcm_params.h> 18 #include <sound/soc.h> 19 #include <sound/sof.h> 20 #include <sound/rt5682.h> 21 #include <sound/rt5682s.h> 22 #include <sound/soc-acpi.h> 23 #include "../../codecs/rt5682.h" 24 #include "../../codecs/rt5682s.h" 25 #include "../../codecs/rt5645.h" 26 #include "../../codecs/hdac_hdmi.h" 27 #include "../common/soc-intel-quirks.h" 28 #include "hda_dsp_common.h" 29 #include "sof_maxim_common.h" 30 #include "sof_realtek_common.h" 31 32 #define NAME_SIZE 32 33 34 #define SOF_RT5682_SSP_CODEC(quirk) ((quirk) & GENMASK(2, 0)) 35 #define SOF_RT5682_SSP_CODEC_MASK (GENMASK(2, 0)) 36 #define SOF_RT5682_MCLK_EN BIT(3) 37 #define SOF_RT5682_MCLK_24MHZ BIT(4) 38 #define SOF_SPEAKER_AMP_PRESENT BIT(5) 39 #define SOF_RT5682_SSP_AMP_SHIFT 6 40 #define SOF_RT5682_SSP_AMP_MASK (GENMASK(8, 6)) 41 #define SOF_RT5682_SSP_AMP(quirk) \ 42 (((quirk) << SOF_RT5682_SSP_AMP_SHIFT) & SOF_RT5682_SSP_AMP_MASK) 43 #define SOF_RT5682_MCLK_BYTCHT_EN BIT(9) 44 #define SOF_RT5682_NUM_HDMIDEV_SHIFT 10 45 #define SOF_RT5682_NUM_HDMIDEV_MASK (GENMASK(12, 10)) 46 #define SOF_RT5682_NUM_HDMIDEV(quirk) \ 47 ((quirk << SOF_RT5682_NUM_HDMIDEV_SHIFT) & SOF_RT5682_NUM_HDMIDEV_MASK) 48 #define SOF_RT1011_SPEAKER_AMP_PRESENT BIT(13) 49 #define SOF_RT1015_SPEAKER_AMP_PRESENT BIT(14) 50 #define SOF_RT1015P_SPEAKER_AMP_PRESENT BIT(16) 51 #define SOF_MAX98373_SPEAKER_AMP_PRESENT BIT(17) 52 #define SOF_MAX98360A_SPEAKER_AMP_PRESENT BIT(18) 53 54 /* BT audio offload: reserve 3 bits for future */ 55 #define SOF_BT_OFFLOAD_SSP_SHIFT 19 56 #define SOF_BT_OFFLOAD_SSP_MASK (GENMASK(21, 19)) 57 #define SOF_BT_OFFLOAD_SSP(quirk) \ 58 (((quirk) << SOF_BT_OFFLOAD_SSP_SHIFT) & SOF_BT_OFFLOAD_SSP_MASK) 59 #define SOF_SSP_BT_OFFLOAD_PRESENT BIT(22) 60 #define SOF_RT5682S_HEADPHONE_CODEC_PRESENT BIT(23) 61 #define SOF_MAX98390_SPEAKER_AMP_PRESENT BIT(24) 62 #define SOF_RT1019_SPEAKER_AMP_PRESENT BIT(26) 63 #define SOF_RT5650_HEADPHONE_CODEC_PRESENT BIT(27) 64 65 /* HDMI capture*/ 66 #define SOF_NO_OF_HDMI_CAPTURE_SSP_SHIFT 27 67 #define SOF_SSP_HDMI_CAPTURE_PRESENT_MASK (GENMASK(30, 27)) 68 #define SOF_HDMI_CAPTURE_SSP_MASK(quirk) \ 69 (((quirk) << SOF_NO_OF_HDMI_CAPTURE_SSP_SHIFT) & SOF_SSP_HDMI_CAPTURE_PRESENT_MASK) 70 71 /* Default: MCLK on, MCLK 19.2M, SSP0 */ 72 static unsigned long sof_rt5682_quirk = SOF_RT5682_MCLK_EN | 73 SOF_RT5682_SSP_CODEC(0); 74 75 static int is_legacy_cpu; 76 77 struct sof_hdmi_pcm { 78 struct list_head head; 79 struct snd_soc_dai *codec_dai; 80 struct snd_soc_jack hdmi_jack; 81 int device; 82 }; 83 84 struct sof_card_private { 85 struct clk *mclk; 86 struct snd_soc_jack sof_headset; 87 struct list_head hdmi_pcm_list; 88 bool common_hdmi_codec_drv; 89 bool idisp_codec; 90 }; 91 92 static int sof_rt5682_quirk_cb(const struct dmi_system_id *id) 93 { 94 sof_rt5682_quirk = (unsigned long)id->driver_data; 95 return 1; 96 } 97 98 static const struct dmi_system_id sof_rt5682_quirk_table[] = { 99 { 100 .callback = sof_rt5682_quirk_cb, 101 .matches = { 102 DMI_MATCH(DMI_SYS_VENDOR, "Circuitco"), 103 DMI_MATCH(DMI_PRODUCT_NAME, "Minnowboard Max"), 104 }, 105 .driver_data = (void *)(SOF_RT5682_SSP_CODEC(2)), 106 }, 107 { 108 .callback = sof_rt5682_quirk_cb, 109 .matches = { 110 DMI_MATCH(DMI_SYS_VENDOR, "AAEON"), 111 DMI_MATCH(DMI_PRODUCT_NAME, "UP-CHT01"), 112 }, 113 .driver_data = (void *)(SOF_RT5682_SSP_CODEC(2)), 114 }, 115 { 116 .callback = sof_rt5682_quirk_cb, 117 .matches = { 118 DMI_MATCH(DMI_SYS_VENDOR, "Intel Corporation"), 119 DMI_MATCH(DMI_PRODUCT_NAME, "WhiskeyLake Client"), 120 }, 121 .driver_data = (void *)(SOF_RT5682_MCLK_EN | 122 SOF_RT5682_MCLK_24MHZ | 123 SOF_RT5682_SSP_CODEC(1)), 124 }, 125 { 126 /* 127 * Dooly is hatch family but using rt1015 amp so it 128 * requires a quirk before "Google_Hatch". 129 */ 130 .callback = sof_rt5682_quirk_cb, 131 .matches = { 132 DMI_MATCH(DMI_SYS_VENDOR, "HP"), 133 DMI_MATCH(DMI_PRODUCT_NAME, "Dooly"), 134 }, 135 .driver_data = (void *)(SOF_RT5682_MCLK_EN | 136 SOF_RT5682_MCLK_24MHZ | 137 SOF_RT5682_SSP_CODEC(0) | 138 SOF_SPEAKER_AMP_PRESENT | 139 SOF_RT1015_SPEAKER_AMP_PRESENT | 140 SOF_RT5682_SSP_AMP(1)), 141 }, 142 { 143 .callback = sof_rt5682_quirk_cb, 144 .matches = { 145 DMI_MATCH(DMI_PRODUCT_FAMILY, "Google_Hatch"), 146 }, 147 .driver_data = (void *)(SOF_RT5682_MCLK_EN | 148 SOF_RT5682_MCLK_24MHZ | 149 SOF_RT5682_SSP_CODEC(0) | 150 SOF_SPEAKER_AMP_PRESENT | 151 SOF_RT5682_SSP_AMP(1)), 152 }, 153 { 154 .callback = sof_rt5682_quirk_cb, 155 .matches = { 156 DMI_MATCH(DMI_SYS_VENDOR, "Intel Corporation"), 157 DMI_MATCH(DMI_PRODUCT_NAME, "Ice Lake Client"), 158 }, 159 .driver_data = (void *)(SOF_RT5682_MCLK_EN | 160 SOF_RT5682_SSP_CODEC(0)), 161 }, 162 { 163 .callback = sof_rt5682_quirk_cb, 164 .matches = { 165 DMI_MATCH(DMI_PRODUCT_FAMILY, "Google_Volteer"), 166 DMI_MATCH(DMI_OEM_STRING, "AUDIO-MAX98373_ALC5682I_I2S_UP4"), 167 }, 168 .driver_data = (void *)(SOF_RT5682_MCLK_EN | 169 SOF_RT5682_SSP_CODEC(0) | 170 SOF_SPEAKER_AMP_PRESENT | 171 SOF_MAX98373_SPEAKER_AMP_PRESENT | 172 SOF_RT5682_SSP_AMP(2) | 173 SOF_RT5682_NUM_HDMIDEV(4)), 174 }, 175 { 176 .callback = sof_rt5682_quirk_cb, 177 .matches = { 178 DMI_MATCH(DMI_SYS_VENDOR, "Intel Corporation"), 179 DMI_MATCH(DMI_PRODUCT_NAME, "Alder Lake Client Platform"), 180 DMI_MATCH(DMI_OEM_STRING, "AUDIO-ADL_MAX98373_ALC5682I_I2S"), 181 }, 182 .driver_data = (void *)(SOF_RT5682_MCLK_EN | 183 SOF_RT5682_SSP_CODEC(0) | 184 SOF_SPEAKER_AMP_PRESENT | 185 SOF_MAX98373_SPEAKER_AMP_PRESENT | 186 SOF_RT5682_SSP_AMP(2) | 187 SOF_RT5682_NUM_HDMIDEV(4)), 188 }, 189 { 190 .callback = sof_rt5682_quirk_cb, 191 .matches = { 192 DMI_MATCH(DMI_PRODUCT_FAMILY, "Google_Brya"), 193 DMI_MATCH(DMI_OEM_STRING, "AUDIO-MAX98390_ALC5682I_I2S"), 194 }, 195 .driver_data = (void *)(SOF_RT5682_MCLK_EN | 196 SOF_RT5682_SSP_CODEC(0) | 197 SOF_SPEAKER_AMP_PRESENT | 198 SOF_MAX98390_SPEAKER_AMP_PRESENT | 199 SOF_RT5682_SSP_AMP(2) | 200 SOF_RT5682_NUM_HDMIDEV(4)), 201 }, 202 { 203 .callback = sof_rt5682_quirk_cb, 204 .matches = { 205 DMI_MATCH(DMI_PRODUCT_FAMILY, "Google_Brya"), 206 DMI_MATCH(DMI_OEM_STRING, "AUDIO-MAX98360_ALC5682I_I2S_AMP_SSP2"), 207 }, 208 .driver_data = (void *)(SOF_RT5682_MCLK_EN | 209 SOF_RT5682_SSP_CODEC(0) | 210 SOF_SPEAKER_AMP_PRESENT | 211 SOF_MAX98360A_SPEAKER_AMP_PRESENT | 212 SOF_RT5682_SSP_AMP(2) | 213 SOF_RT5682_NUM_HDMIDEV(4)), 214 }, 215 { 216 .callback = sof_rt5682_quirk_cb, 217 .matches = { 218 DMI_MATCH(DMI_PRODUCT_FAMILY, "Google_Rex"), 219 DMI_MATCH(DMI_OEM_STRING, "AUDIO-MAX98360_ALC5682I_I2S"), 220 }, 221 .driver_data = (void *)(SOF_RT5682_MCLK_EN | 222 SOF_RT5682_SSP_CODEC(2) | 223 SOF_SPEAKER_AMP_PRESENT | 224 SOF_MAX98360A_SPEAKER_AMP_PRESENT | 225 SOF_RT5682_SSP_AMP(0) | 226 SOF_RT5682_NUM_HDMIDEV(4) | 227 SOF_BT_OFFLOAD_SSP(1) | 228 SOF_SSP_BT_OFFLOAD_PRESENT 229 ), 230 }, 231 { 232 .callback = sof_rt5682_quirk_cb, 233 .matches = { 234 DMI_MATCH(DMI_PRODUCT_FAMILY, "Google_Rex"), 235 DMI_MATCH(DMI_OEM_STRING, "AUDIO-ALC1019_ALC5682I_I2S"), 236 }, 237 .driver_data = (void *)(SOF_RT5682_MCLK_EN | 238 SOF_RT5682_SSP_CODEC(2) | 239 SOF_SPEAKER_AMP_PRESENT | 240 SOF_RT1019_SPEAKER_AMP_PRESENT | 241 SOF_RT5682_SSP_AMP(0) | 242 SOF_RT5682_NUM_HDMIDEV(3) 243 ), 244 }, 245 { 246 .callback = sof_rt5682_quirk_cb, 247 .matches = { 248 DMI_MATCH(DMI_PRODUCT_FAMILY, "Google_Rex"), 249 }, 250 .driver_data = (void *)(SOF_RT5682_MCLK_EN | 251 SOF_RT5682_SSP_CODEC(2) | 252 SOF_SPEAKER_AMP_PRESENT | 253 SOF_RT5682_SSP_AMP(0) | 254 SOF_RT5682_NUM_HDMIDEV(4) | 255 SOF_BT_OFFLOAD_SSP(1) | 256 SOF_SSP_BT_OFFLOAD_PRESENT 257 ), 258 }, 259 {} 260 }; 261 262 static int sof_hdmi_init(struct snd_soc_pcm_runtime *rtd) 263 { 264 struct sof_card_private *ctx = snd_soc_card_get_drvdata(rtd->card); 265 struct snd_soc_dai *dai = asoc_rtd_to_codec(rtd, 0); 266 struct sof_hdmi_pcm *pcm; 267 268 pcm = devm_kzalloc(rtd->card->dev, sizeof(*pcm), GFP_KERNEL); 269 if (!pcm) 270 return -ENOMEM; 271 272 /* dai_link id is 1:1 mapped to the PCM device */ 273 pcm->device = rtd->dai_link->id; 274 pcm->codec_dai = dai; 275 276 list_add_tail(&pcm->head, &ctx->hdmi_pcm_list); 277 278 return 0; 279 } 280 281 static struct snd_soc_jack_pin jack_pins[] = { 282 { 283 .pin = "Headphone Jack", 284 .mask = SND_JACK_HEADPHONE, 285 }, 286 { 287 .pin = "Headset Mic", 288 .mask = SND_JACK_MICROPHONE, 289 }, 290 }; 291 292 static int sof_rt5682_codec_init(struct snd_soc_pcm_runtime *rtd) 293 { 294 struct sof_card_private *ctx = snd_soc_card_get_drvdata(rtd->card); 295 struct snd_soc_component *component = asoc_rtd_to_codec(rtd, 0)->component; 296 struct snd_soc_jack *jack; 297 int extra_jack_data; 298 int ret; 299 300 /* need to enable ASRC function for 24MHz mclk rate */ 301 if ((sof_rt5682_quirk & SOF_RT5682_MCLK_EN) && 302 (sof_rt5682_quirk & SOF_RT5682_MCLK_24MHZ)) { 303 if (sof_rt5682_quirk & SOF_RT5682S_HEADPHONE_CODEC_PRESENT) 304 rt5682s_sel_asrc_clk_src(component, 305 RT5682S_DA_STEREO1_FILTER | 306 RT5682S_AD_STEREO1_FILTER, 307 RT5682S_CLK_SEL_I2S1_ASRC); 308 else if (sof_rt5682_quirk & SOF_RT5650_HEADPHONE_CODEC_PRESENT) { 309 rt5645_sel_asrc_clk_src(component, 310 RT5645_DA_STEREO_FILTER | 311 RT5645_AD_STEREO_FILTER, 312 RT5645_CLK_SEL_I2S1_ASRC); 313 rt5645_sel_asrc_clk_src(component, 314 RT5645_DA_MONO_L_FILTER | 315 RT5645_DA_MONO_R_FILTER, 316 RT5645_CLK_SEL_I2S2_ASRC); 317 } else 318 rt5682_sel_asrc_clk_src(component, 319 RT5682_DA_STEREO1_FILTER | 320 RT5682_AD_STEREO1_FILTER, 321 RT5682_CLK_SEL_I2S1_ASRC); 322 } 323 324 if (sof_rt5682_quirk & SOF_RT5682_MCLK_BYTCHT_EN) { 325 /* 326 * The firmware might enable the clock at 327 * boot (this information may or may not 328 * be reflected in the enable clock register). 329 * To change the rate we must disable the clock 330 * first to cover these cases. Due to common 331 * clock framework restrictions that do not allow 332 * to disable a clock that has not been enabled, 333 * we need to enable the clock first. 334 */ 335 ret = clk_prepare_enable(ctx->mclk); 336 if (!ret) 337 clk_disable_unprepare(ctx->mclk); 338 339 ret = clk_set_rate(ctx->mclk, 19200000); 340 341 if (ret) 342 dev_err(rtd->dev, "unable to set MCLK rate\n"); 343 } 344 345 /* 346 * Headset buttons map to the google Reference headset. 347 * These can be configured by userspace. 348 */ 349 ret = snd_soc_card_jack_new_pins(rtd->card, "Headset Jack", 350 SND_JACK_HEADSET | SND_JACK_BTN_0 | 351 SND_JACK_BTN_1 | SND_JACK_BTN_2 | 352 SND_JACK_BTN_3, 353 &ctx->sof_headset, 354 jack_pins, 355 ARRAY_SIZE(jack_pins)); 356 if (ret) { 357 dev_err(rtd->dev, "Headset Jack creation failed: %d\n", ret); 358 return ret; 359 } 360 361 jack = &ctx->sof_headset; 362 363 snd_jack_set_key(jack->jack, SND_JACK_BTN_0, KEY_PLAYPAUSE); 364 snd_jack_set_key(jack->jack, SND_JACK_BTN_1, KEY_VOICECOMMAND); 365 snd_jack_set_key(jack->jack, SND_JACK_BTN_2, KEY_VOLUMEUP); 366 snd_jack_set_key(jack->jack, SND_JACK_BTN_3, KEY_VOLUMEDOWN); 367 368 if (sof_rt5682_quirk & SOF_RT5650_HEADPHONE_CODEC_PRESENT) { 369 extra_jack_data = SND_JACK_MICROPHONE | SND_JACK_BTN_0; 370 ret = snd_soc_component_set_jack(component, jack, &extra_jack_data); 371 } else 372 ret = snd_soc_component_set_jack(component, jack, NULL); 373 374 if (ret) { 375 dev_err(rtd->dev, "Headset Jack call-back failed: %d\n", ret); 376 return ret; 377 } 378 379 return ret; 380 }; 381 382 static void sof_rt5682_codec_exit(struct snd_soc_pcm_runtime *rtd) 383 { 384 struct snd_soc_component *component = asoc_rtd_to_codec(rtd, 0)->component; 385 386 snd_soc_component_set_jack(component, NULL, NULL); 387 } 388 389 static int sof_rt5682_hw_params(struct snd_pcm_substream *substream, 390 struct snd_pcm_hw_params *params) 391 { 392 struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream); 393 struct sof_card_private *ctx = snd_soc_card_get_drvdata(rtd->card); 394 struct snd_soc_dai *codec_dai = asoc_rtd_to_codec(rtd, 0); 395 int pll_id, pll_source, pll_in, pll_out, clk_id, ret; 396 397 if (sof_rt5682_quirk & SOF_RT5682_MCLK_EN) { 398 if (sof_rt5682_quirk & SOF_RT5682_MCLK_BYTCHT_EN) { 399 ret = clk_prepare_enable(ctx->mclk); 400 if (ret < 0) { 401 dev_err(rtd->dev, 402 "could not configure MCLK state"); 403 return ret; 404 } 405 } 406 407 if (sof_rt5682_quirk & SOF_RT5682S_HEADPHONE_CODEC_PRESENT) 408 pll_source = RT5682S_PLL_S_MCLK; 409 else if (sof_rt5682_quirk & SOF_RT5650_HEADPHONE_CODEC_PRESENT) 410 pll_source = RT5645_PLL1_S_MCLK; 411 else 412 pll_source = RT5682_PLL1_S_MCLK; 413 414 /* get the tplg configured mclk. */ 415 pll_in = sof_dai_get_mclk(rtd); 416 417 /* mclk from the quirk is the first choice */ 418 if (sof_rt5682_quirk & SOF_RT5682_MCLK_24MHZ) { 419 if (pll_in != 24000000) 420 dev_warn(rtd->dev, "configure wrong mclk in tplg, please use 24MHz.\n"); 421 pll_in = 24000000; 422 } else if (pll_in == 0) { 423 /* use default mclk if not specified correct in topology */ 424 pll_in = 19200000; 425 } else if (pll_in < 0) { 426 return pll_in; 427 } 428 } else { 429 if (sof_rt5682_quirk & SOF_RT5682S_HEADPHONE_CODEC_PRESENT) 430 pll_source = RT5682S_PLL_S_BCLK1; 431 else if (sof_rt5682_quirk & SOF_RT5650_HEADPHONE_CODEC_PRESENT) 432 pll_source = RT5645_PLL1_S_BCLK1; 433 else 434 pll_source = RT5682_PLL1_S_BCLK1; 435 436 pll_in = params_rate(params) * 50; 437 } 438 439 if (sof_rt5682_quirk & SOF_RT5682S_HEADPHONE_CODEC_PRESENT) { 440 pll_id = RT5682S_PLL2; 441 clk_id = RT5682S_SCLK_S_PLL2; 442 } else if (sof_rt5682_quirk & SOF_RT5650_HEADPHONE_CODEC_PRESENT) { 443 pll_id = 0; /* not used in codec driver */ 444 clk_id = RT5645_SCLK_S_PLL1; 445 } else { 446 pll_id = RT5682_PLL1; 447 clk_id = RT5682_SCLK_S_PLL1; 448 } 449 450 pll_out = params_rate(params) * 512; 451 452 /* when MCLK is 512FS, no need to set PLL configuration additionally. */ 453 if (pll_in == pll_out) 454 clk_id = RT5682S_SCLK_S_MCLK; 455 else { 456 /* Configure pll for codec */ 457 ret = snd_soc_dai_set_pll(codec_dai, pll_id, pll_source, pll_in, 458 pll_out); 459 if (ret < 0) 460 dev_err(rtd->dev, "snd_soc_dai_set_pll err = %d\n", ret); 461 } 462 463 /* Configure sysclk for codec */ 464 ret = snd_soc_dai_set_sysclk(codec_dai, clk_id, 465 pll_out, SND_SOC_CLOCK_IN); 466 if (ret < 0) 467 dev_err(rtd->dev, "snd_soc_dai_set_sysclk err = %d\n", ret); 468 469 /* 470 * slot_width should equal or large than data length, set them 471 * be the same 472 */ 473 ret = snd_soc_dai_set_tdm_slot(codec_dai, 0x0, 0x0, 2, 474 params_width(params)); 475 if (ret < 0) { 476 dev_err(rtd->dev, "set TDM slot err:%d\n", ret); 477 return ret; 478 } 479 480 return ret; 481 } 482 483 static struct snd_soc_ops sof_rt5682_ops = { 484 .hw_params = sof_rt5682_hw_params, 485 }; 486 487 static struct snd_soc_dai_link_component platform_component[] = { 488 { 489 /* name might be overridden during probe */ 490 .name = "0000:00:1f.3" 491 } 492 }; 493 494 static int sof_card_late_probe(struct snd_soc_card *card) 495 { 496 struct sof_card_private *ctx = snd_soc_card_get_drvdata(card); 497 struct snd_soc_component *component = NULL; 498 struct snd_soc_dapm_context *dapm = &card->dapm; 499 char jack_name[NAME_SIZE]; 500 struct sof_hdmi_pcm *pcm; 501 int err; 502 503 if (sof_rt5682_quirk & SOF_MAX98373_SPEAKER_AMP_PRESENT) { 504 /* Disable Left and Right Spk pin after boot */ 505 snd_soc_dapm_disable_pin(dapm, "Left Spk"); 506 snd_soc_dapm_disable_pin(dapm, "Right Spk"); 507 err = snd_soc_dapm_sync(dapm); 508 if (err < 0) 509 return err; 510 } 511 512 /* HDMI is not supported by SOF on Baytrail/CherryTrail */ 513 if (is_legacy_cpu || !ctx->idisp_codec) 514 return 0; 515 516 if (list_empty(&ctx->hdmi_pcm_list)) 517 return -EINVAL; 518 519 if (ctx->common_hdmi_codec_drv) { 520 pcm = list_first_entry(&ctx->hdmi_pcm_list, struct sof_hdmi_pcm, 521 head); 522 component = pcm->codec_dai->component; 523 return hda_dsp_hdmi_build_controls(card, component); 524 } 525 526 list_for_each_entry(pcm, &ctx->hdmi_pcm_list, head) { 527 component = pcm->codec_dai->component; 528 snprintf(jack_name, sizeof(jack_name), 529 "HDMI/DP, pcm=%d Jack", pcm->device); 530 err = snd_soc_card_jack_new(card, jack_name, 531 SND_JACK_AVOUT, &pcm->hdmi_jack); 532 533 if (err) 534 return err; 535 536 err = hdac_hdmi_jack_init(pcm->codec_dai, pcm->device, 537 &pcm->hdmi_jack); 538 if (err < 0) 539 return err; 540 } 541 542 return hdac_hdmi_jack_port_init(component, &card->dapm); 543 } 544 545 static const struct snd_kcontrol_new sof_controls[] = { 546 SOC_DAPM_PIN_SWITCH("Headphone Jack"), 547 SOC_DAPM_PIN_SWITCH("Headset Mic"), 548 SOC_DAPM_PIN_SWITCH("Left Spk"), 549 SOC_DAPM_PIN_SWITCH("Right Spk"), 550 551 }; 552 553 static const struct snd_soc_dapm_widget sof_widgets[] = { 554 SND_SOC_DAPM_HP("Headphone Jack", NULL), 555 SND_SOC_DAPM_MIC("Headset Mic", NULL), 556 SND_SOC_DAPM_SPK("Left Spk", NULL), 557 SND_SOC_DAPM_SPK("Right Spk", NULL), 558 }; 559 560 static const struct snd_soc_dapm_widget dmic_widgets[] = { 561 SND_SOC_DAPM_MIC("SoC DMIC", NULL), 562 }; 563 564 static const struct snd_soc_dapm_route sof_map[] = { 565 /* HP jack connectors - unknown if we have jack detection */ 566 { "Headphone Jack", NULL, "HPOL" }, 567 { "Headphone Jack", NULL, "HPOR" }, 568 569 /* other jacks */ 570 { "IN1P", NULL, "Headset Mic" }, 571 }; 572 573 static const struct snd_soc_dapm_route rt5650_spk_dapm_routes[] = { 574 /* speaker */ 575 { "Left Spk", NULL, "SPOL" }, 576 { "Right Spk", NULL, "SPOR" }, 577 }; 578 579 static const struct snd_soc_dapm_route dmic_map[] = { 580 /* digital mics */ 581 {"DMic", NULL, "SoC DMIC"}, 582 }; 583 584 static int rt5650_spk_init(struct snd_soc_pcm_runtime *rtd) 585 { 586 struct snd_soc_card *card = rtd->card; 587 int ret; 588 589 ret = snd_soc_dapm_add_routes(&card->dapm, rt5650_spk_dapm_routes, 590 ARRAY_SIZE(rt5650_spk_dapm_routes)); 591 if (ret) 592 dev_err(rtd->dev, "fail to add dapm routes, ret=%d\n", ret); 593 594 return ret; 595 } 596 597 static int dmic_init(struct snd_soc_pcm_runtime *rtd) 598 { 599 struct snd_soc_card *card = rtd->card; 600 int ret; 601 602 ret = snd_soc_dapm_new_controls(&card->dapm, dmic_widgets, 603 ARRAY_SIZE(dmic_widgets)); 604 if (ret) { 605 dev_err(card->dev, "DMic widget addition failed: %d\n", ret); 606 /* Don't need to add routes if widget addition failed */ 607 return ret; 608 } 609 610 ret = snd_soc_dapm_add_routes(&card->dapm, dmic_map, 611 ARRAY_SIZE(dmic_map)); 612 613 if (ret) 614 dev_err(card->dev, "DMic map addition failed: %d\n", ret); 615 616 return ret; 617 } 618 619 /* sof audio machine driver for rt5682 codec */ 620 static struct snd_soc_card sof_audio_card_rt5682 = { 621 .name = "rt5682", /* the sof- prefix is added by the core */ 622 .owner = THIS_MODULE, 623 .controls = sof_controls, 624 .num_controls = ARRAY_SIZE(sof_controls), 625 .dapm_widgets = sof_widgets, 626 .num_dapm_widgets = ARRAY_SIZE(sof_widgets), 627 .dapm_routes = sof_map, 628 .num_dapm_routes = ARRAY_SIZE(sof_map), 629 .fully_routed = true, 630 .late_probe = sof_card_late_probe, 631 }; 632 633 static struct snd_soc_dai_link_component rt5682_component[] = { 634 { 635 .name = "i2c-10EC5682:00", 636 .dai_name = "rt5682-aif1", 637 } 638 }; 639 640 static struct snd_soc_dai_link_component rt5682s_component[] = { 641 { 642 .name = "i2c-RTL5682:00", 643 .dai_name = "rt5682s-aif1", 644 } 645 }; 646 647 static struct snd_soc_dai_link_component rt5650_components[] = { 648 { 649 .name = "i2c-10EC5650:00", 650 .dai_name = "rt5645-aif1", 651 }, 652 { 653 .name = "i2c-10EC5650:00", 654 .dai_name = "rt5645-aif2", 655 } 656 }; 657 658 static struct snd_soc_dai_link_component dmic_component[] = { 659 { 660 .name = "dmic-codec", 661 .dai_name = "dmic-hifi", 662 } 663 }; 664 665 #define IDISP_CODEC_MASK 0x4 666 667 static struct snd_soc_dai_link *sof_card_dai_links_create(struct device *dev, 668 int ssp_codec, 669 int ssp_amp, 670 int dmic_be_num, 671 int hdmi_num, 672 bool idisp_codec) 673 { 674 struct snd_soc_dai_link_component *idisp_components; 675 struct snd_soc_dai_link_component *cpus; 676 struct snd_soc_dai_link *links; 677 int i, id = 0; 678 int hdmi_id_offset = 0; 679 680 links = devm_kcalloc(dev, sof_audio_card_rt5682.num_links, 681 sizeof(struct snd_soc_dai_link), GFP_KERNEL); 682 cpus = devm_kcalloc(dev, sof_audio_card_rt5682.num_links, 683 sizeof(struct snd_soc_dai_link_component), GFP_KERNEL); 684 if (!links || !cpus) 685 goto devm_err; 686 687 /* codec SSP */ 688 links[id].name = devm_kasprintf(dev, GFP_KERNEL, 689 "SSP%d-Codec", ssp_codec); 690 if (!links[id].name) 691 goto devm_err; 692 693 links[id].id = id; 694 if (sof_rt5682_quirk & SOF_RT5682S_HEADPHONE_CODEC_PRESENT) { 695 links[id].codecs = rt5682s_component; 696 links[id].num_codecs = ARRAY_SIZE(rt5682s_component); 697 } else if (sof_rt5682_quirk & SOF_RT5650_HEADPHONE_CODEC_PRESENT) { 698 links[id].codecs = &rt5650_components[0]; 699 links[id].num_codecs = 1; 700 } else { 701 links[id].codecs = rt5682_component; 702 links[id].num_codecs = ARRAY_SIZE(rt5682_component); 703 } 704 links[id].platforms = platform_component; 705 links[id].num_platforms = ARRAY_SIZE(platform_component); 706 links[id].init = sof_rt5682_codec_init; 707 links[id].exit = sof_rt5682_codec_exit; 708 links[id].ops = &sof_rt5682_ops; 709 links[id].dpcm_playback = 1; 710 links[id].dpcm_capture = 1; 711 links[id].no_pcm = 1; 712 links[id].cpus = &cpus[id]; 713 links[id].num_cpus = 1; 714 if (is_legacy_cpu) { 715 links[id].cpus->dai_name = devm_kasprintf(dev, GFP_KERNEL, 716 "ssp%d-port", 717 ssp_codec); 718 if (!links[id].cpus->dai_name) 719 goto devm_err; 720 } else { 721 /* 722 * Currently, On SKL+ platforms MCLK will be turned off in sof 723 * runtime suspended, and it will go into runtime suspended 724 * right after playback is stop. However, rt5682 will output 725 * static noise if sysclk turns off during playback. Set 726 * ignore_pmdown_time to power down rt5682 immediately and 727 * avoid the noise. 728 * It can be removed once we can control MCLK by driver. 729 */ 730 links[id].ignore_pmdown_time = 1; 731 links[id].cpus->dai_name = devm_kasprintf(dev, GFP_KERNEL, 732 "SSP%d Pin", 733 ssp_codec); 734 if (!links[id].cpus->dai_name) 735 goto devm_err; 736 } 737 id++; 738 739 /* dmic */ 740 if (dmic_be_num > 0) { 741 /* at least we have dmic01 */ 742 links[id].name = "dmic01"; 743 links[id].cpus = &cpus[id]; 744 links[id].cpus->dai_name = "DMIC01 Pin"; 745 links[id].init = dmic_init; 746 if (dmic_be_num > 1) { 747 /* set up 2 BE links at most */ 748 links[id + 1].name = "dmic16k"; 749 links[id + 1].cpus = &cpus[id + 1]; 750 links[id + 1].cpus->dai_name = "DMIC16k Pin"; 751 dmic_be_num = 2; 752 } 753 } 754 755 for (i = 0; i < dmic_be_num; i++) { 756 links[id].id = id; 757 links[id].num_cpus = 1; 758 links[id].codecs = dmic_component; 759 links[id].num_codecs = ARRAY_SIZE(dmic_component); 760 links[id].platforms = platform_component; 761 links[id].num_platforms = ARRAY_SIZE(platform_component); 762 links[id].ignore_suspend = 1; 763 links[id].dpcm_capture = 1; 764 links[id].no_pcm = 1; 765 id++; 766 } 767 768 /* HDMI */ 769 if (hdmi_num > 0) { 770 idisp_components = devm_kcalloc(dev, 771 hdmi_num, 772 sizeof(struct snd_soc_dai_link_component), 773 GFP_KERNEL); 774 if (!idisp_components) 775 goto devm_err; 776 } 777 for (i = 1; i <= hdmi_num; i++) { 778 links[id].name = devm_kasprintf(dev, GFP_KERNEL, 779 "iDisp%d", i); 780 if (!links[id].name) 781 goto devm_err; 782 783 links[id].id = id; 784 links[id].cpus = &cpus[id]; 785 links[id].num_cpus = 1; 786 links[id].cpus->dai_name = devm_kasprintf(dev, GFP_KERNEL, 787 "iDisp%d Pin", i); 788 if (!links[id].cpus->dai_name) 789 goto devm_err; 790 791 if (idisp_codec) { 792 idisp_components[i - 1].name = "ehdaudio0D2"; 793 idisp_components[i - 1].dai_name = devm_kasprintf(dev, 794 GFP_KERNEL, 795 "intel-hdmi-hifi%d", 796 i); 797 if (!idisp_components[i - 1].dai_name) 798 goto devm_err; 799 } else { 800 idisp_components[i - 1] = asoc_dummy_dlc; 801 } 802 803 links[id].codecs = &idisp_components[i - 1]; 804 links[id].num_codecs = 1; 805 links[id].platforms = platform_component; 806 links[id].num_platforms = ARRAY_SIZE(platform_component); 807 links[id].init = sof_hdmi_init; 808 links[id].dpcm_playback = 1; 809 links[id].no_pcm = 1; 810 id++; 811 } 812 813 /* speaker amp */ 814 if (sof_rt5682_quirk & SOF_SPEAKER_AMP_PRESENT) { 815 links[id].name = devm_kasprintf(dev, GFP_KERNEL, 816 "SSP%d-Codec", ssp_amp); 817 if (!links[id].name) 818 goto devm_err; 819 820 links[id].id = id; 821 if (sof_rt5682_quirk & SOF_RT1015_SPEAKER_AMP_PRESENT) { 822 sof_rt1015_dai_link(&links[id]); 823 } else if (sof_rt5682_quirk & SOF_RT1015P_SPEAKER_AMP_PRESENT) { 824 sof_rt1015p_dai_link(&links[id]); 825 } else if (sof_rt5682_quirk & SOF_RT1019_SPEAKER_AMP_PRESENT) { 826 sof_rt1019p_dai_link(&links[id]); 827 } else if (sof_rt5682_quirk & 828 SOF_MAX98373_SPEAKER_AMP_PRESENT) { 829 links[id].codecs = max_98373_components; 830 links[id].num_codecs = ARRAY_SIZE(max_98373_components); 831 links[id].init = max_98373_spk_codec_init; 832 links[id].ops = &max_98373_ops; 833 } else if (sof_rt5682_quirk & 834 SOF_MAX98360A_SPEAKER_AMP_PRESENT) { 835 max_98360a_dai_link(&links[id]); 836 } else if (sof_rt5682_quirk & 837 SOF_RT1011_SPEAKER_AMP_PRESENT) { 838 sof_rt1011_dai_link(&links[id]); 839 } else if (sof_rt5682_quirk & 840 SOF_MAX98390_SPEAKER_AMP_PRESENT) { 841 max_98390_dai_link(dev, &links[id]); 842 } else if (sof_rt5682_quirk & SOF_RT5650_HEADPHONE_CODEC_PRESENT) { 843 links[id].codecs = &rt5650_components[1]; 844 links[id].num_codecs = 1; 845 links[id].init = rt5650_spk_init; 846 links[id].ops = &sof_rt5682_ops; 847 } else { 848 max_98357a_dai_link(&links[id]); 849 } 850 links[id].platforms = platform_component; 851 links[id].num_platforms = ARRAY_SIZE(platform_component); 852 links[id].dpcm_playback = 1; 853 /* feedback stream or firmware-generated echo reference */ 854 links[id].dpcm_capture = 1; 855 856 links[id].no_pcm = 1; 857 links[id].cpus = &cpus[id]; 858 links[id].num_cpus = 1; 859 if (is_legacy_cpu) { 860 links[id].cpus->dai_name = devm_kasprintf(dev, GFP_KERNEL, 861 "ssp%d-port", 862 ssp_amp); 863 if (!links[id].cpus->dai_name) 864 goto devm_err; 865 866 } else { 867 links[id].cpus->dai_name = devm_kasprintf(dev, GFP_KERNEL, 868 "SSP%d Pin", 869 ssp_amp); 870 if (!links[id].cpus->dai_name) 871 goto devm_err; 872 } 873 id++; 874 } 875 876 /* BT audio offload */ 877 if (sof_rt5682_quirk & SOF_SSP_BT_OFFLOAD_PRESENT) { 878 int port = (sof_rt5682_quirk & SOF_BT_OFFLOAD_SSP_MASK) >> 879 SOF_BT_OFFLOAD_SSP_SHIFT; 880 881 links[id].id = id; 882 links[id].cpus = &cpus[id]; 883 links[id].cpus->dai_name = devm_kasprintf(dev, GFP_KERNEL, 884 "SSP%d Pin", port); 885 if (!links[id].cpus->dai_name) 886 goto devm_err; 887 links[id].name = devm_kasprintf(dev, GFP_KERNEL, "SSP%d-BT", port); 888 if (!links[id].name) 889 goto devm_err; 890 links[id].codecs = &asoc_dummy_dlc; 891 links[id].num_codecs = 1; 892 links[id].platforms = platform_component; 893 links[id].num_platforms = ARRAY_SIZE(platform_component); 894 links[id].dpcm_playback = 1; 895 links[id].dpcm_capture = 1; 896 links[id].no_pcm = 1; 897 links[id].num_cpus = 1; 898 } 899 900 /* HDMI-In SSP */ 901 if (sof_rt5682_quirk & SOF_SSP_HDMI_CAPTURE_PRESENT_MASK) { 902 unsigned long hdmi_in_ssp = (sof_rt5682_quirk & 903 SOF_SSP_HDMI_CAPTURE_PRESENT_MASK) >> 904 SOF_NO_OF_HDMI_CAPTURE_SSP_SHIFT; 905 int port = 0; 906 907 for_each_set_bit(port, &hdmi_in_ssp, 32) { 908 links[id].cpus = &cpus[id]; 909 links[id].cpus->dai_name = devm_kasprintf(dev, GFP_KERNEL, 910 "SSP%d Pin", port); 911 if (!links[id].cpus->dai_name) 912 return NULL; 913 links[id].name = devm_kasprintf(dev, GFP_KERNEL, "SSP%d-HDMI", port); 914 if (!links[id].name) 915 return NULL; 916 links[id].id = id + hdmi_id_offset; 917 links[id].codecs = &asoc_dummy_dlc; 918 links[id].num_codecs = 1; 919 links[id].platforms = platform_component; 920 links[id].num_platforms = ARRAY_SIZE(platform_component); 921 links[id].dpcm_capture = 1; 922 links[id].no_pcm = 1; 923 links[id].num_cpus = 1; 924 id++; 925 } 926 } 927 928 return links; 929 devm_err: 930 return NULL; 931 } 932 933 static int sof_audio_probe(struct platform_device *pdev) 934 { 935 struct snd_soc_dai_link *dai_links; 936 struct snd_soc_acpi_mach *mach; 937 struct sof_card_private *ctx; 938 int dmic_be_num, hdmi_num; 939 int ret, ssp_amp, ssp_codec; 940 941 ctx = devm_kzalloc(&pdev->dev, sizeof(*ctx), GFP_KERNEL); 942 if (!ctx) 943 return -ENOMEM; 944 945 if (pdev->id_entry && pdev->id_entry->driver_data) 946 sof_rt5682_quirk = (unsigned long)pdev->id_entry->driver_data; 947 948 dmi_check_system(sof_rt5682_quirk_table); 949 950 mach = pdev->dev.platform_data; 951 952 /* A speaker amp might not be present when the quirk claims one is. 953 * Detect this via whether the machine driver match includes quirk_data. 954 */ 955 if ((sof_rt5682_quirk & SOF_SPEAKER_AMP_PRESENT) && !mach->quirk_data) 956 sof_rt5682_quirk &= ~SOF_SPEAKER_AMP_PRESENT; 957 958 /* Detect the headset codec variant */ 959 if (acpi_dev_present("RTL5682", NULL, -1)) 960 sof_rt5682_quirk |= SOF_RT5682S_HEADPHONE_CODEC_PRESENT; 961 else if (acpi_dev_present("10EC5650", NULL, -1)) { 962 sof_rt5682_quirk |= SOF_RT5650_HEADPHONE_CODEC_PRESENT; 963 964 sof_audio_card_rt5682.name = devm_kstrdup(&pdev->dev, "rt5650", 965 GFP_KERNEL); 966 } 967 968 if (soc_intel_is_byt() || soc_intel_is_cht()) { 969 is_legacy_cpu = 1; 970 dmic_be_num = 0; 971 hdmi_num = 0; 972 /* default quirk for legacy cpu */ 973 sof_rt5682_quirk = SOF_RT5682_MCLK_EN | 974 SOF_RT5682_MCLK_BYTCHT_EN | 975 SOF_RT5682_SSP_CODEC(2); 976 } else { 977 dmic_be_num = 2; 978 hdmi_num = (sof_rt5682_quirk & SOF_RT5682_NUM_HDMIDEV_MASK) >> 979 SOF_RT5682_NUM_HDMIDEV_SHIFT; 980 /* default number of HDMI DAI's */ 981 if (!hdmi_num) 982 hdmi_num = 3; 983 984 if (mach->mach_params.codec_mask & IDISP_CODEC_MASK) 985 ctx->idisp_codec = true; 986 } 987 988 /* need to get main clock from pmc */ 989 if (sof_rt5682_quirk & SOF_RT5682_MCLK_BYTCHT_EN) { 990 ctx->mclk = devm_clk_get(&pdev->dev, "pmc_plt_clk_3"); 991 if (IS_ERR(ctx->mclk)) { 992 ret = PTR_ERR(ctx->mclk); 993 994 dev_err(&pdev->dev, 995 "Failed to get MCLK from pmc_plt_clk_3: %d\n", 996 ret); 997 return ret; 998 } 999 1000 ret = clk_prepare_enable(ctx->mclk); 1001 if (ret < 0) { 1002 dev_err(&pdev->dev, 1003 "could not configure MCLK state"); 1004 return ret; 1005 } 1006 } 1007 1008 dev_dbg(&pdev->dev, "sof_rt5682_quirk = %lx\n", sof_rt5682_quirk); 1009 1010 ssp_amp = (sof_rt5682_quirk & SOF_RT5682_SSP_AMP_MASK) >> 1011 SOF_RT5682_SSP_AMP_SHIFT; 1012 1013 ssp_codec = sof_rt5682_quirk & SOF_RT5682_SSP_CODEC_MASK; 1014 1015 /* compute number of dai links */ 1016 sof_audio_card_rt5682.num_links = 1 + dmic_be_num + hdmi_num; 1017 1018 if (sof_rt5682_quirk & SOF_SPEAKER_AMP_PRESENT) 1019 sof_audio_card_rt5682.num_links++; 1020 1021 if (sof_rt5682_quirk & SOF_MAX98373_SPEAKER_AMP_PRESENT) 1022 max_98373_set_codec_conf(&sof_audio_card_rt5682); 1023 else if (sof_rt5682_quirk & SOF_RT1011_SPEAKER_AMP_PRESENT) 1024 sof_rt1011_codec_conf(&sof_audio_card_rt5682); 1025 else if (sof_rt5682_quirk & SOF_RT1015P_SPEAKER_AMP_PRESENT) 1026 sof_rt1015p_codec_conf(&sof_audio_card_rt5682); 1027 else if (sof_rt5682_quirk & SOF_MAX98390_SPEAKER_AMP_PRESENT) { 1028 max_98390_set_codec_conf(&pdev->dev, &sof_audio_card_rt5682); 1029 } 1030 1031 if (sof_rt5682_quirk & SOF_SSP_BT_OFFLOAD_PRESENT) 1032 sof_audio_card_rt5682.num_links++; 1033 1034 if (sof_rt5682_quirk & SOF_SSP_HDMI_CAPTURE_PRESENT_MASK) 1035 sof_audio_card_rt5682.num_links += 1036 hweight32((sof_rt5682_quirk & SOF_SSP_HDMI_CAPTURE_PRESENT_MASK) >> 1037 SOF_NO_OF_HDMI_CAPTURE_SSP_SHIFT); 1038 1039 dai_links = sof_card_dai_links_create(&pdev->dev, ssp_codec, ssp_amp, 1040 dmic_be_num, hdmi_num, ctx->idisp_codec); 1041 if (!dai_links) 1042 return -ENOMEM; 1043 1044 sof_audio_card_rt5682.dai_link = dai_links; 1045 1046 if (sof_rt5682_quirk & SOF_RT1015_SPEAKER_AMP_PRESENT) 1047 sof_rt1015_codec_conf(&sof_audio_card_rt5682); 1048 1049 INIT_LIST_HEAD(&ctx->hdmi_pcm_list); 1050 1051 sof_audio_card_rt5682.dev = &pdev->dev; 1052 1053 /* set platform name for each dailink */ 1054 ret = snd_soc_fixup_dai_links_platform_name(&sof_audio_card_rt5682, 1055 mach->mach_params.platform); 1056 if (ret) 1057 return ret; 1058 1059 ctx->common_hdmi_codec_drv = mach->mach_params.common_hdmi_codec_drv; 1060 1061 snd_soc_card_set_drvdata(&sof_audio_card_rt5682, ctx); 1062 1063 return devm_snd_soc_register_card(&pdev->dev, 1064 &sof_audio_card_rt5682); 1065 } 1066 1067 static const struct platform_device_id board_ids[] = { 1068 { 1069 .name = "sof_rt5682", 1070 }, 1071 { 1072 .name = "cml_rt1015_rt5682", 1073 .driver_data = (kernel_ulong_t)(SOF_RT5682_MCLK_EN | 1074 SOF_RT5682_MCLK_24MHZ | 1075 SOF_RT5682_SSP_CODEC(0) | 1076 SOF_SPEAKER_AMP_PRESENT | 1077 SOF_RT1015_SPEAKER_AMP_PRESENT | 1078 SOF_RT5682_SSP_AMP(1)), 1079 }, 1080 { 1081 .name = "jsl_rt5682_rt1015", 1082 .driver_data = (kernel_ulong_t)(SOF_RT5682_MCLK_EN | 1083 SOF_RT5682_MCLK_24MHZ | 1084 SOF_RT5682_SSP_CODEC(0) | 1085 SOF_SPEAKER_AMP_PRESENT | 1086 SOF_RT1015_SPEAKER_AMP_PRESENT | 1087 SOF_RT5682_SSP_AMP(1)), 1088 }, 1089 { 1090 .name = "jsl_rt5682_mx98360", 1091 .driver_data = (kernel_ulong_t)(SOF_RT5682_MCLK_EN | 1092 SOF_RT5682_MCLK_24MHZ | 1093 SOF_RT5682_SSP_CODEC(0) | 1094 SOF_SPEAKER_AMP_PRESENT | 1095 SOF_MAX98360A_SPEAKER_AMP_PRESENT | 1096 SOF_RT5682_SSP_AMP(1)), 1097 }, 1098 { 1099 .name = "jsl_rt5682_rt1015p", 1100 .driver_data = (kernel_ulong_t)(SOF_RT5682_MCLK_EN | 1101 SOF_RT5682_MCLK_24MHZ | 1102 SOF_RT5682_SSP_CODEC(0) | 1103 SOF_SPEAKER_AMP_PRESENT | 1104 SOF_RT1015P_SPEAKER_AMP_PRESENT | 1105 SOF_RT5682_SSP_AMP(1)), 1106 }, 1107 { 1108 .name = "jsl_rt5682", 1109 .driver_data = (kernel_ulong_t)(SOF_RT5682_MCLK_EN | 1110 SOF_RT5682_MCLK_24MHZ | 1111 SOF_RT5682_SSP_CODEC(0)), 1112 }, 1113 { 1114 .name = "tgl_mx98357_rt5682", 1115 .driver_data = (kernel_ulong_t)(SOF_RT5682_MCLK_EN | 1116 SOF_RT5682_SSP_CODEC(0) | 1117 SOF_SPEAKER_AMP_PRESENT | 1118 SOF_RT5682_SSP_AMP(1) | 1119 SOF_RT5682_NUM_HDMIDEV(4) | 1120 SOF_BT_OFFLOAD_SSP(2) | 1121 SOF_SSP_BT_OFFLOAD_PRESENT), 1122 }, 1123 { 1124 .name = "tgl_rt1011_rt5682", 1125 .driver_data = (kernel_ulong_t)(SOF_RT5682_MCLK_EN | 1126 SOF_RT5682_SSP_CODEC(0) | 1127 SOF_SPEAKER_AMP_PRESENT | 1128 SOF_RT1011_SPEAKER_AMP_PRESENT | 1129 SOF_RT5682_SSP_AMP(1) | 1130 SOF_RT5682_NUM_HDMIDEV(4) | 1131 SOF_BT_OFFLOAD_SSP(2) | 1132 SOF_SSP_BT_OFFLOAD_PRESENT), 1133 }, 1134 { 1135 .name = "tgl_mx98373_rt5682", 1136 .driver_data = (kernel_ulong_t)(SOF_RT5682_MCLK_EN | 1137 SOF_RT5682_SSP_CODEC(0) | 1138 SOF_SPEAKER_AMP_PRESENT | 1139 SOF_MAX98373_SPEAKER_AMP_PRESENT | 1140 SOF_RT5682_SSP_AMP(1) | 1141 SOF_RT5682_NUM_HDMIDEV(4) | 1142 SOF_BT_OFFLOAD_SSP(2) | 1143 SOF_SSP_BT_OFFLOAD_PRESENT), 1144 }, 1145 { 1146 .name = "adl_mx98373_rt5682", 1147 .driver_data = (kernel_ulong_t)(SOF_RT5682_MCLK_EN | 1148 SOF_RT5682_SSP_CODEC(0) | 1149 SOF_SPEAKER_AMP_PRESENT | 1150 SOF_MAX98373_SPEAKER_AMP_PRESENT | 1151 SOF_RT5682_SSP_AMP(1) | 1152 SOF_RT5682_NUM_HDMIDEV(4) | 1153 SOF_BT_OFFLOAD_SSP(2) | 1154 SOF_SSP_BT_OFFLOAD_PRESENT), 1155 }, 1156 { 1157 .name = "adl_mx98357_rt5682", 1158 .driver_data = (kernel_ulong_t)(SOF_RT5682_MCLK_EN | 1159 SOF_RT5682_SSP_CODEC(0) | 1160 SOF_SPEAKER_AMP_PRESENT | 1161 SOF_RT5682_SSP_AMP(2) | 1162 SOF_RT5682_NUM_HDMIDEV(4)), 1163 }, 1164 { 1165 .name = "adl_max98390_rt5682", 1166 .driver_data = (kernel_ulong_t)(SOF_RT5682_MCLK_EN | 1167 SOF_RT5682_SSP_CODEC(0) | 1168 SOF_SPEAKER_AMP_PRESENT | 1169 SOF_MAX98390_SPEAKER_AMP_PRESENT | 1170 SOF_RT5682_SSP_AMP(1) | 1171 SOF_RT5682_NUM_HDMIDEV(4) | 1172 SOF_BT_OFFLOAD_SSP(2) | 1173 SOF_SSP_BT_OFFLOAD_PRESENT), 1174 }, 1175 { 1176 .name = "adl_mx98360_rt5682", 1177 .driver_data = (kernel_ulong_t)(SOF_RT5682_MCLK_EN | 1178 SOF_RT5682_SSP_CODEC(0) | 1179 SOF_SPEAKER_AMP_PRESENT | 1180 SOF_MAX98360A_SPEAKER_AMP_PRESENT | 1181 SOF_RT5682_SSP_AMP(1) | 1182 SOF_RT5682_NUM_HDMIDEV(4) | 1183 SOF_BT_OFFLOAD_SSP(2) | 1184 SOF_SSP_BT_OFFLOAD_PRESENT), 1185 }, 1186 { 1187 .name = "adl_rt5682", 1188 .driver_data = (kernel_ulong_t)(SOF_RT5682_MCLK_EN | 1189 SOF_RT5682_SSP_CODEC(0) | 1190 SOF_RT5682_NUM_HDMIDEV(4) | 1191 SOF_BT_OFFLOAD_SSP(2) | 1192 SOF_SSP_BT_OFFLOAD_PRESENT), 1193 }, 1194 { 1195 .name = "adl_rt1019_rt5682", 1196 .driver_data = (kernel_ulong_t)(SOF_RT5682_MCLK_EN | 1197 SOF_RT5682_SSP_CODEC(0) | 1198 SOF_SPEAKER_AMP_PRESENT | 1199 SOF_RT1019_SPEAKER_AMP_PRESENT | 1200 SOF_RT5682_SSP_AMP(1) | 1201 SOF_RT5682_NUM_HDMIDEV(4) | 1202 SOF_BT_OFFLOAD_SSP(2) | 1203 SOF_SSP_BT_OFFLOAD_PRESENT), 1204 }, 1205 { 1206 .name = "adl_rt5682_c1_h02", 1207 .driver_data = (kernel_ulong_t)(SOF_RT5682_MCLK_EN | 1208 SOF_RT5682_SSP_CODEC(1) | 1209 SOF_RT5682_NUM_HDMIDEV(3) | 1210 /* SSP 0 and SSP 2 are used for HDMI IN */ 1211 SOF_HDMI_CAPTURE_SSP_MASK(0x5)), 1212 }, 1213 { 1214 .name = "rpl_mx98357_rt5682", 1215 .driver_data = (kernel_ulong_t)(SOF_RT5682_MCLK_EN | 1216 SOF_RT5682_SSP_CODEC(0) | 1217 SOF_SPEAKER_AMP_PRESENT | 1218 SOF_RT5682_SSP_AMP(2) | 1219 SOF_RT5682_NUM_HDMIDEV(4)), 1220 }, 1221 { 1222 .name = "rpl_mx98360_rt5682", 1223 .driver_data = (kernel_ulong_t)(SOF_RT5682_MCLK_EN | 1224 SOF_RT5682_SSP_CODEC(0) | 1225 SOF_SPEAKER_AMP_PRESENT | 1226 SOF_MAX98360A_SPEAKER_AMP_PRESENT | 1227 SOF_RT5682_SSP_AMP(1) | 1228 SOF_RT5682_NUM_HDMIDEV(4) | 1229 SOF_BT_OFFLOAD_SSP(2) | 1230 SOF_SSP_BT_OFFLOAD_PRESENT), 1231 }, 1232 { 1233 .name = "rpl_rt1019_rt5682", 1234 .driver_data = (kernel_ulong_t)(SOF_RT5682_MCLK_EN | 1235 SOF_RT5682_SSP_CODEC(0) | 1236 SOF_SPEAKER_AMP_PRESENT | 1237 SOF_RT1019_SPEAKER_AMP_PRESENT | 1238 SOF_RT5682_SSP_AMP(1) | 1239 SOF_RT5682_NUM_HDMIDEV(4) | 1240 SOF_BT_OFFLOAD_SSP(2) | 1241 SOF_SSP_BT_OFFLOAD_PRESENT), 1242 }, 1243 { 1244 .name = "mtl_mx98357_rt5682", 1245 .driver_data = (kernel_ulong_t)(SOF_RT5682_MCLK_EN | 1246 SOF_RT5682_SSP_CODEC(0) | 1247 SOF_SPEAKER_AMP_PRESENT | 1248 SOF_RT5682_SSP_AMP(1) | 1249 SOF_RT5682_NUM_HDMIDEV(4) | 1250 SOF_BT_OFFLOAD_SSP(2) | 1251 SOF_SSP_BT_OFFLOAD_PRESENT), 1252 }, 1253 { 1254 .name = "mtl_mx98360_rt5682", 1255 .driver_data = (kernel_ulong_t)(SOF_RT5682_MCLK_EN | 1256 SOF_RT5682_SSP_CODEC(0) | 1257 SOF_SPEAKER_AMP_PRESENT | 1258 SOF_MAX98360A_SPEAKER_AMP_PRESENT | 1259 SOF_RT5682_SSP_AMP(1) | 1260 SOF_RT5682_NUM_HDMIDEV(4)), 1261 }, 1262 { 1263 .name = "mtl_rt1019_rt5682", 1264 .driver_data = (kernel_ulong_t)(SOF_RT5682_MCLK_EN | 1265 SOF_RT5682_SSP_CODEC(2) | 1266 SOF_SPEAKER_AMP_PRESENT | 1267 SOF_RT1019_SPEAKER_AMP_PRESENT | 1268 SOF_RT5682_SSP_AMP(0) | 1269 SOF_RT5682_NUM_HDMIDEV(3)), 1270 }, 1271 { 1272 .name = "jsl_rt5650", 1273 .driver_data = (kernel_ulong_t)(SOF_RT5682_MCLK_EN | 1274 SOF_RT5682_MCLK_24MHZ | 1275 SOF_RT5682_SSP_CODEC(0) | 1276 SOF_SPEAKER_AMP_PRESENT | 1277 SOF_RT5682_SSP_AMP(1)), 1278 }, 1279 { } 1280 }; 1281 MODULE_DEVICE_TABLE(platform, board_ids); 1282 1283 static struct platform_driver sof_audio = { 1284 .probe = sof_audio_probe, 1285 .driver = { 1286 .name = "sof_rt5682", 1287 .pm = &snd_soc_pm_ops, 1288 }, 1289 .id_table = board_ids, 1290 }; 1291 module_platform_driver(sof_audio) 1292 1293 /* Module information */ 1294 MODULE_DESCRIPTION("SOF Audio Machine driver"); 1295 MODULE_AUTHOR("Bard Liao <bard.liao@intel.com>"); 1296 MODULE_AUTHOR("Sathya Prakash M R <sathya.prakash.m.r@intel.com>"); 1297 MODULE_AUTHOR("Brent Lu <brent.lu@intel.com>"); 1298 MODULE_AUTHOR("Mac Chiang <mac.chiang@intel.com>"); 1299 MODULE_LICENSE("GPL v2"); 1300 MODULE_IMPORT_NS(SND_SOC_INTEL_HDA_DSP_COMMON); 1301 MODULE_IMPORT_NS(SND_SOC_INTEL_SOF_MAXIM_COMMON); 1302 MODULE_IMPORT_NS(SND_SOC_INTEL_SOF_REALTEK_COMMON); 1303