18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 28c2ecf20Sopenharmony_ci// Copyright (c) 2020 Intel Corporation 38c2ecf20Sopenharmony_ci 48c2ecf20Sopenharmony_ci/* 58c2ecf20Sopenharmony_ci * ehl_rt5660 - ASOC Machine driver for Elkhart Lake platforms 68c2ecf20Sopenharmony_ci * with rt5660 codec 78c2ecf20Sopenharmony_ci */ 88c2ecf20Sopenharmony_ci 98c2ecf20Sopenharmony_ci#include <linux/acpi.h> 108c2ecf20Sopenharmony_ci#include <sound/core.h> 118c2ecf20Sopenharmony_ci#include <linux/device.h> 128c2ecf20Sopenharmony_ci#include <linux/errno.h> 138c2ecf20Sopenharmony_ci#include <linux/gfp.h> 148c2ecf20Sopenharmony_ci#include <sound/jack.h> 158c2ecf20Sopenharmony_ci#include <linux/kernel.h> 168c2ecf20Sopenharmony_ci#include <linux/list.h> 178c2ecf20Sopenharmony_ci#include <linux/module.h> 188c2ecf20Sopenharmony_ci#include <sound/pcm.h> 198c2ecf20Sopenharmony_ci#include <sound/pcm_params.h> 208c2ecf20Sopenharmony_ci#include <sound/soc.h> 218c2ecf20Sopenharmony_ci#include <sound/soc-acpi.h> 228c2ecf20Sopenharmony_ci 238c2ecf20Sopenharmony_ci#include "hda_dsp_common.h" 248c2ecf20Sopenharmony_ci#include "../../codecs/rt5660.h" 258c2ecf20Sopenharmony_ci 268c2ecf20Sopenharmony_ci#define DUAL_CHANNEL 2 278c2ecf20Sopenharmony_ci#define HDMI_LINK_START 3 288c2ecf20Sopenharmony_ci#define HDMI_LINE_END 6 298c2ecf20Sopenharmony_ci#define NAME_SIZE 32 308c2ecf20Sopenharmony_ci#define IDISP_CODEC_MASK 0x4 318c2ecf20Sopenharmony_ci 328c2ecf20Sopenharmony_cistruct sof_card_private { 338c2ecf20Sopenharmony_ci struct list_head hdmi_pcm_list; 348c2ecf20Sopenharmony_ci bool idisp_codec; 358c2ecf20Sopenharmony_ci}; 368c2ecf20Sopenharmony_ci 378c2ecf20Sopenharmony_cistatic const struct snd_kcontrol_new rt5660_controls[] = { 388c2ecf20Sopenharmony_ci SOC_DAPM_PIN_SWITCH("Speaker"), 398c2ecf20Sopenharmony_ci /* There are two MICBIAS in rt5660, each for one MIC */ 408c2ecf20Sopenharmony_ci SOC_DAPM_PIN_SWITCH("Headset Mic"), 418c2ecf20Sopenharmony_ci SOC_DAPM_PIN_SWITCH("Headset Mic2"), 428c2ecf20Sopenharmony_ci SOC_DAPM_PIN_SWITCH("Line Out"), 438c2ecf20Sopenharmony_ci}; 448c2ecf20Sopenharmony_ci 458c2ecf20Sopenharmony_cistatic const struct snd_soc_dapm_widget rt5660_widgets[] = { 468c2ecf20Sopenharmony_ci SND_SOC_DAPM_SPK("Speaker", NULL), 478c2ecf20Sopenharmony_ci SND_SOC_DAPM_MIC("Headset Mic", NULL), 488c2ecf20Sopenharmony_ci SND_SOC_DAPM_MIC("Headset Mic2", NULL), 498c2ecf20Sopenharmony_ci SND_SOC_DAPM_MIC("SoC DMIC", NULL), 508c2ecf20Sopenharmony_ci SND_SOC_DAPM_LINE("Line Out", NULL), 518c2ecf20Sopenharmony_ci}; 528c2ecf20Sopenharmony_ci 538c2ecf20Sopenharmony_cistatic const struct snd_soc_dapm_route rt5660_map[] = { 548c2ecf20Sopenharmony_ci {"Speaker", NULL, "SPO"}, 558c2ecf20Sopenharmony_ci 568c2ecf20Sopenharmony_ci {"Headset Mic", NULL, "MICBIAS1"}, 578c2ecf20Sopenharmony_ci {"Headset Mic2", NULL, "MICBIAS2"}, 588c2ecf20Sopenharmony_ci 598c2ecf20Sopenharmony_ci {"IN1P", NULL, "Headset Mic"}, 608c2ecf20Sopenharmony_ci {"IN2P", NULL, "Headset Mic2"}, 618c2ecf20Sopenharmony_ci 628c2ecf20Sopenharmony_ci {"Line Out", NULL, "LOUTL"}, 638c2ecf20Sopenharmony_ci {"Line Out", NULL, "LOUTR"}, 648c2ecf20Sopenharmony_ci 658c2ecf20Sopenharmony_ci {"DMic", NULL, "SoC DMIC"}, 668c2ecf20Sopenharmony_ci}; 678c2ecf20Sopenharmony_ci 688c2ecf20Sopenharmony_cistruct sof_hdmi_pcm { 698c2ecf20Sopenharmony_ci struct list_head head; 708c2ecf20Sopenharmony_ci struct snd_soc_dai *codec_dai; 718c2ecf20Sopenharmony_ci int device; 728c2ecf20Sopenharmony_ci}; 738c2ecf20Sopenharmony_ci 748c2ecf20Sopenharmony_cistatic int hdmi_init(struct snd_soc_pcm_runtime *rtd) 758c2ecf20Sopenharmony_ci{ 768c2ecf20Sopenharmony_ci struct sof_card_private *ctx = snd_soc_card_get_drvdata(rtd->card); 778c2ecf20Sopenharmony_ci struct snd_soc_dai *dai = asoc_rtd_to_codec(rtd, 0); 788c2ecf20Sopenharmony_ci struct sof_hdmi_pcm *pcm; 798c2ecf20Sopenharmony_ci 808c2ecf20Sopenharmony_ci pcm = devm_kzalloc(rtd->card->dev, sizeof(*pcm), GFP_KERNEL); 818c2ecf20Sopenharmony_ci if (!pcm) 828c2ecf20Sopenharmony_ci return -ENOMEM; 838c2ecf20Sopenharmony_ci 848c2ecf20Sopenharmony_ci /* dai_link id is 1:1 mapped to the PCM device */ 858c2ecf20Sopenharmony_ci pcm->device = rtd->dai_link->id; 868c2ecf20Sopenharmony_ci pcm->codec_dai = dai; 878c2ecf20Sopenharmony_ci 888c2ecf20Sopenharmony_ci list_add_tail(&pcm->head, &ctx->hdmi_pcm_list); 898c2ecf20Sopenharmony_ci 908c2ecf20Sopenharmony_ci return 0; 918c2ecf20Sopenharmony_ci} 928c2ecf20Sopenharmony_ci 938c2ecf20Sopenharmony_cistatic int card_late_probe(struct snd_soc_card *card) 948c2ecf20Sopenharmony_ci{ 958c2ecf20Sopenharmony_ci struct sof_card_private *ctx = snd_soc_card_get_drvdata(card); 968c2ecf20Sopenharmony_ci struct sof_hdmi_pcm *pcm; 978c2ecf20Sopenharmony_ci 988c2ecf20Sopenharmony_ci if (list_empty(&ctx->hdmi_pcm_list)) 998c2ecf20Sopenharmony_ci return -ENOENT; 1008c2ecf20Sopenharmony_ci 1018c2ecf20Sopenharmony_ci if (!ctx->idisp_codec) 1028c2ecf20Sopenharmony_ci return 0; 1038c2ecf20Sopenharmony_ci 1048c2ecf20Sopenharmony_ci pcm = list_first_entry(&ctx->hdmi_pcm_list, struct sof_hdmi_pcm, head); 1058c2ecf20Sopenharmony_ci 1068c2ecf20Sopenharmony_ci return hda_dsp_hdmi_build_controls(card, pcm->codec_dai->component); 1078c2ecf20Sopenharmony_ci} 1088c2ecf20Sopenharmony_ci 1098c2ecf20Sopenharmony_cistatic int rt5660_hw_params(struct snd_pcm_substream *substream, 1108c2ecf20Sopenharmony_ci struct snd_pcm_hw_params *params) 1118c2ecf20Sopenharmony_ci{ 1128c2ecf20Sopenharmony_ci struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream); 1138c2ecf20Sopenharmony_ci struct snd_soc_dai *codec_dai = asoc_rtd_to_codec(rtd, 0); 1148c2ecf20Sopenharmony_ci int ret; 1158c2ecf20Sopenharmony_ci 1168c2ecf20Sopenharmony_ci ret = snd_soc_dai_set_sysclk(codec_dai, 1178c2ecf20Sopenharmony_ci RT5660_SCLK_S_PLL1, 1188c2ecf20Sopenharmony_ci params_rate(params) * 512, 1198c2ecf20Sopenharmony_ci SND_SOC_CLOCK_IN); 1208c2ecf20Sopenharmony_ci if (ret < 0) { 1218c2ecf20Sopenharmony_ci dev_err(rtd->dev, "snd_soc_dai_set_sysclk err = %d\n", ret); 1228c2ecf20Sopenharmony_ci return ret; 1238c2ecf20Sopenharmony_ci } 1248c2ecf20Sopenharmony_ci 1258c2ecf20Sopenharmony_ci ret = snd_soc_dai_set_pll(codec_dai, 0, 1268c2ecf20Sopenharmony_ci RT5660_PLL1_S_BCLK, 1278c2ecf20Sopenharmony_ci params_rate(params) * 50, 1288c2ecf20Sopenharmony_ci params_rate(params) * 512); 1298c2ecf20Sopenharmony_ci if (ret < 0) 1308c2ecf20Sopenharmony_ci dev_err(codec_dai->dev, "can't set codec pll: %d\n", ret); 1318c2ecf20Sopenharmony_ci 1328c2ecf20Sopenharmony_ci return ret; 1338c2ecf20Sopenharmony_ci} 1348c2ecf20Sopenharmony_ci 1358c2ecf20Sopenharmony_cistatic struct snd_soc_ops rt5660_ops = { 1368c2ecf20Sopenharmony_ci .hw_params = rt5660_hw_params, 1378c2ecf20Sopenharmony_ci}; 1388c2ecf20Sopenharmony_ci 1398c2ecf20Sopenharmony_ciSND_SOC_DAILINK_DEF(ssp0_pin, 1408c2ecf20Sopenharmony_ci DAILINK_COMP_ARRAY(COMP_CPU("SSP0 Pin"))); 1418c2ecf20Sopenharmony_ci 1428c2ecf20Sopenharmony_ciSND_SOC_DAILINK_DEF(rt5660_codec, 1438c2ecf20Sopenharmony_ci DAILINK_COMP_ARRAY(COMP_CODEC("i2c-10EC5660:00", "rt5660-aif1"))); 1448c2ecf20Sopenharmony_ci 1458c2ecf20Sopenharmony_ciSND_SOC_DAILINK_DEF(platform, 1468c2ecf20Sopenharmony_ci DAILINK_COMP_ARRAY(COMP_PLATFORM("0000:00:1f.3"))); 1478c2ecf20Sopenharmony_ci 1488c2ecf20Sopenharmony_ciSND_SOC_DAILINK_DEF(dmic_pin, 1498c2ecf20Sopenharmony_ci DAILINK_COMP_ARRAY(COMP_CPU("DMIC01 Pin"))); 1508c2ecf20Sopenharmony_ciSND_SOC_DAILINK_DEF(dmic_codec, 1518c2ecf20Sopenharmony_ci DAILINK_COMP_ARRAY(COMP_CODEC("dmic-codec", "dmic-hifi"))); 1528c2ecf20Sopenharmony_ciSND_SOC_DAILINK_DEF(dmic16k, 1538c2ecf20Sopenharmony_ci DAILINK_COMP_ARRAY(COMP_CPU("DMIC16k Pin"))); 1548c2ecf20Sopenharmony_ci 1558c2ecf20Sopenharmony_ciSND_SOC_DAILINK_DEF(idisp1_pin, 1568c2ecf20Sopenharmony_ci DAILINK_COMP_ARRAY(COMP_CPU("iDisp1 Pin"))); 1578c2ecf20Sopenharmony_ciSND_SOC_DAILINK_DEF(idisp1_codec, 1588c2ecf20Sopenharmony_ci DAILINK_COMP_ARRAY(COMP_CODEC("ehdaudio0D2", "intel-hdmi-hifi1"))); 1598c2ecf20Sopenharmony_ci 1608c2ecf20Sopenharmony_ciSND_SOC_DAILINK_DEF(idisp2_pin, 1618c2ecf20Sopenharmony_ci DAILINK_COMP_ARRAY(COMP_CPU("iDisp2 Pin"))); 1628c2ecf20Sopenharmony_ciSND_SOC_DAILINK_DEF(idisp2_codec, 1638c2ecf20Sopenharmony_ci DAILINK_COMP_ARRAY(COMP_CODEC("ehdaudio0D2", "intel-hdmi-hifi2"))); 1648c2ecf20Sopenharmony_ci 1658c2ecf20Sopenharmony_ciSND_SOC_DAILINK_DEF(idisp3_pin, 1668c2ecf20Sopenharmony_ci DAILINK_COMP_ARRAY(COMP_CPU("iDisp3 Pin"))); 1678c2ecf20Sopenharmony_ciSND_SOC_DAILINK_DEF(idisp3_codec, 1688c2ecf20Sopenharmony_ci DAILINK_COMP_ARRAY(COMP_CODEC("ehdaudio0D2", "intel-hdmi-hifi3"))); 1698c2ecf20Sopenharmony_ci 1708c2ecf20Sopenharmony_ciSND_SOC_DAILINK_DEF(idisp4_pin, 1718c2ecf20Sopenharmony_ci DAILINK_COMP_ARRAY(COMP_CPU("iDisp4 Pin"))); 1728c2ecf20Sopenharmony_ciSND_SOC_DAILINK_DEF(idisp4_codec, 1738c2ecf20Sopenharmony_ci DAILINK_COMP_ARRAY(COMP_CODEC("ehdaudio0D2", "intel-hdmi-hifi4"))); 1748c2ecf20Sopenharmony_ci 1758c2ecf20Sopenharmony_cistatic struct snd_soc_dai_link ehl_rt5660_dailink[] = { 1768c2ecf20Sopenharmony_ci /* back ends */ 1778c2ecf20Sopenharmony_ci { 1788c2ecf20Sopenharmony_ci .name = "SSP0-Codec", 1798c2ecf20Sopenharmony_ci .id = 0, 1808c2ecf20Sopenharmony_ci .no_pcm = 1, 1818c2ecf20Sopenharmony_ci .dpcm_playback = 1, 1828c2ecf20Sopenharmony_ci .dpcm_capture = 1, 1838c2ecf20Sopenharmony_ci .ops = &rt5660_ops, 1848c2ecf20Sopenharmony_ci .nonatomic = true, 1858c2ecf20Sopenharmony_ci SND_SOC_DAILINK_REG(ssp0_pin, rt5660_codec, platform), 1868c2ecf20Sopenharmony_ci }, 1878c2ecf20Sopenharmony_ci { 1888c2ecf20Sopenharmony_ci .name = "dmic48k", 1898c2ecf20Sopenharmony_ci .id = 1, 1908c2ecf20Sopenharmony_ci .ignore_suspend = 1, 1918c2ecf20Sopenharmony_ci .dpcm_capture = 1, 1928c2ecf20Sopenharmony_ci .no_pcm = 1, 1938c2ecf20Sopenharmony_ci SND_SOC_DAILINK_REG(dmic_pin, dmic_codec, platform), 1948c2ecf20Sopenharmony_ci }, 1958c2ecf20Sopenharmony_ci { 1968c2ecf20Sopenharmony_ci .name = "dmic16k", 1978c2ecf20Sopenharmony_ci .id = 2, 1988c2ecf20Sopenharmony_ci .ignore_suspend = 1, 1998c2ecf20Sopenharmony_ci .dpcm_capture = 1, 2008c2ecf20Sopenharmony_ci .no_pcm = 1, 2018c2ecf20Sopenharmony_ci SND_SOC_DAILINK_REG(dmic16k, dmic_codec, platform), 2028c2ecf20Sopenharmony_ci }, 2038c2ecf20Sopenharmony_ci { 2048c2ecf20Sopenharmony_ci .name = "iDisp1", 2058c2ecf20Sopenharmony_ci .id = 5, 2068c2ecf20Sopenharmony_ci .init = hdmi_init, 2078c2ecf20Sopenharmony_ci .dpcm_playback = 1, 2088c2ecf20Sopenharmony_ci .no_pcm = 1, 2098c2ecf20Sopenharmony_ci SND_SOC_DAILINK_REG(idisp1_pin, idisp1_codec, platform), 2108c2ecf20Sopenharmony_ci }, 2118c2ecf20Sopenharmony_ci { 2128c2ecf20Sopenharmony_ci .name = "iDisp2", 2138c2ecf20Sopenharmony_ci .id = 6, 2148c2ecf20Sopenharmony_ci .init = hdmi_init, 2158c2ecf20Sopenharmony_ci .dpcm_playback = 1, 2168c2ecf20Sopenharmony_ci .no_pcm = 1, 2178c2ecf20Sopenharmony_ci SND_SOC_DAILINK_REG(idisp2_pin, idisp2_codec, platform), 2188c2ecf20Sopenharmony_ci }, 2198c2ecf20Sopenharmony_ci { 2208c2ecf20Sopenharmony_ci .name = "iDisp3", 2218c2ecf20Sopenharmony_ci .id = 7, 2228c2ecf20Sopenharmony_ci .init = hdmi_init, 2238c2ecf20Sopenharmony_ci .dpcm_playback = 1, 2248c2ecf20Sopenharmony_ci .no_pcm = 1, 2258c2ecf20Sopenharmony_ci SND_SOC_DAILINK_REG(idisp3_pin, idisp3_codec, platform), 2268c2ecf20Sopenharmony_ci }, 2278c2ecf20Sopenharmony_ci { 2288c2ecf20Sopenharmony_ci .name = "iDisp4", 2298c2ecf20Sopenharmony_ci .id = 8, 2308c2ecf20Sopenharmony_ci .init = hdmi_init, 2318c2ecf20Sopenharmony_ci .dpcm_playback = 1, 2328c2ecf20Sopenharmony_ci .no_pcm = 1, 2338c2ecf20Sopenharmony_ci SND_SOC_DAILINK_REG(idisp4_pin, idisp4_codec, platform), 2348c2ecf20Sopenharmony_ci }, 2358c2ecf20Sopenharmony_ci}; 2368c2ecf20Sopenharmony_ci 2378c2ecf20Sopenharmony_ci/* SoC card */ 2388c2ecf20Sopenharmony_cistatic struct snd_soc_card snd_soc_card_ehl_rt5660 = { 2398c2ecf20Sopenharmony_ci .name = "ehl-rt5660", 2408c2ecf20Sopenharmony_ci .owner = THIS_MODULE, 2418c2ecf20Sopenharmony_ci .dai_link = ehl_rt5660_dailink, 2428c2ecf20Sopenharmony_ci .num_links = ARRAY_SIZE(ehl_rt5660_dailink), 2438c2ecf20Sopenharmony_ci .dapm_widgets = rt5660_widgets, 2448c2ecf20Sopenharmony_ci .num_dapm_widgets = ARRAY_SIZE(rt5660_widgets), 2458c2ecf20Sopenharmony_ci .dapm_routes = rt5660_map, 2468c2ecf20Sopenharmony_ci .num_dapm_routes = ARRAY_SIZE(rt5660_map), 2478c2ecf20Sopenharmony_ci .controls = rt5660_controls, 2488c2ecf20Sopenharmony_ci .num_controls = ARRAY_SIZE(rt5660_controls), 2498c2ecf20Sopenharmony_ci .fully_routed = true, 2508c2ecf20Sopenharmony_ci .late_probe = card_late_probe, 2518c2ecf20Sopenharmony_ci}; 2528c2ecf20Sopenharmony_ci 2538c2ecf20Sopenharmony_ci/* If hdmi codec is not supported, switch to use dummy codec */ 2548c2ecf20Sopenharmony_cistatic void hdmi_link_init(struct snd_soc_card *card, 2558c2ecf20Sopenharmony_ci struct sof_card_private *ctx, 2568c2ecf20Sopenharmony_ci struct snd_soc_acpi_mach *mach) 2578c2ecf20Sopenharmony_ci{ 2588c2ecf20Sopenharmony_ci struct snd_soc_dai_link *link; 2598c2ecf20Sopenharmony_ci int i; 2608c2ecf20Sopenharmony_ci 2618c2ecf20Sopenharmony_ci if (mach->mach_params.common_hdmi_codec_drv && 2628c2ecf20Sopenharmony_ci (mach->mach_params.codec_mask & IDISP_CODEC_MASK)) { 2638c2ecf20Sopenharmony_ci ctx->idisp_codec = true; 2648c2ecf20Sopenharmony_ci return; 2658c2ecf20Sopenharmony_ci } 2668c2ecf20Sopenharmony_ci 2678c2ecf20Sopenharmony_ci /* 2688c2ecf20Sopenharmony_ci * if HDMI is not enabled in kernel config, or 2698c2ecf20Sopenharmony_ci * hdmi codec is not supported 2708c2ecf20Sopenharmony_ci */ 2718c2ecf20Sopenharmony_ci for (i = HDMI_LINK_START; i <= HDMI_LINE_END; i++) { 2728c2ecf20Sopenharmony_ci link = &card->dai_link[i]; 2738c2ecf20Sopenharmony_ci link->codecs[0].name = "snd-soc-dummy"; 2748c2ecf20Sopenharmony_ci link->codecs[0].dai_name = "snd-soc-dummy-dai"; 2758c2ecf20Sopenharmony_ci } 2768c2ecf20Sopenharmony_ci} 2778c2ecf20Sopenharmony_ci 2788c2ecf20Sopenharmony_cistatic int snd_ehl_rt5660_probe(struct platform_device *pdev) 2798c2ecf20Sopenharmony_ci{ 2808c2ecf20Sopenharmony_ci struct snd_soc_acpi_mach *mach; 2818c2ecf20Sopenharmony_ci struct snd_soc_card *card = &snd_soc_card_ehl_rt5660; 2828c2ecf20Sopenharmony_ci struct sof_card_private *ctx; 2838c2ecf20Sopenharmony_ci int ret; 2848c2ecf20Sopenharmony_ci 2858c2ecf20Sopenharmony_ci card->dev = &pdev->dev; 2868c2ecf20Sopenharmony_ci 2878c2ecf20Sopenharmony_ci ctx = devm_kzalloc(&pdev->dev, sizeof(*ctx), GFP_KERNEL); 2888c2ecf20Sopenharmony_ci if (!ctx) 2898c2ecf20Sopenharmony_ci return -ENOMEM; 2908c2ecf20Sopenharmony_ci INIT_LIST_HEAD(&ctx->hdmi_pcm_list); 2918c2ecf20Sopenharmony_ci snd_soc_card_set_drvdata(card, ctx); 2928c2ecf20Sopenharmony_ci 2938c2ecf20Sopenharmony_ci mach = pdev->dev.platform_data; 2948c2ecf20Sopenharmony_ci ret = snd_soc_fixup_dai_links_platform_name(card, 2958c2ecf20Sopenharmony_ci mach->mach_params.platform); 2968c2ecf20Sopenharmony_ci if (ret) 2978c2ecf20Sopenharmony_ci return ret; 2988c2ecf20Sopenharmony_ci 2998c2ecf20Sopenharmony_ci hdmi_link_init(card, ctx, mach); 3008c2ecf20Sopenharmony_ci 3018c2ecf20Sopenharmony_ci return devm_snd_soc_register_card(&pdev->dev, card); 3028c2ecf20Sopenharmony_ci} 3038c2ecf20Sopenharmony_ci 3048c2ecf20Sopenharmony_cistatic const struct platform_device_id ehl_board_ids[] = { 3058c2ecf20Sopenharmony_ci { .name = "ehl_rt5660" }, 3068c2ecf20Sopenharmony_ci { } 3078c2ecf20Sopenharmony_ci}; 3088c2ecf20Sopenharmony_ci 3098c2ecf20Sopenharmony_cistatic struct platform_driver snd_ehl_rt5660_driver = { 3108c2ecf20Sopenharmony_ci .driver = { 3118c2ecf20Sopenharmony_ci .name = "ehl_rt5660", 3128c2ecf20Sopenharmony_ci .pm = &snd_soc_pm_ops, 3138c2ecf20Sopenharmony_ci }, 3148c2ecf20Sopenharmony_ci .probe = snd_ehl_rt5660_probe, 3158c2ecf20Sopenharmony_ci .id_table = ehl_board_ids, 3168c2ecf20Sopenharmony_ci}; 3178c2ecf20Sopenharmony_ci 3188c2ecf20Sopenharmony_cimodule_platform_driver(snd_ehl_rt5660_driver); 3198c2ecf20Sopenharmony_ci 3208c2ecf20Sopenharmony_ciMODULE_DESCRIPTION("ASoC Intel(R) Elkhartlake + rt5660 Machine driver"); 3218c2ecf20Sopenharmony_ciMODULE_AUTHOR("libin.yang@intel.com"); 3228c2ecf20Sopenharmony_ciMODULE_LICENSE("GPL v2"); 3238c2ecf20Sopenharmony_ciMODULE_ALIAS("platform:ehl_rt5660"); 324