]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - sound/soc/fsl/fsl-asoc-card.c
Merge remote-tracking branch 'vfs/for-next'
[karo-tx-linux.git] / sound / soc / fsl / fsl-asoc-card.c
index 1b05d1c5d9fd50fe32eb9b65f4da1340db9170e5..562b3bd22d9ac1f86de0a7d08fe64d8145445db8 100644 (file)
@@ -107,6 +107,13 @@ static const struct snd_soc_dapm_route audio_map[] = {
        {"CPU-Capture",  NULL, "Capture"},
 };
 
+static const struct snd_soc_dapm_route audio_map_ac97[] = {
+       {"AC97 Playback",  NULL, "ASRC-Playback"},
+       {"Playback",  NULL, "AC97 Playback"},
+       {"ASRC-Capture",  NULL, "AC97 Capture"},
+       {"AC97 Capture",  NULL, "Capture"},
+};
+
 /* Add all possible widgets into here without being redundant */
 static const struct snd_soc_dapm_widget fsl_asoc_card_dapm_widgets[] = {
        SND_SOC_DAPM_LINE("Line Out Jack", NULL),
@@ -222,12 +229,15 @@ static int fsl_asoc_card_set_bias_level(struct snd_soc_card *card,
                                        enum snd_soc_bias_level level)
 {
        struct fsl_asoc_card_priv *priv = snd_soc_card_get_drvdata(card);
-       struct snd_soc_dai *codec_dai = card->rtd[0].codec_dai;
+       struct snd_soc_pcm_runtime *rtd;
+       struct snd_soc_dai *codec_dai;
        struct codec_priv *codec_priv = &priv->codec_priv;
        struct device *dev = card->dev;
        unsigned int pll_out;
        int ret;
 
+       rtd = snd_soc_get_pcm_runtime(card, card->dai_link[0].name);
+       codec_dai = rtd->codec_dai;
        if (dapm->dev != codec_dai->dev)
                return 0;
 
@@ -414,14 +424,16 @@ static int fsl_asoc_card_audmux_init(struct device_node *np,
 static int fsl_asoc_card_late_probe(struct snd_soc_card *card)
 {
        struct fsl_asoc_card_priv *priv = snd_soc_card_get_drvdata(card);
-       struct snd_soc_dai *codec_dai = card->rtd[0].codec_dai;
+       struct snd_soc_pcm_runtime *rtd = list_first_entry(
+                       &card->rtd_list, struct snd_soc_pcm_runtime, list);
+       struct snd_soc_dai *codec_dai = rtd->codec_dai;
        struct codec_priv *codec_priv = &priv->codec_priv;
        struct device *dev = card->dev;
        int ret;
 
        if (fsl_asoc_card_is_ac97(priv)) {
 #if IS_ENABLED(CONFIG_SND_AC97_CODEC)
-               struct snd_soc_codec *codec = card->rtd[0].codec;
+               struct snd_soc_codec *codec = rtd->codec;
                struct snd_ac97 *ac97 = snd_soc_codec_get_drvdata(codec);
 
                /*
@@ -574,7 +586,8 @@ static int fsl_asoc_card_probe(struct platform_device *pdev)
        priv->card.dev = &pdev->dev;
        priv->card.name = priv->name;
        priv->card.dai_link = priv->dai_link;
-       priv->card.dapm_routes = audio_map;
+       priv->card.dapm_routes = fsl_asoc_card_is_ac97(priv) ?
+                                audio_map_ac97 : audio_map;
        priv->card.late_probe = fsl_asoc_card_late_probe;
        priv->card.num_dapm_routes = ARRAY_SIZE(audio_map);
        priv->card.dapm_widgets = fsl_asoc_card_dapm_widgets;