Merge tag 'asoc-fix-v6.9-rc2' of https://git.kernel.org/pub/scm/linux/kernel/git...
[sfrench/cifs-2.6.git] / sound / soc / sof / ipc4-topology.c
index f28edd9830c1b3e25961add70dff87a489cfa119..5cca058421260978dd18e992b09dfff58b44bbdb 100644 (file)
@@ -412,8 +412,9 @@ static int sof_ipc4_widget_setup_pcm(struct snd_sof_widget *swidget)
        struct sof_ipc4_available_audio_format *available_fmt;
        struct snd_soc_component *scomp = swidget->scomp;
        struct sof_ipc4_copier *ipc4_copier;
+       struct snd_sof_pcm *spcm;
        int node_type = 0;
-       int ret;
+       int ret, dir;
 
        ipc4_copier = kzalloc(sizeof(*ipc4_copier), GFP_KERNEL);
        if (!ipc4_copier)
@@ -447,6 +448,25 @@ static int sof_ipc4_widget_setup_pcm(struct snd_sof_widget *swidget)
        }
        dev_dbg(scomp->dev, "host copier '%s' node_type %u\n", swidget->widget->name, node_type);
 
+       spcm = snd_sof_find_spcm_comp(scomp, swidget->comp_id, &dir);
+       if (!spcm)
+               goto skip_gtw_cfg;
+
+       if (dir == SNDRV_PCM_STREAM_PLAYBACK) {
+               struct snd_sof_pcm_stream *sps = &spcm->stream[dir];
+
+               sof_update_ipc_object(scomp, &sps->dsp_max_burst_size_in_ms,
+                                     SOF_COPIER_DEEP_BUFFER_TOKENS,
+                                     swidget->tuples,
+                                     swidget->num_tuples, sizeof(u32), 1);
+               /* Set default DMA buffer size if it is not specified in topology */
+               if (!sps->dsp_max_burst_size_in_ms)
+                       sps->dsp_max_burst_size_in_ms = SOF_IPC4_MIN_DMA_BUFFER_SIZE;
+       } else {
+               /* Capture data is copied from DSP to host in 1ms bursts */
+               spcm->stream[dir].dsp_max_burst_size_in_ms = 1;
+       }
+
 skip_gtw_cfg:
        ipc4_copier->gtw_attr = kzalloc(sizeof(*ipc4_copier->gtw_attr), GFP_KERNEL);
        if (!ipc4_copier->gtw_attr) {