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