Lines Matching +full:mic +full:- +full:det +full:- +full:gpio
1 // SPDX-License-Identifier: GPL-2.0
3 // simple-card-utils.c
8 #include <linux/gpio.h>
9 #include <linux/gpio/consumer.h>
25 if (data->convert_rate) in asoc_simple_card_convert_fixup()
26 rate->min = in asoc_simple_card_convert_fixup()
27 rate->max = data->convert_rate; in asoc_simple_card_convert_fixup()
29 if (data->convert_channels) in asoc_simple_card_convert_fixup()
30 channels->min = in asoc_simple_card_convert_fixup()
31 channels->max = data->convert_channels; in asoc_simple_card_convert_fixup()
38 struct device_node *np = dev->of_node; in asoc_simple_card_parse_convert()
45 snprintf(prop, sizeof(prop), "%s%s", prefix, "convert-rate"); in asoc_simple_card_parse_convert()
46 of_property_read_u32(np, prop, &data->convert_rate); in asoc_simple_card_parse_convert()
49 snprintf(prop, sizeof(prop), "%s%s", prefix, "convert-channels"); in asoc_simple_card_parse_convert()
50 of_property_read_u32(np, prop, &data->convert_channels); in asoc_simple_card_parse_convert()
52 dev_dbg(dev, "convert_rate %d\n", data->convert_rate); in asoc_simple_card_parse_convert()
53 dev_dbg(dev, "convert_channels %d\n", data->convert_channels); in asoc_simple_card_parse_convert()
73 * No dai-link level and master setting was not found from in asoc_simple_card_parse_daifmt()
107 int ret = -ENOMEM; in asoc_simple_card_set_dailink_name()
116 dai_link->name = name; in asoc_simple_card_set_dailink_name()
117 dai_link->stream_name = name; in asoc_simple_card_set_dailink_name()
136 if (ret < 0 || !card->name) { in asoc_simple_card_parse_card_name()
145 if (!card->name && card->dai_link) in asoc_simple_card_parse_card_name()
146 card->name = card->dai_link->name; in asoc_simple_card_parse_card_name()
148 dev_dbg(card->dev, "Card Name: %s\n", card->name ? card->name : ""); in asoc_simple_card_parse_card_name()
157 dai->clk = clk; in asoc_simple_card_clk_register()
162 return clk_prepare_enable(dai->clk); in asoc_simple_card_clk_enable()
168 clk_disable_unprepare(dai->clk); in asoc_simple_card_clk_disable()
182 * Parse dai->sysclk come from "clocks = <&xxx>" in asoc_simple_card_parse_clk()
184 * or "system-clock-frequency = <xxx>" in asoc_simple_card_parse_clk()
189 simple_dai->sysclk = clk_get_rate(clk); in asoc_simple_card_parse_clk()
192 } else if (!of_property_read_u32(node, "system-clock-frequency", &val)) { in asoc_simple_card_parse_clk()
193 simple_dai->sysclk = val; in asoc_simple_card_parse_clk()
197 simple_dai->sysclk = clk_get_rate(clk); in asoc_simple_card_parse_clk()
200 if (of_property_read_bool(node, "system-clock-direction-out")) in asoc_simple_card_parse_clk()
201 simple_dai->clk_direction = SND_SOC_CLOCK_OUT; in asoc_simple_card_parse_clk()
204 simple_dai->sysclk, simple_dai->clk_direction); in asoc_simple_card_parse_clk()
224 * Get node via "sound-dai = <&phandle port>" in asoc_simple_card_parse_dai()
231 /* Get dai->name */ in asoc_simple_card_parse_dai()
255 if (ret != -ENOTSUPP) in asoc_simple_card_get_dai_id()
265 id = -1; in asoc_simple_card_get_dai_id()
275 return -ENODEV; in asoc_simple_card_get_dai_id()
295 /* Get dai->name */ in asoc_simple_card_parse_graph_dai()
315 if (simple_dai->sysclk) { in asoc_simple_card_init_dai()
316 ret = snd_soc_dai_set_sysclk(dai, 0, simple_dai->sysclk, in asoc_simple_card_init_dai()
317 simple_dai->clk_direction); in asoc_simple_card_init_dai()
318 if (ret && ret != -ENOTSUPP) { in asoc_simple_card_init_dai()
319 dev_err(dai->dev, "simple-card: set_sysclk error\n"); in asoc_simple_card_init_dai()
324 if (simple_dai->slots) { in asoc_simple_card_init_dai()
326 simple_dai->tx_slot_mask, in asoc_simple_card_init_dai()
327 simple_dai->rx_slot_mask, in asoc_simple_card_init_dai()
328 simple_dai->slots, in asoc_simple_card_init_dai()
329 simple_dai->slot_width); in asoc_simple_card_init_dai()
330 if (ret && ret != -ENOTSUPP) { in asoc_simple_card_init_dai()
331 dev_err(dai->dev, "simple-card: set_tdm_slot error\n"); in asoc_simple_card_init_dai()
343 if (!dai_link->platform_of_node) in asoc_simple_card_canonicalize_dailink()
344 dai_link->platform_of_node = dai_link->cpu_of_node; in asoc_simple_card_canonicalize_dailink()
363 dai_link->cpu_dai_name = NULL; in asoc_simple_card_canonicalize_cpu()
372 for (num_links = 0, dai_link = card->dai_link; in asoc_simple_card_clean_reference()
373 num_links < card->num_links; in asoc_simple_card_clean_reference()
375 of_node_put(dai_link->cpu_of_node); in asoc_simple_card_clean_reference()
376 of_node_put(dai_link->codec_of_node); in asoc_simple_card_clean_reference()
386 struct device_node *node = card->dev->of_node; in asoc_simple_card_of_parse_routing()
397 return -EINVAL; in asoc_simple_card_of_parse_routing()
407 struct device_node *node = card->dev->of_node; in asoc_simple_card_of_parse_widgets()
427 struct device *dev = card->dev; in asoc_simple_card_init_jack()
433 int det; in asoc_simple_card_init_jack() local
438 sjack->gpio.gpio = -ENOENT; in asoc_simple_card_init_jack()
441 snprintf(prop, sizeof(prop), "%shp-det-gpio", prefix); in asoc_simple_card_init_jack()
446 snprintf(prop, sizeof(prop), "%smic-det-gpio", prefix); in asoc_simple_card_init_jack()
447 pin_name = "Mic Jack"; in asoc_simple_card_init_jack()
448 gpio_name = "Mic detection"; in asoc_simple_card_init_jack()
452 det = of_get_named_gpio_flags(dev->of_node, prop, 0, &flags); in asoc_simple_card_init_jack()
453 if (det == -EPROBE_DEFER) in asoc_simple_card_init_jack()
454 return -EPROBE_DEFER; in asoc_simple_card_init_jack()
456 if (gpio_is_valid(det)) { in asoc_simple_card_init_jack()
457 sjack->pin.pin = pin_name; in asoc_simple_card_init_jack()
458 sjack->pin.mask = mask; in asoc_simple_card_init_jack()
460 sjack->gpio.name = gpio_name; in asoc_simple_card_init_jack()
461 sjack->gpio.report = mask; in asoc_simple_card_init_jack()
462 sjack->gpio.gpio = det; in asoc_simple_card_init_jack()
463 sjack->gpio.invert = !!(flags & OF_GPIO_ACTIVE_LOW); in asoc_simple_card_init_jack()
464 sjack->gpio.debounce_time = 150; in asoc_simple_card_init_jack()
467 &sjack->jack, in asoc_simple_card_init_jack()
468 &sjack->pin, 1); in asoc_simple_card_init_jack()
470 snd_soc_jack_add_gpios(&sjack->jack, 1, in asoc_simple_card_init_jack()
471 &sjack->gpio); in asoc_simple_card_init_jack()