@@ -135,6 +135,53 @@ void snd_sof_get_status(struct snd_sof_dev *sdev, u32 panic_code,
* (System Suspend/Runtime Suspend)
*/
+static int sof_load_and_run_firmware(struct snd_sof_dev *sdev)
+{
+ /* load the firmware */
+ int ret = snd_sof_load_firmware(sdev);
+ if (ret < 0) {
+ dev_err(sdev->dev, "error: failed to load DSP firmware %d\n",
+ ret);
+ return ret;
+ }
+
+ sdev->fw_state = SOF_FW_BOOT_IN_PROGRESS;
+
+ /*
+ * Boot the firmware. The FW boot status will be modified
+ * in snd_sof_run_firmware() depending on the outcome.
+ */
+ ret = snd_sof_run_firmware(sdev);
+ if (ret < 0) {
+ dev_err(sdev->dev, "error: failed to boot DSP firmware %d\n",
+ ret);
+ goto fw_run_err;
+ }
+
+ if (IS_ENABLED(CONFIG_SND_SOC_SOF_DEBUG_ENABLE_FIRMWARE_TRACE) ||
+ (sof_core_debug & SOF_DBG_ENABLE_TRACE)) {
+ sdev->dtrace_is_supported = true;
+
+ /* init DMA trace */
+ ret = snd_sof_init_trace(sdev);
+ if (ret < 0) {
+ /* non fatal */
+ dev_warn(sdev->dev,
+ "warning: failed to initialize trace %d\n",
+ ret);
+ }
+ } else {
+ dev_dbg(sdev->dev, "SOF firmware trace disabled\n");
+ }
+
+ return 0;
+
+fw_run_err:
+ snd_sof_fw_unload(sdev);
+
+ return ret;
+}
+
static int sof_probe_continue(struct snd_sof_dev *sdev)
{
struct snd_sof_pdata *plat_data = sdev->pdata;
@@ -181,42 +228,9 @@ static int sof_probe_continue(struct snd_sof_dev *sdev)
goto ipc_err;
}
- /* load the firmware */
- ret = snd_sof_load_firmware(sdev);
- if (ret < 0) {
- dev_err(sdev->dev, "error: failed to load DSP firmware %d\n",
- ret);
+ ret = sof_load_and_run_firmware(sdev);
+ if (ret < 0)
goto fw_load_err;
- }
-
- sdev->fw_state = SOF_FW_BOOT_IN_PROGRESS;
-
- /*
- * Boot the firmware. The FW boot status will be modified
- * in snd_sof_run_firmware() depending on the outcome.
- */
- ret = snd_sof_run_firmware(sdev);
- if (ret < 0) {
- dev_err(sdev->dev, "error: failed to boot DSP firmware %d\n",
- ret);
- goto fw_run_err;
- }
-
- if (IS_ENABLED(CONFIG_SND_SOC_SOF_DEBUG_ENABLE_FIRMWARE_TRACE) ||
- (sof_core_debug & SOF_DBG_ENABLE_TRACE)) {
- sdev->dtrace_is_supported = true;
-
- /* init DMA trace */
- ret = snd_sof_init_trace(sdev);
- if (ret < 0) {
- /* non fatal */
- dev_warn(sdev->dev,
- "warning: failed to initialize trace %d\n",
- ret);
- }
- } else {
- dev_dbg(sdev->dev, "SOF firmware trace disabled\n");
- }
/* hereafter all FW boot flows are for PM reasons */
sdev->first_boot = false;
@@ -250,7 +264,6 @@ static int sof_probe_continue(struct snd_sof_dev *sdev)
fw_trace_err:
snd_sof_free_trace(sdev);
-fw_run_err:
snd_sof_fw_unload(sdev);
fw_load_err:
snd_sof_ipc_free(sdev);
In the VirtIO guest case the SOF will not be dealing with the firmware directly. Extract related functionality into a function to make the separation easier. Signed-off-by: Guennadi Liakhovetski <guennadi.liakhovetski@linux.intel.com> --- sound/soc/sof/core.c | 85 ++++++++++++++++++++++++++++++---------------------- 1 file changed, 49 insertions(+), 36 deletions(-)