1 // SPDX-License-Identifier: GPL-2.0+
2 //
3 // soc-dapm.c -- ALSA SoC Dynamic Audio Power Management
4 //
5 // Copyright 2005 Wolfson Microelectronics PLC.
6 // Author: Liam Girdwood <lrg@slimlogic.co.uk>
7 //
8 // Features:
9 // o Changes power status of internal codec blocks depending on the
10 // dynamic configuration of codec internal audio paths and active
11 // DACs/ADCs.
12 // o Platform power domain - can support external components i.e. amps and
13 // mic/headphone insertion events.
14 // o Automatic Mic Bias support
15 // o Jack insertion power event initiation - e.g. hp insertion will enable
16 // sinks, dacs, etc
17 // o Delayed power down of audio subsystem to reduce pops between a quick
18 // device reopen.
19
20 #include <linux/module.h>
21 #include <linux/init.h>
22 #include <linux/async.h>
23 #include <linux/cleanup.h>
24 #include <linux/delay.h>
25 #include <linux/pm.h>
26 #include <linux/bitops.h>
27 #include <linux/platform_device.h>
28 #include <linux/jiffies.h>
29 #include <linux/debugfs.h>
30 #include <linux/pm_runtime.h>
31 #include <linux/regulator/consumer.h>
32 #include <linux/pinctrl/consumer.h>
33 #include <linux/clk.h>
34 #include <linux/slab.h>
35 #include <sound/core.h>
36 #include <sound/pcm.h>
37 #include <sound/pcm_params.h>
38 #include <sound/soc.h>
39 #include <sound/initval.h>
40
41 #include <trace/events/asoc.h>
42
43 static u32 pop_time;
44
45 /* DAPM context */
46 struct snd_soc_dapm_context {
47 enum snd_soc_bias_level bias_level;
48
49 bool idle_bias; /* Use BIAS_OFF instead of STANDBY when false */
50
51 struct snd_soc_component *component; /* parent component */
52 struct snd_soc_card *card; /* parent card */
53
54 /* used during DAPM updates */
55 enum snd_soc_bias_level target_bias_level;
56 struct list_head list;
57
58 struct snd_soc_dapm_widget *wcache_sink;
59 struct snd_soc_dapm_widget *wcache_source;
60
61 #ifdef CONFIG_DEBUG_FS
62 struct dentry *debugfs_dapm;
63 #endif
64 };
65
66 #define DAPM_UPDATE_STAT(widget, val) widget->dapm->card->dapm_stats.val++;
67
68 #define DAPM_DIR_REVERSE(x) ((x == SND_SOC_DAPM_DIR_IN) ? \
69 SND_SOC_DAPM_DIR_OUT : SND_SOC_DAPM_DIR_IN)
70
71 #define dapm_for_each_direction(dir) \
72 for ((dir) = SND_SOC_DAPM_DIR_IN; (dir) <= SND_SOC_DAPM_DIR_OUT; \
73 (dir)++)
74
75 /* dapm power sequences - make this per codec in the future */
76 static int dapm_up_seq[] = {
77 [snd_soc_dapm_pre] = 1,
78 [snd_soc_dapm_regulator_supply] = 2,
79 [snd_soc_dapm_pinctrl] = 2,
80 [snd_soc_dapm_clock_supply] = 2,
81 [snd_soc_dapm_supply] = 3,
82 [snd_soc_dapm_dai_link] = 3,
83 [snd_soc_dapm_micbias] = 4,
84 [snd_soc_dapm_vmid] = 4,
85 [snd_soc_dapm_dai_in] = 5,
86 [snd_soc_dapm_dai_out] = 5,
87 [snd_soc_dapm_aif_in] = 5,
88 [snd_soc_dapm_aif_out] = 5,
89 [snd_soc_dapm_mic] = 6,
90 [snd_soc_dapm_siggen] = 6,
91 [snd_soc_dapm_input] = 6,
92 [snd_soc_dapm_output] = 6,
93 [snd_soc_dapm_mux] = 7,
94 [snd_soc_dapm_mux_named_ctl] = 7,
95 [snd_soc_dapm_demux] = 7,
96 [snd_soc_dapm_dac] = 8,
97 [snd_soc_dapm_switch] = 9,
98 [snd_soc_dapm_mixer] = 9,
99 [snd_soc_dapm_mixer_named_ctl] = 9,
100 [snd_soc_dapm_pga] = 10,
101 [snd_soc_dapm_buffer] = 10,
102 [snd_soc_dapm_scheduler] = 10,
103 [snd_soc_dapm_effect] = 10,
104 [snd_soc_dapm_src] = 10,
105 [snd_soc_dapm_asrc] = 10,
106 [snd_soc_dapm_encoder] = 10,
107 [snd_soc_dapm_decoder] = 10,
108 [snd_soc_dapm_adc] = 11,
109 [snd_soc_dapm_out_drv] = 12,
110 [snd_soc_dapm_hp] = 12,
111 [snd_soc_dapm_line] = 12,
112 [snd_soc_dapm_sink] = 12,
113 [snd_soc_dapm_spk] = 13,
114 [snd_soc_dapm_kcontrol] = 14,
115 [snd_soc_dapm_post] = 15,
116 };
117
118 static int dapm_down_seq[] = {
119 [snd_soc_dapm_pre] = 1,
120 [snd_soc_dapm_kcontrol] = 2,
121 [snd_soc_dapm_adc] = 3,
122 [snd_soc_dapm_spk] = 4,
123 [snd_soc_dapm_hp] = 5,
124 [snd_soc_dapm_line] = 5,
125 [snd_soc_dapm_out_drv] = 5,
126 [snd_soc_dapm_sink] = 6,
127 [snd_soc_dapm_pga] = 6,
128 [snd_soc_dapm_buffer] = 6,
129 [snd_soc_dapm_scheduler] = 6,
130 [snd_soc_dapm_effect] = 6,
131 [snd_soc_dapm_src] = 6,
132 [snd_soc_dapm_asrc] = 6,
133 [snd_soc_dapm_encoder] = 6,
134 [snd_soc_dapm_decoder] = 6,
135 [snd_soc_dapm_switch] = 7,
136 [snd_soc_dapm_mixer_named_ctl] = 7,
137 [snd_soc_dapm_mixer] = 7,
138 [snd_soc_dapm_dac] = 8,
139 [snd_soc_dapm_mic] = 9,
140 [snd_soc_dapm_siggen] = 9,
141 [snd_soc_dapm_input] = 9,
142 [snd_soc_dapm_output] = 9,
143 [snd_soc_dapm_micbias] = 10,
144 [snd_soc_dapm_vmid] = 10,
145 [snd_soc_dapm_mux] = 11,
146 [snd_soc_dapm_mux_named_ctl] = 11,
147 [snd_soc_dapm_demux] = 11,
148 [snd_soc_dapm_aif_in] = 12,
149 [snd_soc_dapm_aif_out] = 12,
150 [snd_soc_dapm_dai_in] = 12,
151 [snd_soc_dapm_dai_out] = 12,
152 [snd_soc_dapm_dai_link] = 13,
153 [snd_soc_dapm_supply] = 14,
154 [snd_soc_dapm_clock_supply] = 15,
155 [snd_soc_dapm_pinctrl] = 15,
156 [snd_soc_dapm_regulator_supply] = 15,
157 [snd_soc_dapm_post] = 16,
158 };
159
dapm_assert_locked(struct snd_soc_dapm_context * dapm)160 static void dapm_assert_locked(struct snd_soc_dapm_context *dapm)
161 {
162 if (snd_soc_card_is_instantiated(dapm->card))
163 snd_soc_dapm_mutex_assert_held(dapm);
164 }
165
dapm_pop_wait(void)166 static void dapm_pop_wait(void)
167 {
168 if (pop_time)
169 schedule_timeout_uninterruptible(msecs_to_jiffies(pop_time));
170 }
171
172 __printf(2, 3)
dapm_pop_dbg(struct device * dev,const char * fmt,...)173 static void dapm_pop_dbg(struct device *dev, const char *fmt, ...)
174 {
175 va_list args;
176 char *buf;
177
178 if (!pop_time)
179 return;
180
181 buf = kmalloc(PAGE_SIZE, GFP_KERNEL);
182 if (buf == NULL)
183 return;
184
185 va_start(args, fmt);
186 vsnprintf(buf, PAGE_SIZE, fmt, args);
187 dev_info(dev, "%s", buf);
188 va_end(args);
189
190 kfree(buf);
191 }
192
snd_soc_dapm_alloc(struct device * dev)193 struct snd_soc_dapm_context *snd_soc_dapm_alloc(struct device *dev)
194 {
195 return devm_kzalloc(dev, sizeof(struct snd_soc_dapm_context), GFP_KERNEL);
196 }
197
snd_soc_dapm_to_dev(struct snd_soc_dapm_context * dapm)198 struct device *snd_soc_dapm_to_dev(struct snd_soc_dapm_context *dapm)
199 {
200 if (dapm->component)
201 return dapm->component->dev;
202
203 return dapm->card->dev;
204 }
205 EXPORT_SYMBOL_GPL(snd_soc_dapm_to_dev);
206
snd_soc_dapm_to_card(struct snd_soc_dapm_context * dapm)207 struct snd_soc_card *snd_soc_dapm_to_card(struct snd_soc_dapm_context *dapm)
208 {
209 return dapm->card;
210 }
211 EXPORT_SYMBOL_GPL(snd_soc_dapm_to_card);
212
snd_soc_dapm_to_component(struct snd_soc_dapm_context * dapm)213 struct snd_soc_component *snd_soc_dapm_to_component(struct snd_soc_dapm_context *dapm)
214 {
215 return dapm->component;
216 }
217 EXPORT_SYMBOL_GPL(snd_soc_dapm_to_component);
218
dapm_dirty_widget(struct snd_soc_dapm_widget * w)219 static bool dapm_dirty_widget(struct snd_soc_dapm_widget *w)
220 {
221 return !list_empty(&w->dirty);
222 }
223
dapm_mark_dirty(struct snd_soc_dapm_widget * w,const char * reason)224 static void dapm_mark_dirty(struct snd_soc_dapm_widget *w, const char *reason)
225 {
226 struct device *dev = snd_soc_dapm_to_dev(w->dapm);
227
228 dapm_assert_locked(w->dapm);
229
230 if (!dapm_dirty_widget(w)) {
231 dev_vdbg(dev, "Marking %s dirty due to %s\n",
232 w->name, reason);
233 list_add_tail(&w->dirty, &w->dapm->card->dapm_dirty);
234 }
235 }
236
237 /*
238 * Common implementation for dapm_widget_invalidate_input_paths() and
239 * dapm_widget_invalidate_output_paths(). The function is inlined since the
240 * combined size of the two specialized functions is only marginally larger then
241 * the size of the generic function and at the same time the fast path of the
242 * specialized functions is significantly smaller than the generic function.
243 */
dapm_widget_invalidate_paths(struct snd_soc_dapm_widget * w,enum snd_soc_dapm_direction dir)244 static __always_inline void dapm_widget_invalidate_paths(
245 struct snd_soc_dapm_widget *w, enum snd_soc_dapm_direction dir)
246 {
247 enum snd_soc_dapm_direction rdir = DAPM_DIR_REVERSE(dir);
248 struct snd_soc_dapm_widget *node;
249 struct snd_soc_dapm_path *p;
250 LIST_HEAD(list);
251
252 dapm_assert_locked(w->dapm);
253
254 if (w->endpoints[dir] == -1)
255 return;
256
257 list_add_tail(&w->work_list, &list);
258 w->endpoints[dir] = -1;
259
260 list_for_each_entry(w, &list, work_list) {
261 snd_soc_dapm_widget_for_each_path(w, dir, p) {
262 if (p->is_supply || !p->connect)
263 continue;
264 node = p->node[rdir];
265 if (node->endpoints[dir] != -1) {
266 node->endpoints[dir] = -1;
267 list_add_tail(&node->work_list, &list);
268 }
269 }
270 }
271 }
272
273 /*
274 * dapm_widget_invalidate_input_paths() - Invalidate the cached number of
275 * input paths
276 * @w: The widget for which to invalidate the cached number of input paths
277 *
278 * Resets the cached number of inputs for the specified widget and all widgets
279 * that can be reached via outcoming paths from the widget.
280 *
281 * This function must be called if the number of output paths for a widget might
282 * have changed. E.g. if the source state of a widget changes or a path is added
283 * or activated with the widget as the sink.
284 */
dapm_widget_invalidate_input_paths(struct snd_soc_dapm_widget * w)285 static void dapm_widget_invalidate_input_paths(struct snd_soc_dapm_widget *w)
286 {
287 dapm_widget_invalidate_paths(w, SND_SOC_DAPM_DIR_IN);
288 }
289
290 /*
291 * dapm_widget_invalidate_output_paths() - Invalidate the cached number of
292 * output paths
293 * @w: The widget for which to invalidate the cached number of output paths
294 *
295 * Resets the cached number of outputs for the specified widget and all widgets
296 * that can be reached via incoming paths from the widget.
297 *
298 * This function must be called if the number of output paths for a widget might
299 * have changed. E.g. if the sink state of a widget changes or a path is added
300 * or activated with the widget as the source.
301 */
dapm_widget_invalidate_output_paths(struct snd_soc_dapm_widget * w)302 static void dapm_widget_invalidate_output_paths(struct snd_soc_dapm_widget *w)
303 {
304 dapm_widget_invalidate_paths(w, SND_SOC_DAPM_DIR_OUT);
305 }
306
307 /*
308 * dapm_path_invalidate() - Invalidates the cached number of inputs and outputs
309 * for the widgets connected to a path
310 * @p: The path to invalidate
311 *
312 * Resets the cached number of inputs for the sink of the path and the cached
313 * number of outputs for the source of the path.
314 *
315 * This function must be called when a path is added, removed or the connected
316 * state changes.
317 */
dapm_path_invalidate(struct snd_soc_dapm_path * p)318 static void dapm_path_invalidate(struct snd_soc_dapm_path *p)
319 {
320 /*
321 * Weak paths or supply paths do not influence the number of input or
322 * output paths of their neighbors.
323 */
324 if (p->is_supply)
325 return;
326
327 /*
328 * The number of connected endpoints is the sum of the number of
329 * connected endpoints of all neighbors. If a node with 0 connected
330 * endpoints is either connected or disconnected that sum won't change,
331 * so there is no need to re-check the path.
332 */
333 if (p->source->endpoints[SND_SOC_DAPM_DIR_IN] != 0)
334 dapm_widget_invalidate_input_paths(p->sink);
335 if (p->sink->endpoints[SND_SOC_DAPM_DIR_OUT] != 0)
336 dapm_widget_invalidate_output_paths(p->source);
337 }
338
snd_soc_dapm_mark_endpoints_dirty(struct snd_soc_card * card)339 void snd_soc_dapm_mark_endpoints_dirty(struct snd_soc_card *card)
340 {
341 struct snd_soc_dapm_widget *w;
342
343 snd_soc_dapm_mutex_lock_root(card);
344
345 for_each_card_widgets(card, w) {
346 if (w->is_ep) {
347 dapm_mark_dirty(w, "Rechecking endpoints");
348 if (w->is_ep & SND_SOC_DAPM_EP_SINK)
349 dapm_widget_invalidate_output_paths(w);
350 if (w->is_ep & SND_SOC_DAPM_EP_SOURCE)
351 dapm_widget_invalidate_input_paths(w);
352 }
353 }
354
355 snd_soc_dapm_mutex_unlock(card);
356 }
357
358 /* create a new dapm widget */
dapm_cnew_widget(const struct snd_soc_dapm_widget * _widget,const char * prefix)359 static inline struct snd_soc_dapm_widget *dapm_cnew_widget(
360 const struct snd_soc_dapm_widget *_widget,
361 const char *prefix)
362 {
363 struct snd_soc_dapm_widget *w __free(kfree) = kmemdup(_widget,
364 sizeof(*_widget),
365 GFP_KERNEL);
366 if (!w)
367 return NULL;
368
369 if (prefix)
370 w->name = kasprintf(GFP_KERNEL, "%s %s", prefix, _widget->name);
371 else
372 w->name = kstrdup_const(_widget->name, GFP_KERNEL);
373 if (!w->name)
374 return NULL;
375
376 if (_widget->sname) {
377 w->sname = kstrdup_const(_widget->sname, GFP_KERNEL);
378 if (!w->sname) {
379 kfree_const(w->name);
380 return NULL;
381 }
382 }
383
384 return_ptr(w);
385 }
386
387 struct dapm_kcontrol_data {
388 unsigned int value;
389 struct snd_soc_dapm_widget *widget;
390 struct list_head paths;
391 struct snd_soc_dapm_widget_list *wlist;
392 };
393
dapm_read(struct snd_soc_dapm_context * dapm,int reg)394 static unsigned int dapm_read(struct snd_soc_dapm_context *dapm, int reg)
395 {
396 if (!dapm->component)
397 return -EIO;
398 return snd_soc_component_read(dapm->component, reg);
399 }
400
401 /* set up initial codec paths */
dapm_set_mixer_path_status(struct snd_soc_dapm_path * p,int i,int nth_path)402 static void dapm_set_mixer_path_status(struct snd_soc_dapm_path *p, int i,
403 int nth_path)
404 {
405 struct soc_mixer_control *mc = (struct soc_mixer_control *)
406 p->sink->kcontrol_news[i].private_value;
407 unsigned int reg = mc->reg;
408 unsigned int invert = mc->invert;
409
410 if (reg != SND_SOC_NOPM) {
411 unsigned int shift = mc->shift;
412 unsigned int max = mc->max;
413 unsigned int mask = (1 << fls(max)) - 1;
414 unsigned int val = dapm_read(p->sink->dapm, reg);
415
416 /*
417 * The nth_path argument allows this function to know
418 * which path of a kcontrol it is setting the initial
419 * status for. Ideally this would support any number
420 * of paths and channels. But since kcontrols only come
421 * in mono and stereo variants, we are limited to 2
422 * channels.
423 *
424 * The following code assumes for stereo controls the
425 * first path is the left channel, and all remaining
426 * paths are the right channel.
427 */
428 if (snd_soc_volsw_is_stereo(mc) && nth_path > 0) {
429 if (reg != mc->rreg)
430 val = dapm_read(p->sink->dapm, mc->rreg);
431 val = (val >> mc->rshift) & mask;
432 } else {
433 val = (val >> shift) & mask;
434 }
435 if (invert)
436 val = max - val;
437 p->connect = !!val;
438 } else {
439 /* since a virtual mixer has no backing registers to
440 * decide which path to connect, it will try to match
441 * with initial state. This is to ensure
442 * that the default mixer choice will be
443 * correctly powered up during initialization.
444 */
445 p->connect = invert;
446 }
447 }
448
449 /* connect mux widget to its interconnecting audio paths */
dapm_connect_mux(struct snd_soc_dapm_context * dapm,struct snd_soc_dapm_path * path,const char * control_name,struct snd_soc_dapm_widget * w)450 static int dapm_connect_mux(struct snd_soc_dapm_context *dapm,
451 struct snd_soc_dapm_path *path, const char *control_name,
452 struct snd_soc_dapm_widget *w)
453 {
454 const struct snd_kcontrol_new *kcontrol = &w->kcontrol_news[0];
455 struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
456 unsigned int item;
457 int i;
458
459 if (e->reg != SND_SOC_NOPM) {
460 unsigned int val;
461
462 val = dapm_read(dapm, e->reg);
463 val = (val >> e->shift_l) & e->mask;
464 item = snd_soc_enum_val_to_item(e, val);
465 } else {
466 /* since a virtual mux has no backing registers to
467 * decide which path to connect, it will try to match
468 * with the first enumeration. This is to ensure
469 * that the default mux choice (the first) will be
470 * correctly powered up during initialization.
471 */
472 item = 0;
473 }
474
475 i = match_string(e->texts, e->items, control_name);
476 if (i < 0)
477 return -ENODEV;
478
479 path->name = e->texts[i];
480 path->connect = (i == item);
481 return 0;
482
483 }
484
485 /* connect mixer widget to its interconnecting audio paths */
dapm_connect_mixer(struct snd_soc_dapm_context * dapm,struct snd_soc_dapm_path * path,const char * control_name)486 static int dapm_connect_mixer(struct snd_soc_dapm_context *dapm,
487 struct snd_soc_dapm_path *path, const char *control_name)
488 {
489 int i, nth_path = 0;
490
491 /* search for mixer kcontrol */
492 for (i = 0; i < path->sink->num_kcontrols; i++) {
493 if (!strcmp(control_name, path->sink->kcontrol_news[i].name)) {
494 path->name = path->sink->kcontrol_news[i].name;
495 dapm_set_mixer_path_status(path, i, nth_path++);
496 return 0;
497 }
498 }
499 return -ENODEV;
500 }
501
502 /*
503 * dapm_update_widget_flags() - Re-compute widget sink and source flags
504 * @w: The widget for which to update the flags
505 *
506 * Some widgets have a dynamic category which depends on which neighbors they
507 * are connected to. This function update the category for these widgets.
508 *
509 * This function must be called whenever a path is added or removed to a widget.
510 */
dapm_update_widget_flags(struct snd_soc_dapm_widget * w)511 static void dapm_update_widget_flags(struct snd_soc_dapm_widget *w)
512 {
513 enum snd_soc_dapm_direction dir;
514 struct snd_soc_dapm_path *p;
515 unsigned int ep;
516
517 switch (w->id) {
518 case snd_soc_dapm_input:
519 /* On a fully routed card an input is never a source */
520 if (w->dapm->card->fully_routed)
521 return;
522 ep = SND_SOC_DAPM_EP_SOURCE;
523 snd_soc_dapm_widget_for_each_source_path(w, p) {
524 if (p->source->id == snd_soc_dapm_micbias ||
525 p->source->id == snd_soc_dapm_mic ||
526 p->source->id == snd_soc_dapm_line ||
527 p->source->id == snd_soc_dapm_output) {
528 ep = 0;
529 break;
530 }
531 }
532 break;
533 case snd_soc_dapm_output:
534 /* On a fully routed card a output is never a sink */
535 if (w->dapm->card->fully_routed)
536 return;
537 ep = SND_SOC_DAPM_EP_SINK;
538 snd_soc_dapm_widget_for_each_sink_path(w, p) {
539 if (p->sink->id == snd_soc_dapm_spk ||
540 p->sink->id == snd_soc_dapm_hp ||
541 p->sink->id == snd_soc_dapm_line ||
542 p->sink->id == snd_soc_dapm_input) {
543 ep = 0;
544 break;
545 }
546 }
547 break;
548 case snd_soc_dapm_line:
549 ep = 0;
550 dapm_for_each_direction(dir) {
551 if (!list_empty(&w->edges[dir]))
552 ep |= SND_SOC_DAPM_DIR_TO_EP(dir);
553 }
554 break;
555 default:
556 return;
557 }
558
559 w->is_ep = ep;
560 }
561
dapm_check_dynamic_path(struct snd_soc_dapm_context * dapm,struct snd_soc_dapm_widget * source,struct snd_soc_dapm_widget * sink,const char * control)562 static int dapm_check_dynamic_path(
563 struct snd_soc_dapm_context *dapm,
564 struct snd_soc_dapm_widget *source, struct snd_soc_dapm_widget *sink,
565 const char *control)
566 {
567 struct device *dev = snd_soc_dapm_to_dev(dapm);
568 bool dynamic_source = false;
569 bool dynamic_sink = false;
570
571 if (!control)
572 return 0;
573
574 switch (source->id) {
575 case snd_soc_dapm_demux:
576 dynamic_source = true;
577 break;
578 default:
579 break;
580 }
581
582 switch (sink->id) {
583 case snd_soc_dapm_mux:
584 case snd_soc_dapm_mux_named_ctl:
585 case snd_soc_dapm_switch:
586 case snd_soc_dapm_mixer:
587 case snd_soc_dapm_mixer_named_ctl:
588 dynamic_sink = true;
589 break;
590 default:
591 break;
592 }
593
594 if (dynamic_source && dynamic_sink) {
595 dev_err(dev,
596 "Direct connection between demux and mixer/mux not supported for path %s -> [%s] -> %s\n",
597 source->name, control, sink->name);
598 return -EINVAL;
599 } else if (!dynamic_source && !dynamic_sink) {
600 dev_err(dev,
601 "Control not supported for path %s -> [%s] -> %s\n",
602 source->name, control, sink->name);
603 return -EINVAL;
604 }
605
606 return 0;
607 }
608
dapm_add_path(struct snd_soc_dapm_context * dapm,struct snd_soc_dapm_widget * wsource,struct snd_soc_dapm_widget * wsink,const char * control,int (* connected)(struct snd_soc_dapm_widget * source,struct snd_soc_dapm_widget * sink))609 static int dapm_add_path(
610 struct snd_soc_dapm_context *dapm,
611 struct snd_soc_dapm_widget *wsource, struct snd_soc_dapm_widget *wsink,
612 const char *control,
613 int (*connected)(struct snd_soc_dapm_widget *source,
614 struct snd_soc_dapm_widget *sink))
615 {
616 struct device *dev = snd_soc_dapm_to_dev(dapm);
617 enum snd_soc_dapm_direction dir;
618 struct snd_soc_dapm_path *path;
619 int ret;
620
621 if (wsink->is_supply && !wsource->is_supply) {
622 dev_err(dev,
623 "Connecting non-supply widget to supply widget is not supported (%s -> %s)\n",
624 wsource->name, wsink->name);
625 return -EINVAL;
626 }
627
628 if (connected && !wsource->is_supply) {
629 dev_err(dev,
630 "connected() callback only supported for supply widgets (%s -> %s)\n",
631 wsource->name, wsink->name);
632 return -EINVAL;
633 }
634
635 if (wsource->is_supply && control) {
636 dev_err(dev,
637 "Conditional paths are not supported for supply widgets (%s -> [%s] -> %s)\n",
638 wsource->name, control, wsink->name);
639 return -EINVAL;
640 }
641
642 ret = dapm_check_dynamic_path(dapm, wsource, wsink, control);
643 if (ret)
644 return ret;
645
646 path = kzalloc_obj(struct snd_soc_dapm_path);
647 if (!path)
648 return -ENOMEM;
649
650 path->node[SND_SOC_DAPM_DIR_IN] = wsource;
651 path->node[SND_SOC_DAPM_DIR_OUT] = wsink;
652
653 path->connected = connected;
654 INIT_LIST_HEAD(&path->list);
655 INIT_LIST_HEAD(&path->list_kcontrol);
656
657 if (wsource->is_supply || wsink->is_supply)
658 path->is_supply = 1;
659
660 /* connect static paths */
661 if (control == NULL) {
662 path->connect = 1;
663 } else {
664 switch (wsource->id) {
665 case snd_soc_dapm_demux:
666 ret = dapm_connect_mux(dapm, path, control, wsource);
667 if (ret)
668 goto err;
669 break;
670 default:
671 break;
672 }
673
674 switch (wsink->id) {
675 case snd_soc_dapm_mux:
676 case snd_soc_dapm_mux_named_ctl:
677 ret = dapm_connect_mux(dapm, path, control, wsink);
678 if (ret != 0)
679 goto err;
680 break;
681 case snd_soc_dapm_switch:
682 case snd_soc_dapm_mixer:
683 case snd_soc_dapm_mixer_named_ctl:
684 ret = dapm_connect_mixer(dapm, path, control);
685 if (ret != 0)
686 goto err;
687 break;
688 default:
689 break;
690 }
691 }
692
693 list_add(&path->list, &dapm->card->paths);
694
695 dapm_for_each_direction(dir)
696 list_add(&path->list_node[dir], &path->node[dir]->edges[dir]);
697
698 dapm_for_each_direction(dir) {
699 dapm_update_widget_flags(path->node[dir]);
700 dapm_mark_dirty(path->node[dir], "Route added");
701 }
702
703 if (snd_soc_card_is_instantiated(dapm->card) && path->connect)
704 dapm_path_invalidate(path);
705
706 return 0;
707 err:
708 kfree(path);
709 return ret;
710 }
711
dapm_kcontrol_data_alloc(struct snd_soc_dapm_widget * widget,struct snd_kcontrol * kcontrol,const char * ctrl_name)712 static int dapm_kcontrol_data_alloc(struct snd_soc_dapm_widget *widget,
713 struct snd_kcontrol *kcontrol, const char *ctrl_name)
714 {
715 struct device *dev = snd_soc_dapm_to_dev(widget->dapm);
716 struct dapm_kcontrol_data *data;
717 struct soc_mixer_control *mc;
718 struct soc_enum *e;
719 const char *name;
720 int ret;
721
722 data = kzalloc_obj(*data);
723 if (!data)
724 return -ENOMEM;
725
726 INIT_LIST_HEAD(&data->paths);
727
728 switch (widget->id) {
729 case snd_soc_dapm_switch:
730 case snd_soc_dapm_mixer:
731 case snd_soc_dapm_mixer_named_ctl:
732 mc = (struct soc_mixer_control *)kcontrol->private_value;
733
734 if (mc->autodisable) {
735 struct snd_soc_dapm_widget template;
736
737 if (snd_soc_volsw_is_stereo(mc))
738 dev_warn(dev,
739 "ASoC: Unsupported stereo autodisable control '%s'\n",
740 ctrl_name);
741
742 name = kasprintf(GFP_KERNEL, "%s %s", ctrl_name,
743 "Autodisable");
744 if (!name) {
745 ret = -ENOMEM;
746 goto err_data;
747 }
748
749 memset(&template, 0, sizeof(template));
750 template.reg = mc->reg;
751 template.mask = (1 << fls(mc->max)) - 1;
752 template.shift = mc->shift;
753 if (mc->invert)
754 template.off_val = mc->max;
755 else
756 template.off_val = 0;
757 template.on_val = template.off_val;
758 template.id = snd_soc_dapm_kcontrol;
759 template.name = name;
760
761 data->value = template.on_val;
762
763 data->widget =
764 snd_soc_dapm_new_control_unlocked(widget->dapm,
765 &template);
766 kfree(name);
767 if (IS_ERR(data->widget)) {
768 ret = PTR_ERR(data->widget);
769 goto err_data;
770 }
771 }
772 break;
773 case snd_soc_dapm_demux:
774 case snd_soc_dapm_mux:
775 case snd_soc_dapm_mux_named_ctl:
776 e = (struct soc_enum *)kcontrol->private_value;
777
778 if (e->autodisable) {
779 struct snd_soc_dapm_widget template;
780
781 name = kasprintf(GFP_KERNEL, "%s %s", ctrl_name,
782 "Autodisable");
783 if (!name) {
784 ret = -ENOMEM;
785 goto err_data;
786 }
787
788 memset(&template, 0, sizeof(template));
789 template.reg = e->reg;
790 template.mask = e->mask;
791 template.shift = e->shift_l;
792 template.off_val = snd_soc_enum_item_to_val(e, 0);
793 template.on_val = template.off_val;
794 template.id = snd_soc_dapm_kcontrol;
795 template.name = name;
796
797 data->value = template.on_val;
798
799 data->widget = snd_soc_dapm_new_control_unlocked(
800 widget->dapm, &template);
801 kfree(name);
802 if (IS_ERR(data->widget)) {
803 ret = PTR_ERR(data->widget);
804 goto err_data;
805 }
806
807 dapm_add_path(widget->dapm, data->widget,
808 widget, NULL, NULL);
809 } else if (e->reg != SND_SOC_NOPM) {
810 data->value = dapm_read(widget->dapm, e->reg) &
811 (e->mask << e->shift_l);
812 }
813 break;
814 default:
815 break;
816 }
817
818 kcontrol->private_data = data;
819
820 return 0;
821
822 err_data:
823 kfree(data);
824 return ret;
825 }
826
dapm_kcontrol_free(struct snd_kcontrol * kctl)827 static void dapm_kcontrol_free(struct snd_kcontrol *kctl)
828 {
829 struct dapm_kcontrol_data *data = snd_kcontrol_chip(kctl);
830
831 list_del(&data->paths);
832 kfree(data->wlist);
833 kfree(data);
834 }
835
dapm_kcontrol_get_wlist(const struct snd_kcontrol * kcontrol)836 static struct snd_soc_dapm_widget_list *dapm_kcontrol_get_wlist(
837 const struct snd_kcontrol *kcontrol)
838 {
839 struct dapm_kcontrol_data *data = snd_kcontrol_chip(kcontrol);
840
841 return data->wlist;
842 }
843
dapm_kcontrol_add_widget(struct snd_kcontrol * kcontrol,struct snd_soc_dapm_widget * widget)844 static int dapm_kcontrol_add_widget(struct snd_kcontrol *kcontrol,
845 struct snd_soc_dapm_widget *widget)
846 {
847 struct dapm_kcontrol_data *data = snd_kcontrol_chip(kcontrol);
848 struct snd_soc_dapm_widget_list *new_wlist;
849 unsigned int n;
850
851 if (data->wlist)
852 n = data->wlist->num_widgets + 1;
853 else
854 n = 1;
855
856 new_wlist = krealloc(data->wlist,
857 struct_size(new_wlist, widgets, n),
858 GFP_KERNEL);
859 if (!new_wlist)
860 return -ENOMEM;
861
862 new_wlist->num_widgets = n;
863 new_wlist->widgets[n - 1] = widget;
864
865 data->wlist = new_wlist;
866
867 return 0;
868 }
869
dapm_kcontrol_add_path(const struct snd_kcontrol * kcontrol,struct snd_soc_dapm_path * path)870 static void dapm_kcontrol_add_path(const struct snd_kcontrol *kcontrol,
871 struct snd_soc_dapm_path *path)
872 {
873 struct dapm_kcontrol_data *data = snd_kcontrol_chip(kcontrol);
874
875 list_add_tail(&path->list_kcontrol, &data->paths);
876 }
877
dapm_kcontrol_is_powered(const struct snd_kcontrol * kcontrol)878 static bool dapm_kcontrol_is_powered(const struct snd_kcontrol *kcontrol)
879 {
880 struct dapm_kcontrol_data *data = snd_kcontrol_chip(kcontrol);
881
882 if (!data->widget)
883 return true;
884
885 return data->widget->power;
886 }
887
dapm_kcontrol_get_path_list(const struct snd_kcontrol * kcontrol)888 static struct list_head *dapm_kcontrol_get_path_list(
889 const struct snd_kcontrol *kcontrol)
890 {
891 struct dapm_kcontrol_data *data = snd_kcontrol_chip(kcontrol);
892
893 return &data->paths;
894 }
895
896 #define dapm_kcontrol_for_each_path(path, kcontrol) \
897 list_for_each_entry(path, dapm_kcontrol_get_path_list(kcontrol), \
898 list_kcontrol)
899
snd_soc_dapm_kcontrol_get_value(const struct snd_kcontrol * kcontrol)900 unsigned int snd_soc_dapm_kcontrol_get_value(const struct snd_kcontrol *kcontrol)
901 {
902 struct dapm_kcontrol_data *data = snd_kcontrol_chip(kcontrol);
903
904 return data->value;
905 }
906 EXPORT_SYMBOL_GPL(snd_soc_dapm_kcontrol_get_value);
907
dapm_kcontrol_set_value(const struct snd_kcontrol * kcontrol,unsigned int value)908 static bool dapm_kcontrol_set_value(const struct snd_kcontrol *kcontrol,
909 unsigned int value)
910 {
911 struct dapm_kcontrol_data *data = snd_kcontrol_chip(kcontrol);
912
913 if (data->value == value)
914 return false;
915
916 if (data->widget) {
917 switch (dapm_kcontrol_get_wlist(kcontrol)->widgets[0]->id) {
918 case snd_soc_dapm_switch:
919 case snd_soc_dapm_mixer:
920 case snd_soc_dapm_mixer_named_ctl:
921 data->widget->on_val = value & data->widget->mask;
922 break;
923 case snd_soc_dapm_demux:
924 case snd_soc_dapm_mux:
925 case snd_soc_dapm_mux_named_ctl:
926 data->widget->on_val = value >> data->widget->shift;
927 break;
928 default:
929 data->widget->on_val = value;
930 break;
931 }
932 }
933
934 data->value = value;
935
936 return true;
937 }
938
939 /**
940 * snd_soc_dapm_kcontrol_to_widget() - Returns the widget associated to a
941 * kcontrol
942 * @kcontrol: The kcontrol
943 */
snd_soc_dapm_kcontrol_to_widget(struct snd_kcontrol * kcontrol)944 struct snd_soc_dapm_widget *snd_soc_dapm_kcontrol_to_widget(struct snd_kcontrol *kcontrol)
945 {
946 return dapm_kcontrol_get_wlist(kcontrol)->widgets[0];
947 }
948 EXPORT_SYMBOL_GPL(snd_soc_dapm_kcontrol_to_widget);
949
950 /**
951 * snd_soc_dapm_kcontrol_to_dapm() - Returns the dapm context associated to a kcontrol
952 * @kcontrol: The kcontrol
953 *
954 * Note: This function must only be used on kcontrols that are known to have
955 * been registered for a CODEC. Otherwise the behaviour is undefined.
956 */
snd_soc_dapm_kcontrol_to_dapm(struct snd_kcontrol * kcontrol)957 struct snd_soc_dapm_context *snd_soc_dapm_kcontrol_to_dapm(struct snd_kcontrol *kcontrol)
958 {
959 return dapm_kcontrol_get_wlist(kcontrol)->widgets[0]->dapm;
960 }
961 EXPORT_SYMBOL_GPL(snd_soc_dapm_kcontrol_to_dapm);
962
963 /**
964 * snd_soc_dapm_kcontrol_to_component() - Returns the component associated to a
965 * kcontrol
966 * @kcontrol: The kcontrol
967 *
968 * This function must only be used on DAPM contexts that are known to be part of
969 * a COMPONENT (e.g. in a COMPONENT driver). Otherwise the behavior is undefined
970 */
snd_soc_dapm_kcontrol_to_component(struct snd_kcontrol * kcontrol)971 struct snd_soc_component *snd_soc_dapm_kcontrol_to_component(struct snd_kcontrol *kcontrol)
972 {
973 return snd_soc_dapm_to_component(snd_soc_dapm_kcontrol_to_dapm(kcontrol));
974 }
975 EXPORT_SYMBOL_GPL(snd_soc_dapm_kcontrol_to_component);
976
dapm_reset(struct snd_soc_card * card)977 static void dapm_reset(struct snd_soc_card *card)
978 {
979 struct snd_soc_dapm_widget *w;
980
981 snd_soc_dapm_mutex_assert_held(card);
982
983 memset(&card->dapm_stats, 0, sizeof(card->dapm_stats));
984
985 for_each_card_widgets(card, w) {
986 w->new_power = w->power;
987 w->power_checked = false;
988 }
989 }
990
dapm_prefix(struct snd_soc_dapm_context * dapm)991 static const char *dapm_prefix(struct snd_soc_dapm_context *dapm)
992 {
993 if (!dapm->component)
994 return NULL;
995 return dapm->component->name_prefix;
996 }
997
dapm_update_bits(struct snd_soc_dapm_context * dapm,int reg,unsigned int mask,unsigned int value)998 static int dapm_update_bits(struct snd_soc_dapm_context *dapm,
999 int reg, unsigned int mask, unsigned int value)
1000 {
1001 if (!dapm->component)
1002 return -EIO;
1003 return snd_soc_component_update_bits(dapm->component, reg,
1004 mask, value);
1005 }
1006
dapm_test_bits(struct snd_soc_dapm_context * dapm,int reg,unsigned int mask,unsigned int value)1007 static int dapm_test_bits(struct snd_soc_dapm_context *dapm,
1008 int reg, unsigned int mask, unsigned int value)
1009 {
1010 if (!dapm->component)
1011 return -EIO;
1012 return snd_soc_component_test_bits(dapm->component, reg, mask, value);
1013 }
1014
dapm_async_complete(struct snd_soc_dapm_context * dapm)1015 static void dapm_async_complete(struct snd_soc_dapm_context *dapm)
1016 {
1017 if (dapm->component)
1018 snd_soc_component_async_complete(dapm->component);
1019 }
1020
1021 static struct snd_soc_dapm_widget *
dapm_wcache_lookup(struct snd_soc_dapm_widget * w,const char * name)1022 dapm_wcache_lookup(struct snd_soc_dapm_widget *w, const char *name)
1023 {
1024 if (w) {
1025 struct list_head *wlist = &w->dapm->card->widgets;
1026 const int depth = 2;
1027 int i = 0;
1028
1029 list_for_each_entry_from(w, wlist, list) {
1030 if (!strcmp(name, w->name))
1031 return w;
1032
1033 if (++i == depth)
1034 break;
1035 }
1036 }
1037
1038 return NULL;
1039 }
1040
1041 /**
1042 * snd_soc_dapm_force_bias_level() - Sets the DAPM bias level
1043 * @dapm: The DAPM context for which to set the level
1044 * @level: The level to set
1045 *
1046 * Forces the DAPM bias level to a specific state. It will call the bias level
1047 * callback of DAPM context with the specified level. This will even happen if
1048 * the context is already at the same level. Furthermore it will not go through
1049 * the normal bias level sequencing, meaning any intermediate states between the
1050 * current and the target state will not be entered.
1051 *
1052 * Note that the change in bias level is only temporary and the next time
1053 * snd_soc_dapm_sync() is called the state will be set to the level as
1054 * determined by the DAPM core. The function is mainly intended to be used to
1055 * used during probe or resume from suspend to power up the device so
1056 * initialization can be done, before the DAPM core takes over.
1057 */
snd_soc_dapm_force_bias_level(struct snd_soc_dapm_context * dapm,enum snd_soc_bias_level level)1058 int snd_soc_dapm_force_bias_level(struct snd_soc_dapm_context *dapm,
1059 enum snd_soc_bias_level level)
1060 {
1061 int ret = 0;
1062
1063 if (dapm->component)
1064 ret = snd_soc_component_set_bias_level(dapm->component, level);
1065
1066 if (ret == 0)
1067 dapm->bias_level = level;
1068
1069 return ret;
1070 }
1071 EXPORT_SYMBOL_GPL(snd_soc_dapm_force_bias_level);
1072
1073 /**
1074 * snd_soc_dapm_init_bias_level() - Initialize DAPM bias level
1075 * @dapm: The DAPM context to initialize
1076 * @level: The DAPM level to initialize to
1077 *
1078 * This function only sets the driver internal state of the DAPM level and will
1079 * not modify the state of the device. Hence it should not be used during normal
1080 * operation, but only to synchronize the internal state to the device state.
1081 * E.g. during driver probe to set the DAPM level to the one corresponding with
1082 * the power-on reset state of the device.
1083 *
1084 * To change the DAPM state of the device use snd_soc_dapm_set_bias_level().
1085 */
snd_soc_dapm_init_bias_level(struct snd_soc_dapm_context * dapm,enum snd_soc_bias_level level)1086 void snd_soc_dapm_init_bias_level(struct snd_soc_dapm_context *dapm, enum snd_soc_bias_level level)
1087 {
1088 dapm->bias_level = level;
1089 }
1090 EXPORT_SYMBOL_GPL(snd_soc_dapm_init_bias_level);
1091
1092 /**
1093 * snd_soc_dapm_set_bias_level - set the bias level for the system
1094 * @dapm: DAPM context
1095 * @level: level to configure
1096 *
1097 * Configure the bias (power) levels for the SoC audio device.
1098 *
1099 * Returns 0 for success else error.
1100 */
snd_soc_dapm_set_bias_level(struct snd_soc_dapm_context * dapm,enum snd_soc_bias_level level)1101 static int snd_soc_dapm_set_bias_level(struct snd_soc_dapm_context *dapm,
1102 enum snd_soc_bias_level level)
1103 {
1104 struct snd_soc_card *card = dapm->card;
1105 int ret = 0;
1106
1107 trace_snd_soc_bias_level_start(dapm, level);
1108
1109 ret = snd_soc_card_set_bias_level(card, dapm, level);
1110 if (ret != 0)
1111 goto out;
1112
1113 if (dapm != card->dapm)
1114 ret = snd_soc_dapm_force_bias_level(dapm, level);
1115
1116 if (ret != 0)
1117 goto out;
1118
1119 ret = snd_soc_card_set_bias_level_post(card, dapm, level);
1120 out:
1121 trace_snd_soc_bias_level_done(dapm, level);
1122
1123 /* success */
1124 if (ret == 0)
1125 snd_soc_dapm_init_bias_level(dapm, level);
1126
1127 return ret;
1128 }
1129
1130 /**
1131 * snd_soc_dapm_get_bias_level() - Get current DAPM bias level
1132 * @dapm: The context for which to get the bias level
1133 *
1134 * Returns: The current bias level of the passed DAPM context.
1135 */
snd_soc_dapm_get_bias_level(struct snd_soc_dapm_context * dapm)1136 enum snd_soc_bias_level snd_soc_dapm_get_bias_level(struct snd_soc_dapm_context *dapm)
1137 {
1138 return dapm->bias_level;
1139 }
1140 EXPORT_SYMBOL_GPL(snd_soc_dapm_get_bias_level);
1141
dapm_is_shared_kcontrol(struct snd_soc_dapm_context * dapm,struct snd_soc_dapm_widget * kcontrolw,const struct snd_kcontrol_new * kcontrol_new,struct snd_kcontrol ** kcontrol)1142 static int dapm_is_shared_kcontrol(struct snd_soc_dapm_context *dapm,
1143 struct snd_soc_dapm_widget *kcontrolw,
1144 const struct snd_kcontrol_new *kcontrol_new,
1145 struct snd_kcontrol **kcontrol)
1146 {
1147 struct snd_soc_dapm_widget *w;
1148 int i;
1149
1150 *kcontrol = NULL;
1151
1152 for_each_card_widgets(dapm->card, w) {
1153 if (w == kcontrolw || w->dapm != kcontrolw->dapm)
1154 continue;
1155 for (i = 0; i < w->num_kcontrols; i++) {
1156 if (&w->kcontrol_news[i] == kcontrol_new) {
1157 if (w->kcontrols)
1158 *kcontrol = w->kcontrols[i];
1159 return 1;
1160 }
1161 }
1162 }
1163
1164 return 0;
1165 }
1166
1167 /*
1168 * Determine if a kcontrol is shared. If it is, look it up. If it isn't,
1169 * create it. Either way, add the widget into the control's widget list
1170 */
dapm_create_or_share_kcontrol(struct snd_soc_dapm_widget * w,int kci)1171 static int dapm_create_or_share_kcontrol(struct snd_soc_dapm_widget *w,
1172 int kci)
1173 {
1174 struct snd_soc_dapm_context *dapm = w->dapm;
1175 struct device *dev = snd_soc_dapm_to_dev(dapm);
1176 struct snd_card *card = dapm->card->snd_card;
1177 const char *prefix;
1178 size_t prefix_len;
1179 int shared;
1180 struct snd_kcontrol *kcontrol;
1181 bool wname_in_long_name, kcname_in_long_name;
1182 char *long_name = NULL;
1183 const char *name;
1184 int ret = 0;
1185
1186 prefix = dapm_prefix(dapm);
1187 if (prefix)
1188 prefix_len = strlen(prefix) + 1;
1189 else
1190 prefix_len = 0;
1191
1192 shared = dapm_is_shared_kcontrol(dapm, w, &w->kcontrol_news[kci],
1193 &kcontrol);
1194
1195 if (!kcontrol) {
1196 if (shared) {
1197 wname_in_long_name = false;
1198 kcname_in_long_name = true;
1199 } else {
1200 switch (w->id) {
1201 case snd_soc_dapm_switch:
1202 case snd_soc_dapm_mixer:
1203 case snd_soc_dapm_pga:
1204 case snd_soc_dapm_effect:
1205 case snd_soc_dapm_out_drv:
1206 case snd_soc_dapm_encoder:
1207 case snd_soc_dapm_decoder:
1208 wname_in_long_name = true;
1209 kcname_in_long_name = true;
1210 break;
1211 case snd_soc_dapm_mux_named_ctl:
1212 case snd_soc_dapm_mixer_named_ctl:
1213 wname_in_long_name = false;
1214 kcname_in_long_name = true;
1215 break;
1216 case snd_soc_dapm_demux:
1217 case snd_soc_dapm_mux:
1218 wname_in_long_name = true;
1219 kcname_in_long_name = false;
1220 break;
1221 default:
1222 return -EINVAL;
1223 }
1224 }
1225 if (w->no_wname_in_kcontrol_name)
1226 wname_in_long_name = false;
1227
1228 if (wname_in_long_name && kcname_in_long_name) {
1229 /*
1230 * The control will get a prefix from the control
1231 * creation process but we're also using the same
1232 * prefix for widgets so cut the prefix off the
1233 * front of the widget name.
1234 */
1235 long_name = kasprintf(GFP_KERNEL, "%s %s",
1236 w->name + prefix_len,
1237 w->kcontrol_news[kci].name);
1238 if (long_name == NULL)
1239 return -ENOMEM;
1240
1241 name = long_name;
1242 } else if (wname_in_long_name) {
1243 long_name = NULL;
1244 name = w->name + prefix_len;
1245 } else {
1246 long_name = NULL;
1247 name = w->kcontrol_news[kci].name;
1248 }
1249
1250 kcontrol = snd_soc_cnew(&w->kcontrol_news[kci], NULL, name,
1251 prefix);
1252 if (!kcontrol) {
1253 ret = -ENOMEM;
1254 goto exit_free;
1255 }
1256
1257 kcontrol->private_free = dapm_kcontrol_free;
1258
1259 ret = dapm_kcontrol_data_alloc(w, kcontrol, name);
1260 if (ret) {
1261 snd_ctl_free_one(kcontrol);
1262 goto exit_free;
1263 }
1264
1265 ret = snd_ctl_add(card, kcontrol);
1266 if (ret < 0) {
1267 dev_err(dev,
1268 "ASoC: failed to add widget %s dapm kcontrol %s: %d\n",
1269 w->name, name, ret);
1270 goto exit_free;
1271 }
1272 }
1273
1274 ret = dapm_kcontrol_add_widget(kcontrol, w);
1275 if (ret == 0)
1276 w->kcontrols[kci] = kcontrol;
1277
1278 exit_free:
1279 kfree(long_name);
1280
1281 return ret;
1282 }
1283
1284 /* create new dapm mixer control */
dapm_new_mixer(struct snd_soc_dapm_widget * w)1285 static int dapm_new_mixer(struct snd_soc_dapm_widget *w)
1286 {
1287 int i, ret;
1288 struct snd_soc_dapm_path *path;
1289 struct dapm_kcontrol_data *data;
1290
1291 /* add kcontrol */
1292 for (i = 0; i < w->num_kcontrols; i++) {
1293 /* match name */
1294 snd_soc_dapm_widget_for_each_source_path(w, path) {
1295 /* mixer/mux paths name must match control name */
1296 if (path->name != (char *)w->kcontrol_news[i].name)
1297 continue;
1298
1299 if (!w->kcontrols[i]) {
1300 ret = dapm_create_or_share_kcontrol(w, i);
1301 if (ret < 0)
1302 return ret;
1303 }
1304
1305 dapm_kcontrol_add_path(w->kcontrols[i], path);
1306
1307 data = snd_kcontrol_chip(w->kcontrols[i]);
1308 if (data->widget)
1309 dapm_add_path(data->widget->dapm,
1310 data->widget,
1311 path->source,
1312 NULL, NULL);
1313 }
1314 }
1315
1316 return 0;
1317 }
1318
1319 /* create new dapm mux control */
dapm_new_mux(struct snd_soc_dapm_widget * w)1320 static int dapm_new_mux(struct snd_soc_dapm_widget *w)
1321 {
1322 struct snd_soc_dapm_context *dapm = w->dapm;
1323 struct device *dev = snd_soc_dapm_to_dev(dapm);
1324 enum snd_soc_dapm_direction dir;
1325 struct snd_soc_dapm_path *path;
1326 const char *type;
1327 int ret;
1328
1329 switch (w->id) {
1330 case snd_soc_dapm_mux:
1331 case snd_soc_dapm_mux_named_ctl:
1332 dir = SND_SOC_DAPM_DIR_OUT;
1333 type = "mux";
1334 break;
1335 case snd_soc_dapm_demux:
1336 dir = SND_SOC_DAPM_DIR_IN;
1337 type = "demux";
1338 break;
1339 default:
1340 return -EINVAL;
1341 }
1342
1343 if (w->num_kcontrols != 1) {
1344 dev_err(dev,
1345 "ASoC: %s %s has incorrect number of controls\n", type,
1346 w->name);
1347 return -EINVAL;
1348 }
1349
1350 if (list_empty(&w->edges[dir])) {
1351 dev_err(dev, "ASoC: %s %s has no paths\n", type, w->name);
1352 return -EINVAL;
1353 }
1354
1355 ret = dapm_create_or_share_kcontrol(w, 0);
1356 if (ret < 0)
1357 return ret;
1358
1359 snd_soc_dapm_widget_for_each_path(w, dir, path) {
1360 if (path->name)
1361 dapm_kcontrol_add_path(w->kcontrols[0], path);
1362 }
1363
1364 return 0;
1365 }
1366
1367 /* create new dapm volume control */
dapm_new_pga(struct snd_soc_dapm_widget * w)1368 static int dapm_new_pga(struct snd_soc_dapm_widget *w)
1369 {
1370 int i;
1371
1372 for (i = 0; i < w->num_kcontrols; i++) {
1373 int ret = dapm_create_or_share_kcontrol(w, i);
1374 if (ret < 0)
1375 return ret;
1376 }
1377
1378 return 0;
1379 }
1380
1381 /* create new dapm dai link control */
dapm_new_dai_link(struct snd_soc_dapm_widget * w)1382 static int dapm_new_dai_link(struct snd_soc_dapm_widget *w)
1383 {
1384 int i;
1385 struct snd_soc_pcm_runtime *rtd = w->priv;
1386
1387 /* create control for links with > 1 config */
1388 if (rtd->dai_link->num_c2c_params <= 1)
1389 return 0;
1390
1391 /* add kcontrol */
1392 for (i = 0; i < w->num_kcontrols; i++) {
1393 struct snd_soc_dapm_context *dapm = w->dapm;
1394 struct device *dev = snd_soc_dapm_to_dev(dapm);
1395 struct snd_card *card = dapm->card->snd_card;
1396 struct snd_kcontrol *kcontrol = snd_soc_cnew(&w->kcontrol_news[i],
1397 w, w->name, NULL);
1398 int ret = snd_ctl_add(card, kcontrol);
1399
1400 if (ret < 0) {
1401 dev_err(dev,
1402 "ASoC: failed to add widget %s dapm kcontrol %s: %d\n",
1403 w->name, w->kcontrol_news[i].name, ret);
1404 return ret;
1405 }
1406 kcontrol->private_data = w;
1407 w->kcontrols[i] = kcontrol;
1408 }
1409
1410 return 0;
1411 }
1412
1413 /* We implement power down on suspend by checking the power state of
1414 * the ALSA card - when we are suspending the ALSA state for the card
1415 * is set to D3.
1416 */
dapm_suspend_check(struct snd_soc_dapm_widget * widget)1417 static int dapm_suspend_check(struct snd_soc_dapm_widget *widget)
1418 {
1419 struct device *dev = snd_soc_dapm_to_dev(widget->dapm);
1420 int level = snd_power_get_state(widget->dapm->card->snd_card);
1421
1422 switch (level) {
1423 case SNDRV_CTL_POWER_D3hot:
1424 case SNDRV_CTL_POWER_D3cold:
1425 if (widget->ignore_suspend)
1426 dev_dbg(dev, "ASoC: %s ignoring suspend\n",
1427 widget->name);
1428 return widget->ignore_suspend;
1429 default:
1430 return 1;
1431 }
1432 }
1433
dapm_widget_list_free(struct snd_soc_dapm_widget_list ** list)1434 static void dapm_widget_list_free(struct snd_soc_dapm_widget_list **list)
1435 {
1436 kfree(*list);
1437 }
1438
dapm_widget_list_create(struct snd_soc_dapm_widget_list ** list,struct list_head * widgets)1439 static int dapm_widget_list_create(struct snd_soc_dapm_widget_list **list,
1440 struct list_head *widgets)
1441 {
1442 struct snd_soc_dapm_widget *w;
1443 struct list_head *it;
1444 unsigned int size = 0;
1445 unsigned int i = 0;
1446
1447 list_for_each(it, widgets)
1448 size++;
1449
1450 *list = kzalloc_flex(**list, widgets, size);
1451 if (*list == NULL)
1452 return -ENOMEM;
1453
1454 (*list)->num_widgets = size;
1455
1456 list_for_each_entry(w, widgets, work_list)
1457 (*list)->widgets[i++] = w;
1458
1459 (*list)->num_widgets = i;
1460
1461 return 0;
1462 }
1463
1464 /*
1465 * Recursively reset the cached number of inputs or outputs for the specified
1466 * widget and all widgets that can be reached via incoming or outcoming paths
1467 * from the widget.
1468 */
dapm_invalidate_paths_ep(struct snd_soc_dapm_widget * widget,enum snd_soc_dapm_direction dir)1469 static void dapm_invalidate_paths_ep(struct snd_soc_dapm_widget *widget,
1470 enum snd_soc_dapm_direction dir)
1471 {
1472 enum snd_soc_dapm_direction rdir = DAPM_DIR_REVERSE(dir);
1473 struct snd_soc_dapm_path *path;
1474
1475 widget->endpoints[dir] = -1;
1476
1477 snd_soc_dapm_widget_for_each_path(widget, rdir, path) {
1478 if (path->is_supply)
1479 continue;
1480
1481 if (path->walking)
1482 return;
1483
1484 if (path->connect) {
1485 path->walking = 1;
1486 dapm_invalidate_paths_ep(path->node[dir], dir);
1487 path->walking = 0;
1488 }
1489 }
1490 }
1491
1492 /*
1493 * Common implementation for is_connected_output_ep() and
1494 * is_connected_input_ep(). The function is inlined since the combined size of
1495 * the two specialized functions is only marginally larger then the size of the
1496 * generic function and at the same time the fast path of the specialized
1497 * functions is significantly smaller than the generic function.
1498 */
dapm_is_connected_ep(struct snd_soc_dapm_widget * widget,struct list_head * list,enum snd_soc_dapm_direction dir,int (* fn)(struct snd_soc_dapm_widget *,struct list_head *,bool (* custom_stop_condition)(struct snd_soc_dapm_widget *,enum snd_soc_dapm_direction)),bool (* custom_stop_condition)(struct snd_soc_dapm_widget *,enum snd_soc_dapm_direction))1499 static __always_inline int dapm_is_connected_ep(struct snd_soc_dapm_widget *widget,
1500 struct list_head *list, enum snd_soc_dapm_direction dir,
1501 int (*fn)(struct snd_soc_dapm_widget *, struct list_head *,
1502 bool (*custom_stop_condition)(struct snd_soc_dapm_widget *,
1503 enum snd_soc_dapm_direction)),
1504 bool (*custom_stop_condition)(struct snd_soc_dapm_widget *,
1505 enum snd_soc_dapm_direction))
1506 {
1507 enum snd_soc_dapm_direction rdir = DAPM_DIR_REVERSE(dir);
1508 struct snd_soc_dapm_path *path;
1509 int con = 0;
1510
1511 if (widget->endpoints[dir] >= 0)
1512 return widget->endpoints[dir];
1513
1514 DAPM_UPDATE_STAT(widget, path_checks);
1515
1516 /* do we need to add this widget to the list ? */
1517 if (list)
1518 list_add_tail(&widget->work_list, list);
1519
1520 if (custom_stop_condition && custom_stop_condition(widget, dir)) {
1521 list = NULL;
1522 custom_stop_condition = NULL;
1523 }
1524
1525 if ((widget->is_ep & SND_SOC_DAPM_DIR_TO_EP(dir)) && widget->connected) {
1526 widget->endpoints[dir] = dapm_suspend_check(widget);
1527 return widget->endpoints[dir];
1528 }
1529
1530 snd_soc_dapm_widget_for_each_path(widget, rdir, path) {
1531 DAPM_UPDATE_STAT(widget, neighbour_checks);
1532
1533 if (path->is_supply)
1534 continue;
1535
1536 if (path->walking)
1537 return 1;
1538
1539 trace_snd_soc_dapm_path(widget, dir, path);
1540
1541 if (path->connect) {
1542 path->walking = 1;
1543 con += fn(path->node[dir], list, custom_stop_condition);
1544 path->walking = 0;
1545 }
1546 }
1547
1548 widget->endpoints[dir] = con;
1549
1550 return con;
1551 }
1552
1553 /*
1554 * Recursively check for a completed path to an active or physically connected
1555 * output widget. Returns number of complete paths.
1556 *
1557 * Optionally, can be supplied with a function acting as a stopping condition.
1558 * This function takes the dapm widget currently being examined and the walk
1559 * direction as an arguments, it should return true if widgets from that point
1560 * in the graph onwards should not be added to the widget list.
1561 */
dapm_is_connected_output_ep(struct snd_soc_dapm_widget * widget,struct list_head * list,bool (* custom_stop_condition)(struct snd_soc_dapm_widget * i,enum snd_soc_dapm_direction))1562 static int dapm_is_connected_output_ep(struct snd_soc_dapm_widget *widget,
1563 struct list_head *list,
1564 bool (*custom_stop_condition)(struct snd_soc_dapm_widget *i,
1565 enum snd_soc_dapm_direction))
1566 {
1567 return dapm_is_connected_ep(widget, list, SND_SOC_DAPM_DIR_OUT,
1568 dapm_is_connected_output_ep, custom_stop_condition);
1569 }
1570
1571 /*
1572 * Recursively check for a completed path to an active or physically connected
1573 * input widget. Returns number of complete paths.
1574 *
1575 * Optionally, can be supplied with a function acting as a stopping condition.
1576 * This function takes the dapm widget currently being examined and the walk
1577 * direction as an arguments, it should return true if the walk should be
1578 * stopped and false otherwise.
1579 */
dapm_is_connected_input_ep(struct snd_soc_dapm_widget * widget,struct list_head * list,bool (* custom_stop_condition)(struct snd_soc_dapm_widget * i,enum snd_soc_dapm_direction))1580 static int dapm_is_connected_input_ep(struct snd_soc_dapm_widget *widget,
1581 struct list_head *list,
1582 bool (*custom_stop_condition)(struct snd_soc_dapm_widget *i,
1583 enum snd_soc_dapm_direction))
1584 {
1585 return dapm_is_connected_ep(widget, list, SND_SOC_DAPM_DIR_IN,
1586 dapm_is_connected_input_ep, custom_stop_condition);
1587 }
1588
1589 /**
1590 * snd_soc_dapm_dai_get_connected_widgets - query audio path and it's widgets.
1591 * @dai: the soc DAI.
1592 * @stream: stream direction.
1593 * @list: list of active widgets for this stream.
1594 * @custom_stop_condition: (optional) a function meant to stop the widget graph
1595 * walk based on custom logic.
1596 *
1597 * Queries DAPM graph as to whether a valid audio stream path exists for
1598 * the initial stream specified by name. This takes into account
1599 * current mixer and mux kcontrol settings. Creates list of valid widgets.
1600 *
1601 * Optionally, can be supplied with a function acting as a stopping condition.
1602 * This function takes the dapm widget currently being examined and the walk
1603 * direction as an arguments, it should return true if the walk should be
1604 * stopped and false otherwise.
1605 *
1606 * Returns the number of valid paths or negative error.
1607 */
snd_soc_dapm_dai_get_connected_widgets(struct snd_soc_dai * dai,int stream,struct snd_soc_dapm_widget_list ** list,bool (* custom_stop_condition)(struct snd_soc_dapm_widget *,enum snd_soc_dapm_direction))1608 int snd_soc_dapm_dai_get_connected_widgets(struct snd_soc_dai *dai, int stream,
1609 struct snd_soc_dapm_widget_list **list,
1610 bool (*custom_stop_condition)(struct snd_soc_dapm_widget *,
1611 enum snd_soc_dapm_direction))
1612 {
1613 struct snd_soc_card *card = dai->component->card;
1614 struct snd_soc_dapm_widget *w = snd_soc_dai_get_widget(dai, stream);
1615 LIST_HEAD(widgets);
1616 int paths;
1617 int ret;
1618
1619 snd_soc_dapm_mutex_lock(card);
1620
1621 if (stream == SNDRV_PCM_STREAM_PLAYBACK) {
1622 dapm_invalidate_paths_ep(w, SND_SOC_DAPM_DIR_OUT);
1623 paths = dapm_is_connected_output_ep(w, &widgets,
1624 custom_stop_condition);
1625 } else {
1626 dapm_invalidate_paths_ep(w, SND_SOC_DAPM_DIR_IN);
1627 paths = dapm_is_connected_input_ep(w, &widgets,
1628 custom_stop_condition);
1629 }
1630
1631 /* Drop starting point */
1632 list_del(widgets.next);
1633
1634 ret = dapm_widget_list_create(list, &widgets);
1635 if (ret)
1636 paths = ret;
1637
1638 trace_snd_soc_dapm_connected(paths, stream);
1639 snd_soc_dapm_mutex_unlock(card);
1640
1641 return paths;
1642 }
1643 EXPORT_SYMBOL_GPL(snd_soc_dapm_dai_get_connected_widgets);
1644
snd_soc_dapm_dai_free_widgets(struct snd_soc_dapm_widget_list ** list)1645 void snd_soc_dapm_dai_free_widgets(struct snd_soc_dapm_widget_list **list)
1646 {
1647 dapm_widget_list_free(list);
1648 }
1649 EXPORT_SYMBOL_GPL(snd_soc_dapm_dai_free_widgets);
1650
1651 /*
1652 * Handler for regulator supply widget.
1653 */
snd_soc_dapm_regulator_event(struct snd_soc_dapm_widget * w,struct snd_kcontrol * kcontrol,int event)1654 int snd_soc_dapm_regulator_event(struct snd_soc_dapm_widget *w,
1655 struct snd_kcontrol *kcontrol, int event)
1656 {
1657 struct device *dev = snd_soc_dapm_to_dev(w->dapm);
1658 int ret;
1659
1660 dapm_async_complete(w->dapm);
1661
1662 if (SND_SOC_DAPM_EVENT_ON(event)) {
1663 if (w->on_val & SND_SOC_DAPM_REGULATOR_BYPASS) {
1664 ret = regulator_allow_bypass(w->regulator, false);
1665 if (ret != 0)
1666 dev_warn(dev,
1667 "ASoC: Failed to unbypass %s: %d\n",
1668 w->name, ret);
1669 }
1670
1671 return regulator_enable(w->regulator);
1672 } else {
1673 if (w->on_val & SND_SOC_DAPM_REGULATOR_BYPASS) {
1674 ret = regulator_allow_bypass(w->regulator, true);
1675 if (ret != 0)
1676 dev_warn(dev,
1677 "ASoC: Failed to bypass %s: %d\n",
1678 w->name, ret);
1679 }
1680
1681 return regulator_disable_deferred(w->regulator, w->shift);
1682 }
1683 }
1684 EXPORT_SYMBOL_GPL(snd_soc_dapm_regulator_event);
1685
1686 /*
1687 * Handler for pinctrl widget.
1688 */
snd_soc_dapm_pinctrl_event(struct snd_soc_dapm_widget * w,struct snd_kcontrol * kcontrol,int event)1689 int snd_soc_dapm_pinctrl_event(struct snd_soc_dapm_widget *w,
1690 struct snd_kcontrol *kcontrol, int event)
1691 {
1692 struct snd_soc_dapm_pinctrl_priv *priv = w->priv;
1693 struct pinctrl *p = w->pinctrl;
1694 struct pinctrl_state *s;
1695
1696 if (!p || !priv)
1697 return -EIO;
1698
1699 if (SND_SOC_DAPM_EVENT_ON(event))
1700 s = pinctrl_lookup_state(p, priv->active_state);
1701 else
1702 s = pinctrl_lookup_state(p, priv->sleep_state);
1703
1704 if (IS_ERR(s))
1705 return PTR_ERR(s);
1706
1707 return pinctrl_select_state(p, s);
1708 }
1709 EXPORT_SYMBOL_GPL(snd_soc_dapm_pinctrl_event);
1710
1711 /*
1712 * Handler for clock supply widget.
1713 */
snd_soc_dapm_clock_event(struct snd_soc_dapm_widget * w,struct snd_kcontrol * kcontrol,int event)1714 int snd_soc_dapm_clock_event(struct snd_soc_dapm_widget *w,
1715 struct snd_kcontrol *kcontrol, int event)
1716 {
1717 if (!w->clk)
1718 return -EIO;
1719
1720 dapm_async_complete(w->dapm);
1721
1722 if (SND_SOC_DAPM_EVENT_ON(event)) {
1723 return clk_prepare_enable(w->clk);
1724 } else {
1725 clk_disable_unprepare(w->clk);
1726 return 0;
1727 }
1728
1729 return 0;
1730 }
1731 EXPORT_SYMBOL_GPL(snd_soc_dapm_clock_event);
1732
dapm_widget_power_check(struct snd_soc_dapm_widget * w)1733 static int dapm_widget_power_check(struct snd_soc_dapm_widget *w)
1734 {
1735 if (w->power_checked)
1736 return w->new_power;
1737
1738 if (w->force)
1739 w->new_power = 1;
1740 else
1741 w->new_power = w->power_check(w);
1742
1743 w->power_checked = true;
1744
1745 return w->new_power;
1746 }
1747
1748 /* Generic check to see if a widget should be powered. */
dapm_generic_check_power(struct snd_soc_dapm_widget * w)1749 static int dapm_generic_check_power(struct snd_soc_dapm_widget *w)
1750 {
1751 int in, out;
1752
1753 DAPM_UPDATE_STAT(w, power_checks);
1754
1755 in = dapm_is_connected_input_ep(w, NULL, NULL);
1756 out = dapm_is_connected_output_ep(w, NULL, NULL);
1757 return out != 0 && in != 0;
1758 }
1759
1760 /* Check to see if a power supply is needed */
dapm_supply_check_power(struct snd_soc_dapm_widget * w)1761 static int dapm_supply_check_power(struct snd_soc_dapm_widget *w)
1762 {
1763 struct snd_soc_dapm_path *path;
1764
1765 DAPM_UPDATE_STAT(w, power_checks);
1766
1767 /* Check if one of our outputs is connected */
1768 snd_soc_dapm_widget_for_each_sink_path(w, path) {
1769 DAPM_UPDATE_STAT(w, neighbour_checks);
1770
1771 if (path->connected &&
1772 !path->connected(path->source, path->sink))
1773 continue;
1774
1775 if (dapm_widget_power_check(path->sink))
1776 return 1;
1777 }
1778
1779 return 0;
1780 }
1781
dapm_always_on_check_power(struct snd_soc_dapm_widget * w)1782 static int dapm_always_on_check_power(struct snd_soc_dapm_widget *w)
1783 {
1784 return w->connected;
1785 }
1786
dapm_seq_compare(struct snd_soc_dapm_widget * a,struct snd_soc_dapm_widget * b,bool power_up)1787 static int dapm_seq_compare(struct snd_soc_dapm_widget *a,
1788 struct snd_soc_dapm_widget *b,
1789 bool power_up)
1790 {
1791 int *sort;
1792
1793 BUILD_BUG_ON(ARRAY_SIZE(dapm_up_seq) != SND_SOC_DAPM_TYPE_COUNT);
1794 BUILD_BUG_ON(ARRAY_SIZE(dapm_down_seq) != SND_SOC_DAPM_TYPE_COUNT);
1795
1796 if (power_up)
1797 sort = dapm_up_seq;
1798 else
1799 sort = dapm_down_seq;
1800
1801 WARN_ONCE(sort[a->id] == 0, "offset a->id %d not initialized\n", a->id);
1802 WARN_ONCE(sort[b->id] == 0, "offset b->id %d not initialized\n", b->id);
1803
1804 if (sort[a->id] != sort[b->id])
1805 return sort[a->id] - sort[b->id];
1806 if (a->subseq != b->subseq) {
1807 if (power_up)
1808 return a->subseq - b->subseq;
1809 else
1810 return b->subseq - a->subseq;
1811 }
1812 if (a->reg != b->reg)
1813 return a->reg - b->reg;
1814 if (a->dapm != b->dapm)
1815 return (unsigned long)a->dapm - (unsigned long)b->dapm;
1816
1817 return 0;
1818 }
1819
1820 /* Insert a widget in order into a DAPM power sequence. */
dapm_seq_insert(struct snd_soc_dapm_widget * new_widget,struct list_head * list,bool power_up)1821 static void dapm_seq_insert(struct snd_soc_dapm_widget *new_widget,
1822 struct list_head *list,
1823 bool power_up)
1824 {
1825 struct snd_soc_dapm_widget *w;
1826
1827 list_for_each_entry(w, list, power_list)
1828 if (dapm_seq_compare(new_widget, w, power_up) < 0) {
1829 list_add_tail(&new_widget->power_list, &w->power_list);
1830 return;
1831 }
1832
1833 list_add_tail(&new_widget->power_list, list);
1834 }
1835
dapm_seq_check_event(struct snd_soc_card * card,struct snd_soc_dapm_widget * w,int event)1836 static void dapm_seq_check_event(struct snd_soc_card *card,
1837 struct snd_soc_dapm_widget *w, int event)
1838 {
1839 struct device *dev = card->dev;
1840 const char *ev_name;
1841 int power;
1842
1843 switch (event) {
1844 case SND_SOC_DAPM_PRE_PMU:
1845 ev_name = "PRE_PMU";
1846 power = 1;
1847 break;
1848 case SND_SOC_DAPM_POST_PMU:
1849 ev_name = "POST_PMU";
1850 power = 1;
1851 break;
1852 case SND_SOC_DAPM_PRE_PMD:
1853 ev_name = "PRE_PMD";
1854 power = 0;
1855 break;
1856 case SND_SOC_DAPM_POST_PMD:
1857 ev_name = "POST_PMD";
1858 power = 0;
1859 break;
1860 case SND_SOC_DAPM_WILL_PMU:
1861 ev_name = "WILL_PMU";
1862 power = 1;
1863 break;
1864 case SND_SOC_DAPM_WILL_PMD:
1865 ev_name = "WILL_PMD";
1866 power = 0;
1867 break;
1868 default:
1869 WARN(1, "Unknown event %d\n", event);
1870 return;
1871 }
1872
1873 if (w->new_power != power)
1874 return;
1875
1876 if (w->event && (w->event_flags & event)) {
1877 int ret;
1878
1879 dapm_pop_dbg(dev, "pop test : %s %s\n", w->name, ev_name);
1880 dapm_async_complete(w->dapm);
1881 trace_snd_soc_dapm_widget_event_start(w, event);
1882 ret = w->event(w, NULL, event);
1883 trace_snd_soc_dapm_widget_event_done(w, event);
1884 if (ret < 0)
1885 dev_err(dev, "ASoC: %s: %s event failed: %d\n",
1886 ev_name, w->name, ret);
1887 }
1888 }
1889
1890 /* Apply the coalesced changes from a DAPM sequence */
dapm_seq_run_coalesced(struct snd_soc_card * card,struct list_head * pending)1891 static void dapm_seq_run_coalesced(struct snd_soc_card *card,
1892 struct list_head *pending)
1893 {
1894 struct device *dev = card->dev;
1895 struct snd_soc_dapm_context *dapm;
1896 struct snd_soc_dapm_widget *w;
1897 int reg;
1898 unsigned int value = 0;
1899 unsigned int mask = 0;
1900
1901 w = list_first_entry(pending, struct snd_soc_dapm_widget, power_list);
1902 reg = w->reg;
1903 dapm = w->dapm;
1904
1905 list_for_each_entry(w, pending, power_list) {
1906 WARN_ON(reg != w->reg || dapm != w->dapm);
1907 w->power = w->new_power;
1908
1909 mask |= w->mask << w->shift;
1910 if (w->power)
1911 value |= w->on_val << w->shift;
1912 else
1913 value |= w->off_val << w->shift;
1914
1915 dapm_pop_dbg(dev,
1916 "pop test : Queue %s: reg=0x%x, 0x%x/0x%x\n",
1917 w->name, reg, value, mask);
1918
1919 /* Check for events */
1920 dapm_seq_check_event(card, w, SND_SOC_DAPM_PRE_PMU);
1921 dapm_seq_check_event(card, w, SND_SOC_DAPM_PRE_PMD);
1922 }
1923
1924 if (reg >= 0) {
1925 /* Any widget will do, they should all be updating the
1926 * same register.
1927 */
1928
1929 dapm_pop_dbg(dev,
1930 "pop test : Applying 0x%x/0x%x to %x in %dms\n",
1931 value, mask, reg, pop_time);
1932 dapm_pop_wait();
1933 dapm_update_bits(dapm, reg, mask, value);
1934 }
1935
1936 list_for_each_entry(w, pending, power_list) {
1937 dapm_seq_check_event(card, w, SND_SOC_DAPM_POST_PMU);
1938 dapm_seq_check_event(card, w, SND_SOC_DAPM_POST_PMD);
1939 }
1940 }
1941
1942 /* Apply a DAPM power sequence.
1943 *
1944 * We walk over a pre-sorted list of widgets to apply power to. In
1945 * order to minimise the number of writes to the device required
1946 * multiple widgets will be updated in a single write where possible.
1947 * Currently anything that requires more than a single write is not
1948 * handled.
1949 */
dapm_seq_run(struct snd_soc_card * card,struct list_head * list,int event,bool power_up)1950 static void dapm_seq_run(struct snd_soc_card *card,
1951 struct list_head *list, int event, bool power_up)
1952 {
1953 struct device *dev = card->dev;
1954 struct snd_soc_dapm_widget *w, *n;
1955 struct snd_soc_dapm_context *d;
1956 LIST_HEAD(pending);
1957 int cur_sort = -1;
1958 int cur_subseq = -1;
1959 int cur_reg = SND_SOC_NOPM;
1960 struct snd_soc_dapm_context *cur_dapm = NULL;
1961 int i;
1962 int *sort;
1963
1964 if (power_up)
1965 sort = dapm_up_seq;
1966 else
1967 sort = dapm_down_seq;
1968
1969 list_for_each_entry_safe(w, n, list, power_list) {
1970 int ret = 0;
1971
1972 /* Do we need to apply any queued changes? */
1973 if (sort[w->id] != cur_sort || w->reg != cur_reg ||
1974 w->dapm != cur_dapm || w->subseq != cur_subseq) {
1975 if (!list_empty(&pending))
1976 dapm_seq_run_coalesced(card, &pending);
1977
1978 if (cur_dapm && cur_dapm->component) {
1979 for (i = 0; i < ARRAY_SIZE(dapm_up_seq); i++)
1980 if (sort[i] == cur_sort)
1981 snd_soc_component_seq_notifier(
1982 cur_dapm->component,
1983 i, cur_subseq);
1984 }
1985
1986 if (cur_dapm && w->dapm != cur_dapm)
1987 dapm_async_complete(cur_dapm);
1988
1989 INIT_LIST_HEAD(&pending);
1990 cur_sort = -1;
1991 cur_subseq = INT_MIN;
1992 cur_reg = SND_SOC_NOPM;
1993 cur_dapm = NULL;
1994 }
1995
1996 switch (w->id) {
1997 case snd_soc_dapm_pre:
1998 if (!w->event)
1999 continue;
2000
2001 if (event == SND_SOC_DAPM_STREAM_START)
2002 ret = w->event(w,
2003 NULL, SND_SOC_DAPM_PRE_PMU);
2004 else if (event == SND_SOC_DAPM_STREAM_STOP)
2005 ret = w->event(w,
2006 NULL, SND_SOC_DAPM_PRE_PMD);
2007 break;
2008
2009 case snd_soc_dapm_post:
2010 if (!w->event)
2011 continue;
2012
2013 if (event == SND_SOC_DAPM_STREAM_START)
2014 ret = w->event(w,
2015 NULL, SND_SOC_DAPM_POST_PMU);
2016 else if (event == SND_SOC_DAPM_STREAM_STOP)
2017 ret = w->event(w,
2018 NULL, SND_SOC_DAPM_POST_PMD);
2019 break;
2020
2021 default:
2022 /* Queue it up for application */
2023 cur_sort = sort[w->id];
2024 cur_subseq = w->subseq;
2025 cur_reg = w->reg;
2026 cur_dapm = w->dapm;
2027 list_move(&w->power_list, &pending);
2028 break;
2029 }
2030
2031 if (ret < 0)
2032 dev_err(dev,
2033 "ASoC: Failed to apply widget power: %d\n", ret);
2034 }
2035
2036 if (!list_empty(&pending))
2037 dapm_seq_run_coalesced(card, &pending);
2038
2039 if (cur_dapm && cur_dapm->component) {
2040 for (i = 0; i < ARRAY_SIZE(dapm_up_seq); i++)
2041 if (sort[i] == cur_sort)
2042 snd_soc_component_seq_notifier(
2043 cur_dapm->component,
2044 i, cur_subseq);
2045 }
2046
2047 for_each_card_dapms(card, d)
2048 dapm_async_complete(d);
2049 }
2050
dapm_widget_update(struct snd_soc_card * card,struct snd_soc_dapm_update * update)2051 static void dapm_widget_update(struct snd_soc_card *card, struct snd_soc_dapm_update *update)
2052 {
2053 struct device *dev = card->dev;
2054 struct snd_soc_dapm_widget_list *wlist;
2055 struct snd_soc_dapm_widget *w = NULL;
2056 unsigned int wi;
2057 int ret;
2058
2059 if (!update || !dapm_kcontrol_is_powered(update->kcontrol))
2060 return;
2061
2062 wlist = dapm_kcontrol_get_wlist(update->kcontrol);
2063
2064 for_each_dapm_widgets(wlist, wi, w) {
2065 if (w->event && (w->event_flags & SND_SOC_DAPM_PRE_REG)) {
2066 ret = w->event(w, update->kcontrol, SND_SOC_DAPM_PRE_REG);
2067 if (ret != 0)
2068 dev_err(dev, "ASoC: %s DAPM pre-event failed: %d\n",
2069 w->name, ret);
2070 }
2071 }
2072
2073 if (!w)
2074 return;
2075
2076 ret = dapm_update_bits(w->dapm, update->reg, update->mask,
2077 update->val);
2078 if (ret < 0)
2079 dev_err(dev, "ASoC: %s DAPM update failed: %d\n",
2080 w->name, ret);
2081
2082 if (update->has_second_set) {
2083 ret = dapm_update_bits(w->dapm, update->reg2,
2084 update->mask2, update->val2);
2085 if (ret < 0)
2086 dev_err(dev,
2087 "ASoC: %s DAPM update failed: %d\n",
2088 w->name, ret);
2089 }
2090
2091 for_each_dapm_widgets(wlist, wi, w) {
2092 if (w->event && (w->event_flags & SND_SOC_DAPM_POST_REG)) {
2093 ret = w->event(w, update->kcontrol, SND_SOC_DAPM_POST_REG);
2094 if (ret != 0)
2095 dev_err(dev, "ASoC: %s DAPM post-event failed: %d\n",
2096 w->name, ret);
2097 }
2098 }
2099 }
2100
2101 /* Async callback run prior to DAPM sequences - brings to _PREPARE if
2102 * they're changing state.
2103 */
dapm_pre_sequence_async(void * data,async_cookie_t cookie)2104 static void dapm_pre_sequence_async(void *data, async_cookie_t cookie)
2105 {
2106 struct snd_soc_dapm_context *dapm = data;
2107 struct device *dev = snd_soc_dapm_to_dev(dapm);
2108 int ret;
2109
2110 /* If we're off and we're not supposed to go into STANDBY */
2111 if (dapm->bias_level == SND_SOC_BIAS_OFF &&
2112 dapm->target_bias_level != SND_SOC_BIAS_OFF) {
2113 if (dev && cookie)
2114 pm_runtime_get_sync(dev);
2115
2116 ret = snd_soc_dapm_set_bias_level(dapm, SND_SOC_BIAS_STANDBY);
2117 if (ret != 0)
2118 dev_err(dev,
2119 "ASoC: Failed to turn on bias: %d\n", ret);
2120 }
2121
2122 /* Prepare for a transition to ON or away from ON */
2123 if ((dapm->target_bias_level == SND_SOC_BIAS_ON &&
2124 dapm->bias_level != SND_SOC_BIAS_ON) ||
2125 (dapm->target_bias_level != SND_SOC_BIAS_ON &&
2126 dapm->bias_level == SND_SOC_BIAS_ON)) {
2127 ret = snd_soc_dapm_set_bias_level(dapm, SND_SOC_BIAS_PREPARE);
2128 if (ret != 0)
2129 dev_err(dev,
2130 "ASoC: Failed to prepare bias: %d\n", ret);
2131 }
2132 }
2133
2134 /* Async callback run prior to DAPM sequences - brings to their final
2135 * state.
2136 */
dapm_post_sequence_async(void * data,async_cookie_t cookie)2137 static void dapm_post_sequence_async(void *data, async_cookie_t cookie)
2138 {
2139 struct snd_soc_dapm_context *dapm = data;
2140 struct device *dev = snd_soc_dapm_to_dev(dapm);
2141 int ret;
2142
2143 /* If we just powered the last thing off drop to standby bias */
2144 if (dapm->bias_level == SND_SOC_BIAS_PREPARE &&
2145 (dapm->target_bias_level == SND_SOC_BIAS_STANDBY ||
2146 dapm->target_bias_level == SND_SOC_BIAS_OFF)) {
2147 ret = snd_soc_dapm_set_bias_level(dapm, SND_SOC_BIAS_STANDBY);
2148 if (ret != 0)
2149 dev_err(dev, "ASoC: Failed to apply standby bias: %d\n", ret);
2150 }
2151
2152 /* If we're in standby and can support bias off then do that */
2153 if (dapm->bias_level == SND_SOC_BIAS_STANDBY &&
2154 dapm->target_bias_level == SND_SOC_BIAS_OFF) {
2155 ret = snd_soc_dapm_set_bias_level(dapm, SND_SOC_BIAS_OFF);
2156 if (ret != 0)
2157 dev_err(dev, "ASoC: Failed to turn off bias: %d\n", ret);
2158
2159 if (dev && cookie)
2160 pm_runtime_put(dev);
2161 }
2162
2163 /* If we just powered up then move to active bias */
2164 if (dapm->bias_level == SND_SOC_BIAS_PREPARE &&
2165 dapm->target_bias_level == SND_SOC_BIAS_ON) {
2166 ret = snd_soc_dapm_set_bias_level(dapm, SND_SOC_BIAS_ON);
2167 if (ret != 0)
2168 dev_err(dev, "ASoC: Failed to apply active bias: %d\n", ret);
2169 }
2170 }
2171
dapm_widget_set_peer_power(struct snd_soc_dapm_widget * peer,bool power,bool connect)2172 static void dapm_widget_set_peer_power(struct snd_soc_dapm_widget *peer,
2173 bool power, bool connect)
2174 {
2175 /* If a connection is being made or broken then that update
2176 * will have marked the peer dirty, otherwise the widgets are
2177 * not connected and this update has no impact. */
2178 if (!connect)
2179 return;
2180
2181 /* If the peer is already in the state we're moving to then we
2182 * won't have an impact on it. */
2183 if (power != peer->power)
2184 dapm_mark_dirty(peer, "peer state change");
2185 }
2186
dapm_power_one_widget(struct snd_soc_dapm_widget * w,struct list_head * up_list,struct list_head * down_list)2187 static void dapm_power_one_widget(struct snd_soc_dapm_widget *w,
2188 struct list_head *up_list,
2189 struct list_head *down_list)
2190 {
2191 struct snd_soc_dapm_path *path;
2192 int power;
2193
2194 switch (w->id) {
2195 case snd_soc_dapm_pre:
2196 power = 0;
2197 goto end;
2198 case snd_soc_dapm_post:
2199 power = 1;
2200 goto end;
2201 default:
2202 break;
2203 }
2204
2205 power = dapm_widget_power_check(w);
2206
2207 if (w->power == power)
2208 return;
2209
2210 trace_snd_soc_dapm_widget_power(w, power);
2211
2212 /*
2213 * If we changed our power state perhaps our neigbours
2214 * changed also.
2215 */
2216 snd_soc_dapm_widget_for_each_source_path(w, path)
2217 dapm_widget_set_peer_power(path->source, power, path->connect);
2218
2219 /*
2220 * Supplies can't affect their outputs, only their inputs
2221 */
2222 if (!w->is_supply)
2223 snd_soc_dapm_widget_for_each_sink_path(w, path)
2224 dapm_widget_set_peer_power(path->sink, power, path->connect);
2225
2226 end:
2227 if (power)
2228 dapm_seq_insert(w, up_list, true);
2229 else
2230 dapm_seq_insert(w, down_list, false);
2231 }
2232
snd_soc_dapm_get_idle_bias(struct snd_soc_dapm_context * dapm)2233 bool snd_soc_dapm_get_idle_bias(struct snd_soc_dapm_context *dapm)
2234 {
2235 if (dapm->idle_bias) {
2236 struct snd_soc_component *component = snd_soc_dapm_to_component(dapm);
2237 unsigned int state = snd_power_get_state(dapm->card->snd_card);
2238
2239 if ((state == SNDRV_CTL_POWER_D3hot || (state == SNDRV_CTL_POWER_D3cold)) &&
2240 component)
2241 return !component->driver->suspend_bias_off;
2242 }
2243
2244 return dapm->idle_bias;
2245 }
2246 EXPORT_SYMBOL_GPL(snd_soc_dapm_get_idle_bias);
2247
snd_soc_dapm_set_idle_bias(struct snd_soc_dapm_context * dapm,bool on)2248 void snd_soc_dapm_set_idle_bias(struct snd_soc_dapm_context *dapm, bool on)
2249 {
2250 dapm->idle_bias = on;
2251 }
2252 EXPORT_SYMBOL_GPL(snd_soc_dapm_set_idle_bias);
2253
2254 /*
2255 * Scan each dapm widget for complete audio path.
2256 * A complete path is a route that has valid endpoints i.e.:-
2257 *
2258 * o DAC to output pin.
2259 * o Input pin to ADC.
2260 * o Input pin to Output pin (bypass, sidetone)
2261 * o DAC to ADC (loopback).
2262 */
dapm_power_widgets(struct snd_soc_card * card,int event,struct snd_soc_dapm_update * update)2263 static int dapm_power_widgets(struct snd_soc_card *card, int event,
2264 struct snd_soc_dapm_update *update)
2265 {
2266 struct snd_soc_dapm_context *dapm = snd_soc_card_to_dapm(card);
2267 struct snd_soc_dapm_widget *w;
2268 struct snd_soc_dapm_context *d;
2269 LIST_HEAD(up_list);
2270 LIST_HEAD(down_list);
2271 ASYNC_DOMAIN_EXCLUSIVE(async_domain);
2272 enum snd_soc_bias_level bias;
2273 int ret;
2274
2275 snd_soc_dapm_mutex_assert_held(card);
2276
2277 trace_snd_soc_dapm_start(card, event);
2278
2279 for_each_card_dapms(card, d) {
2280 if (snd_soc_dapm_get_idle_bias(d))
2281 d->target_bias_level = SND_SOC_BIAS_STANDBY;
2282 else
2283 d->target_bias_level = SND_SOC_BIAS_OFF;
2284 }
2285
2286 dapm_reset(card);
2287
2288 /* Check which widgets we need to power and store them in
2289 * lists indicating if they should be powered up or down. We
2290 * only check widgets that have been flagged as dirty but note
2291 * that new widgets may be added to the dirty list while we
2292 * iterate.
2293 */
2294 list_for_each_entry(w, &card->dapm_dirty, dirty) {
2295 dapm_power_one_widget(w, &up_list, &down_list);
2296 }
2297
2298 for_each_card_widgets(card, w) {
2299 switch (w->id) {
2300 case snd_soc_dapm_pre:
2301 case snd_soc_dapm_post:
2302 /* These widgets always need to be powered */
2303 break;
2304 default:
2305 list_del_init(&w->dirty);
2306 break;
2307 }
2308
2309 if (w->new_power) {
2310 d = w->dapm;
2311
2312 /* Supplies and micbiases only bring the
2313 * context up to STANDBY as unless something
2314 * else is active and passing audio they
2315 * generally don't require full power. Signal
2316 * generators are virtual pins and have no
2317 * power impact themselves.
2318 */
2319 switch (w->id) {
2320 case snd_soc_dapm_siggen:
2321 case snd_soc_dapm_vmid:
2322 break;
2323 case snd_soc_dapm_supply:
2324 case snd_soc_dapm_regulator_supply:
2325 case snd_soc_dapm_pinctrl:
2326 case snd_soc_dapm_clock_supply:
2327 case snd_soc_dapm_micbias:
2328 if (d->target_bias_level < SND_SOC_BIAS_STANDBY)
2329 d->target_bias_level = SND_SOC_BIAS_STANDBY;
2330 break;
2331 default:
2332 d->target_bias_level = SND_SOC_BIAS_ON;
2333 break;
2334 }
2335 }
2336
2337 }
2338
2339 /* Force all contexts in the card to the same bias state if
2340 * they're not ground referenced.
2341 */
2342 bias = SND_SOC_BIAS_OFF;
2343 for_each_card_dapms(card, d)
2344 if (d->target_bias_level > bias)
2345 bias = d->target_bias_level;
2346 for_each_card_dapms(card, d)
2347 if (snd_soc_dapm_get_idle_bias(d))
2348 d->target_bias_level = bias;
2349
2350 trace_snd_soc_dapm_walk_done(card);
2351
2352 /* Run card bias changes at first */
2353 dapm_pre_sequence_async(dapm, 0);
2354 /* Run other bias changes in parallel */
2355 for_each_card_dapms(card, d) {
2356 if (d != dapm && d->bias_level != d->target_bias_level)
2357 async_schedule_domain(dapm_pre_sequence_async, d,
2358 &async_domain);
2359 }
2360 async_synchronize_full_domain(&async_domain);
2361
2362 list_for_each_entry(w, &down_list, power_list) {
2363 dapm_seq_check_event(card, w, SND_SOC_DAPM_WILL_PMD);
2364 }
2365
2366 list_for_each_entry(w, &up_list, power_list) {
2367 dapm_seq_check_event(card, w, SND_SOC_DAPM_WILL_PMU);
2368 }
2369
2370 /* Power down widgets first; try to avoid amplifying pops. */
2371 dapm_seq_run(card, &down_list, event, false);
2372
2373 dapm_widget_update(card, update);
2374
2375 /* Now power up. */
2376 dapm_seq_run(card, &up_list, event, true);
2377
2378 /* Run all the bias changes in parallel */
2379 for_each_card_dapms(card, d) {
2380 if (d != dapm && d->bias_level != d->target_bias_level)
2381 async_schedule_domain(dapm_post_sequence_async, d,
2382 &async_domain);
2383 }
2384 async_synchronize_full_domain(&async_domain);
2385 /* Run card bias changes at last */
2386 dapm_post_sequence_async(dapm, 0);
2387
2388 /* do we need to notify any clients that DAPM event is complete */
2389 for_each_card_dapms(card, d) {
2390 if (!d->component)
2391 continue;
2392
2393 ret = snd_soc_component_stream_event(d->component, event);
2394 if (ret < 0)
2395 return ret;
2396 }
2397
2398 dapm_pop_dbg(card->dev,
2399 "DAPM sequencing finished, waiting %dms\n", pop_time);
2400 dapm_pop_wait();
2401
2402 trace_snd_soc_dapm_done(card, event);
2403
2404 return 0;
2405 }
2406
2407 #ifdef CONFIG_DEBUG_FS
2408
2409 static const char * const dapm_type_name[] = {
2410 [snd_soc_dapm_input] = "input",
2411 [snd_soc_dapm_output] = "output",
2412 [snd_soc_dapm_mux] = "mux",
2413 [snd_soc_dapm_mux_named_ctl] = "mux_named_ctl",
2414 [snd_soc_dapm_demux] = "demux",
2415 [snd_soc_dapm_mixer] = "mixer",
2416 [snd_soc_dapm_mixer_named_ctl] = "mixer_named_ctl",
2417 [snd_soc_dapm_pga] = "pga",
2418 [snd_soc_dapm_out_drv] = "out_drv",
2419 [snd_soc_dapm_adc] = "adc",
2420 [snd_soc_dapm_dac] = "dac",
2421 [snd_soc_dapm_micbias] = "micbias",
2422 [snd_soc_dapm_mic] = "mic",
2423 [snd_soc_dapm_hp] = "hp",
2424 [snd_soc_dapm_spk] = "spk",
2425 [snd_soc_dapm_line] = "line",
2426 [snd_soc_dapm_switch] = "switch",
2427 [snd_soc_dapm_vmid] = "vmid",
2428 [snd_soc_dapm_pre] = "pre",
2429 [snd_soc_dapm_post] = "post",
2430 [snd_soc_dapm_supply] = "supply",
2431 [snd_soc_dapm_pinctrl] = "pinctrl",
2432 [snd_soc_dapm_regulator_supply] = "regulator_supply",
2433 [snd_soc_dapm_clock_supply] = "clock_supply",
2434 [snd_soc_dapm_aif_in] = "aif_in",
2435 [snd_soc_dapm_aif_out] = "aif_out",
2436 [snd_soc_dapm_siggen] = "siggen",
2437 [snd_soc_dapm_sink] = "sink",
2438 [snd_soc_dapm_dai_in] = "dai_in",
2439 [snd_soc_dapm_dai_out] = "dai_out",
2440 [snd_soc_dapm_dai_link] = "dai_link",
2441 [snd_soc_dapm_kcontrol] = "kcontrol",
2442 [snd_soc_dapm_buffer] = "buffer",
2443 [snd_soc_dapm_scheduler] = "scheduler",
2444 [snd_soc_dapm_effect] = "effect",
2445 [snd_soc_dapm_src] = "src",
2446 [snd_soc_dapm_asrc] = "asrc",
2447 [snd_soc_dapm_encoder] = "encoder",
2448 [snd_soc_dapm_decoder] = "decoder",
2449 };
2450
dapm_widget_power_read_file(struct file * file,char __user * user_buf,size_t count,loff_t * ppos)2451 static ssize_t dapm_widget_power_read_file(struct file *file,
2452 char __user *user_buf,
2453 size_t count, loff_t *ppos)
2454 {
2455 struct snd_soc_dapm_widget *w = file->private_data;
2456 enum snd_soc_dapm_direction dir, rdir;
2457 char *buf;
2458 int in, out;
2459 ssize_t ret;
2460 struct snd_soc_dapm_path *p = NULL;
2461 const char *c_name;
2462
2463 BUILD_BUG_ON(ARRAY_SIZE(dapm_type_name) != SND_SOC_DAPM_TYPE_COUNT);
2464
2465 buf = kmalloc(PAGE_SIZE, GFP_KERNEL);
2466 if (!buf)
2467 return -ENOMEM;
2468
2469 snd_soc_dapm_mutex_lock_root(w->dapm);
2470
2471 /* Supply widgets are not handled by dapm_is_connected_{input,output}_ep() */
2472 if (w->is_supply) {
2473 in = 0;
2474 out = 0;
2475 } else {
2476 in = dapm_is_connected_input_ep(w, NULL, NULL);
2477 out = dapm_is_connected_output_ep(w, NULL, NULL);
2478 }
2479
2480 ret = scnprintf(buf, PAGE_SIZE, "%s: %s%s in %d out %d",
2481 w->name, w->power ? "On" : "Off",
2482 w->force ? " (forced)" : "", in, out);
2483
2484 if (w->reg >= 0)
2485 ret += scnprintf(buf + ret, PAGE_SIZE - ret,
2486 " - R%d(0x%x) mask 0x%x",
2487 w->reg, w->reg, w->mask << w->shift);
2488
2489 ret += scnprintf(buf + ret, PAGE_SIZE - ret, "\n");
2490
2491 if (w->sname)
2492 ret += scnprintf(buf + ret, PAGE_SIZE - ret, " stream %s %s\n",
2493 w->sname,
2494 w->active ? "active" : "inactive");
2495
2496 ret += scnprintf(buf + ret, PAGE_SIZE - ret, " widget-type %s\n",
2497 dapm_type_name[w->id]);
2498
2499 dapm_for_each_direction(dir) {
2500 rdir = DAPM_DIR_REVERSE(dir);
2501 snd_soc_dapm_widget_for_each_path(w, dir, p) {
2502 if (p->connected && !p->connected(p->source, p->sink))
2503 continue;
2504
2505 if (!p->connect)
2506 continue;
2507
2508 c_name = p->node[rdir]->dapm->component ?
2509 p->node[rdir]->dapm->component->name : NULL;
2510 ret += scnprintf(buf + ret, PAGE_SIZE - ret,
2511 " %s \"%s\" \"%s\" \"%s\"\n",
2512 (rdir == SND_SOC_DAPM_DIR_IN) ? "in" : "out",
2513 p->name ? p->name : "static",
2514 p->node[rdir]->name, c_name);
2515 }
2516 }
2517
2518 snd_soc_dapm_mutex_unlock(w->dapm);
2519
2520 ret = simple_read_from_buffer(user_buf, count, ppos, buf, ret);
2521
2522 kfree(buf);
2523 return ret;
2524 }
2525
2526 static const struct file_operations dapm_widget_power_fops = {
2527 .open = simple_open,
2528 .read = dapm_widget_power_read_file,
2529 .llseek = default_llseek,
2530 };
2531
dapm_bias_read_file(struct file * file,char __user * user_buf,size_t count,loff_t * ppos)2532 static ssize_t dapm_bias_read_file(struct file *file, char __user *user_buf,
2533 size_t count, loff_t *ppos)
2534 {
2535 struct snd_soc_dapm_context *dapm = file->private_data;
2536 char *level;
2537
2538 switch (dapm->bias_level) {
2539 case SND_SOC_BIAS_ON:
2540 level = "On\n";
2541 break;
2542 case SND_SOC_BIAS_PREPARE:
2543 level = "Prepare\n";
2544 break;
2545 case SND_SOC_BIAS_STANDBY:
2546 level = "Standby\n";
2547 break;
2548 case SND_SOC_BIAS_OFF:
2549 level = "Off\n";
2550 break;
2551 default:
2552 WARN(1, "Unknown bias_level %d\n", dapm->bias_level);
2553 level = "Unknown\n";
2554 break;
2555 }
2556
2557 return simple_read_from_buffer(user_buf, count, ppos, level,
2558 strlen(level));
2559 }
2560
2561 static const struct file_operations dapm_bias_fops = {
2562 .open = simple_open,
2563 .read = dapm_bias_read_file,
2564 .llseek = default_llseek,
2565 };
2566
snd_soc_dapm_debugfs_pop_time(struct dentry * parent)2567 void snd_soc_dapm_debugfs_pop_time(struct dentry *parent)
2568 {
2569 debugfs_create_u32("dapm_pop_time", 0644, parent, &pop_time);
2570 }
2571
snd_soc_dapm_debugfs_init(struct snd_soc_dapm_context * dapm,struct dentry * parent)2572 void snd_soc_dapm_debugfs_init(struct snd_soc_dapm_context *dapm,
2573 struct dentry *parent)
2574 {
2575 if (IS_ERR_OR_NULL(parent))
2576 return;
2577
2578 dapm->debugfs_dapm = debugfs_create_dir("dapm", parent);
2579
2580 debugfs_create_file("bias_level", 0444, dapm->debugfs_dapm, dapm,
2581 &dapm_bias_fops);
2582 }
2583
dapm_debugfs_add_widget(struct snd_soc_dapm_widget * w)2584 static void dapm_debugfs_add_widget(struct snd_soc_dapm_widget *w)
2585 {
2586 struct snd_soc_dapm_context *dapm = w->dapm;
2587
2588 if (!dapm->debugfs_dapm || !w->name)
2589 return;
2590
2591 debugfs_create_file(w->name, 0444, dapm->debugfs_dapm, w,
2592 &dapm_widget_power_fops);
2593 }
2594
dapm_debugfs_free_widget(struct snd_soc_dapm_widget * w)2595 static void dapm_debugfs_free_widget(struct snd_soc_dapm_widget *w)
2596 {
2597 struct snd_soc_dapm_context *dapm = w->dapm;
2598
2599 if (!dapm->debugfs_dapm || !w->name)
2600 return;
2601
2602 debugfs_lookup_and_remove(w->name, dapm->debugfs_dapm);
2603 }
2604
dapm_debugfs_cleanup(struct snd_soc_dapm_context * dapm)2605 static void dapm_debugfs_cleanup(struct snd_soc_dapm_context *dapm)
2606 {
2607 debugfs_remove_recursive(dapm->debugfs_dapm);
2608 dapm->debugfs_dapm = NULL;
2609 }
2610
2611 #else
snd_soc_dapm_debugfs_init(struct snd_soc_dapm_context * dapm,struct dentry * parent)2612 void snd_soc_dapm_debugfs_init(struct snd_soc_dapm_context *dapm,
2613 struct dentry *parent)
2614 {
2615 }
2616
dapm_debugfs_add_widget(struct snd_soc_dapm_widget * w)2617 static inline void dapm_debugfs_add_widget(struct snd_soc_dapm_widget *w)
2618 {
2619 }
2620
dapm_debugfs_free_widget(struct snd_soc_dapm_widget * w)2621 static inline void dapm_debugfs_free_widget(struct snd_soc_dapm_widget *w)
2622 {
2623 }
2624
dapm_debugfs_cleanup(struct snd_soc_dapm_context * dapm)2625 static inline void dapm_debugfs_cleanup(struct snd_soc_dapm_context *dapm)
2626 {
2627 }
2628
2629 #endif
2630
2631 /*
2632 * dapm_connect_path() - Connects or disconnects a path
2633 * @path: The path to update
2634 * @connect: The new connect state of the path. True if the path is connected,
2635 * false if it is disconnected.
2636 * @reason: The reason why the path changed (for debugging only)
2637 */
dapm_connect_path(struct snd_soc_dapm_path * path,bool connect,const char * reason)2638 static void dapm_connect_path(struct snd_soc_dapm_path *path,
2639 bool connect, const char *reason)
2640 {
2641 if (path->connect == connect)
2642 return;
2643
2644 path->connect = connect;
2645 dapm_mark_dirty(path->source, reason);
2646 dapm_mark_dirty(path->sink, reason);
2647 dapm_path_invalidate(path);
2648 }
2649
2650 /* test and update the power status of a mux widget */
dapm_mux_update_power(struct snd_soc_card * card,struct snd_kcontrol * kcontrol,struct snd_soc_dapm_update * update,int mux,struct soc_enum * e)2651 static int dapm_mux_update_power(struct snd_soc_card *card,
2652 struct snd_kcontrol *kcontrol,
2653 struct snd_soc_dapm_update *update,
2654 int mux, struct soc_enum *e)
2655 {
2656 struct snd_soc_dapm_path *path;
2657 int found = 0;
2658 bool connect;
2659
2660 snd_soc_dapm_mutex_assert_held(card);
2661
2662 /* find dapm widget path assoc with kcontrol */
2663 dapm_kcontrol_for_each_path(path, kcontrol) {
2664 found = 1;
2665 /* we now need to match the string in the enum to the path */
2666 if (e && !(strcmp(path->name, e->texts[mux])))
2667 connect = true;
2668 else
2669 connect = false;
2670
2671 dapm_connect_path(path, connect, "mux update");
2672 }
2673
2674 if (found)
2675 dapm_power_widgets(card, SND_SOC_DAPM_STREAM_NOP, update);
2676
2677 return found;
2678 }
2679
snd_soc_dapm_mux_update_power(struct snd_soc_dapm_context * dapm,struct snd_kcontrol * kcontrol,int mux,struct soc_enum * e,struct snd_soc_dapm_update * update)2680 int snd_soc_dapm_mux_update_power(struct snd_soc_dapm_context *dapm,
2681 struct snd_kcontrol *kcontrol, int mux, struct soc_enum *e,
2682 struct snd_soc_dapm_update *update)
2683 {
2684 struct snd_soc_card *card = dapm->card;
2685 int ret;
2686
2687 snd_soc_dapm_mutex_lock(card);
2688 ret = dapm_mux_update_power(card, kcontrol, update, mux, e);
2689 snd_soc_dapm_mutex_unlock(card);
2690 if (ret > 0)
2691 snd_soc_dpcm_runtime_update(card);
2692 return ret;
2693 }
2694 EXPORT_SYMBOL_GPL(snd_soc_dapm_mux_update_power);
2695
2696 /* test and update the power status of a mixer or switch widget */
dapm_mixer_update_power(struct snd_soc_card * card,struct snd_kcontrol * kcontrol,struct snd_soc_dapm_update * update,int connect,int rconnect)2697 static int dapm_mixer_update_power(struct snd_soc_card *card,
2698 struct snd_kcontrol *kcontrol,
2699 struct snd_soc_dapm_update *update,
2700 int connect, int rconnect)
2701 {
2702 struct snd_soc_dapm_path *path;
2703 int found = 0;
2704
2705 snd_soc_dapm_mutex_assert_held(card);
2706
2707 /* find dapm widget path assoc with kcontrol */
2708 dapm_kcontrol_for_each_path(path, kcontrol) {
2709 /*
2710 * Ideally this function should support any number of
2711 * paths and channels. But since kcontrols only come
2712 * in mono and stereo variants, we are limited to 2
2713 * channels.
2714 *
2715 * The following code assumes for stereo controls the
2716 * first path (when 'found == 0') is the left channel,
2717 * and all remaining paths (when 'found == 1') are the
2718 * right channel.
2719 *
2720 * A stereo control is signified by a valid 'rconnect'
2721 * value, either 0 for unconnected, or >= 0 for connected.
2722 * This is chosen instead of using snd_soc_volsw_is_stereo,
2723 * so that the behavior of snd_soc_dapm_mixer_update_power
2724 * doesn't change even when the kcontrol passed in is
2725 * stereo.
2726 *
2727 * It passes 'connect' as the path connect status for
2728 * the left channel, and 'rconnect' for the right
2729 * channel.
2730 */
2731 if (found && rconnect >= 0)
2732 dapm_connect_path(path, rconnect, "mixer update");
2733 else
2734 dapm_connect_path(path, connect, "mixer update");
2735 found = 1;
2736 }
2737
2738 if (found)
2739 dapm_power_widgets(card, SND_SOC_DAPM_STREAM_NOP, update);
2740
2741 return found;
2742 }
2743
snd_soc_dapm_mixer_update_power(struct snd_soc_dapm_context * dapm,struct snd_kcontrol * kcontrol,int connect,struct snd_soc_dapm_update * update)2744 int snd_soc_dapm_mixer_update_power(struct snd_soc_dapm_context *dapm,
2745 struct snd_kcontrol *kcontrol, int connect,
2746 struct snd_soc_dapm_update *update)
2747 {
2748 struct snd_soc_card *card = dapm->card;
2749 int ret;
2750
2751 snd_soc_dapm_mutex_lock(card);
2752 ret = dapm_mixer_update_power(card, kcontrol, update, connect, -1);
2753 snd_soc_dapm_mutex_unlock(card);
2754 if (ret > 0)
2755 snd_soc_dpcm_runtime_update(card);
2756 return ret;
2757 }
2758 EXPORT_SYMBOL_GPL(snd_soc_dapm_mixer_update_power);
2759
dapm_widget_show_component(struct snd_soc_component * component,char * buf,int count)2760 static ssize_t dapm_widget_show_component(struct snd_soc_component *component,
2761 char *buf, int count)
2762 {
2763 struct snd_soc_dapm_context *dapm = snd_soc_component_to_dapm(component);
2764 struct snd_soc_dapm_widget *w;
2765 char *state = "not set";
2766
2767 /* card won't be set for the dummy component, as a spot fix
2768 * we're checking for that case specifically here but in future
2769 * we will ensure that the dummy component looks like others.
2770 */
2771 if (!component->card)
2772 return 0;
2773
2774 for_each_card_widgets(component->card, w) {
2775 if (w->dapm != dapm)
2776 continue;
2777
2778 /* only display widgets that burn power */
2779 switch (w->id) {
2780 case snd_soc_dapm_hp:
2781 case snd_soc_dapm_mic:
2782 case snd_soc_dapm_spk:
2783 case snd_soc_dapm_line:
2784 case snd_soc_dapm_micbias:
2785 case snd_soc_dapm_dac:
2786 case snd_soc_dapm_adc:
2787 case snd_soc_dapm_pga:
2788 case snd_soc_dapm_effect:
2789 case snd_soc_dapm_out_drv:
2790 case snd_soc_dapm_encoder:
2791 case snd_soc_dapm_decoder:
2792 case snd_soc_dapm_mixer:
2793 case snd_soc_dapm_mixer_named_ctl:
2794 case snd_soc_dapm_supply:
2795 case snd_soc_dapm_regulator_supply:
2796 case snd_soc_dapm_pinctrl:
2797 case snd_soc_dapm_clock_supply:
2798 if (w->name)
2799 count += sysfs_emit_at(buf, count, "%s: %s\n",
2800 w->name, w->power ? "On":"Off");
2801 break;
2802 default:
2803 break;
2804 }
2805 }
2806
2807 switch (snd_soc_dapm_get_bias_level(dapm)) {
2808 case SND_SOC_BIAS_ON:
2809 state = "On";
2810 break;
2811 case SND_SOC_BIAS_PREPARE:
2812 state = "Prepare";
2813 break;
2814 case SND_SOC_BIAS_STANDBY:
2815 state = "Standby";
2816 break;
2817 case SND_SOC_BIAS_OFF:
2818 state = "Off";
2819 break;
2820 }
2821 count += sysfs_emit_at(buf, count, "PM State: %s\n", state);
2822
2823 return count;
2824 }
2825
2826 /* show dapm widget status in sys fs */
dapm_widget_show(struct device * dev,struct device_attribute * attr,char * buf)2827 static ssize_t dapm_widget_show(struct device *dev,
2828 struct device_attribute *attr, char *buf)
2829 {
2830 struct snd_soc_pcm_runtime *rtd = dev_get_drvdata(dev);
2831 struct snd_soc_dai *codec_dai;
2832 int i, count = 0;
2833
2834 snd_soc_dapm_mutex_lock_root(rtd->card);
2835
2836 for_each_rtd_codec_dais(rtd, i, codec_dai) {
2837 struct snd_soc_component *component = codec_dai->component;
2838
2839 count = dapm_widget_show_component(component, buf, count);
2840 }
2841
2842 snd_soc_dapm_mutex_unlock(rtd->card);
2843
2844 return count;
2845 }
2846
2847 static DEVICE_ATTR_RO(dapm_widget);
2848
2849 struct attribute *snd_soc_dapm_dev_attrs[] = {
2850 &dev_attr_dapm_widget.attr,
2851 NULL
2852 };
2853
dapm_free_path(struct snd_soc_dapm_path * path)2854 static void dapm_free_path(struct snd_soc_dapm_path *path)
2855 {
2856 list_del(&path->list_node[SND_SOC_DAPM_DIR_IN]);
2857 list_del(&path->list_node[SND_SOC_DAPM_DIR_OUT]);
2858 list_del(&path->list_kcontrol);
2859 list_del(&path->list);
2860 kfree(path);
2861 }
2862
2863 /**
2864 * snd_soc_dapm_free_widget - Free specified widget
2865 * @w: widget to free
2866 *
2867 * Removes widget from all paths and frees memory occupied by it.
2868 */
snd_soc_dapm_free_widget(struct snd_soc_dapm_widget * w)2869 void snd_soc_dapm_free_widget(struct snd_soc_dapm_widget *w)
2870 {
2871 struct snd_soc_dapm_path *p, *next_p;
2872 enum snd_soc_dapm_direction dir;
2873
2874 if (!w)
2875 return;
2876
2877 list_del(&w->list);
2878 list_del(&w->dirty);
2879 /*
2880 * remove source and sink paths associated to this widget.
2881 * While removing the path, remove reference to it from both
2882 * source and sink widgets so that path is removed only once.
2883 */
2884 dapm_for_each_direction(dir) {
2885 snd_soc_dapm_widget_for_each_path_safe(w, dir, p, next_p)
2886 dapm_free_path(p);
2887 }
2888
2889 dapm_debugfs_free_widget(w);
2890
2891 kfree(w->kcontrols);
2892 kfree_const(w->name);
2893 kfree_const(w->sname);
2894 kfree(w);
2895 }
2896 EXPORT_SYMBOL_GPL(snd_soc_dapm_free_widget);
2897
2898 /* free all dapm widgets and resources */
dapm_free_widgets(struct snd_soc_dapm_context * dapm)2899 static void dapm_free_widgets(struct snd_soc_dapm_context *dapm)
2900 {
2901 struct snd_soc_dapm_widget *w, *next_w;
2902
2903 for_each_card_widgets_safe(dapm->card, w, next_w) {
2904 if (w->dapm != dapm)
2905 continue;
2906 snd_soc_dapm_free_widget(w);
2907 }
2908
2909 dapm->wcache_sink = NULL;
2910 dapm->wcache_source = NULL;
2911 }
2912
dapm_find_widget(struct snd_soc_dapm_context * dapm,const char * pin,bool search_other_contexts)2913 static struct snd_soc_dapm_widget *dapm_find_widget(
2914 struct snd_soc_dapm_context *dapm, const char *pin,
2915 bool search_other_contexts)
2916 {
2917 struct snd_soc_dapm_widget *w;
2918 struct snd_soc_dapm_widget *fallback = NULL;
2919 bool pin_has_prefix = snd_soc_dapm_pin_has_prefix(dapm->card, pin);
2920 bool match;
2921
2922 for_each_card_widgets(dapm->card, w) {
2923 match = false;
2924
2925 if (!strcmp(pin, w->name))
2926 match = true;
2927 else if (!pin_has_prefix && !snd_soc_dapm_widget_name_cmp(w, pin))
2928 match = true;
2929
2930 if (match) {
2931 if (w->dapm == dapm)
2932 return w;
2933 else
2934 fallback = w;
2935 }
2936 }
2937
2938 if (search_other_contexts)
2939 return fallback;
2940
2941 return NULL;
2942 }
2943
2944 /*
2945 * set the DAPM pin status:
2946 * returns 1 when the value has been updated, 0 when unchanged, or a negative
2947 * error code; called from kcontrol put callback
2948 */
__dapm_set_pin(struct snd_soc_dapm_context * dapm,const char * pin,int status)2949 static int __dapm_set_pin(struct snd_soc_dapm_context *dapm,
2950 const char *pin, int status)
2951 {
2952 struct snd_soc_dapm_widget *w = dapm_find_widget(dapm, pin, true);
2953 struct device *dev = snd_soc_dapm_to_dev(dapm);
2954 int ret = 0;
2955
2956 dapm_assert_locked(dapm);
2957
2958 if (!w) {
2959 dev_err(dev, "ASoC: DAPM unknown pin %s\n", pin);
2960 return -EINVAL;
2961 }
2962
2963 if (w->connected != status) {
2964 dapm_mark_dirty(w, "pin configuration");
2965 dapm_widget_invalidate_input_paths(w);
2966 dapm_widget_invalidate_output_paths(w);
2967 ret = 1;
2968 }
2969
2970 w->connected = status;
2971 if (status == 0)
2972 w->force = 0;
2973
2974 return ret;
2975 }
2976
2977 /*
2978 * similar as __dapm_set_pin(), but returns 0 when successful;
2979 * called from several API functions below
2980 */
dapm_set_pin(struct snd_soc_dapm_context * dapm,const char * pin,int status)2981 static int dapm_set_pin(struct snd_soc_dapm_context *dapm,
2982 const char *pin, int status)
2983 {
2984 int ret = __dapm_set_pin(dapm, pin, status);
2985
2986 return ret < 0 ? ret : 0;
2987 }
2988
2989 /**
2990 * snd_soc_dapm_sync_unlocked - scan and power dapm paths
2991 * @dapm: DAPM context
2992 *
2993 * Walks all dapm audio paths and powers widgets according to their
2994 * stream or path usage.
2995 *
2996 * Requires external locking.
2997 *
2998 * Returns 0 for success.
2999 */
snd_soc_dapm_sync_unlocked(struct snd_soc_dapm_context * dapm)3000 int snd_soc_dapm_sync_unlocked(struct snd_soc_dapm_context *dapm)
3001 {
3002 /*
3003 * Suppress early reports (eg, jacks syncing their state) to avoid
3004 * silly DAPM runs during card startup.
3005 */
3006 if (!snd_soc_card_is_instantiated(dapm->card))
3007 return 0;
3008
3009 return dapm_power_widgets(dapm->card, SND_SOC_DAPM_STREAM_NOP, NULL);
3010 }
3011 EXPORT_SYMBOL_GPL(snd_soc_dapm_sync_unlocked);
3012
3013 /**
3014 * snd_soc_dapm_sync - scan and power dapm paths
3015 * @dapm: DAPM context
3016 *
3017 * Walks all dapm audio paths and powers widgets according to their
3018 * stream or path usage.
3019 *
3020 * Returns 0 for success.
3021 */
snd_soc_dapm_sync(struct snd_soc_dapm_context * dapm)3022 int snd_soc_dapm_sync(struct snd_soc_dapm_context *dapm)
3023 {
3024 int ret;
3025
3026 snd_soc_dapm_mutex_lock(dapm);
3027 ret = snd_soc_dapm_sync_unlocked(dapm);
3028 snd_soc_dapm_mutex_unlock(dapm);
3029 return ret;
3030 }
3031 EXPORT_SYMBOL_GPL(snd_soc_dapm_sync);
3032
dapm_update_dai_chan(struct snd_soc_dapm_path * p,struct snd_soc_dapm_widget * w,int channels)3033 static int dapm_update_dai_chan(struct snd_soc_dapm_path *p,
3034 struct snd_soc_dapm_widget *w,
3035 int channels)
3036 {
3037 struct device *dev = snd_soc_dapm_to_dev(w->dapm);
3038
3039 switch (w->id) {
3040 case snd_soc_dapm_aif_out:
3041 case snd_soc_dapm_aif_in:
3042 break;
3043 default:
3044 return 0;
3045 }
3046
3047 dev_dbg(dev, "%s DAI route %s -> %s\n",
3048 w->channel < channels ? "Connecting" : "Disconnecting",
3049 p->source->name, p->sink->name);
3050
3051 if (w->channel < channels)
3052 dapm_connect_path(p, true, "dai update");
3053 else
3054 dapm_connect_path(p, false, "dai update");
3055
3056 return 0;
3057 }
3058
dapm_update_dai_unlocked(struct snd_pcm_substream * substream,struct snd_pcm_hw_params * params,struct snd_soc_dai * dai)3059 static int dapm_update_dai_unlocked(struct snd_pcm_substream *substream,
3060 struct snd_pcm_hw_params *params,
3061 struct snd_soc_dai *dai)
3062 {
3063 int dir = substream->stream;
3064 int channels = params_channels(params);
3065 struct snd_soc_dapm_path *p;
3066 struct snd_soc_dapm_widget *w;
3067 int ret;
3068
3069 w = snd_soc_dai_get_widget(dai, dir);
3070
3071 if (!w)
3072 return 0;
3073
3074 dev_dbg(dai->dev, "Update DAI routes for %s %s\n", dai->name, snd_pcm_direction_name(dir));
3075
3076 snd_soc_dapm_widget_for_each_sink_path(w, p) {
3077 ret = dapm_update_dai_chan(p, p->sink, channels);
3078 if (ret < 0)
3079 return ret;
3080 }
3081
3082 snd_soc_dapm_widget_for_each_source_path(w, p) {
3083 ret = dapm_update_dai_chan(p, p->source, channels);
3084 if (ret < 0)
3085 return ret;
3086 }
3087
3088 return 0;
3089 }
3090
snd_soc_dapm_update_dai(struct snd_pcm_substream * substream,struct snd_pcm_hw_params * params,struct snd_soc_dai * dai)3091 int snd_soc_dapm_update_dai(struct snd_pcm_substream *substream,
3092 struct snd_pcm_hw_params *params,
3093 struct snd_soc_dai *dai)
3094 {
3095 struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
3096 int ret;
3097
3098 snd_soc_dapm_mutex_lock(rtd->card);
3099 ret = dapm_update_dai_unlocked(substream, params, dai);
3100 snd_soc_dapm_mutex_unlock(rtd->card);
3101
3102 return ret;
3103 }
3104
snd_soc_dapm_widget_name_cmp(struct snd_soc_dapm_widget * widget,const char * s)3105 int snd_soc_dapm_widget_name_cmp(struct snd_soc_dapm_widget *widget, const char *s)
3106 {
3107 struct snd_soc_component *component = widget->dapm->component;
3108 const char *wname = widget->name;
3109
3110 if (component && component->name_prefix)
3111 wname += strlen(component->name_prefix) + 1; /* plus space */
3112
3113 return strcmp(wname, s);
3114 }
3115 EXPORT_SYMBOL_GPL(snd_soc_dapm_widget_name_cmp);
3116
snd_soc_dapm_add_route(struct snd_soc_dapm_context * dapm,const struct snd_soc_dapm_route * route)3117 static int snd_soc_dapm_add_route(struct snd_soc_dapm_context *dapm,
3118 const struct snd_soc_dapm_route *route)
3119 {
3120 struct snd_soc_dapm_widget *wsource = NULL, *wsink = NULL, *w;
3121 struct snd_soc_dapm_widget *wtsource = NULL, *wtsink = NULL;
3122 struct device *dev = snd_soc_dapm_to_dev(dapm);
3123 const char *sink;
3124 const char *source;
3125 char prefixed_sink[80];
3126 char prefixed_source[80];
3127 const char *prefix;
3128 unsigned int sink_ref = 0;
3129 unsigned int source_ref = 0;
3130 int ret;
3131
3132 prefix = dapm_prefix(dapm);
3133 if (prefix) {
3134 snprintf(prefixed_sink, sizeof(prefixed_sink), "%s %s",
3135 prefix, route->sink);
3136 sink = prefixed_sink;
3137 snprintf(prefixed_source, sizeof(prefixed_source), "%s %s",
3138 prefix, route->source);
3139 source = prefixed_source;
3140 } else {
3141 sink = route->sink;
3142 source = route->source;
3143 }
3144
3145 wsource = dapm_wcache_lookup(dapm->wcache_source, source);
3146 wsink = dapm_wcache_lookup(dapm->wcache_sink, sink);
3147
3148 if (wsink && wsource)
3149 goto skip_search;
3150
3151 /*
3152 * find src and dest widgets over all widgets but favor a widget from
3153 * current DAPM context
3154 */
3155 for_each_card_widgets(dapm->card, w) {
3156 if (!wsink && !(strcmp(w->name, sink))) {
3157 wtsink = w;
3158 if (w->dapm == dapm) {
3159 wsink = w;
3160 if (wsource)
3161 break;
3162 }
3163 sink_ref++;
3164 if (sink_ref > 1)
3165 dev_warn(dev,
3166 "ASoC: sink widget %s overwritten\n",
3167 w->name);
3168 continue;
3169 }
3170 if (!wsource && !(strcmp(w->name, source))) {
3171 wtsource = w;
3172 if (w->dapm == dapm) {
3173 wsource = w;
3174 if (wsink)
3175 break;
3176 }
3177 source_ref++;
3178 if (source_ref > 1)
3179 dev_warn(dev,
3180 "ASoC: source widget %s overwritten\n",
3181 w->name);
3182 }
3183 }
3184 /* use widget from another DAPM context if not found from this */
3185 if (!wsink)
3186 wsink = wtsink;
3187 if (!wsource)
3188 wsource = wtsource;
3189
3190 ret = -ENODEV;
3191 if (!wsource)
3192 goto err;
3193 if (!wsink)
3194 goto err;
3195
3196 skip_search:
3197 /* update cache */
3198 dapm->wcache_sink = wsink;
3199 dapm->wcache_source = wsource;
3200
3201 ret = dapm_add_path(dapm, wsource, wsink, route->control,
3202 route->connected);
3203 err:
3204 if (ret)
3205 dev_err(dev, "ASoC: Failed to add route %s%s -%s%s%s> %s%s\n",
3206 source, !wsource ? "(*)" : "",
3207 !route->control ? "" : "> [",
3208 !route->control ? "" : route->control,
3209 !route->control ? "" : "] -",
3210 sink, !wsink ? "(*)" : "");
3211 return ret;
3212 }
3213
snd_soc_dapm_del_route(struct snd_soc_dapm_context * dapm,const struct snd_soc_dapm_route * route)3214 static int snd_soc_dapm_del_route(struct snd_soc_dapm_context *dapm,
3215 const struct snd_soc_dapm_route *route)
3216 {
3217 struct device *dev = snd_soc_dapm_to_dev(dapm);
3218 struct snd_soc_dapm_path *path, *p;
3219 const char *sink;
3220 const char *source;
3221 char prefixed_sink[80];
3222 char prefixed_source[80];
3223 const char *prefix;
3224
3225 if (route->control) {
3226 dev_err(dev,
3227 "ASoC: Removal of routes with controls not supported\n");
3228 return -EINVAL;
3229 }
3230
3231 prefix = dapm_prefix(dapm);
3232 if (prefix) {
3233 snprintf(prefixed_sink, sizeof(prefixed_sink), "%s %s",
3234 prefix, route->sink);
3235 sink = prefixed_sink;
3236 snprintf(prefixed_source, sizeof(prefixed_source), "%s %s",
3237 prefix, route->source);
3238 source = prefixed_source;
3239 } else {
3240 sink = route->sink;
3241 source = route->source;
3242 }
3243
3244 path = NULL;
3245 list_for_each_entry(p, &dapm->card->paths, list) {
3246 if (strcmp(p->source->name, source) != 0)
3247 continue;
3248 if (strcmp(p->sink->name, sink) != 0)
3249 continue;
3250 path = p;
3251 break;
3252 }
3253
3254 if (path) {
3255 struct snd_soc_dapm_widget *wsource = path->source;
3256 struct snd_soc_dapm_widget *wsink = path->sink;
3257
3258 dapm_mark_dirty(wsource, "Route removed");
3259 dapm_mark_dirty(wsink, "Route removed");
3260 if (path->connect)
3261 dapm_path_invalidate(path);
3262
3263 dapm_free_path(path);
3264
3265 /* Update any path related flags */
3266 dapm_update_widget_flags(wsource);
3267 dapm_update_widget_flags(wsink);
3268 } else {
3269 dev_warn(dev, "ASoC: Route %s->%s does not exist\n",
3270 source, sink);
3271 }
3272
3273 return 0;
3274 }
3275
3276 /**
3277 * snd_soc_dapm_add_routes - Add routes between DAPM widgets
3278 * @dapm: DAPM context
3279 * @route: audio routes
3280 * @num: number of routes
3281 *
3282 * Connects 2 dapm widgets together via a named audio path. The sink is
3283 * the widget receiving the audio signal, whilst the source is the sender
3284 * of the audio signal.
3285 *
3286 * Returns 0 for success else error. On error all resources can be freed
3287 * with a call to snd_soc_card_free().
3288 */
snd_soc_dapm_add_routes(struct snd_soc_dapm_context * dapm,const struct snd_soc_dapm_route * route,int num)3289 int snd_soc_dapm_add_routes(struct snd_soc_dapm_context *dapm,
3290 const struct snd_soc_dapm_route *route, int num)
3291 {
3292 int i, ret = 0;
3293
3294 snd_soc_dapm_mutex_lock(dapm);
3295 for (i = 0; i < num; i++) {
3296 int r = snd_soc_dapm_add_route(dapm, route);
3297 if (r < 0)
3298 ret = r;
3299 route++;
3300 }
3301 snd_soc_dapm_mutex_unlock(dapm);
3302
3303 return ret;
3304 }
3305 EXPORT_SYMBOL_GPL(snd_soc_dapm_add_routes);
3306
3307 /**
3308 * snd_soc_dapm_del_routes - Remove routes between DAPM widgets
3309 * @dapm: DAPM context
3310 * @route: audio routes
3311 * @num: number of routes
3312 *
3313 * Removes routes from the DAPM context.
3314 */
snd_soc_dapm_del_routes(struct snd_soc_dapm_context * dapm,const struct snd_soc_dapm_route * route,int num)3315 int snd_soc_dapm_del_routes(struct snd_soc_dapm_context *dapm,
3316 const struct snd_soc_dapm_route *route, int num)
3317 {
3318 int i;
3319
3320 snd_soc_dapm_mutex_lock(dapm);
3321 for (i = 0; i < num; i++) {
3322 snd_soc_dapm_del_route(dapm, route);
3323 route++;
3324 }
3325 snd_soc_dapm_mutex_unlock(dapm);
3326
3327 return 0;
3328 }
3329 EXPORT_SYMBOL_GPL(snd_soc_dapm_del_routes);
3330
3331 /**
3332 * snd_soc_dapm_new_widgets - add new dapm widgets
3333 * @card: card to be checked for new dapm widgets
3334 *
3335 * Checks the codec for any new dapm widgets and creates them if found.
3336 *
3337 * Returns 0 for success.
3338 */
snd_soc_dapm_new_widgets(struct snd_soc_card * card)3339 int snd_soc_dapm_new_widgets(struct snd_soc_card *card)
3340 {
3341 struct snd_soc_dapm_widget *w;
3342 unsigned int val;
3343
3344 snd_soc_dapm_mutex_lock_root(card);
3345
3346 for_each_card_widgets(card, w)
3347 {
3348 if (w->new)
3349 continue;
3350
3351 if (w->num_kcontrols) {
3352 w->kcontrols = kzalloc_objs(struct snd_kcontrol *,
3353 w->num_kcontrols);
3354 if (!w->kcontrols) {
3355 snd_soc_dapm_mutex_unlock(card);
3356 return -ENOMEM;
3357 }
3358 }
3359
3360 switch(w->id) {
3361 case snd_soc_dapm_switch:
3362 case snd_soc_dapm_mixer:
3363 case snd_soc_dapm_mixer_named_ctl:
3364 dapm_new_mixer(w);
3365 break;
3366 case snd_soc_dapm_mux:
3367 case snd_soc_dapm_mux_named_ctl:
3368 case snd_soc_dapm_demux:
3369 dapm_new_mux(w);
3370 break;
3371 case snd_soc_dapm_pga:
3372 case snd_soc_dapm_effect:
3373 case snd_soc_dapm_out_drv:
3374 case snd_soc_dapm_encoder:
3375 case snd_soc_dapm_decoder:
3376 dapm_new_pga(w);
3377 break;
3378 case snd_soc_dapm_dai_link:
3379 dapm_new_dai_link(w);
3380 break;
3381 default:
3382 break;
3383 }
3384
3385 /* Read the initial power state from the device */
3386 if (w->reg >= 0) {
3387 val = dapm_read(w->dapm, w->reg);
3388 val = val >> w->shift;
3389 val &= w->mask;
3390 if (val == w->on_val)
3391 w->power = 1;
3392 }
3393
3394 w->new = 1;
3395
3396 dapm_mark_dirty(w, "new widget");
3397 dapm_debugfs_add_widget(w);
3398 }
3399
3400 dapm_power_widgets(card, SND_SOC_DAPM_STREAM_NOP, NULL);
3401 snd_soc_dapm_mutex_unlock(card);
3402 return 0;
3403 }
3404 EXPORT_SYMBOL_GPL(snd_soc_dapm_new_widgets);
3405
3406 /**
3407 * snd_soc_dapm_get_volsw - dapm mixer get callback
3408 * @kcontrol: mixer control
3409 * @ucontrol: control element information
3410 *
3411 * Callback to get the value of a dapm mixer control.
3412 *
3413 * Returns 0 for success.
3414 */
snd_soc_dapm_get_volsw(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_value * ucontrol)3415 int snd_soc_dapm_get_volsw(struct snd_kcontrol *kcontrol,
3416 struct snd_ctl_elem_value *ucontrol)
3417 {
3418 struct snd_soc_dapm_context *dapm = snd_soc_dapm_kcontrol_to_dapm(kcontrol);
3419 struct soc_mixer_control *mc =
3420 (struct soc_mixer_control *)kcontrol->private_value;
3421 int reg = mc->reg;
3422 unsigned int shift = mc->shift;
3423 int max = mc->max;
3424 unsigned int width = fls(max);
3425 unsigned int mask = (1 << fls(max)) - 1;
3426 unsigned int invert = mc->invert;
3427 unsigned int reg_val, val, rval = 0;
3428
3429 snd_soc_dapm_mutex_lock(dapm);
3430 if (dapm_kcontrol_is_powered(kcontrol) && reg != SND_SOC_NOPM) {
3431 reg_val = dapm_read(dapm, reg);
3432 val = (reg_val >> shift) & mask;
3433
3434 if (reg != mc->rreg)
3435 reg_val = dapm_read(dapm, mc->rreg);
3436
3437 if (snd_soc_volsw_is_stereo(mc))
3438 rval = (reg_val >> mc->rshift) & mask;
3439 } else {
3440 reg_val = snd_soc_dapm_kcontrol_get_value(kcontrol);
3441 val = reg_val & mask;
3442
3443 if (snd_soc_volsw_is_stereo(mc))
3444 rval = (reg_val >> width) & mask;
3445 }
3446 snd_soc_dapm_mutex_unlock(dapm);
3447
3448 if (invert)
3449 ucontrol->value.integer.value[0] = max - val;
3450 else
3451 ucontrol->value.integer.value[0] = val;
3452
3453 if (snd_soc_volsw_is_stereo(mc)) {
3454 if (invert)
3455 ucontrol->value.integer.value[1] = max - rval;
3456 else
3457 ucontrol->value.integer.value[1] = rval;
3458 }
3459
3460 return 0;
3461 }
3462 EXPORT_SYMBOL_GPL(snd_soc_dapm_get_volsw);
3463
3464 /**
3465 * snd_soc_dapm_put_volsw - dapm mixer set callback
3466 * @kcontrol: mixer control
3467 * @ucontrol: control element information
3468 *
3469 * Callback to set the value of a dapm mixer control.
3470 *
3471 * Returns 0 for success.
3472 */
snd_soc_dapm_put_volsw(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_value * ucontrol)3473 int snd_soc_dapm_put_volsw(struct snd_kcontrol *kcontrol,
3474 struct snd_ctl_elem_value *ucontrol)
3475 {
3476 struct snd_soc_dapm_context *dapm = snd_soc_dapm_kcontrol_to_dapm(kcontrol);
3477 struct device *dev = snd_soc_dapm_to_dev(dapm);
3478 struct snd_soc_card *card = dapm->card;
3479 struct soc_mixer_control *mc =
3480 (struct soc_mixer_control *)kcontrol->private_value;
3481 int reg = mc->reg;
3482 unsigned int shift = mc->shift;
3483 int max = mc->max;
3484 unsigned int width = fls(max);
3485 unsigned int mask = (1 << width) - 1;
3486 unsigned int invert = mc->invert;
3487 unsigned int val, rval = 0;
3488 int connect, rconnect = -1, change, reg_change = 0;
3489 struct snd_soc_dapm_update update = {};
3490 struct snd_soc_dapm_update *pupdate = NULL;
3491 int ret = 0;
3492
3493 val = (ucontrol->value.integer.value[0] & mask);
3494 connect = !!val;
3495
3496 if (invert)
3497 val = max - val;
3498
3499 if (snd_soc_volsw_is_stereo(mc)) {
3500 rval = (ucontrol->value.integer.value[1] & mask);
3501 rconnect = !!rval;
3502 if (invert)
3503 rval = max - rval;
3504 }
3505
3506 snd_soc_dapm_mutex_lock(card);
3507
3508 /* This assumes field width < (bits in unsigned int / 2) */
3509 if (width > sizeof(unsigned int) * 8 / 2)
3510 dev_warn(dev,
3511 "ASoC: control %s field width limit exceeded\n",
3512 kcontrol->id.name);
3513 change = dapm_kcontrol_set_value(kcontrol, val | (rval << width));
3514
3515 if (reg != SND_SOC_NOPM) {
3516 val = val << shift;
3517 rval = rval << mc->rshift;
3518
3519 reg_change = dapm_test_bits(dapm, reg, mask << shift, val);
3520
3521 if (snd_soc_volsw_is_stereo(mc))
3522 reg_change |= dapm_test_bits(dapm, mc->rreg,
3523 mask << mc->rshift,
3524 rval);
3525 }
3526
3527 if (change || reg_change) {
3528 if (reg_change) {
3529 if (snd_soc_volsw_is_stereo(mc)) {
3530 update.has_second_set = true;
3531 update.reg2 = mc->rreg;
3532 update.mask2 = mask << mc->rshift;
3533 update.val2 = rval;
3534 }
3535 update.kcontrol = kcontrol;
3536 update.reg = reg;
3537 update.mask = mask << shift;
3538 update.val = val;
3539 pupdate = &update;
3540 }
3541 ret = dapm_mixer_update_power(card, kcontrol, pupdate, connect, rconnect);
3542 }
3543
3544 snd_soc_dapm_mutex_unlock(card);
3545
3546 if (ret > 0)
3547 snd_soc_dpcm_runtime_update(card);
3548
3549 return change;
3550 }
3551 EXPORT_SYMBOL_GPL(snd_soc_dapm_put_volsw);
3552
3553 /**
3554 * snd_soc_dapm_get_enum_double - dapm enumerated double mixer get callback
3555 * @kcontrol: mixer control
3556 * @ucontrol: control element information
3557 *
3558 * Callback to get the value of a dapm enumerated double mixer control.
3559 *
3560 * Returns 0 for success.
3561 */
snd_soc_dapm_get_enum_double(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_value * ucontrol)3562 int snd_soc_dapm_get_enum_double(struct snd_kcontrol *kcontrol,
3563 struct snd_ctl_elem_value *ucontrol)
3564 {
3565 struct snd_soc_dapm_context *dapm = snd_soc_dapm_kcontrol_to_dapm(kcontrol);
3566 struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
3567 unsigned int reg_val, val;
3568
3569 snd_soc_dapm_mutex_lock(dapm);
3570 if (e->reg != SND_SOC_NOPM && dapm_kcontrol_is_powered(kcontrol)) {
3571 reg_val = dapm_read(dapm, e->reg);
3572 } else {
3573 reg_val = snd_soc_dapm_kcontrol_get_value(kcontrol);
3574 }
3575 snd_soc_dapm_mutex_unlock(dapm);
3576
3577 val = (reg_val >> e->shift_l) & e->mask;
3578 ucontrol->value.enumerated.item[0] = snd_soc_enum_val_to_item(e, val);
3579 if (e->shift_l != e->shift_r) {
3580 val = (reg_val >> e->shift_r) & e->mask;
3581 val = snd_soc_enum_val_to_item(e, val);
3582 ucontrol->value.enumerated.item[1] = val;
3583 }
3584
3585 return 0;
3586 }
3587 EXPORT_SYMBOL_GPL(snd_soc_dapm_get_enum_double);
3588
3589 /**
3590 * snd_soc_dapm_put_enum_double - dapm enumerated double mixer set callback
3591 * @kcontrol: mixer control
3592 * @ucontrol: control element information
3593 *
3594 * Callback to set the value of a dapm enumerated double mixer control.
3595 *
3596 * Returns 0 for success.
3597 */
snd_soc_dapm_put_enum_double(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_value * ucontrol)3598 int snd_soc_dapm_put_enum_double(struct snd_kcontrol *kcontrol,
3599 struct snd_ctl_elem_value *ucontrol)
3600 {
3601 struct snd_soc_dapm_context *dapm = snd_soc_dapm_kcontrol_to_dapm(kcontrol);
3602 struct snd_soc_card *card = dapm->card;
3603 struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
3604 unsigned int *item = ucontrol->value.enumerated.item;
3605 unsigned int val, change, reg_change = 0;
3606 unsigned int mask;
3607 struct snd_soc_dapm_update update = {};
3608 struct snd_soc_dapm_update *pupdate = NULL;
3609 int ret = 0;
3610
3611 if (item[0] >= e->items)
3612 return -EINVAL;
3613
3614 val = snd_soc_enum_item_to_val(e, item[0]) << e->shift_l;
3615 mask = e->mask << e->shift_l;
3616 if (e->shift_l != e->shift_r) {
3617 if (item[1] >= e->items)
3618 return -EINVAL;
3619 val |= snd_soc_enum_item_to_val(e, item[1]) << e->shift_r;
3620 mask |= e->mask << e->shift_r;
3621 }
3622
3623 snd_soc_dapm_mutex_lock(card);
3624
3625 change = dapm_kcontrol_set_value(kcontrol, val);
3626
3627 if (e->reg != SND_SOC_NOPM)
3628 reg_change = dapm_test_bits(dapm, e->reg, mask, val);
3629
3630 if (change || reg_change) {
3631 if (reg_change) {
3632 update.kcontrol = kcontrol;
3633 update.reg = e->reg;
3634 update.mask = mask;
3635 update.val = val;
3636 pupdate = &update;
3637 }
3638 ret = dapm_mux_update_power(card, kcontrol, pupdate, item[0], e);
3639 }
3640
3641 snd_soc_dapm_mutex_unlock(card);
3642
3643 if (ret > 0)
3644 snd_soc_dpcm_runtime_update(card);
3645
3646 return change;
3647 }
3648 EXPORT_SYMBOL_GPL(snd_soc_dapm_put_enum_double);
3649
3650 /**
3651 * snd_soc_dapm_info_pin_switch - Info for a pin switch
3652 *
3653 * @kcontrol: mixer control
3654 * @uinfo: control element information
3655 *
3656 * Callback to provide information about a pin switch control.
3657 */
snd_soc_dapm_info_pin_switch(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_info * uinfo)3658 int snd_soc_dapm_info_pin_switch(struct snd_kcontrol *kcontrol,
3659 struct snd_ctl_elem_info *uinfo)
3660 {
3661 uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN;
3662 uinfo->count = 1;
3663 uinfo->value.integer.min = 0;
3664 uinfo->value.integer.max = 1;
3665
3666 return 0;
3667 }
3668 EXPORT_SYMBOL_GPL(snd_soc_dapm_info_pin_switch);
3669
__snd_soc_dapm_get_pin_switch(struct snd_soc_dapm_context * dapm,const char * pin,struct snd_ctl_elem_value * ucontrol)3670 static int __snd_soc_dapm_get_pin_switch(struct snd_soc_dapm_context *dapm,
3671 const char *pin,
3672 struct snd_ctl_elem_value *ucontrol)
3673 {
3674 snd_soc_dapm_mutex_lock(dapm);
3675 ucontrol->value.integer.value[0] = snd_soc_dapm_get_pin_status(dapm, pin);
3676 snd_soc_dapm_mutex_unlock(dapm);
3677
3678 return 0;
3679 }
3680
3681 /**
3682 * snd_soc_dapm_get_pin_switch - Get information for a pin switch
3683 *
3684 * @kcontrol: mixer control
3685 * @ucontrol: Value
3686 *
3687 * Callback to provide information for a pin switch added at the card
3688 * level.
3689 */
snd_soc_dapm_get_pin_switch(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_value * ucontrol)3690 int snd_soc_dapm_get_pin_switch(struct snd_kcontrol *kcontrol,
3691 struct snd_ctl_elem_value *ucontrol)
3692 {
3693 struct snd_soc_card *card = snd_kcontrol_chip(kcontrol);
3694 struct snd_soc_dapm_context *dapm = snd_soc_card_to_dapm(card);
3695 const char *pin = (const char *)kcontrol->private_value;
3696
3697 return __snd_soc_dapm_get_pin_switch(dapm, pin, ucontrol);
3698 }
3699 EXPORT_SYMBOL_GPL(snd_soc_dapm_get_pin_switch);
3700
3701 /**
3702 * snd_soc_dapm_get_component_pin_switch - Get information for a pin switch
3703 *
3704 * @kcontrol: mixer control
3705 * @ucontrol: Value
3706 *
3707 * Callback to provide information for a pin switch added at the component
3708 * level.
3709 */
snd_soc_dapm_get_component_pin_switch(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_value * ucontrol)3710 int snd_soc_dapm_get_component_pin_switch(struct snd_kcontrol *kcontrol,
3711 struct snd_ctl_elem_value *ucontrol)
3712 {
3713 struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);
3714 struct snd_soc_dapm_context *dapm = snd_soc_component_to_dapm(component);
3715 const char *pin = (const char *)kcontrol->private_value;
3716
3717 return __snd_soc_dapm_get_pin_switch(dapm, pin, ucontrol);
3718 }
3719 EXPORT_SYMBOL_GPL(snd_soc_dapm_get_component_pin_switch);
3720
__dapm_put_pin_switch(struct snd_soc_dapm_context * dapm,const char * pin,struct snd_ctl_elem_value * ucontrol)3721 static int __dapm_put_pin_switch(struct snd_soc_dapm_context *dapm,
3722 const char *pin,
3723 struct snd_ctl_elem_value *ucontrol)
3724 {
3725 int ret;
3726
3727 snd_soc_dapm_mutex_lock(dapm);
3728 ret = __dapm_set_pin(dapm, pin, !!ucontrol->value.integer.value[0]);
3729 snd_soc_dapm_mutex_unlock(dapm);
3730
3731 snd_soc_dapm_sync(dapm);
3732
3733 return ret;
3734 }
3735
3736 /**
3737 * snd_soc_dapm_put_pin_switch - Set information for a pin switch
3738 *
3739 * @kcontrol: mixer control
3740 * @ucontrol: Value
3741 *
3742 * Callback to provide information for a pin switch added at the card
3743 * level.
3744 */
snd_soc_dapm_put_pin_switch(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_value * ucontrol)3745 int snd_soc_dapm_put_pin_switch(struct snd_kcontrol *kcontrol,
3746 struct snd_ctl_elem_value *ucontrol)
3747 {
3748 struct snd_soc_card *card = snd_kcontrol_chip(kcontrol);
3749 struct snd_soc_dapm_context *dapm = snd_soc_card_to_dapm(card);
3750 const char *pin = (const char *)kcontrol->private_value;
3751
3752 return __dapm_put_pin_switch(dapm, pin, ucontrol);
3753 }
3754 EXPORT_SYMBOL_GPL(snd_soc_dapm_put_pin_switch);
3755
3756 /**
3757 * snd_soc_dapm_put_component_pin_switch - Set information for a pin switch
3758 *
3759 * @kcontrol: mixer control
3760 * @ucontrol: Value
3761 *
3762 * Callback to provide information for a pin switch added at the component
3763 * level.
3764 */
snd_soc_dapm_put_component_pin_switch(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_value * ucontrol)3765 int snd_soc_dapm_put_component_pin_switch(struct snd_kcontrol *kcontrol,
3766 struct snd_ctl_elem_value *ucontrol)
3767 {
3768 struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);
3769 struct snd_soc_dapm_context *dapm = snd_soc_component_to_dapm(component);
3770 const char *pin = (const char *)kcontrol->private_value;
3771
3772 return __dapm_put_pin_switch(dapm, pin, ucontrol);
3773 }
3774 EXPORT_SYMBOL_GPL(snd_soc_dapm_put_component_pin_switch);
3775
3776 struct snd_soc_dapm_widget *
snd_soc_dapm_new_control_unlocked(struct snd_soc_dapm_context * dapm,const struct snd_soc_dapm_widget * widget)3777 snd_soc_dapm_new_control_unlocked(struct snd_soc_dapm_context *dapm,
3778 const struct snd_soc_dapm_widget *widget)
3779 {
3780 struct device *dev = snd_soc_dapm_to_dev(dapm);
3781 enum snd_soc_dapm_direction dir;
3782 struct snd_soc_dapm_widget *w;
3783 int ret = -ENOMEM;
3784
3785 w = dapm_cnew_widget(widget, dapm_prefix(dapm));
3786 if (!w)
3787 goto cnew_failed;
3788
3789 switch (w->id) {
3790 case snd_soc_dapm_regulator_supply:
3791 w->regulator = devm_regulator_get(dev, widget->name);
3792 if (IS_ERR(w->regulator)) {
3793 ret = PTR_ERR(w->regulator);
3794 goto request_failed;
3795 }
3796
3797 if (w->on_val & SND_SOC_DAPM_REGULATOR_BYPASS) {
3798 ret = regulator_allow_bypass(w->regulator, true);
3799 if (ret != 0)
3800 dev_warn(dev,
3801 "ASoC: Failed to bypass %s: %d\n",
3802 w->name, ret);
3803 }
3804 break;
3805 case snd_soc_dapm_pinctrl:
3806 w->pinctrl = devm_pinctrl_get(dev);
3807 if (IS_ERR(w->pinctrl)) {
3808 ret = PTR_ERR(w->pinctrl);
3809 goto request_failed;
3810 }
3811
3812 /* set to sleep_state when initializing */
3813 snd_soc_dapm_pinctrl_event(w, NULL, SND_SOC_DAPM_POST_PMD);
3814 break;
3815 case snd_soc_dapm_clock_supply:
3816 w->clk = devm_clk_get(dev, widget->name);
3817 if (IS_ERR(w->clk)) {
3818 ret = PTR_ERR(w->clk);
3819 goto request_failed;
3820 }
3821 break;
3822 default:
3823 break;
3824 }
3825
3826 switch (w->id) {
3827 case snd_soc_dapm_mic:
3828 w->is_ep = SND_SOC_DAPM_EP_SOURCE;
3829 w->power_check = dapm_generic_check_power;
3830 break;
3831 case snd_soc_dapm_input:
3832 if (!dapm->card->fully_routed)
3833 w->is_ep = SND_SOC_DAPM_EP_SOURCE;
3834 w->power_check = dapm_generic_check_power;
3835 break;
3836 case snd_soc_dapm_spk:
3837 case snd_soc_dapm_hp:
3838 w->is_ep = SND_SOC_DAPM_EP_SINK;
3839 w->power_check = dapm_generic_check_power;
3840 break;
3841 case snd_soc_dapm_output:
3842 if (!dapm->card->fully_routed)
3843 w->is_ep = SND_SOC_DAPM_EP_SINK;
3844 w->power_check = dapm_generic_check_power;
3845 break;
3846 case snd_soc_dapm_vmid:
3847 case snd_soc_dapm_siggen:
3848 w->is_ep = SND_SOC_DAPM_EP_SOURCE;
3849 w->power_check = dapm_always_on_check_power;
3850 break;
3851 case snd_soc_dapm_sink:
3852 w->is_ep = SND_SOC_DAPM_EP_SINK;
3853 w->power_check = dapm_always_on_check_power;
3854 break;
3855
3856 case snd_soc_dapm_mux:
3857 case snd_soc_dapm_mux_named_ctl:
3858 case snd_soc_dapm_demux:
3859 case snd_soc_dapm_switch:
3860 case snd_soc_dapm_mixer:
3861 case snd_soc_dapm_mixer_named_ctl:
3862 case snd_soc_dapm_adc:
3863 case snd_soc_dapm_aif_out:
3864 case snd_soc_dapm_dac:
3865 case snd_soc_dapm_aif_in:
3866 case snd_soc_dapm_pga:
3867 case snd_soc_dapm_buffer:
3868 case snd_soc_dapm_scheduler:
3869 case snd_soc_dapm_effect:
3870 case snd_soc_dapm_src:
3871 case snd_soc_dapm_asrc:
3872 case snd_soc_dapm_encoder:
3873 case snd_soc_dapm_decoder:
3874 case snd_soc_dapm_out_drv:
3875 case snd_soc_dapm_micbias:
3876 case snd_soc_dapm_line:
3877 case snd_soc_dapm_dai_link:
3878 case snd_soc_dapm_dai_out:
3879 case snd_soc_dapm_dai_in:
3880 w->power_check = dapm_generic_check_power;
3881 break;
3882 case snd_soc_dapm_supply:
3883 case snd_soc_dapm_regulator_supply:
3884 case snd_soc_dapm_pinctrl:
3885 case snd_soc_dapm_clock_supply:
3886 case snd_soc_dapm_kcontrol:
3887 w->is_supply = 1;
3888 w->power_check = dapm_supply_check_power;
3889 break;
3890 default:
3891 w->power_check = dapm_always_on_check_power;
3892 break;
3893 }
3894
3895 w->dapm = dapm;
3896 INIT_LIST_HEAD(&w->list);
3897 INIT_LIST_HEAD(&w->dirty);
3898 /* see for_each_card_widgets */
3899 list_add_tail(&w->list, &dapm->card->widgets);
3900
3901 dapm_for_each_direction(dir) {
3902 INIT_LIST_HEAD(&w->edges[dir]);
3903 w->endpoints[dir] = -1;
3904 }
3905
3906 /* machine layer sets up unconnected pins and insertions */
3907 w->connected = 1;
3908 return w;
3909
3910 request_failed:
3911 dev_err_probe(dev, ret, "ASoC: Failed to request %s\n",
3912 w->name);
3913 kfree_const(w->name);
3914 kfree_const(w->sname);
3915 kfree(w);
3916 cnew_failed:
3917 return ERR_PTR(ret);
3918 }
3919
3920 /**
3921 * snd_soc_dapm_new_control - create new dapm control
3922 * @dapm: DAPM context
3923 * @widget: widget template
3924 *
3925 * Creates new DAPM control based upon a template.
3926 *
3927 * Returns a widget pointer on success or an error pointer on failure
3928 */
3929 struct snd_soc_dapm_widget *
snd_soc_dapm_new_control(struct snd_soc_dapm_context * dapm,const struct snd_soc_dapm_widget * widget)3930 snd_soc_dapm_new_control(struct snd_soc_dapm_context *dapm,
3931 const struct snd_soc_dapm_widget *widget)
3932 {
3933 struct snd_soc_dapm_widget *w;
3934
3935 snd_soc_dapm_mutex_lock(dapm);
3936 w = snd_soc_dapm_new_control_unlocked(dapm, widget);
3937 snd_soc_dapm_mutex_unlock(dapm);
3938
3939 return w;
3940 }
3941 EXPORT_SYMBOL_GPL(snd_soc_dapm_new_control);
3942
3943 /**
3944 * snd_soc_dapm_new_controls - create new dapm controls
3945 * @dapm: DAPM context
3946 * @widget: widget array
3947 * @num: number of widgets
3948 *
3949 * Creates new DAPM controls based upon the templates.
3950 *
3951 * Returns 0 for success else error.
3952 */
snd_soc_dapm_new_controls(struct snd_soc_dapm_context * dapm,const struct snd_soc_dapm_widget * widget,unsigned int num)3953 int snd_soc_dapm_new_controls(struct snd_soc_dapm_context *dapm,
3954 const struct snd_soc_dapm_widget *widget,
3955 unsigned int num)
3956 {
3957 int i;
3958 int ret = 0;
3959
3960 snd_soc_dapm_mutex_lock_root(dapm);
3961 for (i = 0; i < num; i++) {
3962 struct snd_soc_dapm_widget *w = snd_soc_dapm_new_control_unlocked(dapm, widget);
3963 if (IS_ERR(w)) {
3964 ret = PTR_ERR(w);
3965 break;
3966 }
3967 widget++;
3968 }
3969 snd_soc_dapm_mutex_unlock(dapm);
3970 return ret;
3971 }
3972 EXPORT_SYMBOL_GPL(snd_soc_dapm_new_controls);
3973
dapm_dai_link_event_pre_pmu(struct snd_soc_dapm_widget * w,struct snd_pcm_substream * substream)3974 static int dapm_dai_link_event_pre_pmu(struct snd_soc_dapm_widget *w,
3975 struct snd_pcm_substream *substream)
3976 {
3977 struct device *dev = snd_soc_dapm_to_dev(w->dapm);
3978 struct snd_soc_dapm_path *path;
3979 struct snd_soc_dai *source, *sink;
3980 struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
3981 const struct snd_soc_pcm_stream *config = NULL;
3982 struct snd_pcm_runtime *runtime = NULL;
3983 unsigned int fmt;
3984 int ret;
3985
3986 /*
3987 * NOTE
3988 *
3989 * snd_pcm_hw_params is quite large (608 bytes on arm64) and is
3990 * starting to get a bit excessive for allocation on the stack,
3991 * especially when you're building with some of the KASAN type
3992 * stuff that increases stack usage.
3993 * So, we use kzalloc()/kfree() for params in this function.
3994 */
3995 struct snd_pcm_hw_params *params __free(kfree) = kzalloc_obj(*params);
3996 if (!params)
3997 return -ENOMEM;
3998
3999 runtime = kzalloc_obj(*runtime);
4000 if (!runtime)
4001 return -ENOMEM;
4002
4003 substream->runtime = runtime;
4004
4005 substream->stream = SNDRV_PCM_STREAM_CAPTURE;
4006 snd_soc_dapm_widget_for_each_source_path(w, path) {
4007 source = path->source->priv;
4008
4009 ret = snd_soc_dai_startup(source, substream);
4010 if (ret < 0)
4011 return ret;
4012
4013 snd_soc_dai_activate(source, substream->stream);
4014 }
4015
4016 substream->stream = SNDRV_PCM_STREAM_PLAYBACK;
4017 snd_soc_dapm_widget_for_each_sink_path(w, path) {
4018 sink = path->sink->priv;
4019
4020 ret = snd_soc_dai_startup(sink, substream);
4021 if (ret < 0)
4022 return ret;
4023
4024 snd_soc_dai_activate(sink, substream->stream);
4025 }
4026
4027 substream->hw_opened = 1;
4028
4029 /*
4030 * Note: getting the config after .startup() gives a chance to
4031 * either party on the link to alter the configuration if
4032 * necessary
4033 */
4034 config = rtd->dai_link->c2c_params + rtd->c2c_params_select;
4035 if (!config) {
4036 dev_err(dev, "ASoC: link config missing\n");
4037 return -EINVAL;
4038 }
4039
4040 /* Be a little careful as we don't want to overflow the mask array */
4041 if (!config->formats) {
4042 dev_warn(dev, "ASoC: Invalid format was specified\n");
4043
4044 return -EINVAL;
4045 }
4046
4047 fmt = ffs(config->formats) - 1;
4048
4049 snd_mask_set(hw_param_mask(params, SNDRV_PCM_HW_PARAM_FORMAT), fmt);
4050 hw_param_interval(params, SNDRV_PCM_HW_PARAM_RATE)->min =
4051 config->rate_min;
4052 hw_param_interval(params, SNDRV_PCM_HW_PARAM_RATE)->max =
4053 config->rate_max;
4054 hw_param_interval(params, SNDRV_PCM_HW_PARAM_CHANNELS)->min
4055 = config->channels_min;
4056 hw_param_interval(params, SNDRV_PCM_HW_PARAM_CHANNELS)->max
4057 = config->channels_max;
4058
4059 substream->stream = SNDRV_PCM_STREAM_CAPTURE;
4060 snd_soc_dapm_widget_for_each_source_path(w, path) {
4061 source = path->source->priv;
4062
4063 ret = snd_soc_dai_hw_params(source, substream, params);
4064 if (ret < 0)
4065 return ret;
4066
4067 dapm_update_dai_unlocked(substream, params, source);
4068 }
4069
4070 substream->stream = SNDRV_PCM_STREAM_PLAYBACK;
4071 snd_soc_dapm_widget_for_each_sink_path(w, path) {
4072 sink = path->sink->priv;
4073
4074 ret = snd_soc_dai_hw_params(sink, substream, params);
4075 if (ret < 0)
4076 return ret;
4077
4078 dapm_update_dai_unlocked(substream, params, sink);
4079 }
4080
4081 runtime->format = params_format(params);
4082 runtime->subformat = params_subformat(params);
4083 runtime->channels = params_channels(params);
4084 runtime->rate = params_rate(params);
4085
4086 return 0;
4087 }
4088
dapm_dai_link_event(struct snd_soc_dapm_widget * w,struct snd_kcontrol * kcontrol,int event)4089 static int dapm_dai_link_event(struct snd_soc_dapm_widget *w,
4090 struct snd_kcontrol *kcontrol, int event)
4091 {
4092 struct snd_soc_dapm_path *path;
4093 struct snd_soc_dai *source, *sink;
4094 struct snd_pcm_substream *substream = w->priv;
4095 int ret = 0, saved_stream = substream->stream;
4096
4097 if (WARN_ON(list_empty(&w->edges[SND_SOC_DAPM_DIR_OUT]) ||
4098 list_empty(&w->edges[SND_SOC_DAPM_DIR_IN])))
4099 return -EINVAL;
4100
4101 switch (event) {
4102 case SND_SOC_DAPM_PRE_PMU:
4103 ret = dapm_dai_link_event_pre_pmu(w, substream);
4104 if (ret < 0)
4105 goto out;
4106
4107 break;
4108
4109 case SND_SOC_DAPM_POST_PMU:
4110 snd_soc_dapm_widget_for_each_source_path(w, path) {
4111 source = path->source->priv;
4112
4113 snd_soc_dai_prepare(source, substream);
4114 }
4115
4116 snd_soc_dapm_widget_for_each_sink_path(w, path) {
4117 sink = path->sink->priv;
4118
4119 snd_soc_dai_prepare(sink, substream);
4120 }
4121
4122 snd_soc_dapm_widget_for_each_sink_path(w, path) {
4123 sink = path->sink->priv;
4124
4125 snd_soc_dai_digital_mute(sink, 0, SNDRV_PCM_STREAM_PLAYBACK);
4126 ret = 0;
4127 }
4128 break;
4129
4130 case SND_SOC_DAPM_PRE_PMD:
4131 snd_soc_dapm_widget_for_each_sink_path(w, path) {
4132 sink = path->sink->priv;
4133
4134 snd_soc_dai_digital_mute(sink, 1, SNDRV_PCM_STREAM_PLAYBACK);
4135 ret = 0;
4136 }
4137
4138 substream->stream = SNDRV_PCM_STREAM_CAPTURE;
4139 snd_soc_dapm_widget_for_each_source_path(w, path) {
4140 source = path->source->priv;
4141 snd_soc_dai_hw_free(source, substream, 0);
4142 }
4143
4144 substream->stream = SNDRV_PCM_STREAM_PLAYBACK;
4145 snd_soc_dapm_widget_for_each_sink_path(w, path) {
4146 sink = path->sink->priv;
4147 snd_soc_dai_hw_free(sink, substream, 0);
4148 }
4149
4150 substream->stream = SNDRV_PCM_STREAM_CAPTURE;
4151 snd_soc_dapm_widget_for_each_source_path(w, path) {
4152 source = path->source->priv;
4153 snd_soc_dai_deactivate(source, substream->stream);
4154 snd_soc_dai_shutdown(source, substream, 0);
4155 }
4156
4157 substream->stream = SNDRV_PCM_STREAM_PLAYBACK;
4158 snd_soc_dapm_widget_for_each_sink_path(w, path) {
4159 sink = path->sink->priv;
4160 snd_soc_dai_deactivate(sink, substream->stream);
4161 snd_soc_dai_shutdown(sink, substream, 0);
4162 }
4163 break;
4164
4165 case SND_SOC_DAPM_POST_PMD:
4166 kfree(substream->runtime);
4167 substream->runtime = NULL;
4168 break;
4169
4170 default:
4171 WARN(1, "Unknown event %d\n", event);
4172 ret = -EINVAL;
4173 }
4174
4175 out:
4176 /* Restore the substream direction */
4177 substream->stream = saved_stream;
4178 return ret;
4179 }
4180
dapm_dai_link_get(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_value * ucontrol)4181 static int dapm_dai_link_get(struct snd_kcontrol *kcontrol,
4182 struct snd_ctl_elem_value *ucontrol)
4183 {
4184 struct snd_soc_dapm_widget *w = snd_kcontrol_chip(kcontrol);
4185 struct snd_soc_pcm_runtime *rtd = w->priv;
4186
4187 ucontrol->value.enumerated.item[0] = rtd->c2c_params_select;
4188
4189 return 0;
4190 }
4191
dapm_dai_link_put(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_value * ucontrol)4192 static int dapm_dai_link_put(struct snd_kcontrol *kcontrol,
4193 struct snd_ctl_elem_value *ucontrol)
4194 {
4195 struct snd_soc_dapm_widget *w = snd_kcontrol_chip(kcontrol);
4196 struct snd_soc_pcm_runtime *rtd = w->priv;
4197
4198 /* Can't change the config when widget is already powered */
4199 if (w->power)
4200 return -EBUSY;
4201
4202 if (ucontrol->value.enumerated.item[0] == rtd->c2c_params_select)
4203 return 0;
4204
4205 if (ucontrol->value.enumerated.item[0] >= rtd->dai_link->num_c2c_params)
4206 return -EINVAL;
4207
4208 rtd->c2c_params_select = ucontrol->value.enumerated.item[0];
4209
4210 return 1;
4211 }
4212
dapm_free_kcontrol(struct snd_soc_card * card,unsigned long * private_value,int num_c2c_params,const char ** w_param_text)4213 static void dapm_free_kcontrol(struct snd_soc_card *card,
4214 unsigned long *private_value,
4215 int num_c2c_params,
4216 const char **w_param_text)
4217 {
4218 int count;
4219
4220 devm_kfree(card->dev, (void *)*private_value);
4221
4222 if (!w_param_text)
4223 return;
4224
4225 for (count = 0 ; count < num_c2c_params; count++)
4226 devm_kfree(card->dev, (void *)w_param_text[count]);
4227 devm_kfree(card->dev, w_param_text);
4228 }
4229
4230 static struct snd_kcontrol_new *
dapm_alloc_kcontrol(struct snd_soc_card * card,char * link_name,const struct snd_soc_pcm_stream * c2c_params,int num_c2c_params,const char ** w_param_text,unsigned long * private_value)4231 dapm_alloc_kcontrol(struct snd_soc_card *card,
4232 char *link_name,
4233 const struct snd_soc_pcm_stream *c2c_params,
4234 int num_c2c_params, const char **w_param_text,
4235 unsigned long *private_value)
4236 {
4237 struct soc_enum w_param_enum[] = {
4238 SOC_ENUM_SINGLE(0, 0, 0, NULL),
4239 };
4240 struct snd_kcontrol_new kcontrol_dai_link[] = {
4241 SOC_ENUM_EXT(NULL, w_param_enum[0],
4242 dapm_dai_link_get,
4243 dapm_dai_link_put),
4244 };
4245 struct snd_kcontrol_new *kcontrol_news;
4246 const struct snd_soc_pcm_stream *config = c2c_params;
4247 int count;
4248
4249 for (count = 0 ; count < num_c2c_params; count++) {
4250 if (!config->stream_name) {
4251 dev_warn(card->dev,
4252 "ASoC: anonymous config %d for dai link %s\n",
4253 count, link_name);
4254 w_param_text[count] =
4255 devm_kasprintf(card->dev, GFP_KERNEL,
4256 "Anonymous Configuration %d",
4257 count);
4258 } else {
4259 w_param_text[count] = devm_kmemdup(card->dev,
4260 config->stream_name,
4261 strlen(config->stream_name) + 1,
4262 GFP_KERNEL);
4263 }
4264 if (!w_param_text[count])
4265 goto outfree_w_param;
4266 config++;
4267 }
4268
4269 w_param_enum[0].items = num_c2c_params;
4270 w_param_enum[0].texts = w_param_text;
4271
4272 *private_value =
4273 (unsigned long) devm_kmemdup(card->dev,
4274 (void *)(kcontrol_dai_link[0].private_value),
4275 sizeof(struct soc_enum), GFP_KERNEL);
4276 if (!*private_value) {
4277 dev_err(card->dev, "ASoC: Failed to create control for %s widget\n",
4278 link_name);
4279 goto outfree_w_param;
4280 }
4281 kcontrol_dai_link[0].private_value = *private_value;
4282 /* duplicate kcontrol_dai_link on heap so that memory persists */
4283 kcontrol_news = devm_kmemdup(card->dev, &kcontrol_dai_link[0],
4284 sizeof(struct snd_kcontrol_new),
4285 GFP_KERNEL);
4286 if (!kcontrol_news) {
4287 dev_err(card->dev, "ASoC: Failed to create control for %s widget\n",
4288 link_name);
4289 goto outfree_w_param;
4290 }
4291 return kcontrol_news;
4292
4293 outfree_w_param:
4294 dapm_free_kcontrol(card, private_value, num_c2c_params, w_param_text);
4295
4296 return NULL;
4297 }
4298
dapm_new_dai(struct snd_soc_card * card,struct snd_pcm_substream * substream,char * id)4299 static struct snd_soc_dapm_widget *dapm_new_dai(struct snd_soc_card *card,
4300 struct snd_pcm_substream *substream,
4301 char *id)
4302 {
4303 struct snd_soc_dapm_context *dapm = snd_soc_card_to_dapm(card);
4304 struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
4305 struct snd_soc_dapm_widget template;
4306 struct snd_soc_dapm_widget *w;
4307 const struct snd_kcontrol_new *kcontrol_news;
4308 int num_kcontrols;
4309 const char **w_param_text;
4310 unsigned long private_value = 0;
4311 char *link_name;
4312 int ret = -ENOMEM;
4313
4314 link_name = devm_kasprintf(card->dev, GFP_KERNEL, "%s-%s",
4315 rtd->dai_link->name, id);
4316 if (!link_name)
4317 goto name_fail;
4318
4319 /* allocate memory for control, only in case of multiple configs */
4320 w_param_text = NULL;
4321 kcontrol_news = NULL;
4322 num_kcontrols = 0;
4323 if (rtd->dai_link->num_c2c_params > 1) {
4324 w_param_text = devm_kcalloc(card->dev,
4325 rtd->dai_link->num_c2c_params,
4326 sizeof(char *), GFP_KERNEL);
4327 if (!w_param_text)
4328 goto param_fail;
4329
4330 num_kcontrols = 1;
4331 kcontrol_news = dapm_alloc_kcontrol(card, link_name,
4332 rtd->dai_link->c2c_params,
4333 rtd->dai_link->num_c2c_params,
4334 w_param_text, &private_value);
4335 if (!kcontrol_news)
4336 goto param_fail;
4337 }
4338
4339 memset(&template, 0, sizeof(template));
4340 template.reg = SND_SOC_NOPM;
4341 template.id = snd_soc_dapm_dai_link;
4342 template.name = link_name;
4343 template.event = dapm_dai_link_event;
4344 template.event_flags = SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
4345 SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD;
4346 template.kcontrol_news = kcontrol_news;
4347 template.num_kcontrols = num_kcontrols;
4348
4349 dev_dbg(card->dev, "ASoC: adding %s widget\n", link_name);
4350
4351 w = snd_soc_dapm_new_control_unlocked(dapm, &template);
4352 if (IS_ERR(w)) {
4353 ret = PTR_ERR(w);
4354 goto outfree_kcontrol_news;
4355 }
4356
4357 w->priv = substream;
4358
4359 return w;
4360
4361 outfree_kcontrol_news:
4362 devm_kfree(card->dev, (void *)template.kcontrol_news);
4363 dapm_free_kcontrol(card, &private_value,
4364 rtd->dai_link->num_c2c_params, w_param_text);
4365 param_fail:
4366 devm_kfree(card->dev, link_name);
4367 name_fail:
4368 dev_err(rtd->dev, "ASoC: Failed to create %s-%s widget: %d\n",
4369 rtd->dai_link->name, id, ret);
4370 return ERR_PTR(ret);
4371 }
4372
4373 /**
4374 * snd_soc_dapm_new_dai_widgets - Create new DAPM widgets
4375 * @dapm: DAPM context
4376 * @dai: parent DAI
4377 *
4378 * Returns 0 on success, error code otherwise.
4379 */
snd_soc_dapm_new_dai_widgets(struct snd_soc_dapm_context * dapm,struct snd_soc_dai * dai)4380 int snd_soc_dapm_new_dai_widgets(struct snd_soc_dapm_context *dapm,
4381 struct snd_soc_dai *dai)
4382 {
4383 struct device *dev = snd_soc_dapm_to_dev(dapm);
4384 struct snd_soc_dapm_widget template;
4385 struct snd_soc_dapm_widget *w;
4386
4387 WARN_ON(dev != dai->dev);
4388
4389 memset(&template, 0, sizeof(template));
4390 template.reg = SND_SOC_NOPM;
4391
4392 if (dai->driver->playback.stream_name) {
4393 template.id = snd_soc_dapm_dai_in;
4394 template.name = dai->driver->playback.stream_name;
4395 template.sname = dai->driver->playback.stream_name;
4396
4397 dev_dbg(dai->dev, "ASoC: adding %s widget\n",
4398 template.name);
4399
4400 w = snd_soc_dapm_new_control_unlocked(dapm, &template);
4401 if (IS_ERR(w))
4402 return PTR_ERR(w);
4403
4404 w->priv = dai;
4405 snd_soc_dai_set_widget_playback(dai, w);
4406 }
4407
4408 if (dai->driver->capture.stream_name) {
4409 template.id = snd_soc_dapm_dai_out;
4410 template.name = dai->driver->capture.stream_name;
4411 template.sname = dai->driver->capture.stream_name;
4412
4413 dev_dbg(dai->dev, "ASoC: adding %s widget\n",
4414 template.name);
4415
4416 w = snd_soc_dapm_new_control_unlocked(dapm, &template);
4417 if (IS_ERR(w))
4418 return PTR_ERR(w);
4419
4420 w->priv = dai;
4421 snd_soc_dai_set_widget_capture(dai, w);
4422 }
4423
4424 return 0;
4425 }
4426 EXPORT_SYMBOL_GPL(snd_soc_dapm_new_dai_widgets);
4427
snd_soc_dapm_link_dai_widgets(struct snd_soc_card * card)4428 int snd_soc_dapm_link_dai_widgets(struct snd_soc_card *card)
4429 {
4430 struct snd_soc_dapm_widget *dai_w, *w;
4431 struct snd_soc_dapm_widget *src, *sink;
4432 struct snd_soc_dai *dai;
4433
4434 /* For each DAI widget... */
4435 for_each_card_widgets(card, dai_w) {
4436 switch (dai_w->id) {
4437 case snd_soc_dapm_dai_in:
4438 case snd_soc_dapm_dai_out:
4439 break;
4440 default:
4441 continue;
4442 }
4443
4444 /* let users know there is no DAI to link */
4445 if (!dai_w->priv) {
4446 dev_dbg(card->dev, "dai widget %s has no DAI\n",
4447 dai_w->name);
4448 continue;
4449 }
4450
4451 dai = dai_w->priv;
4452
4453 /* ...find all widgets with the same stream and link them */
4454 for_each_card_widgets(card, w) {
4455 if (w->dapm != dai_w->dapm)
4456 continue;
4457
4458 switch (w->id) {
4459 case snd_soc_dapm_dai_in:
4460 case snd_soc_dapm_dai_out:
4461 continue;
4462 default:
4463 break;
4464 }
4465
4466 if (!w->sname || !strstr(w->sname, dai_w->sname))
4467 continue;
4468
4469 if (dai_w->id == snd_soc_dapm_dai_in) {
4470 src = dai_w;
4471 sink = w;
4472 } else {
4473 src = w;
4474 sink = dai_w;
4475 }
4476 dev_dbg(dai->dev, "%s -> %s\n", src->name, sink->name);
4477 dapm_add_path(w->dapm, src, sink, NULL, NULL);
4478 }
4479 }
4480
4481 return 0;
4482 }
4483
dapm_connect_dai_routes(struct snd_soc_dapm_context * dapm,struct snd_soc_dai * src_dai,struct snd_soc_dapm_widget * src,struct snd_soc_dapm_widget * dai,struct snd_soc_dai * sink_dai,struct snd_soc_dapm_widget * sink)4484 static void dapm_connect_dai_routes(struct snd_soc_dapm_context *dapm,
4485 struct snd_soc_dai *src_dai,
4486 struct snd_soc_dapm_widget *src,
4487 struct snd_soc_dapm_widget *dai,
4488 struct snd_soc_dai *sink_dai,
4489 struct snd_soc_dapm_widget *sink)
4490 {
4491 struct device *dev = snd_soc_dapm_to_dev(dapm);
4492
4493 dev_dbg(dev, "connected DAI link %s:%s -> %s:%s\n",
4494 src_dai->component->name, src->name,
4495 sink_dai->component->name, sink->name);
4496
4497 if (dai) {
4498 dapm_add_path(dapm, src, dai, NULL, NULL);
4499 src = dai;
4500 }
4501
4502 dapm_add_path(dapm, src, sink, NULL, NULL);
4503 }
4504
dapm_connect_dai_pair(struct snd_soc_card * card,struct snd_soc_pcm_runtime * rtd,struct snd_soc_dai * codec_dai,struct snd_soc_dai * cpu_dai)4505 static void dapm_connect_dai_pair(struct snd_soc_card *card,
4506 struct snd_soc_pcm_runtime *rtd,
4507 struct snd_soc_dai *codec_dai,
4508 struct snd_soc_dai *cpu_dai)
4509 {
4510 struct snd_soc_dapm_context *dapm = snd_soc_card_to_dapm(card);
4511 struct snd_soc_dai_link *dai_link = rtd->dai_link;
4512 struct snd_soc_dapm_widget *codec, *cpu;
4513 struct snd_soc_dai *src_dai[] = { cpu_dai, codec_dai };
4514 struct snd_soc_dai *sink_dai[] = { codec_dai, cpu_dai };
4515 struct snd_soc_dapm_widget **src[] = { &cpu, &codec };
4516 struct snd_soc_dapm_widget **sink[] = { &codec, &cpu };
4517 char *widget_name[] = { "playback", "capture" };
4518 int stream;
4519
4520 for_each_pcm_streams(stream) {
4521 int stream_cpu, stream_codec;
4522
4523 stream_cpu = snd_soc_get_stream_cpu(dai_link, stream);
4524 stream_codec = stream;
4525
4526 /* connect BE DAI playback if widgets are valid */
4527 cpu = snd_soc_dai_get_widget(cpu_dai, stream_cpu);
4528 codec = snd_soc_dai_get_widget(codec_dai, stream_codec);
4529
4530 if (!cpu || !codec)
4531 continue;
4532
4533 /* special handling for [Codec2Codec] */
4534 if (dai_link->c2c_params && !rtd->c2c_widget[stream]) {
4535 struct snd_pcm_substream *substream = rtd->pcm->streams[stream].substream;
4536 struct snd_soc_dapm_widget *dai = dapm_new_dai(card, substream,
4537 widget_name[stream]);
4538
4539 if (IS_ERR(dai))
4540 continue;
4541
4542 rtd->c2c_widget[stream] = dai;
4543 }
4544
4545 dapm_connect_dai_routes(dapm, src_dai[stream], *src[stream],
4546 rtd->c2c_widget[stream],
4547 sink_dai[stream], *sink[stream]);
4548 }
4549 }
4550
dapm_dai_stream_event(struct snd_soc_dai * dai,int stream,int event)4551 static void dapm_dai_stream_event(struct snd_soc_dai *dai, int stream, int event)
4552 {
4553 struct snd_soc_dapm_widget *w;
4554
4555 w = snd_soc_dai_get_widget(dai, stream);
4556
4557 if (w) {
4558 unsigned int ep;
4559
4560 dapm_mark_dirty(w, "stream event");
4561
4562 if (w->id == snd_soc_dapm_dai_in) {
4563 ep = SND_SOC_DAPM_EP_SOURCE;
4564 dapm_widget_invalidate_input_paths(w);
4565 } else {
4566 ep = SND_SOC_DAPM_EP_SINK;
4567 dapm_widget_invalidate_output_paths(w);
4568 }
4569
4570 switch (event) {
4571 case SND_SOC_DAPM_STREAM_START:
4572 w->active = 1;
4573 w->is_ep = ep;
4574 break;
4575 case SND_SOC_DAPM_STREAM_STOP:
4576 w->active = 0;
4577 w->is_ep = 0;
4578 break;
4579 case SND_SOC_DAPM_STREAM_SUSPEND:
4580 case SND_SOC_DAPM_STREAM_RESUME:
4581 case SND_SOC_DAPM_STREAM_PAUSE_PUSH:
4582 case SND_SOC_DAPM_STREAM_PAUSE_RELEASE:
4583 break;
4584 }
4585 }
4586 }
4587
snd_soc_dapm_connect_dai_link_widgets(struct snd_soc_card * card)4588 void snd_soc_dapm_connect_dai_link_widgets(struct snd_soc_card *card)
4589 {
4590 struct snd_soc_pcm_runtime *rtd;
4591 struct snd_soc_dai *cpu_dai;
4592 struct snd_soc_dai *codec_dai;
4593
4594 /* for each BE DAI link... */
4595 for_each_card_rtds(card, rtd) {
4596 struct snd_soc_dai_link_ch_map *ch_maps;
4597 int i;
4598
4599 /*
4600 * dynamic FE links have no fixed DAI mapping.
4601 * CODEC<->CODEC links have no direct connection.
4602 */
4603 if (rtd->dai_link->dynamic)
4604 continue;
4605
4606 /*
4607 * see
4608 * soc.h :: [dai_link->ch_maps Image sample]
4609 */
4610 for_each_rtd_ch_maps(rtd, i, ch_maps) {
4611 cpu_dai = snd_soc_rtd_to_cpu(rtd, ch_maps->cpu);
4612 codec_dai = snd_soc_rtd_to_codec(rtd, ch_maps->codec);
4613
4614 dapm_connect_dai_pair(card, rtd, codec_dai, cpu_dai);
4615 }
4616 }
4617 }
4618
snd_soc_dapm_ignore_suspend_widgets(struct snd_soc_card * card)4619 int snd_soc_dapm_ignore_suspend_widgets(struct snd_soc_card *card)
4620 {
4621 struct snd_soc_dapm_widget *w;
4622 int i;
4623
4624 for (i = 0; i < card->num_ignore_suspend_widgets; i++) {
4625 w = dapm_find_widget(snd_soc_card_to_dapm(card),
4626 card->ignore_suspend_widgets[i], true);
4627 if (!w) {
4628 dev_err(card->dev, "ASoC: DAPM unknown ignore suspend widget %s\n",
4629 card->ignore_suspend_widgets[i]);
4630 return -EINVAL;
4631 }
4632 w->ignore_suspend = 1;
4633 }
4634
4635 for (i = 0; i < card->num_of_ignore_suspend_widgets; i++) {
4636 w = dapm_find_widget(snd_soc_card_to_dapm(card),
4637 card->of_ignore_suspend_widgets[i], true);
4638 if (!w) {
4639 dev_err(card->dev, "ASoC: DAPM unknown ignore suspend widget %s\n",
4640 card->of_ignore_suspend_widgets[i]);
4641 return -EINVAL;
4642 }
4643 w->ignore_suspend = 1;
4644 }
4645
4646 return 0;
4647 }
4648
dapm_stream_event(struct snd_soc_pcm_runtime * rtd,int stream,int event)4649 static void dapm_stream_event(struct snd_soc_pcm_runtime *rtd, int stream, int event)
4650 {
4651 struct snd_soc_dai *dai;
4652 int i;
4653
4654 for_each_rtd_dais(rtd, i, dai)
4655 dapm_dai_stream_event(dai, stream, event);
4656
4657 dapm_power_widgets(rtd->card, event, NULL);
4658 }
4659
4660 /**
4661 * snd_soc_dapm_stream_event - send a stream event to the dapm core
4662 * @rtd: PCM runtime data
4663 * @stream: stream name
4664 * @event: stream event
4665 *
4666 * Sends a stream event to the dapm core. The core then makes any
4667 * necessary widget power changes.
4668 *
4669 * Returns 0 for success else error.
4670 */
snd_soc_dapm_stream_event(struct snd_soc_pcm_runtime * rtd,int stream,int event)4671 void snd_soc_dapm_stream_event(struct snd_soc_pcm_runtime *rtd, int stream,
4672 int event)
4673 {
4674 struct snd_soc_card *card = rtd->card;
4675
4676 snd_soc_dapm_mutex_lock(card);
4677 dapm_stream_event(rtd, stream, event);
4678 snd_soc_dapm_mutex_unlock(card);
4679 }
4680
snd_soc_dapm_stream_stop(struct snd_soc_pcm_runtime * rtd,int stream)4681 void snd_soc_dapm_stream_stop(struct snd_soc_pcm_runtime *rtd, int stream)
4682 {
4683 if (stream == SNDRV_PCM_STREAM_PLAYBACK) {
4684 if (snd_soc_runtime_ignore_pmdown_time(rtd)) {
4685 /* powered down playback stream now */
4686 snd_soc_dapm_stream_event(rtd,
4687 SNDRV_PCM_STREAM_PLAYBACK,
4688 SND_SOC_DAPM_STREAM_STOP);
4689 } else {
4690 /* start delayed pop wq here for playback streams */
4691 rtd->pop_wait = 1;
4692 queue_delayed_work(system_power_efficient_wq,
4693 &rtd->delayed_work,
4694 msecs_to_jiffies(rtd->pmdown_time));
4695 }
4696 } else {
4697 /* capture streams can be powered down now */
4698 snd_soc_dapm_stream_event(rtd, SNDRV_PCM_STREAM_CAPTURE,
4699 SND_SOC_DAPM_STREAM_STOP);
4700 }
4701 }
4702 EXPORT_SYMBOL_GPL(snd_soc_dapm_stream_stop);
4703
4704 /**
4705 * snd_soc_dapm_enable_pin_unlocked - enable pin.
4706 * @dapm: DAPM context
4707 * @pin: pin name
4708 *
4709 * Enables input/output pin and its parents or children widgets iff there is
4710 * a valid audio route and active audio stream.
4711 *
4712 * Requires external locking.
4713 *
4714 * NOTE: snd_soc_dapm_sync() needs to be called after this for DAPM to
4715 * do any widget power switching.
4716 */
snd_soc_dapm_enable_pin_unlocked(struct snd_soc_dapm_context * dapm,const char * pin)4717 int snd_soc_dapm_enable_pin_unlocked(struct snd_soc_dapm_context *dapm,
4718 const char *pin)
4719 {
4720 return dapm_set_pin(dapm, pin, 1);
4721 }
4722 EXPORT_SYMBOL_GPL(snd_soc_dapm_enable_pin_unlocked);
4723
4724 /**
4725 * snd_soc_dapm_enable_pin - enable pin.
4726 * @dapm: DAPM context
4727 * @pin: pin name
4728 *
4729 * Enables input/output pin and its parents or children widgets iff there is
4730 * a valid audio route and active audio stream.
4731 *
4732 * NOTE: snd_soc_dapm_sync() needs to be called after this for DAPM to
4733 * do any widget power switching.
4734 */
snd_soc_dapm_enable_pin(struct snd_soc_dapm_context * dapm,const char * pin)4735 int snd_soc_dapm_enable_pin(struct snd_soc_dapm_context *dapm, const char *pin)
4736 {
4737 int ret;
4738
4739 snd_soc_dapm_mutex_lock(dapm);
4740
4741 ret = dapm_set_pin(dapm, pin, 1);
4742
4743 snd_soc_dapm_mutex_unlock(dapm);
4744
4745 return ret;
4746 }
4747 EXPORT_SYMBOL_GPL(snd_soc_dapm_enable_pin);
4748
4749 /**
4750 * snd_soc_dapm_force_enable_pin_unlocked - force a pin to be enabled
4751 * @dapm: DAPM context
4752 * @pin: pin name
4753 *
4754 * Enables input/output pin regardless of any other state. This is
4755 * intended for use with microphone bias supplies used in microphone
4756 * jack detection.
4757 *
4758 * Requires external locking.
4759 *
4760 * NOTE: snd_soc_dapm_sync() needs to be called after this for DAPM to
4761 * do any widget power switching.
4762 */
snd_soc_dapm_force_enable_pin_unlocked(struct snd_soc_dapm_context * dapm,const char * pin)4763 int snd_soc_dapm_force_enable_pin_unlocked(struct snd_soc_dapm_context *dapm,
4764 const char *pin)
4765 {
4766 struct device *dev;
4767 struct snd_soc_dapm_widget *w = dapm_find_widget(dapm, pin, true);
4768
4769 if (!w) {
4770 dev = snd_soc_dapm_to_dev(dapm);
4771
4772 dev_err(dev, "ASoC: unknown pin %s\n", pin);
4773 return -EINVAL;
4774 }
4775
4776 dev = snd_soc_dapm_to_dev(w->dapm);
4777
4778 dev_dbg(dev, "ASoC: force enable pin %s\n", pin);
4779 if (!w->connected) {
4780 /*
4781 * w->force does not affect the number of input or output paths,
4782 * so we only have to recheck if w->connected is changed
4783 */
4784 dapm_widget_invalidate_input_paths(w);
4785 dapm_widget_invalidate_output_paths(w);
4786 w->connected = 1;
4787 }
4788 w->force = 1;
4789 dapm_mark_dirty(w, "force enable");
4790
4791 return 0;
4792 }
4793 EXPORT_SYMBOL_GPL(snd_soc_dapm_force_enable_pin_unlocked);
4794
4795 /**
4796 * snd_soc_dapm_force_enable_pin - force a pin to be enabled
4797 * @dapm: DAPM context
4798 * @pin: pin name
4799 *
4800 * Enables input/output pin regardless of any other state. This is
4801 * intended for use with microphone bias supplies used in microphone
4802 * jack detection.
4803 *
4804 * NOTE: snd_soc_dapm_sync() needs to be called after this for DAPM to
4805 * do any widget power switching.
4806 */
snd_soc_dapm_force_enable_pin(struct snd_soc_dapm_context * dapm,const char * pin)4807 int snd_soc_dapm_force_enable_pin(struct snd_soc_dapm_context *dapm,
4808 const char *pin)
4809 {
4810 int ret;
4811
4812 snd_soc_dapm_mutex_lock(dapm);
4813
4814 ret = snd_soc_dapm_force_enable_pin_unlocked(dapm, pin);
4815
4816 snd_soc_dapm_mutex_unlock(dapm);
4817
4818 return ret;
4819 }
4820 EXPORT_SYMBOL_GPL(snd_soc_dapm_force_enable_pin);
4821
4822 /**
4823 * snd_soc_dapm_disable_pin_unlocked - disable pin.
4824 * @dapm: DAPM context
4825 * @pin: pin name
4826 *
4827 * Disables input/output pin and its parents or children widgets.
4828 *
4829 * Requires external locking.
4830 *
4831 * NOTE: snd_soc_dapm_sync() needs to be called after this for DAPM to
4832 * do any widget power switching.
4833 */
snd_soc_dapm_disable_pin_unlocked(struct snd_soc_dapm_context * dapm,const char * pin)4834 int snd_soc_dapm_disable_pin_unlocked(struct snd_soc_dapm_context *dapm,
4835 const char *pin)
4836 {
4837 return dapm_set_pin(dapm, pin, 0);
4838 }
4839 EXPORT_SYMBOL_GPL(snd_soc_dapm_disable_pin_unlocked);
4840
4841 /**
4842 * snd_soc_dapm_disable_pin - disable pin.
4843 * @dapm: DAPM context
4844 * @pin: pin name
4845 *
4846 * Disables input/output pin and its parents or children widgets.
4847 *
4848 * NOTE: snd_soc_dapm_sync() needs to be called after this for DAPM to
4849 * do any widget power switching.
4850 */
snd_soc_dapm_disable_pin(struct snd_soc_dapm_context * dapm,const char * pin)4851 int snd_soc_dapm_disable_pin(struct snd_soc_dapm_context *dapm,
4852 const char *pin)
4853 {
4854 int ret;
4855
4856 snd_soc_dapm_mutex_lock(dapm);
4857
4858 ret = dapm_set_pin(dapm, pin, 0);
4859
4860 snd_soc_dapm_mutex_unlock(dapm);
4861
4862 return ret;
4863 }
4864 EXPORT_SYMBOL_GPL(snd_soc_dapm_disable_pin);
4865
4866 /**
4867 * snd_soc_dapm_get_pin_status - get audio pin status
4868 * @dapm: DAPM context
4869 * @pin: audio signal pin endpoint (or start point)
4870 *
4871 * Get audio pin status - connected or disconnected.
4872 *
4873 * Returns 1 for connected otherwise 0.
4874 */
snd_soc_dapm_get_pin_status(struct snd_soc_dapm_context * dapm,const char * pin)4875 int snd_soc_dapm_get_pin_status(struct snd_soc_dapm_context *dapm,
4876 const char *pin)
4877 {
4878 struct snd_soc_dapm_widget *w = dapm_find_widget(dapm, pin, true);
4879
4880 if (w)
4881 return w->connected;
4882
4883 return 0;
4884 }
4885 EXPORT_SYMBOL_GPL(snd_soc_dapm_get_pin_status);
4886
4887 /**
4888 * snd_soc_dapm_ignore_suspend - ignore suspend status for DAPM endpoint
4889 * @dapm: DAPM context
4890 * @pin: audio signal pin endpoint (or start point)
4891 *
4892 * Mark the given endpoint or pin as ignoring suspend. When the
4893 * system is disabled a path between two endpoints flagged as ignoring
4894 * suspend will not be disabled. The path must already be enabled via
4895 * normal means at suspend time, it will not be turned on if it was not
4896 * already enabled.
4897 */
snd_soc_dapm_ignore_suspend(struct snd_soc_dapm_context * dapm,const char * pin)4898 int snd_soc_dapm_ignore_suspend(struct snd_soc_dapm_context *dapm,
4899 const char *pin)
4900 {
4901 struct device *dev = snd_soc_dapm_to_dev(dapm);
4902 struct snd_soc_dapm_widget *w = dapm_find_widget(dapm, pin, false);
4903
4904 if (!w) {
4905 dev_err(dev, "ASoC: unknown pin %s\n", pin);
4906 return -EINVAL;
4907 }
4908
4909 w->ignore_suspend = 1;
4910
4911 return 0;
4912 }
4913 EXPORT_SYMBOL_GPL(snd_soc_dapm_ignore_suspend);
4914
4915 /**
4916 * snd_soc_dapm_pin_has_prefix - check if given pin has a known prefix
4917 * @card: card to be checked
4918 * @pin: pin name
4919 *
4920 * Returns true if given pin has a known prefix
4921 */
snd_soc_dapm_pin_has_prefix(struct snd_soc_card * card,const char * pin)4922 bool snd_soc_dapm_pin_has_prefix(struct snd_soc_card *card, const char *pin)
4923 {
4924 struct snd_soc_component *component;
4925 const char *prefix;
4926 size_t prefix_len;
4927
4928 for_each_card_components(card, component) {
4929 prefix = component->name_prefix;
4930 if (!prefix)
4931 continue;
4932
4933 prefix_len = strlen(prefix);
4934 if (!strncmp(pin, prefix, prefix_len) && pin[prefix_len] == ' ')
4935 return true;
4936 }
4937
4938 return false;
4939 }
4940 EXPORT_SYMBOL_GPL(snd_soc_dapm_pin_has_prefix);
4941
4942 /**
4943 * snd_soc_dapm_free - free dapm resources
4944 * @dapm: DAPM context
4945 *
4946 * Free all dapm widgets and resources.
4947 */
snd_soc_dapm_free(struct snd_soc_dapm_context * dapm)4948 void snd_soc_dapm_free(struct snd_soc_dapm_context *dapm)
4949 {
4950 dapm_debugfs_cleanup(dapm);
4951 dapm_free_widgets(dapm);
4952 list_del(&dapm->list);
4953 }
4954
snd_soc_dapm_init(struct snd_soc_dapm_context * dapm,struct snd_soc_card * card,struct snd_soc_component * component)4955 void snd_soc_dapm_init(struct snd_soc_dapm_context *dapm,
4956 struct snd_soc_card *card,
4957 struct snd_soc_component *component)
4958 {
4959 dapm->card = card;
4960 dapm->component = component;
4961 dapm->bias_level = SND_SOC_BIAS_OFF;
4962
4963 if (component)
4964 dapm->idle_bias = component->driver->idle_bias_on;
4965
4966 INIT_LIST_HEAD(&dapm->list);
4967 /* see for_each_card_dapms */
4968 list_add(&dapm->list, &card->dapm_list);
4969 }
4970
dapm_shutdown(struct snd_soc_dapm_context * dapm)4971 static void dapm_shutdown(struct snd_soc_dapm_context *dapm)
4972 {
4973 struct snd_soc_card *card = dapm->card;
4974 struct snd_soc_dapm_widget *w;
4975 LIST_HEAD(down_list);
4976 int powerdown = 0;
4977
4978 snd_soc_dapm_mutex_lock_root(card);
4979
4980 for_each_card_widgets(dapm->card, w) {
4981 if (w->dapm != dapm)
4982 continue;
4983 if (w->power) {
4984 dapm_seq_insert(w, &down_list, false);
4985 w->new_power = 0;
4986 powerdown = 1;
4987 }
4988 }
4989
4990 /* If there were no widgets to power down we're already in
4991 * standby.
4992 */
4993 if (powerdown) {
4994 if (dapm->bias_level == SND_SOC_BIAS_ON)
4995 snd_soc_dapm_set_bias_level(dapm,
4996 SND_SOC_BIAS_PREPARE);
4997 dapm_seq_run(card, &down_list, 0, false);
4998 if (dapm->bias_level == SND_SOC_BIAS_PREPARE)
4999 snd_soc_dapm_set_bias_level(dapm,
5000 SND_SOC_BIAS_STANDBY);
5001 }
5002
5003 snd_soc_dapm_mutex_unlock(card);
5004 }
5005
5006 /*
5007 * snd_soc_dapm_shutdown - callback for system shutdown
5008 */
snd_soc_dapm_shutdown(struct snd_soc_card * card)5009 void snd_soc_dapm_shutdown(struct snd_soc_card *card)
5010 {
5011 struct snd_soc_dapm_context *card_dapm = snd_soc_card_to_dapm(card);
5012 struct snd_soc_dapm_context *dapm;
5013
5014 for_each_card_dapms(card, dapm) {
5015 if (dapm != card_dapm) {
5016 dapm_shutdown(dapm);
5017 if (dapm->bias_level == SND_SOC_BIAS_STANDBY)
5018 snd_soc_dapm_set_bias_level(dapm, SND_SOC_BIAS_OFF);
5019 }
5020 }
5021
5022 dapm_shutdown(card_dapm);
5023 if (card_dapm->bias_level == SND_SOC_BIAS_STANDBY)
5024 snd_soc_dapm_set_bias_level(card_dapm, SND_SOC_BIAS_OFF);
5025 }
5026
5027 /* Module information */
5028 MODULE_AUTHOR("Liam Girdwood, lrg@slimlogic.co.uk");
5029 MODULE_DESCRIPTION("Dynamic Audio Power Management core for ALSA SoC");
5030 MODULE_LICENSE("GPL");
5031