Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

ALSA: emu10k1: Fix dock firmware loading

The commit [b209c4df: ALSA: emu10k1: cache emu1010 firmware] broke the
firmware loading of the dock, just (mistakenly) ignoring a different
firmware for docks on some models. This patch revives them again.

Bugzilla: https://bugs.archlinux.org/task/34865
Reported-and-tested-by: Tobias Powalowski <tobias.powalowski@googlemail.com>
Cc: <stable@vger.kernel.org> [v3.8+]
Signed-off-by: Takashi Iwai <tiwai@suse.de>

+34 -6
+1
include/sound/emu10k1.h
··· 1787 1787 unsigned int next_free_voice; 1788 1788 1789 1789 const struct firmware *firmware; 1790 + const struct firmware *dock_fw; 1790 1791 1791 1792 #ifdef CONFIG_PM_SLEEP 1792 1793 unsigned int *saved_ptr;
+33 -6
sound/pci/emu10k1/emu10k1_main.c
··· 657 657 return 0; 658 658 } 659 659 660 - static int snd_emu1010_load_firmware(struct snd_emu10k1 *emu) 660 + static int snd_emu1010_load_firmware(struct snd_emu10k1 *emu, 661 + const struct firmware *fw_entry) 661 662 { 662 663 int n, i; 663 664 int reg; 664 665 int value; 665 666 unsigned int write_post; 666 667 unsigned long flags; 667 - const struct firmware *fw_entry = emu->firmware; 668 668 669 669 if (!fw_entry) 670 670 return -EIO; ··· 725 725 /* Return to Audio Dock programming mode */ 726 726 snd_printk(KERN_INFO "emu1010: Loading Audio Dock Firmware\n"); 727 727 snd_emu1010_fpga_write(emu, EMU_HANA_FPGA_CONFIG, EMU_HANA_FPGA_CONFIG_AUDIODOCK); 728 - err = snd_emu1010_load_firmware(emu); 729 - if (err != 0) 730 - continue; 728 + 729 + if (!emu->dock_fw) { 730 + const char *filename = NULL; 731 + switch (emu->card_capabilities->emu_model) { 732 + case EMU_MODEL_EMU1010: 733 + filename = DOCK_FILENAME; 734 + break; 735 + case EMU_MODEL_EMU1010B: 736 + filename = MICRO_DOCK_FILENAME; 737 + break; 738 + case EMU_MODEL_EMU1616: 739 + filename = MICRO_DOCK_FILENAME; 740 + break; 741 + } 742 + if (filename) { 743 + err = request_firmware(&emu->dock_fw, 744 + filename, 745 + &emu->pci->dev); 746 + if (err) 747 + continue; 748 + } 749 + } 750 + 751 + if (emu->dock_fw) { 752 + err = snd_emu1010_load_firmware(emu, emu->dock_fw); 753 + if (err) 754 + continue; 755 + } 731 756 732 757 snd_emu1010_fpga_write(emu, EMU_HANA_FPGA_CONFIG, 0); 733 758 snd_emu1010_fpga_read(emu, EMU_HANA_IRQ_STATUS, &reg); ··· 887 862 filename, emu->firmware->size); 888 863 } 889 864 890 - err = snd_emu1010_load_firmware(emu); 865 + err = snd_emu1010_load_firmware(emu, emu->firmware); 891 866 if (err != 0) { 892 867 snd_printk(KERN_INFO "emu1010: Loading Firmware failed\n"); 893 868 return err; ··· 1278 1253 kthread_stop(emu->emu1010.firmware_thread); 1279 1254 if (emu->firmware) 1280 1255 release_firmware(emu->firmware); 1256 + if (emu->dock_fw) 1257 + release_firmware(emu->dock_fw); 1281 1258 if (emu->irq >= 0) 1282 1259 free_irq(emu->irq, emu); 1283 1260 /* remove reserved page */