ASoC: cs35l56: In secure mode skip SHUTDOWN and RESET around fw download
authorSimon Trimmer <simont@opensource.cirrus.com>
Thu, 18 May 2023 15:02:50 +0000 (16:02 +0100)
committerMark Brown <broonie@kernel.org>
Fri, 19 May 2023 02:32:13 +0000 (11:32 +0900)
If the device is in secure mode it's unnecessary to send a SHUTDOWN and
SYSTEM_RESET around the firmware download. It could only be patching
insecure tunings. A tuning patch doesn't need a SHUTDOWN and only needs
a REINIT afterwards. This will reduce the overhead of exiting system
suspend in secure mode.

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

index 002042b1c73cd4ef46b225cc7d5d8b0013fedca2..1f9713d7ca76ff4f595416db7f48f434b24454f7 100644 (file)
 
 #define CS35L56_MBOX_CMD_AUDIO_PLAY                    0x0B000001
 #define CS35L56_MBOX_CMD_AUDIO_PAUSE                   0x0B000002
+#define CS35L56_MBOX_CMD_AUDIO_REINIT                  0x0B000003
 #define CS35L56_MBOX_CMD_HIBERNATE_NOW                 0x02000001
 #define CS35L56_MBOX_CMD_WAKEUP                                0x02000002
 #define CS35L56_MBOX_CMD_PREVENT_AUTO_HIBERNATE                0x02000003
index d1d304ad559bb9f4e4f0b36b3e4704bbec6e6529..5df8cb55677206c2f4eaeaa40e262a532f2ee63e 100644 (file)
@@ -825,19 +825,23 @@ static void cs35l56_system_reset(struct cs35l56_private *cs35l56)
        regcache_cache_only(cs35l56->regmap, false);
 }
 
-static void cs35l56_dsp_work(struct work_struct *work)
+static void cs35l56_secure_patch(struct cs35l56_private *cs35l56)
 {
-       struct cs35l56_private *cs35l56 = container_of(work,
-                                                      struct cs35l56_private,
-                                                      dsp_work);
-       unsigned int reg;
-       unsigned int val;
-       int ret = 0;
+       int ret;
 
-       if (!cs35l56->init_done)
-               return;
+       /* Use wm_adsp to load and apply the firmware patch and coefficient files */
+       ret = wm_adsp_power_up(&cs35l56->dsp);
+       if (ret)
+               dev_dbg(cs35l56->dev, "%s: wm_adsp_power_up ret %d\n", __func__, ret);
+       else
+               cs35l56_mbox_send(cs35l56, CS35L56_MBOX_CMD_AUDIO_REINIT);
+}
 
-       pm_runtime_get_sync(cs35l56->dev);
+static void cs35l56_patch(struct cs35l56_private *cs35l56)
+{
+       unsigned int reg;
+       unsigned int val;
+       int ret;
 
        /*
         * Disable SoundWire interrupts to prevent race with IRQ work.
@@ -909,6 +913,29 @@ err:
                sdw_write_no_pm(cs35l56->sdw_peripheral, CS35L56_SDW_GEN_INT_MASK_1,
                                CS35L56_SDW_INT_MASK_CODEC_IRQ);
        }
+}
+
+static void cs35l56_dsp_work(struct work_struct *work)
+{
+       struct cs35l56_private *cs35l56 = container_of(work,
+                                                      struct cs35l56_private,
+                                                      dsp_work);
+
+       if (!cs35l56->init_done)
+               return;
+
+       pm_runtime_get_sync(cs35l56->dev);
+
+       /*
+        * When the device is running in secure mode the firmware files can
+        * only contain insecure tunings and therefore we do not need to
+        * shutdown the firmware to apply them and can use the lower cost
+        * reinit sequence instead.
+        */
+       if (cs35l56->secured)
+               cs35l56_secure_patch(cs35l56);
+       else
+               cs35l56_patch(cs35l56);
 
        pm_runtime_mark_last_busy(cs35l56->dev);
        pm_runtime_put_autosuspend(cs35l56->dev);