| From aa1367bf9ff1f8ba67b8ac3f31a70253530873c4 Mon Sep 17 00:00:00 2001 |
| From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> |
| Date: Thu, 24 Jul 2014 01:51:31 -0700 |
| Subject: ASoC: rsnd: fixup dai remove callback operation |
| |
| rsnd driver is using SSI/SRC/DVC which are |
| using "mod" base operation. |
| These "mod" are supporting "probe" and "remove" callbacks. |
| |
| Current rsnd_probe should call "remove" if "probe" was failed, |
| since "probe" might be having DMAEngine handle. |
| Some mod's "remove" callback might be called without calling |
| "probe", but it is no problem. because "remove" do nothing |
| in such case. |
| |
| So, all mod's "remove" should be called when error case |
| of rsnd_probe() and rsnd_remove(). |
| |
| Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> |
| Signed-off-by: Mark Brown <broonie@linaro.org> |
| (cherry picked from commit d62a3dcd4d75b1713d12697afdbffaf9a9da8f43) |
| Signed-off-by: Simon Horman <horms+renesas@verge.net.au> |
| --- |
| sound/soc/sh/rcar/core.c | 22 +++++++++++----------- |
| 1 file changed, 11 insertions(+), 11 deletions(-) |
| |
| diff --git a/sound/soc/sh/rcar/core.c b/sound/soc/sh/rcar/core.c |
| index c48d999a3fce..f07742f1eb11 100644 |
| --- a/sound/soc/sh/rcar/core.c |
| +++ b/sound/soc/sh/rcar/core.c |
| @@ -1043,11 +1043,11 @@ static int rsnd_probe(struct platform_device *pdev) |
| for_each_rsnd_dai(rdai, priv, i) { |
| ret = rsnd_dai_call(probe, &rdai->playback, rdai); |
| if (ret) |
| - return ret; |
| + goto exit_snd_probe; |
| |
| ret = rsnd_dai_call(probe, &rdai->capture, rdai); |
| if (ret) |
| - return ret; |
| + goto exit_snd_probe; |
| } |
| |
| /* |
| @@ -1075,6 +1075,11 @@ static int rsnd_probe(struct platform_device *pdev) |
| |
| exit_snd_soc: |
| snd_soc_unregister_platform(dev); |
| +exit_snd_probe: |
| + for_each_rsnd_dai(rdai, priv, i) { |
| + rsnd_dai_call(remove, &rdai->playback, rdai); |
| + rsnd_dai_call(remove, &rdai->capture, rdai); |
| + } |
| |
| return ret; |
| } |
| @@ -1083,21 +1088,16 @@ static int rsnd_remove(struct platform_device *pdev) |
| { |
| struct rsnd_priv *priv = dev_get_drvdata(&pdev->dev); |
| struct rsnd_dai *rdai; |
| - int ret, i; |
| + int ret = 0, i; |
| |
| pm_runtime_disable(&pdev->dev); |
| |
| for_each_rsnd_dai(rdai, priv, i) { |
| - ret = rsnd_dai_call(remove, &rdai->playback, rdai); |
| - if (ret) |
| - return ret; |
| - |
| - ret = rsnd_dai_call(remove, &rdai->capture, rdai); |
| - if (ret) |
| - return ret; |
| + ret |= rsnd_dai_call(remove, &rdai->playback, rdai); |
| + ret |= rsnd_dai_call(remove, &rdai->capture, rdai); |
| } |
| |
| - return 0; |
| + return ret; |
| } |
| |
| static struct platform_driver rsnd_driver = { |
| -- |
| 2.1.2 |
| |