[alsa-devel] [PATCH v2 1/2] ASoC: adau17x1: Handling of DSP_RUN register during fw setup
Lars-Peter Clausen
lars at metafoo.de
Thu Apr 12 18:30:31 CEST 2018
On 04/09/2018 03:13 PM, Robert Rosengren wrote:
> From: Danny Smith <dannys at axis.com>
>
> DSP_RUN needs to be disabled during firmware write otherwise
> we can end up with undefined behavior if writing to a dsp which
> is already running firmware.
>
> Signed-off-by: Danny Smith <dannys at axis.com>
> Signed-off-by: Robert Rosengren <robert.rosengren at axis.com>
Acked-by: Lars-Peter Clausen <lars at metafoo.de>
> ---
> sound/soc/codecs/adau17x1.c | 26 ++++++++++++++++++++------
> sound/soc/codecs/adau17x1.h | 3 ++-
> 2 files changed, 22 insertions(+), 7 deletions(-)
>
> diff --git a/sound/soc/codecs/adau17x1.c b/sound/soc/codecs/adau17x1.c
> index 80c2a06285bb..12bf24c26818 100644
> --- a/sound/soc/codecs/adau17x1.c
> +++ b/sound/soc/codecs/adau17x1.c
> @@ -502,7 +502,7 @@ static int adau17x1_hw_params(struct snd_pcm_substream *substream,
> }
>
> if (adau->sigmadsp) {
> - ret = adau17x1_setup_firmware(adau, params_rate(params));
> + ret = adau17x1_setup_firmware(component, params_rate(params));
> if (ret < 0)
> return ret;
> }
> @@ -835,26 +835,40 @@ bool adau17x1_volatile_register(struct device *dev, unsigned int reg)
> }
> EXPORT_SYMBOL_GPL(adau17x1_volatile_register);
>
> -int adau17x1_setup_firmware(struct adau *adau, unsigned int rate)
> +int adau17x1_setup_firmware(struct snd_soc_component *component,
> + unsigned int rate)
> {
> int ret;
> - int dspsr;
> + int dspsr, dsp_run;
> + struct adau *adau = snd_soc_component_get_drvdata(component);
> + struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component);
> +
> + snd_soc_dapm_mutex_lock(dapm);
>
> ret = regmap_read(adau->regmap, ADAU17X1_DSP_SAMPLING_RATE, &dspsr);
> if (ret)
> - return ret;
> + goto err;
> +
> + ret = regmap_read(adau->regmap, ADAU17X1_DSP_RUN, &dsp_run);
> + if (ret)
> + goto err;
>
> regmap_write(adau->regmap, ADAU17X1_DSP_ENABLE, 1);
> regmap_write(adau->regmap, ADAU17X1_DSP_SAMPLING_RATE, 0xf);
> + regmap_write(adau->regmap, ADAU17X1_DSP_RUN, 0);
>
> ret = sigmadsp_setup(adau->sigmadsp, rate);
> if (ret) {
> regmap_write(adau->regmap, ADAU17X1_DSP_ENABLE, 0);
> - return ret;
> + goto err;
> }
> regmap_write(adau->regmap, ADAU17X1_DSP_SAMPLING_RATE, dspsr);
> + regmap_write(adau->regmap, ADAU17X1_DSP_RUN, dsp_run);
>
> - return 0;
> +err:
> + snd_soc_dapm_mutex_unlock(dapm);
> +
> + return ret;
> }
> EXPORT_SYMBOL_GPL(adau17x1_setup_firmware);
>
> diff --git a/sound/soc/codecs/adau17x1.h b/sound/soc/codecs/adau17x1.h
> index a7b1cb770814..e6fe87beec07 100644
> --- a/sound/soc/codecs/adau17x1.h
> +++ b/sound/soc/codecs/adau17x1.h
> @@ -68,7 +68,8 @@ int adau17x1_resume(struct snd_soc_component *component);
>
> extern const struct snd_soc_dai_ops adau17x1_dai_ops;
>
> -int adau17x1_setup_firmware(struct adau *adau, unsigned int rate);
> +int adau17x1_setup_firmware(struct snd_soc_component *component,
> + unsigned int rate);
> bool adau17x1_has_dsp(struct adau *adau);
>
> #define ADAU17X1_CLOCK_CONTROL 0x4000
>
More information about the Alsa-devel
mailing list