]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - sound/pci/emu10k1/emu10k1_main.c
Merge branch 'task_killable' of git://git.kernel.org/pub/scm/linux/kernel/git/willy...
[linux-2.6-omap-h63xx.git] / sound / pci / emu10k1 / emu10k1_main.c
index 54b978e74f5888dc756fb3af1862c7de257f0432..9a9b977d3cf1c00173a76128a29be00dc51e683a 100644 (file)
@@ -259,7 +259,6 @@ static int snd_emu10k1_init(struct snd_emu10k1 *emu, int enable_ir, int resume)
                 * GPIO7: Unknown
                 */
                outl(0x76, emu->port + A_IOCFG); /* Windows uses 0x3f76 */
-
        }
        if (emu->card_capabilities->i2c_adc) { /* Audigy 2 ZS Notebook with ADC Wolfson WM8775 */
                int size, n;
@@ -275,7 +274,6 @@ static int snd_emu10k1_init(struct snd_emu10k1 *emu, int enable_ir, int resume)
                        emu->i2c_capture_volume[n][0]= 0xcf;
                        emu->i2c_capture_volume[n][1]= 0xcf;
                }
-
        }
 
        
@@ -653,6 +651,8 @@ static int snd_emu10k1_cardbus_init(struct snd_emu10k1 * emu)
        value = inl(special_port);
 
        snd_emu10k1_ptr20_write(emu, TINA2_VOLUME, 0, 0xfefefefe); /* Defaults to 0x30303030 */
+       /* Delay to give time for ADC chip to switch on. It needs 113ms */
+       msleep(200);
        return 0;
 }
 
@@ -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;
@@ -725,15 +726,18 @@ int emu1010_firmware_thread(void *data) {
                        /* Return to Audio Dock programming mode */
                        snd_printk(KERN_INFO "emu1010: Loading Audio Dock Firmware\n");
                        snd_emu1010_fpga_write(emu,  EMU_HANA_FPGA_CONFIG, EMU_HANA_FPGA_CONFIG_AUDIODOCK );
-                       if (emu->card_capabilities->emu_model == 1) {
+                       if (emu->card_capabilities->emu_model ==
+                           EMU_MODEL_EMU1010) {
                                if ((err = snd_emu1010_load_firmware(emu, DOCK_FILENAME)) != 0) {
                                        continue;
                                }
-                       } else if (emu->card_capabilities->emu_model == 2) {
+                       } else if (emu->card_capabilities->emu_model ==
+                                  EMU_MODEL_EMU1010B) {
                                if ((err = snd_emu1010_load_firmware(emu, MICRO_DOCK_FILENAME)) != 0) {
                                        continue;
                                }
-                       } else if (emu->card_capabilities->emu_model == 3) {
+                       } else if (emu->card_capabilities->emu_model ==
+                                  EMU_MODEL_EMU1616) {
                                if ((err = snd_emu1010_load_firmware(emu, MICRO_DOCK_FILENAME)) != 0) {
                                        continue;
                                }
@@ -845,16 +849,16 @@ static int snd_emu10k1_emu1010_init(struct snd_emu10k1 * emu)
        }
        snd_printk(KERN_INFO "emu1010: EMU_HANA_ID=0x%x\n",reg);
        switch (emu->card_capabilities->emu_model) {
-       case 1:
+       case EMU_MODEL_EMU1010:
                filename = HANA_FILENAME;
                break;
-       case 2:
+       case EMU_MODEL_EMU1010B:
                filename = EMU1010B_FILENAME;
                break;
-       case 3:
+       case EMU_MODEL_EMU1616:
                filename = EMU1010_NOTEBOOK_FILENAME;
                break;
-       case 4:
+       case EMU_MODEL_EMU0404:
                filename = EMU0404_FILENAME;
                break;
        default:
@@ -1087,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,
@@ -1103,7 +1109,7 @@ static int snd_emu10k1_emu1010_init(struct snd_emu10k1 * emu)
                EMU_DST_HANA_SPDIF_RIGHT1, EMU_SRC_ALICE_EMU32A + 3); /* ALICE2 bus 0xb3 */
 #endif
        /* Default outputs */
-       if (emu->card_capabilities->emu_model == 3) {
+       if (emu->card_capabilities->emu_model == EMU_MODEL_EMU1616) {
                /* 1616(M) cardbus default outputs */
                /* ALICE2 bus 0xa0 */
                snd_emu1010_fpga_link_dst_src_write(emu,
@@ -1250,11 +1256,11 @@ static int snd_emu10k1_free(struct snd_emu10k1 *emu)
                }
                snd_emu10k1_free_efx(emu);
                }
-       if (emu->card_capabilities->emu_model == 1) {
+       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->memhdr)
                snd_util_memhdr_free(emu->memhdr);
@@ -1387,14 +1393,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 = 4} , /* 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]", 
@@ -1403,7 +1401,7 @@ static struct snd_emu_chip_details emu_chip_details[] = {
         .ca0108_chip = 1,
         .ca_cardbus_chip = 1,
         .spk71 = 1 ,
-        .emu_model = 3} ,
+        .emu_model = EMU_MODEL_EMU1616},
        /* Tested by James@superbug.co.uk 4th Nov 2007. */
        {.vendor = 0x1102, .device = 0x0008, .subsystem = 0x40041102,
         .driver = "Audigy2", .name = "E-mu 1010b PCI [MAEM????]", 
@@ -1411,7 +1409,7 @@ static struct snd_emu_chip_details emu_chip_details[] = {
         .emu10k2_chip = 1,
         .ca0108_chip = 1,
         .spk71 = 1,
-        .emu_model = 2} ,
+        .emu_model = EMU_MODEL_EMU1010B},
        /* Tested by James@superbug.co.uk 8th July 2005. */
        {.vendor = 0x1102, .device = 0x0004, .subsystem = 0x40011102,
         .driver = "Audigy2", .name = "E-mu 1010 [4001]",
@@ -1419,7 +1417,23 @@ static struct snd_emu_chip_details emu_chip_details[] = {
         .emu10k2_chip = 1,
         .ca0102_chip = 1,
         .spk71 = 1,
-        .emu_model = 1} , /* 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]", 
@@ -1714,6 +1728,8 @@ int __devinit snd_emu10k1_create(struct snd_card *card,
        emu->card = card;
        spin_lock_init(&emu->reg_lock);
        spin_lock_init(&emu->emu_lock);
+       spin_lock_init(&emu->spi_lock);
+       spin_lock_init(&emu->i2c_lock);
        spin_lock_init(&emu->voice_lock);
        spin_lock_init(&emu->synth_lock);
        spin_lock_init(&emu->memblk_lock);