]> err.no Git - linux-2.6/blobdiff - sound/oss/sonicvibes.c
Merge master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6
[linux-2.6] / sound / oss / sonicvibes.c
index e1d69611a25736b82de23f0ab24605e491aa34ab..17d0e461f8d862dcc8b331389b67941feb7f6db7 100644 (file)
 
 #include "dm.h"
 
+#if defined(CONFIG_GAMEPORT) || (defined(MODULE) && defined(CONFIG_GAMEPORT_MODULE))
+#define SUPPORT_JOYSTICK 1
+#endif
 
 /* --------------------------------------------------------------------- */
 
@@ -365,7 +368,9 @@ struct sv_state {
                unsigned char obuf[MIDIOUTBUF];
        } midi;
 
+#if SUPPORT_JOYSTICK
        struct gameport *gameport;
+#endif
 };
 
 /* --------------------------------------------------------------------- */
@@ -1149,7 +1154,7 @@ static int mixer_ioctl(struct sv_state *s, unsigned int cmd, unsigned long arg)
                        if (mixtable[i].rec)
                                break;
                }
-               if (!mixtable[i].rec)
+               if (i == SOUND_MIXER_NRDEVICES)
                        return 0;
                spin_lock_irqsave(&s->lock, flags);
                frobindir(s, SV_CIMIX_ADCINL, 0x1f, mixtable[i].rec << 5);
@@ -2485,6 +2490,7 @@ static struct initvol {
 #define RSRCISIOREGION(dev,num) (pci_resource_start((dev), (num)) != 0 && \
                                 (pci_resource_flags((dev), (num)) & IORESOURCE_IO))
 
+#ifdef SUPPORT_JOYSTICK
 static int __devinit sv_register_gameport(struct sv_state *s, int io_port)
 {
        struct gameport *gp;
@@ -2511,6 +2517,19 @@ static int __devinit sv_register_gameport(struct sv_state *s, int io_port)
        return 0;
 }
 
+static inline void sv_unregister_gameport(struct sv_state *s)
+{
+       if (s->gameport) {
+               int gpio = s->gameport->io;
+               gameport_unregister_port(s->gameport);
+               release_region(gpio, SV_EXTENT_GAME);
+       }
+}
+#else
+static inline int sv_register_gameport(struct sv_state *s, int io_port) { return -ENOSYS; }
+static inline void sv_unregister_gameport(struct sv_state *s) { }
+#endif /* SUPPORT_JOYSTICK */
+
 static int __devinit sv_probe(struct pci_dev *pcidev, const struct pci_device_id *pciid)
 {
        static char __devinitdata sv_ddma_name[] = "S3 Inc. SonicVibes DDMA Controller";
@@ -2711,11 +2730,7 @@ static void __devexit sv_remove(struct pci_dev *dev)
        /*outb(0, s->iodmaa + SV_DMA_RESET);*/
        /*outb(0, s->iodmac + SV_DMA_RESET);*/
        free_irq(s->irq, s);
-       if (s->gameport) {
-               int gpio = s->gameport->io;
-               gameport_unregister_port(s->gameport);
-               release_region(gpio, SV_EXTENT_GAME);
-       }
+       sv_unregister_gameport(s);
        release_region(s->iodmac, SV_EXTENT_DMA);
        release_region(s->iodmaa, SV_EXTENT_DMA);
        release_region(s->ioenh, SV_EXTENT_ENH);