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: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
parent
eb2535f542
commit
e9c390df67
|
@ -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,
|
||||||
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 = {
|
||||||
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,
|
||||||
*/
|
*/
|
||||||
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)
|
||||||
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)
|
||||||
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)
|
||||||
{
|
{
|
||||||
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)
|
||||||
|
|
||||||
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);
|
||||||
|
|
Loading…
Reference in New Issue