diff mbox series

[07/10] ASoC: Intel: avs: Move to the new control operations

Message ID 20250217102115.3539427-8-cezary.rojewski@intel.com (mailing list archive)
State New
Headers show
Series ASoC: Intel: avs: Mute and multi-channel controls support | expand

Commit Message

Cezary Rojewski Feb. 17, 2025, 10:21 a.m. UTC
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 <cezary.rojewski@intel.com>
---
 sound/soc/intel/avs/control.c  | 72 +---------------------------------
 sound/soc/intel/avs/control.h  |  8 +---
 sound/soc/intel/avs/path.c     |  2 +-
 sound/soc/intel/avs/topology.c |  1 +
 4 files changed, 6 insertions(+), 77 deletions(-)
diff mbox series

Patch

diff --git a/sound/soc/intel/avs/control.c b/sound/soc/intel/avs/control.c
index a1c7431cfe13..64283aa35281 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 e16fa79962de..66f3fe064e1d 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 a72ebde7d011..56a2916eec5e 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 45952fbe9694..ee70e3d0e889 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,
 	},
 };