1248 lines · c
1// SPDX-License-Identifier: GPL-2.02//3// mt8192-mt6359-rt1015-rt5682.c --4// MT8192-MT6359-RT1015-RT6358 ALSA SoC machine driver5//6// Copyright (c) 2020 MediaTek Inc.7// Author: Jiaxin Yu <jiaxin.yu@mediatek.com>8//9 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/rt5682.h>17#include <sound/soc.h>18 19#include "../../codecs/mt6359.h"20#include "../../codecs/rt1015.h"21#include "../../codecs/rt5682.h"22#include "../common/mtk-afe-platform-driver.h"23#include "../common/mtk-soc-card.h"24#include "../common/mtk-soundcard-driver.h"25#include "mt8192-afe-common.h"26#include "mt8192-afe-clk.h"27#include "mt8192-afe-gpio.h"28 29#define DRIVER_NAME "mt8192_mt6359"30 31#define RT1015_CODEC_DAI "rt1015-aif"32#define RT1015_DEV0_NAME "rt1015.1-0028"33#define RT1015_DEV1_NAME "rt1015.1-0029"34 35#define RT1015_RT5682_CARD_NAME "mt8192_mt6359_rt1015_rt5682"36#define RT1015P_RT5682_CARD_NAME "mt8192_mt6359_rt1015p_rt5682"37#define RT1015P_RT5682S_CARD_NAME "mt8192_mt6359_rt1015p_rt5682s"38 39#define RT1015_RT5682_OF_NAME "mediatek,mt8192_mt6359_rt1015_rt5682"40#define RT1015P_RT5682_OF_NAME "mediatek,mt8192_mt6359_rt1015p_rt5682"41#define RT1015P_RT5682S_OF_NAME "mediatek,mt8192_mt6359_rt1015p_rt5682s"42 43enum mt8192_jacks {44 MT8192_JACK_HEADSET,45 MT8192_JACK_HDMI,46 MT8192_JACK_MAX,47};48 49/* Headset jack detection DAPM pins */50static struct snd_soc_jack_pin mt8192_jack_pins[] = {51 {52 .pin = "Headphone Jack",53 .mask = SND_JACK_HEADPHONE,54 },55 {56 .pin = "Headset Mic",57 .mask = SND_JACK_MICROPHONE,58 },59};60 61static int mt8192_rt1015_i2s_hw_params(struct snd_pcm_substream *substream,62 struct snd_pcm_hw_params *params)63{64 struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);65 struct snd_soc_card *card = rtd->card;66 struct snd_soc_dai *cpu_dai = snd_soc_rtd_to_cpu(rtd, 0);67 struct snd_soc_dai *codec_dai;68 unsigned int rate = params_rate(params);69 unsigned int mclk_fs_ratio = 128;70 unsigned int mclk_fs = rate * mclk_fs_ratio;71 int ret, i;72 73 for_each_rtd_codec_dais(rtd, i, codec_dai) {74 ret = snd_soc_dai_set_pll(codec_dai, 0,75 RT1015_PLL_S_BCLK,76 params_rate(params) * 64,77 params_rate(params) * 256);78 if (ret) {79 dev_err(card->dev, "failed to set pll\n");80 return ret;81 }82 83 ret = snd_soc_dai_set_sysclk(codec_dai,84 RT1015_SCLK_S_PLL,85 params_rate(params) * 256,86 SND_SOC_CLOCK_IN);87 if (ret) {88 dev_err(card->dev, "failed to set sysclk\n");89 return ret;90 }91 }92 93 return snd_soc_dai_set_sysclk(cpu_dai, 0, mclk_fs, SND_SOC_CLOCK_OUT);94}95 96static int mt8192_rt5682x_i2s_hw_params(struct snd_pcm_substream *substream,97 struct snd_pcm_hw_params *params)98{99 struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);100 struct snd_soc_card *card = rtd->card;101 struct snd_soc_dai *cpu_dai = snd_soc_rtd_to_cpu(rtd, 0);102 struct snd_soc_dai *codec_dai = snd_soc_rtd_to_codec(rtd, 0);103 unsigned int rate = params_rate(params);104 unsigned int mclk_fs_ratio = 128;105 unsigned int mclk_fs = rate * mclk_fs_ratio;106 int bitwidth;107 int ret;108 109 bitwidth = snd_pcm_format_width(params_format(params));110 if (bitwidth < 0) {111 dev_err(card->dev, "invalid bit width: %d\n", bitwidth);112 return bitwidth;113 }114 115 ret = snd_soc_dai_set_tdm_slot(codec_dai, 0x00, 0x0, 0x2, bitwidth);116 if (ret) {117 dev_err(card->dev, "failed to set tdm slot\n");118 return ret;119 }120 121 ret = snd_soc_dai_set_pll(codec_dai, RT5682_PLL1,122 RT5682_PLL1_S_BCLK1,123 params_rate(params) * 64,124 params_rate(params) * 512);125 if (ret) {126 dev_err(card->dev, "failed to set pll\n");127 return ret;128 }129 130 ret = snd_soc_dai_set_sysclk(codec_dai,131 RT5682_SCLK_S_PLL1,132 params_rate(params) * 512,133 SND_SOC_CLOCK_IN);134 if (ret) {135 dev_err(card->dev, "failed to set sysclk\n");136 return ret;137 }138 139 return snd_soc_dai_set_sysclk(cpu_dai, 0, mclk_fs, SND_SOC_CLOCK_OUT);140}141 142static const struct snd_soc_ops mt8192_rt1015_i2s_ops = {143 .hw_params = mt8192_rt1015_i2s_hw_params,144};145 146static const struct snd_soc_ops mt8192_rt5682x_i2s_ops = {147 .hw_params = mt8192_rt5682x_i2s_hw_params,148};149 150static int mt8192_mt6359_mtkaif_calibration(struct snd_soc_pcm_runtime *rtd)151{152 struct snd_soc_component *cmpnt_afe =153 snd_soc_rtdcom_lookup(rtd, AFE_PCM_NAME);154 struct snd_soc_component *cmpnt_codec =155 snd_soc_rtd_to_codec(rtd, 0)->component;156 struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt_afe);157 struct mt8192_afe_private *afe_priv = afe->platform_priv;158 int phase;159 unsigned int monitor;160 int test_done_1, test_done_2, test_done_3;161 int cycle_1, cycle_2, cycle_3;162 int prev_cycle_1, prev_cycle_2, prev_cycle_3;163 int chosen_phase_1, chosen_phase_2, chosen_phase_3;164 int counter;165 int mtkaif_calib_ok;166 167 pm_runtime_get_sync(afe->dev);168 mt8192_afe_gpio_request(afe->dev, true, MT8192_DAI_ADDA, 1);169 mt8192_afe_gpio_request(afe->dev, true, MT8192_DAI_ADDA, 0);170 mt8192_afe_gpio_request(afe->dev, true, MT8192_DAI_ADDA_CH34, 1);171 mt8192_afe_gpio_request(afe->dev, true, MT8192_DAI_ADDA_CH34, 0);172 173 mt6359_mtkaif_calibration_enable(cmpnt_codec);174 175 /* set clock protocol 2 */176 regmap_update_bits(afe->regmap, AFE_AUD_PAD_TOP, 0xff, 0x38);177 regmap_update_bits(afe->regmap, AFE_AUD_PAD_TOP, 0xff, 0x39);178 179 /* set test type to synchronizer pulse */180 regmap_update_bits(afe_priv->topckgen,181 CKSYS_AUD_TOP_CFG, 0xffff, 0x4);182 183 mtkaif_calib_ok = true;184 afe_priv->mtkaif_calibration_num_phase = 42; /* mt6359: 0 ~ 42 */185 afe_priv->mtkaif_chosen_phase[0] = -1;186 afe_priv->mtkaif_chosen_phase[1] = -1;187 afe_priv->mtkaif_chosen_phase[2] = -1;188 189 for (phase = 0;190 phase <= afe_priv->mtkaif_calibration_num_phase &&191 mtkaif_calib_ok;192 phase++) {193 mt6359_set_mtkaif_calibration_phase(cmpnt_codec,194 phase, phase, phase);195 196 regmap_update_bits(afe_priv->topckgen,197 CKSYS_AUD_TOP_CFG, 0x1, 0x1);198 199 test_done_1 = 0;200 test_done_2 = 0;201 test_done_3 = 0;202 cycle_1 = -1;203 cycle_2 = -1;204 cycle_3 = -1;205 counter = 0;206 while (test_done_1 == 0 ||207 test_done_2 == 0 ||208 test_done_3 == 0) {209 regmap_read(afe_priv->topckgen,210 CKSYS_AUD_TOP_MON, &monitor);211 212 test_done_1 = (monitor >> 28) & 0x1;213 test_done_2 = (monitor >> 29) & 0x1;214 test_done_3 = (monitor >> 30) & 0x1;215 if (test_done_1 == 1)216 cycle_1 = monitor & 0xf;217 218 if (test_done_2 == 1)219 cycle_2 = (monitor >> 4) & 0xf;220 221 if (test_done_3 == 1)222 cycle_3 = (monitor >> 8) & 0xf;223 224 /* handle if never test done */225 if (++counter > 10000) {226 dev_err(afe->dev, "%s(), test fail, cycle_1 %d, cycle_2 %d, cycle_3 %d, monitor 0x%x\n",227 __func__,228 cycle_1, cycle_2, cycle_3, monitor);229 mtkaif_calib_ok = false;230 break;231 }232 }233 234 if (phase == 0) {235 prev_cycle_1 = cycle_1;236 prev_cycle_2 = cycle_2;237 prev_cycle_3 = cycle_3;238 }239 240 if (cycle_1 != prev_cycle_1 &&241 afe_priv->mtkaif_chosen_phase[0] < 0) {242 afe_priv->mtkaif_chosen_phase[0] = phase - 1;243 afe_priv->mtkaif_phase_cycle[0] = prev_cycle_1;244 }245 246 if (cycle_2 != prev_cycle_2 &&247 afe_priv->mtkaif_chosen_phase[1] < 0) {248 afe_priv->mtkaif_chosen_phase[1] = phase - 1;249 afe_priv->mtkaif_phase_cycle[1] = prev_cycle_2;250 }251 252 if (cycle_3 != prev_cycle_3 &&253 afe_priv->mtkaif_chosen_phase[2] < 0) {254 afe_priv->mtkaif_chosen_phase[2] = phase - 1;255 afe_priv->mtkaif_phase_cycle[2] = prev_cycle_3;256 }257 258 regmap_update_bits(afe_priv->topckgen,259 CKSYS_AUD_TOP_CFG, 0x1, 0x0);260 261 if (afe_priv->mtkaif_chosen_phase[0] >= 0 &&262 afe_priv->mtkaif_chosen_phase[1] >= 0 &&263 afe_priv->mtkaif_chosen_phase[2] >= 0)264 break;265 }266 267 if (afe_priv->mtkaif_chosen_phase[0] < 0)268 chosen_phase_1 = 0;269 else270 chosen_phase_1 = afe_priv->mtkaif_chosen_phase[0];271 272 if (afe_priv->mtkaif_chosen_phase[1] < 0)273 chosen_phase_2 = 0;274 else275 chosen_phase_2 = afe_priv->mtkaif_chosen_phase[1];276 277 if (afe_priv->mtkaif_chosen_phase[2] < 0)278 chosen_phase_3 = 0;279 else280 chosen_phase_3 = afe_priv->mtkaif_chosen_phase[2];281 282 mt6359_set_mtkaif_calibration_phase(cmpnt_codec,283 chosen_phase_1,284 chosen_phase_2,285 chosen_phase_3);286 287 /* disable rx fifo */288 regmap_update_bits(afe->regmap, AFE_AUD_PAD_TOP, 0xff, 0x38);289 290 mt6359_mtkaif_calibration_disable(cmpnt_codec);291 292 mt8192_afe_gpio_request(afe->dev, false, MT8192_DAI_ADDA, 1);293 mt8192_afe_gpio_request(afe->dev, false, MT8192_DAI_ADDA, 0);294 mt8192_afe_gpio_request(afe->dev, false, MT8192_DAI_ADDA_CH34, 1);295 mt8192_afe_gpio_request(afe->dev, false, MT8192_DAI_ADDA_CH34, 0);296 pm_runtime_put(afe->dev);297 298 dev_dbg(afe->dev, "%s(), mtkaif_chosen_phase[0/1/2]:%d/%d/%d\n",299 __func__,300 afe_priv->mtkaif_chosen_phase[0],301 afe_priv->mtkaif_chosen_phase[1],302 afe_priv->mtkaif_chosen_phase[2]);303 304 return 0;305}306 307static int mt8192_mt6359_init(struct snd_soc_pcm_runtime *rtd)308{309 struct snd_soc_component *cmpnt_afe =310 snd_soc_rtdcom_lookup(rtd, AFE_PCM_NAME);311 struct snd_soc_component *cmpnt_codec =312 snd_soc_rtd_to_codec(rtd, 0)->component;313 struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt_afe);314 struct mt8192_afe_private *afe_priv = afe->platform_priv;315 316 /* set mtkaif protocol */317 mt6359_set_mtkaif_protocol(cmpnt_codec,318 MT6359_MTKAIF_PROTOCOL_2_CLK_P2);319 afe_priv->mtkaif_protocol = MTKAIF_PROTOCOL_2_CLK_P2;320 321 /* mtkaif calibration */322 mt8192_mt6359_mtkaif_calibration(rtd);323 324 return 0;325}326 327static int mt8192_rt5682_init(struct snd_soc_pcm_runtime *rtd)328{329 struct mtk_soc_card_data *soc_card_data = snd_soc_card_get_drvdata(rtd->card);330 struct snd_soc_jack *jack = &soc_card_data->card_data->jacks[MT8192_JACK_HEADSET];331 struct snd_soc_component *cmpnt_afe =332 snd_soc_rtdcom_lookup(rtd, AFE_PCM_NAME);333 struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt_afe);334 struct snd_soc_component *cmpnt_codec =335 snd_soc_rtd_to_codec(rtd, 0)->component;336 int ret;337 338 ret = mt8192_dai_i2s_set_share(afe, "I2S8", "I2S9");339 if (ret) {340 dev_err(rtd->dev, "Failed to set up shared clocks\n");341 return ret;342 }343 344 ret = snd_soc_card_jack_new_pins(rtd->card, "Headset Jack",345 SND_JACK_HEADSET | SND_JACK_BTN_0 |346 SND_JACK_BTN_1 | SND_JACK_BTN_2 |347 SND_JACK_BTN_3,348 jack, mt8192_jack_pins,349 ARRAY_SIZE(mt8192_jack_pins));350 if (ret) {351 dev_err(rtd->dev, "Headset Jack creation failed: %d\n", ret);352 return ret;353 }354 355 snd_jack_set_key(jack->jack, SND_JACK_BTN_0, KEY_PLAYPAUSE);356 snd_jack_set_key(jack->jack, SND_JACK_BTN_1, KEY_VOICECOMMAND);357 snd_jack_set_key(jack->jack, SND_JACK_BTN_2, KEY_VOLUMEUP);358 snd_jack_set_key(jack->jack, SND_JACK_BTN_3, KEY_VOLUMEDOWN);359 360 return snd_soc_component_set_jack(cmpnt_codec, jack, NULL);361};362 363static int mt8192_mt6359_hdmi_init(struct snd_soc_pcm_runtime *rtd)364{365 struct mtk_soc_card_data *soc_card_data = snd_soc_card_get_drvdata(rtd->card);366 struct snd_soc_jack *jack = &soc_card_data->card_data->jacks[MT8192_JACK_HDMI];367 struct snd_soc_component *cmpnt_codec =368 snd_soc_rtd_to_codec(rtd, 0)->component;369 int ret;370 371 ret = snd_soc_card_jack_new(rtd->card, "HDMI Jack", SND_JACK_LINEOUT, jack);372 if (ret) {373 dev_err(rtd->dev, "HDMI Jack creation failed: %d\n", ret);374 return ret;375 }376 377 return snd_soc_component_set_jack(cmpnt_codec, jack, NULL);378}379 380static int mt8192_i2s_hw_params_fixup(struct snd_soc_pcm_runtime *rtd,381 struct snd_pcm_hw_params *params)382{383 /* fix BE i2s format to S24_LE, clean param mask first */384 snd_mask_reset_range(hw_param_mask(params, SNDRV_PCM_HW_PARAM_FORMAT),385 0, (__force unsigned int)SNDRV_PCM_FORMAT_LAST);386 387 params_set_format(params, SNDRV_PCM_FORMAT_S24_LE);388 389 return 0;390}391 392/* FE */393SND_SOC_DAILINK_DEFS(playback1,394 DAILINK_COMP_ARRAY(COMP_CPU("DL1")),395 DAILINK_COMP_ARRAY(COMP_DUMMY()),396 DAILINK_COMP_ARRAY(COMP_EMPTY()));397 398SND_SOC_DAILINK_DEFS(playback12,399 DAILINK_COMP_ARRAY(COMP_CPU("DL12")),400 DAILINK_COMP_ARRAY(COMP_DUMMY()),401 DAILINK_COMP_ARRAY(COMP_EMPTY()));402 403SND_SOC_DAILINK_DEFS(playback2,404 DAILINK_COMP_ARRAY(COMP_CPU("DL2")),405 DAILINK_COMP_ARRAY(COMP_DUMMY()),406 DAILINK_COMP_ARRAY(COMP_EMPTY()));407 408SND_SOC_DAILINK_DEFS(playback3,409 DAILINK_COMP_ARRAY(COMP_CPU("DL3")),410 DAILINK_COMP_ARRAY(COMP_DUMMY()),411 DAILINK_COMP_ARRAY(COMP_EMPTY()));412 413SND_SOC_DAILINK_DEFS(playback4,414 DAILINK_COMP_ARRAY(COMP_CPU("DL4")),415 DAILINK_COMP_ARRAY(COMP_DUMMY()),416 DAILINK_COMP_ARRAY(COMP_EMPTY()));417 418SND_SOC_DAILINK_DEFS(playback5,419 DAILINK_COMP_ARRAY(COMP_CPU("DL5")),420 DAILINK_COMP_ARRAY(COMP_DUMMY()),421 DAILINK_COMP_ARRAY(COMP_EMPTY()));422 423SND_SOC_DAILINK_DEFS(playback6,424 DAILINK_COMP_ARRAY(COMP_CPU("DL6")),425 DAILINK_COMP_ARRAY(COMP_DUMMY()),426 DAILINK_COMP_ARRAY(COMP_EMPTY()));427 428SND_SOC_DAILINK_DEFS(playback7,429 DAILINK_COMP_ARRAY(COMP_CPU("DL7")),430 DAILINK_COMP_ARRAY(COMP_DUMMY()),431 DAILINK_COMP_ARRAY(COMP_EMPTY()));432 433SND_SOC_DAILINK_DEFS(playback8,434 DAILINK_COMP_ARRAY(COMP_CPU("DL8")),435 DAILINK_COMP_ARRAY(COMP_DUMMY()),436 DAILINK_COMP_ARRAY(COMP_EMPTY()));437 438SND_SOC_DAILINK_DEFS(playback9,439 DAILINK_COMP_ARRAY(COMP_CPU("DL9")),440 DAILINK_COMP_ARRAY(COMP_DUMMY()),441 DAILINK_COMP_ARRAY(COMP_EMPTY()));442 443SND_SOC_DAILINK_DEFS(capture1,444 DAILINK_COMP_ARRAY(COMP_CPU("UL1")),445 DAILINK_COMP_ARRAY(COMP_DUMMY()),446 DAILINK_COMP_ARRAY(COMP_EMPTY()));447 448SND_SOC_DAILINK_DEFS(capture2,449 DAILINK_COMP_ARRAY(COMP_CPU("UL2")),450 DAILINK_COMP_ARRAY(COMP_DUMMY()),451 DAILINK_COMP_ARRAY(COMP_EMPTY()));452 453SND_SOC_DAILINK_DEFS(capture3,454 DAILINK_COMP_ARRAY(COMP_CPU("UL3")),455 DAILINK_COMP_ARRAY(COMP_DUMMY()),456 DAILINK_COMP_ARRAY(COMP_EMPTY()));457 458SND_SOC_DAILINK_DEFS(capture4,459 DAILINK_COMP_ARRAY(COMP_CPU("UL4")),460 DAILINK_COMP_ARRAY(COMP_DUMMY()),461 DAILINK_COMP_ARRAY(COMP_EMPTY()));462 463SND_SOC_DAILINK_DEFS(capture5,464 DAILINK_COMP_ARRAY(COMP_CPU("UL5")),465 DAILINK_COMP_ARRAY(COMP_DUMMY()),466 DAILINK_COMP_ARRAY(COMP_EMPTY()));467 468SND_SOC_DAILINK_DEFS(capture6,469 DAILINK_COMP_ARRAY(COMP_CPU("UL6")),470 DAILINK_COMP_ARRAY(COMP_DUMMY()),471 DAILINK_COMP_ARRAY(COMP_EMPTY()));472 473SND_SOC_DAILINK_DEFS(capture7,474 DAILINK_COMP_ARRAY(COMP_CPU("UL7")),475 DAILINK_COMP_ARRAY(COMP_DUMMY()),476 DAILINK_COMP_ARRAY(COMP_EMPTY()));477 478SND_SOC_DAILINK_DEFS(capture8,479 DAILINK_COMP_ARRAY(COMP_CPU("UL8")),480 DAILINK_COMP_ARRAY(COMP_DUMMY()),481 DAILINK_COMP_ARRAY(COMP_EMPTY()));482 483SND_SOC_DAILINK_DEFS(capture_mono1,484 DAILINK_COMP_ARRAY(COMP_CPU("UL_MONO_1")),485 DAILINK_COMP_ARRAY(COMP_DUMMY()),486 DAILINK_COMP_ARRAY(COMP_EMPTY()));487 488SND_SOC_DAILINK_DEFS(capture_mono2,489 DAILINK_COMP_ARRAY(COMP_CPU("UL_MONO_2")),490 DAILINK_COMP_ARRAY(COMP_DUMMY()),491 DAILINK_COMP_ARRAY(COMP_EMPTY()));492 493SND_SOC_DAILINK_DEFS(capture_mono3,494 DAILINK_COMP_ARRAY(COMP_CPU("UL_MONO_3")),495 DAILINK_COMP_ARRAY(COMP_DUMMY()),496 DAILINK_COMP_ARRAY(COMP_EMPTY()));497 498SND_SOC_DAILINK_DEFS(playback_hdmi,499 DAILINK_COMP_ARRAY(COMP_CPU("HDMI")),500 DAILINK_COMP_ARRAY(COMP_DUMMY()),501 DAILINK_COMP_ARRAY(COMP_EMPTY()));502 503/* BE */504SND_SOC_DAILINK_DEFS(primary_codec,505 DAILINK_COMP_ARRAY(COMP_CPU("ADDA")),506 DAILINK_COMP_ARRAY(COMP_CODEC("mt6359-sound",507 "mt6359-snd-codec-aif1"),508 COMP_CODEC("dmic-codec",509 "dmic-hifi")),510 DAILINK_COMP_ARRAY(COMP_EMPTY()));511 512SND_SOC_DAILINK_DEFS(primary_codec_ch34,513 DAILINK_COMP_ARRAY(COMP_CPU("ADDA_CH34")),514 DAILINK_COMP_ARRAY(COMP_CODEC("mt6359-sound",515 "mt6359-snd-codec-aif2")),516 DAILINK_COMP_ARRAY(COMP_EMPTY()));517 518SND_SOC_DAILINK_DEFS(ap_dmic,519 DAILINK_COMP_ARRAY(COMP_CPU("AP_DMIC")),520 DAILINK_COMP_ARRAY(COMP_DUMMY()),521 DAILINK_COMP_ARRAY(COMP_EMPTY()));522 523SND_SOC_DAILINK_DEFS(ap_dmic_ch34,524 DAILINK_COMP_ARRAY(COMP_CPU("AP_DMIC_CH34")),525 DAILINK_COMP_ARRAY(COMP_DUMMY()),526 DAILINK_COMP_ARRAY(COMP_EMPTY()));527 528SND_SOC_DAILINK_DEFS(i2s0,529 DAILINK_COMP_ARRAY(COMP_CPU("I2S0")),530 DAILINK_COMP_ARRAY(COMP_DUMMY()),531 DAILINK_COMP_ARRAY(COMP_EMPTY()));532 533SND_SOC_DAILINK_DEFS(i2s1,534 DAILINK_COMP_ARRAY(COMP_CPU("I2S1")),535 DAILINK_COMP_ARRAY(COMP_DUMMY()),536 DAILINK_COMP_ARRAY(COMP_EMPTY()));537 538SND_SOC_DAILINK_DEFS(i2s2,539 DAILINK_COMP_ARRAY(COMP_CPU("I2S2")),540 DAILINK_COMP_ARRAY(COMP_DUMMY()),541 DAILINK_COMP_ARRAY(COMP_EMPTY()));542 543SND_SOC_DAILINK_DEFS(i2s3,544 DAILINK_COMP_ARRAY(COMP_CPU("I2S3")),545 DAILINK_COMP_ARRAY(COMP_EMPTY()),546 DAILINK_COMP_ARRAY(COMP_EMPTY()));547 548SND_SOC_DAILINK_DEFS(i2s5,549 DAILINK_COMP_ARRAY(COMP_CPU("I2S5")),550 DAILINK_COMP_ARRAY(COMP_DUMMY()),551 DAILINK_COMP_ARRAY(COMP_EMPTY()));552 553SND_SOC_DAILINK_DEFS(i2s6,554 DAILINK_COMP_ARRAY(COMP_CPU("I2S6")),555 DAILINK_COMP_ARRAY(COMP_DUMMY()),556 DAILINK_COMP_ARRAY(COMP_EMPTY()));557 558SND_SOC_DAILINK_DEFS(i2s7,559 DAILINK_COMP_ARRAY(COMP_CPU("I2S7")),560 DAILINK_COMP_ARRAY(COMP_DUMMY()),561 DAILINK_COMP_ARRAY(COMP_EMPTY()));562 563SND_SOC_DAILINK_DEFS(i2s8,564 DAILINK_COMP_ARRAY(COMP_CPU("I2S8")),565 DAILINK_COMP_ARRAY(COMP_EMPTY()),566 DAILINK_COMP_ARRAY(COMP_EMPTY()));567 568SND_SOC_DAILINK_DEFS(i2s9,569 DAILINK_COMP_ARRAY(COMP_CPU("I2S9")),570 DAILINK_COMP_ARRAY(COMP_EMPTY()),571 DAILINK_COMP_ARRAY(COMP_EMPTY()));572 573SND_SOC_DAILINK_DEFS(connsys_i2s,574 DAILINK_COMP_ARRAY(COMP_CPU("CONNSYS_I2S")),575 DAILINK_COMP_ARRAY(COMP_DUMMY()),576 DAILINK_COMP_ARRAY(COMP_EMPTY()));577 578SND_SOC_DAILINK_DEFS(pcm1,579 DAILINK_COMP_ARRAY(COMP_CPU("PCM 1")),580 DAILINK_COMP_ARRAY(COMP_DUMMY()),581 DAILINK_COMP_ARRAY(COMP_EMPTY()));582 583SND_SOC_DAILINK_DEFS(pcm2,584 DAILINK_COMP_ARRAY(COMP_CPU("PCM 2")),585 DAILINK_COMP_ARRAY(COMP_DUMMY()),586 DAILINK_COMP_ARRAY(COMP_EMPTY()));587 588SND_SOC_DAILINK_DEFS(tdm,589 DAILINK_COMP_ARRAY(COMP_CPU("TDM")),590 DAILINK_COMP_ARRAY(COMP_CODEC(NULL, "i2s-hifi")),591 DAILINK_COMP_ARRAY(COMP_EMPTY()));592 593static struct snd_soc_dai_link mt8192_mt6359_dai_links[] = {594 /* Front End DAI links */595 {596 .name = "Playback_1",597 .stream_name = "Playback_1",598 .trigger = {SND_SOC_DPCM_TRIGGER_PRE,599 SND_SOC_DPCM_TRIGGER_PRE},600 .dynamic = 1,601 .dpcm_playback = 1,602 SND_SOC_DAILINK_REG(playback1),603 },604 {605 .name = "Playback_12",606 .stream_name = "Playback_12",607 .trigger = {SND_SOC_DPCM_TRIGGER_PRE,608 SND_SOC_DPCM_TRIGGER_PRE},609 .dynamic = 1,610 .dpcm_playback = 1,611 SND_SOC_DAILINK_REG(playback12),612 },613 {614 .name = "Playback_2",615 .stream_name = "Playback_2",616 .trigger = {SND_SOC_DPCM_TRIGGER_PRE,617 SND_SOC_DPCM_TRIGGER_PRE},618 .dynamic = 1,619 .dpcm_playback = 1,620 SND_SOC_DAILINK_REG(playback2),621 },622 {623 .name = "Playback_3",624 .stream_name = "Playback_3",625 .trigger = {SND_SOC_DPCM_TRIGGER_PRE,626 SND_SOC_DPCM_TRIGGER_PRE},627 .dynamic = 1,628 .dpcm_playback = 1,629 .ops = &mtk_soundcard_common_playback_ops,630 SND_SOC_DAILINK_REG(playback3),631 },632 {633 .name = "Playback_4",634 .stream_name = "Playback_4",635 .trigger = {SND_SOC_DPCM_TRIGGER_PRE,636 SND_SOC_DPCM_TRIGGER_PRE},637 .dynamic = 1,638 .dpcm_playback = 1,639 SND_SOC_DAILINK_REG(playback4),640 },641 {642 .name = "Playback_5",643 .stream_name = "Playback_5",644 .trigger = {SND_SOC_DPCM_TRIGGER_PRE,645 SND_SOC_DPCM_TRIGGER_PRE},646 .dynamic = 1,647 .dpcm_playback = 1,648 SND_SOC_DAILINK_REG(playback5),649 },650 {651 .name = "Playback_6",652 .stream_name = "Playback_6",653 .trigger = {SND_SOC_DPCM_TRIGGER_PRE,654 SND_SOC_DPCM_TRIGGER_PRE},655 .dynamic = 1,656 .dpcm_playback = 1,657 SND_SOC_DAILINK_REG(playback6),658 },659 {660 .name = "Playback_7",661 .stream_name = "Playback_7",662 .trigger = {SND_SOC_DPCM_TRIGGER_PRE,663 SND_SOC_DPCM_TRIGGER_PRE},664 .dynamic = 1,665 .dpcm_playback = 1,666 SND_SOC_DAILINK_REG(playback7),667 },668 {669 .name = "Playback_8",670 .stream_name = "Playback_8",671 .trigger = {SND_SOC_DPCM_TRIGGER_PRE,672 SND_SOC_DPCM_TRIGGER_PRE},673 .dynamic = 1,674 .dpcm_playback = 1,675 SND_SOC_DAILINK_REG(playback8),676 },677 {678 .name = "Playback_9",679 .stream_name = "Playback_9",680 .trigger = {SND_SOC_DPCM_TRIGGER_PRE,681 SND_SOC_DPCM_TRIGGER_PRE},682 .dynamic = 1,683 .dpcm_playback = 1,684 SND_SOC_DAILINK_REG(playback9),685 },686 {687 .name = "Capture_1",688 .stream_name = "Capture_1",689 .trigger = {SND_SOC_DPCM_TRIGGER_PRE,690 SND_SOC_DPCM_TRIGGER_PRE},691 .dynamic = 1,692 .dpcm_capture = 1,693 .ops = &mtk_soundcard_common_capture_ops,694 SND_SOC_DAILINK_REG(capture1),695 },696 {697 .name = "Capture_2",698 .stream_name = "Capture_2",699 .trigger = {SND_SOC_DPCM_TRIGGER_PRE,700 SND_SOC_DPCM_TRIGGER_PRE},701 .dynamic = 1,702 .dpcm_capture = 1,703 .ops = &mtk_soundcard_common_playback_ops,704 SND_SOC_DAILINK_REG(capture2),705 },706 {707 .name = "Capture_3",708 .stream_name = "Capture_3",709 .trigger = {SND_SOC_DPCM_TRIGGER_PRE,710 SND_SOC_DPCM_TRIGGER_PRE},711 .dynamic = 1,712 .dpcm_capture = 1,713 SND_SOC_DAILINK_REG(capture3),714 },715 {716 .name = "Capture_4",717 .stream_name = "Capture_4",718 .trigger = {SND_SOC_DPCM_TRIGGER_PRE,719 SND_SOC_DPCM_TRIGGER_PRE},720 .dynamic = 1,721 .dpcm_capture = 1,722 SND_SOC_DAILINK_REG(capture4),723 },724 {725 .name = "Capture_5",726 .stream_name = "Capture_5",727 .trigger = {SND_SOC_DPCM_TRIGGER_PRE,728 SND_SOC_DPCM_TRIGGER_PRE},729 .dynamic = 1,730 .dpcm_capture = 1,731 SND_SOC_DAILINK_REG(capture5),732 },733 {734 .name = "Capture_6",735 .stream_name = "Capture_6",736 .trigger = {SND_SOC_DPCM_TRIGGER_PRE,737 SND_SOC_DPCM_TRIGGER_PRE},738 .dynamic = 1,739 .dpcm_capture = 1,740 SND_SOC_DAILINK_REG(capture6),741 },742 {743 .name = "Capture_7",744 .stream_name = "Capture_7",745 .trigger = {SND_SOC_DPCM_TRIGGER_PRE,746 SND_SOC_DPCM_TRIGGER_PRE},747 .dynamic = 1,748 .dpcm_capture = 1,749 SND_SOC_DAILINK_REG(capture7),750 },751 {752 .name = "Capture_8",753 .stream_name = "Capture_8",754 .trigger = {SND_SOC_DPCM_TRIGGER_PRE,755 SND_SOC_DPCM_TRIGGER_PRE},756 .dynamic = 1,757 .dpcm_capture = 1,758 SND_SOC_DAILINK_REG(capture8),759 },760 {761 .name = "Capture_Mono_1",762 .stream_name = "Capture_Mono_1",763 .trigger = {SND_SOC_DPCM_TRIGGER_PRE,764 SND_SOC_DPCM_TRIGGER_PRE},765 .dynamic = 1,766 .dpcm_capture = 1,767 SND_SOC_DAILINK_REG(capture_mono1),768 },769 {770 .name = "Capture_Mono_2",771 .stream_name = "Capture_Mono_2",772 .trigger = {SND_SOC_DPCM_TRIGGER_PRE,773 SND_SOC_DPCM_TRIGGER_PRE},774 .dynamic = 1,775 .dpcm_capture = 1,776 SND_SOC_DAILINK_REG(capture_mono2),777 },778 {779 .name = "Capture_Mono_3",780 .stream_name = "Capture_Mono_3",781 .trigger = {SND_SOC_DPCM_TRIGGER_PRE,782 SND_SOC_DPCM_TRIGGER_PRE},783 .dynamic = 1,784 .dpcm_capture = 1,785 SND_SOC_DAILINK_REG(capture_mono3),786 },787 {788 .name = "playback_hdmi",789 .stream_name = "Playback_HDMI",790 .trigger = {SND_SOC_DPCM_TRIGGER_PRE,791 SND_SOC_DPCM_TRIGGER_PRE},792 .dynamic = 1,793 .dpcm_playback = 1,794 SND_SOC_DAILINK_REG(playback_hdmi),795 },796 /* Back End DAI links */797 {798 .name = "Primary Codec",799 .no_pcm = 1,800 .dpcm_playback = 1,801 .dpcm_capture = 1,802 .ignore_suspend = 1,803 .init = mt8192_mt6359_init,804 SND_SOC_DAILINK_REG(primary_codec),805 },806 {807 .name = "Primary Codec CH34",808 .no_pcm = 1,809 .dpcm_playback = 1,810 .dpcm_capture = 1,811 .ignore_suspend = 1,812 SND_SOC_DAILINK_REG(primary_codec_ch34),813 },814 {815 .name = "AP_DMIC",816 .no_pcm = 1,817 .dpcm_capture = 1,818 .ignore_suspend = 1,819 SND_SOC_DAILINK_REG(ap_dmic),820 },821 {822 .name = "AP_DMIC_CH34",823 .no_pcm = 1,824 .dpcm_capture = 1,825 .ignore_suspend = 1,826 SND_SOC_DAILINK_REG(ap_dmic_ch34),827 },828 {829 .name = "I2S0",830 .no_pcm = 1,831 .dpcm_capture = 1,832 .ignore_suspend = 1,833 .be_hw_params_fixup = mt8192_i2s_hw_params_fixup,834 SND_SOC_DAILINK_REG(i2s0),835 },836 {837 .name = "I2S1",838 .no_pcm = 1,839 .dpcm_playback = 1,840 .ignore_suspend = 1,841 .be_hw_params_fixup = mt8192_i2s_hw_params_fixup,842 SND_SOC_DAILINK_REG(i2s1),843 },844 {845 .name = "I2S2",846 .no_pcm = 1,847 .dpcm_capture = 1,848 .ignore_suspend = 1,849 .be_hw_params_fixup = mt8192_i2s_hw_params_fixup,850 SND_SOC_DAILINK_REG(i2s2),851 },852 {853 .name = "I2S3",854 .no_pcm = 1,855 .dpcm_playback = 1,856 .ignore_suspend = 1,857 .be_hw_params_fixup = mt8192_i2s_hw_params_fixup,858 SND_SOC_DAILINK_REG(i2s3),859 },860 {861 .name = "I2S5",862 .no_pcm = 1,863 .dpcm_playback = 1,864 .ignore_suspend = 1,865 .be_hw_params_fixup = mt8192_i2s_hw_params_fixup,866 SND_SOC_DAILINK_REG(i2s5),867 },868 {869 .name = "I2S6",870 .no_pcm = 1,871 .dpcm_capture = 1,872 .ignore_suspend = 1,873 .be_hw_params_fixup = mt8192_i2s_hw_params_fixup,874 SND_SOC_DAILINK_REG(i2s6),875 },876 {877 .name = "I2S7",878 .no_pcm = 1,879 .dpcm_playback = 1,880 .ignore_suspend = 1,881 .be_hw_params_fixup = mt8192_i2s_hw_params_fixup,882 SND_SOC_DAILINK_REG(i2s7),883 },884 {885 .name = "I2S8",886 .no_pcm = 1,887 .dpcm_capture = 1,888 .ignore_suspend = 1,889 .init = mt8192_rt5682_init,890 .be_hw_params_fixup = mt8192_i2s_hw_params_fixup,891 SND_SOC_DAILINK_REG(i2s8),892 .ops = &mt8192_rt5682x_i2s_ops,893 },894 {895 .name = "I2S9",896 .no_pcm = 1,897 .dpcm_playback = 1,898 .ignore_suspend = 1,899 .be_hw_params_fixup = mt8192_i2s_hw_params_fixup,900 SND_SOC_DAILINK_REG(i2s9),901 .ops = &mt8192_rt5682x_i2s_ops,902 },903 {904 .name = "CONNSYS_I2S",905 .no_pcm = 1,906 .dpcm_capture = 1,907 .ignore_suspend = 1,908 SND_SOC_DAILINK_REG(connsys_i2s),909 },910 {911 .name = "PCM 1",912 .no_pcm = 1,913 .dpcm_playback = 1,914 .dpcm_capture = 1,915 .ignore_suspend = 1,916 SND_SOC_DAILINK_REG(pcm1),917 },918 {919 .name = "PCM 2",920 .no_pcm = 1,921 .dpcm_playback = 1,922 .dpcm_capture = 1,923 .ignore_suspend = 1,924 SND_SOC_DAILINK_REG(pcm2),925 },926 {927 .name = "TDM",928 .no_pcm = 1,929 .dai_fmt = SND_SOC_DAIFMT_DSP_A |930 SND_SOC_DAIFMT_IB_NF |931 SND_SOC_DAIFMT_CBM_CFM,932 .dpcm_playback = 1,933 .ignore_suspend = 1,934 .be_hw_params_fixup = mt8192_i2s_hw_params_fixup,935 .ignore = 1,936 .init = mt8192_mt6359_hdmi_init,937 SND_SOC_DAILINK_REG(tdm),938 },939};940 941static const struct snd_soc_dapm_widget942mt8192_mt6359_rt1015_rt5682_widgets[] = {943 SND_SOC_DAPM_SPK("Left Spk", NULL),944 SND_SOC_DAPM_SPK("Right Spk", NULL),945 SND_SOC_DAPM_HP("Headphone Jack", NULL),946 SND_SOC_DAPM_MIC("Headset Mic", NULL),947 SND_SOC_DAPM_OUTPUT("TDM Out"),948};949 950static const struct snd_soc_dapm_route mt8192_mt6359_rt1015_rt5682_routes[] = {951 /* speaker */952 { "Left Spk", NULL, "Left SPO" },953 { "Right Spk", NULL, "Right SPO" },954 /* headset */955 { "Headphone Jack", NULL, "HPOL" },956 { "Headphone Jack", NULL, "HPOR" },957 { "IN1P", NULL, "Headset Mic" },958 /* TDM */959 { "TDM Out", NULL, "TDM" },960};961 962static const struct snd_kcontrol_new mt8192_mt6359_rt1015_rt5682_controls[] = {963 SOC_DAPM_PIN_SWITCH("Left Spk"),964 SOC_DAPM_PIN_SWITCH("Right Spk"),965 SOC_DAPM_PIN_SWITCH("Headphone Jack"),966 SOC_DAPM_PIN_SWITCH("Headset Mic"),967};968 969static struct snd_soc_codec_conf rt1015_amp_conf[] = {970 {971 .dlc = COMP_CODEC_CONF(RT1015_DEV0_NAME),972 .name_prefix = "Left",973 },974 {975 .dlc = COMP_CODEC_CONF(RT1015_DEV1_NAME),976 .name_prefix = "Right",977 },978};979 980static struct snd_soc_card mt8192_mt6359_rt1015_rt5682_card = {981 .name = RT1015_RT5682_CARD_NAME,982 .driver_name = DRIVER_NAME,983 .owner = THIS_MODULE,984 .dai_link = mt8192_mt6359_dai_links,985 .num_links = ARRAY_SIZE(mt8192_mt6359_dai_links),986 .controls = mt8192_mt6359_rt1015_rt5682_controls,987 .num_controls = ARRAY_SIZE(mt8192_mt6359_rt1015_rt5682_controls),988 .dapm_widgets = mt8192_mt6359_rt1015_rt5682_widgets,989 .num_dapm_widgets = ARRAY_SIZE(mt8192_mt6359_rt1015_rt5682_widgets),990 .dapm_routes = mt8192_mt6359_rt1015_rt5682_routes,991 .num_dapm_routes = ARRAY_SIZE(mt8192_mt6359_rt1015_rt5682_routes),992 .codec_conf = rt1015_amp_conf,993 .num_configs = ARRAY_SIZE(rt1015_amp_conf),994};995 996static const struct snd_soc_dapm_widget mt8192_mt6359_rt1015p_rt5682x_widgets[] = {997 SND_SOC_DAPM_SPK("Speakers", NULL),998 SND_SOC_DAPM_HP("Headphone Jack", NULL),999 SND_SOC_DAPM_MIC("Headset Mic", NULL),1000};1001 1002static const struct snd_soc_dapm_route mt8192_mt6359_rt1015p_rt5682x_routes[] = {1003 /* speaker */1004 { "Speakers", NULL, "Speaker" },1005 /* headset */1006 { "Headphone Jack", NULL, "HPOL" },1007 { "Headphone Jack", NULL, "HPOR" },1008 { "IN1P", NULL, "Headset Mic" },1009};1010 1011static const struct snd_kcontrol_new mt8192_mt6359_rt1015p_rt5682x_controls[] = {1012 SOC_DAPM_PIN_SWITCH("Speakers"),1013 SOC_DAPM_PIN_SWITCH("Headphone Jack"),1014 SOC_DAPM_PIN_SWITCH("Headset Mic"),1015};1016 1017static struct snd_soc_card mt8192_mt6359_rt1015p_rt5682x_card = {1018 .driver_name = DRIVER_NAME,1019 .owner = THIS_MODULE,1020 .dai_link = mt8192_mt6359_dai_links,1021 .num_links = ARRAY_SIZE(mt8192_mt6359_dai_links),1022 .controls = mt8192_mt6359_rt1015p_rt5682x_controls,1023 .num_controls = ARRAY_SIZE(mt8192_mt6359_rt1015p_rt5682x_controls),1024 .dapm_widgets = mt8192_mt6359_rt1015p_rt5682x_widgets,1025 .num_dapm_widgets = ARRAY_SIZE(mt8192_mt6359_rt1015p_rt5682x_widgets),1026 .dapm_routes = mt8192_mt6359_rt1015p_rt5682x_routes,1027 .num_dapm_routes = ARRAY_SIZE(mt8192_mt6359_rt1015p_rt5682x_routes),1028};1029 1030static int mt8192_mt6359_card_set_be_link(struct snd_soc_card *card,1031 struct snd_soc_dai_link *link,1032 struct device_node *node,1033 char *link_name)1034{1035 int ret;1036 1037 if (node && strcmp(link->name, link_name) == 0) {1038 ret = snd_soc_of_get_dai_link_codecs(card->dev, node, link);1039 if (ret < 0) {1040 dev_err_probe(card->dev, ret, "get dai link codecs fail\n");1041 return ret;1042 }1043 }1044 1045 return 0;1046}1047 1048static int mt8192_mt6359_legacy_probe(struct mtk_soc_card_data *soc_card_data)1049{1050 struct mtk_platform_card_data *card_data = soc_card_data->card_data;1051 struct snd_soc_card *card = card_data->card;1052 struct device *dev = card->dev;1053 struct device_node *hdmi_codec, *headset_codec, *speaker_codec;1054 struct snd_soc_dai_link *dai_link;1055 int i, ret = 0;1056 1057 hdmi_codec = of_parse_phandle(dev->of_node, "mediatek,hdmi-codec", 0);1058 if (!hdmi_codec)1059 dev_dbg(dev, "The machine has no hdmi-codec\n");1060 1061 speaker_codec = of_get_child_by_name(dev->of_node, "speaker-codecs");1062 if (!speaker_codec) {1063 ret = -EINVAL;1064 dev_err_probe(dev, ret, "Property 'speaker-codecs' missing or invalid\n");1065 goto err_speaker_codec;1066 }1067 1068 headset_codec = of_get_child_by_name(dev->of_node, "headset-codec");1069 if (!headset_codec) {1070 ret = -EINVAL;1071 dev_err_probe(dev, ret, "Property 'headset-codec' missing or invalid\n");1072 goto err_headset_codec;1073 }1074 1075 for_each_card_prelinks(card, i, dai_link) {1076 ret = mt8192_mt6359_card_set_be_link(card, dai_link, speaker_codec, "I2S3");1077 if (ret) {1078 dev_err_probe(dev, ret, "%s set speaker_codec fail\n",1079 dai_link->name);1080 break;1081 }1082 1083 ret = mt8192_mt6359_card_set_be_link(card, dai_link, headset_codec, "I2S8");1084 if (ret) {1085 dev_err_probe(dev, ret, "%s set headset_codec fail\n",1086 dai_link->name);1087 break;1088 }1089 1090 ret = mt8192_mt6359_card_set_be_link(card, dai_link, headset_codec, "I2S9");1091 if (ret) {1092 dev_err_probe(dev, ret, "%s set headset_codec fail\n",1093 dai_link->name);1094 break;1095 }1096 1097 if (hdmi_codec && strcmp(dai_link->name, "TDM") == 0) {1098 dai_link->codecs->of_node = hdmi_codec;1099 dai_link->ignore = 0;1100 }1101 1102 if (dai_link->num_codecs && dai_link->codecs[0].dai_name &&1103 strcmp(dai_link->codecs[0].dai_name, RT1015_CODEC_DAI) == 0)1104 dai_link->ops = &mt8192_rt1015_i2s_ops;1105 }1106 1107 of_node_put(headset_codec);1108err_headset_codec:1109 of_node_put(speaker_codec);1110err_speaker_codec:1111 of_node_put(hdmi_codec);1112 return ret;1113}1114 1115static int mt8192_mt6359_soc_card_probe(struct mtk_soc_card_data *soc_card_data, bool legacy)1116{1117 struct mtk_platform_card_data *card_data = soc_card_data->card_data;1118 struct snd_soc_card *card = card_data->card;1119 int ret;1120 1121 if (legacy) {1122 ret = mt8192_mt6359_legacy_probe(soc_card_data);1123 if (ret)1124 return ret;1125 } else {1126 struct snd_soc_dai_link *dai_link;1127 int i;1128 1129 for_each_card_prelinks(card, i, dai_link)1130 if (dai_link->num_codecs && dai_link->codecs[0].dai_name &&1131 strcmp(dai_link->codecs[0].dai_name, RT1015_CODEC_DAI) == 0)1132 dai_link->ops = &mt8192_rt1015_i2s_ops;1133 }1134 1135 ret = mt8192_afe_gpio_init(card->dev);1136 if (ret)1137 return dev_err_probe(card->dev, ret, "%s init gpio error\n", __func__);1138 1139 return 0;1140}1141 1142static const unsigned int mt8192_pcm_playback_channels[] = { 1, 2 };1143static const unsigned int mt8192_pcm_playback_rates[] = { 48000 };1144 1145static const unsigned int mt8192_pcm_capture_channels[] = { 1, 2, 4 };1146static const unsigned int mt8192_pcm_capture_rates[] = {1147 8000, 16000, 32000, 48000, 96000, 1920001148};1149 1150static const struct mtk_pcm_constraints_data mt8192_pcm_constraints[MTK_CONSTRAINT_CAPTURE + 1] = {1151 [MTK_CONSTRAINT_PLAYBACK] = {1152 .channels = &(const struct snd_pcm_hw_constraint_list) {1153 .list = mt8192_pcm_playback_channels,1154 .count = ARRAY_SIZE(mt8192_pcm_playback_channels)1155 },1156 .rates = &(const struct snd_pcm_hw_constraint_list) {1157 .list = mt8192_pcm_playback_rates,1158 .count = ARRAY_SIZE(mt8192_pcm_playback_rates)1159 }1160 },1161 [MTK_CONSTRAINT_CAPTURE] = {1162 .channels = &(const struct snd_pcm_hw_constraint_list) {1163 .list = mt8192_pcm_capture_channels,1164 .count = ARRAY_SIZE(mt8192_pcm_capture_channels)1165 },1166 .rates = &(const struct snd_pcm_hw_constraint_list) {1167 .list = mt8192_pcm_capture_rates,1168 .count = ARRAY_SIZE(mt8192_pcm_capture_rates)1169 }1170 }1171};1172 1173static const struct mtk_soundcard_pdata mt8192_mt6359_rt1015_rt5682_pdata = {1174 .card_name = RT1015_RT5682_CARD_NAME,1175 .card_data = &(struct mtk_platform_card_data) {1176 .card = &mt8192_mt6359_rt1015_rt5682_card,1177 .num_jacks = MT8192_JACK_MAX,1178 .pcm_constraints = mt8192_pcm_constraints,1179 .num_pcm_constraints = ARRAY_SIZE(mt8192_pcm_constraints),1180 },1181 .soc_probe = mt8192_mt6359_soc_card_probe1182};1183 1184static const struct mtk_soundcard_pdata mt8192_mt6359_rt1015p_rt5682_pdata = {1185 .card_name = RT1015P_RT5682_CARD_NAME,1186 .card_data = &(struct mtk_platform_card_data) {1187 .card = &mt8192_mt6359_rt1015p_rt5682x_card,1188 .num_jacks = MT8192_JACK_MAX,1189 .pcm_constraints = mt8192_pcm_constraints,1190 .num_pcm_constraints = ARRAY_SIZE(mt8192_pcm_constraints),1191 },1192 .soc_probe = mt8192_mt6359_soc_card_probe1193};1194 1195static const struct mtk_soundcard_pdata mt8192_mt6359_rt1015p_rt5682s_pdata = {1196 .card_name = RT1015P_RT5682S_CARD_NAME,1197 .card_data = &(struct mtk_platform_card_data) {1198 .card = &mt8192_mt6359_rt1015p_rt5682x_card,1199 .num_jacks = MT8192_JACK_MAX,1200 .pcm_constraints = mt8192_pcm_constraints,1201 .num_pcm_constraints = ARRAY_SIZE(mt8192_pcm_constraints),1202 },1203 .soc_probe = mt8192_mt6359_soc_card_probe1204};1205 1206#ifdef CONFIG_OF1207static const struct of_device_id mt8192_mt6359_dt_match[] = {1208 {1209 .compatible = RT1015_RT5682_OF_NAME,1210 .data = &mt8192_mt6359_rt1015_rt5682_pdata,1211 },1212 {1213 .compatible = RT1015P_RT5682_OF_NAME,1214 .data = &mt8192_mt6359_rt1015p_rt5682_pdata,1215 },1216 {1217 .compatible = RT1015P_RT5682S_OF_NAME,1218 .data = &mt8192_mt6359_rt1015p_rt5682s_pdata,1219 },1220 {}1221};1222MODULE_DEVICE_TABLE(of, mt8192_mt6359_dt_match);1223#endif1224 1225static const struct dev_pm_ops mt8192_mt6359_pm_ops = {1226 .poweroff = snd_soc_poweroff,1227 .restore = snd_soc_resume,1228};1229 1230static struct platform_driver mt8192_mt6359_driver = {1231 .driver = {1232 .name = DRIVER_NAME,1233#ifdef CONFIG_OF1234 .of_match_table = mt8192_mt6359_dt_match,1235#endif1236 .pm = &mt8192_mt6359_pm_ops,1237 },1238 .probe = mtk_soundcard_common_probe,1239};1240 1241module_platform_driver(mt8192_mt6359_driver);1242 1243/* Module information */1244MODULE_DESCRIPTION("MT8192-MT6359 ALSA SoC machine driver");1245MODULE_AUTHOR("Jiaxin Yu <jiaxin.yu@mediatek.com>");1246MODULE_LICENSE("GPL v2");1247MODULE_ALIAS("mt8192_mt6359 soc card");1248