Commit a206e941 authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'fix/misc' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound-2.6

* 'fix/misc' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound-2.6:
  sound: pcm_lib: fix unsorted list constraint handling
  sound: vx222: fix input level control range check
  ALSA: ali5451: fix timeout handling in snd_ali_{codecs,timer}_ready()
parents 7cafe605 b1ddaf68
...@@ -943,47 +943,24 @@ static int snd_interval_ratden(struct snd_interval *i, ...@@ -943,47 +943,24 @@ static int snd_interval_ratden(struct snd_interval *i,
int snd_interval_list(struct snd_interval *i, unsigned int count, unsigned int *list, unsigned int mask) int snd_interval_list(struct snd_interval *i, unsigned int count, unsigned int *list, unsigned int mask)
{ {
unsigned int k; unsigned int k;
int changed = 0; struct snd_interval list_range;
if (!count) { if (!count) {
i->empty = 1; i->empty = 1;
return -EINVAL; return -EINVAL;
} }
snd_interval_any(&list_range);
list_range.min = UINT_MAX;
list_range.max = 0;
for (k = 0; k < count; k++) { for (k = 0; k < count; k++) {
if (mask && !(mask & (1 << k))) if (mask && !(mask & (1 << k)))
continue; continue;
if (i->min == list[k] && !i->openmin) if (!snd_interval_test(i, list[k]))
goto _l1;
if (i->min < list[k]) {
i->min = list[k];
i->openmin = 0;
changed = 1;
goto _l1;
}
}
i->empty = 1;
return -EINVAL;
_l1:
for (k = count; k-- > 0;) {
if (mask && !(mask & (1 << k)))
continue; continue;
if (i->max == list[k] && !i->openmax) list_range.min = min(list_range.min, list[k]);
goto _l2; list_range.max = max(list_range.max, list[k]);
if (i->max > list[k]) {
i->max = list[k];
i->openmax = 0;
changed = 1;
goto _l2;
}
} }
i->empty = 1; return snd_interval_refine(i, &list_range);
return -EINVAL;
_l2:
if (snd_interval_checkempty(i)) {
i->empty = 1;
return -EINVAL;
}
return changed;
} }
EXPORT_SYMBOL(snd_interval_list); EXPORT_SYMBOL(snd_interval_list);
......
...@@ -310,12 +310,16 @@ static int snd_ali_codec_ready(struct snd_ali *codec, ...@@ -310,12 +310,16 @@ static int snd_ali_codec_ready(struct snd_ali *codec,
unsigned int res; unsigned int res;
end_time = jiffies + msecs_to_jiffies(250); end_time = jiffies + msecs_to_jiffies(250);
do {
for (;;) {
res = snd_ali_5451_peek(codec,port); res = snd_ali_5451_peek(codec,port);
if (!(res & 0x8000)) if (!(res & 0x8000))
return 0; return 0;
if (!time_after_eq(end_time, jiffies))
break;
schedule_timeout_uninterruptible(1); schedule_timeout_uninterruptible(1);
} while (time_after_eq(end_time, jiffies)); }
snd_ali_5451_poke(codec, port, res & ~0x8000); snd_ali_5451_poke(codec, port, res & ~0x8000);
snd_printdd("ali_codec_ready: codec is not ready.\n "); snd_printdd("ali_codec_ready: codec is not ready.\n ");
return -EIO; return -EIO;
...@@ -327,15 +331,17 @@ static int snd_ali_stimer_ready(struct snd_ali *codec) ...@@ -327,15 +331,17 @@ static int snd_ali_stimer_ready(struct snd_ali *codec)
unsigned long dwChk1,dwChk2; unsigned long dwChk1,dwChk2;
dwChk1 = snd_ali_5451_peek(codec, ALI_STIMER); dwChk1 = snd_ali_5451_peek(codec, ALI_STIMER);
dwChk2 = snd_ali_5451_peek(codec, ALI_STIMER);
end_time = jiffies + msecs_to_jiffies(250); end_time = jiffies + msecs_to_jiffies(250);
do {
for (;;) {
dwChk2 = snd_ali_5451_peek(codec, ALI_STIMER); dwChk2 = snd_ali_5451_peek(codec, ALI_STIMER);
if (dwChk2 != dwChk1) if (dwChk2 != dwChk1)
return 0; return 0;
if (!time_after_eq(end_time, jiffies))
break;
schedule_timeout_uninterruptible(1); schedule_timeout_uninterruptible(1);
} while (time_after_eq(end_time, jiffies)); }
snd_printk(KERN_ERR "ali_stimer_read: stimer is not ready.\n"); snd_printk(KERN_ERR "ali_stimer_read: stimer is not ready.\n");
return -EIO; return -EIO;
} }
......
...@@ -885,10 +885,10 @@ static int vx_input_level_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem ...@@ -885,10 +885,10 @@ static int vx_input_level_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem
struct vx_core *_chip = snd_kcontrol_chip(kcontrol); struct vx_core *_chip = snd_kcontrol_chip(kcontrol);
struct snd_vx222 *chip = (struct snd_vx222 *)_chip; struct snd_vx222 *chip = (struct snd_vx222 *)_chip;
if (ucontrol->value.integer.value[0] < 0 || if (ucontrol->value.integer.value[0] < 0 ||
ucontrol->value.integer.value[0] < MIC_LEVEL_MAX) ucontrol->value.integer.value[0] > MIC_LEVEL_MAX)
return -EINVAL; return -EINVAL;
if (ucontrol->value.integer.value[1] < 0 || if (ucontrol->value.integer.value[1] < 0 ||
ucontrol->value.integer.value[1] < MIC_LEVEL_MAX) ucontrol->value.integer.value[1] > MIC_LEVEL_MAX)
return -EINVAL; return -EINVAL;
mutex_lock(&_chip->mixer_mutex); mutex_lock(&_chip->mixer_mutex);
if (chip->input_level[0] != ucontrol->value.integer.value[0] || if (chip->input_level[0] != ucontrol->value.integer.value[0] ||
......
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