ALSA: ice1724 - pro-rate-locking makes sense only for internal clock mode
* pro-rate-locking applies to internal clock mode only * required rate and current rate are compared for internal clock mode only Signed-off-by: Pavel Hofman <pavel.hofman@ivitera.com> Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
parent
494703062b
commit
6796d5a05f
@ -118,9 +118,12 @@ static inline int stdclock_is_spdif_master(struct snd_ice1712 *ice)
|
||||
return (inb(ICEMT1724(ice, RATE)) & VT1724_SPDIF_MASTER) ? 1 : 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* locking rate makes sense only for internal clock mode
|
||||
*/
|
||||
static inline int is_pro_rate_locked(struct snd_ice1712 *ice)
|
||||
{
|
||||
return ice->is_spdif_master(ice) || PRO_RATE_LOCKED;
|
||||
return (!ice->is_spdif_master(ice)) && PRO_RATE_LOCKED;
|
||||
}
|
||||
|
||||
/*
|
||||
@ -668,16 +671,22 @@ static int snd_vt1724_set_pro_rate(struct snd_ice1712 *ice, unsigned int rate,
|
||||
return -EBUSY;
|
||||
}
|
||||
if (!force && is_pro_rate_locked(ice)) {
|
||||
/* comparing required and current rate - makes sense for
|
||||
* internal clock only */
|
||||
spin_unlock_irqrestore(&ice->reg_lock, flags);
|
||||
return (rate == ice->cur_rate) ? 0 : -EBUSY;
|
||||
}
|
||||
|
||||
old_rate = ice->get_rate(ice);
|
||||
if (force || (old_rate != rate))
|
||||
ice->set_rate(ice, rate);
|
||||
else if (rate == ice->cur_rate) {
|
||||
spin_unlock_irqrestore(&ice->reg_lock, flags);
|
||||
return 0;
|
||||
if (force || !ice->is_spdif_master(ice)) {
|
||||
/* force means the rate was switched by ucontrol, otherwise
|
||||
* setting clock rate for internal clock mode */
|
||||
old_rate = ice->get_rate(ice);
|
||||
if (force || (old_rate != rate))
|
||||
ice->set_rate(ice, rate);
|
||||
else if (rate == ice->cur_rate) {
|
||||
spin_unlock_irqrestore(&ice->reg_lock, flags);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
ice->cur_rate = rate;
|
||||
|
Loading…
Reference in New Issue
Block a user