Unverified Commit ba235634 authored by Charles Keepax's avatar Charles Keepax Committed by Mark Brown
Browse files

ASoC: wm_adsp: Add support for "toggle" preloaders



In the case a device can support retaining the firmware memory across
low power states it is useful for the preloader widget to only power up
whilst actually loading/unloading the core, as opposed to the normal
operation where the widget is powered for the entire time a firmware is
preloaded onto the core. Add support for this mode and a flag to enable
it.

Signed-off-by: default avatarCharles Keepax <ckeepax@opensource.cirrus.com>
Link: https://lore.kernel.org/r/20220105113026.18955-7-ckeepax@opensource.cirrus.com


Signed-off-by: default avatarMark Brown <broonie@kernel.org>
parent 7aa1cc10
Loading
Loading
Loading
Loading
+11 −3
Original line number Diff line number Diff line
@@ -896,11 +896,12 @@ int wm_adsp2_preloader_put(struct snd_kcontrol *kcontrol,
	struct wm_adsp *dsp = &dsps[mc->shift - 1];
	char preload[32];

	snprintf(preload, ARRAY_SIZE(preload), "%s Preload", dsp->cs_dsp.name);
	if (dsp->preloaded == ucontrol->value.integer.value[0])
		return 0;

	dsp->preloaded = ucontrol->value.integer.value[0];
	snprintf(preload, ARRAY_SIZE(preload), "%s Preload", dsp->cs_dsp.name);

	if (ucontrol->value.integer.value[0])
	if (ucontrol->value.integer.value[0] || dsp->toggle_preload)
		snd_soc_component_force_enable_pin(component, preload);
	else
		snd_soc_component_disable_pin(component, preload);
@@ -909,6 +910,13 @@ int wm_adsp2_preloader_put(struct snd_kcontrol *kcontrol,

	flush_work(&dsp->boot_work);

	dsp->preloaded = ucontrol->value.integer.value[0];

	if (dsp->toggle_preload) {
		snd_soc_component_disable_pin(component, preload);
		snd_soc_dapm_sync(dapm);
	}

	return 0;
}
EXPORT_SYMBOL_GPL(wm_adsp2_preloader_put);
+8 −0
Original line number Diff line number Diff line
@@ -41,6 +41,14 @@ struct wm_adsp {

	struct list_head compr_list;
	struct list_head buffer_list;

	/*
	 * Flag indicating the preloader widget only needs power toggled
	 * on state change rather than held on for the duration of the
	 * preload, useful for devices that can retain firmware memory
	 * across power down.
	 */
	bool toggle_preload;
};

#define WM_ADSP1(wname, num) \