OSDN Git Service

ASoC: simple-card-utils: share asoc_simple_card_init_priv()
authorKuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Wed, 20 Mar 2019 04:56:26 +0000 (13:56 +0900)
committerMark Brown <broonie@kernel.org>
Thu, 21 Mar 2019 14:52:24 +0000 (14:52 +0000)
The difference between simple-card / audio-graph are just using
OF graph style, or not. In other words, other things should be same.
This means, simple-card/audio-graph common functions should be
implemented at simple-card-utils, and its own functions should be
implemented at each files.

Current simple-card / audio-graph are initializing each priv,
but it is same operation.
This patch adds new asoc_simple_card_init_priv() and initialize
priv by same operation.

Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
include/sound/simple_card_utils.h
sound/soc/generic/audio-graph-card.c
sound/soc/generic/simple-card-utils.c
sound/soc/generic/simple-card.c

index 20d41bb..c0be02d 100644 (file)
@@ -60,6 +60,13 @@ struct asoc_simple_priv {
 #define simple_priv_to_dev(priv)       (simple_priv_to_card(priv)->dev)
 #define simple_priv_to_link(priv, i)   (simple_priv_to_card(priv)->dai_link + (i))
 
+struct link_info {
+       int dais; /* number of dai  */
+       int link; /* number of link */
+       int conf; /* number of codec_conf */
+       int cpu;  /* turn for CPU / Codec */
+};
+
 int asoc_simple_card_parse_daifmt(struct device *dev,
                                  struct device_node *node,
                                  struct device_node *codec,
@@ -153,7 +160,8 @@ int asoc_simple_card_of_parse_widgets(struct snd_soc_card *card,
 int asoc_simple_card_init_jack(struct snd_soc_card *card,
                               struct asoc_simple_jack *sjack,
                               int is_hp, char *prefix);
-
+int asoc_simple_card_init_priv(struct asoc_simple_priv *priv,
+                              struct link_info *li);
 
 #ifdef DEBUG
 inline void asoc_simple_debug_dai(struct asoc_simple_priv *priv,
index 605126f..b9a9337 100644 (file)
 #include <linux/string.h>
 #include <sound/simple_card_utils.h>
 
-struct link_info {
-       int dais; /* number of dai  */
-       int link; /* number of link */
-       int conf; /* number of codec_conf */
-       int cpu;  /* turn for CPU / Codec */
-};
-
 #define PREFIX "audio-graph-card,"
 
 static int graph_outdrv_event(struct snd_soc_dapm_widget *w,
@@ -526,14 +519,10 @@ static int graph_card_probe(struct snd_soc_card *card)
 static int graph_probe(struct platform_device *pdev)
 {
        struct asoc_simple_priv *priv;
-       struct snd_soc_dai_link *dai_link;
-       struct simple_dai_props *dai_props;
-       struct asoc_simple_dai *dais;
        struct device *dev = &pdev->dev;
        struct snd_soc_card *card;
-       struct snd_soc_codec_conf *cconf;
        struct link_info li;
-       int ret, i;
+       int ret;
 
        /* Allocate the private data and the DAI link array */
        priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
@@ -552,25 +541,9 @@ static int graph_probe(struct platform_device *pdev)
        if (!li.link || !li.dais)
                return -EINVAL;
 
-       dai_props = devm_kcalloc(dev, li.link, sizeof(*dai_props), GFP_KERNEL);
-       dai_link  = devm_kcalloc(dev, li.link, sizeof(*dai_link),  GFP_KERNEL);
-       dais      = devm_kcalloc(dev, li.dais, sizeof(*dais),      GFP_KERNEL);
-       cconf     = devm_kcalloc(dev, li.conf, sizeof(*cconf),     GFP_KERNEL);
-       if (!dai_props || !dai_link || !dais)
-               return -ENOMEM;
-
-       /*
-        * Use snd_soc_dai_link_component instead of legacy style
-        * It is codec only. but cpu/platform will be supported in the future.
-        * see
-        *      soc-core.c :: snd_soc_init_multicodec()
-        */
-       for (i = 0; i < li.link; i++) {
-               dai_link[i].codecs      = &dai_props[i].codecs;
-               dai_link[i].num_codecs  = 1;
-               dai_link[i].platforms   = &dai_props[i].platforms;
-               dai_link[i].num_platforms = 1;
-       }
+       ret = asoc_simple_card_init_priv(priv, &li);
+       if (ret < 0)
+               return ret;
 
        priv->pa_gpio = devm_gpiod_get_optional(dev, "pa", GPIOD_OUT_LOW);
        if (IS_ERR(priv->pa_gpio)) {
@@ -579,16 +552,6 @@ static int graph_probe(struct platform_device *pdev)
                return ret;
        }
 
-       priv->dai_props         = dai_props;
-       priv->dai_link          = dai_link;
-       priv->dais              = dais;
-       priv->codec_conf        = cconf;
-
-       card->dai_link          = dai_link;
-       card->num_links         = li.link;
-       card->codec_conf        = cconf;
-       card->num_configs       = li.conf;
-
        ret = graph_parse_of(priv);
        if (ret < 0) {
                if (ret != -EPROBE_DEFER)
index ec4a010..697e820 100644 (file)
@@ -630,6 +630,55 @@ int asoc_simple_card_init_jack(struct snd_soc_card *card,
 }
 EXPORT_SYMBOL_GPL(asoc_simple_card_init_jack);
 
+int asoc_simple_card_init_priv(struct asoc_simple_priv *priv,
+                               struct link_info *li)
+{
+       struct snd_soc_card *card = simple_priv_to_card(priv);
+       struct device *dev = simple_priv_to_dev(priv);
+       struct snd_soc_dai_link *dai_link;
+       struct simple_dai_props *dai_props;
+       struct asoc_simple_dai *dais;
+       struct snd_soc_codec_conf *cconf;
+       int i;
+
+       dai_props = devm_kcalloc(dev, li->link, sizeof(*dai_props), GFP_KERNEL);
+       dai_link  = devm_kcalloc(dev, li->link, sizeof(*dai_link),  GFP_KERNEL);
+       dais      = devm_kcalloc(dev, li->dais, sizeof(*dais),      GFP_KERNEL);
+       cconf     = devm_kcalloc(dev, li->conf, sizeof(*cconf),     GFP_KERNEL);
+       if (!dai_props || !dai_link || !dais)
+               return -ENOMEM;
+
+       /*
+        * Use snd_soc_dai_link_component instead of legacy style
+        * It is codec only. but cpu/platform will be supported in the future.
+        * see
+        *      soc-core.c :: snd_soc_init_multicodec()
+        *
+        * "platform" might be removed
+        * see
+        *      simple-card-utils.c :: asoc_simple_card_canonicalize_platform()
+        */
+       for (i = 0; i < li->link; i++) {
+               dai_link[i].codecs              = &dai_props[i].codecs;
+               dai_link[i].num_codecs          = 1;
+               dai_link[i].platforms           = &dai_props[i].platforms;
+               dai_link[i].num_platforms       = 1;
+       }
+
+       priv->dai_props         = dai_props;
+       priv->dai_link          = dai_link;
+       priv->dais              = dais;
+       priv->codec_conf        = cconf;
+
+       card->dai_link          = priv->dai_link;
+       card->num_links         = li->link;
+       card->codec_conf        = cconf;
+       card->num_configs       = li->conf;
+
+       return 0;
+}
+EXPORT_SYMBOL_GPL(asoc_simple_init_priv);
+
 /* Module information */
 MODULE_AUTHOR("Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>");
 MODULE_DESCRIPTION("ALSA SoC Simple Card Utils");
index 60a88a5..4e3e6b3 100644 (file)
 #include <sound/soc-dai.h>
 #include <sound/soc.h>
 
-struct link_info {
-       int dais; /* number of dai  */
-       int link; /* number of link */
-       int conf; /* number of codec_conf */
-       int cpu;  /* turn for CPU / Codec */
-};
-
 #define DAI    "sound-dai"
 #define CELL   "#sound-dai-cells"
 #define PREFIX "simple-audio-card,"
@@ -564,15 +557,11 @@ static int simple_soc_probe(struct snd_soc_card *card)
 static int simple_probe(struct platform_device *pdev)
 {
        struct asoc_simple_priv *priv;
-       struct snd_soc_dai_link *dai_link;
-       struct simple_dai_props *dai_props;
-       struct asoc_simple_dai *dais;
        struct device *dev = &pdev->dev;
        struct device_node *np = dev->of_node;
        struct snd_soc_card *card;
-       struct snd_soc_codec_conf *cconf;
        struct link_info li;
-       int ret, i;
+       int ret;
 
        /* Allocate the private data and the DAI link array */
        priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
@@ -589,35 +578,9 @@ static int simple_probe(struct platform_device *pdev)
        if (!li.link || !li.dais)
                return -EINVAL;
 
-       dai_props = devm_kcalloc(dev, li.link, sizeof(*dai_props), GFP_KERNEL);
-       dai_link  = devm_kcalloc(dev, li.link, sizeof(*dai_link),  GFP_KERNEL);
-       dais      = devm_kcalloc(dev, li.dais, sizeof(*dais),      GFP_KERNEL);
-       cconf     = devm_kcalloc(dev, li.conf, sizeof(*cconf),     GFP_KERNEL);
-       if (!dai_props || !dai_link || !dais)
-               return -ENOMEM;
-
-       /*
-        * Use snd_soc_dai_link_component instead of legacy style
-        * It is codec only. but cpu/platform will be supported in the future.
-        * see
-        *      soc-core.c :: snd_soc_init_multicodec()
-        */
-       for (i = 0; i < li.link; i++) {
-               dai_link[i].codecs      = &dai_props[i].codecs;
-               dai_link[i].num_codecs  = 1;
-               dai_link[i].platforms   = &dai_props[i].platforms;
-               dai_link[i].num_platforms = 1;
-       }
-
-       priv->dai_props         = dai_props;
-       priv->dai_link          = dai_link;
-       priv->dais              = dais;
-       priv->codec_conf        = cconf;
-
-       card->dai_link          = priv->dai_link;
-       card->num_links         = li.link;
-       card->codec_conf        = cconf;
-       card->num_configs       = li.conf;
+       ret = asoc_simple_card_init_priv(priv, &li);
+       if (ret < 0)
+               return ret;
 
        if (np && of_device_is_available(np)) {
 
@@ -632,6 +595,9 @@ static int simple_probe(struct platform_device *pdev)
                struct asoc_simple_card_info *cinfo;
                struct snd_soc_dai_link_component *codecs;
                struct snd_soc_dai_link_component *platform;
+               struct snd_soc_dai_link *dai_link = priv->dai_link;
+               struct simple_dai_props *dai_props = priv->dai_props;
+
                int dai_idx = 0;
 
                cinfo = dev->platform_data;
@@ -665,10 +631,10 @@ static int simple_probe(struct platform_device *pdev)
                dai_link->cpu_dai_name  = cinfo->cpu_dai.name;
                dai_link->dai_fmt       = cinfo->daifmt;
                dai_link->init          = asoc_simple_dai_init;
-               memcpy(priv->dai_props->cpu_dai, &cinfo->cpu_dai,
-                                       sizeof(*priv->dai_props->cpu_dai));
-               memcpy(priv->dai_props->codec_dai, &cinfo->codec_dai,
-                                       sizeof(*priv->dai_props->codec_dai));
+               memcpy(dai_props->cpu_dai, &cinfo->cpu_dai,
+                                       sizeof(*dai_props->cpu_dai));
+               memcpy(dai_props->codec_dai, &cinfo->codec_dai,
+                                       sizeof(*dai_props->codec_dai));
        }
 
        snd_soc_card_set_drvdata(card, priv);