1*858f7a5cSDaniel Baluta // SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause) 2*858f7a5cSDaniel Baluta // 3*858f7a5cSDaniel Baluta // Copyright 2021 NXP 4*858f7a5cSDaniel Baluta // 5*858f7a5cSDaniel Baluta // Author: Daniel Baluta <daniel.baluta@nxp.com> 6*858f7a5cSDaniel Baluta 7*858f7a5cSDaniel Baluta #include <sound/soc.h> 8*858f7a5cSDaniel Baluta #include <sound/sof.h> 9*858f7a5cSDaniel Baluta #include <sound/compress_driver.h> 10*858f7a5cSDaniel Baluta #include "sof-audio.h" 11*858f7a5cSDaniel Baluta #include "sof-priv.h" 12*858f7a5cSDaniel Baluta 13*858f7a5cSDaniel Baluta static void snd_sof_compr_fragment_elapsed_work(struct work_struct *work) 14*858f7a5cSDaniel Baluta { 15*858f7a5cSDaniel Baluta struct snd_sof_pcm_stream *sps = 16*858f7a5cSDaniel Baluta container_of(work, struct snd_sof_pcm_stream, 17*858f7a5cSDaniel Baluta period_elapsed_work); 18*858f7a5cSDaniel Baluta 19*858f7a5cSDaniel Baluta snd_compr_fragment_elapsed(sps->cstream); 20*858f7a5cSDaniel Baluta } 21*858f7a5cSDaniel Baluta 22*858f7a5cSDaniel Baluta void snd_sof_compr_init_elapsed_work(struct work_struct *work) 23*858f7a5cSDaniel Baluta { 24*858f7a5cSDaniel Baluta INIT_WORK(work, snd_sof_compr_fragment_elapsed_work); 25*858f7a5cSDaniel Baluta } 26*858f7a5cSDaniel Baluta 27*858f7a5cSDaniel Baluta /* 28*858f7a5cSDaniel Baluta * sof compr fragment elapse, this could be called in irq thread context 29*858f7a5cSDaniel Baluta */ 30*858f7a5cSDaniel Baluta void snd_sof_compr_fragment_elapsed(struct snd_compr_stream *cstream) 31*858f7a5cSDaniel Baluta { 32*858f7a5cSDaniel Baluta struct snd_soc_component *component; 33*858f7a5cSDaniel Baluta struct snd_soc_pcm_runtime *rtd; 34*858f7a5cSDaniel Baluta struct snd_sof_pcm *spcm; 35*858f7a5cSDaniel Baluta 36*858f7a5cSDaniel Baluta if (!cstream) 37*858f7a5cSDaniel Baluta return; 38*858f7a5cSDaniel Baluta 39*858f7a5cSDaniel Baluta rtd = cstream->private_data; 40*858f7a5cSDaniel Baluta component = snd_soc_rtdcom_lookup(rtd, SOF_AUDIO_PCM_DRV_NAME); 41*858f7a5cSDaniel Baluta 42*858f7a5cSDaniel Baluta spcm = snd_sof_find_spcm_dai(component, rtd); 43*858f7a5cSDaniel Baluta if (!spcm) { 44*858f7a5cSDaniel Baluta dev_err(component->dev, 45*858f7a5cSDaniel Baluta "fragment elapsed called for unknown stream!\n"); 46*858f7a5cSDaniel Baluta return; 47*858f7a5cSDaniel Baluta } 48*858f7a5cSDaniel Baluta 49*858f7a5cSDaniel Baluta /* use the same workqueue-based solution as for PCM, cf. snd_sof_pcm_elapsed */ 50*858f7a5cSDaniel Baluta schedule_work(&spcm->stream[cstream->direction].period_elapsed_work); 51*858f7a5cSDaniel Baluta } 52