Attached are a patch for adding isapnp configuration to the gus.o
driver. It seems to work, configures fine and all, but interrupts are
never ack'ed by the kernel (/proc/interrupt count does not move). All my
debugging output indicates everything goes well.

I hear some stuttery sound, however :)

Could someone take a hard look at this and try pointing out to me where I
went wrong? I've stared myself blind a few times already.

--
Erik I. Bolsų | email: <knan at mo.himolde.no>
              | irc: Knan / #linux.no @ Undernet
diff -u --recursive --new-file linux/drivers/sound/Config.in 
linux-gus/drivers/sound/Config.in
--- linux/drivers/sound/Config.in       Tue Aug 22 18:31:05 2000
+++ linux-gus/drivers/sound/Config.in   Sat Sep  9 18:25:04 2000
@@ -96,7 +96,7 @@
    dep_tristate '    Gravis Ultrasound support' CONFIG_SOUND_GUS $CONFIG_SOUND_OSS
    if [ "$CONFIG_SOUND_GUS" != "n" ]; then
       bool '      16 bit sampling option of GUS (_NOT_ GUS MAX)' CONFIG_SOUND_GUS16 
-      bool '      GUS MAX support' CONFIG_SOUND_GUSMAX
+      bool '      GUS MAX / PnP / compatibles support' CONFIG_SOUND_GUSMAX
    fi
    dep_tristate '    Intel ICH audio support' CONFIG_SOUND_ICH $CONFIG_SOUND_OSS
    dep_tristate '    Loopback MIDI device support' CONFIG_SOUND_VMIDI 
$CONFIG_SOUND_OSS
diff -u --recursive --new-file linux/drivers/sound/gus_card.c 
linux-gus/drivers/sound/gus_card.c
--- linux/drivers/sound/gus_card.c      Fri Aug 11 15:26:43 2000
+++ linux-gus/drivers/sound/gus_card.c  Sat Sep  9 18:05:02 2000
@@ -6,18 +6,21 @@
  * Copyright (C) by Hannu Savolainen 1993-1997
  *
  *
- * Frank van de Pol : Fixed GUS MAX interrupt handling, enabled simultanious
+ * Frank van de Pol : Fixed GUS MAX interrupt handling, enabled simultaneous
  *                    usage of CS4231A codec, GUS wave and MIDI for GUS MAX.
  * Christoph Hellwig: Adapted to module_init/module_exit, simple cleanups.
+ * Erik Inge Bolsų  : Added ISAPnP detection for Gravis Ultrasound PnP and 
+compatibles.
+ *                    (september 2000)
  *
  * Status:
- *              Tested... 
+ *              Tested. Multiple cards not supported.
  */
       
  
 #include <linux/config.h>
 #include <linux/init.h>
 #include <linux/module.h>
+#include <linux/isapnp.h>
 
 #include "sound_config.h"
 
@@ -98,7 +101,7 @@
                                          }
 #endif
 
-       printk("NO GUS card found !\n");
+       printk(KERN_ERR "GUS: NO GUS card found !\n");
        return 0;
 }
 
@@ -163,6 +166,78 @@
        }
 }
 
