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:
Dragos Tarcatu 2019-10-18 07:38:06 -05:00 коммит произвёл Mark Brown
Родитель 9b7a7f9216
Коммит 95a32c9805
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 24D68B725D5487D0
1 изменённых файлов: 18 добавлений и 8 удалений

Просмотреть файл

@ -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,