Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 91bf0c2d authored by Michael Gernoth's avatar Michael Gernoth Committed by Takashi Iwai
Browse files

ALSA: emu10k1: don't deadlock in proc-functions



The functions snd_emu10k1_proc_spdif_read and snd_emu1010_fpga_read
acquire the emu_lock before accessing the FPGA. The function used
to access the FPGA (snd_emu1010_fpga_read) also tries to take
the emu_lock which causes a deadlock.
Remove the outer locking in the proc-functions (guarding only the
already safe fpga read) to prevent this deadlock.

[removed superfluous flags variables too -- tiwai]

Signed-off-by: default avatarMichael Gernoth <michael@gernoth.net>
Cc: <stable@vger.kernel.org>
Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent 3dc8523f
Loading
Loading
Loading
Loading
+0 −12
Original line number Diff line number Diff line
@@ -241,31 +241,22 @@ static void snd_emu10k1_proc_spdif_read(struct snd_info_entry *entry,
	struct snd_emu10k1 *emu = entry->private_data;
	u32 value;
	u32 value2;
	unsigned long flags;
	u32 rate;

	if (emu->card_capabilities->emu_model) {
		spin_lock_irqsave(&emu->emu_lock, flags);
		snd_emu1010_fpga_read(emu, 0x38, &value);
		spin_unlock_irqrestore(&emu->emu_lock, flags);
		if ((value & 0x1) == 0) {
			spin_lock_irqsave(&emu->emu_lock, flags);
			snd_emu1010_fpga_read(emu, 0x2a, &value);
			snd_emu1010_fpga_read(emu, 0x2b, &value2);
			spin_unlock_irqrestore(&emu->emu_lock, flags);
			rate = 0x1770000 / (((value << 5) | value2)+1);	
			snd_iprintf(buffer, "ADAT Locked : %u\n", rate);
		} else {
			snd_iprintf(buffer, "ADAT Unlocked\n");
		}
		spin_lock_irqsave(&emu->emu_lock, flags);
		snd_emu1010_fpga_read(emu, 0x20, &value);
		spin_unlock_irqrestore(&emu->emu_lock, flags);
		if ((value & 0x4) == 0) {
			spin_lock_irqsave(&emu->emu_lock, flags);
			snd_emu1010_fpga_read(emu, 0x28, &value);
			snd_emu1010_fpga_read(emu, 0x29, &value2);
			spin_unlock_irqrestore(&emu->emu_lock, flags);
			rate = 0x1770000 / (((value << 5) | value2)+1);	
			snd_iprintf(buffer, "SPDIF Locked : %d\n", rate);
		} else {
@@ -410,14 +401,11 @@ static void snd_emu_proc_emu1010_reg_read(struct snd_info_entry *entry,
{
	struct snd_emu10k1 *emu = entry->private_data;
	u32 value;
	unsigned long flags;
	int i;
	snd_iprintf(buffer, "EMU1010 Registers:\n\n");

	for(i = 0; i < 0x40; i+=1) {
		spin_lock_irqsave(&emu->emu_lock, flags);
		snd_emu1010_fpga_read(emu, i, &value);
		spin_unlock_irqrestore(&emu->emu_lock, flags);
		snd_iprintf(buffer, "%02X: %08X, %02X\n", i, value, (value >> 8) & 0x7f);
	}
}