aboutsummaryrefslogtreecommitdiffstats
path: root/sound
diff options
context:
space:
mode:
authorPavel Hofman <pavel.hofman@ivitera.com>2009-09-16 16:25:39 -0400
committerTakashi Iwai <tiwai@suse.de>2009-09-21 09:47:08 -0400
commit6796d5a05f4d3caad17d2586b3e5776fda50ef82 (patch)
treea360f3984b47e8d262d0f5b20cfa2744342f6627 /sound
parent494703062b6e6ef5e72364aafc9bcbc172d53dea (diff)
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>
Diffstat (limited to 'sound')
-rw-r--r--sound/pci/ice1712/ice1724.c23
1 files changed, 16 insertions, 7 deletions
diff --git a/sound/pci/ice1712/ice1724.c b/sound/pci/ice1712/ice1724.c
index 2213beec009a..514e15385f7a 100644
--- a/sound/pci/ice1712/ice1724.c
+++ b/sound/pci/ice1712/ice1724.c
@@ -118,9 +118,12 @@ static inline int stdclock_is_spdif_master(struct snd_ice1712 *ice)
118 return (inb(ICEMT1724(ice, RATE)) & VT1724_SPDIF_MASTER) ? 1 : 0; 118 return (inb(ICEMT1724(ice, RATE)) & VT1724_SPDIF_MASTER) ? 1 : 0;
119} 119}
120 120
121/*
122 * locking rate makes sense only for internal clock mode
123 */
121static inline int is_pro_rate_locked(struct snd_ice1712 *ice) 124static inline int is_pro_rate_locked(struct snd_ice1712 *ice)
122{ 125{
123 return ice->is_spdif_master(ice) || PRO_RATE_LOCKED; 126 return (!ice->is_spdif_master(ice)) && PRO_RATE_LOCKED;
124} 127}
125 128
126/* 129/*
@@ -668,16 +671,22 @@ static int snd_vt1724_set_pro_rate(struct snd_ice1712 *ice, unsigned int rate,
668 return -EBUSY; 671 return -EBUSY;
669 } 672 }
670 if (!force && is_pro_rate_locked(ice)) { 673 if (!force && is_pro_rate_locked(ice)) {
674 /* comparing required and current rate - makes sense for
675 * internal clock only */
671 spin_unlock_irqrestore(&ice->reg_lock, flags); 676 spin_unlock_irqrestore(&ice->reg_lock, flags);
672 return (rate == ice->cur_rate) ? 0 : -EBUSY; 677 return (rate == ice->cur_rate) ? 0 : -EBUSY;
673 } 678 }
674 679
675 old_rate = ice->get_rate(ice); 680 if (force || !ice->is_spdif_master(ice)) {
676 if (force || (old_rate != rate)) 681 /* force means the rate was switched by ucontrol, otherwise
677 ice->set_rate(ice, rate); 682 * setting clock rate for internal clock mode */
678 else if (rate == ice->cur_rate) { 683 old_rate = ice->get_rate(ice);
679 spin_unlock_irqrestore(&ice->reg_lock, flags); 684 if (force || (old_rate != rate))
680 return 0; 685 ice->set_rate(ice, rate);
686 else if (rate == ice->cur_rate) {
687 spin_unlock_irqrestore(&ice->reg_lock, flags);
688 return 0;
689 }
681 } 690 }
682 691
683 ice->cur_rate = rate; 692 ice->cur_rate = rate;