// SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause) // // Copyright 2021 NXP // // Author: Daniel Baluta #include #include #include #include "sof-audio.h" #include "sof-priv.h" static void snd_sof_compr_fragment_elapsed_work(struct work_struct *work) { struct snd_sof_pcm_stream *sps = container_of(work, struct snd_sof_pcm_stream, period_elapsed_work); snd_compr_fragment_elapsed(sps->cstream); } void snd_sof_compr_init_elapsed_work(struct work_struct *work) { INIT_WORK(work, snd_sof_compr_fragment_elapsed_work); } /* * sof compr fragment elapse, this could be called in irq thread context */ void snd_sof_compr_fragment_elapsed(struct snd_compr_stream *cstream) { struct snd_soc_component *component; struct snd_soc_pcm_runtime *rtd; struct snd_sof_pcm *spcm; if (!cstream) return; rtd = cstream->private_data; component = snd_soc_rtdcom_lookup(rtd, SOF_AUDIO_PCM_DRV_NAME); spcm = snd_sof_find_spcm_dai(component, rtd); if (!spcm) { dev_err(component->dev, "fragment elapsed called for unknown stream!\n"); return; } /* use the same workqueue-based solution as for PCM, cf. snd_sof_pcm_elapsed */ schedule_work(&spcm->stream[cstream->direction].period_elapsed_work); }