//          Amadeusz Slawinski <amadeuszx.slawinski@linux.intel.com>
 //
 
+#include <linux/dmi.h>
 #include <linux/module.h>
 #include <sound/jack.h>
 #include <sound/pcm.h>
 #include <sound/soc-acpi.h>
 #include "../../../codecs/rt298.h"
 
+static const struct dmi_system_id kblr_dmi_table[] = {
+       {
+               .matches = {
+                       DMI_MATCH(DMI_SYS_VENDOR, "Intel Corporation"),
+                       DMI_MATCH(DMI_BOARD_NAME, "Kabylake R DDR4 RVP"),
+               },
+       },
+       {}
+};
+
 static const struct snd_kcontrol_new card_controls[] = {
        SOC_DAPM_PIN_SWITCH("Headphone Jack"),
        SOC_DAPM_PIN_SWITCH("Mic Jack"),
 {
        struct snd_soc_pcm_runtime *rtd = substream->private_data;
        struct snd_soc_dai *codec_dai = asoc_rtd_to_codec(rtd, 0);
+       unsigned int clk_freq;
        int ret;
 
-       ret = snd_soc_dai_set_sysclk(codec_dai, RT298_SCLK_S_PLL, 19200000, SND_SOC_CLOCK_IN);
+       if (dmi_first_match(kblr_dmi_table))
+               clk_freq = 24000000;
+       else
+               clk_freq = 19200000;
+
+       ret = snd_soc_dai_set_sysclk(codec_dai, RT298_SCLK_S_PLL, clk_freq, SND_SOC_CLOCK_IN);
        if (ret < 0)
                dev_err(rtd->dev, "Set codec sysclk failed: %d\n", ret);
 
        dl->platforms = platform;
        dl->num_platforms = 1;
        dl->id = 0;
-       dl->dai_fmt = SND_SOC_DAIFMT_DSP_A | SND_SOC_DAIFMT_NB_NF | SND_SOC_DAIFMT_CBS_CFS;
+       if (dmi_first_match(kblr_dmi_table))
+               dl->dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF | SND_SOC_DAIFMT_CBS_CFS;
+       else
+               dl->dai_fmt = SND_SOC_DAIFMT_DSP_A | SND_SOC_DAIFMT_NB_NF | SND_SOC_DAIFMT_CBS_CFS;
        dl->init = avs_rt298_codec_init;
        dl->be_hw_params_fixup = avs_rt298_be_fixup;
        dl->ops = &avs_rt298_ops;