Hi!

The ice1712 driver (0.9.0rc6 and CVS) crashes on my Dual-SMP machine
(Kernel 2.4.20-rc2) due to a missing spin_unlock_irq in 
snd_ice1712_pro_internal_clock_put.

This patch fixed it for me (but I don't know if this is the right way).

  ciao

-- 
Gerhard Dirschl
Karlsruhe
Germany
--- alsa-driver-0.9.0rc6/alsa-kernel/pci/ice1712/ice1712.c      2002-11-14 
11:52:31.000000000 +0100
+++ alsa/alsa-kernel/pci/ice1712/ice1712.c      2002-11-17 16:41:44.000000000 +0100
@@ -1787,13 +1787,18 @@
        oval = inb(ICEMT(ice, RATE));
        if (ucontrol->value.enumerated.item[0] == 13) {
                outb(oval | ICE1712_SPDIF_MASTER, ICEMT(ice, RATE));
+               spin_unlock_irq(&ice->reg_lock);
        } else {
                PRO_RATE_DEFAULT = xrate[ucontrol->value.integer.value[0] % 13];
+               spin_unlock_irq(&ice->reg_lock);
                snd_ice1712_set_pro_rate(ice, PRO_RATE_DEFAULT, 1);
        }
+       spin_lock_irq(&ice->reg_lock);
        change = inb(ICEMT(ice, RATE)) != oval;
-
+       
        if ((oval & ICE1712_SPDIF_MASTER) != (inb(ICEMT(ice, RATE)) & 
ICE1712_SPDIF_MASTER)) {
+               spin_unlock_irq(&ice->reg_lock);
+               
                /* change CS8427 clock source too */
                if (ice->cs8427) {
                        snd_ice1712_cs8427_set_input_clock(ice, is_spdif_master(ice));
@@ -1801,6 +1806,8 @@
                /* notify ak4524 chip as well */
                if (is_spdif_master(ice) && ice->ak4524.ops.set_rate_val)
                        ice->ak4524.ops.set_rate_val(ice, 0);
+       } else {
+               spin_unlock_irq(&ice->reg_lock);
        }
 
        return change;

Reply via email to