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