|
@@ -399,6 +399,43 @@ static int kabylake_dmic_fixup(struct snd_soc_pcm_runtime *rtd,
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+static int kabylake_ssp0_hw_params(struct snd_pcm_substream *substream,
|
|
|
+ struct snd_pcm_hw_params *params)
|
|
|
+{
|
|
|
+ struct snd_soc_pcm_runtime *rtd = substream->private_data;
|
|
|
+ int ret = 0, j;
|
|
|
+
|
|
|
+ for (j = 0; j < rtd->num_codecs; j++) {
|
|
|
+ struct snd_soc_dai *codec_dai = rtd->codec_dais[j];
|
|
|
+
|
|
|
+ if (!strcmp(codec_dai->component->name, MAXIM_DEV0_NAME)) {
|
|
|
+ /*
|
|
|
+ * Use channel 4 and 5 for the first amp
|
|
|
+ */
|
|
|
+ ret = snd_soc_dai_set_tdm_slot(codec_dai, 0x30, 3, 8, 16);
|
|
|
+ if (ret < 0) {
|
|
|
+ dev_err(rtd->dev, "set TDM slot err:%d\n", ret);
|
|
|
+ return ret;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (!strcmp(codec_dai->component->name, MAXIM_DEV1_NAME)) {
|
|
|
+ /*
|
|
|
+ * Use channel 6 and 7 for the second amp
|
|
|
+ */
|
|
|
+ ret = snd_soc_dai_set_tdm_slot(codec_dai, 0xC0, 3, 8, 16);
|
|
|
+ if (ret < 0) {
|
|
|
+ dev_err(rtd->dev, "set TDM slot err:%d\n", ret);
|
|
|
+ return ret;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return ret;
|
|
|
+}
|
|
|
+
|
|
|
+static struct snd_soc_ops kabylake_ssp0_ops = {
|
|
|
+ .hw_params = kabylake_ssp0_hw_params,
|
|
|
+};
|
|
|
+
|
|
|
static unsigned int channels_dmic[] = {
|
|
|
2, 4,
|
|
|
};
|
|
@@ -602,12 +639,13 @@ static struct snd_soc_dai_link kabylake_dais[] = {
|
|
|
.no_pcm = 1,
|
|
|
.codecs = max98927_codec_components,
|
|
|
.num_codecs = ARRAY_SIZE(max98927_codec_components),
|
|
|
- .dai_fmt = SND_SOC_DAIFMT_I2S |
|
|
|
+ .dai_fmt = SND_SOC_DAIFMT_DSP_B |
|
|
|
SND_SOC_DAIFMT_NB_NF |
|
|
|
SND_SOC_DAIFMT_CBS_CFS,
|
|
|
.ignore_pmdown_time = 1,
|
|
|
.be_hw_params_fixup = kabylake_ssp_fixup,
|
|
|
.dpcm_playback = 1,
|
|
|
+ .ops = &kabylake_ssp0_ops,
|
|
|
},
|
|
|
{
|
|
|
/* SSP1 - Codec */
|