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