ASoC: wm_adsp: Expose the DSP boot work actions as wm_adsp_power_up()
authorSimon Trimmer <simont@opensource.cirrus.com>
Mon, 20 Mar 2023 11:22:42 +0000 (11:22 +0000)
committerMark Brown <broonie@kernel.org>
Tue, 21 Mar 2023 12:13:21 +0000 (12:13 +0000)
To support self-booting DSPs that are considered always running, the work
that is usually invoked as part of a DAPM sequence needs to be triggered
by a client of wm_adsp as part of it's startup sequence.

These actions load firmware files that might create ALSA controls and
apply configuration to the device.

Signed-off-by: Simon Trimmer <simont@opensource.cirrus.com>
Signed-off-by: Richard Fitzgerald <rf@opensource.cirrus.com>
Link: https://lore.kernel.org/r/20230320112245.115720-6-rf@opensource.cirrus.com
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/codecs/wm_adsp.c
sound/soc/codecs/wm_adsp.h

index 8176b6173de922aba9f9a3e7acb399888a13c552..d4bffa2f70058f3ac568679141c9eb0c871723e9 100644 (file)
@@ -998,11 +998,8 @@ int wm_adsp2_preloader_put(struct snd_kcontrol *kcontrol,
 }
 EXPORT_SYMBOL_GPL(wm_adsp2_preloader_put);
 
-static void wm_adsp_boot_work(struct work_struct *work)
+int wm_adsp_power_up(struct wm_adsp *dsp)
 {
-       struct wm_adsp *dsp = container_of(work,
-                                          struct wm_adsp,
-                                          boot_work);
        int ret = 0;
        char *wmfw_filename = NULL;
        const struct firmware *wmfw_firmware = NULL;
@@ -1013,16 +1010,28 @@ static void wm_adsp_boot_work(struct work_struct *work)
                                             &wmfw_firmware, &wmfw_filename,
                                             &coeff_firmware, &coeff_filename);
        if (ret)
-               return;
+               return ret;
 
-       cs_dsp_power_up(&dsp->cs_dsp,
-                       wmfw_firmware, wmfw_filename,
-                       coeff_firmware, coeff_filename,
-                       wm_adsp_fw_text[dsp->fw]);
+       ret = cs_dsp_power_up(&dsp->cs_dsp,
+                             wmfw_firmware, wmfw_filename,
+                             coeff_firmware, coeff_filename,
+                             wm_adsp_fw_text[dsp->fw]);
 
        wm_adsp_release_firmware_files(dsp,
                                       wmfw_firmware, wmfw_filename,
                                       coeff_firmware, coeff_filename);
+
+       return ret;
+}
+EXPORT_SYMBOL_GPL(wm_adsp_power_up);
+
+static void wm_adsp_boot_work(struct work_struct *work)
+{
+       struct wm_adsp *dsp = container_of(work,
+                                          struct wm_adsp,
+                                          boot_work);
+
+       wm_adsp_power_up(dsp);
 }
 
 int wm_adsp_early_event(struct snd_soc_dapm_widget *w,
index 173dcae2c260c866aff0ca60ad3748c6947abdc9..769904d34a87c978a48615567675aa5299150677 100644 (file)
@@ -91,6 +91,8 @@ int wm_adsp1_event(struct snd_soc_dapm_widget *w,
 int wm_adsp_early_event(struct snd_soc_dapm_widget *w,
                        struct snd_kcontrol *kcontrol, int event);
 
+int wm_adsp_power_up(struct wm_adsp *dsp);
+
 irqreturn_t wm_adsp2_bus_error(int irq, void *data);
 irqreturn_t wm_halo_bus_error(int irq, void *data);
 irqreturn_t wm_halo_wdt_expire(int irq, void *data);