ASoC: SOF: control: return true when kcontrol values change
All the kcontrol put() functions are currently returning 0 when successful. This does not go well with alsamixer as it does not seem to get notified on SND_CTL_EVENT_MASK_VALUE callbacks when values change for (some of) the sof kcontrols. This patch fixes that by returning true for volume, switch and enum type kcontrols when values do change in put(). Signed-off-by: Dragos Tarcatu <dragos_tarcatu@mentor.com> Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> Link: https://lore.kernel.org/r/20191018123806.18063-1-pierre-louis.bossart@linux.intel.com Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
parent
9b7a7f9216
commit
95a32c9805
|
@ -60,13 +60,16 @@ int snd_sof_volume_put(struct snd_kcontrol *kcontrol,
|
||||||
struct snd_sof_dev *sdev = scontrol->sdev;
|
struct snd_sof_dev *sdev = scontrol->sdev;
|
||||||
struct sof_ipc_ctrl_data *cdata = scontrol->control_data;
|
struct sof_ipc_ctrl_data *cdata = scontrol->control_data;
|
||||||
unsigned int i, channels = scontrol->num_channels;
|
unsigned int i, channels = scontrol->num_channels;
|
||||||
|
bool change = false;
|
||||||
|
u32 value;
|
||||||
|
|
||||||
/* update each channel */
|
/* update each channel */
|
||||||
for (i = 0; i < channels; i++) {
|
for (i = 0; i < channels; i++) {
|
||||||
cdata->chanv[i].value =
|
value = mixer_to_ipc(ucontrol->value.integer.value[i],
|
||||||
mixer_to_ipc(ucontrol->value.integer.value[i],
|
|
||||||
scontrol->volume_table, sm->max + 1);
|
scontrol->volume_table, sm->max + 1);
|
||||||
|
change = change || (value != cdata->chanv[i].value);
|
||||||
cdata->chanv[i].channel = i;
|
cdata->chanv[i].channel = i;
|
||||||
|
cdata->chanv[i].value = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* notify DSP of mixer updates */
|
/* notify DSP of mixer updates */
|
||||||
|
@ -76,8 +79,7 @@ int snd_sof_volume_put(struct snd_kcontrol *kcontrol,
|
||||||
SOF_CTRL_TYPE_VALUE_CHAN_GET,
|
SOF_CTRL_TYPE_VALUE_CHAN_GET,
|
||||||
SOF_CTRL_CMD_VOLUME,
|
SOF_CTRL_CMD_VOLUME,
|
||||||
true);
|
true);
|
||||||
|
return change;
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int snd_sof_switch_get(struct snd_kcontrol *kcontrol,
|
int snd_sof_switch_get(struct snd_kcontrol *kcontrol,
|
||||||
|
@ -105,11 +107,15 @@ int snd_sof_switch_put(struct snd_kcontrol *kcontrol,
|
||||||
struct snd_sof_dev *sdev = scontrol->sdev;
|
struct snd_sof_dev *sdev = scontrol->sdev;
|
||||||
struct sof_ipc_ctrl_data *cdata = scontrol->control_data;
|
struct sof_ipc_ctrl_data *cdata = scontrol->control_data;
|
||||||
unsigned int i, channels = scontrol->num_channels;
|
unsigned int i, channels = scontrol->num_channels;
|
||||||
|
bool change = false;
|
||||||
|
u32 value;
|
||||||
|
|
||||||
/* update each channel */
|
/* update each channel */
|
||||||
for (i = 0; i < channels; i++) {
|
for (i = 0; i < channels; i++) {
|
||||||
cdata->chanv[i].value = ucontrol->value.integer.value[i];
|
value = ucontrol->value.integer.value[i];
|
||||||
|
change = change || (value != cdata->chanv[i].value);
|
||||||
cdata->chanv[i].channel = i;
|
cdata->chanv[i].channel = i;
|
||||||
|
cdata->chanv[i].value = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* notify DSP of mixer updates */
|
/* notify DSP of mixer updates */
|
||||||
|
@ -120,7 +126,7 @@ int snd_sof_switch_put(struct snd_kcontrol *kcontrol,
|
||||||
SOF_CTRL_CMD_SWITCH,
|
SOF_CTRL_CMD_SWITCH,
|
||||||
true);
|
true);
|
||||||
|
|
||||||
return 0;
|
return change;
|
||||||
}
|
}
|
||||||
|
|
||||||
int snd_sof_enum_get(struct snd_kcontrol *kcontrol,
|
int snd_sof_enum_get(struct snd_kcontrol *kcontrol,
|
||||||
|
@ -148,11 +154,15 @@ int snd_sof_enum_put(struct snd_kcontrol *kcontrol,
|
||||||
struct snd_sof_dev *sdev = scontrol->sdev;
|
struct snd_sof_dev *sdev = scontrol->sdev;
|
||||||
struct sof_ipc_ctrl_data *cdata = scontrol->control_data;
|
struct sof_ipc_ctrl_data *cdata = scontrol->control_data;
|
||||||
unsigned int i, channels = scontrol->num_channels;
|
unsigned int i, channels = scontrol->num_channels;
|
||||||
|
bool change = false;
|
||||||
|
u32 value;
|
||||||
|
|
||||||
/* update each channel */
|
/* update each channel */
|
||||||
for (i = 0; i < channels; i++) {
|
for (i = 0; i < channels; i++) {
|
||||||
cdata->chanv[i].value = ucontrol->value.enumerated.item[i];
|
value = ucontrol->value.enumerated.item[i];
|
||||||
|
change = change || (value != cdata->chanv[i].value);
|
||||||
cdata->chanv[i].channel = i;
|
cdata->chanv[i].channel = i;
|
||||||
|
cdata->chanv[i].value = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* notify DSP of enum updates */
|
/* notify DSP of enum updates */
|
||||||
|
@ -163,7 +173,7 @@ int snd_sof_enum_put(struct snd_kcontrol *kcontrol,
|
||||||
SOF_CTRL_CMD_ENUM,
|
SOF_CTRL_CMD_ENUM,
|
||||||
true);
|
true);
|
||||||
|
|
||||||
return 0;
|
return change;
|
||||||
}
|
}
|
||||||
|
|
||||||
int snd_sof_bytes_get(struct snd_kcontrol *kcontrol,
|
int snd_sof_bytes_get(struct snd_kcontrol *kcontrol,
|
||||||
|
|
Loading…
Reference in New Issue