diff --git a/sound/soc/sof/sof-client-ipc-flood-test.c b/sound/soc/sof/sof-client-ipc-flood-test.c index 373f3a125372..7b72d1c9c739 100644 --- a/sound/soc/sof/sof-client-ipc-flood-test.c +++ b/sound/soc/sof/sof-client-ipc-flood-test.c @@ -219,9 +219,10 @@ static ssize_t sof_ipc_flood_dfs_write(struct file *file, const char __user *buf goto out; } - /* flood test */ - ret = sof_debug_ipc_flood_test(cdev, flood_duration_test, - ipc_duration_ms, ipc_count); + ret = sof_client_boot_dsp(cdev); + if (!ret) + ret = sof_debug_ipc_flood_test(cdev, flood_duration_test, + ipc_duration_ms, ipc_count); err = pm_runtime_put_autosuspend(dev); if (err < 0) diff --git a/sound/soc/sof/sof-client-ipc-kernel-injector.c b/sound/soc/sof/sof-client-ipc-kernel-injector.c index 249bd2d6c8d2..d5984990098a 100644 --- a/sound/soc/sof/sof-client-ipc-kernel-injector.c +++ b/sound/soc/sof/sof-client-ipc-kernel-injector.c @@ -63,7 +63,9 @@ static ssize_t sof_kernel_msg_inject_dfs_write(struct file *file, const char __u return ret; } - sof_client_ipc_rx_message(cdev, hdr, priv->kernel_buffer); + ret = sof_client_boot_dsp(cdev); + if (!ret) + sof_client_ipc_rx_message(cdev, hdr, priv->kernel_buffer); ret = pm_runtime_put_autosuspend(dev); if (ret < 0) diff --git a/sound/soc/sof/sof-client-ipc-msg-injector.c b/sound/soc/sof/sof-client-ipc-msg-injector.c index 9c8a0fbfb8df..c28f106de6ba 100644 --- a/sound/soc/sof/sof-client-ipc-msg-injector.c +++ b/sound/soc/sof/sof-client-ipc-msg-injector.c @@ -131,11 +131,15 @@ static int sof_msg_inject_send_message(struct sof_client_dev *cdev) return ret; } - /* send the message */ - ret = sof_client_ipc_tx_message(cdev, priv->tx_buffer, priv->rx_buffer, - priv->max_msg_size); - if (ret) - dev_err(dev, "IPC message send failed: %d\n", ret); + ret = sof_client_boot_dsp(cdev); + if (!ret) { + /* send the message */ + ret = sof_client_ipc_tx_message(cdev, priv->tx_buffer, + priv->rx_buffer, + priv->max_msg_size); + if (ret) + dev_err(dev, "IPC message send failed: %d\n", ret); + } err = pm_runtime_put_autosuspend(dev); if (err < 0) diff --git a/sound/soc/sof/sof-client-probes.c b/sound/soc/sof/sof-client-probes.c index f753e0faff99..124f55508159 100644 --- a/sound/soc/sof/sof-client-probes.c +++ b/sound/soc/sof/sof-client-probes.c @@ -123,6 +123,10 @@ static int sof_probes_compr_set_params(struct snd_compr_stream *cstream, if (ret) return ret; + ret = sof_client_boot_dsp(cdev); + if (ret) + return ret; + ret = ipc->init(cdev, priv->extractor_stream_tag, rtd->dma_bytes); if (ret < 0) { dev_err(dai->dev, "Failed to init probe: %d\n", ret); @@ -224,6 +228,10 @@ static ssize_t sof_probes_dfs_points_read(struct file *file, char __user *to, goto exit; } + ret = sof_client_boot_dsp(cdev); + if (ret) + goto pm_error; + ret = ipc->points_info(cdev, &desc, &num_desc, type); if (ret < 0) goto pm_error; @@ -312,9 +320,12 @@ sof_probes_dfs_points_write(struct file *file, const char __user *from, goto exit; } - ret = ipc->points_add(cdev, desc, bytes / sizeof(*desc)); - if (!ret) - ret = count; + ret = sof_client_boot_dsp(cdev); + if (!ret) { + ret = ipc->points_add(cdev, desc, bytes / sizeof(*desc)); + if (!ret) + ret = count; + } err = pm_runtime_put_autosuspend(dev); if (err < 0) @@ -367,9 +378,12 @@ sof_probes_dfs_points_remove_write(struct file *file, const char __user *from, goto exit; } - ret = ipc->points_remove(cdev, &array[1], array[0]); - if (!ret) - ret = count; + ret = sof_client_boot_dsp(cdev); + if (!ret) { + ret = ipc->points_remove(cdev, &array[1], array[0]); + if (!ret) + ret = count; + } err = pm_runtime_put_autosuspend(dev); if (err < 0) diff --git a/sound/soc/sof/sof-client.c b/sound/soc/sof/sof-client.c index 2dbfc7699c73..b0802484a2d3 100644 --- a/sound/soc/sof/sof-client.c +++ b/sound/soc/sof/sof-client.c @@ -486,6 +486,12 @@ enum sof_ipc_type sof_client_get_ipc_type(struct sof_client_dev *cdev) } EXPORT_SYMBOL_NS_GPL(sof_client_get_ipc_type, "SND_SOC_SOF_CLIENT"); +int sof_client_boot_dsp(struct sof_client_dev *cdev) +{ + return snd_sof_boot_dsp_firmware(sof_client_dev_to_sof_dev(cdev)); +} +EXPORT_SYMBOL_NS_GPL(sof_client_boot_dsp, "SND_SOC_SOF_CLIENT"); + /* module refcount management of SOF core */ int sof_client_core_module_get(struct sof_client_dev *cdev) { diff --git a/sound/soc/sof/sof-client.h b/sound/soc/sof/sof-client.h index 1a9015e38474..3b02506c03f1 100644 --- a/sound/soc/sof/sof-client.h +++ b/sound/soc/sof/sof-client.h @@ -50,6 +50,9 @@ const struct sof_ipc_fw_version *sof_client_get_fw_version(struct sof_client_dev size_t sof_client_get_ipc_max_payload_size(struct sof_client_dev *cdev); enum sof_ipc_type sof_client_get_ipc_type(struct sof_client_dev *cdev); +/* DSP/firmware boot request */ +int sof_client_boot_dsp(struct sof_client_dev *cdev); + /* module refcount management of SOF core */ int sof_client_core_module_get(struct sof_client_dev *cdev); void sof_client_core_module_put(struct sof_client_dev *cdev);