~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/include/sound/soc-dpcm.h

Version: ~ [ linux-6.11.5 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.58 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.114 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.169 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.228 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.284 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.322 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.9 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 /* SPDX-License-Identifier: GPL-2.0
  2  *
  3  * linux/sound/soc-dpcm.h -- ALSA SoC Dynamic PCM Support
  4  *
  5  * Author:              Liam Girdwood <lrg@ti.com>
  6  */
  7 
  8 #ifndef __LINUX_SND_SOC_DPCM_H
  9 #define __LINUX_SND_SOC_DPCM_H
 10 
 11 #include <linux/slab.h>
 12 #include <linux/list.h>
 13 #include <sound/pcm.h>
 14 
 15 struct snd_soc_pcm_runtime;
 16 
 17 /*
 18  * Types of runtime_update to perform. e.g. originated from FE PCM ops
 19  * or audio route changes triggered by muxes/mixers.
 20  */
 21 enum snd_soc_dpcm_update {
 22         SND_SOC_DPCM_UPDATE_NO  = 0,
 23         SND_SOC_DPCM_UPDATE_BE,
 24         SND_SOC_DPCM_UPDATE_FE,
 25 };
 26 
 27 /*
 28  * Dynamic PCM Frontend -> Backend link management states.
 29  */
 30 enum snd_soc_dpcm_link_state {
 31         SND_SOC_DPCM_LINK_STATE_NEW     = 0,    /* newly created link */
 32         SND_SOC_DPCM_LINK_STATE_FREE,           /* link to be dismantled */
 33 };
 34 
 35 /*
 36  * Dynamic PCM Frontend -> Backend link PCM states.
 37  */
 38 enum snd_soc_dpcm_state {
 39         SND_SOC_DPCM_STATE_NEW  = 0,
 40         SND_SOC_DPCM_STATE_OPEN,
 41         SND_SOC_DPCM_STATE_HW_PARAMS,
 42         SND_SOC_DPCM_STATE_PREPARE,
 43         SND_SOC_DPCM_STATE_START,
 44         SND_SOC_DPCM_STATE_STOP,
 45         SND_SOC_DPCM_STATE_PAUSED,
 46         SND_SOC_DPCM_STATE_SUSPEND,
 47         SND_SOC_DPCM_STATE_HW_FREE,
 48         SND_SOC_DPCM_STATE_CLOSE,
 49 };
 50 
 51 /*
 52  * Dynamic PCM trigger ordering. Triggering flexibility is required as some
 53  * DSPs require triggering before/after their CPU platform and DAIs.
 54  *
 55  * i.e. some clients may want to manually order this call in their PCM
 56  * trigger() whilst others will just use the regular core ordering.
 57  */
 58 enum snd_soc_dpcm_trigger {
 59         SND_SOC_DPCM_TRIGGER_PRE                = 0,
 60         SND_SOC_DPCM_TRIGGER_POST,
 61         SND_SOC_DPCM_TRIGGER_BESPOKE,
 62 };
 63 
 64 /*
 65  * Dynamic PCM link
 66  * This links together a FE and BE DAI at runtime and stores the link
 67  * state information and the hw_params configuration.
 68  */
 69 struct snd_soc_dpcm {
 70         /* FE and BE DAIs*/
 71         struct snd_soc_pcm_runtime *be;
 72         struct snd_soc_pcm_runtime *fe;
 73 
 74         /* link state */
 75         enum snd_soc_dpcm_link_state state;
 76 
 77         /* list of BE and FE for this DPCM link */
 78         struct list_head list_be;
 79         struct list_head list_fe;
 80 
 81 #ifdef CONFIG_DEBUG_FS
 82         struct dentry *debugfs_state;
 83 #endif
 84 };
 85 
 86 /*
 87  * Dynamic PCM runtime data.
 88  */
 89 struct snd_soc_dpcm_runtime {
 90         struct list_head be_clients;
 91         struct list_head fe_clients;
 92 
 93         int users;
 94         struct snd_pcm_hw_params hw_params;
 95 
 96         /* state and update */
 97         enum snd_soc_dpcm_update runtime_update;
 98         enum snd_soc_dpcm_state state;
 99 
100         int trigger_pending; /* trigger cmd + 1 if pending, 0 if not */
101 
102         int be_start; /* refcount protected by BE stream pcm lock */
103         int be_pause; /* refcount protected by BE stream pcm lock */
104         bool fe_pause; /* used to track STOP after PAUSE */
105 };
106 
107 #define for_each_dpcm_fe(be, stream, _dpcm)                             \
108         list_for_each_entry(_dpcm, &(be)->dpcm[stream].fe_clients, list_fe)
109 
110 #define for_each_dpcm_be(fe, stream, _dpcm)                             \
111         list_for_each_entry(_dpcm, &(fe)->dpcm[stream].be_clients, list_be)
112 #define for_each_dpcm_be_safe(fe, stream, _dpcm, __dpcm)                        \
113         list_for_each_entry_safe(_dpcm, __dpcm, &(fe)->dpcm[stream].be_clients, list_be)
114 #define for_each_dpcm_be_rollback(fe, stream, _dpcm)                    \
115         list_for_each_entry_continue_reverse(_dpcm, &(fe)->dpcm[stream].be_clients, list_be)
116 
117 /* can this BE stop and free */
118 int snd_soc_dpcm_can_be_free_stop(struct snd_soc_pcm_runtime *fe,
119                 struct snd_soc_pcm_runtime *be, int stream);
120 
121 /* can this BE perform a hw_params() */
122 int snd_soc_dpcm_can_be_params(struct snd_soc_pcm_runtime *fe,
123                 struct snd_soc_pcm_runtime *be, int stream);
124 
125 /* can this BE perform prepare */
126 int snd_soc_dpcm_can_be_prepared(struct snd_soc_pcm_runtime *fe,
127                                  struct snd_soc_pcm_runtime *be, int stream);
128 
129 /* is the current PCM operation for this FE ? */
130 int snd_soc_dpcm_fe_can_update(struct snd_soc_pcm_runtime *fe, int stream);
131 
132 /* is the current PCM operation for this BE ? */
133 int snd_soc_dpcm_be_can_update(struct snd_soc_pcm_runtime *fe,
134                 struct snd_soc_pcm_runtime *be, int stream);
135 
136 /* get the substream for this BE */
137 struct snd_pcm_substream *
138         snd_soc_dpcm_get_substream(struct snd_soc_pcm_runtime *be, int stream);
139 
140 /* update audio routing between PCMs and any DAI links */
141 int snd_soc_dpcm_runtime_update(struct snd_soc_card *card);
142 
143 #ifdef CONFIG_DEBUG_FS
144 void soc_dpcm_debugfs_add(struct snd_soc_pcm_runtime *rtd);
145 #else
146 static inline void soc_dpcm_debugfs_add(struct snd_soc_pcm_runtime *rtd)
147 {
148 }
149 #endif
150 
151 int dpcm_path_get(struct snd_soc_pcm_runtime *fe,
152         int stream, struct snd_soc_dapm_widget_list **list_);
153 void dpcm_path_put(struct snd_soc_dapm_widget_list **list);
154 int dpcm_process_paths(struct snd_soc_pcm_runtime *fe,
155         int stream, struct snd_soc_dapm_widget_list **list, int new);
156 int dpcm_be_dai_startup(struct snd_soc_pcm_runtime *fe, int stream);
157 void dpcm_be_dai_stop(struct snd_soc_pcm_runtime *fe, int stream,
158                       int do_hw_free, struct snd_soc_dpcm *last);
159 void dpcm_be_disconnect(struct snd_soc_pcm_runtime *fe, int stream);
160 void dpcm_clear_pending_state(struct snd_soc_pcm_runtime *fe, int stream);
161 void dpcm_be_dai_hw_free(struct snd_soc_pcm_runtime *fe, int stream);
162 int dpcm_be_dai_hw_params(struct snd_soc_pcm_runtime *fe, int tream);
163 int dpcm_be_dai_trigger(struct snd_soc_pcm_runtime *fe, int stream, int cmd);
164 int dpcm_be_dai_prepare(struct snd_soc_pcm_runtime *fe, int stream);
165 int dpcm_dapm_stream_event(struct snd_soc_pcm_runtime *fe, int dir,
166         int event);
167 bool dpcm_end_walk_at_be(struct snd_soc_dapm_widget *widget, enum snd_soc_dapm_direction dir);
168 int widget_in_list(struct snd_soc_dapm_widget_list *list,
169                    struct snd_soc_dapm_widget *widget);
170 
171 #define dpcm_be_dai_startup_rollback(fe, stream, last)  \
172                                                 dpcm_be_dai_stop(fe, stream, 0, last)
173 #define dpcm_be_dai_startup_unwind(fe, stream)  dpcm_be_dai_stop(fe, stream, 0, NULL)
174 #define dpcm_be_dai_shutdown(fe, stream)        dpcm_be_dai_stop(fe, stream, 1, NULL)
175 
176 #endif
177 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php