Lines Matching +full:sound +full:- +full:name +full:- +full:prefix
1 // SPDX-License-Identifier: GPL-2.0
3 // simple-card-utils.c
14 #include <sound/jack.h>
15 #include <sound/simple_card_utils.h>
25 if (data->convert_rate) in asoc_simple_convert_fixup()
26 rate->min = in asoc_simple_convert_fixup()
27 rate->max = data->convert_rate; in asoc_simple_convert_fixup()
29 if (data->convert_channels) in asoc_simple_convert_fixup()
30 channels->min = in asoc_simple_convert_fixup()
31 channels->max = data->convert_channels; in asoc_simple_convert_fixup()
37 char *prefix, in asoc_simple_parse_convert() argument
42 if (!prefix) in asoc_simple_parse_convert()
43 prefix = ""; in asoc_simple_parse_convert()
46 snprintf(prop, sizeof(prop), "%s%s", prefix, "convert-rate"); in asoc_simple_parse_convert()
47 of_property_read_u32(np, prop, &data->convert_rate); in asoc_simple_parse_convert()
50 snprintf(prop, sizeof(prop), "%s%s", prefix, "convert-channels"); in asoc_simple_parse_convert()
51 of_property_read_u32(np, prop, &data->convert_channels); in asoc_simple_parse_convert()
58 char *prefix, in asoc_simple_parse_daifmt() argument
65 daifmt = snd_soc_of_parse_daifmt(node, prefix, in asoc_simple_parse_daifmt()
71 * No dai-link level and master setting was not found from in asoc_simple_parse_daifmt()
72 * sound node level, revert back to legacy DT parsing and in asoc_simple_parse_daifmt()
102 char *name = NULL; in asoc_simple_set_dailink_name() local
103 int ret = -ENOMEM; in asoc_simple_set_dailink_name()
106 name = devm_kvasprintf(dev, GFP_KERNEL, fmt, ap); in asoc_simple_set_dailink_name()
109 if (name) { in asoc_simple_set_dailink_name()
112 dai_link->name = name; in asoc_simple_set_dailink_name()
113 dai_link->stream_name = name; in asoc_simple_set_dailink_name()
121 char *prefix) in asoc_simple_parse_card_name() argument
125 if (!prefix) in asoc_simple_parse_card_name()
126 prefix = ""; in asoc_simple_parse_card_name()
128 /* Parse the card name from DT */ in asoc_simple_parse_card_name()
130 if (ret < 0 || !card->name) { in asoc_simple_parse_card_name()
133 snprintf(prop, sizeof(prop), "%sname", prefix); in asoc_simple_parse_card_name()
139 if (!card->name && card->dai_link) in asoc_simple_parse_card_name()
140 card->name = card->dai_link->name; in asoc_simple_parse_card_name()
149 return clk_prepare_enable(dai->clk); in asoc_simple_clk_enable()
157 clk_disable_unprepare(dai->clk); in asoc_simple_clk_disable()
169 * Parse dai->sysclk come from "clocks = <&xxx>" in asoc_simple_parse_clk()
171 * or "system-clock-frequency = <xxx>" in asoc_simple_parse_clk()
176 simple_dai->sysclk = clk_get_rate(clk); in asoc_simple_parse_clk()
178 simple_dai->clk = clk; in asoc_simple_parse_clk()
179 } else if (!of_property_read_u32(node, "system-clock-frequency", &val)) { in asoc_simple_parse_clk()
180 simple_dai->sysclk = val; in asoc_simple_parse_clk()
182 clk = devm_get_clk_from_child(dev, dlc->of_node, NULL); in asoc_simple_parse_clk()
184 simple_dai->sysclk = clk_get_rate(clk); in asoc_simple_parse_clk()
187 if (of_property_read_bool(node, "system-clock-direction-out")) in asoc_simple_parse_clk()
188 simple_dai->clk_direction = SND_SOC_CLOCK_OUT; in asoc_simple_parse_clk()
197 struct asoc_simple_priv *priv = snd_soc_card_get_drvdata(rtd->card); in asoc_simple_startup()
198 struct simple_dai_props *dai_props = simple_priv_to_props(priv, rtd->num); in asoc_simple_startup()
201 ret = asoc_simple_clk_enable(dai_props->cpu_dai); in asoc_simple_startup()
205 ret = asoc_simple_clk_enable(dai_props->codec_dai); in asoc_simple_startup()
207 asoc_simple_clk_disable(dai_props->cpu_dai); in asoc_simple_startup()
218 struct asoc_simple_priv *priv = snd_soc_card_get_drvdata(rtd->card); in asoc_simple_shutdown()
220 simple_priv_to_props(priv, rtd->num); in asoc_simple_shutdown()
222 if (dai_props->mclk_fs) { in asoc_simple_shutdown()
227 asoc_simple_clk_disable(dai_props->cpu_dai); in asoc_simple_shutdown()
229 asoc_simple_clk_disable(dai_props->codec_dai); in asoc_simple_shutdown()
239 if (!simple_dai->clk) in asoc_simple_set_clk_rate()
242 if (clk_get_rate(simple_dai->clk) == rate) in asoc_simple_set_clk_rate()
245 return clk_set_rate(simple_dai->clk, rate); in asoc_simple_set_clk_rate()
254 struct asoc_simple_priv *priv = snd_soc_card_get_drvdata(rtd->card); in asoc_simple_hw_params()
256 simple_priv_to_props(priv, rtd->num); in asoc_simple_hw_params()
260 if (dai_props->mclk_fs) in asoc_simple_hw_params()
261 mclk_fs = dai_props->mclk_fs; in asoc_simple_hw_params()
266 ret = asoc_simple_set_clk_rate(dai_props->codec_dai, mclk); in asoc_simple_hw_params()
270 ret = asoc_simple_set_clk_rate(dai_props->cpu_dai, mclk); in asoc_simple_hw_params()
276 if (ret && ret != -ENOTSUPP) in asoc_simple_hw_params()
281 if (ret && ret != -ENOTSUPP) in asoc_simple_hw_params()
293 struct asoc_simple_priv *priv = snd_soc_card_get_drvdata(rtd->card); in asoc_simple_be_hw_params_fixup()
294 struct simple_dai_props *dai_props = simple_priv_to_props(priv, rtd->num); in asoc_simple_be_hw_params_fixup()
296 asoc_simple_convert_fixup(&dai_props->adata, params); in asoc_simple_be_hw_params_fixup()
310 if (simple_dai->sysclk) { in asoc_simple_init_dai()
311 ret = snd_soc_dai_set_sysclk(dai, 0, simple_dai->sysclk, in asoc_simple_init_dai()
312 simple_dai->clk_direction); in asoc_simple_init_dai()
313 if (ret && ret != -ENOTSUPP) { in asoc_simple_init_dai()
314 dev_err(dai->dev, "simple-card: set_sysclk error\n"); in asoc_simple_init_dai()
319 if (simple_dai->slots) { in asoc_simple_init_dai()
321 simple_dai->tx_slot_mask, in asoc_simple_init_dai()
322 simple_dai->rx_slot_mask, in asoc_simple_init_dai()
323 simple_dai->slots, in asoc_simple_init_dai()
324 simple_dai->slot_width); in asoc_simple_init_dai()
325 if (ret && ret != -ENOTSUPP) { in asoc_simple_init_dai()
326 dev_err(dai->dev, "simple-card: set_tdm_slot error\n"); in asoc_simple_init_dai()
337 struct snd_soc_dai_link *dai_link = rtd->dai_link; in asoc_simple_init_dai_link_params()
345 if (!component->driver->non_legacy_dai_naming) in asoc_simple_init_dai_link_params()
357 dev_err(rtd->dev, "simple-card: no valid dai_link params\n"); in asoc_simple_init_dai_link_params()
361 params = devm_kzalloc(rtd->dev, sizeof(*params), GFP_KERNEL); in asoc_simple_init_dai_link_params()
363 return -ENOMEM; in asoc_simple_init_dai_link_params()
365 params->formats = hw.formats; in asoc_simple_init_dai_link_params()
366 params->rates = hw.rates; in asoc_simple_init_dai_link_params()
367 params->rate_min = hw.rate_min; in asoc_simple_init_dai_link_params()
368 params->rate_max = hw.rate_max; in asoc_simple_init_dai_link_params()
369 params->channels_min = hw.channels_min; in asoc_simple_init_dai_link_params()
370 params->channels_max = hw.channels_max; in asoc_simple_init_dai_link_params()
372 dai_link->params = params; in asoc_simple_init_dai_link_params()
373 dai_link->num_params = 1; in asoc_simple_init_dai_link_params()
380 struct asoc_simple_priv *priv = snd_soc_card_get_drvdata(rtd->card); in asoc_simple_dai_init()
381 struct simple_dai_props *dai_props = simple_priv_to_props(priv, rtd->num); in asoc_simple_dai_init()
385 dai_props->codec_dai); in asoc_simple_dai_init()
390 dai_props->cpu_dai); in asoc_simple_dai_init()
405 if (!dai_link->platforms->of_node) in asoc_simple_canonicalize_platform()
406 dai_link->platforms->of_node = dai_link->cpus->of_node; in asoc_simple_canonicalize_platform()
412 if (!dai_link->platforms->of_node) in asoc_simple_canonicalize_platform()
413 dai_link->num_platforms = 0; in asoc_simple_canonicalize_platform()
421 * In soc_bind_dai_link() will check cpu name after in asoc_simple_canonicalize_cpu()
423 * but, it will never match if name was created by in asoc_simple_canonicalize_cpu()
430 dai_link->cpus->dai_name = NULL; in asoc_simple_canonicalize_cpu()
440 of_node_put(dai_link->cpus->of_node); in asoc_simple_clean_reference()
441 of_node_put(dai_link->codecs->of_node); in asoc_simple_clean_reference()
448 char *prefix) in asoc_simple_parse_routing() argument
450 struct device_node *node = card->dev->of_node; in asoc_simple_parse_routing()
453 if (!prefix) in asoc_simple_parse_routing()
454 prefix = ""; in asoc_simple_parse_routing()
456 snprintf(prop, sizeof(prop), "%s%s", prefix, "routing"); in asoc_simple_parse_routing()
466 char *prefix) in asoc_simple_parse_widgets() argument
468 struct device_node *node = card->dev->of_node; in asoc_simple_parse_widgets()
471 if (!prefix) in asoc_simple_parse_widgets()
472 prefix = ""; in asoc_simple_parse_widgets()
474 snprintf(prop, sizeof(prop), "%s%s", prefix, "widgets"); in asoc_simple_parse_widgets()
485 char *prefix) in asoc_simple_parse_pin_switches() argument
490 struct device *dev = card->dev; in asoc_simple_parse_pin_switches()
495 if (!prefix) in asoc_simple_parse_pin_switches()
496 prefix = ""; in asoc_simple_parse_pin_switches()
498 snprintf(prop, sizeof(prop), "%s%s", prefix, "pin-switches"); in asoc_simple_parse_pin_switches()
500 if (!of_property_read_bool(dev->of_node, prop)) in asoc_simple_parse_pin_switches()
506 return -ENOMEM; in asoc_simple_parse_pin_switches()
508 ret = of_property_read_string_array(dev->of_node, prop, in asoc_simple_parse_pin_switches()
518 return -ENOMEM; in asoc_simple_parse_pin_switches()
524 return -ENOMEM; in asoc_simple_parse_pin_switches()
527 controls[i].name = control_name; in asoc_simple_parse_pin_switches()
534 card->controls = controls; in asoc_simple_parse_pin_switches()
535 card->num_controls = nb_controls; in asoc_simple_parse_pin_switches()
543 int is_hp, char *prefix, in asoc_simple_init_jack() argument
546 struct device *dev = card->dev; in asoc_simple_init_jack()
554 if (!prefix) in asoc_simple_init_jack()
555 prefix = ""; in asoc_simple_init_jack()
557 sjack->gpio.gpio = -ENOENT; in asoc_simple_init_jack()
560 snprintf(prop, sizeof(prop), "%shp-det-gpio", prefix); in asoc_simple_init_jack()
565 snprintf(prop, sizeof(prop), "%smic-det-gpio", prefix); in asoc_simple_init_jack()
571 det = of_get_named_gpio_flags(dev->of_node, prop, 0, &flags); in asoc_simple_init_jack()
572 if (det == -EPROBE_DEFER) in asoc_simple_init_jack()
573 return -EPROBE_DEFER; in asoc_simple_init_jack()
576 sjack->pin.pin = pin_name; in asoc_simple_init_jack()
577 sjack->pin.mask = mask; in asoc_simple_init_jack()
579 sjack->gpio.name = gpio_name; in asoc_simple_init_jack()
580 sjack->gpio.report = mask; in asoc_simple_init_jack()
581 sjack->gpio.gpio = det; in asoc_simple_init_jack()
582 sjack->gpio.invert = !!(flags & OF_GPIO_ACTIVE_LOW); in asoc_simple_init_jack()
583 sjack->gpio.debounce_time = 150; in asoc_simple_init_jack()
586 &sjack->jack, in asoc_simple_init_jack()
587 &sjack->pin, 1); in asoc_simple_init_jack()
589 snd_soc_jack_add_gpios(&sjack->jack, 1, in asoc_simple_init_jack()
590 &sjack->gpio); in asoc_simple_init_jack()
608 dai_props = devm_kcalloc(dev, li->link, sizeof(*dai_props), GFP_KERNEL); in asoc_simple_init_priv()
609 dai_link = devm_kcalloc(dev, li->link, sizeof(*dai_link), GFP_KERNEL); in asoc_simple_init_priv()
610 dais = devm_kcalloc(dev, li->dais, sizeof(*dais), GFP_KERNEL); in asoc_simple_init_priv()
612 return -ENOMEM; in asoc_simple_init_priv()
614 if (li->conf) { in asoc_simple_init_priv()
615 cconf = devm_kcalloc(dev, li->conf, sizeof(*cconf), GFP_KERNEL); in asoc_simple_init_priv()
617 return -ENOMEM; in asoc_simple_init_priv()
624 * soc-core.c :: snd_soc_init_multicodec() in asoc_simple_init_priv()
628 * simple-card-utils.c :: asoc_simple_canonicalize_platform() in asoc_simple_init_priv()
630 for (i = 0; i < li->link; i++) { in asoc_simple_init_priv()
639 priv->dai_props = dai_props; in asoc_simple_init_priv()
640 priv->dai_link = dai_link; in asoc_simple_init_priv()
641 priv->dais = dais; in asoc_simple_init_priv()
642 priv->codec_conf = cconf; in asoc_simple_init_priv()
644 card->dai_link = priv->dai_link; in asoc_simple_init_priv()
645 card->num_links = li->link; in asoc_simple_init_priv()
646 card->codec_conf = cconf; in asoc_simple_init_priv()
647 card->num_configs = li->conf; in asoc_simple_init_priv()