From: Cezary Rojewski Date: Mon, 17 Feb 2025 10:21:12 +0000 (+0100) Subject: ASoC: Intel: avs: Move to the new control operations X-Git-Tag: v6.15-rc1~173^2~4^2~87^2~3 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=4c32ebcc8650ce506632a32136993c85537fb01a;p=thirdparty%2Fkernel%2Flinux.git ASoC: Intel: avs: Move to the new control operations Allow for multi-channel volume controls to be utilized by an application by moving over to the new implementation. Drop all unused code in the process. Signed-off-by: Cezary Rojewski Link: https://patch.msgid.link/20250217102115.3539427-8-cezary.rojewski@intel.com Signed-off-by: Mark Brown --- diff --git a/sound/soc/intel/avs/control.c b/sound/soc/intel/avs/control.c index a1c7431cfe134..64283aa352810 100644 --- a/sound/soc/intel/avs/control.c +++ b/sound/soc/intel/avs/control.c @@ -48,75 +48,7 @@ static struct avs_path_module *avs_get_volume_module(struct avs_dev *adev, u32 i return NULL; } -int avs_control_volume_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) -{ - struct soc_mixer_control *mc = (struct soc_mixer_control *)kcontrol->private_value; - struct avs_control_data *ctl_data = (struct avs_control_data *)mc->dobj.private; - struct avs_dev *adev = avs_get_kcontrol_adev(kcontrol); - struct avs_volume_cfg *dspvols = NULL; - struct avs_path_module *active_module; - size_t num_dspvols; - int ret = 0; - - /* prevent access to modules while path is being constructed */ - mutex_lock(&adev->path_mutex); - - active_module = avs_get_volume_module(adev, ctl_data->id); - if (active_module) { - ret = avs_ipc_peakvol_get_volume(adev, active_module->module_id, - active_module->instance_id, &dspvols, - &num_dspvols); - if (!ret) - ucontrol->value.integer.value[0] = dspvols[0].target_volume; - - ret = AVS_IPC_RET(ret); - kfree(dspvols); - } else { - ucontrol->value.integer.value[0] = ctl_data->volume; - } - - mutex_unlock(&adev->path_mutex); - return ret; -} - -int avs_control_volume_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) -{ - struct soc_mixer_control *mc = (struct soc_mixer_control *)kcontrol->private_value; - struct avs_control_data *ctl_data = (struct avs_control_data *)mc->dobj.private; - struct avs_dev *adev = avs_get_kcontrol_adev(kcontrol); - long *volume = &ctl_data->volume; - struct avs_path_module *active_module; - struct avs_volume_cfg dspvol = {0}; - long ctlvol = ucontrol->value.integer.value[0]; - int ret = 0, changed = 0; - - if (ctlvol < 0 || ctlvol > mc->max) - return -EINVAL; - - /* prevent access to modules while path is being constructed */ - mutex_lock(&adev->path_mutex); - - if (*volume != ctlvol) { - *volume = ctlvol; - changed = 1; - } - - active_module = avs_get_volume_module(adev, ctl_data->id); - if (active_module) { - dspvol.channel_id = AVS_ALL_CHANNELS_MASK; - dspvol.target_volume = *volume; - - ret = avs_ipc_peakvol_set_volume(adev, active_module->module_id, - active_module->instance_id, &dspvol); - ret = AVS_IPC_RET(ret); - } - - mutex_unlock(&adev->path_mutex); - - return ret ? ret : changed; -} - -int avs_control_volume_get2(struct snd_kcontrol *kctl, struct snd_ctl_elem_value *uctl) +int avs_control_volume_get(struct snd_kcontrol *kctl, struct snd_ctl_elem_value *uctl) { struct soc_mixer_control *mc = (struct soc_mixer_control *)kctl->private_value; struct avs_control_data *ctl_data = mc->dobj.private; @@ -150,7 +82,7 @@ int avs_control_volume_get2(struct snd_kcontrol *kctl, struct snd_ctl_elem_value return 0; } -int avs_control_volume_put2(struct snd_kcontrol *kctl, struct snd_ctl_elem_value *uctl) +int avs_control_volume_put(struct snd_kcontrol *kctl, struct snd_ctl_elem_value *uctl) { struct avs_path_module *active_module; struct avs_control_data *ctl_data; diff --git a/sound/soc/intel/avs/control.h b/sound/soc/intel/avs/control.h index e16fa79962de8..66f3fe064e1d6 100644 --- a/sound/soc/intel/avs/control.h +++ b/sound/soc/intel/avs/control.h @@ -14,15 +14,11 @@ struct avs_control_data { u32 id; - - long volume; long values[SND_SOC_TPLG_MAX_CHAN]; }; -int avs_control_volume_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol); -int avs_control_volume_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol); -int avs_control_volume_get2(struct snd_kcontrol *kctl, struct snd_ctl_elem_value *uctl); -int avs_control_volume_put2(struct snd_kcontrol *kctl, struct snd_ctl_elem_value *uctl); +int avs_control_volume_get(struct snd_kcontrol *kctl, struct snd_ctl_elem_value *uctl); +int avs_control_volume_put(struct snd_kcontrol *kctl, struct snd_ctl_elem_value *uctl); int avs_control_volume_info(struct snd_kcontrol *kctl, struct snd_ctl_elem_info *uinfo); #endif diff --git a/sound/soc/intel/avs/path.c b/sound/soc/intel/avs/path.c index a72ebde7d0115..56a2916eec5e6 100644 --- a/sound/soc/intel/avs/path.c +++ b/sound/soc/intel/avs/path.c @@ -370,7 +370,7 @@ static int avs_peakvol_create(struct avs_dev *adev, struct avs_path_module *mod) ctl_data = avs_get_module_control(mod); if (ctl_data) - volume = ctl_data->volume; + volume = ctl_data->values[0]; /* As 2+ channels controls are unsupported, have a single block for all channels. */ cfg_size = struct_size(cfg, vols, 1); diff --git a/sound/soc/intel/avs/topology.c b/sound/soc/intel/avs/topology.c index 45952fbe9694b..ee70e3d0e8890 100644 --- a/sound/soc/intel/avs/topology.c +++ b/sound/soc/intel/avs/topology.c @@ -1912,6 +1912,7 @@ static const struct snd_soc_tplg_kcontrol_ops avs_control_ops[] = { .id = AVS_CONTROL_OPS_VOLUME, .get = avs_control_volume_get, .put = avs_control_volume_put, + .info = avs_control_volume_info, }, };