ASoC: SOF: Intel: add hw specific PCM constraints
authorKai Vehmanen <kai.vehmanen@linux.intel.com>
Wed, 18 Nov 2020 14:05:45 +0000 (16:05 +0200)
committerMark Brown <broonie@kernel.org>
Thu, 19 Nov 2020 13:00:04 +0000 (13:00 +0000)
Part of PCM constraints are set based on DSP topology, but rest
should be set based on hardware capabilities. Add PCM constraints
for Intel platforms:

- Add constraint for the period count to be integer. This avoids
  wrap-arounds of the DMA circular buffer in middle of a period.

- Align period size to dword/32bit as per HDA spec.

Both constraints are aligned with current implementation in snd-hda-intel
driver.

Signed-off-by: Kai Vehmanen <kai.vehmanen@linux.intel.com>
Reviewed-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Reviewed-by: Ranjani Sridharan <ranjani.sridharan@linux.intel.com>
Link: https://lore.kernel.org/r/20201118140545.2138895-2-kai.vehmanen@linux.intel.com
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/sof/intel/hda-pcm.c
sound/soc/sof/intel/intel-ipc.c

index b527d59..5d35bb1 100644 (file)
@@ -225,6 +225,13 @@ int hda_dsp_pcm_open(struct snd_sof_dev *sdev,
                return -ENODEV;
        }
 
+       /* minimum as per HDA spec */
+       snd_pcm_hw_constraint_step(substream->runtime, 0, SNDRV_PCM_HW_PARAM_PERIOD_BYTES, 4);
+
+       /* avoid circular buffer wrap in middle of period */
+       snd_pcm_hw_constraint_integer(substream->runtime,
+                                     SNDRV_PCM_HW_PARAM_PERIODS);
+
        /* binding pcm substream to hda stream */
        substream->runtime->private_data = &dsp_stream->hstream;
        return 0;
index 310f916..de66f8a 100644 (file)
@@ -73,6 +73,13 @@ int intel_pcm_open(struct snd_sof_dev *sdev,
        /* binding pcm substream to hda stream */
        substream->runtime->private_data = stream;
 
+       /* align to DMA minimum transfer size */
+       snd_pcm_hw_constraint_step(substream->runtime, 0, SNDRV_PCM_HW_PARAM_PERIOD_BYTES, 4);
+
+       /* avoid circular buffer wrap in middle of period */
+       snd_pcm_hw_constraint_integer(substream->runtime,
+                                     SNDRV_PCM_HW_PARAM_PERIODS);
+
        return 0;
 }
 EXPORT_SYMBOL_NS(intel_pcm_open, SND_SOC_SOF_INTEL_HIFI_EP_IPC);