Commit 14a29565 authored by Oswald Buddenhagen's avatar Oswald Buddenhagen Committed by Takashi Iwai

ALSA: emu10k1: fix error handling in snd_audigy_i2c_volume_put()

Check all inputs before changing anything, and return the right error
code in case of failure.
Signed-off-by: default avatarOswald Buddenhagen <oswald.buddenhagen@gmx.de>
Link: https://lore.kernel.org/r/20230422161021.1144026-1-oswald.buddenhagen@gmx.deSigned-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent dad17303
...@@ -1006,7 +1006,7 @@ static int snd_audigy_i2c_volume_put(struct snd_kcontrol *kcontrol, ...@@ -1006,7 +1006,7 @@ static int snd_audigy_i2c_volume_put(struct snd_kcontrol *kcontrol,
{ {
struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol); struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
unsigned int ogain; unsigned int ogain;
unsigned int ngain; unsigned int ngain0, ngain1;
unsigned int source_id; unsigned int source_id;
int change = 0; int change = 0;
...@@ -1015,24 +1015,24 @@ static int snd_audigy_i2c_volume_put(struct snd_kcontrol *kcontrol, ...@@ -1015,24 +1015,24 @@ static int snd_audigy_i2c_volume_put(struct snd_kcontrol *kcontrol,
/* capture_source: uinfo->value.enumerated.items = 2 */ /* capture_source: uinfo->value.enumerated.items = 2 */
if (source_id >= 2) if (source_id >= 2)
return -EINVAL; return -EINVAL;
ngain0 = ucontrol->value.integer.value[0];
ngain1 = ucontrol->value.integer.value[1];
if (ngain0 > 0xff)
return -EINVAL;
if (ngain1 > 0xff)
return -EINVAL;
ogain = emu->i2c_capture_volume[source_id][0]; /* Left */ ogain = emu->i2c_capture_volume[source_id][0]; /* Left */
ngain = ucontrol->value.integer.value[0]; if (ogain != ngain0) {
if (ngain > 0xff)
return 0;
if (ogain != ngain) {
if (emu->i2c_capture_source == source_id) if (emu->i2c_capture_source == source_id)
snd_emu10k1_i2c_write(emu, ADC_ATTEN_ADCL, ((ngain) & 0xff) ); snd_emu10k1_i2c_write(emu, ADC_ATTEN_ADCL, ngain0);
emu->i2c_capture_volume[source_id][0] = ngain; emu->i2c_capture_volume[source_id][0] = ngain0;
change = 1; change = 1;
} }
ogain = emu->i2c_capture_volume[source_id][1]; /* Right */ ogain = emu->i2c_capture_volume[source_id][1]; /* Right */
ngain = ucontrol->value.integer.value[1]; if (ogain != ngain1) {
if (ngain > 0xff)
return 0;
if (ogain != ngain) {
if (emu->i2c_capture_source == source_id) if (emu->i2c_capture_source == source_id)
snd_emu10k1_i2c_write(emu, ADC_ATTEN_ADCR, ((ngain) & 0xff)); snd_emu10k1_i2c_write(emu, ADC_ATTEN_ADCR, ngain1);
emu->i2c_capture_volume[source_id][1] = ngain; emu->i2c_capture_volume[source_id][1] = ngain1;
change = 1; change = 1;
} }
......
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