ASoC: cs35l56: Make a common function to shutdown the DSP
authorSimon Trimmer <simont@opensource.cirrus.com>
Fri, 21 Jul 2023 13:21:18 +0000 (14:21 +0100)
committerMark Brown <broonie@kernel.org>
Sun, 23 Jul 2023 22:40:22 +0000 (23:40 +0100)
Move issuing of a CS35L56_MBOX_CMD_SHUTDOWN command and then waiting for
the DSP to reach CS35L56_HALO_STATE_SHUTDOWN in the register appropriate
for the hardware revision into a common function.

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

index 79e117a..3950322 100644 (file)
@@ -274,6 +274,7 @@ extern const unsigned int cs35l56_tx_input_values[CS35L56_NUM_INPUT_SRC];
 
 int cs35l56_set_patch(struct cs35l56_base *cs35l56_base);
 int cs35l56_mbox_send(struct cs35l56_base *cs35l56_base, unsigned int command);
+int cs35l56_firmware_shutdown(struct cs35l56_base *cs35l56_base);
 int cs35l56_wait_for_firmware_boot(struct cs35l56_base *cs35l56_base);
 void cs35l56_wait_control_port_ready(void);
 void cs35l56_wait_min_reset_pulse(void);
index 4e3becb..ae373f3 100644 (file)
@@ -213,6 +213,32 @@ int cs35l56_mbox_send(struct cs35l56_base *cs35l56_base, unsigned int command)
 }
 EXPORT_SYMBOL_NS_GPL(cs35l56_mbox_send, SND_SOC_CS35L56_SHARED);
 
+int cs35l56_firmware_shutdown(struct cs35l56_base *cs35l56_base)
+{
+       int ret;
+       unsigned int reg;
+       unsigned int val;
+
+       ret = cs35l56_mbox_send(cs35l56_base, CS35L56_MBOX_CMD_SHUTDOWN);
+       if (ret)
+               return ret;
+
+       if (cs35l56_base->rev < CS35L56_REVID_B0)
+               reg = CS35L56_DSP1_PM_CUR_STATE_A1;
+       else
+               reg = CS35L56_DSP1_PM_CUR_STATE;
+
+       ret = regmap_read_poll_timeout(cs35l56_base->regmap,  reg,
+                                      val, (val == CS35L56_HALO_STATE_SHUTDOWN),
+                                      CS35L56_HALO_STATE_POLL_US,
+                                      CS35L56_HALO_STATE_TIMEOUT_US);
+       if (ret < 0)
+               dev_err(cs35l56_base->dev, "Failed to poll PM_CUR_STATE to 1 is %d (ret %d)\n",
+                       val, ret);
+       return ret;
+}
+EXPORT_SYMBOL_NS_GPL(cs35l56_firmware_shutdown, SND_SOC_CS35L56_SHARED);
+
 int cs35l56_wait_for_firmware_boot(struct cs35l56_base *cs35l56_base)
 {
        unsigned int reg;
index d06b83d..19b6b4f 100644 (file)
@@ -673,8 +673,6 @@ static void cs35l56_secure_patch(struct cs35l56_private *cs35l56)
 
 static void cs35l56_patch(struct cs35l56_private *cs35l56)
 {
-       unsigned int reg;
-       unsigned int val;
        int ret;
 
        /*
@@ -691,23 +689,10 @@ static void cs35l56_patch(struct cs35l56_private *cs35l56)
                flush_work(&cs35l56->sdw_irq_work);
        }
 
-       ret = cs35l56_mbox_send(&cs35l56->base, CS35L56_MBOX_CMD_SHUTDOWN);
+       ret = cs35l56_firmware_shutdown(&cs35l56->base);
        if (ret)
                goto err;
 
-       if (cs35l56->base.rev < CS35L56_REVID_B0)
-               reg = CS35L56_DSP1_PM_CUR_STATE_A1;
-       else
-               reg = CS35L56_DSP1_PM_CUR_STATE;
-
-       ret = regmap_read_poll_timeout(cs35l56->base.regmap, reg,
-                                      val, (val == CS35L56_HALO_STATE_SHUTDOWN),
-                                      CS35L56_HALO_STATE_POLL_US,
-                                      CS35L56_HALO_STATE_TIMEOUT_US);
-       if (ret < 0)
-               dev_err(cs35l56->base.dev, "Failed to poll PM_CUR_STATE to 1 is %d (ret %d)\n",
-                       val, ret);
-
        /* Use wm_adsp to load and apply the firmware patch and coefficient files */
        ret = wm_adsp_power_up(&cs35l56->dsp);
        if (ret) {