ASoC: SOF: Introduce macro to set the firmware state
authorPeter Ujfalusi <peter.ujfalusi@linux.intel.com>
Wed, 6 Oct 2021 11:06:40 +0000 (14:06 +0300)
committerMark Brown <broonie@kernel.org>
Thu, 7 Oct 2021 14:45:36 +0000 (15:45 +0100)
Add sof_set_fw_state() macro to wrap the sdev->fw_state management to allow
actions to be taken when certain state is set or when state is changing.

Signed-off-by: Peter Ujfalusi <peter.ujfalusi@linux.intel.com>
Reviewed-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Reviewed-by: Kai Vehmanen <kai.vehmanen@linux.intel.com>
Link: https://lore.kernel.org/r/20211006110645.26679-15-peter.ujfalusi@linux.intel.com
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/sof/core.c
sound/soc/sof/ipc.c
sound/soc/sof/loader.c
sound/soc/sof/pm.c
sound/soc/sof/sof-priv.h

index 7f28fdd3084cf6a70e0a6d30bb51dcffc94218cc..ce377ff35030444ed538ac99d9f89d28d94a258a 100644 (file)
@@ -147,7 +147,7 @@ static int sof_probe_continue(struct snd_sof_dev *sdev)
                return ret;
        }
 
-       sdev->fw_state = SOF_FW_BOOT_PREPARE;
+       sof_set_fw_state(sdev, SOF_FW_BOOT_PREPARE);
 
        /* check machine info */
        ret = sof_machine_check(sdev);
@@ -189,7 +189,7 @@ static int sof_probe_continue(struct snd_sof_dev *sdev)
                goto fw_load_err;
        }
 
-       sdev->fw_state = SOF_FW_BOOT_IN_PROGRESS;
+       sof_set_fw_state(sdev, SOF_FW_BOOT_IN_PROGRESS);
 
        /*
         * Boot the firmware. The FW boot status will be modified
@@ -265,7 +265,7 @@ dsp_err:
        snd_sof_remove(sdev);
 
        /* all resources freed, update state to match */
-       sdev->fw_state = SOF_FW_BOOT_NOT_STARTED;
+       sof_set_fw_state(sdev, SOF_FW_BOOT_NOT_STARTED);
        sdev->first_boot = true;
 
        return ret;
@@ -300,7 +300,7 @@ int snd_sof_device_probe(struct device *dev, struct snd_sof_pdata *plat_data)
 
        sdev->pdata = plat_data;
        sdev->first_boot = true;
-       sdev->fw_state = SOF_FW_BOOT_NOT_STARTED;
+       sof_set_fw_state(sdev, SOF_FW_BOOT_NOT_STARTED);
 #if IS_ENABLED(CONFIG_SND_SOC_SOF_DEBUG_PROBES)
        sdev->extractor_stream_tag = SOF_PROBE_INVALID_NODE_ID;
 #endif
index 5c698fa662f4316d1916e4f24f104c29de985d36..5a308c62f7cadc88ed60cabe04d3dbd652186fb3 100644 (file)
@@ -458,9 +458,9 @@ void snd_sof_ipc_msgs_rx(struct snd_sof_dev *sdev)
                if (sdev->fw_state == SOF_FW_BOOT_IN_PROGRESS) {
                        err = sof_ops(sdev)->fw_ready(sdev, cmd);
                        if (err < 0)
-                               sdev->fw_state = SOF_FW_BOOT_READY_FAILED;
+                               sof_set_fw_state(sdev, SOF_FW_BOOT_READY_FAILED);
                        else
-                               sdev->fw_state = SOF_FW_BOOT_COMPLETE;
+                               sof_set_fw_state(sdev, SOF_FW_BOOT_COMPLETE);
 
                        /* wake up firmware loader */
                        wake_up(&sdev->boot_wait);
index b30cc653aeba9ec4ce9682a3eac9f14cee601e11..b06f5cded06628ea580ba1287e62a2c6ac956c6e 100644 (file)
@@ -838,7 +838,7 @@ int snd_sof_run_firmware(struct snd_sof_dev *sdev)
                dev_err(sdev->dev, "error: firmware boot failure\n");
                snd_sof_dsp_dbg_dump(sdev, SOF_DBG_DUMP_REGS | SOF_DBG_DUMP_MBOX |
                                     SOF_DBG_DUMP_TEXT | SOF_DBG_DUMP_PCI);
-               sdev->fw_state = SOF_FW_BOOT_FAILED;
+               sof_set_fw_state(sdev, SOF_FW_BOOT_FAILED);
                return -EIO;
        }
 
index 77a3496d3dbd044898b78f75713e0922117915d1..bf759bfa305e829ff973e764beab2d938666445d 100644 (file)
@@ -122,7 +122,7 @@ static int sof_resume(struct device *dev, bool runtime_resume)
            old_state == SOF_DSP_PM_D0)
                return 0;
 
-       sdev->fw_state = SOF_FW_BOOT_PREPARE;
+       sof_set_fw_state(sdev, SOF_FW_BOOT_PREPARE);
 
        /* load the firmware */
        ret = snd_sof_load_firmware(sdev);
@@ -133,7 +133,7 @@ static int sof_resume(struct device *dev, bool runtime_resume)
                return ret;
        }
 
-       sdev->fw_state = SOF_FW_BOOT_IN_PROGRESS;
+       sof_set_fw_state(sdev, SOF_FW_BOOT_IN_PROGRESS);
 
        /*
         * Boot the firmware. The FW boot status will be modified
@@ -257,7 +257,7 @@ suspend:
                return ret;
 
        /* reset FW state */
-       sdev->fw_state = SOF_FW_BOOT_NOT_STARTED;
+       sof_set_fw_state(sdev, SOF_FW_BOOT_NOT_STARTED);
        sdev->enabled_cores_mask = 0;
 
        return ret;
index 5c19393399369b87d9d006a08208ed1b2d68f21f..d9525f3ff5cddb246b1e7b95cf622e3160bd75c2 100644 (file)
@@ -561,6 +561,19 @@ static inline void sof_oops(struct snd_sof_dev *sdev, void *oops)
 
 extern const struct dsp_arch_ops sof_xtensa_arch_ops;
 
+/*
+ * Firmware state tracking
+ */
+static inline void sof_set_fw_state(struct snd_sof_dev *sdev,
+                                   enum snd_sof_fw_state new_state)
+{
+       if (sdev->fw_state == new_state)
+               return;
+
+       dev_dbg(sdev->dev, "fw_state change: %d -> %d\n", sdev->fw_state, new_state);
+       sdev->fw_state = new_state;
+}
+
 /*
  * Utilities
  */