Commit 58a5c9a4 authored by Peter Ujfalusi's avatar Peter Ujfalusi Committed by Mark Brown

ASoC: SOF: Introduce macro to set the firmware state

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: default avatarPeter Ujfalusi <peter.ujfalusi@linux.intel.com>
Reviewed-by: default avatarPierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Reviewed-by: default avatarKai Vehmanen <kai.vehmanen@linux.intel.com>
Link: https://lore.kernel.org/r/20211006110645.26679-15-peter.ujfalusi@linux.intel.comSigned-off-by: default avatarMark Brown <broonie@kernel.org>
parent 705f4539
...@@ -147,7 +147,7 @@ static int sof_probe_continue(struct snd_sof_dev *sdev) ...@@ -147,7 +147,7 @@ static int sof_probe_continue(struct snd_sof_dev *sdev)
return ret; return ret;
} }
sdev->fw_state = SOF_FW_BOOT_PREPARE; sof_set_fw_state(sdev, SOF_FW_BOOT_PREPARE);
/* check machine info */ /* check machine info */
ret = sof_machine_check(sdev); ret = sof_machine_check(sdev);
...@@ -189,7 +189,7 @@ static int sof_probe_continue(struct snd_sof_dev *sdev) ...@@ -189,7 +189,7 @@ static int sof_probe_continue(struct snd_sof_dev *sdev)
goto fw_load_err; 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 * Boot the firmware. The FW boot status will be modified
...@@ -265,7 +265,7 @@ static int sof_probe_continue(struct snd_sof_dev *sdev) ...@@ -265,7 +265,7 @@ static int sof_probe_continue(struct snd_sof_dev *sdev)
snd_sof_remove(sdev); snd_sof_remove(sdev);
/* all resources freed, update state to match */ /* 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; sdev->first_boot = true;
return ret; return ret;
...@@ -300,7 +300,7 @@ int snd_sof_device_probe(struct device *dev, struct snd_sof_pdata *plat_data) ...@@ -300,7 +300,7 @@ int snd_sof_device_probe(struct device *dev, struct snd_sof_pdata *plat_data)
sdev->pdata = plat_data; sdev->pdata = plat_data;
sdev->first_boot = true; 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) #if IS_ENABLED(CONFIG_SND_SOC_SOF_DEBUG_PROBES)
sdev->extractor_stream_tag = SOF_PROBE_INVALID_NODE_ID; sdev->extractor_stream_tag = SOF_PROBE_INVALID_NODE_ID;
#endif #endif
......
...@@ -458,9 +458,9 @@ void snd_sof_ipc_msgs_rx(struct snd_sof_dev *sdev) ...@@ -458,9 +458,9 @@ void snd_sof_ipc_msgs_rx(struct snd_sof_dev *sdev)
if (sdev->fw_state == SOF_FW_BOOT_IN_PROGRESS) { if (sdev->fw_state == SOF_FW_BOOT_IN_PROGRESS) {
err = sof_ops(sdev)->fw_ready(sdev, cmd); err = sof_ops(sdev)->fw_ready(sdev, cmd);
if (err < 0) if (err < 0)
sdev->fw_state = SOF_FW_BOOT_READY_FAILED; sof_set_fw_state(sdev, SOF_FW_BOOT_READY_FAILED);
else else
sdev->fw_state = SOF_FW_BOOT_COMPLETE; sof_set_fw_state(sdev, SOF_FW_BOOT_COMPLETE);
/* wake up firmware loader */ /* wake up firmware loader */
wake_up(&sdev->boot_wait); wake_up(&sdev->boot_wait);
......
...@@ -838,7 +838,7 @@ int snd_sof_run_firmware(struct snd_sof_dev *sdev) ...@@ -838,7 +838,7 @@ int snd_sof_run_firmware(struct snd_sof_dev *sdev)
dev_err(sdev->dev, "error: firmware boot failure\n"); dev_err(sdev->dev, "error: firmware boot failure\n");
snd_sof_dsp_dbg_dump(sdev, SOF_DBG_DUMP_REGS | SOF_DBG_DUMP_MBOX | snd_sof_dsp_dbg_dump(sdev, SOF_DBG_DUMP_REGS | SOF_DBG_DUMP_MBOX |
SOF_DBG_DUMP_TEXT | SOF_DBG_DUMP_PCI); 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; return -EIO;
} }
......
...@@ -122,7 +122,7 @@ static int sof_resume(struct device *dev, bool runtime_resume) ...@@ -122,7 +122,7 @@ static int sof_resume(struct device *dev, bool runtime_resume)
old_state == SOF_DSP_PM_D0) old_state == SOF_DSP_PM_D0)
return 0; return 0;
sdev->fw_state = SOF_FW_BOOT_PREPARE; sof_set_fw_state(sdev, SOF_FW_BOOT_PREPARE);
/* load the firmware */ /* load the firmware */
ret = snd_sof_load_firmware(sdev); ret = snd_sof_load_firmware(sdev);
...@@ -133,7 +133,7 @@ static int sof_resume(struct device *dev, bool runtime_resume) ...@@ -133,7 +133,7 @@ static int sof_resume(struct device *dev, bool runtime_resume)
return ret; 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 * Boot the firmware. The FW boot status will be modified
...@@ -257,7 +257,7 @@ static int sof_suspend(struct device *dev, bool runtime_suspend) ...@@ -257,7 +257,7 @@ static int sof_suspend(struct device *dev, bool runtime_suspend)
return ret; return ret;
/* reset FW state */ /* 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; sdev->enabled_cores_mask = 0;
return ret; return ret;
......
...@@ -561,6 +561,19 @@ static inline void sof_oops(struct snd_sof_dev *sdev, void *oops) ...@@ -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; 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 * Utilities
*/ */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment