X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;ds=sidebyside;f=sound%2Fpci%2Frme32.c;h=a5ed64c368b8798373272203e091baf52decfc5a;hb=6a77f38946aaee1cd85eeec6cf4229b204c15071;hp=ddc8695cbb74e22401454e8487106dae91a713b0;hpb=87fc8d1bb10cd459024a742c6a10961fefcef18f;p=linux-2.6.git diff --git a/sound/pci/rme32.c b/sound/pci/rme32.c index ddc8695cb..a5ed64c36 100644 --- a/sound/pci/rme32.c +++ b/sound/pci/rme32.c @@ -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 , Pilo Chambert "); 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;