Commit e9c390df authored by Kuninori Morimoto's avatar Kuninori Morimoto Committed by Mark Brown

ASoC: rsnd: make sure it uses lock when it calls rsnd_dai_call

rsnd_dai_call() should be called under rsnd_lock
Signed-off-by: default avatarKuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Signed-off-by: default avatarMark Brown <broonie@kernel.org>
parent eb2535f5
...@@ -731,10 +731,15 @@ static int rsnd_hw_params(struct snd_pcm_substream *substream, ...@@ -731,10 +731,15 @@ static int rsnd_hw_params(struct snd_pcm_substream *substream,
{ {
struct snd_soc_dai *dai = rsnd_substream_to_dai(substream); struct snd_soc_dai *dai = rsnd_substream_to_dai(substream);
struct rsnd_dai *rdai = rsnd_dai_to_rdai(dai); struct rsnd_dai *rdai = rsnd_dai_to_rdai(dai);
struct rsnd_priv *priv = rsnd_dai_to_priv(dai);
struct rsnd_dai_stream *io = rsnd_rdai_to_io(rdai, substream); struct rsnd_dai_stream *io = rsnd_rdai_to_io(rdai, substream);
unsigned long flags;
int ret; int ret;
rsnd_lock(priv, flags);
ret = rsnd_dai_call(hw_params, io, substream, hw_params); ret = rsnd_dai_call(hw_params, io, substream, hw_params);
rsnd_unlock(priv, flags);
if (ret) if (ret)
return ret; return ret;
...@@ -919,14 +924,16 @@ int rsnd_kctrl_new_e(struct rsnd_mod *mod, ...@@ -919,14 +924,16 @@ int rsnd_kctrl_new_e(struct rsnd_mod *mod,
static int rsnd_pcm_new(struct snd_soc_pcm_runtime *rtd) static int rsnd_pcm_new(struct snd_soc_pcm_runtime *rtd)
{ {
struct snd_soc_dai *dai = rtd->cpu_dai; struct snd_soc_dai *dai = rtd->cpu_dai;
struct rsnd_priv *priv = rsnd_dai_to_priv(dai);
struct rsnd_dai *rdai = rsnd_dai_to_rdai(dai); struct rsnd_dai *rdai = rsnd_dai_to_rdai(dai);
int ret; unsigned long flags;
int ret = 0;
ret = rsnd_dai_call(pcm_new, &rdai->playback, rtd); rsnd_lock(priv, flags);
if (ret) ret |= rsnd_dai_call(pcm_new, &rdai->playback, rtd);
return ret; ret |= rsnd_dai_call(pcm_new, &rdai->capture, rtd);
rsnd_unlock(priv, flags);
ret = rsnd_dai_call(pcm_new, &rdai->capture, rtd);
if (ret) if (ret)
return ret; return ret;
...@@ -949,8 +956,11 @@ static const struct snd_soc_component_driver rsnd_soc_component = { ...@@ -949,8 +956,11 @@ static const struct snd_soc_component_driver rsnd_soc_component = {
static int rsnd_rdai_continuance_probe(struct rsnd_priv *priv, static int rsnd_rdai_continuance_probe(struct rsnd_priv *priv,
struct rsnd_dai_stream *io) struct rsnd_dai_stream *io)
{ {
unsigned long flags;
int ret; int ret;
rsnd_lock(priv, flags);
ret = rsnd_dai_call(probe, io, priv); ret = rsnd_dai_call(probe, io, priv);
if (ret == -EAGAIN) { if (ret == -EAGAIN) {
/* /*
...@@ -983,6 +993,7 @@ static int rsnd_rdai_continuance_probe(struct rsnd_priv *priv, ...@@ -983,6 +993,7 @@ static int rsnd_rdai_continuance_probe(struct rsnd_priv *priv,
*/ */
ret = rsnd_dai_call(probe, io, priv); ret = rsnd_dai_call(probe, io, priv);
} }
rsnd_unlock(priv, flags);
return ret; return ret;
} }
...@@ -998,6 +1009,7 @@ static int rsnd_probe(struct platform_device *pdev) ...@@ -998,6 +1009,7 @@ static int rsnd_probe(struct platform_device *pdev)
struct rsnd_dai *rdai; struct rsnd_dai *rdai;
const struct of_device_id *of_id = of_match_device(rsnd_of_match, dev); const struct of_device_id *of_id = of_match_device(rsnd_of_match, dev);
const struct rsnd_of_data *of_data; const struct rsnd_of_data *of_data;
unsigned long flags;
int (*probe_func[])(struct platform_device *pdev, int (*probe_func[])(struct platform_device *pdev,
const struct rsnd_of_data *of_data, const struct rsnd_of_data *of_data,
struct rsnd_priv *priv) = { struct rsnd_priv *priv) = {
...@@ -1084,10 +1096,12 @@ static int rsnd_probe(struct platform_device *pdev) ...@@ -1084,10 +1096,12 @@ 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: exit_snd_probe:
rsnd_lock(priv, flags);
for_each_rsnd_dai(rdai, priv, i) { for_each_rsnd_dai(rdai, priv, i) {
rsnd_dai_call(remove, &rdai->playback, priv); rsnd_dai_call(remove, &rdai->playback, priv);
rsnd_dai_call(remove, &rdai->capture, priv); rsnd_dai_call(remove, &rdai->capture, priv);
} }
rsnd_unlock(priv, flags);
return ret; return ret;
} }
...@@ -1096,6 +1110,7 @@ static int rsnd_remove(struct platform_device *pdev) ...@@ -1096,6 +1110,7 @@ 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;
unsigned long flags;
void (*remove_func[])(struct platform_device *pdev, void (*remove_func[])(struct platform_device *pdev,
struct rsnd_priv *priv) = { struct rsnd_priv *priv) = {
rsnd_ssi_remove, rsnd_ssi_remove,
...@@ -1106,10 +1121,12 @@ static int rsnd_remove(struct platform_device *pdev) ...@@ -1106,10 +1121,12 @@ static int rsnd_remove(struct platform_device *pdev)
pm_runtime_disable(&pdev->dev); pm_runtime_disable(&pdev->dev);
rsnd_lock(priv, flags);
for_each_rsnd_dai(rdai, priv, i) { for_each_rsnd_dai(rdai, priv, i) {
ret |= rsnd_dai_call(remove, &rdai->playback, priv); ret |= rsnd_dai_call(remove, &rdai->playback, priv);
ret |= rsnd_dai_call(remove, &rdai->capture, priv); ret |= rsnd_dai_call(remove, &rdai->capture, priv);
} }
rsnd_unlock(priv, flags);
for (i = 0; i < ARRAY_SIZE(remove_func); i++) for (i = 0; i < ARRAY_SIZE(remove_func); i++)
remove_func[i](pdev, priv); remove_func[i](pdev, priv);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment