xref: /openbmc/linux/sound/soc/sof/compress.c (revision 858f7a5c45cacbf9965c4735330ee34baa0728f4)
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