Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 90d19ba5 authored by Charles Keepax's avatar Charles Keepax Committed by Mark Brown
Browse files

ASoC: wm_adsp: Put DSP into low power state between loading and running



Between when we load the DSP and when it actually starts running put the
core into a lower power state where the memory is retained but nothing
is clocked.

Signed-off-by: default avatarCharles Keepax <ckeepax@opensource.wolfsonmicro.com>
Signed-off-by: default avatarMark Brown <broonie@kernel.org>
parent 1fa96f3f
Loading
Loading
Loading
Loading
+17 −1
Original line number Diff line number Diff line
@@ -2259,6 +2259,11 @@ static void wm_adsp2_boot_work(struct work_struct *work)

	mutex_lock(&dsp->pwr_lock);

	ret = regmap_update_bits(dsp->regmap, dsp->base + ADSP2_CONTROL,
				 ADSP2_MEM_ENA, ADSP2_MEM_ENA);
	if (ret != 0)
		goto err_mutex;

	ret = wm_adsp2_ena(dsp);
	if (ret != 0)
		goto err_mutex;
@@ -2282,6 +2287,12 @@ static void wm_adsp2_boot_work(struct work_struct *work)

	dsp->booted = true;

	/* Turn DSP back off until we are ready to run */
	ret = regmap_update_bits(dsp->regmap, dsp->base + ADSP2_CONTROL,
				 ADSP2_SYS_ENA, 0);
	if (ret != 0)
		goto err_ena;

	mutex_unlock(&dsp->pwr_lock);

	return;
@@ -2344,6 +2355,10 @@ int wm_adsp2_event(struct snd_soc_dapm_widget *w,
		if (!dsp->booted)
			return -EIO;

		ret = wm_adsp2_ena(dsp);
		if (ret != 0)
			goto err;

		/* Sync set controls */
		ret = wm_coeff_sync_controls(dsp);
		if (ret != 0)
@@ -2382,7 +2397,8 @@ int wm_adsp2_event(struct snd_soc_dapm_widget *w,
		dsp->booted = false;

		regmap_update_bits(dsp->regmap, dsp->base + ADSP2_CONTROL,
				   ADSP2_CORE_ENA | ADSP2_START, 0);
				   ADSP2_MEM_ENA | ADSP2_CORE_ENA | ADSP2_START,
				   0);

		/* Make sure DMAs are quiesced */
		regmap_write(dsp->regmap, dsp->base + ADSP2_RDMA_CONFIG_1, 0);