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;