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>
This commit is contained in:
Kuninori Morimoto 2014-07-24 01:51:31 -07:00 committed by Mark Brown
parent 2bf865ba30
commit d62a3dcd4d
1 changed files with 11 additions and 11 deletions

View File

@ -1043,11 +1043,11 @@ static int rsnd_probe(struct platform_device *pdev)
for_each_rsnd_dai(rdai, priv, i) { for_each_rsnd_dai(rdai, priv, i) {
ret = rsnd_dai_call(probe, &rdai->playback, rdai); ret = rsnd_dai_call(probe, &rdai->playback, rdai);
if (ret) if (ret)
return ret; goto exit_snd_probe;
ret = rsnd_dai_call(probe, &rdai->capture, rdai); ret = rsnd_dai_call(probe, &rdai->capture, rdai);
if (ret) if (ret)
return ret; goto exit_snd_probe;
} }
/* /*
@ -1075,6 +1075,11 @@ static int rsnd_probe(struct platform_device *pdev)
exit_snd_soc: exit_snd_soc:
snd_soc_unregister_platform(dev); 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; 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_priv *priv = dev_get_drvdata(&pdev->dev);
struct rsnd_dai *rdai; struct rsnd_dai *rdai;
int ret, i; int ret = 0, i;
pm_runtime_disable(&pdev->dev); pm_runtime_disable(&pdev->dev);
for_each_rsnd_dai(rdai, priv, i) { for_each_rsnd_dai(rdai, priv, i) {
ret = rsnd_dai_call(remove, &rdai->playback, rdai); ret |= rsnd_dai_call(remove, &rdai->playback, rdai);
if (ret) ret |= rsnd_dai_call(remove, &rdai->capture, rdai);
return ret;
ret = rsnd_dai_call(remove, &rdai->capture, rdai);
if (ret)
return ret;
} }
return 0; return ret;
} }
static struct platform_driver rsnd_driver = { static struct platform_driver rsnd_driver = {