···342342{343343 struct snd_sof_dev *sdev = adata->dev;344344 unsigned int val;345345+ unsigned int acp_dma_ch_sts;345346 int ret = 0;346347348348+ switch (adata->pci_rev) {349349+ case ACP70_PCI_ID:350350+ acp_dma_ch_sts = ACP70_DMA_CH_STS;351351+ break;352352+ default:353353+ acp_dma_ch_sts = ACP_DMA_CH_STS;354354+ }347355 val = snd_sof_dsp_read(sdev, ACP_DSP_BAR, ACP_DMA_CNTL_0 + ch * sizeof(u32));348356 if (val & ACP_DMA_CH_RUN) {349349- ret = snd_sof_dsp_read_poll_timeout(sdev, ACP_DSP_BAR, ACP_DMA_CH_STS, val, !val,357357+ ret = snd_sof_dsp_read_poll_timeout(sdev, ACP_DSP_BAR, acp_dma_ch_sts, val, !val,350358 ACP_REG_POLL_INTERVAL,351359 ACP_DMA_COMPLETE_TIMEOUT_US);352360 if (ret < 0)
+10-13
sound/soc/sof/intel/hda-dai-ops.c
···346346 case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:347347 snd_hdac_ext_stream_start(hext_stream);348348 break;349349- case SNDRV_PCM_TRIGGER_SUSPEND:350350- case SNDRV_PCM_TRIGGER_STOP:351349 case SNDRV_PCM_TRIGGER_PAUSE_PUSH:352352- snd_hdac_ext_stream_clear(hext_stream);353353-354350 /*355355- * Save the LLP registers in case the stream is356356- * restarting due PAUSE_RELEASE, or START without a pcm357357- * close/open since in this case the LLP register is not reset358358- * to 0 and the delay calculation will return with invalid359359- * results.351351+ * Save the LLP registers since in case of PAUSE the LLP352352+ * register are not reset to 0, the delay calculation will use353353+ * the saved offsets for compensating the delay calculation.360354 */361355 hext_stream->pplcllpl = readl(hext_stream->pplc_addr + AZX_REG_PPLCLLPL);362356 hext_stream->pplcllpu = readl(hext_stream->pplc_addr + AZX_REG_PPLCLLPU);357357+ snd_hdac_ext_stream_clear(hext_stream);358358+ break;359359+ case SNDRV_PCM_TRIGGER_SUSPEND:360360+ case SNDRV_PCM_TRIGGER_STOP:361361+ hext_stream->pplcllpl = 0;362362+ hext_stream->pplcllpu = 0;363363+ snd_hdac_ext_stream_clear(hext_stream);363364 break;364365 default:365366 dev_err(sdev->dev, "unknown trigger command %d\n", cmd);···513512static int hda_ipc3_post_trigger(struct snd_sof_dev *sdev, struct snd_soc_dai *cpu_dai,514513 struct snd_pcm_substream *substream, int cmd)515514{516516- struct hdac_ext_stream *hext_stream = hda_get_hext_stream(sdev, cpu_dai, substream);517515 struct snd_soc_dapm_widget *w = snd_soc_dai_get_widget(cpu_dai, substream->stream);518516519517 switch (cmd) {···526526 ret = hda_dai_config(w, SOF_DAI_CONFIG_FLAGS_HW_FREE, &data);527527 if (ret < 0)528528 return ret;529529-530530- if (cmd == SNDRV_PCM_TRIGGER_STOP)531531- return hda_link_dma_cleanup(substream, hext_stream, cpu_dai);532529533530 break;534531 }
+33-4
sound/soc/sof/intel/hda-dai.c
···302302 }303303304304 switch (cmd) {305305+ case SNDRV_PCM_TRIGGER_STOP:305306 case SNDRV_PCM_TRIGGER_SUSPEND:306307 ret = hda_link_dma_cleanup(substream, hext_stream, dai);307308 if (ret < 0) {···371370 return -EINVAL;372371 }373372373373+ sdev = widget_to_sdev(w);374374+ hext_stream = ops->get_hext_stream(sdev, cpu_dai, substream);375375+376376+ /* nothing more to do if the link is already prepared */377377+ if (hext_stream && hext_stream->link_prepared)378378+ return 0;379379+374380 /* use HDaudio stream handling */375381 ret = hda_dai_hw_params_data(substream, params, cpu_dai, data, flags);376382 if (ret < 0) {···385377 return ret;386378 }387379388388- sdev = widget_to_sdev(w);389380 if (sdev->dspless_mode_selected)390381 return 0;391382···489482 int ret;490483 int i;491484485485+ ops = hda_dai_get_ops(substream, cpu_dai);486486+ if (!ops) {487487+ dev_err(cpu_dai->dev, "DAI widget ops not set\n");488488+ return -EINVAL;489489+ }490490+491491+ sdev = widget_to_sdev(w);492492+ hext_stream = ops->get_hext_stream(sdev, cpu_dai, substream);493493+494494+ /* nothing more to do if the link is already prepared */495495+ if (hext_stream && hext_stream->link_prepared)496496+ return 0;497497+498498+ /*499499+ * reset the PCMSyCM registers to handle a prepare callback when the PCM is restarted500500+ * due to xruns or after a call to snd_pcm_drain/drop()501501+ */502502+ ret = hdac_bus_eml_sdw_map_stream_ch(sof_to_bus(sdev), link_id, cpu_dai->id,503503+ 0, 0, substream->stream);504504+ if (ret < 0) {505505+ dev_err(cpu_dai->dev, "%s: hdac_bus_eml_sdw_map_stream_ch failed %d\n",506506+ __func__, ret);507507+ return ret;508508+ }509509+492510 data.dai_index = (link_id << 8) | cpu_dai->id;493511 data.dai_node_id = intel_alh_id;494512 ret = non_hda_dai_hw_params_data(substream, params, cpu_dai, &data, flags);···522490 return ret;523491 }524492525525- ops = hda_dai_get_ops(substream, cpu_dai);526526- sdev = widget_to_sdev(w);527493 hext_stream = ops->get_hext_stream(sdev, cpu_dai, substream);528528-529494 if (!hext_stream)530495 return -ENODEV;531496
+13-2
sound/soc/sof/ipc4-topology.c
···32493249 * group_id during copier's ipc_prepare op.32503250 */32513251 if (flags & SOF_DAI_CONFIG_FLAGS_HW_PARAMS) {32523252+ struct sof_ipc4_alh_configuration_blob *blob;32533253+32543254+ blob = (struct sof_ipc4_alh_configuration_blob *)ipc4_copier->copier_config;32523255 ipc4_copier->dai_index = data->dai_node_id;32533253- copier_data->gtw_cfg.node_id &= ~SOF_IPC4_NODE_INDEX_MASK;32543254- copier_data->gtw_cfg.node_id |= SOF_IPC4_NODE_INDEX(data->dai_node_id);32563256+32573257+ /*32583258+ * no need to set the node_id for aggregated DAI's. These will be assigned32593259+ * a group_id during widget ipc_prepare32603260+ */32613261+ if (blob->alh_cfg.device_count == 1) {32623262+ copier_data->gtw_cfg.node_id &= ~SOF_IPC4_NODE_INDEX_MASK;32633263+ copier_data->gtw_cfg.node_id |=32643264+ SOF_IPC4_NODE_INDEX(data->dai_node_id);32653265+ }32553266 }3256326732573268 break;
···326326 int div;327327328328 div = DIV_ROUND_CLOSEST(input_rate, output_rate);329329- if (div > SAI_XCR1_MCKDIV_MAX(version)) {329329+ if (div > SAI_XCR1_MCKDIV_MAX(version) || div <= 0) {330330 dev_err(&sai->pdev->dev, "Divider %d out of range\n", div);331331 return -EINVAL;332332 }···491491 int div;492492493493 div = stm32_sai_get_clk_div(sai, *prate, rate);494494- if (div < 0)495495- return div;494494+ if (div <= 0)495495+ return -EINVAL;496496497497 mclk->freq = *prate / div;498498
+1-1
sound/soc/stm/stm32_spdifrx.c
···939939{940940 struct stm32_spdifrx_data *spdifrx = platform_get_drvdata(pdev);941941942942- if (spdifrx->ctrl_chan)942942+ if (!IS_ERR(spdifrx->ctrl_chan))943943 dma_release_channel(spdifrx->ctrl_chan);944944945945 if (spdifrx->dmab)