cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

kbl_da7219_max98927.c (30113B)


      1// SPDX-License-Identifier: GPL-2.0-only
      2// Copyright(c) 2018 Intel Corporation.
      3
      4/*
      5 * Intel Kabylake I2S Machine Driver with MAX98927, MAX98373 & DA7219 Codecs
      6 *
      7 * Modified from:
      8 *   Intel Kabylake I2S Machine driver supporting MAX98927 and
      9 *   RT5663 codecs
     10 */
     11
     12#include <linux/input.h>
     13#include <linux/module.h>
     14#include <linux/platform_device.h>
     15#include <sound/core.h>
     16#include <sound/jack.h>
     17#include <sound/pcm.h>
     18#include <sound/pcm_params.h>
     19#include <sound/soc.h>
     20#include "../../codecs/da7219.h"
     21#include "../../codecs/hdac_hdmi.h"
     22#include "../../codecs/da7219-aad.h"
     23
     24#define KBL_DIALOG_CODEC_DAI	"da7219-hifi"
     25#define MAX98927_CODEC_DAI	"max98927-aif1"
     26#define MAX98927_DEV0_NAME	"i2c-MX98927:00"
     27#define MAX98927_DEV1_NAME	"i2c-MX98927:01"
     28
     29#define MAX98373_CODEC_DAI	"max98373-aif1"
     30#define MAX98373_DEV0_NAME	"i2c-MX98373:00"
     31#define MAX98373_DEV1_NAME	"i2c-MX98373:01"
     32
     33
     34#define DUAL_CHANNEL	2
     35#define QUAD_CHANNEL	4
     36#define NAME_SIZE	32
     37
     38static struct snd_soc_card *kabylake_audio_card;
     39static struct snd_soc_jack kabylake_hdmi[3];
     40
     41struct kbl_hdmi_pcm {
     42	struct list_head head;
     43	struct snd_soc_dai *codec_dai;
     44	int device;
     45};
     46
     47struct kbl_codec_private {
     48	struct snd_soc_jack kabylake_headset;
     49	struct list_head hdmi_pcm_list;
     50};
     51
     52enum {
     53	KBL_DPCM_AUDIO_PB = 0,
     54	KBL_DPCM_AUDIO_ECHO_REF_CP,
     55	KBL_DPCM_AUDIO_REF_CP,
     56	KBL_DPCM_AUDIO_DMIC_CP,
     57	KBL_DPCM_AUDIO_HDMI1_PB,
     58	KBL_DPCM_AUDIO_HDMI2_PB,
     59	KBL_DPCM_AUDIO_HDMI3_PB,
     60	KBL_DPCM_AUDIO_HS_PB,
     61	KBL_DPCM_AUDIO_CP,
     62};
     63
     64static int platform_clock_control(struct snd_soc_dapm_widget *w,
     65					struct snd_kcontrol *k, int  event)
     66{
     67	struct snd_soc_dapm_context *dapm = w->dapm;
     68	struct snd_soc_card *card = dapm->card;
     69	struct snd_soc_dai *codec_dai;
     70	int ret = 0;
     71
     72	codec_dai = snd_soc_card_get_codec_dai(card, KBL_DIALOG_CODEC_DAI);
     73	if (!codec_dai) {
     74		dev_err(card->dev, "Codec dai not found; Unable to set/unset codec pll\n");
     75		return -EIO;
     76	}
     77
     78	/* Configure sysclk for codec */
     79	ret = snd_soc_dai_set_sysclk(codec_dai, DA7219_CLKSRC_MCLK, 24576000,
     80				     SND_SOC_CLOCK_IN);
     81	if (ret) {
     82		dev_err(card->dev, "can't set codec sysclk configuration\n");
     83		return ret;
     84	}
     85
     86	if (SND_SOC_DAPM_EVENT_OFF(event)) {
     87		ret = snd_soc_dai_set_pll(codec_dai, 0,
     88				     DA7219_SYSCLK_MCLK, 0, 0);
     89		if (ret)
     90			dev_err(card->dev, "failed to stop PLL: %d\n", ret);
     91	} else if (SND_SOC_DAPM_EVENT_ON(event)) {
     92		ret = snd_soc_dai_set_pll(codec_dai, 0,	DA7219_SYSCLK_PLL_SRM,
     93				     0, DA7219_PLL_FREQ_OUT_98304);
     94		if (ret)
     95			dev_err(card->dev, "failed to start PLL: %d\n", ret);
     96	}
     97
     98	return ret;
     99}
    100
    101static const struct snd_kcontrol_new kabylake_controls[] = {
    102	SOC_DAPM_PIN_SWITCH("Headphone Jack"),
    103	SOC_DAPM_PIN_SWITCH("Headset Mic"),
    104	SOC_DAPM_PIN_SWITCH("Left Spk"),
    105	SOC_DAPM_PIN_SWITCH("Right Spk"),
    106};
    107
    108static const struct snd_soc_dapm_widget kabylake_widgets[] = {
    109	SND_SOC_DAPM_HP("Headphone Jack", NULL),
    110	SND_SOC_DAPM_MIC("Headset Mic", NULL),
    111	SND_SOC_DAPM_SPK("Left Spk", NULL),
    112	SND_SOC_DAPM_SPK("Right Spk", NULL),
    113	SND_SOC_DAPM_MIC("SoC DMIC", NULL),
    114	SND_SOC_DAPM_SPK("HDMI1", NULL),
    115	SND_SOC_DAPM_SPK("HDMI2", NULL),
    116	SND_SOC_DAPM_SPK("HDMI3", NULL),
    117	SND_SOC_DAPM_SUPPLY("Platform Clock", SND_SOC_NOPM, 0, 0,
    118			platform_clock_control, SND_SOC_DAPM_PRE_PMU |
    119			SND_SOC_DAPM_POST_PMD),
    120};
    121
    122static const struct snd_soc_dapm_route kabylake_map[] = {
    123	/* speaker */
    124	{ "Left Spk", NULL, "Left BE_OUT" },
    125	{ "Right Spk", NULL, "Right BE_OUT" },
    126
    127	/* other jacks */
    128	{ "DMic", NULL, "SoC DMIC" },
    129
    130	{"HDMI1", NULL, "hif5-0 Output"},
    131	{"HDMI2", NULL, "hif6-0 Output"},
    132	{"HDMI3", NULL, "hif7-0 Output"},
    133
    134	/* CODEC BE connections */
    135	{ "Left HiFi Playback", NULL, "ssp0 Tx" },
    136	{ "Right HiFi Playback", NULL, "ssp0 Tx" },
    137	{ "ssp0 Tx", NULL, "spk_out" },
    138
    139	/* IV feedback path */
    140	{ "codec0_fb_in", NULL, "ssp0 Rx"},
    141	{ "ssp0 Rx", NULL, "Left HiFi Capture" },
    142	{ "ssp0 Rx", NULL, "Right HiFi Capture" },
    143
    144	/* AEC capture path */
    145	{ "echo_ref_out", NULL, "ssp0 Rx" },
    146
    147	/* DMIC */
    148	{ "dmic01_hifi", NULL, "DMIC01 Rx" },
    149	{ "DMIC01 Rx", NULL, "DMIC AIF" },
    150
    151	{ "hifi1", NULL, "iDisp1 Tx" },
    152	{ "iDisp1 Tx", NULL, "iDisp1_out" },
    153	{ "hifi2", NULL, "iDisp2 Tx" },
    154	{ "iDisp2 Tx", NULL, "iDisp2_out" },
    155	{ "hifi3", NULL, "iDisp3 Tx"},
    156	{ "iDisp3 Tx", NULL, "iDisp3_out"},
    157};
    158
    159static const struct snd_soc_dapm_route kabylake_ssp1_map[] = {
    160	{ "Headphone Jack", NULL, "HPL" },
    161	{ "Headphone Jack", NULL, "HPR" },
    162
    163	/* other jacks */
    164	{ "MIC", NULL, "Headset Mic" },
    165
    166	/* CODEC BE connections */
    167	{ "Playback", NULL, "ssp1 Tx" },
    168	{ "ssp1 Tx", NULL, "codec1_out" },
    169
    170	{ "hs_in", NULL, "ssp1 Rx" },
    171	{ "ssp1 Rx", NULL, "Capture" },
    172
    173	{ "Headphone Jack", NULL, "Platform Clock" },
    174	{ "Headset Mic", NULL, "Platform Clock" },
    175};
    176
    177static int kabylake_ssp0_hw_params(struct snd_pcm_substream *substream,
    178	struct snd_pcm_hw_params *params)
    179{
    180	struct snd_soc_pcm_runtime *runtime = asoc_substream_to_rtd(substream);
    181	struct snd_soc_dai *codec_dai;
    182	int ret, j;
    183
    184	for_each_rtd_codec_dais(runtime, j, codec_dai) {
    185
    186		if (!strcmp(codec_dai->component->name, MAX98927_DEV0_NAME)) {
    187			ret = snd_soc_dai_set_tdm_slot(codec_dai, 0x30, 3, 8, 16);
    188			if (ret < 0) {
    189				dev_err(runtime->dev, "DEV0 TDM slot err:%d\n", ret);
    190				return ret;
    191			}
    192		}
    193		if (!strcmp(codec_dai->component->name, MAX98927_DEV1_NAME)) {
    194			ret = snd_soc_dai_set_tdm_slot(codec_dai, 0xC0, 3, 8, 16);
    195			if (ret < 0) {
    196				dev_err(runtime->dev, "DEV1 TDM slot err:%d\n", ret);
    197				return ret;
    198			}
    199		}
    200		if (!strcmp(codec_dai->component->name, MAX98373_DEV0_NAME)) {
    201			ret = snd_soc_dai_set_tdm_slot(codec_dai,
    202							0x30, 3, 8, 16);
    203			if (ret < 0) {
    204				dev_err(runtime->dev,
    205						"DEV0 TDM slot err:%d\n", ret);
    206				return ret;
    207			}
    208		}
    209		if (!strcmp(codec_dai->component->name, MAX98373_DEV1_NAME)) {
    210			ret = snd_soc_dai_set_tdm_slot(codec_dai,
    211							0xC0, 3, 8, 16);
    212			if (ret < 0) {
    213				dev_err(runtime->dev,
    214						"DEV1 TDM slot err:%d\n", ret);
    215				return ret;
    216			}
    217		}
    218	}
    219
    220	return 0;
    221}
    222
    223static int kabylake_ssp0_trigger(struct snd_pcm_substream *substream, int cmd)
    224{
    225	struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
    226	struct snd_soc_dai *codec_dai;
    227	int j, ret;
    228
    229	for_each_rtd_codec_dais(rtd, j, codec_dai) {
    230		const char *name = codec_dai->component->name;
    231		struct snd_soc_component *component = codec_dai->component;
    232		struct snd_soc_dapm_context *dapm =
    233				snd_soc_component_get_dapm(component);
    234		char pin_name[20];
    235
    236		if (strcmp(name, MAX98927_DEV0_NAME) &&
    237			strcmp(name, MAX98927_DEV1_NAME) &&
    238			strcmp(name, MAX98373_DEV0_NAME) &&
    239			strcmp(name, MAX98373_DEV1_NAME))
    240			continue;
    241
    242		snprintf(pin_name, ARRAY_SIZE(pin_name), "%s Spk",
    243			codec_dai->component->name_prefix);
    244
    245		switch (cmd) {
    246		case SNDRV_PCM_TRIGGER_START:
    247		case SNDRV_PCM_TRIGGER_RESUME:
    248		case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
    249			ret = snd_soc_dapm_enable_pin(dapm, pin_name);
    250			if (ret) {
    251				dev_err(rtd->dev, "failed to enable %s: %d\n",
    252				pin_name, ret);
    253				return ret;
    254			}
    255			snd_soc_dapm_sync(dapm);
    256			break;
    257		case SNDRV_PCM_TRIGGER_STOP:
    258		case SNDRV_PCM_TRIGGER_SUSPEND:
    259		case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
    260			ret = snd_soc_dapm_disable_pin(dapm, pin_name);
    261			if (ret) {
    262				dev_err(rtd->dev, "failed to disable %s: %d\n",
    263				pin_name, ret);
    264				return ret;
    265			}
    266			snd_soc_dapm_sync(dapm);
    267			break;
    268		}
    269	}
    270
    271	return 0;
    272}
    273
    274static struct snd_soc_ops kabylake_ssp0_ops = {
    275	.hw_params = kabylake_ssp0_hw_params,
    276	.trigger = kabylake_ssp0_trigger,
    277};
    278
    279static int kabylake_ssp_fixup(struct snd_soc_pcm_runtime *rtd,
    280			struct snd_pcm_hw_params *params)
    281{
    282	struct snd_interval *rate = hw_param_interval(params,
    283			SNDRV_PCM_HW_PARAM_RATE);
    284	struct snd_interval *chan = hw_param_interval(params,
    285			SNDRV_PCM_HW_PARAM_CHANNELS);
    286	struct snd_mask *fmt = hw_param_mask(params, SNDRV_PCM_HW_PARAM_FORMAT);
    287	struct snd_soc_dpcm *dpcm, *rtd_dpcm = NULL;
    288
    289	/*
    290	 * The following loop will be called only for playback stream
    291	 * In this platform, there is only one playback device on every SSP
    292	 */
    293	for_each_dpcm_fe(rtd, SNDRV_PCM_STREAM_PLAYBACK, dpcm) {
    294		rtd_dpcm = dpcm;
    295		break;
    296	}
    297
    298	/*
    299	 * This following loop will be called only for capture stream
    300	 * In this platform, there is only one capture device on every SSP
    301	 */
    302	for_each_dpcm_fe(rtd, SNDRV_PCM_STREAM_CAPTURE, dpcm) {
    303		rtd_dpcm = dpcm;
    304		break;
    305	}
    306
    307	if (!rtd_dpcm)
    308		return -EINVAL;
    309
    310	/*
    311	 * The above 2 loops are mutually exclusive based on the stream direction,
    312	 * thus rtd_dpcm variable will never be overwritten
    313	 */
    314
    315	/*
    316	 * The ADSP will convert the FE rate to 48k, stereo, 24 bit
    317	 */
    318	if (!strcmp(rtd_dpcm->fe->dai_link->name, "Kbl Audio Port") ||
    319	    !strcmp(rtd_dpcm->fe->dai_link->name, "Kbl Audio Headset Playback") ||
    320	    !strcmp(rtd_dpcm->fe->dai_link->name, "Kbl Audio Capture Port")) {
    321		rate->min = rate->max = 48000;
    322		chan->min = chan->max = 2;
    323		snd_mask_none(fmt);
    324		snd_mask_set_format(fmt, SNDRV_PCM_FORMAT_S24_LE);
    325	}
    326
    327	/*
    328	 * The speaker on the SSP0 supports S16_LE and not S24_LE.
    329	 * thus changing the mask here
    330	 */
    331	if (!strcmp(rtd_dpcm->be->dai_link->name, "SSP0-Codec"))
    332		snd_mask_set_format(fmt, SNDRV_PCM_FORMAT_S16_LE);
    333
    334	return 0;
    335}
    336
    337static int kabylake_da7219_codec_init(struct snd_soc_pcm_runtime *rtd)
    338{
    339	struct kbl_codec_private *ctx = snd_soc_card_get_drvdata(rtd->card);
    340	struct snd_soc_component *component = asoc_rtd_to_codec(rtd, 0)->component;
    341	struct snd_soc_jack *jack;
    342	struct snd_soc_card *card = rtd->card;
    343	int ret;
    344
    345
    346	ret = snd_soc_dapm_add_routes(&card->dapm,
    347			kabylake_ssp1_map,
    348			ARRAY_SIZE(kabylake_ssp1_map));
    349
    350	if (ret)
    351		return ret;
    352
    353	/*
    354	 * Headset buttons map to the google Reference headset.
    355	 * These can be configured by userspace.
    356	 */
    357	ret = snd_soc_card_jack_new(kabylake_audio_card, "Headset Jack",
    358			SND_JACK_HEADSET | SND_JACK_BTN_0 | SND_JACK_BTN_1 |
    359			SND_JACK_BTN_2 | SND_JACK_BTN_3 | SND_JACK_LINEOUT,
    360			&ctx->kabylake_headset);
    361	if (ret) {
    362		dev_err(rtd->dev, "Headset Jack creation failed: %d\n", ret);
    363		return ret;
    364	}
    365
    366	jack = &ctx->kabylake_headset;
    367	snd_jack_set_key(jack->jack, SND_JACK_BTN_0, KEY_PLAYPAUSE);
    368	snd_jack_set_key(jack->jack, SND_JACK_BTN_1, KEY_VOLUMEUP);
    369	snd_jack_set_key(jack->jack, SND_JACK_BTN_2, KEY_VOLUMEDOWN);
    370	snd_jack_set_key(jack->jack, SND_JACK_BTN_3, KEY_VOICECOMMAND);
    371
    372	da7219_aad_jack_det(component, &ctx->kabylake_headset);
    373
    374	return 0;
    375}
    376
    377static int kabylake_dmic_init(struct snd_soc_pcm_runtime *rtd)
    378{
    379	int ret;
    380	ret = snd_soc_dapm_ignore_suspend(&rtd->card->dapm, "SoC DMIC");
    381	if (ret)
    382		dev_err(rtd->dev, "SoC DMIC - Ignore suspend failed %d\n", ret);
    383
    384	return ret;
    385}
    386
    387static int kabylake_hdmi_init(struct snd_soc_pcm_runtime *rtd, int device)
    388{
    389	struct kbl_codec_private *ctx = snd_soc_card_get_drvdata(rtd->card);
    390	struct snd_soc_dai *dai = asoc_rtd_to_codec(rtd, 0);
    391	struct kbl_hdmi_pcm *pcm;
    392
    393	pcm = devm_kzalloc(rtd->card->dev, sizeof(*pcm), GFP_KERNEL);
    394	if (!pcm)
    395		return -ENOMEM;
    396
    397	pcm->device = device;
    398	pcm->codec_dai = dai;
    399
    400	list_add_tail(&pcm->head, &ctx->hdmi_pcm_list);
    401
    402	return 0;
    403}
    404
    405static int kabylake_hdmi1_init(struct snd_soc_pcm_runtime *rtd)
    406{
    407	return kabylake_hdmi_init(rtd, KBL_DPCM_AUDIO_HDMI1_PB);
    408}
    409
    410static int kabylake_hdmi2_init(struct snd_soc_pcm_runtime *rtd)
    411{
    412	return kabylake_hdmi_init(rtd, KBL_DPCM_AUDIO_HDMI2_PB);
    413}
    414
    415static int kabylake_hdmi3_init(struct snd_soc_pcm_runtime *rtd)
    416{
    417	return kabylake_hdmi_init(rtd, KBL_DPCM_AUDIO_HDMI3_PB);
    418}
    419
    420static int kabylake_da7219_fe_init(struct snd_soc_pcm_runtime *rtd)
    421{
    422	struct snd_soc_dapm_context *dapm;
    423	struct snd_soc_component *component = asoc_rtd_to_cpu(rtd, 0)->component;
    424
    425	dapm = snd_soc_component_get_dapm(component);
    426	snd_soc_dapm_ignore_suspend(dapm, "Reference Capture");
    427
    428	return 0;
    429}
    430
    431static const unsigned int rates[] = {
    432	48000,
    433};
    434
    435static const struct snd_pcm_hw_constraint_list constraints_rates = {
    436	.count = ARRAY_SIZE(rates),
    437	.list  = rates,
    438	.mask = 0,
    439};
    440
    441static const unsigned int channels[] = {
    442	DUAL_CHANNEL,
    443};
    444
    445static const struct snd_pcm_hw_constraint_list constraints_channels = {
    446	.count = ARRAY_SIZE(channels),
    447	.list = channels,
    448	.mask = 0,
    449};
    450
    451static unsigned int channels_quad[] = {
    452	QUAD_CHANNEL,
    453};
    454
    455static struct snd_pcm_hw_constraint_list constraints_channels_quad = {
    456	.count = ARRAY_SIZE(channels_quad),
    457	.list = channels_quad,
    458	.mask = 0,
    459};
    460
    461static int kbl_fe_startup(struct snd_pcm_substream *substream)
    462{
    463	struct snd_pcm_runtime *runtime = substream->runtime;
    464
    465	/*
    466	 * On this platform for PCM device we support,
    467	 * 48Khz
    468	 * stereo
    469	 * 16 bit audio
    470	 */
    471
    472	runtime->hw.channels_max = DUAL_CHANNEL;
    473	snd_pcm_hw_constraint_list(runtime, 0, SNDRV_PCM_HW_PARAM_CHANNELS,
    474					   &constraints_channels);
    475
    476	runtime->hw.formats = SNDRV_PCM_FMTBIT_S16_LE;
    477	snd_pcm_hw_constraint_msbits(runtime, 0, 16, 16);
    478
    479	snd_pcm_hw_constraint_list(runtime, 0,
    480				SNDRV_PCM_HW_PARAM_RATE, &constraints_rates);
    481
    482	return 0;
    483}
    484
    485static const struct snd_soc_ops kabylake_da7219_fe_ops = {
    486	.startup = kbl_fe_startup,
    487};
    488
    489static int kabylake_dmic_fixup(struct snd_soc_pcm_runtime *rtd,
    490		struct snd_pcm_hw_params *params)
    491{
    492	struct snd_interval *chan = hw_param_interval(params,
    493				SNDRV_PCM_HW_PARAM_CHANNELS);
    494
    495	/*
    496	 * set BE channel constraint as user FE channels
    497	 */
    498
    499	if (params_channels(params) == 2)
    500		chan->min = chan->max = 2;
    501	else
    502		chan->min = chan->max = 4;
    503
    504	return 0;
    505}
    506
    507static int kabylake_dmic_startup(struct snd_pcm_substream *substream)
    508{
    509	struct snd_pcm_runtime *runtime = substream->runtime;
    510
    511	runtime->hw.channels_min = runtime->hw.channels_max = QUAD_CHANNEL;
    512	snd_pcm_hw_constraint_list(runtime, 0, SNDRV_PCM_HW_PARAM_CHANNELS,
    513			&constraints_channels_quad);
    514
    515	return snd_pcm_hw_constraint_list(substream->runtime, 0,
    516			SNDRV_PCM_HW_PARAM_RATE, &constraints_rates);
    517}
    518
    519static struct snd_soc_ops kabylake_dmic_ops = {
    520	.startup = kabylake_dmic_startup,
    521};
    522
    523static const unsigned int rates_16000[] = {
    524	16000,
    525};
    526
    527static const struct snd_pcm_hw_constraint_list constraints_16000 = {
    528	.count = ARRAY_SIZE(rates_16000),
    529	.list  = rates_16000,
    530};
    531
    532static const unsigned int ch_mono[] = {
    533	1,
    534};
    535static const struct snd_pcm_hw_constraint_list constraints_refcap = {
    536	.count = ARRAY_SIZE(ch_mono),
    537	.list  = ch_mono,
    538};
    539
    540static int kabylake_refcap_startup(struct snd_pcm_substream *substream)
    541{
    542	substream->runtime->hw.channels_max = 1;
    543	snd_pcm_hw_constraint_list(substream->runtime, 0,
    544					SNDRV_PCM_HW_PARAM_CHANNELS,
    545					&constraints_refcap);
    546
    547	return snd_pcm_hw_constraint_list(substream->runtime, 0,
    548				SNDRV_PCM_HW_PARAM_RATE,
    549				&constraints_16000);
    550}
    551
    552
    553static struct snd_soc_ops skylake_refcap_ops = {
    554	.startup = kabylake_refcap_startup,
    555};
    556
    557static struct snd_soc_codec_conf max98927_codec_conf[] = {
    558
    559	{
    560		.dlc = COMP_CODEC_CONF(MAX98927_DEV0_NAME),
    561		.name_prefix = "Right",
    562	},
    563
    564	{
    565		.dlc = COMP_CODEC_CONF(MAX98927_DEV1_NAME),
    566		.name_prefix = "Left",
    567	},
    568};
    569
    570static struct snd_soc_codec_conf max98373_codec_conf[] = {
    571
    572	{
    573		.dlc = COMP_CODEC_CONF(MAX98373_DEV0_NAME),
    574		.name_prefix = "Right",
    575	},
    576
    577	{
    578		.dlc = COMP_CODEC_CONF(MAX98373_DEV1_NAME),
    579		.name_prefix = "Left",
    580	},
    581};
    582
    583static struct snd_soc_dai_link_component max98373_ssp0_codec_components[] = {
    584	{ /* Left */
    585		.name = MAX98373_DEV0_NAME,
    586		.dai_name = MAX98373_CODEC_DAI,
    587	},
    588
    589	{  /* For Right */
    590		.name = MAX98373_DEV1_NAME,
    591		.dai_name = MAX98373_CODEC_DAI,
    592	},
    593
    594};
    595
    596SND_SOC_DAILINK_DEF(dummy,
    597	DAILINK_COMP_ARRAY(COMP_DUMMY()));
    598
    599SND_SOC_DAILINK_DEF(system,
    600	DAILINK_COMP_ARRAY(COMP_CPU("System Pin")));
    601
    602SND_SOC_DAILINK_DEF(echoref,
    603	DAILINK_COMP_ARRAY(COMP_CPU("Echoref Pin")));
    604
    605SND_SOC_DAILINK_DEF(reference,
    606	DAILINK_COMP_ARRAY(COMP_CPU("Reference Pin")));
    607
    608SND_SOC_DAILINK_DEF(dmic,
    609	DAILINK_COMP_ARRAY(COMP_CPU("DMIC Pin")));
    610
    611SND_SOC_DAILINK_DEF(hdmi1,
    612	DAILINK_COMP_ARRAY(COMP_CPU("HDMI1 Pin")));
    613
    614SND_SOC_DAILINK_DEF(hdmi2,
    615	DAILINK_COMP_ARRAY(COMP_CPU("HDMI2 Pin")));
    616
    617SND_SOC_DAILINK_DEF(hdmi3,
    618	DAILINK_COMP_ARRAY(COMP_CPU("HDMI3 Pin")));
    619
    620SND_SOC_DAILINK_DEF(system2,
    621	DAILINK_COMP_ARRAY(COMP_CPU("System Pin2")));
    622
    623SND_SOC_DAILINK_DEF(ssp0_pin,
    624	DAILINK_COMP_ARRAY(COMP_CPU("SSP0 Pin")));
    625SND_SOC_DAILINK_DEF(ssp0_codec,
    626	DAILINK_COMP_ARRAY(
    627	/* Left */	COMP_CODEC(MAX98927_DEV0_NAME, MAX98927_CODEC_DAI),
    628	/* For Right */	COMP_CODEC(MAX98927_DEV1_NAME, MAX98927_CODEC_DAI)));
    629
    630SND_SOC_DAILINK_DEF(ssp1_pin,
    631	DAILINK_COMP_ARRAY(COMP_CPU("SSP1 Pin")));
    632SND_SOC_DAILINK_DEF(ssp1_codec,
    633	DAILINK_COMP_ARRAY(COMP_CODEC("i2c-DLGS7219:00",
    634				      KBL_DIALOG_CODEC_DAI)));
    635
    636SND_SOC_DAILINK_DEF(dmic_pin,
    637	DAILINK_COMP_ARRAY(COMP_CPU("DMIC01 Pin")));
    638SND_SOC_DAILINK_DEF(dmic_codec,
    639	DAILINK_COMP_ARRAY(COMP_CODEC("dmic-codec", "dmic-hifi")));
    640
    641SND_SOC_DAILINK_DEF(idisp1_pin,
    642	DAILINK_COMP_ARRAY(COMP_CPU("iDisp1 Pin")));
    643SND_SOC_DAILINK_DEF(idisp1_codec,
    644	DAILINK_COMP_ARRAY(COMP_CODEC("ehdaudio0D2", "intel-hdmi-hifi1")));
    645
    646SND_SOC_DAILINK_DEF(idisp2_pin,
    647	DAILINK_COMP_ARRAY(COMP_CPU("iDisp2 Pin")));
    648SND_SOC_DAILINK_DEF(idisp2_codec,
    649	DAILINK_COMP_ARRAY(COMP_CODEC("ehdaudio0D2", "intel-hdmi-hifi2")));
    650
    651SND_SOC_DAILINK_DEF(idisp3_pin,
    652	DAILINK_COMP_ARRAY(COMP_CPU("iDisp3 Pin")));
    653SND_SOC_DAILINK_DEF(idisp3_codec,
    654	DAILINK_COMP_ARRAY(COMP_CODEC("ehdaudio0D2", "intel-hdmi-hifi3")));
    655
    656SND_SOC_DAILINK_DEF(platform,
    657	DAILINK_COMP_ARRAY(COMP_PLATFORM("0000:00:1f.3")));
    658
    659/* kabylake digital audio interface glue - connects codec <--> CPU */
    660static struct snd_soc_dai_link kabylake_dais[] = {
    661	/* Front End DAI links */
    662	[KBL_DPCM_AUDIO_PB] = {
    663		.name = "Kbl Audio Port",
    664		.stream_name = "Audio",
    665		.dynamic = 1,
    666		.nonatomic = 1,
    667		.init = kabylake_da7219_fe_init,
    668		.trigger = {
    669			SND_SOC_DPCM_TRIGGER_POST, SND_SOC_DPCM_TRIGGER_POST},
    670		.dpcm_playback = 1,
    671		.ops = &kabylake_da7219_fe_ops,
    672		SND_SOC_DAILINK_REG(system, dummy, platform),
    673	},
    674	[KBL_DPCM_AUDIO_ECHO_REF_CP] = {
    675		.name = "Kbl Audio Echo Reference cap",
    676		.stream_name = "Echoreference Capture",
    677		.init = NULL,
    678		.dpcm_capture = 1,
    679		.nonatomic = 1,
    680		SND_SOC_DAILINK_REG(echoref, dummy, platform),
    681	},
    682	[KBL_DPCM_AUDIO_REF_CP] = {
    683		.name = "Kbl Audio Reference cap",
    684		.stream_name = "Wake on Voice",
    685		.init = NULL,
    686		.dpcm_capture = 1,
    687		.nonatomic = 1,
    688		.dynamic = 1,
    689		.ops = &skylake_refcap_ops,
    690		SND_SOC_DAILINK_REG(reference, dummy, platform),
    691	},
    692	[KBL_DPCM_AUDIO_DMIC_CP] = {
    693		.name = "Kbl Audio DMIC cap",
    694		.stream_name = "dmiccap",
    695		.init = NULL,
    696		.dpcm_capture = 1,
    697		.nonatomic = 1,
    698		.dynamic = 1,
    699		.ops = &kabylake_dmic_ops,
    700		SND_SOC_DAILINK_REG(dmic, dummy, platform),
    701	},
    702	[KBL_DPCM_AUDIO_HDMI1_PB] = {
    703		.name = "Kbl HDMI Port1",
    704		.stream_name = "Hdmi1",
    705		.dpcm_playback = 1,
    706		.init = NULL,
    707		.trigger = {
    708			SND_SOC_DPCM_TRIGGER_POST, SND_SOC_DPCM_TRIGGER_POST},
    709		.nonatomic = 1,
    710		.dynamic = 1,
    711		SND_SOC_DAILINK_REG(hdmi1, dummy, platform),
    712	},
    713	[KBL_DPCM_AUDIO_HDMI2_PB] = {
    714		.name = "Kbl HDMI Port2",
    715		.stream_name = "Hdmi2",
    716		.dpcm_playback = 1,
    717		.init = NULL,
    718		.trigger = {
    719			SND_SOC_DPCM_TRIGGER_POST, SND_SOC_DPCM_TRIGGER_POST},
    720		.nonatomic = 1,
    721		.dynamic = 1,
    722		SND_SOC_DAILINK_REG(hdmi2, dummy, platform),
    723	},
    724	[KBL_DPCM_AUDIO_HDMI3_PB] = {
    725		.name = "Kbl HDMI Port3",
    726		.stream_name = "Hdmi3",
    727		.trigger = {
    728			SND_SOC_DPCM_TRIGGER_POST, SND_SOC_DPCM_TRIGGER_POST},
    729		.dpcm_playback = 1,
    730		.init = NULL,
    731		.nonatomic = 1,
    732		.dynamic = 1,
    733		SND_SOC_DAILINK_REG(hdmi3, dummy, platform),
    734	},
    735	[KBL_DPCM_AUDIO_HS_PB] = {
    736		.name = "Kbl Audio Headset Playback",
    737		.stream_name = "Headset Audio",
    738		.dpcm_playback = 1,
    739		.nonatomic = 1,
    740		.dynamic = 1,
    741		.init = kabylake_da7219_fe_init,
    742		.trigger = {
    743			SND_SOC_DPCM_TRIGGER_POST, SND_SOC_DPCM_TRIGGER_POST},
    744		.ops = &kabylake_da7219_fe_ops,
    745		SND_SOC_DAILINK_REG(system2, dummy, platform),
    746	},
    747	[KBL_DPCM_AUDIO_CP] = {
    748		.name = "Kbl Audio Capture Port",
    749		.stream_name = "Audio Record",
    750		.dynamic = 1,
    751		.nonatomic = 1,
    752		.trigger = {
    753			SND_SOC_DPCM_TRIGGER_POST, SND_SOC_DPCM_TRIGGER_POST},
    754		.dpcm_capture = 1,
    755		.ops = &kabylake_da7219_fe_ops,
    756		SND_SOC_DAILINK_REG(system, dummy, platform),
    757	},
    758
    759	/* Back End DAI links */
    760	{
    761		/* SSP0 - Codec */
    762		.name = "SSP0-Codec",
    763		.id = 0,
    764		.no_pcm = 1,
    765		.dai_fmt = SND_SOC_DAIFMT_DSP_B |
    766			SND_SOC_DAIFMT_NB_NF |
    767			SND_SOC_DAIFMT_CBC_CFC,
    768		.dpcm_playback = 1,
    769		.dpcm_capture = 1,
    770		.ignore_pmdown_time = 1,
    771		.be_hw_params_fixup = kabylake_ssp_fixup,
    772		.ops = &kabylake_ssp0_ops,
    773		SND_SOC_DAILINK_REG(ssp0_pin, ssp0_codec, platform),
    774	},
    775	{
    776		/* SSP1 - Codec */
    777		.name = "SSP1-Codec",
    778		.id = 1,
    779		.no_pcm = 1,
    780		.init = kabylake_da7219_codec_init,
    781		.dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF |
    782			SND_SOC_DAIFMT_CBC_CFC,
    783		.ignore_pmdown_time = 1,
    784		.be_hw_params_fixup = kabylake_ssp_fixup,
    785		.dpcm_playback = 1,
    786		.dpcm_capture = 1,
    787		SND_SOC_DAILINK_REG(ssp1_pin, ssp1_codec, platform),
    788	},
    789	{
    790		.name = "dmic01",
    791		.id = 2,
    792		.init = kabylake_dmic_init,
    793		.be_hw_params_fixup = kabylake_dmic_fixup,
    794		.ignore_suspend = 1,
    795		.dpcm_capture = 1,
    796		.no_pcm = 1,
    797		SND_SOC_DAILINK_REG(dmic_pin, dmic_codec, platform),
    798	},
    799	{
    800		.name = "iDisp1",
    801		.id = 3,
    802		.dpcm_playback = 1,
    803		.init = kabylake_hdmi1_init,
    804		.no_pcm = 1,
    805		SND_SOC_DAILINK_REG(idisp1_pin, idisp1_codec, platform),
    806	},
    807	{
    808		.name = "iDisp2",
    809		.id = 4,
    810		.init = kabylake_hdmi2_init,
    811		.dpcm_playback = 1,
    812		.no_pcm = 1,
    813		SND_SOC_DAILINK_REG(idisp2_pin, idisp2_codec, platform),
    814	},
    815	{
    816		.name = "iDisp3",
    817		.id = 5,
    818		.init = kabylake_hdmi3_init,
    819		.dpcm_playback = 1,
    820		.no_pcm = 1,
    821		SND_SOC_DAILINK_REG(idisp3_pin, idisp3_codec, platform),
    822	},
    823};
    824
    825/* kabylake digital audio interface glue - connects codec <--> CPU */
    826static struct snd_soc_dai_link kabylake_max98_927_373_dais[] = {
    827	/* Front End DAI links */
    828	[KBL_DPCM_AUDIO_PB] = {
    829		.name = "Kbl Audio Port",
    830		.stream_name = "Audio",
    831		.dynamic = 1,
    832		.nonatomic = 1,
    833		.init = kabylake_da7219_fe_init,
    834		.trigger = {
    835			SND_SOC_DPCM_TRIGGER_POST, SND_SOC_DPCM_TRIGGER_POST},
    836		.dpcm_playback = 1,
    837		.ops = &kabylake_da7219_fe_ops,
    838		SND_SOC_DAILINK_REG(system, dummy, platform),
    839	},
    840	[KBL_DPCM_AUDIO_ECHO_REF_CP] = {
    841		.name = "Kbl Audio Echo Reference cap",
    842		.stream_name = "Echoreference Capture",
    843		.init = NULL,
    844		.dpcm_capture = 1,
    845		.nonatomic = 1,
    846		SND_SOC_DAILINK_REG(echoref, dummy, platform),
    847	},
    848	[KBL_DPCM_AUDIO_REF_CP] = {
    849		.name = "Kbl Audio Reference cap",
    850		.stream_name = "Wake on Voice",
    851		.init = NULL,
    852		.dpcm_capture = 1,
    853		.nonatomic = 1,
    854		.dynamic = 1,
    855		.ops = &skylake_refcap_ops,
    856		SND_SOC_DAILINK_REG(reference, dummy, platform),
    857	},
    858	[KBL_DPCM_AUDIO_DMIC_CP] = {
    859		.name = "Kbl Audio DMIC cap",
    860		.stream_name = "dmiccap",
    861		.init = NULL,
    862		.dpcm_capture = 1,
    863		.nonatomic = 1,
    864		.dynamic = 1,
    865		.ops = &kabylake_dmic_ops,
    866		SND_SOC_DAILINK_REG(dmic, dummy, platform),
    867	},
    868	[KBL_DPCM_AUDIO_HDMI1_PB] = {
    869		.name = "Kbl HDMI Port1",
    870		.stream_name = "Hdmi1",
    871		.dpcm_playback = 1,
    872		.init = NULL,
    873		.trigger = {
    874			SND_SOC_DPCM_TRIGGER_POST, SND_SOC_DPCM_TRIGGER_POST},
    875		.nonatomic = 1,
    876		.dynamic = 1,
    877		SND_SOC_DAILINK_REG(hdmi1, dummy, platform),
    878	},
    879	[KBL_DPCM_AUDIO_HDMI2_PB] = {
    880		.name = "Kbl HDMI Port2",
    881		.stream_name = "Hdmi2",
    882		.dpcm_playback = 1,
    883		.init = NULL,
    884		.trigger = {
    885			SND_SOC_DPCM_TRIGGER_POST, SND_SOC_DPCM_TRIGGER_POST},
    886		.nonatomic = 1,
    887		.dynamic = 1,
    888		SND_SOC_DAILINK_REG(hdmi2, dummy, platform),
    889	},
    890	[KBL_DPCM_AUDIO_HDMI3_PB] = {
    891		.name = "Kbl HDMI Port3",
    892		.stream_name = "Hdmi3",
    893		.trigger = {
    894			SND_SOC_DPCM_TRIGGER_POST, SND_SOC_DPCM_TRIGGER_POST},
    895		.dpcm_playback = 1,
    896		.init = NULL,
    897		.nonatomic = 1,
    898		.dynamic = 1,
    899		SND_SOC_DAILINK_REG(hdmi3, dummy, platform),
    900	},
    901
    902	/* Back End DAI links */
    903	{
    904		/* SSP0 - Codec */
    905		.name = "SSP0-Codec",
    906		.id = 0,
    907		.no_pcm = 1,
    908		.dai_fmt = SND_SOC_DAIFMT_DSP_B |
    909			SND_SOC_DAIFMT_NB_NF |
    910			SND_SOC_DAIFMT_CBC_CFC,
    911		.dpcm_playback = 1,
    912		.dpcm_capture = 1,
    913		.ignore_pmdown_time = 1,
    914		.be_hw_params_fixup = kabylake_ssp_fixup,
    915		.ops = &kabylake_ssp0_ops,
    916		SND_SOC_DAILINK_REG(ssp0_pin, ssp0_codec),
    917	},
    918	{
    919		.name = "dmic01",
    920		.id = 1,
    921		.init = kabylake_dmic_init,
    922		.be_hw_params_fixup = kabylake_dmic_fixup,
    923		.ignore_suspend = 1,
    924		.dpcm_capture = 1,
    925		.no_pcm = 1,
    926		SND_SOC_DAILINK_REG(dmic_pin, dmic_codec, platform),
    927	},
    928	{
    929		.name = "iDisp1",
    930		.id = 2,
    931		.dpcm_playback = 1,
    932		.init = kabylake_hdmi1_init,
    933		.no_pcm = 1,
    934		SND_SOC_DAILINK_REG(idisp1_pin, idisp1_codec, platform),
    935	},
    936	{
    937		.name = "iDisp2",
    938		.id = 3,
    939		.init = kabylake_hdmi2_init,
    940		.dpcm_playback = 1,
    941		.no_pcm = 1,
    942		SND_SOC_DAILINK_REG(idisp2_pin, idisp2_codec, platform),
    943	},
    944	{
    945		.name = "iDisp3",
    946		.id = 4,
    947		.init = kabylake_hdmi3_init,
    948		.dpcm_playback = 1,
    949		.no_pcm = 1,
    950		SND_SOC_DAILINK_REG(idisp3_pin, idisp3_codec, platform),
    951	},
    952};
    953
    954static int kabylake_card_late_probe(struct snd_soc_card *card)
    955{
    956	struct kbl_codec_private *ctx = snd_soc_card_get_drvdata(card);
    957	struct kbl_hdmi_pcm *pcm;
    958	struct snd_soc_dapm_context *dapm = &card->dapm;
    959	struct snd_soc_component *component = NULL;
    960	int err, i = 0;
    961	char jack_name[NAME_SIZE];
    962
    963	list_for_each_entry(pcm, &ctx->hdmi_pcm_list, head) {
    964		component = pcm->codec_dai->component;
    965		snprintf(jack_name, sizeof(jack_name),
    966			"HDMI/DP, pcm=%d Jack", pcm->device);
    967		err = snd_soc_card_jack_new(card, jack_name,
    968					SND_JACK_AVOUT, &kabylake_hdmi[i]);
    969
    970		if (err)
    971			return err;
    972
    973		err = hdac_hdmi_jack_init(pcm->codec_dai, pcm->device,
    974						&kabylake_hdmi[i]);
    975		if (err < 0)
    976			return err;
    977
    978		i++;
    979	}
    980
    981	if (!component)
    982		return -EINVAL;
    983
    984
    985	err = hdac_hdmi_jack_port_init(component, &card->dapm);
    986
    987	if (err < 0)
    988		return err;
    989
    990	err = snd_soc_dapm_disable_pin(dapm, "Left Spk");
    991	if (err) {
    992		dev_err(card->dev, "failed to disable Left Spk: %d\n", err);
    993		return err;
    994	}
    995
    996	err = snd_soc_dapm_disable_pin(dapm, "Right Spk");
    997	if (err) {
    998		dev_err(card->dev, "failed to disable Right Spk: %d\n", err);
    999		return err;
   1000	}
   1001
   1002	return snd_soc_dapm_sync(dapm);
   1003}
   1004
   1005/* kabylake audio machine driver for SPT + DA7219 */
   1006static struct snd_soc_card kbl_audio_card_da7219_m98927 = {
   1007	.name = "kblda7219m98927",
   1008	.owner = THIS_MODULE,
   1009	.dai_link = kabylake_dais,
   1010	.num_links = ARRAY_SIZE(kabylake_dais),
   1011	.controls = kabylake_controls,
   1012	.num_controls = ARRAY_SIZE(kabylake_controls),
   1013	.dapm_widgets = kabylake_widgets,
   1014	.num_dapm_widgets = ARRAY_SIZE(kabylake_widgets),
   1015	.dapm_routes = kabylake_map,
   1016	.num_dapm_routes = ARRAY_SIZE(kabylake_map),
   1017	.codec_conf = max98927_codec_conf,
   1018	.num_configs = ARRAY_SIZE(max98927_codec_conf),
   1019	.fully_routed = true,
   1020	.late_probe = kabylake_card_late_probe,
   1021};
   1022
   1023/* kabylake audio machine driver for Maxim98927 */
   1024static struct snd_soc_card kbl_audio_card_max98927 = {
   1025	.name = "kblmax98927",
   1026	.owner = THIS_MODULE,
   1027	.dai_link = kabylake_max98_927_373_dais,
   1028	.num_links = ARRAY_SIZE(kabylake_max98_927_373_dais),
   1029	.controls = kabylake_controls,
   1030	.num_controls = ARRAY_SIZE(kabylake_controls),
   1031	.dapm_widgets = kabylake_widgets,
   1032	.num_dapm_widgets = ARRAY_SIZE(kabylake_widgets),
   1033	.dapm_routes = kabylake_map,
   1034	.num_dapm_routes = ARRAY_SIZE(kabylake_map),
   1035	.codec_conf = max98927_codec_conf,
   1036	.num_configs = ARRAY_SIZE(max98927_codec_conf),
   1037	.fully_routed = true,
   1038	.late_probe = kabylake_card_late_probe,
   1039};
   1040
   1041static struct snd_soc_card kbl_audio_card_da7219_m98373 = {
   1042	.name = "kblda7219m98373",
   1043	.owner = THIS_MODULE,
   1044	.dai_link = kabylake_dais,
   1045	.num_links = ARRAY_SIZE(kabylake_dais),
   1046	.controls = kabylake_controls,
   1047	.num_controls = ARRAY_SIZE(kabylake_controls),
   1048	.dapm_widgets = kabylake_widgets,
   1049	.num_dapm_widgets = ARRAY_SIZE(kabylake_widgets),
   1050	.dapm_routes = kabylake_map,
   1051	.num_dapm_routes = ARRAY_SIZE(kabylake_map),
   1052	.codec_conf = max98373_codec_conf,
   1053	.num_configs = ARRAY_SIZE(max98373_codec_conf),
   1054	.fully_routed = true,
   1055	.late_probe = kabylake_card_late_probe,
   1056};
   1057
   1058static struct snd_soc_card kbl_audio_card_max98373 = {
   1059	.name = "kblmax98373",
   1060	.owner = THIS_MODULE,
   1061	.dai_link = kabylake_max98_927_373_dais,
   1062	.num_links = ARRAY_SIZE(kabylake_max98_927_373_dais),
   1063	.controls = kabylake_controls,
   1064	.num_controls = ARRAY_SIZE(kabylake_controls),
   1065	.dapm_widgets = kabylake_widgets,
   1066	.num_dapm_widgets = ARRAY_SIZE(kabylake_widgets),
   1067	.dapm_routes = kabylake_map,
   1068	.num_dapm_routes = ARRAY_SIZE(kabylake_map),
   1069	.codec_conf = max98373_codec_conf,
   1070	.num_configs = ARRAY_SIZE(max98373_codec_conf),
   1071	.fully_routed = true,
   1072	.late_probe = kabylake_card_late_probe,
   1073};
   1074
   1075static int kabylake_audio_probe(struct platform_device *pdev)
   1076{
   1077	struct kbl_codec_private *ctx;
   1078	struct snd_soc_dai_link *kbl_dai_link;
   1079	struct snd_soc_dai_link_component **codecs;
   1080	int i;
   1081
   1082	ctx = devm_kzalloc(&pdev->dev, sizeof(*ctx), GFP_KERNEL);
   1083	if (!ctx)
   1084		return -ENOMEM;
   1085
   1086	INIT_LIST_HEAD(&ctx->hdmi_pcm_list);
   1087
   1088	kabylake_audio_card =
   1089		(struct snd_soc_card *)pdev->id_entry->driver_data;
   1090
   1091	kbl_dai_link = kabylake_audio_card->dai_link;
   1092
   1093	/* Update codecs for SSP0 with max98373 codec info */
   1094	if (!strcmp(pdev->name, "kbl_da7219_max98373") ||
   1095		(!strcmp(pdev->name, "kbl_max98373"))) {
   1096		for (i = 0; i < kabylake_audio_card->num_links; ++i) {
   1097			if (strcmp(kbl_dai_link[i].name, "SSP0-Codec"))
   1098				continue;
   1099
   1100			codecs = &(kbl_dai_link[i].codecs);
   1101			*codecs = max98373_ssp0_codec_components;
   1102			kbl_dai_link[i].num_codecs =
   1103				ARRAY_SIZE(max98373_ssp0_codec_components);
   1104			break;
   1105		}
   1106	}
   1107	kabylake_audio_card->dev = &pdev->dev;
   1108	snd_soc_card_set_drvdata(kabylake_audio_card, ctx);
   1109
   1110	return devm_snd_soc_register_card(&pdev->dev, kabylake_audio_card);
   1111}
   1112
   1113static const struct platform_device_id kbl_board_ids[] = {
   1114	{
   1115		.name = "kbl_da7219_max98927",
   1116		.driver_data =
   1117			(kernel_ulong_t)&kbl_audio_card_da7219_m98927,
   1118	},
   1119	{
   1120		.name = "kbl_max98927",
   1121		.driver_data =
   1122			(kernel_ulong_t)&kbl_audio_card_max98927,
   1123	},
   1124	{
   1125		.name = "kbl_da7219_max98373",
   1126		.driver_data =
   1127			(kernel_ulong_t)&kbl_audio_card_da7219_m98373,
   1128	},
   1129	{
   1130		.name = "kbl_max98373",
   1131		.driver_data =
   1132			(kernel_ulong_t)&kbl_audio_card_max98373,
   1133	},
   1134	{ }
   1135};
   1136MODULE_DEVICE_TABLE(platform, kbl_board_ids);
   1137
   1138static struct platform_driver kabylake_audio = {
   1139	.probe = kabylake_audio_probe,
   1140	.driver = {
   1141		.name = "kbl_da7219_max98_927_373",
   1142		.pm = &snd_soc_pm_ops,
   1143	},
   1144	.id_table = kbl_board_ids,
   1145};
   1146
   1147module_platform_driver(kabylake_audio)
   1148
   1149/* Module information */
   1150MODULE_DESCRIPTION("Audio KabyLake Machine driver for MAX98927/MAX98373 & DA7219");
   1151MODULE_AUTHOR("Mac Chiang <mac.chiang@intel.com>");
   1152MODULE_LICENSE("GPL v2");