Merge tag 'asoc-v5.18' of https://git.kernel.org/pub/scm/linux/kernel/git/broonie...
[linux-2.6-microblaze.git] / sound / soc / amd / vangogh / acp5x-mach.c
index 28238af..1551546 100644 (file)
@@ -33,6 +33,8 @@
 #define DUAL_CHANNEL           2
 #define ACP5X_NUVOTON_CODEC_DAI        "nau8821-hifi"
 #define VG_JUPITER 1
+#define ACP5X_NUVOTON_BCLK 3072000
+#define ACP5X_NAU8821_FREQ_OUT 12288000
 
 static unsigned long acp5x_machine_id;
 static struct snd_soc_jack vg_headset;
@@ -98,6 +100,13 @@ static const struct snd_pcm_hw_constraint_list constraints_channels = {
        .mask = 0,
 };
 
+static const unsigned int acp5x_nau8821_format[] = {32};
+
+static struct snd_pcm_hw_constraint_list constraints_sample_bits = {
+       .list = acp5x_nau8821_format,
+       .count = ARRAY_SIZE(acp5x_nau8821_format),
+};
+
 static int acp5x_8821_startup(struct snd_pcm_substream *substream)
 {
        struct snd_pcm_runtime *runtime = substream->runtime;
@@ -113,6 +122,9 @@ static int acp5x_8821_startup(struct snd_pcm_substream *substream)
                                   &constraints_channels);
        snd_pcm_hw_constraint_list(runtime, 0, SNDRV_PCM_HW_PARAM_RATE,
                                   &constraints_rates);
+       snd_pcm_hw_constraint_list(substream->runtime, 0,
+                                  SNDRV_PCM_HW_PARAM_SAMPLE_BITS,
+                                  &constraints_sample_bits);
        return 0;
 }
 
@@ -275,6 +287,15 @@ static int platform_clock_control(struct snd_soc_dapm_widget *w,
                        dev_err(card->dev, "set sysclk err = %d\n", ret);
                        return -EIO;
                }
+       } else {
+               ret = snd_soc_dai_set_sysclk(codec_dai, NAU8821_CLK_FLL_BLK, 0,
+                                            SND_SOC_CLOCK_IN);
+               if (ret < 0)
+                       dev_err(codec_dai->dev, "can't set BLK clock %d\n", ret);
+               ret = snd_soc_dai_set_pll(codec_dai, 0, 0, ACP5X_NUVOTON_BCLK,
+                                         ACP5X_NAU8821_FREQ_OUT);
+               if (ret < 0)
+                       dev_err(codec_dai->dev, "can't set FLL: %d\n", ret);
        }
        return ret;
 }
@@ -290,7 +311,7 @@ static const struct snd_soc_dapm_widget acp5x_8821_widgets[] = {
        SND_SOC_DAPM_MIC("Headset Mic", NULL),
        SND_SOC_DAPM_MIC("Int Mic", NULL),
        SND_SOC_DAPM_SUPPLY("Platform Clock", SND_SOC_NOPM, 0, 0,
-                           platform_clock_control, SND_SOC_DAPM_POST_PMD),
+                           platform_clock_control, SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
 };
 
 static const struct snd_soc_dapm_route acp5x_8821_audio_route[] = {