xref: /openbmc/linux/include/sound/soc-dpcm.h (revision 01d7584cd2e5a93a2b959c9dddaa0d93ec205404)
1*01d7584cSLiam Girdwood /*
2*01d7584cSLiam Girdwood  * linux/sound/soc-dpcm.h -- ALSA SoC Dynamic PCM Support
3*01d7584cSLiam Girdwood  *
4*01d7584cSLiam Girdwood  * Author:		Liam Girdwood <lrg@ti.com>
5*01d7584cSLiam Girdwood  *
6*01d7584cSLiam Girdwood  * This program is free software; you can redistribute it and/or modify
7*01d7584cSLiam Girdwood  * it under the terms of the GNU General Public License version 2 as
8*01d7584cSLiam Girdwood  * published by the Free Software Foundation.
9*01d7584cSLiam Girdwood  */
10*01d7584cSLiam Girdwood 
11*01d7584cSLiam Girdwood #ifndef __LINUX_SND_SOC_DPCM_H
12*01d7584cSLiam Girdwood #define __LINUX_SND_SOC_DPCM_H
13*01d7584cSLiam Girdwood 
14*01d7584cSLiam Girdwood #include <linux/list.h>
15*01d7584cSLiam Girdwood #include <sound/pcm.h>
16*01d7584cSLiam Girdwood 
17*01d7584cSLiam Girdwood struct snd_soc_pcm_runtime;
18*01d7584cSLiam Girdwood 
19*01d7584cSLiam Girdwood /*
20*01d7584cSLiam Girdwood  * Types of runtime_update to perform. e.g. originated from FE PCM ops
21*01d7584cSLiam Girdwood  * or audio route changes triggered by muxes/mixers.
22*01d7584cSLiam Girdwood  */
23*01d7584cSLiam Girdwood enum snd_soc_dpcm_update {
24*01d7584cSLiam Girdwood 	SND_SOC_DPCM_UPDATE_NO	= 0,
25*01d7584cSLiam Girdwood 	SND_SOC_DPCM_UPDATE_BE,
26*01d7584cSLiam Girdwood 	SND_SOC_DPCM_UPDATE_FE,
27*01d7584cSLiam Girdwood };
28*01d7584cSLiam Girdwood 
29*01d7584cSLiam Girdwood /*
30*01d7584cSLiam Girdwood  * Dynamic PCM Frontend -> Backend link management states.
31*01d7584cSLiam Girdwood  */
32*01d7584cSLiam Girdwood enum snd_soc_dpcm_link_state {
33*01d7584cSLiam Girdwood 	SND_SOC_DPCM_LINK_STATE_NEW	= 0,	/* newly created link */
34*01d7584cSLiam Girdwood 	SND_SOC_DPCM_LINK_STATE_FREE,		/* link to be dismantled */
35*01d7584cSLiam Girdwood };
36*01d7584cSLiam Girdwood 
37*01d7584cSLiam Girdwood /*
38*01d7584cSLiam Girdwood  * Dynamic PCM Frontend -> Backend link PCM states.
39*01d7584cSLiam Girdwood  */
40*01d7584cSLiam Girdwood enum snd_soc_dpcm_state {
41*01d7584cSLiam Girdwood 	SND_SOC_DPCM_STATE_NEW	= 0,
42*01d7584cSLiam Girdwood 	SND_SOC_DPCM_STATE_OPEN,
43*01d7584cSLiam Girdwood 	SND_SOC_DPCM_STATE_HW_PARAMS,
44*01d7584cSLiam Girdwood 	SND_SOC_DPCM_STATE_PREPARE,
45*01d7584cSLiam Girdwood 	SND_SOC_DPCM_STATE_START,
46*01d7584cSLiam Girdwood 	SND_SOC_DPCM_STATE_STOP,
47*01d7584cSLiam Girdwood 	SND_SOC_DPCM_STATE_PAUSED,
48*01d7584cSLiam Girdwood 	SND_SOC_DPCM_STATE_SUSPEND,
49*01d7584cSLiam Girdwood 	SND_SOC_DPCM_STATE_HW_FREE,
50*01d7584cSLiam Girdwood 	SND_SOC_DPCM_STATE_CLOSE,
51*01d7584cSLiam Girdwood };
52*01d7584cSLiam Girdwood 
53*01d7584cSLiam Girdwood /*
54*01d7584cSLiam Girdwood  * Dynamic PCM trigger ordering. Triggering flexibility is required as some
55*01d7584cSLiam Girdwood  * DSPs require triggering before/after their CPU platform and DAIs.
56*01d7584cSLiam Girdwood  *
57*01d7584cSLiam Girdwood  * i.e. some clients may want to manually order this call in their PCM
58*01d7584cSLiam Girdwood  * trigger() whilst others will just use the regular core ordering.
59*01d7584cSLiam Girdwood  */
60*01d7584cSLiam Girdwood enum snd_soc_dpcm_trigger {
61*01d7584cSLiam Girdwood 	SND_SOC_DPCM_TRIGGER_PRE		= 0,
62*01d7584cSLiam Girdwood 	SND_SOC_DPCM_TRIGGER_POST,
63*01d7584cSLiam Girdwood };
64*01d7584cSLiam Girdwood 
65*01d7584cSLiam Girdwood /*
66*01d7584cSLiam Girdwood  * Dynamic PCM link
67*01d7584cSLiam Girdwood  * This links together a FE and BE DAI at runtime and stores the link
68*01d7584cSLiam Girdwood  * state information and the hw_params configuration.
69*01d7584cSLiam Girdwood  */
70*01d7584cSLiam Girdwood struct snd_soc_dpcm {
71*01d7584cSLiam Girdwood 	/* FE and BE DAIs*/
72*01d7584cSLiam Girdwood 	struct snd_soc_pcm_runtime *be;
73*01d7584cSLiam Girdwood 	struct snd_soc_pcm_runtime *fe;
74*01d7584cSLiam Girdwood 
75*01d7584cSLiam Girdwood 	/* link state */
76*01d7584cSLiam Girdwood 	enum snd_soc_dpcm_link_state state;
77*01d7584cSLiam Girdwood 
78*01d7584cSLiam Girdwood 	/* list of BE and FE for this DPCM link */
79*01d7584cSLiam Girdwood 	struct list_head list_be;
80*01d7584cSLiam Girdwood 	struct list_head list_fe;
81*01d7584cSLiam Girdwood 
82*01d7584cSLiam Girdwood 	/* hw params for this link - may be different for each link */
83*01d7584cSLiam Girdwood 	struct snd_pcm_hw_params hw_params;
84*01d7584cSLiam Girdwood };
85*01d7584cSLiam Girdwood 
86*01d7584cSLiam Girdwood /*
87*01d7584cSLiam Girdwood  * Dynamic PCM runtime data.
88*01d7584cSLiam Girdwood  */
89*01d7584cSLiam Girdwood struct snd_soc_dpcm_runtime {
90*01d7584cSLiam Girdwood 	struct list_head be_clients;
91*01d7584cSLiam Girdwood 	struct list_head fe_clients;
92*01d7584cSLiam Girdwood 
93*01d7584cSLiam Girdwood 	int users;
94*01d7584cSLiam Girdwood 	struct snd_pcm_runtime *runtime;
95*01d7584cSLiam Girdwood 	struct snd_pcm_hw_params hw_params;
96*01d7584cSLiam Girdwood 
97*01d7584cSLiam Girdwood 	/* state and update */
98*01d7584cSLiam Girdwood 	enum snd_soc_dpcm_update runtime_update;
99*01d7584cSLiam Girdwood 	enum snd_soc_dpcm_state state;
100*01d7584cSLiam Girdwood };
101*01d7584cSLiam Girdwood 
102*01d7584cSLiam Girdwood /* can this BE stop and free */
103*01d7584cSLiam Girdwood int snd_soc_dpcm_can_be_free_stop(struct snd_soc_pcm_runtime *fe,
104*01d7584cSLiam Girdwood 		struct snd_soc_pcm_runtime *be, int stream);
105*01d7584cSLiam Girdwood 
106*01d7584cSLiam Girdwood /* can this BE perform a hw_params() */
107*01d7584cSLiam Girdwood int snd_soc_dpcm_can_be_params(struct snd_soc_pcm_runtime *fe,
108*01d7584cSLiam Girdwood 		struct snd_soc_pcm_runtime *be, int stream);
109*01d7584cSLiam Girdwood 
110*01d7584cSLiam Girdwood /* is the current PCM operation for this FE ? */
111*01d7584cSLiam Girdwood int snd_soc_dpcm_fe_can_update(struct snd_soc_pcm_runtime *fe, int stream);
112*01d7584cSLiam Girdwood 
113*01d7584cSLiam Girdwood /* is the current PCM operation for this BE ? */
114*01d7584cSLiam Girdwood int snd_soc_dpcm_be_can_update(struct snd_soc_pcm_runtime *fe,
115*01d7584cSLiam Girdwood 		struct snd_soc_pcm_runtime *be, int stream);
116*01d7584cSLiam Girdwood 
117*01d7584cSLiam Girdwood /* get the substream for this BE */
118*01d7584cSLiam Girdwood struct snd_pcm_substream *
119*01d7584cSLiam Girdwood 	snd_soc_dpcm_get_substream(struct snd_soc_pcm_runtime *be, int stream);
120*01d7584cSLiam Girdwood 
121*01d7584cSLiam Girdwood /* get the BE runtime state */
122*01d7584cSLiam Girdwood enum snd_soc_dpcm_state
123*01d7584cSLiam Girdwood 	snd_soc_dpcm_be_get_state(struct snd_soc_pcm_runtime *be, int stream);
124*01d7584cSLiam Girdwood 
125*01d7584cSLiam Girdwood /* set the BE runtime state */
126*01d7584cSLiam Girdwood void snd_soc_dpcm_be_set_state(struct snd_soc_pcm_runtime *be, int stream,
127*01d7584cSLiam Girdwood 	enum snd_soc_dpcm_state state);
128*01d7584cSLiam Girdwood 
129*01d7584cSLiam Girdwood /* internal use only */
130*01d7584cSLiam Girdwood int soc_dpcm_be_digital_mute(struct snd_soc_pcm_runtime *fe, int mute);
131*01d7584cSLiam Girdwood 
132*01d7584cSLiam Girdwood #endif
133