File Index
Files and directories
Sign in
FILE

mt8188-mt6359.c

File preview with syntax highlighting.

linux-6.19.14/sound/soc/mediatek/mt8188/mt8188-mt6359.c C
   1// SPDX-License-Identifier: GPL-2.0
   2/*
   3 * mt8188-mt6359.c  --  MT8188-MT6359 ALSA SoC machine driver
   4 *
   5 * Copyright (c) 2022 MediaTek Inc.
   6 * Author: Trevor Wu <trevor.wu@mediatek.com>
   7 */
   8
   9#include <linux/bitfield.h>
  10#include <linux/input.h>
  11#include <linux/module.h>
  12#include <linux/of.h>
  13#include <linux/pm_runtime.h>
  14#include <sound/jack.h>
  15#include <sound/pcm_params.h>
  16#include <sound/soc.h>
  17#include "mt8188-afe-common.h"
  18#include "../../codecs/nau8825.h"
  19#include "../../codecs/mt6359.h"
  20#include "../../codecs/mt6359-accdet.h"
  21#include "../../codecs/rt5682.h"
  22#include "../common/mtk-afe-platform-driver.h"
  23#include "../common/mtk-soundcard-driver.h"
  24#include "../common/mtk-dsp-sof-common.h"
  25#include "../common/mtk-soc-card.h"
  26
  27#define CKSYS_AUD_TOP_CFG	0x032c
  28 #define RG_TEST_ON		BIT(0)
  29 #define RG_TEST_TYPE		BIT(2)
  30#define CKSYS_AUD_TOP_MON	0x0330
  31 #define TEST_MISO_COUNT_1	GENMASK(3, 0)
  32 #define TEST_MISO_COUNT_2	GENMASK(7, 4)
  33 #define TEST_MISO_DONE_1	BIT(28)
  34 #define TEST_MISO_DONE_2	BIT(29)
  35
  36#define NAU8825_HS_PRESENT	BIT(0)
  37#define RT5682S_HS_PRESENT	BIT(1)
  38#define ES8326_HS_PRESENT	BIT(2)
  39#define MAX98390_TWO_AMP	BIT(3)
  40/*
  41 * Maxim MAX98390
  42 */
  43#define MAX98390_CODEC_DAI     "max98390-aif1"
  44#define MAX98390_DEV0_NAME     "max98390.0-0038" /* rear right */
  45#define MAX98390_DEV1_NAME     "max98390.0-0039" /* rear left */
  46#define MAX98390_DEV2_NAME     "max98390.0-003a" /* front right */
  47#define MAX98390_DEV3_NAME     "max98390.0-003b" /* front left */
  48
  49/*
  50 * Nau88l25
  51 */
  52#define NAU8825_CODEC_DAI  "nau8825-hifi"
  53
  54/*
  55 * ES8326
  56 */
  57#define ES8326_CODEC_DAI  "ES8326 HiFi"
  58
  59#define SOF_DMA_DL2 "SOF_DMA_DL2"
  60#define SOF_DMA_DL3 "SOF_DMA_DL3"
  61#define SOF_DMA_UL4 "SOF_DMA_UL4"
  62#define SOF_DMA_UL5 "SOF_DMA_UL5"
  63
  64#define RT5682S_CODEC_DAI     "rt5682s-aif1"
  65
  66/* FE */
  67SND_SOC_DAILINK_DEFS(playback2,
  68		     DAILINK_COMP_ARRAY(COMP_CPU("DL2")),
  69		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
  70		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
  71
  72SND_SOC_DAILINK_DEFS(playback3,
  73		     DAILINK_COMP_ARRAY(COMP_CPU("DL3")),
  74		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
  75		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
  76
  77SND_SOC_DAILINK_DEFS(playback6,
  78		     DAILINK_COMP_ARRAY(COMP_CPU("DL6")),
  79		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
  80		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
  81
  82SND_SOC_DAILINK_DEFS(playback7,
  83		     DAILINK_COMP_ARRAY(COMP_CPU("DL7")),
  84		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
  85		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
  86
  87SND_SOC_DAILINK_DEFS(playback8,
  88		     DAILINK_COMP_ARRAY(COMP_CPU("DL8")),
  89		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
  90		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
  91
  92SND_SOC_DAILINK_DEFS(playback10,
  93		     DAILINK_COMP_ARRAY(COMP_CPU("DL10")),
  94		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
  95		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
  96
  97SND_SOC_DAILINK_DEFS(playback11,
  98		     DAILINK_COMP_ARRAY(COMP_CPU("DL11")),
  99		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
 100		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
 101
 102SND_SOC_DAILINK_DEFS(capture1,
 103		     DAILINK_COMP_ARRAY(COMP_CPU("UL1")),
 104		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
 105		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
 106
 107SND_SOC_DAILINK_DEFS(capture2,
 108		     DAILINK_COMP_ARRAY(COMP_CPU("UL2")),
 109		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
 110		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
 111
 112SND_SOC_DAILINK_DEFS(capture3,
 113		     DAILINK_COMP_ARRAY(COMP_CPU("UL3")),
 114		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
 115		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
 116
 117SND_SOC_DAILINK_DEFS(capture4,
 118		     DAILINK_COMP_ARRAY(COMP_CPU("UL4")),
 119		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
 120		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
 121
 122SND_SOC_DAILINK_DEFS(capture5,
 123		     DAILINK_COMP_ARRAY(COMP_CPU("UL5")),
 124		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
 125		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
 126
 127SND_SOC_DAILINK_DEFS(capture6,
 128		     DAILINK_COMP_ARRAY(COMP_CPU("UL6")),
 129		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
 130		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
 131
 132SND_SOC_DAILINK_DEFS(capture8,
 133		     DAILINK_COMP_ARRAY(COMP_CPU("UL8")),
 134		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
 135		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
 136
 137SND_SOC_DAILINK_DEFS(capture9,
 138		     DAILINK_COMP_ARRAY(COMP_CPU("UL9")),
 139		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
 140		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
 141
 142SND_SOC_DAILINK_DEFS(capture10,
 143		     DAILINK_COMP_ARRAY(COMP_CPU("UL10")),
 144		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
 145		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
 146
 147/* BE */
 148SND_SOC_DAILINK_DEFS(dl_src,
 149		     DAILINK_COMP_ARRAY(COMP_CPU("DL_SRC")),
 150		     DAILINK_COMP_ARRAY(COMP_CODEC("mt6359-sound",
 151						   "mt6359-snd-codec-aif1")),
 152		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
 153
 154SND_SOC_DAILINK_DEFS(DMIC_BE,
 155		     DAILINK_COMP_ARRAY(COMP_CPU("DMIC")),
 156		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
 157		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
 158
 159SND_SOC_DAILINK_DEFS(dptx,
 160		     DAILINK_COMP_ARRAY(COMP_CPU("DPTX")),
 161		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
 162		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
 163
 164SND_SOC_DAILINK_DEFS(etdm1_in,
 165		     DAILINK_COMP_ARRAY(COMP_CPU("ETDM1_IN")),
 166		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
 167		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
 168
 169SND_SOC_DAILINK_DEFS(etdm2_in,
 170		     DAILINK_COMP_ARRAY(COMP_CPU("ETDM2_IN")),
 171		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
 172		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
 173
 174SND_SOC_DAILINK_DEFS(etdm1_out,
 175		     DAILINK_COMP_ARRAY(COMP_CPU("ETDM1_OUT")),
 176		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
 177		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
 178
 179SND_SOC_DAILINK_DEFS(etdm2_out,
 180		     DAILINK_COMP_ARRAY(COMP_CPU("ETDM2_OUT")),
 181		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
 182		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
 183
 184SND_SOC_DAILINK_DEFS(etdm3_out,
 185		     DAILINK_COMP_ARRAY(COMP_CPU("ETDM3_OUT")),
 186		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
 187		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
 188
 189SND_SOC_DAILINK_DEFS(pcm1,
 190		     DAILINK_COMP_ARRAY(COMP_CPU("PCM1")),
 191		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
 192		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
 193
 194SND_SOC_DAILINK_DEFS(ul_src,
 195		     DAILINK_COMP_ARRAY(COMP_CPU("UL_SRC")),
 196		     DAILINK_COMP_ARRAY(COMP_CODEC("mt6359-sound",
 197						   "mt6359-snd-codec-aif1")),
 198		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
 199
 200SND_SOC_DAILINK_DEFS(AFE_SOF_DL2,
 201		     DAILINK_COMP_ARRAY(COMP_CPU("SOF_DL2")),
 202		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
 203		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
 204
 205SND_SOC_DAILINK_DEFS(AFE_SOF_DL3,
 206		     DAILINK_COMP_ARRAY(COMP_CPU("SOF_DL3")),
 207		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
 208		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
 209
 210SND_SOC_DAILINK_DEFS(AFE_SOF_UL4,
 211		     DAILINK_COMP_ARRAY(COMP_CPU("SOF_UL4")),
 212		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
 213		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
 214
 215SND_SOC_DAILINK_DEFS(AFE_SOF_UL5,
 216		     DAILINK_COMP_ARRAY(COMP_CPU("SOF_UL5")),
 217		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
 218		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
 219
 220static const struct sof_conn_stream g_sof_conn_streams[] = {
 221	{
 222		.sof_link = "AFE_SOF_DL2",
 223		.sof_dma = SOF_DMA_DL2,
 224		.stream_dir = SNDRV_PCM_STREAM_PLAYBACK
 225	},
 226	{
 227		.sof_link = "AFE_SOF_DL3",
 228		.sof_dma = SOF_DMA_DL3,
 229		.stream_dir = SNDRV_PCM_STREAM_PLAYBACK
 230	},
 231	{
 232		.sof_link = "AFE_SOF_UL4",
 233		.sof_dma = SOF_DMA_UL4,
 234		.stream_dir = SNDRV_PCM_STREAM_CAPTURE
 235	},
 236	{
 237		.sof_link = "AFE_SOF_UL5",
 238		.sof_dma = SOF_DMA_UL5,
 239		.stream_dir = SNDRV_PCM_STREAM_CAPTURE
 240	},
 241};
 242
 243enum mt8188_jacks {
 244	MT8188_JACK_HEADSET,
 245	MT8188_JACK_DP,
 246	MT8188_JACK_HDMI,
 247	MT8188_JACK_MAX,
 248};
 249
 250static struct snd_soc_jack_pin mt8188_hdmi_jack_pins[] = {
 251	{
 252		.pin = "HDMI",
 253		.mask = SND_JACK_AVOUT,
 254	},
 255};
 256
 257static struct snd_soc_jack_pin mt8188_dp_jack_pins[] = {
 258	{
 259		.pin = "DP",
 260		.mask = SND_JACK_AVOUT,
 261	},
 262};
 263
 264static struct snd_soc_jack_pin nau8825_jack_pins[] = {
 265	{
 266		.pin    = "Headphone Jack",
 267		.mask   = SND_JACK_HEADPHONE,
 268	},
 269	{
 270		.pin    = "Headset Mic",
 271		.mask   = SND_JACK_MICROPHONE,
 272	},
 273};
 274
 275static struct snd_soc_jack_pin mt8188_headset_jack_pins[] = {
 276	{
 277		.pin    = "Headphone",
 278		.mask   = SND_JACK_HEADPHONE,
 279	},
 280	{
 281		.pin    = "Headset Mic",
 282		.mask   = SND_JACK_MICROPHONE,
 283	},
 284};
 285
 286static const struct snd_kcontrol_new mt8188_dumb_spk_controls[] = {
 287	SOC_DAPM_PIN_SWITCH("Ext Spk"),
 288};
 289
 290static const struct snd_soc_dapm_widget mt8188_dumb_spk_widgets[] = {
 291	SND_SOC_DAPM_SPK("Ext Spk", NULL),
 292};
 293
 294static const struct snd_kcontrol_new mt8188_dual_spk_controls[] = {
 295	SOC_DAPM_PIN_SWITCH("Left Spk"),
 296	SOC_DAPM_PIN_SWITCH("Right Spk"),
 297};
 298
 299static const struct snd_soc_dapm_widget mt8188_dual_spk_widgets[] = {
 300	SND_SOC_DAPM_SPK("Left Spk", NULL),
 301	SND_SOC_DAPM_SPK("Right Spk", NULL),
 302};
 303
 304static const struct snd_kcontrol_new mt8188_rear_spk_controls[] = {
 305	SOC_DAPM_PIN_SWITCH("Rear Left Spk"),
 306	SOC_DAPM_PIN_SWITCH("Rear Right Spk"),
 307};
 308
 309static const struct snd_soc_dapm_widget mt8188_rear_spk_widgets[] = {
 310	SND_SOC_DAPM_SPK("Rear Left Spk", NULL),
 311	SND_SOC_DAPM_SPK("Rear Right Spk", NULL),
 312};
 313
 314static const struct snd_soc_dapm_widget mt8188_mt6359_widgets[] = {
 315	SND_SOC_DAPM_HP("Headphone", NULL),
 316	SND_SOC_DAPM_MIC("Headset Mic", NULL),
 317	SND_SOC_DAPM_MIC("AP DMIC", NULL),
 318	SND_SOC_DAPM_SINK("HDMI"),
 319	SND_SOC_DAPM_SINK("DP"),
 320	SND_SOC_DAPM_MIXER(SOF_DMA_DL2, SND_SOC_NOPM, 0, 0, NULL, 0),
 321	SND_SOC_DAPM_MIXER(SOF_DMA_DL3, SND_SOC_NOPM, 0, 0, NULL, 0),
 322	SND_SOC_DAPM_MIXER(SOF_DMA_UL4, SND_SOC_NOPM, 0, 0, NULL, 0),
 323	SND_SOC_DAPM_MIXER(SOF_DMA_UL5, SND_SOC_NOPM, 0, 0, NULL, 0),
 324
 325	/* dynamic pinctrl */
 326	SND_SOC_DAPM_PINCTRL("ETDM_SPK_PIN", "aud_etdm_spk_on", "aud_etdm_spk_off"),
 327	SND_SOC_DAPM_PINCTRL("ETDM_HP_PIN", "aud_etdm_hp_on", "aud_etdm_hp_off"),
 328	SND_SOC_DAPM_PINCTRL("MTKAIF_PIN", "aud_mtkaif_on", "aud_mtkaif_off"),
 329};
 330
 331static const struct snd_kcontrol_new mt8188_mt6359_controls[] = {
 332	SOC_DAPM_PIN_SWITCH("Headphone"),
 333	SOC_DAPM_PIN_SWITCH("Headset Mic"),
 334};
 335
 336static const struct snd_soc_dapm_widget mt8188_nau8825_widgets[] = {
 337	SND_SOC_DAPM_HP("Headphone Jack", NULL),
 338};
 339
 340static const struct snd_kcontrol_new mt8188_nau8825_controls[] = {
 341	SOC_DAPM_PIN_SWITCH("Headphone Jack"),
 342};
 343
 344static const struct snd_soc_dapm_route mt8188_mt6359_routes[] = {
 345	/* SOF Uplink */
 346	{SOF_DMA_UL4, NULL, "O034"},
 347	{SOF_DMA_UL4, NULL, "O035"},
 348	{SOF_DMA_UL5, NULL, "O036"},
 349	{SOF_DMA_UL5, NULL, "O037"},
 350	/* SOF Downlink */
 351	{"I070", NULL, SOF_DMA_DL2},
 352	{"I071", NULL, SOF_DMA_DL2},
 353	{"I020", NULL, SOF_DMA_DL3},
 354	{"I021", NULL, SOF_DMA_DL3},
 355};
 356
 357static int mt8188_mt6359_mtkaif_calibration(struct snd_soc_pcm_runtime *rtd)
 358{
 359	struct snd_soc_component *cmpnt_afe =
 360		snd_soc_rtdcom_lookup(rtd, AFE_PCM_NAME);
 361	struct snd_soc_component *cmpnt_codec =
 362		snd_soc_rtd_to_codec(rtd, 0)->component;
 363	struct snd_soc_dapm_widget *pin_w = NULL, *w;
 364	struct mtk_base_afe *afe;
 365	struct mt8188_afe_private *afe_priv;
 366	struct mtkaif_param *param;
 367	int chosen_phase_1, chosen_phase_2;
 368	int prev_cycle_1, prev_cycle_2;
 369	u8 test_done_1, test_done_2;
 370	int cycle_1, cycle_2;
 371	int mtkaif_chosen_phase[MT8188_MTKAIF_MISO_NUM];
 372	int mtkaif_phase_cycle[MT8188_MTKAIF_MISO_NUM];
 373	int mtkaif_calibration_num_phase;
 374	bool mtkaif_calibration_ok;
 375	u32 monitor = 0;
 376	int counter;
 377	int phase;
 378	int i;
 379
 380	if (!cmpnt_afe)
 381		return -EINVAL;
 382
 383	afe = snd_soc_component_get_drvdata(cmpnt_afe);
 384	afe_priv = afe->platform_priv;
 385	param = &afe_priv->mtkaif_params;
 386
 387	dev_dbg(afe->dev, "%s(), start\n", __func__);
 388
 389	param->mtkaif_calibration_ok = false;
 390	for (i = 0; i < MT8188_MTKAIF_MISO_NUM; i++) {
 391		param->mtkaif_chosen_phase[i] = -1;
 392		param->mtkaif_phase_cycle[i] = 0;
 393		mtkaif_chosen_phase[i] = -1;
 394		mtkaif_phase_cycle[i] = 0;
 395	}
 396
 397	if (IS_ERR(afe_priv->topckgen)) {
 398		dev_info(afe->dev, "%s() Cannot find topckgen controller\n",
 399			 __func__);
 400		return 0;
 401	}
 402
 403	for_each_card_widgets(rtd->card, w) {
 404		if (!strcmp(w->name, "MTKAIF_PIN")) {
 405			pin_w = w;
 406			break;
 407		}
 408	}
 409
 410	if (pin_w)
 411		snd_soc_dapm_pinctrl_event(pin_w, NULL, SND_SOC_DAPM_PRE_PMU);
 412	else
 413		dev_dbg(afe->dev, "%s(), no pinmux widget, please check if default on\n", __func__);
 414
 415	pm_runtime_get_sync(afe->dev);
 416	mt6359_mtkaif_calibration_enable(cmpnt_codec);
 417
 418	/* set test type to synchronizer pulse */
 419	regmap_write(afe_priv->topckgen, CKSYS_AUD_TOP_CFG, RG_TEST_TYPE);
 420	mtkaif_calibration_num_phase = 42;	/* mt6359: 0 ~ 42 */
 421	mtkaif_calibration_ok = true;
 422
 423	for (phase = 0;
 424	     phase <= mtkaif_calibration_num_phase && mtkaif_calibration_ok;
 425	     phase++) {
 426		mt6359_set_mtkaif_calibration_phase(cmpnt_codec,
 427						    phase, phase, phase);
 428
 429		regmap_set_bits(afe_priv->topckgen, CKSYS_AUD_TOP_CFG, RG_TEST_ON);
 430
 431		test_done_1 = 0;
 432		test_done_2 = 0;
 433
 434		cycle_1 = -1;
 435		cycle_2 = -1;
 436
 437		counter = 0;
 438		while (!(test_done_1 & test_done_2)) {
 439			regmap_read(afe_priv->topckgen,
 440				    CKSYS_AUD_TOP_MON, &monitor);
 441			test_done_1 = FIELD_GET(TEST_MISO_DONE_1, monitor);
 442			test_done_2 = FIELD_GET(TEST_MISO_DONE_2, monitor);
 443
 444			if (test_done_1 == 1)
 445				cycle_1 = FIELD_GET(TEST_MISO_COUNT_1, monitor);
 446
 447			if (test_done_2 == 1)
 448				cycle_2 = FIELD_GET(TEST_MISO_COUNT_2, monitor);
 449
 450			/* handle if never test done */
 451			if (++counter > 10000) {
 452				dev_err(afe->dev, "%s(), test fail, cycle_1 %d, cycle_2 %d, monitor 0x%x\n",
 453					__func__, cycle_1, cycle_2, monitor);
 454				mtkaif_calibration_ok = false;
 455				break;
 456			}
 457		}
 458
 459		if (phase == 0) {
 460			prev_cycle_1 = cycle_1;
 461			prev_cycle_2 = cycle_2;
 462		}
 463
 464		if (cycle_1 != prev_cycle_1 &&
 465		    mtkaif_chosen_phase[MT8188_MTKAIF_MISO_0] < 0) {
 466			mtkaif_chosen_phase[MT8188_MTKAIF_MISO_0] = phase - 1;
 467			mtkaif_phase_cycle[MT8188_MTKAIF_MISO_0] = prev_cycle_1;
 468		}
 469
 470		if (cycle_2 != prev_cycle_2 &&
 471		    mtkaif_chosen_phase[MT8188_MTKAIF_MISO_1] < 0) {
 472			mtkaif_chosen_phase[MT8188_MTKAIF_MISO_1] = phase - 1;
 473			mtkaif_phase_cycle[MT8188_MTKAIF_MISO_1] = prev_cycle_2;
 474		}
 475
 476		regmap_clear_bits(afe_priv->topckgen, CKSYS_AUD_TOP_CFG, RG_TEST_ON);
 477
 478		if (mtkaif_chosen_phase[MT8188_MTKAIF_MISO_0] >= 0 &&
 479		    mtkaif_chosen_phase[MT8188_MTKAIF_MISO_1] >= 0)
 480			break;
 481	}
 482
 483	if (mtkaif_chosen_phase[MT8188_MTKAIF_MISO_0] < 0) {
 484		mtkaif_calibration_ok = false;
 485		chosen_phase_1 = 0;
 486	} else {
 487		chosen_phase_1 = mtkaif_chosen_phase[MT8188_MTKAIF_MISO_0];
 488	}
 489
 490	if (mtkaif_chosen_phase[MT8188_MTKAIF_MISO_1] < 0) {
 491		mtkaif_calibration_ok = false;
 492		chosen_phase_2 = 0;
 493	} else {
 494		chosen_phase_2 = mtkaif_chosen_phase[MT8188_MTKAIF_MISO_1];
 495	}
 496
 497	mt6359_set_mtkaif_calibration_phase(cmpnt_codec,
 498					    chosen_phase_1,
 499					    chosen_phase_2,
 500					    0);
 501
 502	mt6359_mtkaif_calibration_disable(cmpnt_codec);
 503	pm_runtime_put(afe->dev);
 504
 505	param->mtkaif_calibration_ok = mtkaif_calibration_ok;
 506	param->mtkaif_chosen_phase[MT8188_MTKAIF_MISO_0] = chosen_phase_1;
 507	param->mtkaif_chosen_phase[MT8188_MTKAIF_MISO_1] = chosen_phase_2;
 508
 509	for (i = 0; i < MT8188_MTKAIF_MISO_NUM; i++)
 510		param->mtkaif_phase_cycle[i] = mtkaif_phase_cycle[i];
 511
 512	if (pin_w)
 513		snd_soc_dapm_pinctrl_event(pin_w, NULL, SND_SOC_DAPM_POST_PMD);
 514
 515	dev_dbg(afe->dev, "%s(), end, calibration ok %d\n",
 516		__func__, param->mtkaif_calibration_ok);
 517
 518	return 0;
 519}
 520
 521static int mt8188_mt6359_accdet_init(struct snd_soc_pcm_runtime *rtd)
 522{
 523	struct mtk_soc_card_data *soc_card_data = snd_soc_card_get_drvdata(rtd->card);
 524	struct snd_soc_jack *jack = &soc_card_data->card_data->jacks[MT8188_JACK_HEADSET];
 525	int ret;
 526
 527	if (!soc_card_data->accdet)
 528		return 0;
 529
 530	ret = snd_soc_card_jack_new_pins(rtd->card, "Headset Jack",
 531				   SND_JACK_HEADSET | SND_JACK_BTN_0 |
 532				   SND_JACK_BTN_1 | SND_JACK_BTN_2 |
 533				   SND_JACK_BTN_3,
 534				   jack, mt8188_headset_jack_pins,
 535				   ARRAY_SIZE(mt8188_headset_jack_pins));
 536	if (ret) {
 537		dev_err(rtd->dev, "Headset Jack create failed: %d\n", ret);
 538		return ret;
 539	}
 540
 541	ret = mt6359_accdet_enable_jack_detect(soc_card_data->accdet, jack);
 542	if (ret) {
 543		dev_err(rtd->dev, "Headset Jack enable failed: %d\n", ret);
 544		return ret;
 545	}
 546
 547	return 0;
 548}
 549
 550static int mt8188_mt6359_init(struct snd_soc_pcm_runtime *rtd)
 551{
 552	struct snd_soc_component *cmpnt_codec =
 553		snd_soc_rtd_to_codec(rtd, 0)->component;
 554
 555	/* set mtkaif protocol */
 556	mt6359_set_mtkaif_protocol(cmpnt_codec,
 557				   MT6359_MTKAIF_PROTOCOL_2_CLK_P2);
 558
 559	/* mtkaif calibration */
 560	mt8188_mt6359_mtkaif_calibration(rtd);
 561
 562	mt8188_mt6359_accdet_init(rtd);
 563
 564	return 0;
 565}
 566
 567enum {
 568	DAI_LINK_DL2_FE,
 569	DAI_LINK_DL3_FE,
 570	DAI_LINK_DL6_FE,
 571	DAI_LINK_DL7_FE,
 572	DAI_LINK_DL8_FE,
 573	DAI_LINK_DL10_FE,
 574	DAI_LINK_DL11_FE,
 575	DAI_LINK_UL1_FE,
 576	DAI_LINK_UL2_FE,
 577	DAI_LINK_UL3_FE,
 578	DAI_LINK_UL4_FE,
 579	DAI_LINK_UL5_FE,
 580	DAI_LINK_UL6_FE,
 581	DAI_LINK_UL8_FE,
 582	DAI_LINK_UL9_FE,
 583	DAI_LINK_UL10_FE,
 584	DAI_LINK_DL_SRC_BE,
 585	DAI_LINK_DMIC_BE,
 586	DAI_LINK_DPTX_BE,
 587	DAI_LINK_ETDM1_IN_BE,
 588	DAI_LINK_ETDM2_IN_BE,
 589	DAI_LINK_ETDM1_OUT_BE,
 590	DAI_LINK_ETDM2_OUT_BE,
 591	DAI_LINK_ETDM3_OUT_BE,
 592	DAI_LINK_PCM1_BE,
 593	DAI_LINK_UL_SRC_BE,
 594	DAI_LINK_REGULAR_LAST = DAI_LINK_UL_SRC_BE,
 595	DAI_LINK_SOF_START,
 596	DAI_LINK_SOF_DL2_BE = DAI_LINK_SOF_START,
 597	DAI_LINK_SOF_DL3_BE,
 598	DAI_LINK_SOF_UL4_BE,
 599	DAI_LINK_SOF_UL5_BE,
 600	DAI_LINK_SOF_END = DAI_LINK_SOF_UL5_BE,
 601};
 602
 603#define	DAI_LINK_REGULAR_NUM	(DAI_LINK_REGULAR_LAST + 1)
 604
 605static int mt8188_dptx_hw_params(struct snd_pcm_substream *substream,
 606				 struct snd_pcm_hw_params *params)
 607{
 608	struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
 609	unsigned int rate = params_rate(params);
 610	unsigned int mclk_fs_ratio = 256;
 611	unsigned int mclk_fs = rate * mclk_fs_ratio;
 612	struct snd_soc_dai *dai = snd_soc_rtd_to_cpu(rtd, 0);
 613
 614	return snd_soc_dai_set_sysclk(dai, 0, mclk_fs, SND_SOC_CLOCK_OUT);
 615}
 616
 617static const struct snd_soc_ops mt8188_dptx_ops = {
 618	.hw_params = mt8188_dptx_hw_params,
 619};
 620
 621static int mt8188_dptx_hw_params_fixup(struct snd_soc_pcm_runtime *rtd,
 622				       struct snd_pcm_hw_params *params)
 623{
 624	/* fix BE i2s format to 32bit, clean param mask first */
 625	snd_mask_reset_range(hw_param_mask(params, SNDRV_PCM_HW_PARAM_FORMAT),
 626			     0, (__force unsigned int)SNDRV_PCM_FORMAT_LAST);
 627
 628	params_set_format(params, SNDRV_PCM_FORMAT_S32_LE);
 629
 630	return 0;
 631}
 632
 633static int mt8188_hdmi_codec_init(struct snd_soc_pcm_runtime *rtd)
 634{
 635	struct mtk_soc_card_data *soc_card_data = snd_soc_card_get_drvdata(rtd->card);
 636	struct snd_soc_jack *jack = &soc_card_data->card_data->jacks[MT8188_JACK_HDMI];
 637	struct snd_soc_component *component = snd_soc_rtd_to_codec(rtd, 0)->component;
 638	int ret = 0;
 639
 640	ret = snd_soc_card_jack_new_pins(rtd->card, "HDMI Jack",
 641					 SND_JACK_AVOUT, jack,
 642					 mt8188_hdmi_jack_pins,
 643					 ARRAY_SIZE(mt8188_hdmi_jack_pins));
 644	if (ret) {
 645		dev_err(rtd->dev, "%s, new jack failed: %d\n", __func__, ret);
 646		return ret;
 647	}
 648
 649	ret = snd_soc_component_set_jack(component, jack, NULL);
 650	if (ret) {
 651		dev_err(rtd->dev, "%s, set jack failed on %s (ret=%d)\n",
 652			__func__, component->name, ret);
 653		return ret;
 654	}
 655
 656	return 0;
 657}
 658
 659static int mt8188_dptx_codec_init(struct snd_soc_pcm_runtime *rtd)
 660{
 661	struct mtk_soc_card_data *soc_card_data = snd_soc_card_get_drvdata(rtd->card);
 662	struct snd_soc_jack *jack = &soc_card_data->card_data->jacks[MT8188_JACK_DP];
 663	struct snd_soc_component *component = snd_soc_rtd_to_codec(rtd, 0)->component;
 664	int ret = 0;
 665
 666	ret = snd_soc_card_jack_new_pins(rtd->card, "DP Jack", SND_JACK_AVOUT,
 667					 jack, mt8188_dp_jack_pins,
 668					 ARRAY_SIZE(mt8188_dp_jack_pins));
 669	if (ret) {
 670		dev_err(rtd->dev, "%s, new jack failed: %d\n", __func__, ret);
 671		return ret;
 672	}
 673
 674	ret = snd_soc_component_set_jack(component, jack, NULL);
 675	if (ret) {
 676		dev_err(rtd->dev, "%s, set jack failed on %s (ret=%d)\n",
 677			__func__, component->name, ret);
 678		return ret;
 679	}
 680
 681	return 0;
 682}
 683
 684static int mt8188_dumb_amp_init(struct snd_soc_pcm_runtime *rtd)
 685{
 686	struct snd_soc_card *card = rtd->card;
 687	struct snd_soc_dapm_context *dapm = snd_soc_card_to_dapm(card);
 688	int ret = 0;
 689
 690	ret = snd_soc_dapm_new_controls(dapm, mt8188_dumb_spk_widgets,
 691					ARRAY_SIZE(mt8188_dumb_spk_widgets));
 692	if (ret) {
 693		dev_err(rtd->dev, "unable to add Dumb Speaker dapm, ret %d\n", ret);
 694		return ret;
 695	}
 696
 697	ret = snd_soc_add_card_controls(card, mt8188_dumb_spk_controls,
 698					ARRAY_SIZE(mt8188_dumb_spk_controls));
 699	if (ret) {
 700		dev_err(rtd->dev, "unable to add Dumb card controls, ret %d\n", ret);
 701		return ret;
 702	}
 703
 704	return 0;
 705}
 706
 707static int mt8188_max98390_hw_params(struct snd_pcm_substream *substream,
 708				     struct snd_pcm_hw_params *params)
 709{
 710	struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
 711	unsigned int bit_width = params_width(params);
 712	struct snd_soc_dai *cpu_dai = snd_soc_rtd_to_cpu(rtd, 0);
 713	struct snd_soc_dai *codec_dai;
 714	int i;
 715
 716	snd_soc_dai_set_tdm_slot(cpu_dai, 0xf, 0xf, 4, bit_width);
 717
 718	for_each_rtd_codec_dais(rtd, i, codec_dai) {
 719		if (!strcmp(codec_dai->component->name, MAX98390_DEV0_NAME))
 720			snd_soc_dai_set_tdm_slot(codec_dai, 0x8, 0x3, 4, bit_width);
 721
 722		if (!strcmp(codec_dai->component->name, MAX98390_DEV1_NAME))
 723			snd_soc_dai_set_tdm_slot(codec_dai, 0x4, 0x3, 4, bit_width);
 724
 725		if (!strcmp(codec_dai->component->name, MAX98390_DEV2_NAME))
 726			snd_soc_dai_set_tdm_slot(codec_dai, 0x2, 0x3, 4, bit_width);
 727
 728		if (!strcmp(codec_dai->component->name, MAX98390_DEV3_NAME))
 729			snd_soc_dai_set_tdm_slot(codec_dai, 0x1, 0x3, 4, bit_width);
 730	}
 731	return 0;
 732}
 733
 734static const struct snd_soc_ops mt8188_max98390_ops = {
 735	.hw_params = mt8188_max98390_hw_params,
 736};
 737
 738static int mt8188_max98390_codec_init(struct snd_soc_pcm_runtime *rtd)
 739{
 740	struct snd_soc_card *card = rtd->card;
 741	struct snd_soc_dapm_context *dapm = snd_soc_card_to_dapm(card);
 742	int ret;
 743
 744	/* add regular speakers dapm route */
 745	ret = snd_soc_dapm_new_controls(dapm, mt8188_dual_spk_widgets,
 746					ARRAY_SIZE(mt8188_dual_spk_widgets));
 747	if (ret) {
 748		dev_err(rtd->dev, "unable to add Left/Right Speaker widget, ret %d\n", ret);
 749		return ret;
 750	}
 751
 752	ret = snd_soc_add_card_controls(card, mt8188_dual_spk_controls,
 753					ARRAY_SIZE(mt8188_dual_spk_controls));
 754	if (ret) {
 755		dev_err(rtd->dev, "unable to add Left/Right card controls, ret %d\n", ret);
 756		return ret;
 757	}
 758
 759	if (rtd->dai_link->num_codecs <= 2)
 760		return 0;
 761
 762	/* add widgets/controls/dapm for rear speakers */
 763	ret = snd_soc_dapm_new_controls(dapm, mt8188_rear_spk_widgets,
 764					ARRAY_SIZE(mt8188_rear_spk_widgets));
 765	if (ret) {
 766		dev_err(rtd->dev, "unable to add Rear Speaker widget, ret %d\n", ret);
 767		/* Don't need to add routes if widget addition failed */
 768		return ret;
 769	}
 770
 771	ret = snd_soc_add_card_controls(card, mt8188_rear_spk_controls,
 772					ARRAY_SIZE(mt8188_rear_spk_controls));
 773	if (ret) {
 774		dev_err(rtd->dev, "unable to add Rear card controls, ret %d\n", ret);
 775		return ret;
 776	}
 777
 778	return 0;
 779}
 780
 781static int mt8188_headset_codec_init(struct snd_soc_pcm_runtime *rtd)
 782{
 783	struct snd_soc_card *card = rtd->card;
 784	struct snd_soc_dapm_context *dapm = snd_soc_card_to_dapm(card);
 785	struct mtk_soc_card_data *soc_card_data = snd_soc_card_get_drvdata(rtd->card);
 786	struct snd_soc_jack *jack = &soc_card_data->card_data->jacks[MT8188_JACK_HEADSET];
 787	struct snd_soc_component *component = snd_soc_rtd_to_codec(rtd, 0)->component;
 788	struct mtk_platform_card_data *card_data = soc_card_data->card_data;
 789	int ret;
 790
 791	ret = snd_soc_dapm_new_controls(dapm, mt8188_nau8825_widgets,
 792					ARRAY_SIZE(mt8188_nau8825_widgets));
 793	if (ret) {
 794		dev_err(rtd->dev, "unable to add nau8825 card widget, ret %d\n", ret);
 795		return ret;
 796	}
 797
 798	ret = snd_soc_add_card_controls(card, mt8188_nau8825_controls,
 799					ARRAY_SIZE(mt8188_nau8825_controls));
 800	if (ret) {
 801		dev_err(rtd->dev, "unable to add nau8825 card controls, ret %d\n", ret);
 802		return ret;
 803	}
 804
 805	ret = snd_soc_card_jack_new_pins(rtd->card, "Headset Jack",
 806					 SND_JACK_HEADSET | SND_JACK_BTN_0 |
 807					 SND_JACK_BTN_1 | SND_JACK_BTN_2 |
 808					 SND_JACK_BTN_3,
 809					 jack,
 810					 nau8825_jack_pins,
 811					 ARRAY_SIZE(nau8825_jack_pins));
 812	if (ret) {
 813		dev_err(rtd->dev, "Headset Jack creation failed: %d\n", ret);
 814		return ret;
 815	}
 816
 817	if (card_data->flags & ES8326_HS_PRESENT) {
 818		snd_jack_set_key(jack->jack, SND_JACK_BTN_0, KEY_PLAYPAUSE);
 819		snd_jack_set_key(jack->jack, SND_JACK_BTN_1, KEY_VOLUMEUP);
 820		snd_jack_set_key(jack->jack, SND_JACK_BTN_2, KEY_VOLUMEDOWN);
 821		snd_jack_set_key(jack->jack, SND_JACK_BTN_3, KEY_VOICECOMMAND);
 822	} else {
 823		snd_jack_set_key(jack->jack, SND_JACK_BTN_0, KEY_PLAYPAUSE);
 824		snd_jack_set_key(jack->jack, SND_JACK_BTN_1, KEY_VOICECOMMAND);
 825		snd_jack_set_key(jack->jack, SND_JACK_BTN_2, KEY_VOLUMEUP);
 826		snd_jack_set_key(jack->jack, SND_JACK_BTN_3, KEY_VOLUMEDOWN);
 827	}
 828
 829	ret = snd_soc_component_set_jack(component, jack, NULL);
 830
 831	if (ret) {
 832		dev_err(rtd->dev, "Headset Jack call-back failed: %d\n", ret);
 833		return ret;
 834	}
 835
 836	return 0;
 837};
 838
 839static void mt8188_headset_codec_exit(struct snd_soc_pcm_runtime *rtd)
 840{
 841	struct snd_soc_component *component = snd_soc_rtd_to_codec(rtd, 0)->component;
 842
 843	snd_soc_component_set_jack(component, NULL, NULL);
 844}
 845
 846
 847static int mt8188_nau8825_hw_params(struct snd_pcm_substream *substream,
 848				    struct snd_pcm_hw_params *params)
 849{
 850	struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
 851	struct snd_soc_dai *codec_dai = snd_soc_rtd_to_codec(rtd, 0);
 852	unsigned int rate = params_rate(params);
 853	unsigned int bit_width = params_width(params);
 854	int clk_freq, ret;
 855
 856	clk_freq = rate * 2 * bit_width;
 857
 858	/* Configure clock for codec */
 859	ret = snd_soc_dai_set_sysclk(codec_dai, NAU8825_CLK_FLL_BLK, 0,
 860				     SND_SOC_CLOCK_IN);
 861	if (ret < 0) {
 862		dev_err(codec_dai->dev, "can't set BCLK clock %d\n", ret);
 863		return ret;
 864	}
 865
 866	/* Configure pll for codec */
 867	ret = snd_soc_dai_set_pll(codec_dai, 0, 0, clk_freq,
 868				  params_rate(params) * 256);
 869	if (ret < 0) {
 870		dev_err(codec_dai->dev, "can't set BCLK: %d\n", ret);
 871		return ret;
 872	}
 873
 874	return 0;
 875}
 876
 877static const struct snd_soc_ops mt8188_nau8825_ops = {
 878	.hw_params = mt8188_nau8825_hw_params,
 879};
 880
 881static int mt8188_rt5682s_i2s_hw_params(struct snd_pcm_substream *substream,
 882					struct snd_pcm_hw_params *params)
 883{
 884	struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
 885	struct snd_soc_card *card = rtd->card;
 886	struct snd_soc_dai *cpu_dai = snd_soc_rtd_to_cpu(rtd, 0);
 887	struct snd_soc_dai *codec_dai = snd_soc_rtd_to_codec(rtd, 0);
 888	unsigned int rate = params_rate(params);
 889	int bitwidth;
 890	int ret;
 891
 892	bitwidth = snd_pcm_format_width(params_format(params));
 893	if (bitwidth < 0) {
 894		dev_err(card->dev, "invalid bit width: %d\n", bitwidth);
 895		return bitwidth;
 896	}
 897
 898	ret = snd_soc_dai_set_tdm_slot(codec_dai, 0x00, 0x0, 0x2, bitwidth);
 899	if (ret) {
 900		dev_err(card->dev, "failed to set tdm slot\n");
 901		return ret;
 902	}
 903
 904	ret = snd_soc_dai_set_pll(codec_dai, RT5682_PLL1, RT5682_PLL1_S_BCLK1,
 905				  rate * 32, rate * 512);
 906	if (ret) {
 907		dev_err(card->dev, "failed to set pll\n");
 908		return ret;
 909	}
 910
 911	ret = snd_soc_dai_set_sysclk(codec_dai, RT5682_SCLK_S_PLL1,
 912				     rate * 512, SND_SOC_CLOCK_IN);
 913	if (ret) {
 914		dev_err(card->dev, "failed to set sysclk\n");
 915		return ret;
 916	}
 917
 918	return snd_soc_dai_set_sysclk(cpu_dai, 0, rate * 128,
 919				      SND_SOC_CLOCK_OUT);
 920}
 921
 922static const struct snd_soc_ops mt8188_rt5682s_i2s_ops = {
 923	.hw_params = mt8188_rt5682s_i2s_hw_params,
 924};
 925
 926static int mt8188_sof_be_hw_params(struct snd_pcm_substream *substream,
 927				   struct snd_pcm_hw_params *params)
 928{
 929	struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
 930	struct snd_soc_component *cmpnt_afe = NULL;
 931	struct snd_soc_pcm_runtime *runtime;
 932
 933	/* find afe component */
 934	for_each_card_rtds(rtd->card, runtime) {
 935		cmpnt_afe = snd_soc_rtdcom_lookup(runtime, AFE_PCM_NAME);
 936		if (cmpnt_afe)
 937			break;
 938	}
 939
 940	if (cmpnt_afe && !pm_runtime_active(cmpnt_afe->dev)) {
 941		dev_err(rtd->dev, "afe pm runtime is not active!!\n");
 942		return -EINVAL;
 943	}
 944
 945	return 0;
 946}
 947
 948static const struct snd_soc_ops mt8188_sof_be_ops = {
 949	.hw_params = mt8188_sof_be_hw_params,
 950};
 951
 952static int mt8188_es8326_hw_params(struct snd_pcm_substream *substream,
 953				 struct snd_pcm_hw_params *params)
 954{
 955	struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
 956	struct snd_soc_dai *cpu_dai = snd_soc_rtd_to_cpu(rtd, 0);
 957	struct snd_soc_dai *codec_dai = snd_soc_rtd_to_codec(rtd, 0);
 958	unsigned int rate = params_rate(params);
 959	int ret;
 960
 961	/* Configure MCLK for codec */
 962	ret = snd_soc_dai_set_sysclk(codec_dai, 0, rate * 256, SND_SOC_CLOCK_IN);
 963	if (ret < 0) {
 964		dev_err(codec_dai->dev, "can't set MCLK %d\n", ret);
 965		return ret;
 966	}
 967
 968	/* Configure MCLK for cpu */
 969	return snd_soc_dai_set_sysclk(cpu_dai, 0, rate * 256, SND_SOC_CLOCK_OUT);
 970}
 971
 972static const struct snd_soc_ops mt8188_es8326_ops = {
 973	.hw_params = mt8188_es8326_hw_params,
 974};
 975
 976static struct snd_soc_dai_link mt8188_mt6359_dai_links[] = {
 977	/* FE */
 978	[DAI_LINK_DL2_FE] = {
 979		.name = "DL2_FE",
 980		.stream_name = "DL2 Playback",
 981		.trigger = {
 982			SND_SOC_DPCM_TRIGGER_POST,
 983			SND_SOC_DPCM_TRIGGER_POST,
 984		},
 985		.dynamic = 1,
 986		.playback_only = 1,
 987		.dpcm_merged_chan = 1,
 988		.dpcm_merged_rate = 1,
 989		.dpcm_merged_format = 1,
 990		SND_SOC_DAILINK_REG(playback2),
 991	},
 992	[DAI_LINK_DL3_FE] = {
 993		.name = "DL3_FE",
 994		.stream_name = "DL3 Playback",
 995		.trigger = {
 996			SND_SOC_DPCM_TRIGGER_POST,
 997			SND_SOC_DPCM_TRIGGER_POST,
 998		},
 999		.dynamic = 1,
1000		.playback_only = 1,
1001		.dpcm_merged_chan = 1,
1002		.dpcm_merged_rate = 1,
1003		.dpcm_merged_format = 1,
1004		SND_SOC_DAILINK_REG(playback3),
1005	},
1006	[DAI_LINK_DL6_FE] = {
1007		.name = "DL6_FE",
1008		.stream_name = "DL6 Playback",
1009		.trigger = {
1010			SND_SOC_DPCM_TRIGGER_POST,
1011			SND_SOC_DPCM_TRIGGER_POST,
1012		},
1013		.dynamic = 1,
1014		.playback_only = 1,
1015		.dpcm_merged_chan = 1,
1016		.dpcm_merged_rate = 1,
1017		.dpcm_merged_format = 1,
1018		SND_SOC_DAILINK_REG(playback6),
1019	},
1020	[DAI_LINK_DL7_FE] = {
1021		.name = "DL7_FE",
1022		.stream_name = "DL7 Playback",
1023		.trigger = {
1024			SND_SOC_DPCM_TRIGGER_PRE,
1025			SND_SOC_DPCM_TRIGGER_PRE,
1026		},
1027		.dynamic = 1,
1028		.playback_only = 1,
1029		SND_SOC_DAILINK_REG(playback7),
1030	},
1031	[DAI_LINK_DL8_FE] = {
1032		.name = "DL8_FE",
1033		.stream_name = "DL8 Playback",
1034		.trigger = {
1035			SND_SOC_DPCM_TRIGGER_POST,
1036			SND_SOC_DPCM_TRIGGER_POST,
1037		},
1038		.dynamic = 1,
1039		.playback_only = 1,
1040		SND_SOC_DAILINK_REG(playback8),
1041	},
1042	[DAI_LINK_DL10_FE] = {
1043		.name = "DL10_FE",
1044		.stream_name = "DL10 Playback",
1045		.trigger = {
1046			SND_SOC_DPCM_TRIGGER_POST,
1047			SND_SOC_DPCM_TRIGGER_POST,
1048		},
1049		.dynamic = 1,
1050		.playback_only = 1,
1051		SND_SOC_DAILINK_REG(playback10),
1052	},
1053	[DAI_LINK_DL11_FE] = {
1054		.name = "DL11_FE",
1055		.stream_name = "DL11 Playback",
1056		.trigger = {
1057			SND_SOC_DPCM_TRIGGER_POST,
1058			SND_SOC_DPCM_TRIGGER_POST,
1059		},
1060		.dynamic = 1,
1061		.playback_only = 1,
1062		SND_SOC_DAILINK_REG(playback11),
1063	},
1064	[DAI_LINK_UL1_FE] = {
1065		.name = "UL1_FE",
1066		.stream_name = "UL1 Capture",
1067		.trigger = {
1068			SND_SOC_DPCM_TRIGGER_PRE,
1069			SND_SOC_DPCM_TRIGGER_PRE,
1070		},
1071		.dynamic = 1,
1072		.capture_only = 1,
1073		SND_SOC_DAILINK_REG(capture1),
1074	},
1075	[DAI_LINK_UL2_FE] = {
1076		.name = "UL2_FE",
1077		.stream_name = "UL2 Capture",
1078		.trigger = {
1079			SND_SOC_DPCM_TRIGGER_POST,
1080			SND_SOC_DPCM_TRIGGER_POST,
1081		},
1082		.dynamic = 1,
1083		.capture_only = 1,
1084		SND_SOC_DAILINK_REG(capture2),
1085	},
1086	[DAI_LINK_UL3_FE] = {
1087		.name = "UL3_FE",
1088		.stream_name = "UL3 Capture",
1089		.trigger = {
1090			SND_SOC_DPCM_TRIGGER_POST,
1091			SND_SOC_DPCM_TRIGGER_POST,
1092		},
1093		.dynamic = 1,
1094		.capture_only = 1,
1095		SND_SOC_DAILINK_REG(capture3),
1096	},
1097	[DAI_LINK_UL4_FE] = {
1098		.name = "UL4_FE",
1099		.stream_name = "UL4 Capture",
1100		.trigger = {
1101			SND_SOC_DPCM_TRIGGER_POST,
1102			SND_SOC_DPCM_TRIGGER_POST,
1103		},
1104		.dynamic = 1,
1105		.capture_only = 1,
1106		.dpcm_merged_chan = 1,
1107		.dpcm_merged_rate = 1,
1108		.dpcm_merged_format = 1,
1109		SND_SOC_DAILINK_REG(capture4),
1110	},
1111	[DAI_LINK_UL5_FE] = {
1112		.name = "UL5_FE",
1113		.stream_name = "UL5 Capture",
1114		.trigger = {
1115			SND_SOC_DPCM_TRIGGER_POST,
1116			SND_SOC_DPCM_TRIGGER_POST,
1117		},
1118		.dynamic = 1,
1119		.capture_only = 1,
1120		.dpcm_merged_chan = 1,
1121		.dpcm_merged_rate = 1,
1122		.dpcm_merged_format = 1,
1123		SND_SOC_DAILINK_REG(capture5),
1124	},
1125	[DAI_LINK_UL6_FE] = {
1126		.name = "UL6_FE",
1127		.stream_name = "UL6 Capture",
1128		.trigger = {
1129			SND_SOC_DPCM_TRIGGER_PRE,
1130			SND_SOC_DPCM_TRIGGER_PRE,
1131		},
1132		.dynamic = 1,
1133		.capture_only = 1,
1134		SND_SOC_DAILINK_REG(capture6),
1135	},
1136	[DAI_LINK_UL8_FE] = {
1137		.name = "UL8_FE",
1138		.stream_name = "UL8 Capture",
1139		.trigger = {
1140			SND_SOC_DPCM_TRIGGER_POST,
1141			SND_SOC_DPCM_TRIGGER_POST,
1142		},
1143		.dynamic = 1,
1144		.capture_only = 1,
1145		SND_SOC_DAILINK_REG(capture8),
1146	},
1147	[DAI_LINK_UL9_FE] = {
1148		.name = "UL9_FE",
1149		.stream_name = "UL9 Capture",
1150		.trigger = {
1151			SND_SOC_DPCM_TRIGGER_POST,
1152			SND_SOC_DPCM_TRIGGER_POST,
1153		},
1154		.dynamic = 1,
1155		.capture_only = 1,
1156		SND_SOC_DAILINK_REG(capture9),
1157	},
1158	[DAI_LINK_UL10_FE] = {
1159		.name = "UL10_FE",
1160		.stream_name = "UL10 Capture",
1161		.trigger = {
1162			SND_SOC_DPCM_TRIGGER_POST,
1163			SND_SOC_DPCM_TRIGGER_POST,
1164		},
1165		.dynamic = 1,
1166		.capture_only = 1,
1167		SND_SOC_DAILINK_REG(capture10),
1168	},
1169	/* BE */
1170	[DAI_LINK_DL_SRC_BE] = {
1171		.name = "DL_SRC_BE",
1172		.no_pcm = 1,
1173		.playback_only = 1,
1174		SND_SOC_DAILINK_REG(dl_src),
1175	},
1176	[DAI_LINK_DMIC_BE] = {
1177		.name = "DMIC_BE",
1178		.no_pcm = 1,
1179		.capture_only = 1,
1180		.ignore_suspend = 1,
1181		SND_SOC_DAILINK_REG(DMIC_BE),
1182	},
1183	[DAI_LINK_DPTX_BE] = {
1184		.name = "DPTX_BE",
1185		.ops = &mt8188_dptx_ops,
1186		.be_hw_params_fixup = mt8188_dptx_hw_params_fixup,
1187		.no_pcm = 1,
1188		.playback_only = 1,
1189		SND_SOC_DAILINK_REG(dptx),
1190	},
1191	[DAI_LINK_ETDM1_IN_BE] = {
1192		.name = "ETDM1_IN_BE",
1193		.no_pcm = 1,
1194		.dai_fmt = SND_SOC_DAIFMT_I2S |
1195			SND_SOC_DAIFMT_NB_NF |
1196			SND_SOC_DAIFMT_CBP_CFP,
1197		.capture_only = 1,
1198		.ignore_suspend = 1,
1199		SND_SOC_DAILINK_REG(etdm1_in),
1200	},
1201	[DAI_LINK_ETDM2_IN_BE] = {
1202		.name = "ETDM2_IN_BE",
1203		.no_pcm = 1,
1204		.dai_fmt = SND_SOC_DAIFMT_I2S |
1205			SND_SOC_DAIFMT_NB_NF |
1206			SND_SOC_DAIFMT_CBP_CFP,
1207		.capture_only = 1,
1208		SND_SOC_DAILINK_REG(etdm2_in),
1209	},
1210	[DAI_LINK_ETDM1_OUT_BE] = {
1211		.name = "ETDM1_OUT_BE",
1212		.no_pcm = 1,
1213		.dai_fmt = SND_SOC_DAIFMT_I2S |
1214			SND_SOC_DAIFMT_NB_NF |
1215			SND_SOC_DAIFMT_CBC_CFC,
1216		.playback_only = 1,
1217		SND_SOC_DAILINK_REG(etdm1_out),
1218	},
1219	[DAI_LINK_ETDM2_OUT_BE] = {
1220		.name = "ETDM2_OUT_BE",
1221		.no_pcm = 1,
1222		.dai_fmt = SND_SOC_DAIFMT_I2S |
1223			SND_SOC_DAIFMT_NB_NF |
1224			SND_SOC_DAIFMT_CBC_CFC,
1225		.playback_only = 1,
1226		SND_SOC_DAILINK_REG(etdm2_out),
1227	},
1228	[DAI_LINK_ETDM3_OUT_BE] = {
1229		.name = "ETDM3_OUT_BE",
1230		.no_pcm = 1,
1231		.dai_fmt = SND_SOC_DAIFMT_I2S |
1232			SND_SOC_DAIFMT_NB_NF |
1233			SND_SOC_DAIFMT_CBC_CFC,
1234		.playback_only = 1,
1235		SND_SOC_DAILINK_REG(etdm3_out),
1236	},
1237	[DAI_LINK_PCM1_BE] = {
1238		.name = "PCM1_BE",
1239		.no_pcm = 1,
1240		.dai_fmt = SND_SOC_DAIFMT_I2S |
1241			SND_SOC_DAIFMT_NB_NF |
1242			SND_SOC_DAIFMT_CBC_CFC,
1243		SND_SOC_DAILINK_REG(pcm1),
1244	},
1245	[DAI_LINK_UL_SRC_BE] = {
1246		.name = "UL_SRC_BE",
1247		.no_pcm = 1,
1248		.capture_only = 1,
1249		SND_SOC_DAILINK_REG(ul_src),
1250	},
1251
1252	/* SOF BE */
1253	[DAI_LINK_SOF_DL2_BE] = {
1254		.name = "AFE_SOF_DL2",
1255		.no_pcm = 1,
1256		.playback_only = 1,
1257		.ops = &mt8188_sof_be_ops,
1258		SND_SOC_DAILINK_REG(AFE_SOF_DL2),
1259	},
1260	[DAI_LINK_SOF_DL3_BE] = {
1261		.name = "AFE_SOF_DL3",
1262		.no_pcm = 1,
1263		.playback_only = 1,
1264		.ops = &mt8188_sof_be_ops,
1265		SND_SOC_DAILINK_REG(AFE_SOF_DL3),
1266	},
1267	[DAI_LINK_SOF_UL4_BE] = {
1268		.name = "AFE_SOF_UL4",
1269		.no_pcm = 1,
1270		.capture_only = 1,
1271		.ops = &mt8188_sof_be_ops,
1272		SND_SOC_DAILINK_REG(AFE_SOF_UL4),
1273	},
1274	[DAI_LINK_SOF_UL5_BE] = {
1275		.name = "AFE_SOF_UL5",
1276		.no_pcm = 1,
1277		.capture_only = 1,
1278		.ops = &mt8188_sof_be_ops,
1279		SND_SOC_DAILINK_REG(AFE_SOF_UL5),
1280	},
1281};
1282
1283static void mt8188_fixup_controls(struct snd_soc_card *card)
1284{
1285	struct mtk_soc_card_data *soc_card_data = snd_soc_card_get_drvdata(card);
1286	struct mtk_platform_card_data *card_data = soc_card_data->card_data;
1287	struct snd_kcontrol *kctl;
1288
1289	if (card_data->flags & (NAU8825_HS_PRESENT | RT5682S_HS_PRESENT | ES8326_HS_PRESENT)) {
1290		struct snd_soc_dapm_widget *w, *next_w;
1291
1292		for_each_card_widgets_safe(card, w, next_w) {
1293			if (strcmp(w->name, "Headphone"))
1294				continue;
1295
1296			snd_soc_dapm_free_widget(w);
1297		}
1298
1299		kctl = snd_ctl_find_id_mixer(card->snd_card, "Headphone Switch");
1300		if (kctl)
1301			snd_ctl_remove(card->snd_card, kctl);
1302		else
1303			dev_warn(card->dev, "Cannot find ctl : Headphone Switch\n");
1304	}
1305}
1306
1307static struct snd_soc_card mt8188_mt6359_soc_card = {
1308	.owner = THIS_MODULE,
1309	.dai_link = mt8188_mt6359_dai_links,
1310	.num_links = ARRAY_SIZE(mt8188_mt6359_dai_links),
1311	.dapm_widgets = mt8188_mt6359_widgets,
1312	.num_dapm_widgets = ARRAY_SIZE(mt8188_mt6359_widgets),
1313	.dapm_routes = mt8188_mt6359_routes,
1314	.num_dapm_routes = ARRAY_SIZE(mt8188_mt6359_routes),
1315	.controls = mt8188_mt6359_controls,
1316	.num_controls = ARRAY_SIZE(mt8188_mt6359_controls),
1317	.fixup_controls = mt8188_fixup_controls,
1318};
1319
1320static int mt8188_mt6359_soc_card_probe(struct mtk_soc_card_data *soc_card_data, bool legacy)
1321{
1322	struct mtk_platform_card_data *card_data = soc_card_data->card_data;
1323	struct snd_soc_card *card = soc_card_data->card_data->card;
1324	struct snd_soc_dai_link *dai_link;
1325	bool init_mt6359 = false;
1326	bool init_es8326 = false;
1327	bool init_nau8825 = false;
1328	bool init_rt5682s = false;
1329	bool init_max98390 = false;
1330	bool init_dumb = false;
1331	int i;
1332
1333	if (legacy)
1334		return -EINVAL;
1335
1336	for_each_card_prelinks(card, i, dai_link) {
1337		if (strcmp(dai_link->name, "DPTX_BE") == 0) {
1338			if (dai_link->num_codecs &&
1339			    !snd_soc_dlc_is_dummy(dai_link->codecs))
1340				dai_link->init = mt8188_dptx_codec_init;
1341		} else if (strcmp(dai_link->name, "ETDM3_OUT_BE") == 0) {
1342			if (dai_link->num_codecs &&
1343			    !snd_soc_dlc_is_dummy(dai_link->codecs))
1344				dai_link->init = mt8188_hdmi_codec_init;
1345		} else if (strcmp(dai_link->name, "DL_SRC_BE") == 0 ||
1346			   strcmp(dai_link->name, "UL_SRC_BE") == 0) {
1347			if (!init_mt6359) {
1348				dai_link->init = mt8188_mt6359_init;
1349				init_mt6359 = true;
1350			}
1351		} else if (strcmp(dai_link->name, "ETDM1_OUT_BE") == 0 ||
1352			   strcmp(dai_link->name, "ETDM2_OUT_BE") == 0 ||
1353			   strcmp(dai_link->name, "ETDM1_IN_BE") == 0 ||
1354			   strcmp(dai_link->name, "ETDM2_IN_BE") == 0) {
1355			if (!dai_link->num_codecs)
1356				continue;
1357
1358			if (!strcmp(dai_link->codecs->dai_name, MAX98390_CODEC_DAI)) {
1359				/*
1360				 * The TDM protocol settings with fixed 4 slots are defined in
1361				 * mt8188_max98390_ops. Two amps is I2S mode,
1362				 * SOC and codec don't require TDM settings.
1363				 */
1364				if (!(card_data->flags & MAX98390_TWO_AMP)) {
1365					dai_link->ops = &mt8188_max98390_ops;
1366				}
1367				if (!init_max98390) {
1368					dai_link->init = mt8188_max98390_codec_init;
1369					init_max98390 = true;
1370				}
1371			} else if (!strcmp(dai_link->codecs->dai_name, NAU8825_CODEC_DAI)) {
1372				dai_link->ops = &mt8188_nau8825_ops;
1373				if (!init_nau8825) {
1374					dai_link->init = mt8188_headset_codec_init;
1375					dai_link->exit = mt8188_headset_codec_exit;
1376					init_nau8825 = true;
1377				}
1378			} else if (!strcmp(dai_link->codecs->dai_name, RT5682S_CODEC_DAI)) {
1379				dai_link->ops = &mt8188_rt5682s_i2s_ops;
1380				if (!init_rt5682s) {
1381					dai_link->init = mt8188_headset_codec_init;
1382					dai_link->exit = mt8188_headset_codec_exit;
1383					init_rt5682s = true;
1384				}
1385			} else if (!strcmp(dai_link->codecs->dai_name, ES8326_CODEC_DAI)) {
1386				dai_link->ops = &mt8188_es8326_ops;
1387				if (!init_es8326) {
1388					dai_link->init = mt8188_headset_codec_init;
1389					dai_link->exit = mt8188_headset_codec_exit;
1390					init_es8326 = true;
1391				}
1392			} else {
1393				if (!snd_soc_dlc_is_dummy(dai_link->codecs)) {
1394					if (!init_dumb) {
1395						dai_link->init = mt8188_dumb_amp_init;
1396						init_dumb = true;
1397					}
1398				}
1399			}
1400		}
1401	}
1402
1403	return 0;
1404}
1405
1406static const struct mtk_sof_priv mt8188_sof_priv = {
1407	.conn_streams = g_sof_conn_streams,
1408	.num_streams = ARRAY_SIZE(g_sof_conn_streams),
1409};
1410
1411static const struct mtk_soundcard_pdata mt8188_evb_card = {
1412	.card_name = "mt8188_mt6359",
1413	.card_data = &(struct mtk_platform_card_data) {
1414		.card = &mt8188_mt6359_soc_card,
1415		.num_jacks = MT8188_JACK_MAX,
1416	},
1417	.sof_priv = &mt8188_sof_priv,
1418	.soc_probe = mt8188_mt6359_soc_card_probe,
1419};
1420
1421static const struct mtk_soundcard_pdata mt8188_nau8825_card = {
1422	.card_name = "mt8188_nau8825",
1423	.card_data = &(struct mtk_platform_card_data) {
1424		.card = &mt8188_mt6359_soc_card,
1425		.num_jacks = MT8188_JACK_MAX,
1426		.flags = NAU8825_HS_PRESENT
1427	},
1428	.sof_priv = &mt8188_sof_priv,
1429	.soc_probe = mt8188_mt6359_soc_card_probe,
1430};
1431
1432static const struct mtk_soundcard_pdata mt8188_rt5682s_card = {
1433	.card_name = "mt8188_rt5682s",
1434	.card_data = &(struct mtk_platform_card_data) {
1435		.card = &mt8188_mt6359_soc_card,
1436		.num_jacks = MT8188_JACK_MAX,
1437		.flags = RT5682S_HS_PRESENT | MAX98390_TWO_AMP
1438	},
1439	.sof_priv = &mt8188_sof_priv,
1440	.soc_probe = mt8188_mt6359_soc_card_probe,
1441};
1442
1443static const struct mtk_soundcard_pdata mt8188_es8326_card = {
1444	.card_name = "mt8188_es8326",
1445	.card_data = &(struct mtk_platform_card_data) {
1446		.card = &mt8188_mt6359_soc_card,
1447		.num_jacks = MT8188_JACK_MAX,
1448		.flags = ES8326_HS_PRESENT | MAX98390_TWO_AMP
1449	},
1450	.sof_priv = &mt8188_sof_priv,
1451	.soc_probe = mt8188_mt6359_soc_card_probe,
1452};
1453
1454static const struct of_device_id mt8188_mt6359_dt_match[] = {
1455	{ .compatible = "mediatek,mt8188-mt6359-evb", .data = &mt8188_evb_card, },
1456	{ .compatible = "mediatek,mt8188-nau8825", .data = &mt8188_nau8825_card, },
1457	{ .compatible = "mediatek,mt8188-rt5682s", .data = &mt8188_rt5682s_card, },
1458	{ .compatible = "mediatek,mt8188-es8326", .data = &mt8188_es8326_card, },
1459	{ /* sentinel */ },
1460};
1461MODULE_DEVICE_TABLE(of, mt8188_mt6359_dt_match);
1462
1463static struct platform_driver mt8188_mt6359_driver = {
1464	.driver = {
1465		.name = "mt8188_mt6359",
1466		.of_match_table = mt8188_mt6359_dt_match,
1467		.pm = &snd_soc_pm_ops,
1468	},
1469	.probe = mtk_soundcard_common_probe,
1470};
1471
1472module_platform_driver(mt8188_mt6359_driver);
1473
1474/* Module information */
1475MODULE_DESCRIPTION("MT8188-MT6359 ALSA SoC machine driver");
1476MODULE_AUTHOR("Trevor Wu <trevor.wu@mediatek.com>");
1477MODULE_LICENSE("GPL");
1478MODULE_ALIAS("mt8188 mt6359 soc card");
~/ Read-only file preview.