ASoC: rsnd: add probe/remove callback on rsnd_mod_ops
authorKuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Tue, 4 Mar 2014 04:50:33 +0000 (20:50 -0800)
committerStephane Desneux <stephane.desneux@open.eurogiciel.org>
Wed, 4 Feb 2015 10:13:08 +0000 (11:13 +0100)
Each rsnd mod needs specific probe method,
and its best timing is DAI probe timing.
But current code runs it mod probe timing.
This patch adds new probe/remove callback to solve it.

Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Signed-off-by: Mark Brown <broonie@linaro.org>
(cherry picked from commit 7681f6ac6b6338932621f842d68e54f6267b785f)
Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
sound/soc/sh/rcar/core.c
sound/soc/sh/rcar/rsnd.h

index 00064e5..5591383 100644 (file)
@@ -841,6 +841,7 @@ static int rsnd_probe(struct platform_device *pdev)
        struct rcar_snd_info *info;
        struct rsnd_priv *priv;
        struct device *dev = &pdev->dev;
+       struct rsnd_dai *rdai;
        int (*probe_func[])(struct platform_device *pdev,
                            struct rsnd_priv *priv) = {
                rsnd_gen_probe,
@@ -879,6 +880,16 @@ static int rsnd_probe(struct platform_device *pdev)
                        return ret;
        }
 
+       for_each_rsnd_dai(rdai, priv, i) {
+               ret = rsnd_dai_call(rdai, &rdai->playback, probe);
+               if (ret)
+                       return ret;
+
+               ret = rsnd_dai_call(rdai, &rdai->capture, probe);
+               if (ret)
+                       return ret;
+       }
+
        /*
         *      asoc register
         */
@@ -911,9 +922,21 @@ exit_snd_soc:
 static int rsnd_remove(struct platform_device *pdev)
 {
        struct rsnd_priv *priv = dev_get_drvdata(&pdev->dev);
+       struct rsnd_dai *rdai;
+       int ret, i;
 
        pm_runtime_disable(&pdev->dev);
 
+       for_each_rsnd_dai(rdai, priv, i) {
+               ret = rsnd_dai_call(rdai, &rdai->playback, remove);
+               if (ret)
+                       return ret;
+
+               ret = rsnd_dai_call(rdai, &rdai->capture, remove);
+               if (ret)
+                       return ret;
+       }
+
        /*
         *      remove each module
         */
index 9205f96..db20b37 100644 (file)
@@ -167,6 +167,12 @@ enum rsnd_mod_type {
 
 struct rsnd_mod_ops {
        char *name;
+       int (*probe)(struct rsnd_mod *mod,
+                    struct rsnd_dai *rdai,
+                    struct rsnd_dai_stream *io);
+       int (*remove)(struct rsnd_mod *mod,
+                     struct rsnd_dai *rdai,
+                     struct rsnd_dai_stream *io);
        int (*init)(struct rsnd_mod *mod,
                    struct rsnd_dai *rdai,
                    struct rsnd_dai_stream *io);