1 // SPDX-License-Identifier: GPL-2.0 2 // 3 // mt8183-mt6358.c -- 4 // MT8183-MT6358-TS3A227-MAX98357 ALSA SoC machine driver 5 // 6 // Copyright (c) 2018 MediaTek Inc. 7 // Author: Shunli Wang <shunli.wang@mediatek.com> 8 9 #include <linux/module.h> 10 #include <linux/of_device.h> 11 #include <linux/pinctrl/consumer.h> 12 #include <sound/jack.h> 13 #include <sound/pcm_params.h> 14 #include <sound/soc.h> 15 16 #include "../../codecs/rt1015.h" 17 #include "../../codecs/ts3a227e.h" 18 #include "mt8183-afe-common.h" 19 20 #define RT1015_CODEC_DAI "rt1015-aif" 21 #define RT1015_DEV0_NAME "rt1015.6-0028" 22 #define RT1015_DEV1_NAME "rt1015.6-0029" 23 24 enum PINCTRL_PIN_STATE { 25 PIN_STATE_DEFAULT = 0, 26 PIN_TDM_OUT_ON, 27 PIN_TDM_OUT_OFF, 28 PIN_WOV, 29 PIN_STATE_MAX 30 }; 31 32 static const char * const mt8183_pin_str[PIN_STATE_MAX] = { 33 "default", "aud_tdm_out_on", "aud_tdm_out_off", "wov", 34 }; 35 36 struct mt8183_mt6358_ts3a227_max98357_priv { 37 struct pinctrl *pinctrl; 38 struct pinctrl_state *pin_states[PIN_STATE_MAX]; 39 struct snd_soc_jack headset_jack, hdmi_jack; 40 }; 41 42 static int mt8183_mt6358_i2s_hw_params(struct snd_pcm_substream *substream, 43 struct snd_pcm_hw_params *params) 44 { 45 struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream); 46 unsigned int rate = params_rate(params); 47 unsigned int mclk_fs_ratio = 128; 48 unsigned int mclk_fs = rate * mclk_fs_ratio; 49 50 return snd_soc_dai_set_sysclk(asoc_rtd_to_cpu(rtd, 0), 51 0, mclk_fs, SND_SOC_CLOCK_OUT); 52 } 53 54 static const struct snd_soc_ops mt8183_mt6358_i2s_ops = { 55 .hw_params = mt8183_mt6358_i2s_hw_params, 56 }; 57 58 static int 59 mt8183_mt6358_rt1015_i2s_hw_params(struct snd_pcm_substream *substream, 60 struct snd_pcm_hw_params *params) 61 { 62 struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream); 63 unsigned int rate = params_rate(params); 64 unsigned int mclk_fs_ratio = 128; 65 unsigned int mclk_fs = rate * mclk_fs_ratio; 66 struct snd_soc_card *card = rtd->card; 67 struct snd_soc_dai *codec_dai; 68 int ret, i; 69 70 for_each_rtd_codec_dais(rtd, i, codec_dai) { 71 ret = snd_soc_dai_set_pll(codec_dai, 0, RT1015_PLL_S_BCLK, 72 rate * 64, rate * 256); 73 if (ret < 0) { 74 dev_err(card->dev, "failed to set pll\n"); 75 return ret; 76 } 77 78 ret = snd_soc_dai_set_sysclk(codec_dai, RT1015_SCLK_S_PLL, 79 rate * 256, SND_SOC_CLOCK_IN); 80 if (ret < 0) { 81 dev_err(card->dev, "failed to set sysclk\n"); 82 return ret; 83 } 84 } 85 86 return snd_soc_dai_set_sysclk(asoc_rtd_to_cpu(rtd, 0), 87 0, mclk_fs, SND_SOC_CLOCK_OUT); 88 } 89 90 static const struct snd_soc_ops mt8183_mt6358_rt1015_i2s_ops = { 91 .hw_params = mt8183_mt6358_rt1015_i2s_hw_params, 92 }; 93 94 static int mt8183_i2s_hw_params_fixup(struct snd_soc_pcm_runtime *rtd, 95 struct snd_pcm_hw_params *params) 96 { 97 dev_dbg(rtd->dev, "%s(), fix format to 32bit\n", __func__); 98 99 /* fix BE i2s format to 32bit, clean param mask first */ 100 snd_mask_reset_range(hw_param_mask(params, SNDRV_PCM_HW_PARAM_FORMAT), 101 0, SNDRV_PCM_FORMAT_LAST); 102 103 params_set_format(params, SNDRV_PCM_FORMAT_S32_LE); 104 return 0; 105 } 106 107 static int mt8183_rt1015_i2s_hw_params_fixup(struct snd_soc_pcm_runtime *rtd, 108 struct snd_pcm_hw_params *params) 109 { 110 dev_dbg(rtd->dev, "%s(), fix format to 32bit\n", __func__); 111 112 /* fix BE i2s format to 32bit, clean param mask first */ 113 snd_mask_reset_range(hw_param_mask(params, SNDRV_PCM_HW_PARAM_FORMAT), 114 0, SNDRV_PCM_FORMAT_LAST); 115 116 params_set_format(params, SNDRV_PCM_FORMAT_S24_LE); 117 return 0; 118 } 119 120 static int 121 mt8183_mt6358_ts3a227_max98357_bt_sco_startup( 122 struct snd_pcm_substream *substream) 123 { 124 static const unsigned int rates[] = { 125 8000, 16000 126 }; 127 static const struct snd_pcm_hw_constraint_list constraints_rates = { 128 .count = ARRAY_SIZE(rates), 129 .list = rates, 130 .mask = 0, 131 }; 132 static const unsigned int channels[] = { 133 1, 134 }; 135 static const struct snd_pcm_hw_constraint_list constraints_channels = { 136 .count = ARRAY_SIZE(channels), 137 .list = channels, 138 .mask = 0, 139 }; 140 141 struct snd_pcm_runtime *runtime = substream->runtime; 142 143 snd_pcm_hw_constraint_list(runtime, 0, 144 SNDRV_PCM_HW_PARAM_RATE, &constraints_rates); 145 runtime->hw.channels_max = 1; 146 snd_pcm_hw_constraint_list(runtime, 0, 147 SNDRV_PCM_HW_PARAM_CHANNELS, 148 &constraints_channels); 149 150 runtime->hw.formats = SNDRV_PCM_FMTBIT_S16_LE; 151 snd_pcm_hw_constraint_msbits(runtime, 0, 16, 16); 152 153 return 0; 154 } 155 156 static const struct snd_soc_ops mt8183_mt6358_ts3a227_max98357_bt_sco_ops = { 157 .startup = mt8183_mt6358_ts3a227_max98357_bt_sco_startup, 158 }; 159 160 /* FE */ 161 SND_SOC_DAILINK_DEFS(playback1, 162 DAILINK_COMP_ARRAY(COMP_CPU("DL1")), 163 DAILINK_COMP_ARRAY(COMP_DUMMY()), 164 DAILINK_COMP_ARRAY(COMP_EMPTY())); 165 166 SND_SOC_DAILINK_DEFS(playback2, 167 DAILINK_COMP_ARRAY(COMP_CPU("DL2")), 168 DAILINK_COMP_ARRAY(COMP_DUMMY()), 169 DAILINK_COMP_ARRAY(COMP_EMPTY())); 170 171 SND_SOC_DAILINK_DEFS(playback3, 172 DAILINK_COMP_ARRAY(COMP_CPU("DL3")), 173 DAILINK_COMP_ARRAY(COMP_DUMMY()), 174 DAILINK_COMP_ARRAY(COMP_EMPTY())); 175 176 SND_SOC_DAILINK_DEFS(capture1, 177 DAILINK_COMP_ARRAY(COMP_CPU("UL1")), 178 DAILINK_COMP_ARRAY(COMP_DUMMY()), 179 DAILINK_COMP_ARRAY(COMP_EMPTY())); 180 181 SND_SOC_DAILINK_DEFS(capture2, 182 DAILINK_COMP_ARRAY(COMP_CPU("UL2")), 183 DAILINK_COMP_ARRAY(COMP_DUMMY()), 184 DAILINK_COMP_ARRAY(COMP_EMPTY())); 185 186 SND_SOC_DAILINK_DEFS(capture3, 187 DAILINK_COMP_ARRAY(COMP_CPU("UL3")), 188 DAILINK_COMP_ARRAY(COMP_DUMMY()), 189 DAILINK_COMP_ARRAY(COMP_EMPTY())); 190 191 SND_SOC_DAILINK_DEFS(capture_mono, 192 DAILINK_COMP_ARRAY(COMP_CPU("UL_MONO_1")), 193 DAILINK_COMP_ARRAY(COMP_DUMMY()), 194 DAILINK_COMP_ARRAY(COMP_EMPTY())); 195 196 SND_SOC_DAILINK_DEFS(playback_hdmi, 197 DAILINK_COMP_ARRAY(COMP_CPU("HDMI")), 198 DAILINK_COMP_ARRAY(COMP_DUMMY()), 199 DAILINK_COMP_ARRAY(COMP_EMPTY())); 200 201 SND_SOC_DAILINK_DEFS(wake_on_voice, 202 DAILINK_COMP_ARRAY(COMP_DUMMY()), 203 DAILINK_COMP_ARRAY(COMP_DUMMY()), 204 DAILINK_COMP_ARRAY(COMP_EMPTY())); 205 206 /* BE */ 207 SND_SOC_DAILINK_DEFS(primary_codec, 208 DAILINK_COMP_ARRAY(COMP_CPU("ADDA")), 209 DAILINK_COMP_ARRAY(COMP_CODEC("mt6358-sound", "mt6358-snd-codec-aif1")), 210 DAILINK_COMP_ARRAY(COMP_EMPTY())); 211 212 SND_SOC_DAILINK_DEFS(pcm1, 213 DAILINK_COMP_ARRAY(COMP_CPU("PCM 1")), 214 DAILINK_COMP_ARRAY(COMP_DUMMY()), 215 DAILINK_COMP_ARRAY(COMP_EMPTY())); 216 217 SND_SOC_DAILINK_DEFS(pcm2, 218 DAILINK_COMP_ARRAY(COMP_CPU("PCM 2")), 219 DAILINK_COMP_ARRAY(COMP_DUMMY()), 220 DAILINK_COMP_ARRAY(COMP_EMPTY())); 221 222 SND_SOC_DAILINK_DEFS(i2s0, 223 DAILINK_COMP_ARRAY(COMP_CPU("I2S0")), 224 DAILINK_COMP_ARRAY(COMP_CODEC("bt-sco", "bt-sco-pcm")), 225 DAILINK_COMP_ARRAY(COMP_EMPTY())); 226 227 SND_SOC_DAILINK_DEFS(i2s1, 228 DAILINK_COMP_ARRAY(COMP_CPU("I2S1")), 229 DAILINK_COMP_ARRAY(COMP_DUMMY()), 230 DAILINK_COMP_ARRAY(COMP_EMPTY())); 231 232 SND_SOC_DAILINK_DEFS(i2s2, 233 DAILINK_COMP_ARRAY(COMP_CPU("I2S2")), 234 DAILINK_COMP_ARRAY(COMP_DUMMY()), 235 DAILINK_COMP_ARRAY(COMP_EMPTY())); 236 237 SND_SOC_DAILINK_DEFS(i2s3_max98357a, 238 DAILINK_COMP_ARRAY(COMP_CPU("I2S3")), 239 DAILINK_COMP_ARRAY(COMP_CODEC("max98357a", "HiFi")), 240 DAILINK_COMP_ARRAY(COMP_EMPTY())); 241 242 SND_SOC_DAILINK_DEFS(i2s3_rt1015, 243 DAILINK_COMP_ARRAY(COMP_CPU("I2S3")), 244 DAILINK_COMP_ARRAY(COMP_CODEC(RT1015_DEV0_NAME, RT1015_CODEC_DAI), 245 COMP_CODEC(RT1015_DEV1_NAME, RT1015_CODEC_DAI)), 246 DAILINK_COMP_ARRAY(COMP_EMPTY())); 247 248 SND_SOC_DAILINK_DEFS(i2s5, 249 DAILINK_COMP_ARRAY(COMP_CPU("I2S5")), 250 DAILINK_COMP_ARRAY(COMP_CODEC("bt-sco", "bt-sco-pcm")), 251 DAILINK_COMP_ARRAY(COMP_EMPTY())); 252 253 SND_SOC_DAILINK_DEFS(tdm, 254 DAILINK_COMP_ARRAY(COMP_CPU("TDM")), 255 DAILINK_COMP_ARRAY(COMP_CODEC(NULL, "i2s-hifi")), 256 DAILINK_COMP_ARRAY(COMP_EMPTY())); 257 258 static int mt8183_mt6358_tdm_startup(struct snd_pcm_substream *substream) 259 { 260 struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream); 261 struct mt8183_mt6358_ts3a227_max98357_priv *priv = 262 snd_soc_card_get_drvdata(rtd->card); 263 int ret; 264 265 if (IS_ERR(priv->pin_states[PIN_TDM_OUT_ON])) 266 return PTR_ERR(priv->pin_states[PIN_TDM_OUT_ON]); 267 268 ret = pinctrl_select_state(priv->pinctrl, 269 priv->pin_states[PIN_TDM_OUT_ON]); 270 if (ret) 271 dev_err(rtd->card->dev, "%s failed to select state %d\n", 272 __func__, ret); 273 274 return ret; 275 } 276 277 static void mt8183_mt6358_tdm_shutdown(struct snd_pcm_substream *substream) 278 { 279 struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream); 280 struct mt8183_mt6358_ts3a227_max98357_priv *priv = 281 snd_soc_card_get_drvdata(rtd->card); 282 int ret; 283 284 if (IS_ERR(priv->pin_states[PIN_TDM_OUT_OFF])) 285 return; 286 287 ret = pinctrl_select_state(priv->pinctrl, 288 priv->pin_states[PIN_TDM_OUT_OFF]); 289 if (ret) 290 dev_err(rtd->card->dev, "%s failed to select state %d\n", 291 __func__, ret); 292 } 293 294 static struct snd_soc_ops mt8183_mt6358_tdm_ops = { 295 .startup = mt8183_mt6358_tdm_startup, 296 .shutdown = mt8183_mt6358_tdm_shutdown, 297 }; 298 299 static int 300 mt8183_mt6358_ts3a227_max98357_wov_startup( 301 struct snd_pcm_substream *substream) 302 { 303 struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream); 304 struct snd_soc_card *card = rtd->card; 305 struct mt8183_mt6358_ts3a227_max98357_priv *priv = 306 snd_soc_card_get_drvdata(card); 307 308 return pinctrl_select_state(priv->pinctrl, 309 priv->pin_states[PIN_WOV]); 310 } 311 312 static void 313 mt8183_mt6358_ts3a227_max98357_wov_shutdown( 314 struct snd_pcm_substream *substream) 315 { 316 struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream); 317 struct snd_soc_card *card = rtd->card; 318 struct mt8183_mt6358_ts3a227_max98357_priv *priv = 319 snd_soc_card_get_drvdata(card); 320 int ret; 321 322 ret = pinctrl_select_state(priv->pinctrl, 323 priv->pin_states[PIN_STATE_DEFAULT]); 324 if (ret) 325 dev_err(card->dev, "%s failed to select state %d\n", 326 __func__, ret); 327 } 328 329 static const struct snd_soc_ops mt8183_mt6358_ts3a227_max98357_wov_ops = { 330 .startup = mt8183_mt6358_ts3a227_max98357_wov_startup, 331 .shutdown = mt8183_mt6358_ts3a227_max98357_wov_shutdown, 332 }; 333 334 static int 335 mt8183_mt6358_ts3a227_max98357_hdmi_init(struct snd_soc_pcm_runtime *rtd) 336 { 337 struct mt8183_mt6358_ts3a227_max98357_priv *priv = 338 snd_soc_card_get_drvdata(rtd->card); 339 int ret; 340 341 ret = snd_soc_card_jack_new(rtd->card, "HDMI Jack", SND_JACK_LINEOUT, 342 &priv->hdmi_jack, NULL, 0); 343 if (ret) 344 return ret; 345 346 return snd_soc_component_set_jack(asoc_rtd_to_codec(rtd, 0)->component, 347 &priv->hdmi_jack, NULL); 348 } 349 350 static struct snd_soc_dai_link mt8183_mt6358_ts3a227_dai_links[] = { 351 /* FE */ 352 { 353 .name = "Playback_1", 354 .stream_name = "Playback_1", 355 .trigger = {SND_SOC_DPCM_TRIGGER_PRE, 356 SND_SOC_DPCM_TRIGGER_PRE}, 357 .dynamic = 1, 358 .dpcm_playback = 1, 359 SND_SOC_DAILINK_REG(playback1), 360 }, 361 { 362 .name = "Playback_2", 363 .stream_name = "Playback_2", 364 .trigger = {SND_SOC_DPCM_TRIGGER_PRE, 365 SND_SOC_DPCM_TRIGGER_PRE}, 366 .dynamic = 1, 367 .dpcm_playback = 1, 368 .ops = &mt8183_mt6358_ts3a227_max98357_bt_sco_ops, 369 SND_SOC_DAILINK_REG(playback2), 370 }, 371 { 372 .name = "Playback_3", 373 .stream_name = "Playback_3", 374 .trigger = {SND_SOC_DPCM_TRIGGER_PRE, 375 SND_SOC_DPCM_TRIGGER_PRE}, 376 .dynamic = 1, 377 .dpcm_playback = 1, 378 SND_SOC_DAILINK_REG(playback3), 379 }, 380 { 381 .name = "Capture_1", 382 .stream_name = "Capture_1", 383 .trigger = {SND_SOC_DPCM_TRIGGER_PRE, 384 SND_SOC_DPCM_TRIGGER_PRE}, 385 .dynamic = 1, 386 .dpcm_capture = 1, 387 .ops = &mt8183_mt6358_ts3a227_max98357_bt_sco_ops, 388 SND_SOC_DAILINK_REG(capture1), 389 }, 390 { 391 .name = "Capture_2", 392 .stream_name = "Capture_2", 393 .trigger = {SND_SOC_DPCM_TRIGGER_PRE, 394 SND_SOC_DPCM_TRIGGER_PRE}, 395 .dynamic = 1, 396 .dpcm_capture = 1, 397 SND_SOC_DAILINK_REG(capture2), 398 }, 399 { 400 .name = "Capture_3", 401 .stream_name = "Capture_3", 402 .trigger = {SND_SOC_DPCM_TRIGGER_PRE, 403 SND_SOC_DPCM_TRIGGER_PRE}, 404 .dynamic = 1, 405 .dpcm_capture = 1, 406 SND_SOC_DAILINK_REG(capture3), 407 }, 408 { 409 .name = "Capture_Mono_1", 410 .stream_name = "Capture_Mono_1", 411 .trigger = {SND_SOC_DPCM_TRIGGER_PRE, 412 SND_SOC_DPCM_TRIGGER_PRE}, 413 .dynamic = 1, 414 .dpcm_capture = 1, 415 SND_SOC_DAILINK_REG(capture_mono), 416 }, 417 { 418 .name = "Playback_HDMI", 419 .stream_name = "Playback_HDMI", 420 .trigger = {SND_SOC_DPCM_TRIGGER_PRE, 421 SND_SOC_DPCM_TRIGGER_PRE}, 422 .dynamic = 1, 423 .dpcm_playback = 1, 424 SND_SOC_DAILINK_REG(playback_hdmi), 425 }, 426 { 427 .name = "Wake on Voice", 428 .stream_name = "Wake on Voice", 429 .ignore_suspend = 1, 430 .ignore = 1, 431 SND_SOC_DAILINK_REG(wake_on_voice), 432 .ops = &mt8183_mt6358_ts3a227_max98357_wov_ops, 433 }, 434 435 /* BE */ 436 { 437 .name = "Primary Codec", 438 .no_pcm = 1, 439 .dpcm_playback = 1, 440 .dpcm_capture = 1, 441 .ignore_suspend = 1, 442 SND_SOC_DAILINK_REG(primary_codec), 443 }, 444 { 445 .name = "PCM 1", 446 .no_pcm = 1, 447 .dpcm_playback = 1, 448 .dpcm_capture = 1, 449 .ignore_suspend = 1, 450 SND_SOC_DAILINK_REG(pcm1), 451 }, 452 { 453 .name = "PCM 2", 454 .no_pcm = 1, 455 .dpcm_playback = 1, 456 .dpcm_capture = 1, 457 .ignore_suspend = 1, 458 SND_SOC_DAILINK_REG(pcm2), 459 }, 460 { 461 .name = "I2S0", 462 .no_pcm = 1, 463 .dpcm_capture = 1, 464 .ignore_suspend = 1, 465 .be_hw_params_fixup = mt8183_i2s_hw_params_fixup, 466 .ops = &mt8183_mt6358_i2s_ops, 467 SND_SOC_DAILINK_REG(i2s0), 468 }, 469 { 470 .name = "I2S1", 471 .no_pcm = 1, 472 .dpcm_playback = 1, 473 .ignore_suspend = 1, 474 .be_hw_params_fixup = mt8183_i2s_hw_params_fixup, 475 .ops = &mt8183_mt6358_i2s_ops, 476 SND_SOC_DAILINK_REG(i2s1), 477 }, 478 { 479 .name = "I2S2", 480 .no_pcm = 1, 481 .dpcm_capture = 1, 482 .ignore_suspend = 1, 483 .be_hw_params_fixup = mt8183_i2s_hw_params_fixup, 484 .ops = &mt8183_mt6358_i2s_ops, 485 SND_SOC_DAILINK_REG(i2s2), 486 }, 487 { 488 .name = "I2S3", 489 .no_pcm = 1, 490 .dpcm_playback = 1, 491 .ignore_suspend = 1, 492 }, 493 { 494 .name = "I2S5", 495 .no_pcm = 1, 496 .dpcm_playback = 1, 497 .ignore_suspend = 1, 498 .be_hw_params_fixup = mt8183_i2s_hw_params_fixup, 499 .ops = &mt8183_mt6358_i2s_ops, 500 SND_SOC_DAILINK_REG(i2s5), 501 }, 502 { 503 .name = "TDM", 504 .no_pcm = 1, 505 .dai_fmt = SND_SOC_DAIFMT_I2S | 506 SND_SOC_DAIFMT_IB_IF | 507 SND_SOC_DAIFMT_CBM_CFM, 508 .dpcm_playback = 1, 509 .ignore_suspend = 1, 510 .be_hw_params_fixup = mt8183_i2s_hw_params_fixup, 511 .ops = &mt8183_mt6358_tdm_ops, 512 .init = mt8183_mt6358_ts3a227_max98357_hdmi_init, 513 SND_SOC_DAILINK_REG(tdm), 514 }, 515 }; 516 517 static struct snd_soc_card mt8183_mt6358_ts3a227_max98357_card = { 518 .name = "mt8183_mt6358_ts3a227_max98357", 519 .owner = THIS_MODULE, 520 .dai_link = mt8183_mt6358_ts3a227_dai_links, 521 .num_links = ARRAY_SIZE(mt8183_mt6358_ts3a227_dai_links), 522 }; 523 524 static struct snd_soc_card mt8183_mt6358_ts3a227_max98357b_card = { 525 .name = "mt8183_mt6358_ts3a227_max98357b", 526 .owner = THIS_MODULE, 527 .dai_link = mt8183_mt6358_ts3a227_dai_links, 528 .num_links = ARRAY_SIZE(mt8183_mt6358_ts3a227_dai_links), 529 }; 530 531 static struct snd_soc_codec_conf mt8183_mt6358_ts3a227_rt1015_amp_conf[] = { 532 { 533 .dlc = COMP_CODEC_CONF(RT1015_DEV0_NAME), 534 .name_prefix = "Left", 535 }, 536 { 537 .dlc = COMP_CODEC_CONF(RT1015_DEV1_NAME), 538 .name_prefix = "Right", 539 }, 540 }; 541 542 static struct snd_soc_card mt8183_mt6358_ts3a227_rt1015_card = { 543 .name = "mt8183_mt6358_ts3a227_rt1015", 544 .owner = THIS_MODULE, 545 .dai_link = mt8183_mt6358_ts3a227_dai_links, 546 .num_links = ARRAY_SIZE(mt8183_mt6358_ts3a227_dai_links), 547 .codec_conf = mt8183_mt6358_ts3a227_rt1015_amp_conf, 548 .num_configs = ARRAY_SIZE(mt8183_mt6358_ts3a227_rt1015_amp_conf), 549 }; 550 551 static int 552 mt8183_mt6358_ts3a227_max98357_headset_init(struct snd_soc_component *component) 553 { 554 int ret; 555 struct mt8183_mt6358_ts3a227_max98357_priv *priv = 556 snd_soc_card_get_drvdata(component->card); 557 558 /* Enable Headset and 4 Buttons Jack detection */ 559 ret = snd_soc_card_jack_new(component->card, 560 "Headset Jack", 561 SND_JACK_HEADSET | 562 SND_JACK_BTN_0 | SND_JACK_BTN_1 | 563 SND_JACK_BTN_2 | SND_JACK_BTN_3, 564 &priv->headset_jack, 565 NULL, 0); 566 if (ret) 567 return ret; 568 569 ret = ts3a227e_enable_jack_detect(component, &priv->headset_jack); 570 571 return ret; 572 } 573 574 static struct snd_soc_aux_dev mt8183_mt6358_ts3a227_max98357_headset_dev = { 575 .dlc = COMP_EMPTY(), 576 .init = mt8183_mt6358_ts3a227_max98357_headset_init, 577 }; 578 579 static int 580 mt8183_mt6358_ts3a227_max98357_dev_probe(struct platform_device *pdev) 581 { 582 struct snd_soc_card *card; 583 struct device_node *platform_node, *ec_codec, *hdmi_codec; 584 struct snd_soc_dai_link *dai_link; 585 struct mt8183_mt6358_ts3a227_max98357_priv *priv; 586 const struct of_device_id *match; 587 int ret, i; 588 589 platform_node = of_parse_phandle(pdev->dev.of_node, 590 "mediatek,platform", 0); 591 if (!platform_node) { 592 dev_err(&pdev->dev, "Property 'platform' missing or invalid\n"); 593 return -EINVAL; 594 } 595 596 match = of_match_device(pdev->dev.driver->of_match_table, &pdev->dev); 597 if (!match || !match->data) 598 return -EINVAL; 599 600 card = (struct snd_soc_card *)match->data; 601 card->dev = &pdev->dev; 602 603 ec_codec = of_parse_phandle(pdev->dev.of_node, "mediatek,ec-codec", 0); 604 hdmi_codec = of_parse_phandle(pdev->dev.of_node, 605 "mediatek,hdmi-codec", 0); 606 607 for_each_card_prelinks(card, i, dai_link) { 608 if (ec_codec && strcmp(dai_link->name, "Wake on Voice") == 0) { 609 dai_link->cpus[0].name = NULL; 610 dai_link->cpus[0].of_node = ec_codec; 611 dai_link->cpus[0].dai_name = NULL; 612 dai_link->codecs[0].name = NULL; 613 dai_link->codecs[0].of_node = ec_codec; 614 dai_link->codecs[0].dai_name = "Wake on Voice"; 615 dai_link->platforms[0].of_node = ec_codec; 616 dai_link->ignore = 0; 617 } 618 619 if (strcmp(dai_link->name, "I2S3") == 0) { 620 if (card == &mt8183_mt6358_ts3a227_max98357_card || 621 card == &mt8183_mt6358_ts3a227_max98357b_card) { 622 dai_link->be_hw_params_fixup = 623 mt8183_i2s_hw_params_fixup; 624 dai_link->ops = &mt8183_mt6358_i2s_ops; 625 dai_link->cpus = i2s3_max98357a_cpus; 626 dai_link->num_cpus = 627 ARRAY_SIZE(i2s3_max98357a_cpus); 628 dai_link->codecs = i2s3_max98357a_codecs; 629 dai_link->num_codecs = 630 ARRAY_SIZE(i2s3_max98357a_codecs); 631 dai_link->platforms = i2s3_max98357a_platforms; 632 dai_link->num_platforms = 633 ARRAY_SIZE(i2s3_max98357a_platforms); 634 } else if (card == &mt8183_mt6358_ts3a227_rt1015_card) { 635 dai_link->be_hw_params_fixup = 636 mt8183_rt1015_i2s_hw_params_fixup; 637 dai_link->ops = &mt8183_mt6358_rt1015_i2s_ops; 638 dai_link->cpus = i2s3_rt1015_cpus; 639 dai_link->num_cpus = 640 ARRAY_SIZE(i2s3_rt1015_cpus); 641 dai_link->codecs = i2s3_rt1015_codecs; 642 dai_link->num_codecs = 643 ARRAY_SIZE(i2s3_rt1015_codecs); 644 dai_link->platforms = i2s3_rt1015_platforms; 645 dai_link->num_platforms = 646 ARRAY_SIZE(i2s3_rt1015_platforms); 647 } 648 } 649 650 if (card == &mt8183_mt6358_ts3a227_max98357b_card) { 651 if (strcmp(dai_link->name, "I2S2") == 0 || 652 strcmp(dai_link->name, "I2S3") == 0) 653 dai_link->dai_fmt = SND_SOC_DAIFMT_LEFT_J | 654 SND_SOC_DAIFMT_NB_NF | 655 SND_SOC_DAIFMT_CBM_CFM; 656 } 657 658 if (hdmi_codec && strcmp(dai_link->name, "TDM") == 0) 659 dai_link->codecs->of_node = hdmi_codec; 660 661 if (!dai_link->platforms->name) 662 dai_link->platforms->of_node = platform_node; 663 } 664 665 mt8183_mt6358_ts3a227_max98357_headset_dev.dlc.of_node = 666 of_parse_phandle(pdev->dev.of_node, 667 "mediatek,headset-codec", 0); 668 if (mt8183_mt6358_ts3a227_max98357_headset_dev.dlc.of_node) { 669 card->aux_dev = &mt8183_mt6358_ts3a227_max98357_headset_dev; 670 card->num_aux_devs = 1; 671 } 672 673 priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL); 674 if (!priv) 675 return -ENOMEM; 676 677 snd_soc_card_set_drvdata(card, priv); 678 679 priv->pinctrl = devm_pinctrl_get(&pdev->dev); 680 if (IS_ERR(priv->pinctrl)) { 681 dev_err(&pdev->dev, "%s devm_pinctrl_get failed\n", 682 __func__); 683 return PTR_ERR(priv->pinctrl); 684 } 685 686 for (i = 0; i < PIN_STATE_MAX; i++) { 687 priv->pin_states[i] = pinctrl_lookup_state(priv->pinctrl, 688 mt8183_pin_str[i]); 689 if (IS_ERR(priv->pin_states[i])) { 690 ret = PTR_ERR(priv->pin_states[i]); 691 dev_info(&pdev->dev, "%s Can't find pin state %s %d\n", 692 __func__, mt8183_pin_str[i], ret); 693 } 694 } 695 696 if (!IS_ERR(priv->pin_states[PIN_TDM_OUT_OFF])) { 697 ret = pinctrl_select_state(priv->pinctrl, 698 priv->pin_states[PIN_TDM_OUT_OFF]); 699 if (ret) 700 dev_info(&pdev->dev, 701 "%s failed to select state %d\n", 702 __func__, ret); 703 } 704 705 if (!IS_ERR(priv->pin_states[PIN_STATE_DEFAULT])) { 706 ret = pinctrl_select_state(priv->pinctrl, 707 priv->pin_states[PIN_STATE_DEFAULT]); 708 if (ret) 709 dev_info(&pdev->dev, 710 "%s failed to select state %d\n", 711 __func__, ret); 712 } 713 714 return devm_snd_soc_register_card(&pdev->dev, card); 715 } 716 717 #ifdef CONFIG_OF 718 static const struct of_device_id mt8183_mt6358_ts3a227_max98357_dt_match[] = { 719 { 720 .compatible = "mediatek,mt8183_mt6358_ts3a227_max98357", 721 .data = &mt8183_mt6358_ts3a227_max98357_card, 722 }, 723 { 724 .compatible = "mediatek,mt8183_mt6358_ts3a227_max98357b", 725 .data = &mt8183_mt6358_ts3a227_max98357b_card, 726 }, 727 { 728 .compatible = "mediatek,mt8183_mt6358_ts3a227_rt1015", 729 .data = &mt8183_mt6358_ts3a227_rt1015_card, 730 }, 731 {} 732 }; 733 #endif 734 735 static struct platform_driver mt8183_mt6358_ts3a227_max98357_driver = { 736 .driver = { 737 .name = "mt8183_mt6358_ts3a227", 738 #ifdef CONFIG_OF 739 .of_match_table = mt8183_mt6358_ts3a227_max98357_dt_match, 740 #endif 741 .pm = &snd_soc_pm_ops, 742 }, 743 .probe = mt8183_mt6358_ts3a227_max98357_dev_probe, 744 }; 745 746 module_platform_driver(mt8183_mt6358_ts3a227_max98357_driver); 747 748 /* Module information */ 749 MODULE_DESCRIPTION("MT8183-MT6358-TS3A227-MAX98357 ALSA SoC machine driver"); 750 MODULE_AUTHOR("Shunli Wang <shunli.wang@mediatek.com>"); 751 MODULE_LICENSE("GPL v2"); 752 MODULE_ALIAS("mt8183_mt6358_ts3a227_max98357 soc card"); 753