diff options
Diffstat (limited to 'sound/soc/generic/simple-card-utils.c')
| -rw-r--r-- | sound/soc/generic/simple-card-utils.c | 74 | 
1 files changed, 65 insertions, 9 deletions
diff --git a/sound/soc/generic/simple-card-utils.c b/sound/soc/generic/simple-card-utils.c index 3751a07de6aa..d3f3f0fec74c 100644 --- a/sound/soc/generic/simple-card-utils.c +++ b/sound/soc/generic/simple-card-utils.c @@ -1,16 +1,17 @@ -/* - * simple-card-utils.c - * - * Copyright (c) 2016 Kuninori Morimoto <[email protected]> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - */ +// SPDX-License-Identifier: GPL-2.0 +// +// simple-card-utils.c +// +// Copyright (c) 2016 Kuninori Morimoto <[email protected]> +  #include <linux/clk.h> +#include <linux/gpio.h> +#include <linux/gpio/consumer.h>  #include <linux/module.h>  #include <linux/of.h> +#include <linux/of_gpio.h>  #include <linux/of_graph.h> +#include <sound/jack.h>  #include <sound/simple_card_utils.h>  void asoc_simple_card_convert_fixup(struct asoc_simple_card_data *data, @@ -419,6 +420,61 @@ int asoc_simple_card_of_parse_widgets(struct snd_soc_card *card,  }  EXPORT_SYMBOL_GPL(asoc_simple_card_of_parse_widgets); +int asoc_simple_card_init_jack(struct snd_soc_card *card, +			       struct asoc_simple_jack *sjack, +			       int is_hp, char *prefix) +{ +	struct device *dev = card->dev; +	enum of_gpio_flags flags; +	char prop[128]; +	char *pin_name; +	char *gpio_name; +	int mask; +	int det; + +	if (!prefix) +		prefix = ""; + +	sjack->gpio.gpio = -ENOENT; + +	if (is_hp) { +		snprintf(prop, sizeof(prop), "%shp-det-gpio", prefix); +		pin_name	= "Headphones"; +		gpio_name	= "Headphone detection"; +		mask		= SND_JACK_HEADPHONE; +	} else { +		snprintf(prop, sizeof(prop), "%smic-det-gpio", prefix); +		pin_name	= "Mic Jack"; +		gpio_name	= "Mic detection"; +		mask		= SND_JACK_MICROPHONE; +	} + +	det = of_get_named_gpio_flags(dev->of_node, prop, 0, &flags); +	if (det == -EPROBE_DEFER) +		return -EPROBE_DEFER; + +	if (gpio_is_valid(det)) { +		sjack->pin.pin		= pin_name; +		sjack->pin.mask		= mask; + +		sjack->gpio.name	= gpio_name; +		sjack->gpio.report	= mask; +		sjack->gpio.gpio	= det; +		sjack->gpio.invert	= !!(flags & OF_GPIO_ACTIVE_LOW); +		sjack->gpio.debounce_time = 150; + +		snd_soc_card_jack_new(card, pin_name, mask, +				      &sjack->jack, +				      &sjack->pin, 1); + +		snd_soc_jack_add_gpios(&sjack->jack, 1, +				       &sjack->gpio); +	} + +	return 0; +} +EXPORT_SYMBOL_GPL(asoc_simple_card_init_jack); +  /* Module information */  MODULE_AUTHOR("Kuninori Morimoto <[email protected]>");  MODULE_DESCRIPTION("ALSA SoC Simple Card Utils");  |