@@ -182,7 +182,7 @@ int asoc_simple_init_priv(struct asoc_simple_priv *priv,
struct link_info *li);
int asoc_simple_remove(struct platform_device *pdev);
-int asoc_graph_card_probe(struct snd_soc_card *card);
+int asoc_graph_dai_init(struct snd_soc_pcm_runtime *rtd);
int asoc_graph_is_ports0(struct device_node *port);
#ifdef DEBUG
@@ -34,8 +34,7 @@ static int custom_card_probe(struct snd_soc_card *card)
custom_priv->custom_params = 1;
- /* you can use generic probe function */
- return asoc_graph_card_probe(card);
+ return 0;
}
static int custom_hook_pre(struct asoc_simple_priv *priv)
@@ -710,7 +710,7 @@ static void graph_link_init(struct asoc_simple_priv *priv,
daiclk = snd_soc_daifmt_clock_provider_fliped(daiclk);
dai_link->dai_fmt = daifmt | daiclk;
- dai_link->init = asoc_simple_dai_init;
+ dai_link->init = asoc_graph_dai_init;
dai_link->ops = &graph_ops;
if (priv->ops)
dai_link->ops = priv->ops;
@@ -1180,7 +1180,6 @@ int audio_graph2_parse_of(struct asoc_simple_priv *priv, struct device *dev,
if (!li)
return -ENOMEM;
- card->probe = asoc_graph_card_probe;
card->owner = THIS_MODULE;
card->dev = dev;
@@ -588,6 +588,8 @@ int asoc_simple_init_jack(struct snd_soc_card *card,
return -EPROBE_DEFER;
if (gpio_is_valid(det)) {
+ struct snd_soc_component *component;
+
sjack->pin.pin = pin_name;
sjack->pin.mask = mask;
@@ -603,6 +605,15 @@ int asoc_simple_init_jack(struct snd_soc_card *card,
snd_soc_jack_add_gpios(&sjack->jack, 1,
&sjack->gpio);
+
+ for_each_card_components(card, component)
+ snd_soc_component_set_jack(component, &sjack->jack, NULL);
+ } else if (of_property_read_bool(dev->of_node, prefix)) {
+ snd_soc_card_jack_new(card, pin_name, mask,
+ &sjack->jack,
+ &sjack->pin, 1);
+ for_each_card_components(card, component)
+ snd_soc_component_set_jack(component, &sjack->jack, NULL);
}
return 0;
@@ -758,11 +769,16 @@ int asoc_simple_remove(struct platform_device *pdev)
}
EXPORT_SYMBOL_GPL(asoc_simple_remove);
-int asoc_graph_card_probe(struct snd_soc_card *card)
+int asoc_graph_dai_init(struct snd_soc_pcm_runtime *rtd)
{
+ struct snd_soc_card *card = rtd->card;
struct asoc_simple_priv *priv = snd_soc_card_get_drvdata(card);
int ret;
+ ret = asoc_simple_dai_init(rtd);
+ if (ret < 0)
+ return ret;
+
ret = asoc_simple_init_hp(card, &priv->hp_jack, NULL);
if (ret < 0)
return ret;
@@ -773,7 +789,7 @@ int asoc_graph_card_probe(struct snd_soc_card *card)
return 0;
}
-EXPORT_SYMBOL_GPL(asoc_graph_card_probe);
+EXPORT_SYMBOL_GPL(asoc_graph_dai_init);
int asoc_graph_is_ports0(struct device_node *np)
{
@@ -149,6 +149,27 @@ static int simple_parse_node(struct asoc_simple_priv *priv,
return 0;
}
+static int simple_dai_init(struct snd_soc_pcm_runtime *rtd)
+{
+ struct snd_soc_card *card = rtd->card;
+ struct asoc_simple_priv *priv = snd_soc_card_get_drvdata(card);
+ int ret;
+
+ ret = asoc_simple_dai_init(rtd);
+ if (ret < 0)
+ return ret;
+
+ ret = asoc_simple_init_hp(card, &priv->hp_jack, PREFIX);
+ if (ret < 0)
+ return ret;
+
+ ret = asoc_simple_init_mic(card, &priv->mic_jack, PREFIX);
+ if (ret < 0)
+ return ret;
+
+ return 0;
+}
+
static int simple_link_init(struct asoc_simple_priv *priv,
struct device_node *node,
struct device_node *codec,
@@ -164,7 +185,7 @@ static int simple_link_init(struct asoc_simple_priv *priv,
if (ret < 0)
return 0;
- dai_link->init = asoc_simple_dai_init;
+ dai_link->init = simple_dai_init;
dai_link->ops = &simple_ops;
return asoc_simple_set_dailink_name(dev, dai_link, name);
@@ -587,22 +608,6 @@ static int simple_get_dais_count(struct asoc_simple_priv *priv,
simple_count_dpcm);
}
-static int simple_soc_probe(struct snd_soc_card *card)
-{
- struct asoc_simple_priv *priv = snd_soc_card_get_drvdata(card);
- int ret;
-
- ret = asoc_simple_init_hp(card, &priv->hp_jack, PREFIX);
- if (ret < 0)
- return ret;
-
- ret = asoc_simple_init_mic(card, &priv->mic_jack, PREFIX);
- if (ret < 0)
- return ret;
-
- return 0;
-}
-
static int asoc_simple_probe(struct platform_device *pdev)
{
struct asoc_simple_priv *priv;
@@ -620,7 +625,6 @@ static int asoc_simple_probe(struct platform_device *pdev)
card = simple_priv_to_card(priv);
card->owner = THIS_MODULE;
card->dev = dev;
- card->probe = simple_soc_probe;
card->driver_name = "simple-card";
li = devm_kzalloc(dev, sizeof(*li), GFP_KERNEL);
@@ -184,7 +184,7 @@ static int tegra_audio_graph_card_probe(struct snd_soc_card *card)
return PTR_ERR(priv->clk_plla_out0);
}
- return asoc_graph_card_probe(card);
+ return 0;
}
static int tegra_audio_graph_probe(struct platform_device *pdev)
Current simple-card / audio-graph-card are detecting HP/MIC at card->probe timing (= A), and not calling snd_soc_component_set_jack() for it. Other sound card drivers are using dai_link->init timing (= B) for both detecting and set_jack(). static int snd_soc_bind_card(...) { .... (A) ret = snd_soc_card_probe(card); ... for_each_card_rtds(card, rtd) { (B) ret = soc_init_pcm_runtime(card, rtd); ... } ... } This patch (a) calls set_jack() (= Y) at asoc_simple_init_jack() (= X) which is used to detect HP/MIC. (b) calls it from dai_link->init timing (= B) instead of card->probe timing (= A). (c) allows non-gpio jacks to be reported by a componant give it via snd_soc_component_set_jack if a of node defined by the driver is set (d) remove card->init (= A) timing function from simple-card / audio-graph-card. (X) int asoc_simple_init_jack(...) { ... if (gpio_is_valid(det)) { ... snd_soc_card_jack_new(...); snd_soc_jack_add_gpios(...); for_each_card_components(card, component) (Y) snd_soc_component_set_jack(component, ...); } ... } One note here is that simple-card needs PREFIX to detecting HP/MIC, but it is not needed on audio-graph-card. Thus simple-card uses local function for it, and audio-graph-card is using global function and sharing the code with audio-graph-card / audio-graph-card2 / audio-graph-card2-custom-sample / tegra_audio_graph_card. Co-Developed-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> Signed-off-by: Carl Philipp Klemm <philipp@uvos.xyz> --- include/sound/simple_card_utils.h | 2 +- .../generic/audio-graph-card2-custom-sample.c | 3 +- sound/soc/generic/audio-graph-card2.c | 3 +- sound/soc/generic/simple-card-utils.c | 20 +++++++++- sound/soc/generic/simple-card.c | 40 ++++++++++--------- sound/soc/tegra/tegra_audio_graph_card.c | 2 +- 6 files changed, 44 insertions(+), 26 deletions(-)