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