[RFC PATCH 1/3] ASoC: simple-card-utils: add support for componants provideing jack events via set_jack
Carl Philipp Klemm
philipp at uvos.xyz
Tue Dec 28 19:09:31 CET 2021
This allows componants that want a jack to report state on to do so by calling
set_jack on components implementing this function.
Im not entirely sure this is the right way to do this so RFC
Signed-off-by: Carl Philipp Klemm <philipp at uvos.xyz>
---
include/sound/simple_card_utils.h | 6 ++--
sound/soc/generic/simple-card-utils.c | 47 +++++++++++++++++++--------
2 files changed, 36 insertions(+), 17 deletions(-)
diff --git a/include/sound/simple_card_utils.h b/include/sound/simple_card_utils.h
index 51b3b485a92e..547ad537613d 100644
--- a/include/sound/simple_card_utils.h
+++ b/include/sound/simple_card_utils.h
@@ -57,8 +57,8 @@ struct asoc_simple_priv {
struct prop_nums num;
unsigned int mclk_fs;
} *dai_props;
- struct asoc_simple_jack hp_jack;
- struct asoc_simple_jack mic_jack;
+ struct asoc_simple_jack *hp_jack;
+ struct asoc_simple_jack *mic_jack;
struct snd_soc_dai_link *dai_link;
struct asoc_simple_dai *dais;
struct snd_soc_dai_link_component *dlcs;
@@ -173,7 +173,7 @@ int asoc_simple_parse_pin_switches(struct snd_soc_card *card,
char *prefix);
int asoc_simple_init_jack(struct snd_soc_card *card,
- struct asoc_simple_jack *sjack,
+ struct asoc_simple_jack **sjack,
int is_hp, char *prefix, char *pin);
int asoc_simple_init_priv(struct asoc_simple_priv *priv,
struct link_info *li);
diff --git a/sound/soc/generic/simple-card-utils.c b/sound/soc/generic/simple-card-utils.c
index 10c63b73900c..1899feba16cc 100644
--- a/sound/soc/generic/simple-card-utils.c
+++ b/sound/soc/generic/simple-card-utils.c
@@ -395,6 +395,7 @@ int asoc_simple_dai_init(struct snd_soc_pcm_runtime *rtd)
struct asoc_simple_priv *priv = snd_soc_card_get_drvdata(rtd->card);
struct simple_dai_props *props = simple_priv_to_props(priv, rtd->num);
struct asoc_simple_dai *dai;
+ struct snd_soc_component *component;
int i, ret;
for_each_prop_dai_codec(props, i, dai) {
@@ -412,6 +413,21 @@ int asoc_simple_dai_init(struct snd_soc_pcm_runtime *rtd)
if (ret < 0)
return ret;
+ for_each_rtd_components(rtd, i, component) {
+ if (component->driver->set_jack) {
+ if (!priv->hp_jack) {
+ priv->hp_jack = devm_kzalloc(priv->snd_card.dev,
+ sizeof(*priv->hp_jack), GFP_KERNEL);
+ snd_soc_card_jack_new(&priv->snd_card,
+ "Headphones",
+ SND_JACK_HEADPHONE,
+ &priv->hp_jack->jack,
+ NULL, 0);
+ }
+ snd_soc_component_set_jack(component, &priv->hp_jack->jack, NULL);
+ }
+ }
+
return 0;
}
EXPORT_SYMBOL_GPL(asoc_simple_dai_init);
@@ -554,7 +570,7 @@ int asoc_simple_parse_pin_switches(struct snd_soc_card *card,
EXPORT_SYMBOL_GPL(asoc_simple_parse_pin_switches);
int asoc_simple_init_jack(struct snd_soc_card *card,
- struct asoc_simple_jack *sjack,
+ struct asoc_simple_jack **sjack,
int is_hp, char *prefix,
char *pin)
{
@@ -569,8 +585,6 @@ int asoc_simple_init_jack(struct snd_soc_card *card,
if (!prefix)
prefix = "";
- sjack->gpio.gpio = -ENOENT;
-
if (is_hp) {
snprintf(prop, sizeof(prop), "%shp-det-gpio", prefix);
pin_name = pin ? pin : "Headphones";
@@ -588,21 +602,26 @@ int asoc_simple_init_jack(struct snd_soc_card *card,
return -EPROBE_DEFER;
if (gpio_is_valid(det)) {
- sjack->pin.pin = pin_name;
- sjack->pin.mask = mask;
+ struct asoc_simple_jack *sjack_d;
+
+ sjack = devm_kzalloc(dev, sizeof(*(*sjack)), GFP_KERNEL);
+ sjack_d = *sjack;
+
+ sjack_d->pin.pin = pin_name;
+ sjack_d->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;
+ sjack_d->gpio.name = gpio_name;
+ sjack_d->gpio.report = mask;
+ sjack_d->gpio.gpio = det;
+ sjack_d->gpio.invert = !!(flags & OF_GPIO_ACTIVE_LOW);
+ sjack_d->gpio.debounce_time = 150;
snd_soc_card_jack_new(card, pin_name, mask,
- &sjack->jack,
- &sjack->pin, 1);
+ &sjack_d->jack,
+ &sjack_d->pin, 1);
- snd_soc_jack_add_gpios(&sjack->jack, 1,
- &sjack->gpio);
+ snd_soc_jack_add_gpios(&sjack_d->jack, 1,
+ &sjack_d->gpio);
}
return 0;
--
2.34.1
More information about the Alsa-devel
mailing list