|
@@ -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;
|