Commit 240ca955 authored by Mark Brown's avatar Mark Brown

ASoC: Intel: Fixes

Merge series from Amadeusz Sławiński <amadeuszx.slawinski@linux.intel.com>:

Series of fixes for issues found during development and testing,
primarly for avs driver.
parents 3a2e3fa7 25148f57
...@@ -170,6 +170,7 @@ struct snd_soc_acpi_link_adr { ...@@ -170,6 +170,7 @@ struct snd_soc_acpi_link_adr {
/* Descriptor for SST ASoC machine driver */ /* Descriptor for SST ASoC machine driver */
struct snd_soc_acpi_mach { struct snd_soc_acpi_mach {
u8 id[ACPI_ID_LEN]; u8 id[ACPI_ID_LEN];
const char *uid;
const struct snd_soc_acpi_codecs *comp_ids; const struct snd_soc_acpi_codecs *comp_ids;
const u32 link_mask; const u32 link_mask;
const struct snd_soc_acpi_link_adr *links; const struct snd_soc_acpi_link_adr *links;
......
...@@ -66,7 +66,8 @@ enum skl_ch_cfg { ...@@ -66,7 +66,8 @@ enum skl_ch_cfg {
SKL_CH_CFG_DUAL_MONO = 9, SKL_CH_CFG_DUAL_MONO = 9,
SKL_CH_CFG_I2S_DUAL_STEREO_0 = 10, SKL_CH_CFG_I2S_DUAL_STEREO_0 = 10,
SKL_CH_CFG_I2S_DUAL_STEREO_1 = 11, SKL_CH_CFG_I2S_DUAL_STEREO_1 = 11,
SKL_CH_CFG_4_CHANNEL = 12, SKL_CH_CFG_7_1 = 12,
SKL_CH_CFG_4_CHANNEL = SKL_CH_CFG_7_1,
SKL_CH_CFG_INVALID SKL_CH_CFG_INVALID
}; };
......
...@@ -169,6 +169,7 @@ static bool apl_lp_streaming(struct avs_dev *adev) ...@@ -169,6 +169,7 @@ static bool apl_lp_streaming(struct avs_dev *adev)
{ {
struct avs_path *path; struct avs_path *path;
spin_lock(&adev->path_list_lock);
/* Any gateway without buffer allocated in LP area disqualifies D0IX. */ /* Any gateway without buffer allocated in LP area disqualifies D0IX. */
list_for_each_entry(path, &adev->path_list, node) { list_for_each_entry(path, &adev->path_list, node) {
struct avs_path_pipeline *ppl; struct avs_path_pipeline *ppl;
...@@ -188,11 +189,14 @@ static bool apl_lp_streaming(struct avs_dev *adev) ...@@ -188,11 +189,14 @@ static bool apl_lp_streaming(struct avs_dev *adev)
if (cfg->copier.dma_type == INVALID_OBJECT_ID) if (cfg->copier.dma_type == INVALID_OBJECT_ID)
continue; continue;
if (!mod->gtw_attrs.lp_buffer_alloc) if (!mod->gtw_attrs.lp_buffer_alloc) {
spin_unlock(&adev->path_list_lock);
return false; return false;
}
} }
} }
} }
spin_unlock(&adev->path_list_lock);
return true; return true;
} }
......
...@@ -283,8 +283,8 @@ void avs_release_firmwares(struct avs_dev *adev); ...@@ -283,8 +283,8 @@ void avs_release_firmwares(struct avs_dev *adev);
int avs_dsp_init_module(struct avs_dev *adev, u16 module_id, u8 ppl_instance_id, int avs_dsp_init_module(struct avs_dev *adev, u16 module_id, u8 ppl_instance_id,
u8 core_id, u8 domain, void *param, u32 param_size, u8 core_id, u8 domain, void *param, u32 param_size,
u16 *instance_id); u8 *instance_id);
void avs_dsp_delete_module(struct avs_dev *adev, u16 module_id, u16 instance_id, void avs_dsp_delete_module(struct avs_dev *adev, u16 module_id, u8 instance_id,
u8 ppl_instance_id, u8 core_id); u8 ppl_instance_id, u8 core_id);
int avs_dsp_create_pipeline(struct avs_dev *adev, u16 req_size, u8 priority, int avs_dsp_create_pipeline(struct avs_dev *adev, u16 req_size, u8 priority,
bool lp, u16 attributes, u8 *instance_id); bool lp, u16 attributes, u8 *instance_id);
......
...@@ -443,7 +443,7 @@ static int avs_register_i2s_boards(struct avs_dev *adev) ...@@ -443,7 +443,7 @@ static int avs_register_i2s_boards(struct avs_dev *adev)
} }
for (mach = boards->machs; mach->id[0]; mach++) { for (mach = boards->machs; mach->id[0]; mach++) {
if (!acpi_dev_present(mach->id, NULL, -1)) if (!acpi_dev_present(mach->id, mach->uid, -1))
continue; continue;
if (mach->machine_quirk) if (mach->machine_quirk)
......
...@@ -21,17 +21,25 @@ static struct avs_dev *avs_get_kcontrol_adev(struct snd_kcontrol *kcontrol) ...@@ -21,17 +21,25 @@ static struct avs_dev *avs_get_kcontrol_adev(struct snd_kcontrol *kcontrol)
return to_avs_dev(w->dapm->component->dev); return to_avs_dev(w->dapm->component->dev);
} }
static struct avs_path_module *avs_get_kcontrol_module(struct avs_dev *adev, u32 id) static struct avs_path_module *avs_get_volume_module(struct avs_dev *adev, u32 id)
{ {
struct avs_path *path; struct avs_path *path;
struct avs_path_pipeline *ppl; struct avs_path_pipeline *ppl;
struct avs_path_module *mod; struct avs_path_module *mod;
list_for_each_entry(path, &adev->path_list, node) spin_lock(&adev->path_list_lock);
list_for_each_entry(ppl, &path->ppl_list, node) list_for_each_entry(path, &adev->path_list, node) {
list_for_each_entry(mod, &ppl->mod_list, node) list_for_each_entry(ppl, &path->ppl_list, node) {
if (mod->template->ctl_id && mod->template->ctl_id == id) list_for_each_entry(mod, &ppl->mod_list, node) {
if (guid_equal(&mod->template->cfg_ext->type, &AVS_PEAKVOL_MOD_UUID)
&& mod->template->ctl_id == id) {
spin_unlock(&adev->path_list_lock);
return mod; return mod;
}
}
}
}
spin_unlock(&adev->path_list_lock);
return NULL; return NULL;
} }
...@@ -49,7 +57,7 @@ int avs_control_volume_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_va ...@@ -49,7 +57,7 @@ int avs_control_volume_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_va
/* prevent access to modules while path is being constructed */ /* prevent access to modules while path is being constructed */
mutex_lock(&adev->path_mutex); mutex_lock(&adev->path_mutex);
active_module = avs_get_kcontrol_module(adev, ctl_data->id); active_module = avs_get_volume_module(adev, ctl_data->id);
if (active_module) { if (active_module) {
ret = avs_ipc_peakvol_get_volume(adev, active_module->module_id, ret = avs_ipc_peakvol_get_volume(adev, active_module->module_id,
active_module->instance_id, &dspvols, active_module->instance_id, &dspvols,
...@@ -89,7 +97,7 @@ int avs_control_volume_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_va ...@@ -89,7 +97,7 @@ int avs_control_volume_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_va
changed = 1; changed = 1;
} }
active_module = avs_get_kcontrol_module(adev, ctl_data->id); active_module = avs_get_volume_module(adev, ctl_data->id);
if (active_module) { if (active_module) {
dspvol.channel_id = AVS_ALL_CHANNELS_MASK; dspvol.channel_id = AVS_ALL_CHANNELS_MASK;
dspvol.target_volume = *volume; dspvol.target_volume = *volume;
......
...@@ -225,7 +225,7 @@ static int avs_dsp_put_core(struct avs_dev *adev, u32 core_id) ...@@ -225,7 +225,7 @@ static int avs_dsp_put_core(struct avs_dev *adev, u32 core_id)
int avs_dsp_init_module(struct avs_dev *adev, u16 module_id, u8 ppl_instance_id, int avs_dsp_init_module(struct avs_dev *adev, u16 module_id, u8 ppl_instance_id,
u8 core_id, u8 domain, void *param, u32 param_size, u8 core_id, u8 domain, void *param, u32 param_size,
u16 *instance_id) u8 *instance_id)
{ {
struct avs_module_entry mentry; struct avs_module_entry mentry;
bool was_loaded = false; bool was_loaded = false;
...@@ -272,7 +272,7 @@ int avs_dsp_init_module(struct avs_dev *adev, u16 module_id, u8 ppl_instance_id, ...@@ -272,7 +272,7 @@ int avs_dsp_init_module(struct avs_dev *adev, u16 module_id, u8 ppl_instance_id,
return ret; return ret;
} }
void avs_dsp_delete_module(struct avs_dev *adev, u16 module_id, u16 instance_id, void avs_dsp_delete_module(struct avs_dev *adev, u16 module_id, u8 instance_id,
u8 ppl_instance_id, u8 core_id) u8 ppl_instance_id, u8 core_id)
{ {
struct avs_module_entry mentry; struct avs_module_entry mentry;
......
...@@ -619,7 +619,7 @@ enum avs_channel_config { ...@@ -619,7 +619,7 @@ enum avs_channel_config {
AVS_CHANNEL_CONFIG_DUAL_MONO = 9, AVS_CHANNEL_CONFIG_DUAL_MONO = 9,
AVS_CHANNEL_CONFIG_I2S_DUAL_STEREO_0 = 10, AVS_CHANNEL_CONFIG_I2S_DUAL_STEREO_0 = 10,
AVS_CHANNEL_CONFIG_I2S_DUAL_STEREO_1 = 11, AVS_CHANNEL_CONFIG_I2S_DUAL_STEREO_1 = 11,
AVS_CHANNEL_CONFIG_4_CHANNEL = 12, AVS_CHANNEL_CONFIG_7_1 = 12,
AVS_CHANNEL_CONFIG_INVALID AVS_CHANNEL_CONFIG_INVALID
}; };
......
...@@ -37,7 +37,7 @@ struct avs_path_pipeline { ...@@ -37,7 +37,7 @@ struct avs_path_pipeline {
struct avs_path_module { struct avs_path_module {
u16 module_id; u16 module_id;
u16 instance_id; u8 instance_id;
union avs_gtw_attributes gtw_attrs; union avs_gtw_attributes gtw_attrs;
struct avs_tplg_module *template; struct avs_tplg_module *template;
......
...@@ -468,21 +468,34 @@ static int avs_dai_fe_startup(struct snd_pcm_substream *substream, struct snd_so ...@@ -468,21 +468,34 @@ static int avs_dai_fe_startup(struct snd_pcm_substream *substream, struct snd_so
host_stream = snd_hdac_ext_stream_assign(bus, substream, HDAC_EXT_STREAM_TYPE_HOST); host_stream = snd_hdac_ext_stream_assign(bus, substream, HDAC_EXT_STREAM_TYPE_HOST);
if (!host_stream) { if (!host_stream) {
kfree(data); ret = -EBUSY;
return -EBUSY; goto err;
} }
data->host_stream = host_stream; data->host_stream = host_stream;
snd_pcm_hw_constraint_integer(runtime, SNDRV_PCM_HW_PARAM_PERIODS); ret = snd_pcm_hw_constraint_integer(runtime, SNDRV_PCM_HW_PARAM_PERIODS);
if (ret < 0)
goto err;
/* avoid wrap-around with wall-clock */ /* avoid wrap-around with wall-clock */
snd_pcm_hw_constraint_minmax(runtime, SNDRV_PCM_HW_PARAM_BUFFER_TIME, 20, 178000000); ret = snd_pcm_hw_constraint_minmax(runtime, SNDRV_PCM_HW_PARAM_BUFFER_TIME, 20, 178000000);
snd_pcm_hw_constraint_list(runtime, 0, SNDRV_PCM_HW_PARAM_RATE, &hw_rates); if (ret < 0)
goto err;
ret = snd_pcm_hw_constraint_list(runtime, 0, SNDRV_PCM_HW_PARAM_RATE, &hw_rates);
if (ret < 0)
goto err;
snd_pcm_set_sync(substream); snd_pcm_set_sync(substream);
dev_dbg(dai->dev, "%s fe STARTUP tag %d str %p", dev_dbg(dai->dev, "%s fe STARTUP tag %d str %p",
__func__, hdac_stream(host_stream)->stream_tag, substream); __func__, hdac_stream(host_stream)->stream_tag, substream);
return 0; return 0;
err:
kfree(data);
return ret;
} }
static void avs_dai_fe_shutdown(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) static void avs_dai_fe_shutdown(struct snd_pcm_substream *substream, struct snd_soc_dai *dai)
......
...@@ -18,7 +18,7 @@ static int avs_dsp_init_probe(struct avs_dev *adev, union avs_connector_node_id ...@@ -18,7 +18,7 @@ static int avs_dsp_init_probe(struct avs_dev *adev, union avs_connector_node_id
{ {
struct avs_probe_cfg cfg = {{0}}; struct avs_probe_cfg cfg = {{0}};
struct avs_module_entry mentry; struct avs_module_entry mentry;
u16 dummy; u8 dummy;
avs_get_module_entry(adev, &AVS_PROBE_MOD_UUID, &mentry); avs_get_module_entry(adev, &AVS_PROBE_MOD_UUID, &mentry);
......
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