18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * Intel Broadwell Wildcatpoint SST Audio 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci * Copyright (C) 2013, Intel Corporation. All rights reserved. 68c2ecf20Sopenharmony_ci */ 78c2ecf20Sopenharmony_ci 88c2ecf20Sopenharmony_ci#include <linux/module.h> 98c2ecf20Sopenharmony_ci#include <linux/platform_device.h> 108c2ecf20Sopenharmony_ci#include <sound/core.h> 118c2ecf20Sopenharmony_ci#include <sound/pcm.h> 128c2ecf20Sopenharmony_ci#include <sound/soc.h> 138c2ecf20Sopenharmony_ci#include <sound/jack.h> 148c2ecf20Sopenharmony_ci#include <sound/pcm_params.h> 158c2ecf20Sopenharmony_ci#include <sound/soc-acpi.h> 168c2ecf20Sopenharmony_ci 178c2ecf20Sopenharmony_ci#include "../../codecs/rt286.h" 188c2ecf20Sopenharmony_ci 198c2ecf20Sopenharmony_cistatic struct snd_soc_jack broadwell_headset; 208c2ecf20Sopenharmony_ci/* Headset jack detection DAPM pins */ 218c2ecf20Sopenharmony_cistatic struct snd_soc_jack_pin broadwell_headset_pins[] = { 228c2ecf20Sopenharmony_ci { 238c2ecf20Sopenharmony_ci .pin = "Mic Jack", 248c2ecf20Sopenharmony_ci .mask = SND_JACK_MICROPHONE, 258c2ecf20Sopenharmony_ci }, 268c2ecf20Sopenharmony_ci { 278c2ecf20Sopenharmony_ci .pin = "Headphone Jack", 288c2ecf20Sopenharmony_ci .mask = SND_JACK_HEADPHONE, 298c2ecf20Sopenharmony_ci }, 308c2ecf20Sopenharmony_ci}; 318c2ecf20Sopenharmony_ci 328c2ecf20Sopenharmony_cistatic const struct snd_kcontrol_new broadwell_controls[] = { 338c2ecf20Sopenharmony_ci SOC_DAPM_PIN_SWITCH("Speaker"), 348c2ecf20Sopenharmony_ci SOC_DAPM_PIN_SWITCH("Headphone Jack"), 358c2ecf20Sopenharmony_ci}; 368c2ecf20Sopenharmony_ci 378c2ecf20Sopenharmony_cistatic const struct snd_soc_dapm_widget broadwell_widgets[] = { 388c2ecf20Sopenharmony_ci SND_SOC_DAPM_HP("Headphone Jack", NULL), 398c2ecf20Sopenharmony_ci SND_SOC_DAPM_SPK("Speaker", NULL), 408c2ecf20Sopenharmony_ci SND_SOC_DAPM_MIC("Mic Jack", NULL), 418c2ecf20Sopenharmony_ci SND_SOC_DAPM_MIC("DMIC1", NULL), 428c2ecf20Sopenharmony_ci SND_SOC_DAPM_MIC("DMIC2", NULL), 438c2ecf20Sopenharmony_ci SND_SOC_DAPM_LINE("Line Jack", NULL), 448c2ecf20Sopenharmony_ci}; 458c2ecf20Sopenharmony_ci 468c2ecf20Sopenharmony_cistatic const struct snd_soc_dapm_route broadwell_rt286_map[] = { 478c2ecf20Sopenharmony_ci 488c2ecf20Sopenharmony_ci /* speaker */ 498c2ecf20Sopenharmony_ci {"Speaker", NULL, "SPOR"}, 508c2ecf20Sopenharmony_ci {"Speaker", NULL, "SPOL"}, 518c2ecf20Sopenharmony_ci 528c2ecf20Sopenharmony_ci /* HP jack connectors - unknown if we have jack deteck */ 538c2ecf20Sopenharmony_ci {"Headphone Jack", NULL, "HPO Pin"}, 548c2ecf20Sopenharmony_ci 558c2ecf20Sopenharmony_ci /* other jacks */ 568c2ecf20Sopenharmony_ci {"MIC1", NULL, "Mic Jack"}, 578c2ecf20Sopenharmony_ci {"LINE1", NULL, "Line Jack"}, 588c2ecf20Sopenharmony_ci 598c2ecf20Sopenharmony_ci /* digital mics */ 608c2ecf20Sopenharmony_ci {"DMIC1 Pin", NULL, "DMIC1"}, 618c2ecf20Sopenharmony_ci {"DMIC2 Pin", NULL, "DMIC2"}, 628c2ecf20Sopenharmony_ci 638c2ecf20Sopenharmony_ci /* CODEC BE connections */ 648c2ecf20Sopenharmony_ci {"SSP0 CODEC IN", NULL, "AIF1 Capture"}, 658c2ecf20Sopenharmony_ci {"AIF1 Playback", NULL, "SSP0 CODEC OUT"}, 668c2ecf20Sopenharmony_ci}; 678c2ecf20Sopenharmony_ci 688c2ecf20Sopenharmony_cistatic int broadwell_rt286_codec_init(struct snd_soc_pcm_runtime *rtd) 698c2ecf20Sopenharmony_ci{ 708c2ecf20Sopenharmony_ci struct snd_soc_component *component = asoc_rtd_to_codec(rtd, 0)->component; 718c2ecf20Sopenharmony_ci int ret = 0; 728c2ecf20Sopenharmony_ci ret = snd_soc_card_jack_new(rtd->card, "Headset", 738c2ecf20Sopenharmony_ci SND_JACK_HEADSET | SND_JACK_BTN_0, &broadwell_headset, 748c2ecf20Sopenharmony_ci broadwell_headset_pins, ARRAY_SIZE(broadwell_headset_pins)); 758c2ecf20Sopenharmony_ci if (ret) 768c2ecf20Sopenharmony_ci return ret; 778c2ecf20Sopenharmony_ci 788c2ecf20Sopenharmony_ci rt286_mic_detect(component, &broadwell_headset); 798c2ecf20Sopenharmony_ci return 0; 808c2ecf20Sopenharmony_ci} 818c2ecf20Sopenharmony_ci 828c2ecf20Sopenharmony_ci 838c2ecf20Sopenharmony_cistatic int broadwell_ssp0_fixup(struct snd_soc_pcm_runtime *rtd, 848c2ecf20Sopenharmony_ci struct snd_pcm_hw_params *params) 858c2ecf20Sopenharmony_ci{ 868c2ecf20Sopenharmony_ci struct snd_interval *rate = hw_param_interval(params, 878c2ecf20Sopenharmony_ci SNDRV_PCM_HW_PARAM_RATE); 888c2ecf20Sopenharmony_ci struct snd_interval *chan = hw_param_interval(params, 898c2ecf20Sopenharmony_ci SNDRV_PCM_HW_PARAM_CHANNELS); 908c2ecf20Sopenharmony_ci 918c2ecf20Sopenharmony_ci /* The ADSP will covert the FE rate to 48k, stereo */ 928c2ecf20Sopenharmony_ci rate->min = rate->max = 48000; 938c2ecf20Sopenharmony_ci chan->min = chan->max = 2; 948c2ecf20Sopenharmony_ci 958c2ecf20Sopenharmony_ci /* set SSP0 to 16 bit */ 968c2ecf20Sopenharmony_ci params_set_format(params, SNDRV_PCM_FORMAT_S16_LE); 978c2ecf20Sopenharmony_ci return 0; 988c2ecf20Sopenharmony_ci} 998c2ecf20Sopenharmony_ci 1008c2ecf20Sopenharmony_cistatic int broadwell_rt286_hw_params(struct snd_pcm_substream *substream, 1018c2ecf20Sopenharmony_ci struct snd_pcm_hw_params *params) 1028c2ecf20Sopenharmony_ci{ 1038c2ecf20Sopenharmony_ci struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream); 1048c2ecf20Sopenharmony_ci struct snd_soc_dai *codec_dai = asoc_rtd_to_codec(rtd, 0); 1058c2ecf20Sopenharmony_ci int ret; 1068c2ecf20Sopenharmony_ci 1078c2ecf20Sopenharmony_ci ret = snd_soc_dai_set_sysclk(codec_dai, RT286_SCLK_S_PLL, 24000000, 1088c2ecf20Sopenharmony_ci SND_SOC_CLOCK_IN); 1098c2ecf20Sopenharmony_ci 1108c2ecf20Sopenharmony_ci if (ret < 0) { 1118c2ecf20Sopenharmony_ci dev_err(rtd->dev, "can't set codec sysclk configuration\n"); 1128c2ecf20Sopenharmony_ci return ret; 1138c2ecf20Sopenharmony_ci } 1148c2ecf20Sopenharmony_ci 1158c2ecf20Sopenharmony_ci return ret; 1168c2ecf20Sopenharmony_ci} 1178c2ecf20Sopenharmony_ci 1188c2ecf20Sopenharmony_cistatic const struct snd_soc_ops broadwell_rt286_ops = { 1198c2ecf20Sopenharmony_ci .hw_params = broadwell_rt286_hw_params, 1208c2ecf20Sopenharmony_ci}; 1218c2ecf20Sopenharmony_ci 1228c2ecf20Sopenharmony_cistatic const unsigned int channels[] = { 1238c2ecf20Sopenharmony_ci 2, 1248c2ecf20Sopenharmony_ci}; 1258c2ecf20Sopenharmony_ci 1268c2ecf20Sopenharmony_cistatic const struct snd_pcm_hw_constraint_list constraints_channels = { 1278c2ecf20Sopenharmony_ci .count = ARRAY_SIZE(channels), 1288c2ecf20Sopenharmony_ci .list = channels, 1298c2ecf20Sopenharmony_ci .mask = 0, 1308c2ecf20Sopenharmony_ci}; 1318c2ecf20Sopenharmony_ci 1328c2ecf20Sopenharmony_cistatic int broadwell_fe_startup(struct snd_pcm_substream *substream) 1338c2ecf20Sopenharmony_ci{ 1348c2ecf20Sopenharmony_ci struct snd_pcm_runtime *runtime = substream->runtime; 1358c2ecf20Sopenharmony_ci 1368c2ecf20Sopenharmony_ci /* Board supports stereo configuration only */ 1378c2ecf20Sopenharmony_ci runtime->hw.channels_max = 2; 1388c2ecf20Sopenharmony_ci return snd_pcm_hw_constraint_list(runtime, 0, 1398c2ecf20Sopenharmony_ci SNDRV_PCM_HW_PARAM_CHANNELS, 1408c2ecf20Sopenharmony_ci &constraints_channels); 1418c2ecf20Sopenharmony_ci} 1428c2ecf20Sopenharmony_ci 1438c2ecf20Sopenharmony_cistatic const struct snd_soc_ops broadwell_fe_ops = { 1448c2ecf20Sopenharmony_ci .startup = broadwell_fe_startup, 1458c2ecf20Sopenharmony_ci}; 1468c2ecf20Sopenharmony_ci 1478c2ecf20Sopenharmony_ciSND_SOC_DAILINK_DEF(system, 1488c2ecf20Sopenharmony_ci DAILINK_COMP_ARRAY(COMP_CPU("System Pin"))); 1498c2ecf20Sopenharmony_ci 1508c2ecf20Sopenharmony_ciSND_SOC_DAILINK_DEF(offload0, 1518c2ecf20Sopenharmony_ci DAILINK_COMP_ARRAY(COMP_CPU("Offload0 Pin"))); 1528c2ecf20Sopenharmony_ci 1538c2ecf20Sopenharmony_ciSND_SOC_DAILINK_DEF(offload1, 1548c2ecf20Sopenharmony_ci DAILINK_COMP_ARRAY(COMP_CPU("Offload1 Pin"))); 1558c2ecf20Sopenharmony_ci 1568c2ecf20Sopenharmony_ciSND_SOC_DAILINK_DEF(loopback, 1578c2ecf20Sopenharmony_ci DAILINK_COMP_ARRAY(COMP_CPU("Loopback Pin"))); 1588c2ecf20Sopenharmony_ci 1598c2ecf20Sopenharmony_ciSND_SOC_DAILINK_DEF(dummy, 1608c2ecf20Sopenharmony_ci DAILINK_COMP_ARRAY(COMP_DUMMY())); 1618c2ecf20Sopenharmony_ci 1628c2ecf20Sopenharmony_ciSND_SOC_DAILINK_DEF(platform, 1638c2ecf20Sopenharmony_ci DAILINK_COMP_ARRAY(COMP_PLATFORM("haswell-pcm-audio"))); 1648c2ecf20Sopenharmony_ci 1658c2ecf20Sopenharmony_ciSND_SOC_DAILINK_DEF(codec, 1668c2ecf20Sopenharmony_ci DAILINK_COMP_ARRAY(COMP_CODEC("i2c-INT343A:00", "rt286-aif1"))); 1678c2ecf20Sopenharmony_ci 1688c2ecf20Sopenharmony_ciSND_SOC_DAILINK_DEF(ssp0_port, 1698c2ecf20Sopenharmony_ci DAILINK_COMP_ARRAY(COMP_CPU("ssp0-port"))); 1708c2ecf20Sopenharmony_ci 1718c2ecf20Sopenharmony_ci/* broadwell digital audio interface glue - connects codec <--> CPU */ 1728c2ecf20Sopenharmony_cistatic struct snd_soc_dai_link broadwell_rt286_dais[] = { 1738c2ecf20Sopenharmony_ci /* Front End DAI links */ 1748c2ecf20Sopenharmony_ci { 1758c2ecf20Sopenharmony_ci .name = "System PCM", 1768c2ecf20Sopenharmony_ci .stream_name = "System Playback/Capture", 1778c2ecf20Sopenharmony_ci .nonatomic = 1, 1788c2ecf20Sopenharmony_ci .dynamic = 1, 1798c2ecf20Sopenharmony_ci .trigger = {SND_SOC_DPCM_TRIGGER_POST, SND_SOC_DPCM_TRIGGER_POST}, 1808c2ecf20Sopenharmony_ci .ops = &broadwell_fe_ops, 1818c2ecf20Sopenharmony_ci .dpcm_playback = 1, 1828c2ecf20Sopenharmony_ci .dpcm_capture = 1, 1838c2ecf20Sopenharmony_ci SND_SOC_DAILINK_REG(system, dummy, platform), 1848c2ecf20Sopenharmony_ci }, 1858c2ecf20Sopenharmony_ci { 1868c2ecf20Sopenharmony_ci .name = "Offload0", 1878c2ecf20Sopenharmony_ci .stream_name = "Offload0 Playback", 1888c2ecf20Sopenharmony_ci .nonatomic = 1, 1898c2ecf20Sopenharmony_ci .dynamic = 1, 1908c2ecf20Sopenharmony_ci .trigger = {SND_SOC_DPCM_TRIGGER_POST, SND_SOC_DPCM_TRIGGER_POST}, 1918c2ecf20Sopenharmony_ci .dpcm_playback = 1, 1928c2ecf20Sopenharmony_ci SND_SOC_DAILINK_REG(offload0, dummy, platform), 1938c2ecf20Sopenharmony_ci }, 1948c2ecf20Sopenharmony_ci { 1958c2ecf20Sopenharmony_ci .name = "Offload1", 1968c2ecf20Sopenharmony_ci .stream_name = "Offload1 Playback", 1978c2ecf20Sopenharmony_ci .nonatomic = 1, 1988c2ecf20Sopenharmony_ci .dynamic = 1, 1998c2ecf20Sopenharmony_ci .trigger = {SND_SOC_DPCM_TRIGGER_POST, SND_SOC_DPCM_TRIGGER_POST}, 2008c2ecf20Sopenharmony_ci .dpcm_playback = 1, 2018c2ecf20Sopenharmony_ci SND_SOC_DAILINK_REG(offload1, dummy, platform), 2028c2ecf20Sopenharmony_ci }, 2038c2ecf20Sopenharmony_ci { 2048c2ecf20Sopenharmony_ci .name = "Loopback PCM", 2058c2ecf20Sopenharmony_ci .stream_name = "Loopback", 2068c2ecf20Sopenharmony_ci .nonatomic = 1, 2078c2ecf20Sopenharmony_ci .dynamic = 1, 2088c2ecf20Sopenharmony_ci .trigger = {SND_SOC_DPCM_TRIGGER_POST, SND_SOC_DPCM_TRIGGER_POST}, 2098c2ecf20Sopenharmony_ci .dpcm_capture = 1, 2108c2ecf20Sopenharmony_ci SND_SOC_DAILINK_REG(loopback, dummy, platform), 2118c2ecf20Sopenharmony_ci }, 2128c2ecf20Sopenharmony_ci /* Back End DAI links */ 2138c2ecf20Sopenharmony_ci { 2148c2ecf20Sopenharmony_ci /* SSP0 - Codec */ 2158c2ecf20Sopenharmony_ci .name = "Codec", 2168c2ecf20Sopenharmony_ci .id = 0, 2178c2ecf20Sopenharmony_ci .no_pcm = 1, 2188c2ecf20Sopenharmony_ci .init = broadwell_rt286_codec_init, 2198c2ecf20Sopenharmony_ci .dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF | 2208c2ecf20Sopenharmony_ci SND_SOC_DAIFMT_CBS_CFS, 2218c2ecf20Sopenharmony_ci .ignore_pmdown_time = 1, 2228c2ecf20Sopenharmony_ci .be_hw_params_fixup = broadwell_ssp0_fixup, 2238c2ecf20Sopenharmony_ci .ops = &broadwell_rt286_ops, 2248c2ecf20Sopenharmony_ci .dpcm_playback = 1, 2258c2ecf20Sopenharmony_ci .dpcm_capture = 1, 2268c2ecf20Sopenharmony_ci SND_SOC_DAILINK_REG(ssp0_port, codec, platform), 2278c2ecf20Sopenharmony_ci }, 2288c2ecf20Sopenharmony_ci}; 2298c2ecf20Sopenharmony_ci 2308c2ecf20Sopenharmony_cistatic int broadwell_disable_jack(struct snd_soc_card *card) 2318c2ecf20Sopenharmony_ci{ 2328c2ecf20Sopenharmony_ci struct snd_soc_component *component; 2338c2ecf20Sopenharmony_ci 2348c2ecf20Sopenharmony_ci for_each_card_components(card, component) { 2358c2ecf20Sopenharmony_ci if (!strcmp(component->name, "i2c-INT343A:00")) { 2368c2ecf20Sopenharmony_ci 2378c2ecf20Sopenharmony_ci dev_dbg(component->dev, "disabling jack detect before going to suspend.\n"); 2388c2ecf20Sopenharmony_ci rt286_mic_detect(component, NULL); 2398c2ecf20Sopenharmony_ci break; 2408c2ecf20Sopenharmony_ci } 2418c2ecf20Sopenharmony_ci } 2428c2ecf20Sopenharmony_ci 2438c2ecf20Sopenharmony_ci return 0; 2448c2ecf20Sopenharmony_ci} 2458c2ecf20Sopenharmony_ci 2468c2ecf20Sopenharmony_cistatic int broadwell_suspend(struct snd_soc_card *card) 2478c2ecf20Sopenharmony_ci{ 2488c2ecf20Sopenharmony_ci return broadwell_disable_jack(card); 2498c2ecf20Sopenharmony_ci} 2508c2ecf20Sopenharmony_ci 2518c2ecf20Sopenharmony_cistatic int broadwell_resume(struct snd_soc_card *card){ 2528c2ecf20Sopenharmony_ci struct snd_soc_component *component; 2538c2ecf20Sopenharmony_ci 2548c2ecf20Sopenharmony_ci for_each_card_components(card, component) { 2558c2ecf20Sopenharmony_ci if (!strcmp(component->name, "i2c-INT343A:00")) { 2568c2ecf20Sopenharmony_ci 2578c2ecf20Sopenharmony_ci dev_dbg(component->dev, "enabling jack detect for resume.\n"); 2588c2ecf20Sopenharmony_ci rt286_mic_detect(component, &broadwell_headset); 2598c2ecf20Sopenharmony_ci break; 2608c2ecf20Sopenharmony_ci } 2618c2ecf20Sopenharmony_ci } 2628c2ecf20Sopenharmony_ci return 0; 2638c2ecf20Sopenharmony_ci} 2648c2ecf20Sopenharmony_ci 2658c2ecf20Sopenharmony_ci#if IS_ENABLED(CONFIG_SND_SOC_SOF_BROADWELL) 2668c2ecf20Sopenharmony_ci/* use space before codec name to simplify card ID, and simplify driver name */ 2678c2ecf20Sopenharmony_ci#define CARD_NAME "bdw rt286" /* card name will be 'sof-bdw rt286' */ 2688c2ecf20Sopenharmony_ci#define DRIVER_NAME "SOF" 2698c2ecf20Sopenharmony_ci#else 2708c2ecf20Sopenharmony_ci#define CARD_NAME "broadwell-rt286" 2718c2ecf20Sopenharmony_ci#define DRIVER_NAME NULL /* card name will be used for driver name */ 2728c2ecf20Sopenharmony_ci#endif 2738c2ecf20Sopenharmony_ci 2748c2ecf20Sopenharmony_ci/* broadwell audio machine driver for WPT + RT286S */ 2758c2ecf20Sopenharmony_cistatic struct snd_soc_card broadwell_rt286 = { 2768c2ecf20Sopenharmony_ci .name = CARD_NAME, 2778c2ecf20Sopenharmony_ci .driver_name = DRIVER_NAME, 2788c2ecf20Sopenharmony_ci .owner = THIS_MODULE, 2798c2ecf20Sopenharmony_ci .dai_link = broadwell_rt286_dais, 2808c2ecf20Sopenharmony_ci .num_links = ARRAY_SIZE(broadwell_rt286_dais), 2818c2ecf20Sopenharmony_ci .controls = broadwell_controls, 2828c2ecf20Sopenharmony_ci .num_controls = ARRAY_SIZE(broadwell_controls), 2838c2ecf20Sopenharmony_ci .dapm_widgets = broadwell_widgets, 2848c2ecf20Sopenharmony_ci .num_dapm_widgets = ARRAY_SIZE(broadwell_widgets), 2858c2ecf20Sopenharmony_ci .dapm_routes = broadwell_rt286_map, 2868c2ecf20Sopenharmony_ci .num_dapm_routes = ARRAY_SIZE(broadwell_rt286_map), 2878c2ecf20Sopenharmony_ci .fully_routed = true, 2888c2ecf20Sopenharmony_ci .suspend_pre = broadwell_suspend, 2898c2ecf20Sopenharmony_ci .resume_post = broadwell_resume, 2908c2ecf20Sopenharmony_ci}; 2918c2ecf20Sopenharmony_ci 2928c2ecf20Sopenharmony_cistatic int broadwell_audio_probe(struct platform_device *pdev) 2938c2ecf20Sopenharmony_ci{ 2948c2ecf20Sopenharmony_ci struct snd_soc_acpi_mach *mach; 2958c2ecf20Sopenharmony_ci int ret; 2968c2ecf20Sopenharmony_ci 2978c2ecf20Sopenharmony_ci broadwell_rt286.dev = &pdev->dev; 2988c2ecf20Sopenharmony_ci 2998c2ecf20Sopenharmony_ci /* override plaform name, if required */ 3008c2ecf20Sopenharmony_ci mach = pdev->dev.platform_data; 3018c2ecf20Sopenharmony_ci ret = snd_soc_fixup_dai_links_platform_name(&broadwell_rt286, 3028c2ecf20Sopenharmony_ci mach->mach_params.platform); 3038c2ecf20Sopenharmony_ci if (ret) 3048c2ecf20Sopenharmony_ci return ret; 3058c2ecf20Sopenharmony_ci 3068c2ecf20Sopenharmony_ci return devm_snd_soc_register_card(&pdev->dev, &broadwell_rt286); 3078c2ecf20Sopenharmony_ci} 3088c2ecf20Sopenharmony_ci 3098c2ecf20Sopenharmony_cistatic int broadwell_audio_remove(struct platform_device *pdev) 3108c2ecf20Sopenharmony_ci{ 3118c2ecf20Sopenharmony_ci struct snd_soc_card *card = platform_get_drvdata(pdev); 3128c2ecf20Sopenharmony_ci 3138c2ecf20Sopenharmony_ci return broadwell_disable_jack(card); 3148c2ecf20Sopenharmony_ci} 3158c2ecf20Sopenharmony_ci 3168c2ecf20Sopenharmony_cistatic struct platform_driver broadwell_audio = { 3178c2ecf20Sopenharmony_ci .probe = broadwell_audio_probe, 3188c2ecf20Sopenharmony_ci .remove = broadwell_audio_remove, 3198c2ecf20Sopenharmony_ci .driver = { 3208c2ecf20Sopenharmony_ci .name = "broadwell-audio", 3218c2ecf20Sopenharmony_ci }, 3228c2ecf20Sopenharmony_ci}; 3238c2ecf20Sopenharmony_ci 3248c2ecf20Sopenharmony_cimodule_platform_driver(broadwell_audio) 3258c2ecf20Sopenharmony_ci 3268c2ecf20Sopenharmony_ci/* Module information */ 3278c2ecf20Sopenharmony_ciMODULE_AUTHOR("Liam Girdwood, Xingchao Wang"); 3288c2ecf20Sopenharmony_ciMODULE_DESCRIPTION("Intel SST Audio for WPT/Broadwell"); 3298c2ecf20Sopenharmony_ciMODULE_LICENSE("GPL v2"); 3308c2ecf20Sopenharmony_ciMODULE_ALIAS("platform:broadwell-audio"); 331