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

TOMOYO Linux Cross Reference
Linux/Documentation/sound/soc/dapm.rst

Version: ~ [ linux-6.12-rc7 ] ~ [ linux-6.11.7 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.60 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.116 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.171 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.229 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.285 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.323 ] ~ [ 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.12 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

Diff markup

Differences between /Documentation/sound/soc/dapm.rst (Architecture mips) and /Documentation/sound/soc/dapm.rst (Architecture sparc64)


  1 ==============================================      1 ===================================================
  2 Dynamic Audio Power Management for Portable De      2 Dynamic Audio Power Management for Portable Devices
  3 ==============================================      3 ===================================================
  4                                                     4 
  5 Description                                         5 Description
  6 ===========                                         6 ===========
  7                                                     7 
  8 Dynamic Audio Power Management (DAPM) is desig      8 Dynamic Audio Power Management (DAPM) is designed to allow portable
  9 Linux devices to use the minimum amount of pow      9 Linux devices to use the minimum amount of power within the audio
 10 subsystem at all times. It is independent of o     10 subsystem at all times. It is independent of other kernel power
 11 management frameworks and, as such, can easily     11 management frameworks and, as such, can easily co-exist with them.
 12                                                    12 
 13 DAPM is also completely transparent to all use     13 DAPM is also completely transparent to all user space applications as
 14 all power switching is done within the ASoC co     14 all power switching is done within the ASoC core. No code changes or
 15 recompiling are required for user space applic     15 recompiling are required for user space applications. DAPM makes power
 16 switching decisions based upon any audio strea     16 switching decisions based upon any audio stream (capture/playback)
 17 activity and audio mixer settings within the d     17 activity and audio mixer settings within the device.
 18                                                    18 
 19 DAPM is based on two basic elements, called wi     19 DAPM is based on two basic elements, called widgets and routes:
 20                                                    20 
 21  * a **widget** is every part of the audio har     21  * a **widget** is every part of the audio hardware that can be enabled by
 22    software when in use and disabled to save p     22    software when in use and disabled to save power when not in use
 23  * a **route** is an interconnection between w     23  * a **route** is an interconnection between widgets that exists when sound
 24    can flow from one widget to the other           24    can flow from one widget to the other
 25                                                    25 
 26 All DAPM power switching decisions are made au     26 All DAPM power switching decisions are made automatically by consulting an
 27 audio routing graph. This graph is specific to     27 audio routing graph. This graph is specific to each sound card and spans
 28 the whole sound card, so some DAPM routes conn     28 the whole sound card, so some DAPM routes connect two widgets belonging to
 29 different components (e.g. the LINE OUT pin of     29 different components (e.g. the LINE OUT pin of a CODEC and the input pin of
 30 an amplifier).                                     30 an amplifier).
 31                                                    31 
 32 The graph for the STM32MP1-DK1 sound card is s     32 The graph for the STM32MP1-DK1 sound card is shown in picture:
 33                                                    33 
 34 .. kernel-figure:: dapm-graph.svg                  34 .. kernel-figure:: dapm-graph.svg
 35     :alt:   Example DAPM graph                     35     :alt:   Example DAPM graph
 36     :align: center                                 36     :align: center
 37                                                    37 
 38 DAPM power domains                                 38 DAPM power domains
 39 ==================                                 39 ==================
 40                                                    40 
 41 There are 4 power domains within DAPM:             41 There are 4 power domains within DAPM:
 42                                                    42 
 43 Codec bias domain                                  43 Codec bias domain
 44       VREF, VMID (core codec and audio power)      44       VREF, VMID (core codec and audio power)
 45                                                    45 
 46       Usually controlled at codec probe/remove     46       Usually controlled at codec probe/remove and suspend/resume, although
 47       can be set at stream time if power is no     47       can be set at stream time if power is not needed for sidetone, etc.
 48                                                    48 
 49 Platform/Machine domain                            49 Platform/Machine domain
 50       physically connected inputs and outputs      50       physically connected inputs and outputs
 51                                                    51 
 52       Is platform/machine and user action spec     52       Is platform/machine and user action specific, is configured by the
 53       machine driver and responds to asynchron     53       machine driver and responds to asynchronous events e.g when HP
 54       are inserted                                 54       are inserted
 55                                                    55 
 56 Path domain                                        56 Path domain
 57       audio subsystem signal paths                 57       audio subsystem signal paths
 58                                                    58 
 59       Automatically set when mixer and mux set     59       Automatically set when mixer and mux settings are changed by the user.
 60       e.g. alsamixer, amixer.                      60       e.g. alsamixer, amixer.
 61                                                    61 
 62 Stream domain                                      62 Stream domain
 63       DACs and ADCs.                               63       DACs and ADCs.
 64                                                    64 
 65       Enabled and disabled when stream playbac     65       Enabled and disabled when stream playback/capture is started and
 66       stopped respectively. e.g. aplay, arecor     66       stopped respectively. e.g. aplay, arecord.
 67                                                    67 
 68                                                    68 
 69 DAPM Widgets                                       69 DAPM Widgets
 70 ============                                       70 ============
 71                                                    71 
 72 Audio DAPM widgets fall into a number of types     72 Audio DAPM widgets fall into a number of types:
 73                                                    73 
 74 Mixer                                              74 Mixer
 75         Mixes several analog signals into a si     75         Mixes several analog signals into a single analog signal.
 76 Mux                                                76 Mux
 77         An analog switch that outputs only one     77         An analog switch that outputs only one of many inputs.
 78 PGA                                                78 PGA
 79         A programmable gain amplifier or atten     79         A programmable gain amplifier or attenuation widget.
 80 ADC                                                80 ADC
 81         Analog to Digital Converter                81         Analog to Digital Converter
 82 DAC                                                82 DAC
 83         Digital to Analog Converter                83         Digital to Analog Converter
 84 Switch                                             84 Switch
 85         An analog switch                           85         An analog switch
 86 Input                                              86 Input
 87         A codec input pin                          87         A codec input pin
 88 Output                                             88 Output
 89         A codec output pin                         89         A codec output pin
 90 Headphone                                          90 Headphone
 91         Headphone (and optional Jack)              91         Headphone (and optional Jack)
 92 Mic                                                92 Mic
 93         Mic (and optional Jack)                    93         Mic (and optional Jack)
 94 Line                                               94 Line
 95         Line Input/Output (and optional Jack)      95         Line Input/Output (and optional Jack)
 96 Speaker                                            96 Speaker
 97         Speaker                                    97         Speaker
 98 Supply                                             98 Supply
 99         Power or clock supply widget used by o     99         Power or clock supply widget used by other widgets.
100 Regulator                                         100 Regulator
101         External regulator that supplies power    101         External regulator that supplies power to audio components.
102 Clock                                             102 Clock
103         External clock that supplies clock to     103         External clock that supplies clock to audio components.
104 AIF IN                                            104 AIF IN
105         Audio Interface Input (with TDM slot m    105         Audio Interface Input (with TDM slot mask).
106 AIF OUT                                           106 AIF OUT
107         Audio Interface Output (with TDM slot     107         Audio Interface Output (with TDM slot mask).
108 Siggen                                            108 Siggen
109         Signal Generator.                         109         Signal Generator.
110 DAI IN                                            110 DAI IN
111         Digital Audio Interface Input.            111         Digital Audio Interface Input.
112 DAI OUT                                           112 DAI OUT
113         Digital Audio Interface Output.           113         Digital Audio Interface Output.
114 DAI Link                                          114 DAI Link
115         DAI Link between two DAI structures       115         DAI Link between two DAI structures
116 Pre                                               116 Pre
117         Special PRE widget (exec before all ot    117         Special PRE widget (exec before all others)
118 Post                                              118 Post
119         Special POST widget (exec after all ot    119         Special POST widget (exec after all others)
120 Buffer                                            120 Buffer
121         Inter widget audio data buffer within     121         Inter widget audio data buffer within a DSP.
122 Scheduler                                         122 Scheduler
123         DSP internal scheduler that schedules     123         DSP internal scheduler that schedules component/pipeline processing
124         work.                                     124         work.
125 Effect                                            125 Effect
126         Widget that performs an audio processi    126         Widget that performs an audio processing effect.
127 SRC                                               127 SRC
128         Sample Rate Converter within DSP or CO    128         Sample Rate Converter within DSP or CODEC
129 ASRC                                              129 ASRC
130         Asynchronous Sample Rate Converter wit    130         Asynchronous Sample Rate Converter within DSP or CODEC
131 Encoder                                           131 Encoder
132         Widget that encodes audio data from on    132         Widget that encodes audio data from one format (usually PCM) to another
133         usually more compressed format.           133         usually more compressed format.
134 Decoder                                           134 Decoder
135         Widget that decodes audio data from a     135         Widget that decodes audio data from a compressed format to an
136         uncompressed format like PCM.             136         uncompressed format like PCM.
137                                                   137 
138                                                   138 
139 (Widgets are defined in include/sound/soc-dapm    139 (Widgets are defined in include/sound/soc-dapm.h)
140                                                   140 
141 Widgets can be added to the sound card by any     141 Widgets can be added to the sound card by any of the component driver types.
142 There are convenience macros defined in soc-da    142 There are convenience macros defined in soc-dapm.h that can be used to quickly
143 build a list of widgets of the codecs and mach    143 build a list of widgets of the codecs and machines DAPM widgets.
144                                                   144 
145 Most widgets have a name, register, shift and     145 Most widgets have a name, register, shift and invert. Some widgets have extra
146 parameters for stream name and kcontrols.         146 parameters for stream name and kcontrols.
147                                                   147 
148                                                   148 
149 Stream Domain Widgets                             149 Stream Domain Widgets
150 ---------------------                             150 ---------------------
151                                                   151 
152 Stream Widgets relate to the stream power doma    152 Stream Widgets relate to the stream power domain and only consist of ADCs
153 (analog to digital converters), DACs (digital     153 (analog to digital converters), DACs (digital to analog converters),
154 AIF IN and AIF OUT.                               154 AIF IN and AIF OUT.
155                                                   155 
156 Stream widgets have the following format:         156 Stream widgets have the following format:
157 ::                                                157 ::
158                                                   158 
159   SND_SOC_DAPM_DAC(name, stream name, reg, shi    159   SND_SOC_DAPM_DAC(name, stream name, reg, shift, invert),
160   SND_SOC_DAPM_AIF_IN(name, stream, slot, reg,    160   SND_SOC_DAPM_AIF_IN(name, stream, slot, reg, shift, invert)
161                                                   161 
162 NOTE: the stream name must match the correspon    162 NOTE: the stream name must match the corresponding stream name in your codec
163 snd_soc_dai_driver.                               163 snd_soc_dai_driver.
164                                                   164 
165 e.g. stream widgets for HiFi playback and capt    165 e.g. stream widgets for HiFi playback and capture
166 ::                                                166 ::
167                                                   167 
168   SND_SOC_DAPM_DAC("HiFi DAC", "HiFi Playback"    168   SND_SOC_DAPM_DAC("HiFi DAC", "HiFi Playback", REG, 3, 1),
169   SND_SOC_DAPM_ADC("HiFi ADC", "HiFi Capture",    169   SND_SOC_DAPM_ADC("HiFi ADC", "HiFi Capture", REG, 2, 1),
170                                                   170 
171 e.g. stream widgets for AIF                       171 e.g. stream widgets for AIF
172 ::                                                172 ::
173                                                   173 
174   SND_SOC_DAPM_AIF_IN("AIF1RX", "AIF1 Playback    174   SND_SOC_DAPM_AIF_IN("AIF1RX", "AIF1 Playback", 0, SND_SOC_NOPM, 0, 0),
175   SND_SOC_DAPM_AIF_OUT("AIF1TX", "AIF1 Capture    175   SND_SOC_DAPM_AIF_OUT("AIF1TX", "AIF1 Capture", 0, SND_SOC_NOPM, 0, 0),
176                                                   176 
177                                                   177 
178 Path Domain Widgets                               178 Path Domain Widgets
179 -------------------                               179 -------------------
180                                                   180 
181 Path domain widgets have a ability to control     181 Path domain widgets have a ability to control or affect the audio signal or
182 audio paths within the audio subsystem. They h    182 audio paths within the audio subsystem. They have the following form:
183 ::                                                183 ::
184                                                   184 
185   SND_SOC_DAPM_PGA(name, reg, shift, invert, c    185   SND_SOC_DAPM_PGA(name, reg, shift, invert, controls, num_controls)
186                                                   186 
187 Any widget kcontrols can be set using the cont    187 Any widget kcontrols can be set using the controls and num_controls members.
188                                                   188 
189 e.g. Mixer widget (the kcontrols are declared     189 e.g. Mixer widget (the kcontrols are declared first)
190 ::                                                190 ::
191                                                   191 
192   /* Output Mixer */                              192   /* Output Mixer */
193   static const snd_kcontrol_new_t wm8731_outpu    193   static const snd_kcontrol_new_t wm8731_output_mixer_controls[] = {
194   SOC_DAPM_SINGLE("Line Bypass Switch", WM8731    194   SOC_DAPM_SINGLE("Line Bypass Switch", WM8731_APANA, 3, 1, 0),
195   SOC_DAPM_SINGLE("Mic Sidetone Switch", WM873    195   SOC_DAPM_SINGLE("Mic Sidetone Switch", WM8731_APANA, 5, 1, 0),
196   SOC_DAPM_SINGLE("HiFi Playback Switch", WM87    196   SOC_DAPM_SINGLE("HiFi Playback Switch", WM8731_APANA, 4, 1, 0),
197   };                                              197   };
198                                                   198 
199   SND_SOC_DAPM_MIXER("Output Mixer", WM8731_PW    199   SND_SOC_DAPM_MIXER("Output Mixer", WM8731_PWR, 4, 1, wm8731_output_mixer_controls,
200         ARRAY_SIZE(wm8731_output_mixer_control    200         ARRAY_SIZE(wm8731_output_mixer_controls)),
201                                                   201 
202 If you don't want the mixer elements prefixed     202 If you don't want the mixer elements prefixed with the name of the mixer widget,
203 you can use SND_SOC_DAPM_MIXER_NAMED_CTL inste    203 you can use SND_SOC_DAPM_MIXER_NAMED_CTL instead. the parameters are the same
204 as for SND_SOC_DAPM_MIXER.                        204 as for SND_SOC_DAPM_MIXER.
205                                                   205 
206                                                   206 
207 Machine domain Widgets                            207 Machine domain Widgets
208 ----------------------                            208 ----------------------
209                                                   209 
210 Machine widgets are different from codec widge    210 Machine widgets are different from codec widgets in that they don't have a
211 codec register bit associated with them. A mac    211 codec register bit associated with them. A machine widget is assigned to each
212 machine audio component (non codec or DSP) tha    212 machine audio component (non codec or DSP) that can be independently
213 powered. e.g.                                     213 powered. e.g.
214                                                   214 
215 * Speaker Amp                                     215 * Speaker Amp
216 * Microphone Bias                                 216 * Microphone Bias
217 * Jack connectors                                 217 * Jack connectors
218                                                   218 
219 A machine widget can have an optional call bac    219 A machine widget can have an optional call back.
220                                                   220 
221 e.g. Jack connector widget for an external Mic    221 e.g. Jack connector widget for an external Mic that enables Mic Bias
222 when the Mic is inserted::                        222 when the Mic is inserted::
223                                                   223 
224   static int spitz_mic_bias(struct snd_soc_dap    224   static int spitz_mic_bias(struct snd_soc_dapm_widget* w, int event)
225   {                                               225   {
226         gpio_set_value(SPITZ_GPIO_MIC_BIAS, SN    226         gpio_set_value(SPITZ_GPIO_MIC_BIAS, SND_SOC_DAPM_EVENT_ON(event));
227         return 0;                                 227         return 0;
228   }                                               228   }
229                                                   229 
230   SND_SOC_DAPM_MIC("Mic Jack", spitz_mic_bias)    230   SND_SOC_DAPM_MIC("Mic Jack", spitz_mic_bias),
231                                                   231 
232                                                   232 
233 Codec (BIAS) Domain                               233 Codec (BIAS) Domain
234 -------------------                               234 -------------------
235                                                   235 
236 The codec bias power domain has no widgets and    236 The codec bias power domain has no widgets and is handled by the codec DAPM
237 event handler. This handler is called when the    237 event handler. This handler is called when the codec powerstate is changed wrt
238 to any stream event or by kernel PM events.       238 to any stream event or by kernel PM events.
239                                                   239 
240                                                   240 
241 Virtual Widgets                                   241 Virtual Widgets
242 ---------------                                   242 ---------------
243                                                   243 
244 Sometimes widgets exist in the codec or machin    244 Sometimes widgets exist in the codec or machine audio graph that don't have any
245 corresponding soft power control. In this case    245 corresponding soft power control. In this case it is necessary to create
246 a virtual widget - a widget with no control bi    246 a virtual widget - a widget with no control bits e.g.
247 ::                                                247 ::
248                                                   248 
249   SND_SOC_DAPM_MIXER("AC97 Mixer", SND_SOC_NOP    249   SND_SOC_DAPM_MIXER("AC97 Mixer", SND_SOC_NOPM, 0, 0, NULL, 0),
250                                                   250 
251 This can be used to merge two signal paths tog    251 This can be used to merge two signal paths together in software.
252                                                   252 
253 Registering DAPM controls                         253 Registering DAPM controls
254 =========================                         254 =========================
255                                                   255 
256 In many cases the DAPM widgets are implemented    256 In many cases the DAPM widgets are implemented statically in a ``static
257 const struct snd_soc_dapm_widget`` array in a     257 const struct snd_soc_dapm_widget`` array in a codec driver, and simply
258 declared via the ``dapm_widgets`` and ``num_da    258 declared via the ``dapm_widgets`` and ``num_dapm_widgets`` fields of the
259 ``struct snd_soc_component_driver``.              259 ``struct snd_soc_component_driver``.
260                                                   260 
261 Similarly, routes connecting them are implemen    261 Similarly, routes connecting them are implemented statically in a ``static
262 const struct snd_soc_dapm_route`` array and de    262 const struct snd_soc_dapm_route`` array and declared via the
263 ``dapm_routes`` and ``num_dapm_routes`` fields    263 ``dapm_routes`` and ``num_dapm_routes`` fields of the same struct.
264                                                   264 
265 With the above declared, the driver registrati    265 With the above declared, the driver registration will take care of
266 populating them::                                 266 populating them::
267                                                   267 
268   static const struct snd_soc_dapm_widget wm20    268   static const struct snd_soc_dapm_widget wm2000_dapm_widgets[] = {
269         SND_SOC_DAPM_OUTPUT("SPKN"),              269         SND_SOC_DAPM_OUTPUT("SPKN"),
270         SND_SOC_DAPM_OUTPUT("SPKP"),              270         SND_SOC_DAPM_OUTPUT("SPKP"),
271         ...                                       271         ...
272   };                                              272   };
273                                                   273 
274   /* Target, Path, Source */                      274   /* Target, Path, Source */
275   static const struct snd_soc_dapm_route wm200    275   static const struct snd_soc_dapm_route wm2000_audio_map[] = {
276         { "SPKN", NULL, "ANC Engine" },           276         { "SPKN", NULL, "ANC Engine" },
277         { "SPKP", NULL, "ANC Engine" },           277         { "SPKP", NULL, "ANC Engine" },
278         ...                                       278         ...
279   };                                              279   };
280                                                   280 
281   static const struct snd_soc_component_driver    281   static const struct snd_soc_component_driver soc_component_dev_wm2000 = {
282         ...                                       282         ...
283         .dapm_widgets           = wm2000_dapm_    283         .dapm_widgets           = wm2000_dapm_widgets,
284         .num_dapm_widgets       = ARRAY_SIZE(w    284         .num_dapm_widgets       = ARRAY_SIZE(wm2000_dapm_widgets),
285         .dapm_routes            = wm2000_audio    285         .dapm_routes            = wm2000_audio_map,
286         .num_dapm_routes        = ARRAY_SIZE(w    286         .num_dapm_routes        = ARRAY_SIZE(wm2000_audio_map),
287         ...                                       287         ...
288   };                                              288   };
289                                                   289 
290 In more complex cases the list of DAPM widgets    290 In more complex cases the list of DAPM widgets and/or routes can be only
291 known at probe time. This happens for example     291 known at probe time. This happens for example when a driver supports
292 different models having a different set of fea    292 different models having a different set of features. In those cases
293 separate widgets and routes arrays implementin    293 separate widgets and routes arrays implementing the case-specific features
294 can be registered programmatically by calling     294 can be registered programmatically by calling snd_soc_dapm_new_controls()
295 and snd_soc_dapm_add_routes().                    295 and snd_soc_dapm_add_routes().
296                                                   296 
297                                                   297 
298 Codec/DSP Widget Interconnections                 298 Codec/DSP Widget Interconnections
299 =================================                 299 =================================
300                                                   300 
301 Widgets are connected to each other within the    301 Widgets are connected to each other within the codec, platform and machine by
302 audio paths (called interconnections). Each in    302 audio paths (called interconnections). Each interconnection must be defined in
303 order to create a graph of all audio paths bet    303 order to create a graph of all audio paths between widgets.
304                                                   304 
305 This is easiest with a diagram of the codec or    305 This is easiest with a diagram of the codec or DSP (and schematic of the machine
306 audio system), as it requires joining widgets     306 audio system), as it requires joining widgets together via their audio signal
307 paths.                                            307 paths.
308                                                   308 
309 For example the WM8731 output mixer (wm8731.c)    309 For example the WM8731 output mixer (wm8731.c) has 3 inputs (sources):
310                                                   310 
311 1. Line Bypass Input                              311 1. Line Bypass Input
312 2. DAC (HiFi playback)                            312 2. DAC (HiFi playback)
313 3. Mic Sidetone Input                             313 3. Mic Sidetone Input
314                                                   314 
315 Each input in this example has a kcontrol asso    315 Each input in this example has a kcontrol associated with it (defined in
316 the example above) and is connected to the out    316 the example above) and is connected to the output mixer via its kcontrol
317 name. We can now connect the destination widge    317 name. We can now connect the destination widget (wrt audio signal) with its
318 source widgets.  ::                               318 source widgets.  ::
319                                                   319 
320         /* output mixer */                        320         /* output mixer */
321         {"Output Mixer", "Line Bypass Switch",    321         {"Output Mixer", "Line Bypass Switch", "Line Input"},
322         {"Output Mixer", "HiFi Playback Switch    322         {"Output Mixer", "HiFi Playback Switch", "DAC"},
323         {"Output Mixer", "Mic Sidetone Switch"    323         {"Output Mixer", "Mic Sidetone Switch", "Mic Bias"},
324                                                   324 
325 So we have:                                       325 So we have:
326                                                   326 
327 * Destination Widget  <=== Path Name <=== Sour    327 * Destination Widget  <=== Path Name <=== Source Widget, or
328 * Sink, Path, Source, or                          328 * Sink, Path, Source, or
329 * ``Output Mixer`` is connected to the ``DAC``    329 * ``Output Mixer`` is connected to the ``DAC`` via the ``HiFi Playback Switch``.
330                                                   330 
331 When there is no path name connecting widgets     331 When there is no path name connecting widgets (e.g. a direct connection) we
332 pass NULL for the path name.                      332 pass NULL for the path name.
333                                                   333 
334 Interconnections are created with a call to::     334 Interconnections are created with a call to::
335                                                   335 
336   snd_soc_dapm_connect_input(codec, sink, path    336   snd_soc_dapm_connect_input(codec, sink, path, source);
337                                                   337 
338 Finally, snd_soc_dapm_new_widgets() must be ca    338 Finally, snd_soc_dapm_new_widgets() must be called after all widgets and
339 interconnections have been registered with the    339 interconnections have been registered with the core. This causes the core to
340 scan the codec and machine so that the interna    340 scan the codec and machine so that the internal DAPM state matches the
341 physical state of the machine.                    341 physical state of the machine.
342                                                   342 
343                                                   343 
344 Machine Widget Interconnections                   344 Machine Widget Interconnections
345 -------------------------------                   345 -------------------------------
346 Machine widget interconnections are created in    346 Machine widget interconnections are created in the same way as codec ones and
347 directly connect the codec pins to machine lev    347 directly connect the codec pins to machine level widgets.
348                                                   348 
349 e.g. connects the speaker out codec pins to th    349 e.g. connects the speaker out codec pins to the internal speaker.
350 ::                                                350 ::
351                                                   351 
352         /* ext speaker connected to codec pins    352         /* ext speaker connected to codec pins LOUT2, ROUT2  */
353         {"Ext Spk", NULL , "ROUT2"},              353         {"Ext Spk", NULL , "ROUT2"},
354         {"Ext Spk", NULL , "LOUT2"},              354         {"Ext Spk", NULL , "LOUT2"},
355                                                   355 
356 This allows the DAPM to power on and off pins     356 This allows the DAPM to power on and off pins that are connected (and in use)
357 and pins that are NC respectively.                357 and pins that are NC respectively.
358                                                   358 
359                                                   359 
360 Endpoint Widgets                                  360 Endpoint Widgets
361 ================                                  361 ================
362 An endpoint is a start or end point (widget) o    362 An endpoint is a start or end point (widget) of an audio signal within the
363 machine and includes the codec. e.g.              363 machine and includes the codec. e.g.
364                                                   364 
365 * Headphone Jack                                  365 * Headphone Jack
366 * Internal Speaker                                366 * Internal Speaker
367 * Internal Mic                                    367 * Internal Mic
368 * Mic Jack                                        368 * Mic Jack
369 * Codec Pins                                      369 * Codec Pins
370                                                   370 
371 Endpoints are added to the DAPM graph so that     371 Endpoints are added to the DAPM graph so that their usage can be determined in
372 order to save power. e.g. NC codecs pins will     372 order to save power. e.g. NC codecs pins will be switched OFF, unconnected
373 jacks can also be switched OFF.                   373 jacks can also be switched OFF.
374                                                   374 
375                                                   375 
376 DAPM Widget Events                                376 DAPM Widget Events
377 ==================                                377 ==================
378                                                   378 
379 Widgets needing to implement a more complex be    379 Widgets needing to implement a more complex behaviour than what DAPM can do
380 can set a custom "event handler" by setting a     380 can set a custom "event handler" by setting a function pointer. An example
381 is a power supply needing to enable a GPIO::      381 is a power supply needing to enable a GPIO::
382                                                   382 
383   static int sof_es8316_speaker_power_event(st    383   static int sof_es8316_speaker_power_event(struct snd_soc_dapm_widget *w,
384                                           stru    384                                           struct snd_kcontrol *kcontrol, int event)
385   {                                               385   {
386         if (SND_SOC_DAPM_EVENT_ON(event))         386         if (SND_SOC_DAPM_EVENT_ON(event))
387                 gpiod_set_value_cansleep(gpio_    387                 gpiod_set_value_cansleep(gpio_pa, true);
388         else                                      388         else
389                 gpiod_set_value_cansleep(gpio_    389                 gpiod_set_value_cansleep(gpio_pa, false);
390                                                   390 
391         return 0;                                 391         return 0;
392   }                                               392   }
393                                                   393 
394   static const struct snd_soc_dapm_widget st_w    394   static const struct snd_soc_dapm_widget st_widgets[] = {
395         ...                                       395         ...
396         SND_SOC_DAPM_SUPPLY("Speaker Power", S    396         SND_SOC_DAPM_SUPPLY("Speaker Power", SND_SOC_NOPM, 0, 0,
397                             sof_es8316_speaker    397                             sof_es8316_speaker_power_event,
398                             SND_SOC_DAPM_PRE_P    398                             SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU),
399   };                                              399   };
400                                                   400 
401 See soc-dapm.h for all other widgets that supp    401 See soc-dapm.h for all other widgets that support events.
402                                                   402 
403                                                   403 
404 Event types                                       404 Event types
405 -----------                                       405 -----------
406                                                   406 
407 The following event types are supported by eve    407 The following event types are supported by event widgets::
408                                                   408 
409   /* dapm event types */                          409   /* dapm event types */
410   #define SND_SOC_DAPM_PRE_PMU          0x1       410   #define SND_SOC_DAPM_PRE_PMU          0x1     /* before widget power up */
411   #define SND_SOC_DAPM_POST_PMU         0x2       411   #define SND_SOC_DAPM_POST_PMU         0x2     /* after  widget power up */
412   #define SND_SOC_DAPM_PRE_PMD          0x4       412   #define SND_SOC_DAPM_PRE_PMD          0x4     /* before widget power down */
413   #define SND_SOC_DAPM_POST_PMD         0x8       413   #define SND_SOC_DAPM_POST_PMD         0x8     /* after  widget power down */
414   #define SND_SOC_DAPM_PRE_REG          0x10      414   #define SND_SOC_DAPM_PRE_REG          0x10    /* before audio path setup */
415   #define SND_SOC_DAPM_POST_REG         0x20      415   #define SND_SOC_DAPM_POST_REG         0x20    /* after  audio path setup */
416   #define SND_SOC_DAPM_WILL_PMU         0x40      416   #define SND_SOC_DAPM_WILL_PMU         0x40    /* called at start of sequence */
417   #define SND_SOC_DAPM_WILL_PMD         0x80      417   #define SND_SOC_DAPM_WILL_PMD         0x80    /* called at start of sequence */
418   #define SND_SOC_DAPM_PRE_POST_PMD     (SND_S    418   #define SND_SOC_DAPM_PRE_POST_PMD     (SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD)
419   #define SND_SOC_DAPM_PRE_POST_PMU     (SND_S    419   #define SND_SOC_DAPM_PRE_POST_PMU     (SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU)
                                                      

~ [ 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