Path: blob/master/sound/soc/mediatek/mt8192/mt8192-dai-i2s.c
26488 views
// SPDX-License-Identifier: GPL-2.01//2// MediaTek ALSA SoC Audio DAI I2S Control3//4// Copyright (c) 2020 MediaTek Inc.5// Author: Shane Chien <[email protected]>6//78#include <linux/bitops.h>9#include <linux/regmap.h>10#include <sound/pcm_params.h>1112#include "mt8192-afe-clk.h"13#include "mt8192-afe-common.h"14#include "mt8192-afe-gpio.h"15#include "mt8192-interconnection.h"1617enum {18I2S_FMT_EIAJ = 0,19I2S_FMT_I2S = 1,20};2122enum {23I2S_WLEN_16_BIT = 0,24I2S_WLEN_32_BIT = 1,25};2627enum {28I2S_HD_NORMAL = 0,29I2S_HD_LOW_JITTER = 1,30};3132enum {33I2S1_SEL_O28_O29 = 0,34I2S1_SEL_O03_O04 = 1,35};3637enum {38I2S_IN_PAD_CONNSYS = 0,39I2S_IN_PAD_IO_MUX = 1,40};4142struct mtk_afe_i2s_priv {43int id;44int rate; /* for determine which apll to use */45int low_jitter_en;4647int share_i2s_id;4849int mclk_id;50int mclk_rate;51int mclk_apll;52};5354static unsigned int get_i2s_wlen(snd_pcm_format_t format)55{56return snd_pcm_format_physical_width(format) <= 16 ?57I2S_WLEN_16_BIT : I2S_WLEN_32_BIT;58}5960#define MTK_AFE_I2S0_KCONTROL_NAME "I2S0_HD_Mux"61#define MTK_AFE_I2S1_KCONTROL_NAME "I2S1_HD_Mux"62#define MTK_AFE_I2S2_KCONTROL_NAME "I2S2_HD_Mux"63#define MTK_AFE_I2S3_KCONTROL_NAME "I2S3_HD_Mux"64#define MTK_AFE_I2S5_KCONTROL_NAME "I2S5_HD_Mux"65#define MTK_AFE_I2S6_KCONTROL_NAME "I2S6_HD_Mux"66#define MTK_AFE_I2S7_KCONTROL_NAME "I2S7_HD_Mux"67#define MTK_AFE_I2S8_KCONTROL_NAME "I2S8_HD_Mux"68#define MTK_AFE_I2S9_KCONTROL_NAME "I2S9_HD_Mux"6970#define I2S0_HD_EN_W_NAME "I2S0_HD_EN"71#define I2S1_HD_EN_W_NAME "I2S1_HD_EN"72#define I2S2_HD_EN_W_NAME "I2S2_HD_EN"73#define I2S3_HD_EN_W_NAME "I2S3_HD_EN"74#define I2S5_HD_EN_W_NAME "I2S5_HD_EN"75#define I2S6_HD_EN_W_NAME "I2S6_HD_EN"76#define I2S7_HD_EN_W_NAME "I2S7_HD_EN"77#define I2S8_HD_EN_W_NAME "I2S8_HD_EN"78#define I2S9_HD_EN_W_NAME "I2S9_HD_EN"7980#define I2S0_MCLK_EN_W_NAME "I2S0_MCLK_EN"81#define I2S1_MCLK_EN_W_NAME "I2S1_MCLK_EN"82#define I2S2_MCLK_EN_W_NAME "I2S2_MCLK_EN"83#define I2S3_MCLK_EN_W_NAME "I2S3_MCLK_EN"84#define I2S5_MCLK_EN_W_NAME "I2S5_MCLK_EN"85#define I2S6_MCLK_EN_W_NAME "I2S6_MCLK_EN"86#define I2S7_MCLK_EN_W_NAME "I2S7_MCLK_EN"87#define I2S8_MCLK_EN_W_NAME "I2S8_MCLK_EN"88#define I2S9_MCLK_EN_W_NAME "I2S9_MCLK_EN"8990static int get_i2s_id_by_name(struct mtk_base_afe *afe,91const char *name)92{93if (strncmp(name, "I2S0", 4) == 0)94return MT8192_DAI_I2S_0;95else if (strncmp(name, "I2S1", 4) == 0)96return MT8192_DAI_I2S_1;97else if (strncmp(name, "I2S2", 4) == 0)98return MT8192_DAI_I2S_2;99else if (strncmp(name, "I2S3", 4) == 0)100return MT8192_DAI_I2S_3;101else if (strncmp(name, "I2S5", 4) == 0)102return MT8192_DAI_I2S_5;103else if (strncmp(name, "I2S6", 4) == 0)104return MT8192_DAI_I2S_6;105else if (strncmp(name, "I2S7", 4) == 0)106return MT8192_DAI_I2S_7;107else if (strncmp(name, "I2S8", 4) == 0)108return MT8192_DAI_I2S_8;109else if (strncmp(name, "I2S9", 4) == 0)110return MT8192_DAI_I2S_9;111else112return -EINVAL;113}114115static struct mtk_afe_i2s_priv *get_i2s_priv_by_name(struct mtk_base_afe *afe,116const char *name)117{118struct mt8192_afe_private *afe_priv = afe->platform_priv;119int dai_id = get_i2s_id_by_name(afe, name);120121if (dai_id < 0)122return NULL;123124return afe_priv->dai_priv[dai_id];125}126127/* low jitter control */128static const char * const mt8192_i2s_hd_str[] = {129"Normal", "Low_Jitter"130};131132static SOC_ENUM_SINGLE_EXT_DECL(mt8192_i2s_enum, mt8192_i2s_hd_str);133134static int mt8192_i2s_hd_get(struct snd_kcontrol *kcontrol,135struct snd_ctl_elem_value *ucontrol)136{137struct snd_soc_component *cmpnt = snd_soc_kcontrol_component(kcontrol);138struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);139struct mtk_afe_i2s_priv *i2s_priv;140141i2s_priv = get_i2s_priv_by_name(afe, kcontrol->id.name);142143if (!i2s_priv) {144dev_warn(afe->dev, "%s(), i2s_priv == NULL", __func__);145return -EINVAL;146}147148ucontrol->value.integer.value[0] = i2s_priv->low_jitter_en;149150return 0;151}152153static int mt8192_i2s_hd_set(struct snd_kcontrol *kcontrol,154struct snd_ctl_elem_value *ucontrol)155{156struct snd_soc_component *cmpnt = snd_soc_kcontrol_component(kcontrol);157struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);158struct mtk_afe_i2s_priv *i2s_priv;159struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;160int hd_en;161162if (ucontrol->value.enumerated.item[0] >= e->items)163return -EINVAL;164165hd_en = ucontrol->value.integer.value[0];166167dev_dbg(afe->dev, "%s(), kcontrol name %s, hd_en %d\n",168__func__, kcontrol->id.name, hd_en);169170i2s_priv = get_i2s_priv_by_name(afe, kcontrol->id.name);171172if (!i2s_priv) {173dev_warn(afe->dev, "%s(), i2s_priv == NULL", __func__);174return -EINVAL;175}176177i2s_priv->low_jitter_en = hd_en;178179return 0;180}181182static const struct snd_kcontrol_new mtk_dai_i2s_controls[] = {183SOC_ENUM_EXT(MTK_AFE_I2S0_KCONTROL_NAME, mt8192_i2s_enum,184mt8192_i2s_hd_get, mt8192_i2s_hd_set),185SOC_ENUM_EXT(MTK_AFE_I2S1_KCONTROL_NAME, mt8192_i2s_enum,186mt8192_i2s_hd_get, mt8192_i2s_hd_set),187SOC_ENUM_EXT(MTK_AFE_I2S2_KCONTROL_NAME, mt8192_i2s_enum,188mt8192_i2s_hd_get, mt8192_i2s_hd_set),189SOC_ENUM_EXT(MTK_AFE_I2S3_KCONTROL_NAME, mt8192_i2s_enum,190mt8192_i2s_hd_get, mt8192_i2s_hd_set),191SOC_ENUM_EXT(MTK_AFE_I2S5_KCONTROL_NAME, mt8192_i2s_enum,192mt8192_i2s_hd_get, mt8192_i2s_hd_set),193SOC_ENUM_EXT(MTK_AFE_I2S6_KCONTROL_NAME, mt8192_i2s_enum,194mt8192_i2s_hd_get, mt8192_i2s_hd_set),195SOC_ENUM_EXT(MTK_AFE_I2S7_KCONTROL_NAME, mt8192_i2s_enum,196mt8192_i2s_hd_get, mt8192_i2s_hd_set),197SOC_ENUM_EXT(MTK_AFE_I2S8_KCONTROL_NAME, mt8192_i2s_enum,198mt8192_i2s_hd_get, mt8192_i2s_hd_set),199SOC_ENUM_EXT(MTK_AFE_I2S9_KCONTROL_NAME, mt8192_i2s_enum,200mt8192_i2s_hd_get, mt8192_i2s_hd_set),201};202203/* dai component */204/* i2s virtual mux to output widget */205static const char * const i2s_mux_map[] = {206"Normal", "Dummy_Widget",207};208209static int i2s_mux_map_value[] = {2100, 1,211};212213static SOC_VALUE_ENUM_SINGLE_AUTODISABLE_DECL(i2s_mux_map_enum,214SND_SOC_NOPM,2150,2161,217i2s_mux_map,218i2s_mux_map_value);219220static const struct snd_kcontrol_new i2s0_in_mux_control =221SOC_DAPM_ENUM("I2S0 In Select", i2s_mux_map_enum);222223static const struct snd_kcontrol_new i2s8_in_mux_control =224SOC_DAPM_ENUM("I2S8 In Select", i2s_mux_map_enum);225226static const struct snd_kcontrol_new i2s1_out_mux_control =227SOC_DAPM_ENUM("I2S1 Out Select", i2s_mux_map_enum);228229static const struct snd_kcontrol_new i2s3_out_mux_control =230SOC_DAPM_ENUM("I2S3 Out Select", i2s_mux_map_enum);231232static const struct snd_kcontrol_new i2s5_out_mux_control =233SOC_DAPM_ENUM("I2S5 Out Select", i2s_mux_map_enum);234235static const struct snd_kcontrol_new i2s7_out_mux_control =236SOC_DAPM_ENUM("I2S7 Out Select", i2s_mux_map_enum);237238static const struct snd_kcontrol_new i2s9_out_mux_control =239SOC_DAPM_ENUM("I2S9 Out Select", i2s_mux_map_enum);240241/* Tinyconn Mux */242enum {243TINYCONN_CH1_MUX_DL1 = 0x0,244TINYCONN_CH2_MUX_DL1 = 0x1,245TINYCONN_CH1_MUX_DL12 = 0x2,246TINYCONN_CH2_MUX_DL12 = 0x3,247TINYCONN_CH1_MUX_DL2 = 0x4,248TINYCONN_CH2_MUX_DL2 = 0x5,249TINYCONN_CH1_MUX_DL3 = 0x6,250TINYCONN_CH2_MUX_DL3 = 0x7,251TINYCONN_MUX_NONE = 0x1f,252};253254static const char * const tinyconn_mux_map[] = {255"NONE",256"DL1_CH1",257"DL1_CH2",258"DL12_CH1",259"DL12_CH2",260"DL2_CH1",261"DL2_CH2",262"DL3_CH1",263"DL3_CH2",264};265266static int tinyconn_mux_map_value[] = {267TINYCONN_MUX_NONE,268TINYCONN_CH1_MUX_DL1,269TINYCONN_CH2_MUX_DL1,270TINYCONN_CH1_MUX_DL12,271TINYCONN_CH2_MUX_DL12,272TINYCONN_CH1_MUX_DL2,273TINYCONN_CH2_MUX_DL2,274TINYCONN_CH1_MUX_DL3,275TINYCONN_CH2_MUX_DL3,276};277278static SOC_VALUE_ENUM_SINGLE_DECL(i2s1_tinyconn_ch1_mux_map_enum,279AFE_TINY_CONN5,280O_20_CFG_SFT,281O_20_CFG_MASK,282tinyconn_mux_map,283tinyconn_mux_map_value);284static const struct snd_kcontrol_new i2s1_tinyconn_ch1_mux_control =285SOC_DAPM_ENUM("i2s1 ch1 tinyconn Select",286i2s1_tinyconn_ch1_mux_map_enum);287288static SOC_VALUE_ENUM_SINGLE_DECL(i2s1_tinyconn_ch2_mux_map_enum,289AFE_TINY_CONN5,290O_21_CFG_SFT,291O_21_CFG_MASK,292tinyconn_mux_map,293tinyconn_mux_map_value);294static const struct snd_kcontrol_new i2s1_tinyconn_ch2_mux_control =295SOC_DAPM_ENUM("i2s1 ch2 tinyconn Select",296i2s1_tinyconn_ch2_mux_map_enum);297298static SOC_VALUE_ENUM_SINGLE_DECL(i2s3_tinyconn_ch1_mux_map_enum,299AFE_TINY_CONN5,300O_22_CFG_SFT,301O_22_CFG_MASK,302tinyconn_mux_map,303tinyconn_mux_map_value);304static const struct snd_kcontrol_new i2s3_tinyconn_ch1_mux_control =305SOC_DAPM_ENUM("i2s3 ch1 tinyconn Select",306i2s3_tinyconn_ch1_mux_map_enum);307308static SOC_VALUE_ENUM_SINGLE_DECL(i2s3_tinyconn_ch2_mux_map_enum,309AFE_TINY_CONN5,310O_23_CFG_SFT,311O_23_CFG_MASK,312tinyconn_mux_map,313tinyconn_mux_map_value);314static const struct snd_kcontrol_new i2s3_tinyconn_ch2_mux_control =315SOC_DAPM_ENUM("i2s3 ch2 tinyconn Select",316i2s3_tinyconn_ch2_mux_map_enum);317318/* i2s in lpbk */319static const char * const i2s_lpbk_mux_map[] = {320"Normal", "Lpbk",321};322323static int i2s_lpbk_mux_map_value[] = {3240, 1,325};326327static SOC_VALUE_ENUM_SINGLE_AUTODISABLE_DECL(i2s0_lpbk_mux_map_enum,328AFE_I2S_CON,329I2S_LOOPBACK_SFT,3301,331i2s_lpbk_mux_map,332i2s_lpbk_mux_map_value);333334static const struct snd_kcontrol_new i2s0_lpbk_mux_control =335SOC_DAPM_ENUM("I2S Lpbk Select", i2s0_lpbk_mux_map_enum);336337static SOC_VALUE_ENUM_SINGLE_AUTODISABLE_DECL(i2s2_lpbk_mux_map_enum,338AFE_I2S_CON2,339I2S3_LOOPBACK_SFT,3401,341i2s_lpbk_mux_map,342i2s_lpbk_mux_map_value);343344static const struct snd_kcontrol_new i2s2_lpbk_mux_control =345SOC_DAPM_ENUM("I2S Lpbk Select", i2s2_lpbk_mux_map_enum);346347/* interconnection */348static const struct snd_kcontrol_new mtk_i2s3_ch1_mix[] = {349SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH1", AFE_CONN0, I_DL1_CH1, 1, 0),350SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH1", AFE_CONN0, I_DL2_CH1, 1, 0),351SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH1", AFE_CONN0, I_DL3_CH1, 1, 0),352SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH1", AFE_CONN0, I_DL12_CH1, 1, 0),353SOC_DAPM_SINGLE_AUTODISABLE("DL6_CH1", AFE_CONN0_1, I_DL6_CH1, 1, 0),354SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH1", AFE_CONN0_1, I_DL4_CH1, 1, 0),355SOC_DAPM_SINGLE_AUTODISABLE("DL5_CH1", AFE_CONN0_1, I_DL5_CH1, 1, 0),356SOC_DAPM_SINGLE_AUTODISABLE("DL8_CH1", AFE_CONN0_1, I_DL8_CH1, 1, 0),357SOC_DAPM_SINGLE_AUTODISABLE("DL9_CH1", AFE_CONN0_1, I_DL9_CH1, 1, 0),358SOC_DAPM_SINGLE_AUTODISABLE("GAIN1_OUT_CH1", AFE_CONN0,359I_GAIN1_OUT_CH1, 1, 0),360SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN0,361I_ADDA_UL_CH1, 1, 0),362SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN0,363I_ADDA_UL_CH2, 1, 0),364SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH3", AFE_CONN0,365I_ADDA_UL_CH3, 1, 0),366SOC_DAPM_SINGLE_AUTODISABLE("PCM_1_CAP_CH1", AFE_CONN0,367I_PCM_1_CAP_CH1, 1, 0),368SOC_DAPM_SINGLE_AUTODISABLE("PCM_2_CAP_CH1", AFE_CONN0,369I_PCM_2_CAP_CH1, 1, 0),370};371372static const struct snd_kcontrol_new mtk_i2s3_ch2_mix[] = {373SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH2", AFE_CONN1, I_DL1_CH2, 1, 0),374SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH2", AFE_CONN1, I_DL2_CH2, 1, 0),375SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH2", AFE_CONN1, I_DL3_CH2, 1, 0),376SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH2", AFE_CONN1, I_DL12_CH2, 1, 0),377SOC_DAPM_SINGLE_AUTODISABLE("DL6_CH2", AFE_CONN1_1, I_DL6_CH2, 1, 0),378SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH2", AFE_CONN1_1, I_DL4_CH2, 1, 0),379SOC_DAPM_SINGLE_AUTODISABLE("DL5_CH2", AFE_CONN1_1, I_DL5_CH2, 1, 0),380SOC_DAPM_SINGLE_AUTODISABLE("DL8_CH2", AFE_CONN1_1, I_DL8_CH2, 1, 0),381SOC_DAPM_SINGLE_AUTODISABLE("DL9_CH2", AFE_CONN1_1, I_DL9_CH2, 1, 0),382SOC_DAPM_SINGLE_AUTODISABLE("GAIN1_OUT_CH2", AFE_CONN1,383I_GAIN1_OUT_CH2, 1, 0),384SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN1,385I_ADDA_UL_CH1, 1, 0),386SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN1,387I_ADDA_UL_CH2, 1, 0),388SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH3", AFE_CONN1,389I_ADDA_UL_CH3, 1, 0),390SOC_DAPM_SINGLE_AUTODISABLE("PCM_1_CAP_CH1", AFE_CONN1,391I_PCM_1_CAP_CH1, 1, 0),392SOC_DAPM_SINGLE_AUTODISABLE("PCM_2_CAP_CH1", AFE_CONN1,393I_PCM_2_CAP_CH1, 1, 0),394SOC_DAPM_SINGLE_AUTODISABLE("PCM_1_CAP_CH2", AFE_CONN1,395I_PCM_1_CAP_CH2, 1, 0),396SOC_DAPM_SINGLE_AUTODISABLE("PCM_2_CAP_CH2", AFE_CONN1,397I_PCM_2_CAP_CH2, 1, 0),398};399400static const struct snd_kcontrol_new mtk_i2s1_ch1_mix[] = {401SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH1", AFE_CONN28, I_DL1_CH1, 1, 0),402SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH1", AFE_CONN28, I_DL2_CH1, 1, 0),403SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH1", AFE_CONN28, I_DL3_CH1, 1, 0),404SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH1", AFE_CONN28, I_DL12_CH1, 1, 0),405SOC_DAPM_SINGLE_AUTODISABLE("DL6_CH1", AFE_CONN28_1, I_DL6_CH1, 1, 0),406SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH1", AFE_CONN28_1, I_DL4_CH1, 1, 0),407SOC_DAPM_SINGLE_AUTODISABLE("DL5_CH1", AFE_CONN28_1, I_DL5_CH1, 1, 0),408SOC_DAPM_SINGLE_AUTODISABLE("DL8_CH1", AFE_CONN28_1, I_DL8_CH1, 1, 0),409SOC_DAPM_SINGLE_AUTODISABLE("DL9_CH1", AFE_CONN28_1, I_DL9_CH1, 1, 0),410SOC_DAPM_SINGLE_AUTODISABLE("GAIN1_OUT_CH1", AFE_CONN28,411I_GAIN1_OUT_CH1, 1, 0),412SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN28,413I_ADDA_UL_CH1, 1, 0),414SOC_DAPM_SINGLE_AUTODISABLE("PCM_1_CAP_CH1", AFE_CONN28,415I_PCM_1_CAP_CH1, 1, 0),416SOC_DAPM_SINGLE_AUTODISABLE("PCM_2_CAP_CH1", AFE_CONN28,417I_PCM_2_CAP_CH1, 1, 0),418};419420static const struct snd_kcontrol_new mtk_i2s1_ch2_mix[] = {421SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH2", AFE_CONN29, I_DL1_CH2, 1, 0),422SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH2", AFE_CONN29, I_DL2_CH2, 1, 0),423SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH2", AFE_CONN29, I_DL3_CH2, 1, 0),424SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH2", AFE_CONN29, I_DL12_CH2, 1, 0),425SOC_DAPM_SINGLE_AUTODISABLE("DL6_CH2", AFE_CONN29_1, I_DL6_CH2, 1, 0),426SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH2", AFE_CONN29_1, I_DL4_CH2, 1, 0),427SOC_DAPM_SINGLE_AUTODISABLE("DL5_CH2", AFE_CONN29_1, I_DL5_CH2, 1, 0),428SOC_DAPM_SINGLE_AUTODISABLE("DL8_CH2", AFE_CONN29_1, I_DL8_CH2, 1, 0),429SOC_DAPM_SINGLE_AUTODISABLE("DL9_CH2", AFE_CONN29_1, I_DL9_CH2, 1, 0),430SOC_DAPM_SINGLE_AUTODISABLE("GAIN1_OUT_CH2", AFE_CONN29,431I_GAIN1_OUT_CH2, 1, 0),432SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN29,433I_ADDA_UL_CH2, 1, 0),434SOC_DAPM_SINGLE_AUTODISABLE("PCM_1_CAP_CH1", AFE_CONN29,435I_PCM_1_CAP_CH1, 1, 0),436SOC_DAPM_SINGLE_AUTODISABLE("PCM_2_CAP_CH1", AFE_CONN29,437I_PCM_2_CAP_CH1, 1, 0),438SOC_DAPM_SINGLE_AUTODISABLE("PCM_1_CAP_CH2", AFE_CONN29,439I_PCM_1_CAP_CH2, 1, 0),440SOC_DAPM_SINGLE_AUTODISABLE("PCM_2_CAP_CH2", AFE_CONN29,441I_PCM_2_CAP_CH2, 1, 0),442};443444static const struct snd_kcontrol_new mtk_i2s5_ch1_mix[] = {445SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH1", AFE_CONN30, I_DL1_CH1, 1, 0),446SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH1", AFE_CONN30, I_DL2_CH1, 1, 0),447SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH1", AFE_CONN30, I_DL3_CH1, 1, 0),448SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH1", AFE_CONN30, I_DL12_CH1, 1, 0),449SOC_DAPM_SINGLE_AUTODISABLE("DL6_CH1", AFE_CONN30_1, I_DL6_CH1, 1, 0),450SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH1", AFE_CONN30_1, I_DL4_CH1, 1, 0),451SOC_DAPM_SINGLE_AUTODISABLE("DL5_CH1", AFE_CONN30_1, I_DL5_CH1, 1, 0),452SOC_DAPM_SINGLE_AUTODISABLE("DL8_CH1", AFE_CONN30_1, I_DL8_CH1, 1, 0),453SOC_DAPM_SINGLE_AUTODISABLE("DL9_CH1", AFE_CONN30_1, I_DL9_CH1, 1, 0),454SOC_DAPM_SINGLE_AUTODISABLE("GAIN1_OUT_CH1", AFE_CONN30,455I_GAIN1_OUT_CH1, 1, 0),456SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN30,457I_ADDA_UL_CH1, 1, 0),458SOC_DAPM_SINGLE_AUTODISABLE("PCM_1_CAP_CH1", AFE_CONN30,459I_PCM_1_CAP_CH1, 1, 0),460SOC_DAPM_SINGLE_AUTODISABLE("PCM_2_CAP_CH1", AFE_CONN30,461I_PCM_2_CAP_CH1, 1, 0),462};463464static const struct snd_kcontrol_new mtk_i2s5_ch2_mix[] = {465SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH2", AFE_CONN31, I_DL1_CH2, 1, 0),466SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH2", AFE_CONN31, I_DL2_CH2, 1, 0),467SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH2", AFE_CONN31, I_DL3_CH2, 1, 0),468SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH2", AFE_CONN31, I_DL12_CH2, 1, 0),469SOC_DAPM_SINGLE_AUTODISABLE("DL6_CH2", AFE_CONN31_1, I_DL6_CH2, 1, 0),470SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH2", AFE_CONN31_1, I_DL4_CH2, 1, 0),471SOC_DAPM_SINGLE_AUTODISABLE("DL5_CH2", AFE_CONN31_1, I_DL5_CH2, 1, 0),472SOC_DAPM_SINGLE_AUTODISABLE("DL8_CH2", AFE_CONN31_1, I_DL8_CH2, 1, 0),473SOC_DAPM_SINGLE_AUTODISABLE("DL9_CH2", AFE_CONN31_1, I_DL9_CH2, 1, 0),474SOC_DAPM_SINGLE_AUTODISABLE("GAIN1_OUT_CH2", AFE_CONN31,475I_GAIN1_OUT_CH2, 1, 0),476SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN31,477I_ADDA_UL_CH2, 1, 0),478SOC_DAPM_SINGLE_AUTODISABLE("PCM_1_CAP_CH1", AFE_CONN31,479I_PCM_1_CAP_CH1, 1, 0),480SOC_DAPM_SINGLE_AUTODISABLE("PCM_2_CAP_CH1", AFE_CONN31,481I_PCM_2_CAP_CH1, 1, 0),482SOC_DAPM_SINGLE_AUTODISABLE("PCM_1_CAP_CH2", AFE_CONN31,483I_PCM_1_CAP_CH2, 1, 0),484SOC_DAPM_SINGLE_AUTODISABLE("PCM_2_CAP_CH2", AFE_CONN31,485I_PCM_2_CAP_CH2, 1, 0),486};487488static const struct snd_kcontrol_new mtk_i2s7_ch1_mix[] = {489SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH1", AFE_CONN54, I_DL1_CH1, 1, 0),490SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH1", AFE_CONN54, I_DL2_CH1, 1, 0),491SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH1", AFE_CONN54, I_DL3_CH1, 1, 0),492SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH1", AFE_CONN54, I_DL12_CH1, 1, 0),493SOC_DAPM_SINGLE_AUTODISABLE("DL6_CH1", AFE_CONN54_1, I_DL6_CH1, 1, 0),494SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH1", AFE_CONN54_1, I_DL4_CH1, 1, 0),495SOC_DAPM_SINGLE_AUTODISABLE("DL5_CH1", AFE_CONN54_1, I_DL5_CH1, 1, 0),496SOC_DAPM_SINGLE_AUTODISABLE("DL9_CH1", AFE_CONN54_1, I_DL9_CH1, 1, 0),497SOC_DAPM_SINGLE_AUTODISABLE("GAIN1_OUT_CH1", AFE_CONN54,498I_GAIN1_OUT_CH1, 1, 0),499SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN54,500I_ADDA_UL_CH1, 1, 0),501SOC_DAPM_SINGLE_AUTODISABLE("PCM_1_CAP_CH1", AFE_CONN54,502I_PCM_1_CAP_CH1, 1, 0),503SOC_DAPM_SINGLE_AUTODISABLE("PCM_2_CAP_CH1", AFE_CONN54,504I_PCM_2_CAP_CH1, 1, 0),505};506507static const struct snd_kcontrol_new mtk_i2s7_ch2_mix[] = {508SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH2", AFE_CONN55, I_DL1_CH2, 1, 0),509SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH2", AFE_CONN55, I_DL2_CH2, 1, 0),510SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH2", AFE_CONN55, I_DL3_CH2, 1, 0),511SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH2", AFE_CONN55, I_DL12_CH2, 1, 0),512SOC_DAPM_SINGLE_AUTODISABLE("DL6_CH2", AFE_CONN55_1, I_DL6_CH2, 1, 0),513SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH2", AFE_CONN55_1, I_DL4_CH2, 1, 0),514SOC_DAPM_SINGLE_AUTODISABLE("DL5_CH2", AFE_CONN55_1, I_DL5_CH2, 1, 0),515SOC_DAPM_SINGLE_AUTODISABLE("DL9_CH2", AFE_CONN55_1, I_DL9_CH2, 1, 0),516SOC_DAPM_SINGLE_AUTODISABLE("GAIN1_OUT_CH2", AFE_CONN55,517I_GAIN1_OUT_CH2, 1, 0),518SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN55,519I_ADDA_UL_CH2, 1, 0),520SOC_DAPM_SINGLE_AUTODISABLE("PCM_1_CAP_CH1", AFE_CONN55,521I_PCM_1_CAP_CH1, 1, 0),522SOC_DAPM_SINGLE_AUTODISABLE("PCM_2_CAP_CH1", AFE_CONN55,523I_PCM_2_CAP_CH1, 1, 0),524SOC_DAPM_SINGLE_AUTODISABLE("PCM_1_CAP_CH2", AFE_CONN55,525I_PCM_1_CAP_CH2, 1, 0),526SOC_DAPM_SINGLE_AUTODISABLE("PCM_2_CAP_CH2", AFE_CONN55,527I_PCM_2_CAP_CH2, 1, 0),528};529530static const struct snd_kcontrol_new mtk_i2s9_ch1_mix[] = {531SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH1", AFE_CONN56, I_DL1_CH1, 1, 0),532SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH1", AFE_CONN56, I_DL2_CH1, 1, 0),533SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH1", AFE_CONN56, I_DL3_CH1, 1, 0),534SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH1", AFE_CONN56, I_DL12_CH1, 1, 0),535SOC_DAPM_SINGLE_AUTODISABLE("DL6_CH1", AFE_CONN56_1, I_DL6_CH1, 1, 0),536SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH1", AFE_CONN56_1, I_DL4_CH1, 1, 0),537SOC_DAPM_SINGLE_AUTODISABLE("DL5_CH1", AFE_CONN56_1, I_DL5_CH1, 1, 0),538SOC_DAPM_SINGLE_AUTODISABLE("DL8_CH1", AFE_CONN56_1, I_DL8_CH1, 1, 0),539SOC_DAPM_SINGLE_AUTODISABLE("DL9_CH1", AFE_CONN56_1, I_DL9_CH1, 1, 0),540SOC_DAPM_SINGLE_AUTODISABLE("GAIN1_OUT_CH1", AFE_CONN56,541I_GAIN1_OUT_CH1, 1, 0),542SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN56,543I_ADDA_UL_CH1, 1, 0),544SOC_DAPM_SINGLE_AUTODISABLE("PCM_1_CAP_CH1", AFE_CONN56,545I_PCM_1_CAP_CH1, 1, 0),546SOC_DAPM_SINGLE_AUTODISABLE("PCM_2_CAP_CH1", AFE_CONN56,547I_PCM_2_CAP_CH1, 1, 0),548};549550static const struct snd_kcontrol_new mtk_i2s9_ch2_mix[] = {551SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH2", AFE_CONN57, I_DL1_CH2, 1, 0),552SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH2", AFE_CONN57, I_DL2_CH2, 1, 0),553SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH2", AFE_CONN57, I_DL3_CH2, 1, 0),554SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH2", AFE_CONN57, I_DL12_CH2, 1, 0),555SOC_DAPM_SINGLE_AUTODISABLE("DL6_CH2", AFE_CONN57_1, I_DL6_CH2, 1, 0),556SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH2", AFE_CONN57_1, I_DL4_CH2, 1, 0),557SOC_DAPM_SINGLE_AUTODISABLE("DL5_CH2", AFE_CONN57_1, I_DL5_CH2, 1, 0),558SOC_DAPM_SINGLE_AUTODISABLE("DL8_CH2", AFE_CONN57_1, I_DL8_CH2, 1, 0),559SOC_DAPM_SINGLE_AUTODISABLE("DL9_CH2", AFE_CONN57_1, I_DL9_CH2, 1, 0),560SOC_DAPM_SINGLE_AUTODISABLE("GAIN1_OUT_CH2", AFE_CONN57,561I_GAIN1_OUT_CH2, 1, 0),562SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN57,563I_ADDA_UL_CH2, 1, 0),564SOC_DAPM_SINGLE_AUTODISABLE("PCM_1_CAP_CH1", AFE_CONN57,565I_PCM_1_CAP_CH1, 1, 0),566SOC_DAPM_SINGLE_AUTODISABLE("PCM_2_CAP_CH1", AFE_CONN57,567I_PCM_2_CAP_CH1, 1, 0),568SOC_DAPM_SINGLE_AUTODISABLE("PCM_1_CAP_CH2", AFE_CONN57,569I_PCM_1_CAP_CH2, 1, 0),570SOC_DAPM_SINGLE_AUTODISABLE("PCM_2_CAP_CH2", AFE_CONN57,571I_PCM_2_CAP_CH2, 1, 0),572};573574enum {575SUPPLY_SEQ_APLL,576SUPPLY_SEQ_I2S_MCLK_EN,577SUPPLY_SEQ_I2S_HD_EN,578SUPPLY_SEQ_I2S_EN,579};580581static int mtk_i2s_en_event(struct snd_soc_dapm_widget *w,582struct snd_kcontrol *kcontrol,583int event)584{585struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);586struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);587struct mtk_afe_i2s_priv *i2s_priv;588589i2s_priv = get_i2s_priv_by_name(afe, w->name);590591if (!i2s_priv) {592dev_warn(afe->dev, "%s(), i2s_priv == NULL", __func__);593return -EINVAL;594}595596dev_dbg(cmpnt->dev, "%s(), name %s, event 0x%x\n",597__func__, w->name, event);598599switch (event) {600case SND_SOC_DAPM_PRE_PMU:601mt8192_afe_gpio_request(afe->dev, true, i2s_priv->id, 0);602break;603case SND_SOC_DAPM_POST_PMD:604mt8192_afe_gpio_request(afe->dev, false, i2s_priv->id, 0);605break;606default:607break;608}609610return 0;611}612613static int mtk_apll_event(struct snd_soc_dapm_widget *w,614struct snd_kcontrol *kcontrol,615int event)616{617struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);618struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);619620dev_dbg(cmpnt->dev, "%s(), name %s, event 0x%x\n",621__func__, w->name, event);622623switch (event) {624case SND_SOC_DAPM_PRE_PMU:625if (snd_soc_dapm_widget_name_cmp(w, APLL1_W_NAME) == 0)626mt8192_apll1_enable(afe);627else628mt8192_apll2_enable(afe);629break;630case SND_SOC_DAPM_POST_PMD:631if (snd_soc_dapm_widget_name_cmp(w, APLL1_W_NAME) == 0)632mt8192_apll1_disable(afe);633else634mt8192_apll2_disable(afe);635break;636default:637break;638}639640return 0;641}642643static int i2s_out_tinyconn_event(struct snd_soc_dapm_widget *w,644struct snd_kcontrol *kcontrol,645int event)646{647struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);648struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);649unsigned int reg;650unsigned int reg_shift;651unsigned int reg_mask_shift;652653dev_dbg(afe->dev, "%s(), event 0x%x\n", __func__, event);654655if (strstr(w->name, "I2S1")) {656reg = AFE_I2S_CON1;657reg_shift = I2S2_32BIT_EN_SFT;658reg_mask_shift = I2S2_32BIT_EN_MASK_SFT;659} else if (strstr(w->name, "I2S3")) {660reg = AFE_I2S_CON3;661reg_shift = I2S4_32BIT_EN_SFT;662reg_mask_shift = I2S4_32BIT_EN_MASK_SFT;663} else if (strstr(w->name, "I2S5")) {664reg = AFE_I2S_CON4;665reg_shift = I2S5_32BIT_EN_SFT;666reg_mask_shift = I2S5_32BIT_EN_MASK_SFT;667} else if (strstr(w->name, "I2S7")) {668reg = AFE_I2S_CON7;669reg_shift = I2S7_32BIT_EN_SFT;670reg_mask_shift = I2S7_32BIT_EN_MASK_SFT;671} else if (strstr(w->name, "I2S9")) {672reg = AFE_I2S_CON9;673reg_shift = I2S9_32BIT_EN_SFT;674reg_mask_shift = I2S9_32BIT_EN_MASK_SFT;675} else {676reg = AFE_I2S_CON1;677reg_shift = I2S2_32BIT_EN_SFT;678reg_mask_shift = I2S2_32BIT_EN_MASK_SFT;679dev_warn(afe->dev, "%s(), error widget name %s, use i2s1\n",680__func__, w->name);681}682683switch (event) {684case SND_SOC_DAPM_PRE_PMU:685regmap_update_bits(afe->regmap, reg, reg_mask_shift,6860x1 << reg_shift);687break;688case SND_SOC_DAPM_PRE_PMD:689regmap_update_bits(afe->regmap, reg, reg_mask_shift,6900x0 << reg_shift);691break;692default:693break;694}695696return 0;697}698699static int mtk_mclk_en_event(struct snd_soc_dapm_widget *w,700struct snd_kcontrol *kcontrol,701int event)702{703struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);704struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);705struct mtk_afe_i2s_priv *i2s_priv;706707dev_dbg(cmpnt->dev, "%s(), name %s, event 0x%x\n",708__func__, w->name, event);709710i2s_priv = get_i2s_priv_by_name(afe, w->name);711if (!i2s_priv) {712dev_warn(afe->dev, "%s(), i2s_priv == NULL", __func__);713return -EINVAL;714}715716switch (event) {717case SND_SOC_DAPM_PRE_PMU:718mt8192_mck_enable(afe, i2s_priv->mclk_id, i2s_priv->mclk_rate);719break;720case SND_SOC_DAPM_POST_PMD:721i2s_priv->mclk_rate = 0;722mt8192_mck_disable(afe, i2s_priv->mclk_id);723break;724default:725break;726}727728return 0;729}730731static const struct snd_soc_dapm_widget mtk_dai_i2s_widgets[] = {732SND_SOC_DAPM_INPUT("CONNSYS"),733734SND_SOC_DAPM_MIXER("I2S1_CH1", SND_SOC_NOPM, 0, 0,735mtk_i2s1_ch1_mix,736ARRAY_SIZE(mtk_i2s1_ch1_mix)),737SND_SOC_DAPM_MIXER("I2S1_CH2", SND_SOC_NOPM, 0, 0,738mtk_i2s1_ch2_mix,739ARRAY_SIZE(mtk_i2s1_ch2_mix)),740741SND_SOC_DAPM_MIXER("I2S3_CH1", SND_SOC_NOPM, 0, 0,742mtk_i2s3_ch1_mix,743ARRAY_SIZE(mtk_i2s3_ch1_mix)),744SND_SOC_DAPM_MIXER("I2S3_CH2", SND_SOC_NOPM, 0, 0,745mtk_i2s3_ch2_mix,746ARRAY_SIZE(mtk_i2s3_ch2_mix)),747748SND_SOC_DAPM_MIXER("I2S5_CH1", SND_SOC_NOPM, 0, 0,749mtk_i2s5_ch1_mix,750ARRAY_SIZE(mtk_i2s5_ch1_mix)),751SND_SOC_DAPM_MIXER("I2S5_CH2", SND_SOC_NOPM, 0, 0,752mtk_i2s5_ch2_mix,753ARRAY_SIZE(mtk_i2s5_ch2_mix)),754755SND_SOC_DAPM_MIXER("I2S7_CH1", SND_SOC_NOPM, 0, 0,756mtk_i2s7_ch1_mix,757ARRAY_SIZE(mtk_i2s7_ch1_mix)),758SND_SOC_DAPM_MIXER("I2S7_CH2", SND_SOC_NOPM, 0, 0,759mtk_i2s7_ch2_mix,760ARRAY_SIZE(mtk_i2s7_ch2_mix)),761762SND_SOC_DAPM_MIXER("I2S9_CH1", SND_SOC_NOPM, 0, 0,763mtk_i2s9_ch1_mix,764ARRAY_SIZE(mtk_i2s9_ch1_mix)),765SND_SOC_DAPM_MIXER("I2S9_CH2", SND_SOC_NOPM, 0, 0,766mtk_i2s9_ch2_mix,767ARRAY_SIZE(mtk_i2s9_ch2_mix)),768769SND_SOC_DAPM_MUX_E("I2S1_TINYCONN_CH1_MUX", SND_SOC_NOPM, 0, 0,770&i2s1_tinyconn_ch1_mux_control,771i2s_out_tinyconn_event,772SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_PRE_PMD),773SND_SOC_DAPM_MUX_E("I2S1_TINYCONN_CH2_MUX", SND_SOC_NOPM, 0, 0,774&i2s1_tinyconn_ch2_mux_control,775i2s_out_tinyconn_event,776SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_PRE_PMD),777SND_SOC_DAPM_MUX_E("I2S3_TINYCONN_CH1_MUX", SND_SOC_NOPM, 0, 0,778&i2s3_tinyconn_ch1_mux_control,779i2s_out_tinyconn_event,780SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_PRE_PMD),781SND_SOC_DAPM_MUX_E("I2S3_TINYCONN_CH2_MUX", SND_SOC_NOPM, 0, 0,782&i2s3_tinyconn_ch2_mux_control,783i2s_out_tinyconn_event,784SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_PRE_PMD),785786/* i2s en*/787SND_SOC_DAPM_SUPPLY_S("I2S0_EN", SUPPLY_SEQ_I2S_EN,788AFE_I2S_CON, I2S_EN_SFT, 0,789mtk_i2s_en_event,790SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),791SND_SOC_DAPM_SUPPLY_S("I2S1_EN", SUPPLY_SEQ_I2S_EN,792AFE_I2S_CON1, I2S_EN_SFT, 0,793mtk_i2s_en_event,794SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),795SND_SOC_DAPM_SUPPLY_S("I2S2_EN", SUPPLY_SEQ_I2S_EN,796AFE_I2S_CON2, I2S_EN_SFT, 0,797mtk_i2s_en_event,798SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),799SND_SOC_DAPM_SUPPLY_S("I2S3_EN", SUPPLY_SEQ_I2S_EN,800AFE_I2S_CON3, I2S_EN_SFT, 0,801mtk_i2s_en_event,802SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),803SND_SOC_DAPM_SUPPLY_S("I2S5_EN", SUPPLY_SEQ_I2S_EN,804AFE_I2S_CON4, I2S5_EN_SFT, 0,805mtk_i2s_en_event,806SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),807SND_SOC_DAPM_SUPPLY_S("I2S6_EN", SUPPLY_SEQ_I2S_EN,808AFE_I2S_CON6, I2S6_EN_SFT, 0,809mtk_i2s_en_event,810SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),811SND_SOC_DAPM_SUPPLY_S("I2S7_EN", SUPPLY_SEQ_I2S_EN,812AFE_I2S_CON7, I2S7_EN_SFT, 0,813mtk_i2s_en_event,814SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),815SND_SOC_DAPM_SUPPLY_S("I2S8_EN", SUPPLY_SEQ_I2S_EN,816AFE_I2S_CON8, I2S8_EN_SFT, 0,817mtk_i2s_en_event,818SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),819SND_SOC_DAPM_SUPPLY_S("I2S9_EN", SUPPLY_SEQ_I2S_EN,820AFE_I2S_CON9, I2S9_EN_SFT, 0,821mtk_i2s_en_event,822SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),823/* i2s hd en */824SND_SOC_DAPM_SUPPLY_S(I2S0_HD_EN_W_NAME, SUPPLY_SEQ_I2S_HD_EN,825AFE_I2S_CON, I2S1_HD_EN_SFT, 0, NULL, 0),826SND_SOC_DAPM_SUPPLY_S(I2S1_HD_EN_W_NAME, SUPPLY_SEQ_I2S_HD_EN,827AFE_I2S_CON1, I2S2_HD_EN_SFT, 0, NULL, 0),828SND_SOC_DAPM_SUPPLY_S(I2S2_HD_EN_W_NAME, SUPPLY_SEQ_I2S_HD_EN,829AFE_I2S_CON2, I2S3_HD_EN_SFT, 0, NULL, 0),830SND_SOC_DAPM_SUPPLY_S(I2S3_HD_EN_W_NAME, SUPPLY_SEQ_I2S_HD_EN,831AFE_I2S_CON3, I2S4_HD_EN_SFT, 0, NULL, 0),832SND_SOC_DAPM_SUPPLY_S(I2S5_HD_EN_W_NAME, SUPPLY_SEQ_I2S_HD_EN,833AFE_I2S_CON4, I2S5_HD_EN_SFT, 0, NULL, 0),834SND_SOC_DAPM_SUPPLY_S(I2S6_HD_EN_W_NAME, SUPPLY_SEQ_I2S_HD_EN,835AFE_I2S_CON6, I2S6_HD_EN_SFT, 0, NULL, 0),836SND_SOC_DAPM_SUPPLY_S(I2S7_HD_EN_W_NAME, SUPPLY_SEQ_I2S_HD_EN,837AFE_I2S_CON7, I2S7_HD_EN_SFT, 0, NULL, 0),838SND_SOC_DAPM_SUPPLY_S(I2S8_HD_EN_W_NAME, SUPPLY_SEQ_I2S_HD_EN,839AFE_I2S_CON8, I2S8_HD_EN_SFT, 0, NULL, 0),840SND_SOC_DAPM_SUPPLY_S(I2S9_HD_EN_W_NAME, SUPPLY_SEQ_I2S_HD_EN,841AFE_I2S_CON9, I2S9_HD_EN_SFT, 0, NULL, 0),842843/* i2s mclk en */844SND_SOC_DAPM_SUPPLY_S(I2S0_MCLK_EN_W_NAME, SUPPLY_SEQ_I2S_MCLK_EN,845SND_SOC_NOPM, 0, 0,846mtk_mclk_en_event,847SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),848SND_SOC_DAPM_SUPPLY_S(I2S1_MCLK_EN_W_NAME, SUPPLY_SEQ_I2S_MCLK_EN,849SND_SOC_NOPM, 0, 0,850mtk_mclk_en_event,851SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),852SND_SOC_DAPM_SUPPLY_S(I2S2_MCLK_EN_W_NAME, SUPPLY_SEQ_I2S_MCLK_EN,853SND_SOC_NOPM, 0, 0,854mtk_mclk_en_event,855SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),856SND_SOC_DAPM_SUPPLY_S(I2S3_MCLK_EN_W_NAME, SUPPLY_SEQ_I2S_MCLK_EN,857SND_SOC_NOPM, 0, 0,858mtk_mclk_en_event,859SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),860SND_SOC_DAPM_SUPPLY_S(I2S5_MCLK_EN_W_NAME, SUPPLY_SEQ_I2S_MCLK_EN,861SND_SOC_NOPM, 0, 0,862mtk_mclk_en_event,863SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),864SND_SOC_DAPM_SUPPLY_S(I2S6_MCLK_EN_W_NAME, SUPPLY_SEQ_I2S_MCLK_EN,865SND_SOC_NOPM, 0, 0,866mtk_mclk_en_event,867SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),868SND_SOC_DAPM_SUPPLY_S(I2S7_MCLK_EN_W_NAME, SUPPLY_SEQ_I2S_MCLK_EN,869SND_SOC_NOPM, 0, 0,870mtk_mclk_en_event,871SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),872SND_SOC_DAPM_SUPPLY_S(I2S8_MCLK_EN_W_NAME, SUPPLY_SEQ_I2S_MCLK_EN,873SND_SOC_NOPM, 0, 0,874mtk_mclk_en_event,875SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),876SND_SOC_DAPM_SUPPLY_S(I2S9_MCLK_EN_W_NAME, SUPPLY_SEQ_I2S_MCLK_EN,877SND_SOC_NOPM, 0, 0,878mtk_mclk_en_event,879SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),880881/* apll */882SND_SOC_DAPM_SUPPLY_S(APLL1_W_NAME, SUPPLY_SEQ_APLL,883SND_SOC_NOPM, 0, 0,884mtk_apll_event,885SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),886SND_SOC_DAPM_SUPPLY_S(APLL2_W_NAME, SUPPLY_SEQ_APLL,887SND_SOC_NOPM, 0, 0,888mtk_apll_event,889SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),890891/* allow i2s on without codec on */892SND_SOC_DAPM_OUTPUT("I2S_DUMMY_OUT"),893SND_SOC_DAPM_MUX("I2S1_Out_Mux",894SND_SOC_NOPM, 0, 0, &i2s1_out_mux_control),895SND_SOC_DAPM_MUX("I2S3_Out_Mux",896SND_SOC_NOPM, 0, 0, &i2s3_out_mux_control),897SND_SOC_DAPM_MUX("I2S5_Out_Mux",898SND_SOC_NOPM, 0, 0, &i2s5_out_mux_control),899SND_SOC_DAPM_MUX("I2S7_Out_Mux",900SND_SOC_NOPM, 0, 0, &i2s7_out_mux_control),901SND_SOC_DAPM_MUX("I2S9_Out_Mux",902SND_SOC_NOPM, 0, 0, &i2s9_out_mux_control),903904SND_SOC_DAPM_INPUT("I2S_DUMMY_IN"),905SND_SOC_DAPM_MUX("I2S0_In_Mux",906SND_SOC_NOPM, 0, 0, &i2s0_in_mux_control),907SND_SOC_DAPM_MUX("I2S8_In_Mux",908SND_SOC_NOPM, 0, 0, &i2s8_in_mux_control),909910/* i2s in lpbk */911SND_SOC_DAPM_MUX("I2S0_Lpbk_Mux",912SND_SOC_NOPM, 0, 0, &i2s0_lpbk_mux_control),913SND_SOC_DAPM_MUX("I2S2_Lpbk_Mux",914SND_SOC_NOPM, 0, 0, &i2s2_lpbk_mux_control),915};916917static int mtk_afe_i2s_share_connect(struct snd_soc_dapm_widget *source,918struct snd_soc_dapm_widget *sink)919{920struct snd_soc_dapm_widget *w = sink;921struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);922struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);923struct mtk_afe_i2s_priv *i2s_priv;924925i2s_priv = get_i2s_priv_by_name(afe, sink->name);926if (!i2s_priv) {927dev_warn(afe->dev, "%s(), i2s_priv == NULL", __func__);928return 0;929}930931if (i2s_priv->share_i2s_id < 0)932return 0;933934return i2s_priv->share_i2s_id == get_i2s_id_by_name(afe, source->name);935}936937static int mtk_afe_i2s_hd_connect(struct snd_soc_dapm_widget *source,938struct snd_soc_dapm_widget *sink)939{940struct snd_soc_dapm_widget *w = sink;941struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);942struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);943struct mtk_afe_i2s_priv *i2s_priv;944945i2s_priv = get_i2s_priv_by_name(afe, sink->name);946if (!i2s_priv) {947dev_warn(afe->dev, "%s(), i2s_priv == NULL", __func__);948return 0;949}950951if (get_i2s_id_by_name(afe, sink->name) ==952get_i2s_id_by_name(afe, source->name))953return i2s_priv->low_jitter_en;954955/* check if share i2s need hd en */956if (i2s_priv->share_i2s_id < 0)957return 0;958959if (i2s_priv->share_i2s_id == get_i2s_id_by_name(afe, source->name))960return i2s_priv->low_jitter_en;961962return 0;963}964965static int mtk_afe_i2s_apll_connect(struct snd_soc_dapm_widget *source,966struct snd_soc_dapm_widget *sink)967{968struct snd_soc_dapm_widget *w = sink;969struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);970struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);971struct mtk_afe_i2s_priv *i2s_priv;972int cur_apll;973int i2s_need_apll;974975i2s_priv = get_i2s_priv_by_name(afe, w->name);976if (!i2s_priv) {977dev_warn(afe->dev, "%s(), i2s_priv == NULL", __func__);978return 0;979}980981/* which apll */982cur_apll = mt8192_get_apll_by_name(afe, source->name);983984/* choose APLL from i2s rate */985i2s_need_apll = mt8192_get_apll_by_rate(afe, i2s_priv->rate);986987if (i2s_need_apll == cur_apll)988return 1;989990return 0;991}992993static int mtk_afe_i2s_mclk_connect(struct snd_soc_dapm_widget *source,994struct snd_soc_dapm_widget *sink)995{996struct snd_soc_dapm_widget *w = sink;997struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);998struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);999struct mtk_afe_i2s_priv *i2s_priv;10001001i2s_priv = get_i2s_priv_by_name(afe, sink->name);1002if (!i2s_priv) {1003dev_warn(afe->dev, "%s(), i2s_priv == NULL", __func__);1004return 0;1005}10061007if (get_i2s_id_by_name(afe, sink->name) ==1008get_i2s_id_by_name(afe, source->name))1009return (i2s_priv->mclk_rate > 0) ? 1 : 0;10101011/* check if share i2s need mclk */1012if (i2s_priv->share_i2s_id < 0)1013return 0;10141015if (i2s_priv->share_i2s_id == get_i2s_id_by_name(afe, source->name))1016return (i2s_priv->mclk_rate > 0) ? 1 : 0;10171018return 0;1019}10201021static int mtk_afe_mclk_apll_connect(struct snd_soc_dapm_widget *source,1022struct snd_soc_dapm_widget *sink)1023{1024struct snd_soc_dapm_widget *w = sink;1025struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);1026struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);1027struct mtk_afe_i2s_priv *i2s_priv;1028int cur_apll;10291030i2s_priv = get_i2s_priv_by_name(afe, w->name);1031if (!i2s_priv) {1032dev_warn(afe->dev, "%s(), i2s_priv == NULL", __func__);1033return 0;1034}10351036/* which apll */1037cur_apll = mt8192_get_apll_by_name(afe, source->name);10381039if (i2s_priv->mclk_apll == cur_apll)1040return 1;10411042return 0;1043}10441045static const struct snd_soc_dapm_route mtk_dai_i2s_routes[] = {1046{"Connsys I2S", NULL, "CONNSYS"},10471048/* i2s0 */1049{"I2S0", NULL, "I2S0_EN"},1050{"I2S0", NULL, "I2S1_EN", mtk_afe_i2s_share_connect},1051{"I2S0", NULL, "I2S2_EN", mtk_afe_i2s_share_connect},1052{"I2S0", NULL, "I2S3_EN", mtk_afe_i2s_share_connect},1053{"I2S0", NULL, "I2S5_EN", mtk_afe_i2s_share_connect},1054{"I2S0", NULL, "I2S6_EN", mtk_afe_i2s_share_connect},1055{"I2S0", NULL, "I2S7_EN", mtk_afe_i2s_share_connect},1056{"I2S0", NULL, "I2S8_EN", mtk_afe_i2s_share_connect},1057{"I2S0", NULL, "I2S9_EN", mtk_afe_i2s_share_connect},10581059{"I2S0", NULL, I2S0_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},1060{"I2S0", NULL, I2S1_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},1061{"I2S0", NULL, I2S2_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},1062{"I2S0", NULL, I2S3_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},1063{"I2S0", NULL, I2S5_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},1064{"I2S0", NULL, I2S6_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},1065{"I2S0", NULL, I2S7_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},1066{"I2S0", NULL, I2S8_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},1067{"I2S0", NULL, I2S9_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},1068{I2S0_HD_EN_W_NAME, NULL, APLL1_W_NAME, mtk_afe_i2s_apll_connect},1069{I2S0_HD_EN_W_NAME, NULL, APLL2_W_NAME, mtk_afe_i2s_apll_connect},10701071{"I2S0", NULL, I2S0_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},1072{"I2S0", NULL, I2S1_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},1073{"I2S0", NULL, I2S2_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},1074{"I2S0", NULL, I2S3_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},1075{"I2S0", NULL, I2S5_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},1076{"I2S0", NULL, I2S6_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},1077{"I2S0", NULL, I2S7_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},1078{"I2S0", NULL, I2S8_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},1079{"I2S0", NULL, I2S9_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},1080{I2S0_MCLK_EN_W_NAME, NULL, APLL1_W_NAME, mtk_afe_mclk_apll_connect},1081{I2S0_MCLK_EN_W_NAME, NULL, APLL2_W_NAME, mtk_afe_mclk_apll_connect},10821083/* i2s1 */1084{"I2S1_CH1", "DL1_CH1", "DL1"},1085{"I2S1_CH2", "DL1_CH2", "DL1"},1086{"I2S1_TINYCONN_CH1_MUX", "DL1_CH1", "DL1"},1087{"I2S1_TINYCONN_CH2_MUX", "DL1_CH2", "DL1"},10881089{"I2S1_CH1", "DL2_CH1", "DL2"},1090{"I2S1_CH2", "DL2_CH2", "DL2"},1091{"I2S1_TINYCONN_CH1_MUX", "DL2_CH1", "DL2"},1092{"I2S1_TINYCONN_CH2_MUX", "DL2_CH2", "DL2"},10931094{"I2S1_CH1", "DL3_CH1", "DL3"},1095{"I2S1_CH2", "DL3_CH2", "DL3"},1096{"I2S1_TINYCONN_CH1_MUX", "DL3_CH1", "DL3"},1097{"I2S1_TINYCONN_CH2_MUX", "DL3_CH2", "DL3"},10981099{"I2S1_CH1", "DL12_CH1", "DL12"},1100{"I2S1_CH2", "DL12_CH2", "DL12"},1101{"I2S1_TINYCONN_CH1_MUX", "DL12_CH1", "DL12"},1102{"I2S1_TINYCONN_CH2_MUX", "DL12_CH2", "DL12"},11031104{"I2S1_CH1", "DL4_CH1", "DL4"},1105{"I2S1_CH2", "DL4_CH2", "DL4"},11061107{"I2S1_CH1", "DL5_CH1", "DL5"},1108{"I2S1_CH2", "DL5_CH2", "DL5"},11091110{"I2S1_CH1", "DL6_CH1", "DL6"},1111{"I2S1_CH2", "DL6_CH2", "DL6"},11121113{"I2S1_CH1", "DL8_CH1", "DL8"},1114{"I2S1_CH2", "DL8_CH2", "DL8"},11151116{"I2S1", NULL, "I2S1_CH1"},1117{"I2S1", NULL, "I2S1_CH2"},1118{"I2S1", NULL, "I2S3_TINYCONN_CH1_MUX"},1119{"I2S1", NULL, "I2S3_TINYCONN_CH2_MUX"},11201121{"I2S1", NULL, "I2S0_EN", mtk_afe_i2s_share_connect},1122{"I2S1", NULL, "I2S1_EN"},1123{"I2S1", NULL, "I2S2_EN", mtk_afe_i2s_share_connect},1124{"I2S1", NULL, "I2S3_EN", mtk_afe_i2s_share_connect},1125{"I2S1", NULL, "I2S5_EN", mtk_afe_i2s_share_connect},1126{"I2S1", NULL, "I2S6_EN", mtk_afe_i2s_share_connect},1127{"I2S1", NULL, "I2S7_EN", mtk_afe_i2s_share_connect},1128{"I2S1", NULL, "I2S8_EN", mtk_afe_i2s_share_connect},1129{"I2S1", NULL, "I2S9_EN", mtk_afe_i2s_share_connect},11301131{"I2S1", NULL, I2S0_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},1132{"I2S1", NULL, I2S1_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},1133{"I2S1", NULL, I2S2_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},1134{"I2S1", NULL, I2S3_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},1135{"I2S1", NULL, I2S5_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},1136{"I2S1", NULL, I2S6_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},1137{"I2S1", NULL, I2S7_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},1138{"I2S1", NULL, I2S8_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},1139{"I2S1", NULL, I2S9_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},1140{I2S1_HD_EN_W_NAME, NULL, APLL1_W_NAME, mtk_afe_i2s_apll_connect},1141{I2S1_HD_EN_W_NAME, NULL, APLL2_W_NAME, mtk_afe_i2s_apll_connect},11421143{"I2S1", NULL, I2S0_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},1144{"I2S1", NULL, I2S1_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},1145{"I2S1", NULL, I2S2_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},1146{"I2S1", NULL, I2S3_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},1147{"I2S1", NULL, I2S5_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},1148{"I2S1", NULL, I2S6_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},1149{"I2S1", NULL, I2S7_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},1150{"I2S1", NULL, I2S8_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},1151{"I2S1", NULL, I2S9_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},1152{I2S1_MCLK_EN_W_NAME, NULL, APLL1_W_NAME, mtk_afe_mclk_apll_connect},1153{I2S1_MCLK_EN_W_NAME, NULL, APLL2_W_NAME, mtk_afe_mclk_apll_connect},11541155/* i2s2 */1156{"I2S2", NULL, "I2S0_EN", mtk_afe_i2s_share_connect},1157{"I2S2", NULL, "I2S1_EN", mtk_afe_i2s_share_connect},1158{"I2S2", NULL, "I2S2_EN"},1159{"I2S2", NULL, "I2S3_EN", mtk_afe_i2s_share_connect},1160{"I2S2", NULL, "I2S5_EN", mtk_afe_i2s_share_connect},1161{"I2S2", NULL, "I2S6_EN", mtk_afe_i2s_share_connect},1162{"I2S2", NULL, "I2S7_EN", mtk_afe_i2s_share_connect},1163{"I2S2", NULL, "I2S8_EN", mtk_afe_i2s_share_connect},1164{"I2S2", NULL, "I2S9_EN", mtk_afe_i2s_share_connect},11651166{"I2S2", NULL, I2S0_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},1167{"I2S2", NULL, I2S1_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},1168{"I2S2", NULL, I2S2_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},1169{"I2S2", NULL, I2S3_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},1170{"I2S2", NULL, I2S5_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},1171{"I2S2", NULL, I2S6_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},1172{"I2S2", NULL, I2S7_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},1173{"I2S2", NULL, I2S8_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},1174{"I2S2", NULL, I2S9_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},1175{I2S2_HD_EN_W_NAME, NULL, APLL1_W_NAME, mtk_afe_i2s_apll_connect},1176{I2S2_HD_EN_W_NAME, NULL, APLL2_W_NAME, mtk_afe_i2s_apll_connect},11771178{"I2S2", NULL, I2S0_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},1179{"I2S2", NULL, I2S1_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},1180{"I2S2", NULL, I2S2_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},1181{"I2S2", NULL, I2S3_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},1182{"I2S2", NULL, I2S5_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},1183{"I2S2", NULL, I2S6_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},1184{"I2S2", NULL, I2S7_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},1185{"I2S2", NULL, I2S8_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},1186{"I2S2", NULL, I2S9_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},1187{I2S2_MCLK_EN_W_NAME, NULL, APLL1_W_NAME, mtk_afe_mclk_apll_connect},1188{I2S2_MCLK_EN_W_NAME, NULL, APLL2_W_NAME, mtk_afe_mclk_apll_connect},11891190/* i2s3 */1191{"I2S3_CH1", "DL1_CH1", "DL1"},1192{"I2S3_CH2", "DL1_CH2", "DL1"},1193{"I2S3_TINYCONN_CH1_MUX", "DL1_CH1", "DL1"},1194{"I2S3_TINYCONN_CH2_MUX", "DL1_CH2", "DL1"},11951196{"I2S3_CH1", "DL2_CH1", "DL2"},1197{"I2S3_CH2", "DL2_CH2", "DL2"},1198{"I2S3_TINYCONN_CH1_MUX", "DL2_CH1", "DL2"},1199{"I2S3_TINYCONN_CH2_MUX", "DL2_CH2", "DL2"},12001201{"I2S3_CH1", "DL3_CH1", "DL3"},1202{"I2S3_CH2", "DL3_CH2", "DL3"},1203{"I2S3_TINYCONN_CH1_MUX", "DL3_CH1", "DL3"},1204{"I2S3_TINYCONN_CH2_MUX", "DL3_CH2", "DL3"},12051206{"I2S3_CH1", "DL12_CH1", "DL12"},1207{"I2S3_CH2", "DL12_CH2", "DL12"},1208{"I2S3_TINYCONN_CH1_MUX", "DL12_CH1", "DL12"},1209{"I2S3_TINYCONN_CH2_MUX", "DL12_CH2", "DL12"},12101211{"I2S3_CH1", "DL4_CH1", "DL4"},1212{"I2S3_CH2", "DL4_CH2", "DL4"},12131214{"I2S3_CH1", "DL5_CH1", "DL5"},1215{"I2S3_CH2", "DL5_CH2", "DL5"},12161217{"I2S3_CH1", "DL6_CH1", "DL6"},1218{"I2S3_CH2", "DL6_CH2", "DL6"},12191220{"I2S3_CH1", "DL8_CH1", "DL8"},1221{"I2S3_CH2", "DL8_CH2", "DL8"},12221223{"I2S3", NULL, "I2S3_CH1"},1224{"I2S3", NULL, "I2S3_CH2"},1225{"I2S3", NULL, "I2S3_TINYCONN_CH1_MUX"},1226{"I2S3", NULL, "I2S3_TINYCONN_CH2_MUX"},12271228{"I2S3", NULL, "I2S0_EN", mtk_afe_i2s_share_connect},1229{"I2S3", NULL, "I2S1_EN", mtk_afe_i2s_share_connect},1230{"I2S3", NULL, "I2S2_EN", mtk_afe_i2s_share_connect},1231{"I2S3", NULL, "I2S3_EN"},1232{"I2S3", NULL, "I2S5_EN", mtk_afe_i2s_share_connect},1233{"I2S3", NULL, "I2S6_EN", mtk_afe_i2s_share_connect},1234{"I2S3", NULL, "I2S7_EN", mtk_afe_i2s_share_connect},1235{"I2S3", NULL, "I2S8_EN", mtk_afe_i2s_share_connect},1236{"I2S3", NULL, "I2S9_EN", mtk_afe_i2s_share_connect},12371238{"I2S3", NULL, I2S0_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},1239{"I2S3", NULL, I2S1_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},1240{"I2S3", NULL, I2S2_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},1241{"I2S3", NULL, I2S3_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},1242{"I2S3", NULL, I2S5_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},1243{"I2S3", NULL, I2S6_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},1244{"I2S3", NULL, I2S7_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},1245{"I2S3", NULL, I2S8_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},1246{"I2S3", NULL, I2S9_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},1247{I2S3_HD_EN_W_NAME, NULL, APLL1_W_NAME, mtk_afe_i2s_apll_connect},1248{I2S3_HD_EN_W_NAME, NULL, APLL2_W_NAME, mtk_afe_i2s_apll_connect},12491250{"I2S3", NULL, I2S0_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},1251{"I2S3", NULL, I2S1_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},1252{"I2S3", NULL, I2S2_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},1253{"I2S3", NULL, I2S3_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},1254{"I2S3", NULL, I2S5_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},1255{"I2S3", NULL, I2S6_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},1256{"I2S3", NULL, I2S7_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},1257{"I2S3", NULL, I2S8_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},1258{"I2S3", NULL, I2S9_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},1259{I2S3_MCLK_EN_W_NAME, NULL, APLL1_W_NAME, mtk_afe_mclk_apll_connect},1260{I2S3_MCLK_EN_W_NAME, NULL, APLL2_W_NAME, mtk_afe_mclk_apll_connect},12611262/* i2s5 */1263{"I2S5_CH1", "DL1_CH1", "DL1"},1264{"I2S5_CH2", "DL1_CH2", "DL1"},12651266{"I2S5_CH1", "DL2_CH1", "DL2"},1267{"I2S5_CH2", "DL2_CH2", "DL2"},12681269{"I2S5_CH1", "DL3_CH1", "DL3"},1270{"I2S5_CH2", "DL3_CH2", "DL3"},12711272{"I2S5_CH1", "DL12_CH1", "DL12"},1273{"I2S5_CH2", "DL12_CH2", "DL12"},12741275{"I2S5_CH1", "DL4_CH1", "DL4"},1276{"I2S5_CH2", "DL4_CH2", "DL4"},12771278{"I2S5_CH1", "DL5_CH1", "DL5"},1279{"I2S5_CH2", "DL5_CH2", "DL5"},12801281{"I2S5_CH1", "DL6_CH1", "DL6"},1282{"I2S5_CH2", "DL6_CH2", "DL6"},12831284{"I2S5_CH1", "DL8_CH1", "DL8"},1285{"I2S5_CH2", "DL8_CH2", "DL8"},12861287{"I2S5", NULL, "I2S5_CH1"},1288{"I2S5", NULL, "I2S5_CH2"},12891290{"I2S5", NULL, "I2S0_EN", mtk_afe_i2s_share_connect},1291{"I2S5", NULL, "I2S1_EN", mtk_afe_i2s_share_connect},1292{"I2S5", NULL, "I2S2_EN", mtk_afe_i2s_share_connect},1293{"I2S5", NULL, "I2S3_EN", mtk_afe_i2s_share_connect},1294{"I2S5", NULL, "I2S5_EN"},1295{"I2S5", NULL, "I2S6_EN", mtk_afe_i2s_share_connect},1296{"I2S5", NULL, "I2S7_EN", mtk_afe_i2s_share_connect},1297{"I2S5", NULL, "I2S8_EN", mtk_afe_i2s_share_connect},1298{"I2S5", NULL, "I2S9_EN", mtk_afe_i2s_share_connect},12991300{"I2S5", NULL, I2S0_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},1301{"I2S5", NULL, I2S1_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},1302{"I2S5", NULL, I2S2_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},1303{"I2S5", NULL, I2S3_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},1304{"I2S5", NULL, I2S5_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},1305{"I2S5", NULL, I2S6_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},1306{"I2S5", NULL, I2S7_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},1307{"I2S5", NULL, I2S8_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},1308{"I2S5", NULL, I2S9_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},1309{I2S5_HD_EN_W_NAME, NULL, APLL1_W_NAME, mtk_afe_i2s_apll_connect},1310{I2S5_HD_EN_W_NAME, NULL, APLL2_W_NAME, mtk_afe_i2s_apll_connect},13111312{"I2S5", NULL, I2S0_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},1313{"I2S5", NULL, I2S1_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},1314{"I2S5", NULL, I2S2_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},1315{"I2S5", NULL, I2S3_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},1316{"I2S5", NULL, I2S5_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},1317{"I2S5", NULL, I2S6_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},1318{"I2S5", NULL, I2S7_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},1319{"I2S5", NULL, I2S8_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},1320{"I2S5", NULL, I2S9_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},1321{I2S5_MCLK_EN_W_NAME, NULL, APLL1_W_NAME, mtk_afe_mclk_apll_connect},1322{I2S5_MCLK_EN_W_NAME, NULL, APLL2_W_NAME, mtk_afe_mclk_apll_connect},13231324/* i2s6 */1325{"I2S6", NULL, "I2S0_EN", mtk_afe_i2s_share_connect},1326{"I2S6", NULL, "I2S1_EN", mtk_afe_i2s_share_connect},1327{"I2S6", NULL, "I2S2_EN", mtk_afe_i2s_share_connect},1328{"I2S6", NULL, "I2S3_EN", mtk_afe_i2s_share_connect},1329{"I2S6", NULL, "I2S5_EN", mtk_afe_i2s_share_connect},1330{"I2S6", NULL, "I2S6_EN"},1331{"I2S6", NULL, "I2S7_EN", mtk_afe_i2s_share_connect},1332{"I2S6", NULL, "I2S8_EN", mtk_afe_i2s_share_connect},1333{"I2S6", NULL, "I2S9_EN", mtk_afe_i2s_share_connect},13341335{"I2S6", NULL, I2S0_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},1336{"I2S6", NULL, I2S1_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},1337{"I2S6", NULL, I2S2_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},1338{"I2S6", NULL, I2S3_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},1339{"I2S6", NULL, I2S5_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},1340{"I2S6", NULL, I2S6_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},1341{"I2S6", NULL, I2S7_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},1342{"I2S6", NULL, I2S8_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},1343{"I2S6", NULL, I2S9_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},1344{I2S6_HD_EN_W_NAME, NULL, APLL1_W_NAME, mtk_afe_i2s_apll_connect},1345{I2S6_HD_EN_W_NAME, NULL, APLL2_W_NAME, mtk_afe_i2s_apll_connect},13461347{"I2S6", NULL, I2S0_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},1348{"I2S6", NULL, I2S1_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},1349{"I2S6", NULL, I2S2_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},1350{"I2S6", NULL, I2S3_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},1351{"I2S6", NULL, I2S5_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},1352{"I2S6", NULL, I2S6_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},1353{"I2S6", NULL, I2S7_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},1354{"I2S6", NULL, I2S8_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},1355{"I2S6", NULL, I2S9_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},1356{I2S6_MCLK_EN_W_NAME, NULL, APLL1_W_NAME, mtk_afe_mclk_apll_connect},1357{I2S6_MCLK_EN_W_NAME, NULL, APLL2_W_NAME, mtk_afe_mclk_apll_connect},13581359/* i2s7 */1360{"I2S7", NULL, "I2S7_CH1"},1361{"I2S7", NULL, "I2S7_CH2"},13621363{"I2S7", NULL, "I2S0_EN", mtk_afe_i2s_share_connect},1364{"I2S7", NULL, "I2S1_EN", mtk_afe_i2s_share_connect},1365{"I2S7", NULL, "I2S2_EN", mtk_afe_i2s_share_connect},1366{"I2S7", NULL, "I2S3_EN", mtk_afe_i2s_share_connect},1367{"I2S7", NULL, "I2S5_EN", mtk_afe_i2s_share_connect},1368{"I2S7", NULL, "I2S6_EN", mtk_afe_i2s_share_connect},1369{"I2S7", NULL, "I2S7_EN"},1370{"I2S7", NULL, "I2S8_EN", mtk_afe_i2s_share_connect},1371{"I2S7", NULL, "I2S9_EN", mtk_afe_i2s_share_connect},13721373{"I2S7", NULL, I2S0_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},1374{"I2S7", NULL, I2S1_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},1375{"I2S7", NULL, I2S2_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},1376{"I2S7", NULL, I2S3_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},1377{"I2S7", NULL, I2S5_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},1378{"I2S7", NULL, I2S6_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},1379{"I2S7", NULL, I2S7_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},1380{"I2S7", NULL, I2S8_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},1381{"I2S7", NULL, I2S9_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},1382{I2S7_HD_EN_W_NAME, NULL, APLL1_W_NAME, mtk_afe_i2s_apll_connect},1383{I2S7_HD_EN_W_NAME, NULL, APLL2_W_NAME, mtk_afe_i2s_apll_connect},13841385{"I2S7", NULL, I2S0_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},1386{"I2S7", NULL, I2S1_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},1387{"I2S7", NULL, I2S2_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},1388{"I2S7", NULL, I2S3_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},1389{"I2S7", NULL, I2S5_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},1390{"I2S7", NULL, I2S6_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},1391{"I2S7", NULL, I2S7_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},1392{"I2S7", NULL, I2S8_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},1393{"I2S7", NULL, I2S9_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},1394{I2S7_MCLK_EN_W_NAME, NULL, APLL1_W_NAME, mtk_afe_mclk_apll_connect},1395{I2S7_MCLK_EN_W_NAME, NULL, APLL2_W_NAME, mtk_afe_mclk_apll_connect},13961397/* i2s8 */1398{"I2S8", NULL, "I2S0_EN", mtk_afe_i2s_share_connect},1399{"I2S8", NULL, "I2S1_EN", mtk_afe_i2s_share_connect},1400{"I2S8", NULL, "I2S2_EN", mtk_afe_i2s_share_connect},1401{"I2S8", NULL, "I2S3_EN", mtk_afe_i2s_share_connect},1402{"I2S8", NULL, "I2S5_EN", mtk_afe_i2s_share_connect},1403{"I2S8", NULL, "I2S6_EN", mtk_afe_i2s_share_connect},1404{"I2S8", NULL, "I2S7_EN", mtk_afe_i2s_share_connect},1405{"I2S8", NULL, "I2S8_EN"},1406{"I2S8", NULL, "I2S9_EN", mtk_afe_i2s_share_connect},14071408{"I2S8", NULL, I2S0_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},1409{"I2S8", NULL, I2S1_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},1410{"I2S8", NULL, I2S2_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},1411{"I2S8", NULL, I2S3_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},1412{"I2S8", NULL, I2S5_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},1413{"I2S8", NULL, I2S6_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},1414{"I2S8", NULL, I2S7_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},1415{"I2S8", NULL, I2S8_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},1416{"I2S8", NULL, I2S9_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},1417{I2S8_HD_EN_W_NAME, NULL, APLL1_W_NAME, mtk_afe_i2s_apll_connect},1418{I2S8_HD_EN_W_NAME, NULL, APLL2_W_NAME, mtk_afe_i2s_apll_connect},14191420{"I2S8", NULL, I2S0_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},1421{"I2S8", NULL, I2S1_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},1422{"I2S8", NULL, I2S2_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},1423{"I2S8", NULL, I2S3_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},1424{"I2S8", NULL, I2S5_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},1425{"I2S8", NULL, I2S6_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},1426{"I2S8", NULL, I2S7_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},1427{"I2S8", NULL, I2S8_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},1428{"I2S8", NULL, I2S9_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},1429{I2S8_MCLK_EN_W_NAME, NULL, APLL1_W_NAME, mtk_afe_mclk_apll_connect},1430{I2S8_MCLK_EN_W_NAME, NULL, APLL2_W_NAME, mtk_afe_mclk_apll_connect},14311432/* i2s9 */1433{"I2S9_CH1", "DL1_CH1", "DL1"},1434{"I2S9_CH2", "DL1_CH2", "DL1"},14351436{"I2S9_CH1", "DL2_CH1", "DL2"},1437{"I2S9_CH2", "DL2_CH2", "DL2"},14381439{"I2S9_CH1", "DL3_CH1", "DL3"},1440{"I2S9_CH2", "DL3_CH2", "DL3"},14411442{"I2S9_CH1", "DL12_CH1", "DL12"},1443{"I2S9_CH2", "DL12_CH2", "DL12"},14441445{"I2S9_CH1", "DL4_CH1", "DL4"},1446{"I2S9_CH2", "DL4_CH2", "DL4"},14471448{"I2S9_CH1", "DL5_CH1", "DL5"},1449{"I2S9_CH2", "DL5_CH2", "DL5"},14501451{"I2S9_CH1", "DL6_CH1", "DL6"},1452{"I2S9_CH2", "DL6_CH2", "DL6"},14531454{"I2S9_CH1", "DL8_CH1", "DL8"},1455{"I2S9_CH2", "DL8_CH2", "DL8"},14561457{"I2S9_CH1", "DL9_CH1", "DL9"},1458{"I2S9_CH2", "DL9_CH2", "DL9"},14591460{"I2S9", NULL, "I2S9_CH1"},1461{"I2S9", NULL, "I2S9_CH2"},14621463{"I2S9", NULL, "I2S0_EN", mtk_afe_i2s_share_connect},1464{"I2S9", NULL, "I2S1_EN", mtk_afe_i2s_share_connect},1465{"I2S9", NULL, "I2S2_EN", mtk_afe_i2s_share_connect},1466{"I2S9", NULL, "I2S3_EN", mtk_afe_i2s_share_connect},1467{"I2S9", NULL, "I2S5_EN", mtk_afe_i2s_share_connect},1468{"I2S9", NULL, "I2S6_EN", mtk_afe_i2s_share_connect},1469{"I2S9", NULL, "I2S7_EN", mtk_afe_i2s_share_connect},1470{"I2S9", NULL, "I2S8_EN", mtk_afe_i2s_share_connect},1471{"I2S9", NULL, "I2S9_EN"},14721473{"I2S9", NULL, I2S0_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},1474{"I2S9", NULL, I2S1_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},1475{"I2S9", NULL, I2S2_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},1476{"I2S9", NULL, I2S3_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},1477{"I2S9", NULL, I2S5_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},1478{"I2S9", NULL, I2S6_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},1479{"I2S9", NULL, I2S7_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},1480{"I2S9", NULL, I2S8_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},1481{"I2S9", NULL, I2S9_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},1482{I2S9_HD_EN_W_NAME, NULL, APLL1_W_NAME, mtk_afe_i2s_apll_connect},1483{I2S9_HD_EN_W_NAME, NULL, APLL2_W_NAME, mtk_afe_i2s_apll_connect},14841485{"I2S9", NULL, I2S0_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},1486{"I2S9", NULL, I2S1_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},1487{"I2S9", NULL, I2S2_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},1488{"I2S9", NULL, I2S3_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},1489{"I2S9", NULL, I2S5_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},1490{"I2S9", NULL, I2S6_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},1491{"I2S9", NULL, I2S7_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},1492{"I2S9", NULL, I2S8_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},1493{"I2S9", NULL, I2S9_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},1494{I2S9_MCLK_EN_W_NAME, NULL, APLL1_W_NAME, mtk_afe_mclk_apll_connect},1495{I2S9_MCLK_EN_W_NAME, NULL, APLL2_W_NAME, mtk_afe_mclk_apll_connect},14961497/* allow i2s on without codec on */1498{"I2S0", NULL, "I2S0_In_Mux"},1499{"I2S0_In_Mux", "Dummy_Widget", "I2S_DUMMY_IN"},15001501{"I2S8", NULL, "I2S8_In_Mux"},1502{"I2S8_In_Mux", "Dummy_Widget", "I2S_DUMMY_IN"},15031504{"I2S1_Out_Mux", "Dummy_Widget", "I2S1"},1505{"I2S_DUMMY_OUT", NULL, "I2S1_Out_Mux"},15061507{"I2S3_Out_Mux", "Dummy_Widget", "I2S3"},1508{"I2S_DUMMY_OUT", NULL, "I2S3_Out_Mux"},15091510{"I2S5_Out_Mux", "Dummy_Widget", "I2S5"},1511{"I2S_DUMMY_OUT", NULL, "I2S5_Out_Mux"},15121513{"I2S7_Out_Mux", "Dummy_Widget", "I2S7"},1514{"I2S_DUMMY_OUT", NULL, "I2S7_Out_Mux"},15151516{"I2S9_Out_Mux", "Dummy_Widget", "I2S9"},1517{"I2S_DUMMY_OUT", NULL, "I2S9_Out_Mux"},15181519/* i2s in lpbk */1520{"I2S0_Lpbk_Mux", "Lpbk", "I2S3"},1521{"I2S2_Lpbk_Mux", "Lpbk", "I2S1"},1522{"I2S0", NULL, "I2S0_Lpbk_Mux"},1523{"I2S2", NULL, "I2S2_Lpbk_Mux"},1524};15251526/* dai ops */1527static int mtk_dai_connsys_i2s_hw_params(struct snd_pcm_substream *substream,1528struct snd_pcm_hw_params *params,1529struct snd_soc_dai *dai)1530{1531struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);1532unsigned int rate = params_rate(params);1533unsigned int rate_reg = mt8192_rate_transform(afe->dev,1534rate, dai->id);1535unsigned int i2s_con = 0;15361537dev_dbg(afe->dev, "%s(), id %d, stream %d, rate %d\n",1538__func__, dai->id, substream->stream, rate);15391540/* non-inverse, i2s mode, proxy mode, 16bits, from connsys */1541i2s_con |= 0 << INV_PAD_CTRL_SFT;1542i2s_con |= I2S_FMT_I2S << I2S_FMT_SFT;1543i2s_con |= 1 << I2S_SRC_SFT;1544i2s_con |= get_i2s_wlen(SNDRV_PCM_FORMAT_S16_LE) << I2S_WLEN_SFT;1545i2s_con |= 0 << I2SIN_PAD_SEL_SFT;1546regmap_write(afe->regmap, AFE_CONNSYS_I2S_CON, i2s_con);15471548/* use asrc */1549regmap_update_bits(afe->regmap,1550AFE_CONNSYS_I2S_CON,1551I2S_BYPSRC_MASK_SFT,15520x0 << I2S_BYPSRC_SFT);15531554/* proxy mode, set i2s for asrc */1555regmap_update_bits(afe->regmap,1556AFE_CONNSYS_I2S_CON,1557I2S_MODE_MASK_SFT,1558rate_reg << I2S_MODE_SFT);15591560switch (rate) {1561case 32000:1562regmap_write(afe->regmap, AFE_ASRC_2CH_CON3, 0x140000);1563break;1564case 44100:1565regmap_write(afe->regmap, AFE_ASRC_2CH_CON3, 0x001B9000);1566break;1567default:1568regmap_write(afe->regmap, AFE_ASRC_2CH_CON3, 0x001E0000);1569break;1570}15711572/* Calibration setting */1573regmap_write(afe->regmap, AFE_ASRC_2CH_CON4, 0x00140000);1574regmap_write(afe->regmap, AFE_ASRC_2CH_CON9, 0x00036000);1575regmap_write(afe->regmap, AFE_ASRC_2CH_CON10, 0x0002FC00);1576regmap_write(afe->regmap, AFE_ASRC_2CH_CON6, 0x00007EF4);1577regmap_write(afe->regmap, AFE_ASRC_2CH_CON5, 0x00FF5986);15781579/* 0:Stereo 1:Mono */1580regmap_update_bits(afe->regmap,1581AFE_ASRC_2CH_CON2,1582CHSET_IS_MONO_MASK_SFT,15830x0 << CHSET_IS_MONO_SFT);15841585return 0;1586}15871588static int mtk_dai_connsys_i2s_trigger(struct snd_pcm_substream *substream,1589int cmd, struct snd_soc_dai *dai)1590{1591struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);1592struct mt8192_afe_private *afe_priv = afe->platform_priv;15931594dev_dbg(afe->dev, "%s(), cmd %d, stream %d\n",1595__func__, cmd, substream->stream);15961597switch (cmd) {1598case SNDRV_PCM_TRIGGER_START:1599case SNDRV_PCM_TRIGGER_RESUME:1600/* i2s enable */1601regmap_update_bits(afe->regmap,1602AFE_CONNSYS_I2S_CON,1603I2S_EN_MASK_SFT,16040x1 << I2S_EN_SFT);16051606/* calibrator enable */1607regmap_update_bits(afe->regmap,1608AFE_ASRC_2CH_CON5,1609CALI_EN_MASK_SFT,16100x1 << CALI_EN_SFT);16111612/* asrc enable */1613regmap_update_bits(afe->regmap,1614AFE_ASRC_2CH_CON0,1615CON0_CHSET_STR_CLR_MASK_SFT,16160x1 << CON0_CHSET_STR_CLR_SFT);1617regmap_update_bits(afe->regmap,1618AFE_ASRC_2CH_CON0,1619CON0_ASM_ON_MASK_SFT,16200x1 << CON0_ASM_ON_SFT);16211622afe_priv->dai_on[dai->id] = true;1623break;1624case SNDRV_PCM_TRIGGER_STOP:1625case SNDRV_PCM_TRIGGER_SUSPEND:1626regmap_update_bits(afe->regmap,1627AFE_ASRC_2CH_CON0,1628CON0_ASM_ON_MASK_SFT,16290 << CON0_ASM_ON_SFT);1630regmap_update_bits(afe->regmap,1631AFE_ASRC_2CH_CON5,1632CALI_EN_MASK_SFT,16330 << CALI_EN_SFT);16341635/* i2s disable */1636regmap_update_bits(afe->regmap,1637AFE_CONNSYS_I2S_CON,1638I2S_EN_MASK_SFT,16390x0 << I2S_EN_SFT);16401641/* bypass asrc */1642regmap_update_bits(afe->regmap,1643AFE_CONNSYS_I2S_CON,1644I2S_BYPSRC_MASK_SFT,16450x1 << I2S_BYPSRC_SFT);16461647afe_priv->dai_on[dai->id] = false;1648break;1649default:1650return -EINVAL;1651}1652return 0;1653}16541655static const struct snd_soc_dai_ops mtk_dai_connsys_i2s_ops = {1656.hw_params = mtk_dai_connsys_i2s_hw_params,1657.trigger = mtk_dai_connsys_i2s_trigger,1658};16591660/* i2s */1661static int mtk_dai_i2s_config(struct mtk_base_afe *afe,1662struct snd_pcm_hw_params *params,1663int i2s_id)1664{1665struct mt8192_afe_private *afe_priv = afe->platform_priv;1666struct mtk_afe_i2s_priv *i2s_priv = afe_priv->dai_priv[i2s_id];16671668unsigned int rate = params_rate(params);1669unsigned int rate_reg = mt8192_rate_transform(afe->dev,1670rate, i2s_id);1671snd_pcm_format_t format = params_format(params);1672unsigned int i2s_con = 0;1673int ret = 0;16741675dev_dbg(afe->dev, "%s(), id %d, rate %d, format %d\n",1676__func__, i2s_id, rate, format);16771678if (i2s_priv)1679i2s_priv->rate = rate;1680else1681dev_warn(afe->dev, "%s(), i2s_priv == NULL", __func__);16821683switch (i2s_id) {1684case MT8192_DAI_I2S_0:1685i2s_con = I2S_IN_PAD_IO_MUX << I2SIN_PAD_SEL_SFT;1686i2s_con |= rate_reg << I2S_OUT_MODE_SFT;1687i2s_con |= I2S_FMT_I2S << I2S_FMT_SFT;1688i2s_con |= get_i2s_wlen(format) << I2S_WLEN_SFT;1689regmap_update_bits(afe->regmap, AFE_I2S_CON,16900xffffeffe, i2s_con);1691break;1692case MT8192_DAI_I2S_1:1693i2s_con = I2S1_SEL_O28_O29 << I2S2_SEL_O03_O04_SFT;1694i2s_con |= rate_reg << I2S2_OUT_MODE_SFT;1695i2s_con |= I2S_FMT_I2S << I2S2_FMT_SFT;1696i2s_con |= get_i2s_wlen(format) << I2S2_WLEN_SFT;1697regmap_update_bits(afe->regmap, AFE_I2S_CON1,16980xffffeffe, i2s_con);1699break;1700case MT8192_DAI_I2S_2:1701i2s_con = 8 << I2S3_UPDATE_WORD_SFT;1702i2s_con |= rate_reg << I2S3_OUT_MODE_SFT;1703i2s_con |= I2S_FMT_I2S << I2S3_FMT_SFT;1704i2s_con |= get_i2s_wlen(format) << I2S3_WLEN_SFT;1705regmap_update_bits(afe->regmap, AFE_I2S_CON2,17060xffffeffe, i2s_con);1707break;1708case MT8192_DAI_I2S_3:1709i2s_con = rate_reg << I2S4_OUT_MODE_SFT;1710i2s_con |= I2S_FMT_I2S << I2S4_FMT_SFT;1711i2s_con |= get_i2s_wlen(format) << I2S4_WLEN_SFT;1712regmap_update_bits(afe->regmap, AFE_I2S_CON3,17130xffffeffe, i2s_con);1714break;1715case MT8192_DAI_I2S_5:1716i2s_con = rate_reg << I2S5_OUT_MODE_SFT;1717i2s_con |= I2S_FMT_I2S << I2S5_FMT_SFT;1718i2s_con |= get_i2s_wlen(format) << I2S5_WLEN_SFT;1719regmap_update_bits(afe->regmap, AFE_I2S_CON4,17200xffffeffe, i2s_con);1721break;1722case MT8192_DAI_I2S_6:1723i2s_con = rate_reg << I2S6_OUT_MODE_SFT;1724i2s_con |= I2S_FMT_I2S << I2S6_FMT_SFT;1725i2s_con |= get_i2s_wlen(format) << I2S6_WLEN_SFT;1726regmap_update_bits(afe->regmap, AFE_I2S_CON6,17270xffffeffe, i2s_con);1728break;1729case MT8192_DAI_I2S_7:1730i2s_con = rate_reg << I2S7_OUT_MODE_SFT;1731i2s_con |= I2S_FMT_I2S << I2S7_FMT_SFT;1732i2s_con |= get_i2s_wlen(format) << I2S7_WLEN_SFT;1733regmap_update_bits(afe->regmap, AFE_I2S_CON7,17340xffffeffe, i2s_con);1735break;1736case MT8192_DAI_I2S_8:1737i2s_con = rate_reg << I2S8_OUT_MODE_SFT;1738i2s_con |= I2S_FMT_I2S << I2S8_FMT_SFT;1739i2s_con |= get_i2s_wlen(format) << I2S8_WLEN_SFT;1740regmap_update_bits(afe->regmap, AFE_I2S_CON8,17410xffffeffe, i2s_con);1742break;1743case MT8192_DAI_I2S_9:1744i2s_con = rate_reg << I2S9_OUT_MODE_SFT;1745i2s_con |= I2S_FMT_I2S << I2S9_FMT_SFT;1746i2s_con |= get_i2s_wlen(format) << I2S9_WLEN_SFT;1747regmap_update_bits(afe->regmap, AFE_I2S_CON9,17480xffffeffe, i2s_con);1749break;1750default:1751dev_warn(afe->dev, "%s(), id %d not support\n",1752__func__, i2s_id);1753return -EINVAL;1754}17551756/* set share i2s */1757if (i2s_priv && i2s_priv->share_i2s_id >= 0)1758ret = mtk_dai_i2s_config(afe, params, i2s_priv->share_i2s_id);17591760return ret;1761}17621763static int mtk_dai_i2s_hw_params(struct snd_pcm_substream *substream,1764struct snd_pcm_hw_params *params,1765struct snd_soc_dai *dai)1766{1767struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);17681769return mtk_dai_i2s_config(afe, params, dai->id);1770}17711772static int mtk_dai_i2s_set_sysclk(struct snd_soc_dai *dai,1773int clk_id, unsigned int freq, int dir)1774{1775struct mtk_base_afe *afe = dev_get_drvdata(dai->dev);1776struct mt8192_afe_private *afe_priv = afe->platform_priv;1777struct mtk_afe_i2s_priv *i2s_priv = afe_priv->dai_priv[dai->id];1778int apll;1779int apll_rate;17801781if (!i2s_priv) {1782dev_warn(afe->dev, "%s(), i2s_priv == NULL", __func__);1783return -EINVAL;1784}17851786if (dir != SND_SOC_CLOCK_OUT) {1787dev_warn(afe->dev, "%s(), dir != SND_SOC_CLOCK_OUT", __func__);1788return -EINVAL;1789}17901791dev_dbg(afe->dev, "%s(), freq %d\n", __func__, freq);17921793apll = mt8192_get_apll_by_rate(afe, freq);1794apll_rate = mt8192_get_apll_rate(afe, apll);17951796if (freq > apll_rate) {1797dev_warn(afe->dev, "%s(), freq > apll rate", __func__);1798return -EINVAL;1799}18001801if (apll_rate % freq != 0) {1802dev_warn(afe->dev, "%s(), APLL can't gen freq Hz", __func__);1803return -EINVAL;1804}18051806i2s_priv->mclk_rate = freq;1807i2s_priv->mclk_apll = apll;18081809if (i2s_priv->share_i2s_id > 0) {1810struct mtk_afe_i2s_priv *share_i2s_priv;18111812share_i2s_priv = afe_priv->dai_priv[i2s_priv->share_i2s_id];1813if (!share_i2s_priv) {1814dev_warn(afe->dev, "%s(), share_i2s_priv = NULL",1815__func__);1816return -EINVAL;1817}18181819share_i2s_priv->mclk_rate = i2s_priv->mclk_rate;1820share_i2s_priv->mclk_apll = i2s_priv->mclk_apll;1821}18221823return 0;1824}18251826static const struct snd_soc_dai_ops mtk_dai_i2s_ops = {1827.hw_params = mtk_dai_i2s_hw_params,1828.set_sysclk = mtk_dai_i2s_set_sysclk,1829};18301831/* dai driver */1832#define MTK_CONNSYS_I2S_RATES (SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_48000)18331834#define MTK_I2S_RATES (SNDRV_PCM_RATE_8000_48000 |\1835SNDRV_PCM_RATE_88200 |\1836SNDRV_PCM_RATE_96000 |\1837SNDRV_PCM_RATE_176400 |\1838SNDRV_PCM_RATE_192000)18391840#define MTK_I2S_FORMATS (SNDRV_PCM_FMTBIT_S16_LE |\1841SNDRV_PCM_FMTBIT_S24_LE |\1842SNDRV_PCM_FMTBIT_S32_LE)18431844static struct snd_soc_dai_driver mtk_dai_i2s_driver[] = {1845{1846.name = "CONNSYS_I2S",1847.id = MT8192_DAI_CONNSYS_I2S,1848.capture = {1849.stream_name = "Connsys I2S",1850.channels_min = 1,1851.channels_max = 2,1852.rates = MTK_CONNSYS_I2S_RATES,1853.formats = MTK_I2S_FORMATS,1854},1855.ops = &mtk_dai_connsys_i2s_ops,1856},1857{1858.name = "I2S0",1859.id = MT8192_DAI_I2S_0,1860.capture = {1861.stream_name = "I2S0",1862.channels_min = 1,1863.channels_max = 2,1864.rates = MTK_I2S_RATES,1865.formats = MTK_I2S_FORMATS,1866},1867.ops = &mtk_dai_i2s_ops,1868},1869{1870.name = "I2S1",1871.id = MT8192_DAI_I2S_1,1872.playback = {1873.stream_name = "I2S1",1874.channels_min = 1,1875.channels_max = 2,1876.rates = MTK_I2S_RATES,1877.formats = MTK_I2S_FORMATS,1878},1879.ops = &mtk_dai_i2s_ops,1880},1881{1882.name = "I2S2",1883.id = MT8192_DAI_I2S_2,1884.capture = {1885.stream_name = "I2S2",1886.channels_min = 1,1887.channels_max = 2,1888.rates = MTK_I2S_RATES,1889.formats = MTK_I2S_FORMATS,1890},1891.ops = &mtk_dai_i2s_ops,1892},1893{1894.name = "I2S3",1895.id = MT8192_DAI_I2S_3,1896.playback = {1897.stream_name = "I2S3",1898.channels_min = 1,1899.channels_max = 2,1900.rates = MTK_I2S_RATES,1901.formats = MTK_I2S_FORMATS,1902},1903.ops = &mtk_dai_i2s_ops,1904},1905{1906.name = "I2S5",1907.id = MT8192_DAI_I2S_5,1908.playback = {1909.stream_name = "I2S5",1910.channels_min = 1,1911.channels_max = 2,1912.rates = MTK_I2S_RATES,1913.formats = MTK_I2S_FORMATS,1914},1915.ops = &mtk_dai_i2s_ops,1916},1917{1918.name = "I2S6",1919.id = MT8192_DAI_I2S_6,1920.capture = {1921.stream_name = "I2S6",1922.channels_min = 1,1923.channels_max = 2,1924.rates = MTK_I2S_RATES,1925.formats = MTK_I2S_FORMATS,1926},1927.ops = &mtk_dai_i2s_ops,1928},1929{1930.name = "I2S7",1931.id = MT8192_DAI_I2S_7,1932.playback = {1933.stream_name = "I2S7",1934.channels_min = 1,1935.channels_max = 2,1936.rates = MTK_I2S_RATES,1937.formats = MTK_I2S_FORMATS,1938},1939.ops = &mtk_dai_i2s_ops,1940},1941{1942.name = "I2S8",1943.id = MT8192_DAI_I2S_8,1944.capture = {1945.stream_name = "I2S8",1946.channels_min = 1,1947.channels_max = 2,1948.rates = MTK_I2S_RATES,1949.formats = MTK_I2S_FORMATS,1950},1951.ops = &mtk_dai_i2s_ops,1952},1953{1954.name = "I2S9",1955.id = MT8192_DAI_I2S_9,1956.playback = {1957.stream_name = "I2S9",1958.channels_min = 1,1959.channels_max = 2,1960.rates = MTK_I2S_RATES,1961.formats = MTK_I2S_FORMATS,1962},1963.ops = &mtk_dai_i2s_ops,1964}1965};19661967/* this enum is merely for mtk_afe_i2s_priv declare */1968enum {1969DAI_I2S0 = 0,1970DAI_I2S1,1971DAI_I2S2,1972DAI_I2S3,1973DAI_I2S5,1974DAI_I2S6,1975DAI_I2S7,1976DAI_I2S8,1977DAI_I2S9,1978DAI_I2S_NUM,1979};19801981static const struct mtk_afe_i2s_priv mt8192_i2s_priv[DAI_I2S_NUM] = {1982[DAI_I2S0] = {1983.id = MT8192_DAI_I2S_0,1984.mclk_id = MT8192_I2S0_MCK,1985.share_i2s_id = -1,1986},1987[DAI_I2S1] = {1988.id = MT8192_DAI_I2S_1,1989.mclk_id = MT8192_I2S1_MCK,1990.share_i2s_id = -1,1991},1992[DAI_I2S2] = {1993.id = MT8192_DAI_I2S_2,1994.mclk_id = MT8192_I2S2_MCK,1995.share_i2s_id = -1,1996},1997[DAI_I2S3] = {1998.id = MT8192_DAI_I2S_3,1999.mclk_id = MT8192_I2S3_MCK,2000.share_i2s_id = -1,2001},2002[DAI_I2S5] = {2003.id = MT8192_DAI_I2S_5,2004.mclk_id = MT8192_I2S5_MCK,2005.share_i2s_id = -1,2006},2007[DAI_I2S6] = {2008.id = MT8192_DAI_I2S_6,2009.mclk_id = MT8192_I2S6_MCK,2010.share_i2s_id = -1,2011},2012[DAI_I2S7] = {2013.id = MT8192_DAI_I2S_7,2014.mclk_id = MT8192_I2S7_MCK,2015.share_i2s_id = -1,2016},2017[DAI_I2S8] = {2018.id = MT8192_DAI_I2S_8,2019.mclk_id = MT8192_I2S8_MCK,2020.share_i2s_id = -1,2021},2022[DAI_I2S9] = {2023.id = MT8192_DAI_I2S_9,2024.mclk_id = MT8192_I2S9_MCK,2025.share_i2s_id = -1,2026},2027};20282029/**2030* mt8192_dai_i2s_set_share() - Set up I2S ports to share a single clock.2031* @afe: Pointer to &struct mtk_base_afe2032* @main_i2s_name: The name of the I2S port that will provide the clock2033* @secondary_i2s_name: The name of the I2S port that will use this clock2034*/2035int mt8192_dai_i2s_set_share(struct mtk_base_afe *afe, const char *main_i2s_name,2036const char *secondary_i2s_name)2037{2038struct mtk_afe_i2s_priv *secondary_i2s_priv;2039int main_i2s_id;20402041secondary_i2s_priv = get_i2s_priv_by_name(afe, secondary_i2s_name);2042if (!secondary_i2s_priv)2043return -EINVAL;20442045main_i2s_id = get_i2s_id_by_name(afe, main_i2s_name);2046if (main_i2s_id < 0)2047return main_i2s_id;20482049secondary_i2s_priv->share_i2s_id = main_i2s_id;20502051return 0;2052}2053EXPORT_SYMBOL_GPL(mt8192_dai_i2s_set_share);20542055static int mt8192_dai_i2s_set_priv(struct mtk_base_afe *afe)2056{2057int i;2058int ret;20592060for (i = 0; i < DAI_I2S_NUM; i++) {2061ret = mt8192_dai_set_priv(afe, mt8192_i2s_priv[i].id,2062sizeof(struct mtk_afe_i2s_priv),2063&mt8192_i2s_priv[i]);2064if (ret)2065return ret;2066}20672068return 0;2069}20702071int mt8192_dai_i2s_register(struct mtk_base_afe *afe)2072{2073struct mtk_base_afe_dai *dai;2074int ret;20752076dev_dbg(afe->dev, "%s()\n", __func__);20772078dai = devm_kzalloc(afe->dev, sizeof(*dai), GFP_KERNEL);2079if (!dai)2080return -ENOMEM;20812082list_add(&dai->list, &afe->sub_dais);20832084dai->dai_drivers = mtk_dai_i2s_driver;2085dai->num_dai_drivers = ARRAY_SIZE(mtk_dai_i2s_driver);20862087dai->controls = mtk_dai_i2s_controls;2088dai->num_controls = ARRAY_SIZE(mtk_dai_i2s_controls);2089dai->dapm_widgets = mtk_dai_i2s_widgets;2090dai->num_dapm_widgets = ARRAY_SIZE(mtk_dai_i2s_widgets);2091dai->dapm_routes = mtk_dai_i2s_routes;2092dai->num_dapm_routes = ARRAY_SIZE(mtk_dai_i2s_routes);20932094/* set all dai i2s private data */2095ret = mt8192_dai_i2s_set_priv(afe);2096if (ret)2097return ret;20982099return 0;2100}210121022103