| From 10259368bab3428b333562bdbe43fc8549992367 Mon Sep 17 00:00:00 2001 |
| From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> |
| Date: Mon, 3 Mar 2014 20:50:33 -0800 |
| Subject: ASoC: rsnd: add probe/remove callback on rsnd_mod_ops |
| |
| 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 | 23 +++++++++++++++++++++++ |
| sound/soc/sh/rcar/rsnd.h | 6 ++++++ |
| 2 files changed, 29 insertions(+) |
| |
| --- a/sound/soc/sh/rcar/core.c |
| +++ b/sound/soc/sh/rcar/core.c |
| @@ -841,6 +841,7 @@ static int rsnd_probe(struct platform_de |
| 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_de |
| 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 |
| */ |
| --- a/sound/soc/sh/rcar/rsnd.h |
| +++ b/sound/soc/sh/rcar/rsnd.h |
| @@ -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); |