ALSA: ice1724 - pro-rate-locking makes sense only for internal clock mode
authorPavel Hofman <pavel.hofman@ivitera.com>
Wed, 16 Sep 2009 20:25:39 +0000 (22:25 +0200)
committerTakashi Iwai <tiwai@suse.de>
Mon, 21 Sep 2009 13:47:08 +0000 (15:47 +0200)
* 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>
sound/pci/ice1712/ice1724.c

index 2213bee..514e153 100644 (file)
@@ -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;