Commit 14428429 authored by Jerome Brunet's avatar Jerome Brunet Committed by Mark Brown

ASoC: hdmi-codec: re-introduce mutex locking again

The dai codec needs to ensure that on one dai is used at any time.
This is currently protected by bit atomic operation. With this change,
it done with a mutex instead.

This change is not about functionality or efficiency. It is done with
the hope that it help maintainability in the future.
Suggested-by: default avatarMark Brown <broonie@kernel.org>
Signed-off-by: default avatarJerome Brunet <jbrunet@baylibre.com>
Link: https://lore.kernel.org/r/20191206103542.485224-1-jbrunet@baylibre.comSigned-off-by: default avatarMark Brown <broonie@kernel.org>
parent bc9a6655
...@@ -274,7 +274,8 @@ struct hdmi_codec_priv { ...@@ -274,7 +274,8 @@ struct hdmi_codec_priv {
uint8_t eld[MAX_ELD_BYTES]; uint8_t eld[MAX_ELD_BYTES];
struct snd_pcm_chmap *chmap_info; struct snd_pcm_chmap *chmap_info;
unsigned int chmap_idx; unsigned int chmap_idx;
unsigned long busy; struct mutex lock;
bool busy;
struct snd_soc_jack *jack; struct snd_soc_jack *jack;
unsigned int jack_status; unsigned int jack_status;
}; };
...@@ -390,9 +391,10 @@ static int hdmi_codec_startup(struct snd_pcm_substream *substream, ...@@ -390,9 +391,10 @@ static int hdmi_codec_startup(struct snd_pcm_substream *substream,
struct hdmi_codec_priv *hcp = snd_soc_dai_get_drvdata(dai); struct hdmi_codec_priv *hcp = snd_soc_dai_get_drvdata(dai);
int ret = 0; int ret = 0;
ret = test_and_set_bit(0, &hcp->busy); mutex_lock(&hcp->lock);
if (ret) { if (hcp->busy) {
dev_err(dai->dev, "Only one simultaneous stream supported!\n"); dev_err(dai->dev, "Only one simultaneous stream supported!\n");
mutex_unlock(&hcp->lock);
return -EINVAL; return -EINVAL;
} }
...@@ -405,21 +407,21 @@ static int hdmi_codec_startup(struct snd_pcm_substream *substream, ...@@ -405,21 +407,21 @@ static int hdmi_codec_startup(struct snd_pcm_substream *substream,
if (hcp->hcd.ops->get_eld) { if (hcp->hcd.ops->get_eld) {
ret = hcp->hcd.ops->get_eld(dai->dev->parent, hcp->hcd.data, ret = hcp->hcd.ops->get_eld(dai->dev->parent, hcp->hcd.data,
hcp->eld, sizeof(hcp->eld)); hcp->eld, sizeof(hcp->eld));
if (ret)
goto err;
if (!ret) { ret = snd_pcm_hw_constraint_eld(substream->runtime, hcp->eld);
ret = snd_pcm_hw_constraint_eld(substream->runtime,
hcp->eld);
if (ret) if (ret)
goto err; goto err;
}
/* Select chmap supported */ /* Select chmap supported */
hdmi_codec_eld_chmap(hcp); hdmi_codec_eld_chmap(hcp);
} }
return 0;
hcp->busy = true;
err: err:
/* Release the exclusive lock on error */ mutex_unlock(&hcp->lock);
clear_bit(0, &hcp->busy);
return ret; return ret;
} }
...@@ -431,7 +433,9 @@ static void hdmi_codec_shutdown(struct snd_pcm_substream *substream, ...@@ -431,7 +433,9 @@ static void hdmi_codec_shutdown(struct snd_pcm_substream *substream,
hcp->chmap_idx = HDMI_CODEC_CHMAP_IDX_UNKNOWN; hcp->chmap_idx = HDMI_CODEC_CHMAP_IDX_UNKNOWN;
hcp->hcd.ops->audio_shutdown(dai->dev->parent, hcp->hcd.data); hcp->hcd.ops->audio_shutdown(dai->dev->parent, hcp->hcd.data);
clear_bit(0, &hcp->busy); mutex_lock(&hcp->lock);
hcp->busy = false;
mutex_unlock(&hcp->lock);
} }
static int hdmi_codec_hw_params(struct snd_pcm_substream *substream, static int hdmi_codec_hw_params(struct snd_pcm_substream *substream,
...@@ -811,6 +815,8 @@ static int hdmi_codec_probe(struct platform_device *pdev) ...@@ -811,6 +815,8 @@ static int hdmi_codec_probe(struct platform_device *pdev)
return -ENOMEM; return -ENOMEM;
hcp->hcd = *hcd; hcp->hcd = *hcd;
mutex_init(&hcp->lock);
daidrv = devm_kcalloc(dev, dai_count, sizeof(*daidrv), GFP_KERNEL); daidrv = devm_kcalloc(dev, dai_count, sizeof(*daidrv), GFP_KERNEL);
if (!daidrv) if (!daidrv)
return -ENOMEM; return -ENOMEM;
......
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