brintos

brintos / linux-shallow public Read only

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