]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - sound/pci/emu10k1/emu10k1_main.c
Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6
[linux-2.6-omap-h63xx.git] / sound / pci / emu10k1 / emu10k1_main.c
index f29caf1afe06503496873bf815f0e21124a244f0..548c9cc81af5f5c05967ac2eae2d6c9d5db51ab9 100644 (file)
@@ -707,7 +707,8 @@ static int snd_emu1010_load_firmware(struct snd_emu10k1 * emu, const char * file
        return 0;
 }
 
-int emu1010_firmware_thread(void *data) {
+static int emu1010_firmware_thread(void *data)
+{
        struct snd_emu10k1 * emu = data;
        int tmp,tmp2;
        int reg;
@@ -1090,10 +1091,12 @@ static int snd_emu10k1_emu1010_init(struct snd_emu10k1 * emu)
        snd_emu1010_fpga_write(emu, EMU_HANA_SPDIF_MODE, 0x10 ); /* SPDIF Format spdif  (or 0x11 for aes/ebu) */
 
        /* Start Micro/Audio Dock firmware loader thread */
-       emu->emu1010.firmware_thread = kthread_create(&emu1010_firmware_thread,
-                                   emu,
-                                   "emu1010_firmware");
-       wake_up_process(emu->emu1010.firmware_thread);
+       if (!emu->emu1010.firmware_thread) {
+               emu->emu1010.firmware_thread =
+                       kthread_create(emu1010_firmware_thread, emu,
+                                      "emu1010_firmware");
+               wake_up_process(emu->emu1010.firmware_thread);
+       }
 
 #if 0
        snd_emu1010_fpga_link_dst_src_write(emu,
@@ -1246,19 +1249,22 @@ static int snd_emu10k1_free(struct snd_emu10k1 *emu)
        if (emu->port) {        /* avoid access to already used hardware */
                snd_emu10k1_fx8010_tram_setup(emu, 0);
                snd_emu10k1_done(emu);
-               /* remove reserved page */
-               if (emu->reserved_page) {
-                       snd_emu10k1_synth_free(emu, (struct snd_util_memblk *)emu->reserved_page);
-                       emu->reserved_page = NULL;
-               }
                snd_emu10k1_free_efx(emu);
                }
        if (emu->card_capabilities->emu_model == EMU_MODEL_EMU1010) {
                /* Disable 48Volt power to Audio Dock */
                snd_emu1010_fpga_write(emu,  EMU_HANA_DOCK_PWR,  0 );
        }
-       if (emu->card_capabilities->emu_model)
+       if (emu->emu1010.firmware_thread)
                kthread_stop(emu->emu1010.firmware_thread);
+       if (emu->irq >= 0)
+               free_irq(emu->irq, emu);
+       /* remove reserved page */
+       if (emu->reserved_page) {
+               snd_emu10k1_synth_free(emu,
+                       (struct snd_util_memblk *)emu->reserved_page);
+               emu->reserved_page = NULL;
+       }
        if (emu->memhdr)
                snd_util_memhdr_free(emu->memhdr);
        if (emu->silent_page.area)
@@ -1270,8 +1276,6 @@ static int snd_emu10k1_free(struct snd_emu10k1 *emu)
 #ifdef CONFIG_PM
        free_pm_buffer(emu);
 #endif
-       if (emu->irq >= 0)
-               free_irq(emu->irq, emu);
        if (emu->port)
                pci_release_regions(emu->pci);
        if (emu->card_capabilities->ca0151_chip) /* P16V */     
@@ -1390,14 +1394,6 @@ static struct snd_emu_chip_details emu_chip_details[] = {
         .spi_dac = 1,
         .i2c_adc = 1,
         .spk71 = 1} ,
-       /* Tested by James@superbug.co.uk 20-3-2007. */
-       {.vendor = 0x1102, .device = 0x0008, .subsystem = 0x40021102,
-        .driver = "Audigy2", .name = "E-mu 0404 [4002]",
-        .id = "EMU0404",
-        .emu10k2_chip = 1,
-        .ca0102_chip = 1,
-        .spk71 = 1,
-        .emu_model = EMU_MODEL_EMU0404} , /* EMU 0404 */
        /* Tested by James@superbug.co.uk 4th Nov 2007. */
        {.vendor = 0x1102, .device = 0x0008, .subsystem = 0x42011102,
         .driver = "Audigy2", .name = "E-mu 1010 Notebook [MAEM8950]", 
@@ -1422,7 +1418,23 @@ static struct snd_emu_chip_details emu_chip_details[] = {
         .emu10k2_chip = 1,
         .ca0102_chip = 1,
         .spk71 = 1,
-        .emu_model = EMU_MODEL_EMU1010} , /* Emu 1010 */
+        .emu_model = EMU_MODEL_EMU1010}, /* Emu 1010 */
+       /* EMU0404b */
+       {.vendor = 0x1102, .device = 0x0008, .subsystem = 0x40021102,
+        .driver = "Audigy2", .name = "E-mu 0404b [4002]",
+        .id = "EMU0404",
+        .emu10k2_chip = 1,
+        .ca0108_chip = 1,
+        .spk71 = 1,
+        .emu_model = EMU_MODEL_EMU0404}, /* EMU 0404 */
+       /* Tested by James@superbug.co.uk 20-3-2007. */
+       {.vendor = 0x1102, .device = 0x0004, .subsystem = 0x40021102,
+        .driver = "Audigy2", .name = "E-mu 0404 [4002]",
+        .id = "EMU0404",
+        .emu10k2_chip = 1,
+        .ca0102_chip = 1,
+        .spk71 = 1,
+        .emu_model = EMU_MODEL_EMU0404}, /* EMU 0404 */
        /* Audigy4 (Not PRO) SB0610 */
        {.vendor = 0x1102, .device = 0x0008, 
         .driver = "Audigy2", .name = "Audigy 2 Value [Unknown]", 
@@ -1806,13 +1818,6 @@ int __devinit snd_emu10k1_create(struct snd_card *card,
        }
        emu->port = pci_resource_start(pci, 0);
 
-       if (request_irq(pci->irq, snd_emu10k1_interrupt, IRQF_SHARED,
-                       "EMU10K1", emu)) {
-               err = -EBUSY;
-               goto error;
-       }
-       emu->irq = pci->irq;
-
        emu->max_cache_pages = max_cache_bytes >> PAGE_SHIFT;
        if (snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV, snd_dma_pci_data(pci),
                                32 * 1024, &emu->ptb_pages) < 0) {
@@ -1875,6 +1880,14 @@ int __devinit snd_emu10k1_create(struct snd_card *card,
        emu->fx8010.etram_pages.area = NULL;
        emu->fx8010.etram_pages.bytes = 0;
 
+       /* irq handler must be registered after I/O ports are activated */
+       if (request_irq(pci->irq, snd_emu10k1_interrupt, IRQF_SHARED,
+                       "EMU10K1", emu)) {
+               err = -EBUSY;
+               goto error;
+       }
+       emu->irq = pci->irq;
+
        /*
         *  Init to 0x02109204 :
         *  Clock accuracy    = 0     (1000ppm)