vserver 1.9.5.x5
[linux-2.6.git] / sound / pci / rme32.c
index ddc8695..a5ed64c 100644 (file)
@@ -92,15 +92,14 @@ static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX;  /* Index 0-MAX */
 static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR;      /* ID for this card */
 static int enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP;     /* Enable this card */
 static int fullduplex[SNDRV_CARDS]; // = {[0 ... (SNDRV_CARDS - 1)] = 1};
-static int boot_devs;
 
-module_param_array(index, int, boot_devs, 0444);
+module_param_array(index, int, NULL, 0444);
 MODULE_PARM_DESC(index, "Index value for RME Digi32 soundcard.");
-module_param_array(id, charp, boot_devs, 0444);
+module_param_array(id, charp, NULL, 0444);
 MODULE_PARM_DESC(id, "ID string for RME Digi32 soundcard.");
-module_param_array(enable, bool, boot_devs, 0444);
+module_param_array(enable, bool, NULL, 0444);
 MODULE_PARM_DESC(enable, "Enable RME Digi32 soundcard.");
-module_param_array(fullduplex, bool, boot_devs, 0444);
+module_param_array(fullduplex, bool, NULL, 0444);
 MODULE_PARM_DESC(fullduplex, "Support full-duplex mode.");
 MODULE_AUTHOR("Martin Langer <martin-langer@gmx.de>, Pilo Chambert <pilo.c@wanadoo.fr>");
 MODULE_DESCRIPTION("RME Digi32, Digi32/8, Digi32 PRO");
@@ -211,7 +210,7 @@ typedef struct snd_rme32 {
        spinlock_t lock;
        int irq;
        unsigned long port;
-       unsigned long iobase;
+       void __iomem *iobase;
 
        u32 wcreg;              /* cached write control register value */
        u32 wcreg_spdif;        /* S/PDIF setup */
@@ -726,9 +725,8 @@ snd_rme32_playback_hw_params(snd_pcm_substream_t * substream,
        /* S/PDIF setup */
        if ((rme32->wcreg & RME32_WCR_ADAT) == 0) {
                rme32->wcreg &= ~(RME32_WCR_PRO | RME32_WCR_EMP);
-               writel(rme32->wcreg |=
-                      rme32->wcreg_spdif_stream,
-                      rme32->iobase + RME32_IO_CONTROL_REGISTER);
+               rme32->wcreg |= rme32->wcreg_spdif_stream;
+               writel(rme32->wcreg, rme32->iobase + RME32_IO_CONTROL_REGISTER);
        }
        spin_unlock_irq(&rme32->lock);
 
@@ -1124,7 +1122,7 @@ snd_rme32_pcm_trigger(snd_pcm_substream_t * substream, int cmd)
        }
        
        /* prefill playback buffer */
-       if (cmd == SNDRV_PCM_TRIGGER_START) {
+       if (cmd == SNDRV_PCM_TRIGGER_START && rme32->fullduplex_mode) {
                snd_pcm_group_for_each(pos, substream) {
                        s = snd_pcm_group_substream_entry(pos);
                        if (s == rme32->playback_substream) {
@@ -1345,13 +1343,14 @@ static void snd_rme32_free(void *private_data)
                rme32->irq = -1;
        }
        if (rme32->iobase) {
-               iounmap((void *) rme32->iobase);
-               rme32->iobase = 0;
+               iounmap(rme32->iobase);
+               rme32->iobase = NULL;
        }
        if (rme32->port) {
                pci_release_regions(rme32->pci);
                rme32->port = 0;
        }
+       pci_disable_device(rme32->pci);
 }
 
 static void snd_rme32_free_spdif_pcm(snd_pcm_t * pcm)
@@ -1388,7 +1387,7 @@ static int __devinit snd_rme32_create(rme32_t * rme32)
        }
        rme32->irq = pci->irq;
 
-       if ((rme32->iobase = (unsigned long) ioremap_nocache(rme32->port, RME32_IO_SIZE)) == 0) {
+       if ((rme32->iobase = ioremap_nocache(rme32->port, RME32_IO_SIZE)) == 0) {
                snd_printk("unable to remap memory region 0x%lx-0x%lx\n",
                           rme32->port, rme32->port + RME32_IO_SIZE - 1);
                return -ENOMEM;
@@ -1637,8 +1636,8 @@ snd_rme32_put_loopback_control(snd_kcontrol_t * kcontrol,
                val &= ~RME32_WCR_MUTE;
        else
                val |= RME32_WCR_MUTE;
-       writel(rme32->wcreg =
-              val, rme32->iobase + RME32_IO_CONTROL_REGISTER);
+       rme32->wcreg = val;
+       writel(val, rme32->iobase + RME32_IO_CONTROL_REGISTER);
        spin_unlock_irq(&rme32->lock);
        return change;
 }
@@ -1862,7 +1861,8 @@ static int snd_rme32_control_spdif_stream_put(snd_kcontrol_t * kcontrol,
        change = val != rme32->wcreg_spdif_stream;
        rme32->wcreg_spdif_stream = val;
        rme32->wcreg &= ~(RME32_WCR_PRO | RME32_WCR_EMP);
-       writel(rme32->wcreg |= val, rme32->iobase + RME32_IO_CONTROL_REGISTER);
+       rme32->wcreg |= val;
+       writel(rme32->wcreg, rme32->iobase + RME32_IO_CONTROL_REGISTER);
        spin_unlock_irq(&rme32->lock);
        return change;
 }
@@ -1916,21 +1916,21 @@ static snd_kcontrol_new_t snd_rme32_controls[] = {
                .private_value = IEC958_AES0_PROFESSIONAL | IEC958_AES0_PRO_EMPHASIS
        },
        {
-               .iface = SNDRV_CTL_ELEM_IFACE_PCM,
+               .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
                .name = "Input Connector",
                .info = snd_rme32_info_inputtype_control,
                .get =  snd_rme32_get_inputtype_control,
                .put =  snd_rme32_put_inputtype_control
        },
        {
-               .iface = SNDRV_CTL_ELEM_IFACE_PCM,
+               .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
                .name = "Loopback Input",
                .info = snd_rme32_info_loopback_control,
                .get =  snd_rme32_get_loopback_control,
                .put =  snd_rme32_put_loopback_control
        },
        {
-               .iface = SNDRV_CTL_ELEM_IFACE_PCM,
+               .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
                .name = "Sample Clock Source",
                .info = snd_rme32_info_clockmode_control,
                .get =  snd_rme32_get_clockmode_control,
@@ -1970,16 +1970,14 @@ snd_rme32_probe(struct pci_dev *pci, const struct pci_device_id *pci_id)
        snd_card_t *card;
        int err;
 
-       for (; dev < SNDRV_CARDS; dev++) {
-               if (!enable[dev]) {
-                       dev++;
-                       return -ENOENT;
-               }
-               break;
-       }
        if (dev >= SNDRV_CARDS) {
                return -ENODEV;
        }
+       if (!enable[dev]) {
+               dev++;
+               return -ENOENT;
+       }
+
        if ((card = snd_card_new(index[dev], id[dev], THIS_MODULE,
                                 sizeof(rme32_t))) == NULL)
                return -ENOMEM;