Skip to content

Commit

Permalink
[ALSA] ice1724 - Check value ranges in ctl callbacks
Browse files Browse the repository at this point in the history
Check the value ranges in ctl put callbacks properly.
Also fixed the wrong access type to enum elements in aureon.c.

Signed-off-by: Takashi Iwai <tiwai@suse.de>
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
  • Loading branch information
Takashi Iwai authored and Jaroslav Kysela committed Jan 31, 2008
1 parent 68ea7b2 commit 9cd17cd
Show file tree
Hide file tree
Showing 4 changed files with 43 additions and 25 deletions.
33 changes: 21 additions & 12 deletions sound/pci/ice1712/aureon.c
Original file line number Diff line number Diff line change
Expand Up @@ -205,7 +205,7 @@ static int aureon_universe_inmux_get(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_value *ucontrol)
{
struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol);
ucontrol->value.integer.value[0] = ice->spec.aureon.pca9554_out;
ucontrol->value.enumerated.item[0] = ice->spec.aureon.pca9554_out;
return 0;
}

Expand All @@ -216,10 +216,11 @@ static int aureon_universe_inmux_put(struct snd_kcontrol *kcontrol,
unsigned char oval, nval;
int change;

nval = ucontrol->value.enumerated.item[0];
if (nval >= 3)
return -EINVAL;
snd_ice1712_save_gpio_status(ice);

oval = ice->spec.aureon.pca9554_out;
nval = ucontrol->value.integer.value[0];
if ((change = (oval != nval))) {
aureon_pca9554_write(ice, PCA9554_OUT, nval);
ice->spec.aureon.pca9554_out = nval;
Expand Down Expand Up @@ -757,10 +758,13 @@ static int wm_master_vol_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_

snd_ice1712_save_gpio_status(ice);
for (ch = 0; ch < 2; ch++) {
if (ucontrol->value.integer.value[ch] != ice->spec.aureon.master[ch]) {
unsigned int vol = ucontrol->value.integer.value[ch];
if (vol > WM_VOL_MAX)
continue;
vol |= ice->spec.aureon.master[ch] & WM_VOL_MUTE;
if (vol != ice->spec.aureon.master[ch]) {
int dac;
ice->spec.aureon.master[ch] &= WM_VOL_MUTE;
ice->spec.aureon.master[ch] |= ucontrol->value.integer.value[ch];
ice->spec.aureon.master[ch] = vol;
for (dac = 0; dac < ice->num_total_dacs; dac += 2)
wm_set_vol(ice, WM_DAC_ATTEN + dac + ch,
ice->spec.aureon.vol[dac + ch],
Expand Down Expand Up @@ -807,10 +811,13 @@ static int wm_vol_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *
ofs = kcontrol->private_value & 0xff;
snd_ice1712_save_gpio_status(ice);
for (i = 0; i < voices; i++) {
idx = WM_DAC_ATTEN + ofs + i;
if (ucontrol->value.integer.value[i] != ice->spec.aureon.vol[ofs+i]) {
ice->spec.aureon.vol[ofs+i] &= WM_VOL_MUTE;
ice->spec.aureon.vol[ofs+i] |= ucontrol->value.integer.value[i];
unsigned int vol = ucontrol->value.integer.value[i];
if (vol > 0x7f)
continue;
vol |= ice->spec.aureon.vol[ofs+i];
if (vol != ice->spec.aureon.vol[ofs+i]) {
ice->spec.aureon.vol[ofs+i] = vol;
idx = WM_DAC_ATTEN + ofs + i;
wm_set_vol(ice, idx, ice->spec.aureon.vol[ofs+i],
ice->spec.aureon.master[i]);
change = 1;
Expand Down Expand Up @@ -940,8 +947,10 @@ static int wm_pcm_vol_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_val
unsigned short ovol, nvol;
int change = 0;

snd_ice1712_save_gpio_status(ice);
nvol = ucontrol->value.integer.value[0];
if (nvol > PCM_RES)
return -EINVAL;
snd_ice1712_save_gpio_status(ice);
nvol = (nvol ? (nvol + PCM_MIN) : 0) & 0xff;
ovol = wm_get(ice, WM_DAC_DIG_MASTER_ATTEN) & 0xff;
if (ovol != nvol) {
Expand Down Expand Up @@ -1031,7 +1040,7 @@ static int wm_adc_vol_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_val
snd_ice1712_save_gpio_status(ice);
for (i = 0; i < 2; i++) {
idx = WM_ADC_GAIN + i;
nvol = ucontrol->value.integer.value[i];
nvol = ucontrol->value.integer.value[i] & 0x1f;
ovol = wm_get(ice, idx);
if ((ovol & 0x1f) != nvol) {
wm_put(ice, idx, nvol | (ovol & ~0x1f));
Expand Down
25 changes: 17 additions & 8 deletions sound/pci/ice1712/phase.c
Original file line number Diff line number Diff line change
Expand Up @@ -326,10 +326,13 @@ static int wm_master_vol_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_

snd_ice1712_save_gpio_status(ice);
for (ch = 0; ch < 2; ch++) {
if (ucontrol->value.integer.value[ch] != ice->spec.phase28.master[ch]) {
unsigned int vol = ucontrol->value.integer.value[ch];
if (vol > WM_VOL_MAX)
continue;
vol |= ice->spec.phase28.master[ch] & WM_VOL_MUTE;
if (vol != ice->spec.phase28.master[ch]) {
int dac;
ice->spec.phase28.master[ch] &= WM_VOL_MUTE;
ice->spec.phase28.master[ch] |= ucontrol->value.integer.value[ch];
ice->spec.phase28.master[ch] = vol;
for (dac = 0; dac < ice->num_total_dacs; dac += 2)
wm_set_vol(ice, WM_DAC_ATTEN + dac + ch,
ice->spec.phase28.vol[dac + ch],
Expand Down Expand Up @@ -462,10 +465,14 @@ static int wm_vol_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *
ofs = kcontrol->private_value & 0xff;
snd_ice1712_save_gpio_status(ice);
for (i = 0; i < voices; i++) {
idx = WM_DAC_ATTEN + ofs + i;
if (ucontrol->value.integer.value[i] != ice->spec.phase28.vol[ofs+i]) {
ice->spec.phase28.vol[ofs+i] &= WM_VOL_MUTE;
ice->spec.phase28.vol[ofs+i] |= ucontrol->value.integer.value[i];
unsigned int vol;
vol = ucontrol->value.integer.value[i];
if (vol > 0x7f)
continue;
vol |= ice->spec.phase28.vol[ofs+i] & WM_VOL_MUTE;
if (vol != ice->spec.phase28.vol[ofs+i]) {
ice->spec.phase28.vol[ofs+i] = vol;
idx = WM_DAC_ATTEN + ofs + i;
wm_set_vol(ice, idx, ice->spec.phase28.vol[ofs+i],
ice->spec.phase28.master[i]);
change = 1;
Expand Down Expand Up @@ -595,8 +602,10 @@ static int wm_pcm_vol_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_val
unsigned short ovol, nvol;
int change = 0;

snd_ice1712_save_gpio_status(ice);
nvol = ucontrol->value.integer.value[0];
if (nvol > PCM_RES)
return -EINVAL;
snd_ice1712_save_gpio_status(ice);
nvol = (nvol ? (nvol + PCM_MIN) : 0) & 0xff;
ovol = wm_get(ice, WM_DAC_DIG_MASTER_ATTEN) & 0xff;
if (ovol != nvol) {
Expand Down
2 changes: 1 addition & 1 deletion sound/pci/ice1712/prodigy192.c
Original file line number Diff line number Diff line change
Expand Up @@ -241,7 +241,7 @@ static int stac9460_adc_vol_put(struct snd_kcontrol *kcontrol, struct snd_ctl_el

for (i = 0; i < 2; ++i) {
reg = STAC946X_MIC_L_VOLUME + i;
nvol = ucontrol->value.integer.value[i];
nvol = ucontrol->value.integer.value[i] & 0x0f;
ovol = 0x0f - stac9460_get(ice, reg);
change = ((ovol & 0x0f) != nvol);
if (change)
Expand Down
8 changes: 4 additions & 4 deletions sound/pci/ice1712/wtm.c
Original file line number Diff line number Diff line change
Expand Up @@ -178,7 +178,7 @@ static int stac9460_dac_vol_put(struct snd_kcontrol *kcontrol,

if (kcontrol->private_value) {
idx = STAC946X_MASTER_VOLUME;
nvol = ucontrol->value.integer.value[0];
nvol = ucontrol->value.integer.value[0] & 0x7f;
tmp = stac9460_get(ice, idx);
ovol = 0x7f - (tmp & 0x7f);
change = (ovol != nvol);
Expand All @@ -189,7 +189,7 @@ static int stac9460_dac_vol_put(struct snd_kcontrol *kcontrol,
} else {
id = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
idx = id + STAC946X_LF_VOLUME;
nvol = ucontrol->value.integer.value[0];
nvol = ucontrol->value.integer.value[0] & 0x7f;
if (id < 6)
tmp = stac9460_get(ice, idx);
else
Expand Down Expand Up @@ -317,7 +317,7 @@ static int stac9460_adc_vol_put(struct snd_kcontrol *kcontrol,
if (id == 0) {
for (i = 0; i < 2; ++i) {
reg = STAC946X_MIC_L_VOLUME + i;
nvol = ucontrol->value.integer.value[i];
nvol = ucontrol->value.integer.value[i] & 0x0f;
ovol = 0x0f - stac9460_get(ice, reg);
change = ((ovol & 0x0f) != nvol);
if (change)
Expand All @@ -327,7 +327,7 @@ static int stac9460_adc_vol_put(struct snd_kcontrol *kcontrol,
} else {
for (i = 0; i < 2; ++i) {
reg = STAC946X_MIC_L_VOLUME + i;
nvol = ucontrol->value.integer.value[i];
nvol = ucontrol->value.integer.value[i] & 0x0f;
ovol = 0x0f - stac9460_2_get(ice, reg);
change = ((ovol & 0x0f) != nvol);
if (change)
Expand Down

0 comments on commit 9cd17cd

Please sign in to comment.