+#if defined CONFIG_ISAPNP || defined CONFIG_ISAPNP_MODULE
+static struct {
+       char *name;
+       unsigned short card_vendor, card_device,
+                       audio_vendor, audio_function;
+} gus_isapnp_list[] __devinitdata = {
+       { "Gravis Ultrasound PnP",
+         ISAPNP_VENDOR('G','R','V'), ISAPNP_DEVICE(0x0001),
+         ISAPNP_VENDOR('G','R','V'), ISAPNP_DEVICE(0x0000)
+       },
+       { "STB SoundRage 32",
+         ISAPNP_VENDOR('S','T','B'), ISAPNP_DEVICE(0x011a),
+         ISAPNP_VENDOR('S','T','B'), ISAPNP_DEVICE(0x0010)
+       },
+       { "ExpertMedia MED-3210",
+         ISAPNP_VENDOR('D','X','P'), ISAPNP_DEVICE(0x3201),
+         ISAPNP_VENDOR('D','X','P'), ISAPNP_DEVICE(0x0010)
+       },
+       { "Core Dynamics Dynasonix Pro",
+         ISAPNP_VENDOR('C','D','C'), ISAPNP_DEVICE(0x1111),
+         ISAPNP_VENDOR('C','D','C'), ISAPNP_DEVICE(0x1112)
+       },
+       { "Panasonic PCA761AW",
+         ISAPNP_VENDOR('A','D','V'), ISAPNP_DEVICE(0x55ff),
+         ISAPNP_VENDOR('A','D','V'), ISAPNP_DEVICE(0x0010)
+       },
+       {0}
+       };
+
+static int __init probe_gus_isapnp(struct address_info *hw_config)
+{
+       static struct pci_bus *bus = NULL;
+       static int i = 0;
+       
+       while (gus_isapnp_list[i].card_vendor != 0) {
+           if ((bus = isapnp_find_card(gus_isapnp_list[i].card_vendor, 
+gus_isapnp_list[i].card_device, bus))) {
+               static struct pci_dev *dev = NULL;
+
+               printk(KERN_INFO "gus: %s sound card detected\n", 
+gus_isapnp_list[i].name );
+
+               if ((dev = isapnp_find_dev(bus, gus_isapnp_list[i].audio_vendor, 
+gus_isapnp_list[i].audio_function, NULL))) {
+                   if (dev->active) {
+                       printk (KERN_INFO "gus: card already active, trying to use it 
+anyway\n");
+                   }
+                   else {
+                       static int ret;
+                       if ((ret = dev->prepare(dev)) < 0) {
+                           printk (KERN_ERR "gus: ISAPnP found device that could not 
+be autoconfigured [%d]\n", ret);
+                           continue;
+                       }
+               
+                       if ((ret = dev->activate(dev)) < 0) {
+                           printk (KERN_ERR "gus: ISAPnP autoconfig failed (out of 
+resources?) [%d]\n", ret);
+                           dev->deactivate(dev);
+                           continue;
+                       }
+                   }
+               
+                   hw_config->io_base = dev->resource[0].start ;
+                   hw_config->irq = dev->irq_resource[0].start ;
+                   hw_config->dma = dev->dma_resource[0].start ;
+                   hw_config->dma2 = dev->dma_resource[1].start ;
+                   printk (KERN_NOTICE "gus: debug: io_base = %x, irq = %d, dma = %d, 
+dma2 = %d\n", hw_config->io_base, hw_config->irq, hw_config->dma, hw_config->dma2);
+                   return 1;
+               }
+           }
+           i++;
+       }
+       return 0;
+}
+#endif
+
 /*
  *     Some extra code for the 16 bit sampling option
  */
@@ -217,6 +292,9 @@
 static int __initdata dma = -1;
 static int __initdata dma16 = -1;      /* Set this for modules that need it */
 static int __initdata type = 0;                /* 1 for PnP */
+#if defined CONFIG_ISAPNP || defined CONFIG_ISAPNP_MODULE
+static int __initdata isapnp = 1;
+#endif
 
 MODULE_PARM(io, "i");
 MODULE_PARM(irq, "i");
@@ -230,6 +308,9 @@
 #ifdef CONFIG_SOUND_GUS16
 MODULE_PARM(db16, "i");
 #endif
+#if defined CONFIG_ISAPNP || defined CONFIG_ISAPNP_MODULE
+MODULE_PARM(isapnp, "i");
+#endif
 
 static int __init init_gus(void)
 {
@@ -244,11 +325,21 @@
        gus_no_wave_dma = no_wave_dma;
 #endif
 
+#if defined CONFIG_ISAPNP || defined CONFIG_ISAPNP_MODULE
+       if ((cfg.io_base == -1 || cfg.dma == -1 || cfg.irq == -1) && isapnp == 0 ) {
+#else
        if (cfg.io_base == -1 || cfg.dma == -1 || cfg.irq == -1) {
+#endif
                printk(KERN_ERR "I/O, IRQ, and DMA are mandatory\n");
                return -EINVAL;
        }
 
+#if defined CONFIG_ISAPNP || defined CONFIG_ISAPNP_MODULE
+       if ((isapnp == 1) && !probe_gus_isapnp(&cfg)) {
+               return -ENODEV;
+       }
+#endif
+
 #ifdef CONFIG_SOUND_GUS16
        if (probe_gus_db16(&cfg) && gus16) {
                /* FIXME: This can't work, can it ? -- Christoph */
@@ -257,7 +348,10 @@
        }       
 #endif
        if (!probe_gus(&cfg))
+       {
+               printk(KERN_ERR "gus: debug: detection failed in probe_gus()\n");
                return -ENODEV;
+       }
        attach_gus(&cfg);
 
        return 0;
diff -u --recursive --new-file linux/Documentation/Configure.help 
linux-gus/Documentation/Configure.help
--- linux/Documentation/Configure.help  Sat Sep  9 17:48:46 2000
+++ linux-gus/Documentation/Configure.help      Sat Sep  9 18:28:39 2000
@@ -13719,11 +13719,35 @@
 Gravis Ultrasound support
 CONFIG_SOUND_GUS
   Say Y here for any type of Gravis Ultrasound card, including
-  the GUS or GUS MAX. See also Documentation/sound/ultrasound for
-  more information on configuring this card with modules.
+  the GUS, GUS MAX, GUS PnP, and compatibles.
+  
+  This includes the Gravis Ultrasound MAX, Gravis Ultrasound PnP,
+  Gravis Ultrasound PnP Pro, STB SoundRage 32, ExpertMedia MED-3210,
+  Core Dynamics Dynasonix Pro and Panasonic PCA761AW.
+  
+  See also Documentation/sound/ultrasound for
+  more information on configuring these cards with modules.
 
   If you compile the driver into the kernel, you have to add
   "gus=<io>,<irq>,<dma>,<dma2>" to the kernel command line.
+
+GUS MAX / PnP / compatibles support
+CONFIG_SOUND_GUSMAX
+  Say Y here to enable support for the GUS MAX, GUS PnP, and
+  compatibles, including cards based on the AMD Interwave chip.
+  
+  (That is, say no only if you have one of the original Gravis
+  Ultrasound cards)
+  
+  This includes the Gravis Ultrasound MAX, Gravis Ultrasound PnP,
+  Gravis Ultrasound PnP Pro, STB SoundRage 32, ExpertMedia MED-3210,
+  Core Dynamics Dynasonix Pro and Panasonic PCA761AW.
+  
+  If you want these to be autodetected (apart from the GUS MAX), you
+  also need to say Y or M to Plug And Play configuration ->
+  Plug and Play support -> ISA Plug and Play support.
+  
+  If unsure, say Y.
 
 MPU-401 support (NOT for SB16)
 CONFIG_SOUND_MPU401

Reply via email to