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()
This commit is contained in:
commit
a206e9417f
@ -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,
|
|||||||
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)
|
|||||||
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
|
|||||||
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] ||
|
||||||
|
Loading…
Reference in New Issue
Block a user