mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-07 23:20:32 -04:00
ASoC: Intel: avs: Move DSP-boot steps into individual functions
To make DSP-boot code more readable, move each logical step into an individual function and add the configure step which will be utilized by follow up changes. To summarize, the steps are: loading the firmware code, configuring the base firmware and, allocating driver resources based on FW and HW capabilities. Signed-off-by: Cezary Rojewski <cezary.rojewski@intel.com> Link: https://patch.msgid.link/20250203141051.2361323-7-cezary.rojewski@intel.com Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
committed by
Mark Brown
parent
b9fb91692a
commit
e995c51903
@@ -51,6 +51,7 @@ struct avs_dsp_ops {
|
||||
int (* const load_basefw)(struct avs_dev *, struct firmware *);
|
||||
int (* const load_lib)(struct avs_dev *, struct firmware *, u32);
|
||||
int (* const transfer_mods)(struct avs_dev *, bool, struct avs_module_entry *, u32);
|
||||
int (* const config_basefw)(struct avs_dev *);
|
||||
int (* const enable_logs)(struct avs_dev *, enum avs_log_enable, u32, u32, unsigned long,
|
||||
u32 *);
|
||||
int (* const log_buffer_offset)(struct avs_dev *, u32);
|
||||
|
||||
@@ -603,7 +603,7 @@ static int avs_dsp_load_basefw(struct avs_dev *adev)
|
||||
return ret;
|
||||
}
|
||||
|
||||
int avs_dsp_boot_firmware(struct avs_dev *adev, bool purge)
|
||||
static int avs_load_firmware(struct avs_dev *adev, bool purge)
|
||||
{
|
||||
struct avs_soc_component *acomp;
|
||||
int ret, i;
|
||||
@@ -657,29 +657,34 @@ int avs_dsp_boot_firmware(struct avs_dev *adev, bool purge)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int avs_dsp_first_boot_firmware(struct avs_dev *adev)
|
||||
static int avs_config_basefw(struct avs_dev *adev)
|
||||
{
|
||||
int ret;
|
||||
|
||||
if (adev->spec->dsp_ops->config_basefw) {
|
||||
ret = avs_dsp_op(adev, config_basefw);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int avs_dsp_boot_firmware(struct avs_dev *adev, bool purge)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = avs_load_firmware(adev, purge);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
return avs_config_basefw(adev);
|
||||
}
|
||||
|
||||
static int avs_dsp_alloc_resources(struct avs_dev *adev)
|
||||
{
|
||||
int ret, i;
|
||||
|
||||
if (avs_platattr_test(adev, CLDMA)) {
|
||||
ret = hda_cldma_init(&code_loader, &adev->base.core,
|
||||
adev->dsp_ba, AVS_CL_DEFAULT_BUFFER_SIZE);
|
||||
if (ret < 0) {
|
||||
dev_err(adev->dev, "cldma init failed: %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
ret = avs_dsp_core_disable(adev, AVS_MAIN_CORE_MASK);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
ret = avs_dsp_boot_firmware(adev, true);
|
||||
if (ret < 0) {
|
||||
dev_err(adev->dev, "firmware boot failed: %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = avs_ipc_get_hw_config(adev, &adev->hw_cfg);
|
||||
if (ret)
|
||||
return AVS_IPC_RET(ret);
|
||||
@@ -705,6 +710,31 @@ int avs_dsp_first_boot_firmware(struct avs_dev *adev)
|
||||
strscpy(adev->lib_names[0], "BASEFW", AVS_LIB_NAME_SIZE);
|
||||
|
||||
ida_init(&adev->ppl_ida);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int avs_dsp_first_boot_firmware(struct avs_dev *adev)
|
||||
{
|
||||
int ret;
|
||||
|
||||
if (avs_platattr_test(adev, CLDMA)) {
|
||||
ret = hda_cldma_init(&code_loader, &adev->base.core,
|
||||
adev->dsp_ba, AVS_CL_DEFAULT_BUFFER_SIZE);
|
||||
if (ret < 0) {
|
||||
dev_err(adev->dev, "cldma init failed: %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
ret = avs_dsp_core_disable(adev, AVS_MAIN_CORE_MASK);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
ret = avs_dsp_boot_firmware(adev, true);
|
||||
if (ret < 0) {
|
||||
dev_err(adev->dev, "firmware boot failed: %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
return avs_dsp_alloc_resources(adev);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user