ASoC: wm_adsp: Support powering-up DSP without trying to load firmware
authorRichard Fitzgerald <rf@opensource.cirrus.com>
Tue, 15 Aug 2023 12:48:25 +0000 (13:48 +0100)
committerMark Brown <broonie@kernel.org>
Tue, 15 Aug 2023 12:56:46 +0000 (13:56 +0100)
Add a flag to wm_adsp_power_up() that indicates whether it should attempt
to find and load firmware files.

This is to support DSPs that have built-in firmware that may already have
been patched (for example, by the BIOS). In that case the patch must not
be overwritten because that could corrupt the running firmware.

Signed-off-by: Richard Fitzgerald <rf@opensource.cirrus.com>
Link: https://lore.kernel.org/r/20230815124826.5447-2-rf@opensource.cirrus.com
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/codecs/cs35l56.c
sound/soc/codecs/wm_adsp.c
sound/soc/codecs/wm_adsp.h

index 80e7fdd..98cfcae 100644 (file)
@@ -656,7 +656,7 @@ static void cs35l56_secure_patch(struct cs35l56_private *cs35l56)
        int ret;
 
        /* Use wm_adsp to load and apply the firmware patch and coefficient files */
-       ret = wm_adsp_power_up(&cs35l56->dsp);
+       ret = wm_adsp_power_up(&cs35l56->dsp, true);
        if (ret)
                dev_dbg(cs35l56->base.dev, "%s: wm_adsp_power_up ret %d\n", __func__, ret);
        else
@@ -686,7 +686,7 @@ static void cs35l56_patch(struct cs35l56_private *cs35l56)
                goto err;
 
        /* Use wm_adsp to load and apply the firmware patch and coefficient files */
-       ret = wm_adsp_power_up(&cs35l56->dsp);
+       ret = wm_adsp_power_up(&cs35l56->dsp, true);
        if (ret) {
                dev_dbg(cs35l56->base.dev, "%s: wm_adsp_power_up ret %d\n", __func__, ret);
                goto err;
index 13f500f..6fc34f4 100644 (file)
@@ -998,7 +998,7 @@ int wm_adsp2_preloader_put(struct snd_kcontrol *kcontrol,
 }
 EXPORT_SYMBOL_GPL(wm_adsp2_preloader_put);
 
-int wm_adsp_power_up(struct wm_adsp *dsp)
+int wm_adsp_power_up(struct wm_adsp *dsp, bool load_firmware)
 {
        int ret = 0;
        char *wmfw_filename = NULL;
@@ -1006,11 +1006,13 @@ int wm_adsp_power_up(struct wm_adsp *dsp)
        char *coeff_filename = NULL;
        const struct firmware *coeff_firmware = NULL;
 
-       ret = wm_adsp_request_firmware_files(dsp,
-                                            &wmfw_firmware, &wmfw_filename,
-                                            &coeff_firmware, &coeff_filename);
-       if (ret)
-               return ret;
+       if (load_firmware) {
+               ret = wm_adsp_request_firmware_files(dsp,
+                                                    &wmfw_firmware, &wmfw_filename,
+                                                    &coeff_firmware, &coeff_filename);
+               if (ret)
+                       return ret;
+       }
 
        ret = cs_dsp_power_up(&dsp->cs_dsp,
                              wmfw_firmware, wmfw_filename,
@@ -1037,7 +1039,7 @@ static void wm_adsp_boot_work(struct work_struct *work)
                                           struct wm_adsp,
                                           boot_work);
 
-       wm_adsp_power_up(dsp);
+       wm_adsp_power_up(dsp, true);
 }
 
 int wm_adsp_early_event(struct snd_soc_dapm_widget *w,
index 3044f96..067d807 100644 (file)
@@ -91,7 +91,7 @@ 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);
+int wm_adsp_power_up(struct wm_adsp *dsp, bool load_firmware);
 void wm_adsp_power_down(struct wm_adsp *dsp);
 
 irqreturn_t wm_adsp2_bus_error(int irq, void *data);