vserver 1.9.3
[linux-2.6.git] / sound / pci / trident / trident_main.c
index a72dee7..46d050d 100644 (file)
@@ -44,8 +44,6 @@
 
 #include <asm/io.h>
 
-#define chip_t trident_t
-
 static int snd_trident_pcm_mixer_build(trident_t *trident, snd_trident_voice_t * voice, snd_pcm_substream_t *substream);
 static int snd_trident_pcm_mixer_free(trident_t *trident, snd_trident_voice_t * voice, snd_pcm_substream_t *substream);
 static irqreturn_t snd_trident_interrupt(int irq, void *dev_id, struct pt_regs *regs);
@@ -119,7 +117,7 @@ static unsigned short snd_trident_codec_read(ac97_t *ac97, unsigned short reg)
        unsigned int data = 0, treg;
        unsigned short count = 0xffff;
        unsigned long flags;
-       trident_t *trident = snd_magic_cast(trident_t, ac97->private_data, return -ENXIO);
+       trident_t *trident = ac97->private_data;
 
        spin_lock_irqsave(&trident->reg_lock, flags);
        if (trident->device == TRIDENT_DEVICE_ID_DX) {
@@ -178,7 +176,7 @@ static void snd_trident_codec_write(ac97_t *ac97, unsigned short reg, unsigned s
        unsigned int address, data;
        unsigned short count = 0xffff;
        unsigned long flags;
-       trident_t *trident = snd_magic_cast(trident_t, ac97->private_data, return);
+       trident_t *trident = ac97->private_data;
 
        data = ((unsigned long) wdata) << 16;
 
@@ -908,7 +906,7 @@ static int snd_trident_playback_prepare(snd_pcm_substream_t * substream)
        snd_trident_voice_t *evoice = voice->extra;
        snd_trident_pcm_mixer_t *mix = &trident->pcm_mixer[substream->number];
 
-       spin_lock(&trident->reg_lock);  
+       spin_lock_irq(&trident->reg_lock);      
 
        /* set delta (rate) value */
        voice->Delta = snd_trident_convert_rate(runtime->rate);
@@ -969,7 +967,7 @@ static int snd_trident_playback_prepare(snd_pcm_substream_t * substream)
                evoice->ESO = (runtime->period_size * 2) - 1;
        }
 
-       spin_unlock(&trident->reg_lock);
+       spin_unlock_irq(&trident->reg_lock);
 
        return 0;
 }
@@ -1010,7 +1008,7 @@ static int snd_trident_capture_prepare(snd_pcm_substream_t * substream)
        snd_trident_voice_t *voice = (snd_trident_voice_t *) runtime->private_data;
        unsigned int val, ESO_bytes;
 
-       spin_lock(&trident->reg_lock);
+       spin_lock_irq(&trident->reg_lock);
 
        // Initilize the channel and set channel Mode
        outb(0, TRID_REG(trident, LEGACY_DMAR15));
@@ -1079,7 +1077,7 @@ static int snd_trident_capture_prepare(snd_pcm_substream_t * substream)
 
        snd_trident_write_voice_regs(trident, voice);
 
-       spin_unlock(&trident->reg_lock);
+       spin_unlock_irq(&trident->reg_lock);
        return 0;
 }
 
@@ -1150,7 +1148,7 @@ static int snd_trident_si7018_capture_prepare(snd_pcm_substream_t * substream)
        snd_trident_voice_t *voice = (snd_trident_voice_t *) runtime->private_data;
        snd_trident_voice_t *evoice = voice->extra;
 
-       spin_lock(&trident->reg_lock);
+       spin_lock_irq(&trident->reg_lock);
 
        voice->LBA = runtime->dma_addr;
        voice->Delta = snd_trident_convert_adc_rate(runtime->rate);
@@ -1199,7 +1197,7 @@ static int snd_trident_si7018_capture_prepare(snd_pcm_substream_t * substream)
                evoice->ESO = (runtime->period_size * 2) - 1;
        }
        
-       spin_unlock(&trident->reg_lock);
+       spin_unlock_irq(&trident->reg_lock);
        return 0;
 }
 
@@ -1221,7 +1219,7 @@ static int snd_trident_foldback_prepare(snd_pcm_substream_t * substream)
        snd_trident_voice_t *voice = (snd_trident_voice_t *) runtime->private_data;
        snd_trident_voice_t *evoice = voice->extra;
 
-       spin_lock(&trident->reg_lock);
+       spin_lock_irq(&trident->reg_lock);
 
        /* Set channel buffer Address */
        if (voice->memblk)
@@ -1276,7 +1274,7 @@ static int snd_trident_foldback_prepare(snd_pcm_substream_t * substream)
                evoice->ESO = (runtime->period_size * 2) - 1;
        }
 
-       spin_unlock(&trident->reg_lock);
+       spin_unlock_irq(&trident->reg_lock);
        return 0;
 }
 
@@ -1367,7 +1365,7 @@ static int snd_trident_spdif_prepare(snd_pcm_substream_t * substream)
        unsigned int RESO, LBAO;
        unsigned int temp;
 
-       spin_lock(&trident->reg_lock);
+       spin_lock_irq(&trident->reg_lock);
 
        if (trident->device != TRIDENT_DEVICE_ID_SI7018) {
 
@@ -1479,7 +1477,7 @@ static int snd_trident_spdif_prepare(snd_pcm_substream_t * substream)
                outl(temp, TRID_REG(trident, SI_SERIAL_INTF_CTRL));
        }
 
-       spin_unlock(&trident->reg_lock);
+       spin_unlock_irq(&trident->reg_lock);
 
        return 0;
 }
@@ -1526,7 +1524,7 @@ static int snd_trident_trigger(snd_pcm_substream_t *substream,
        val = inl(TRID_REG(trident, T4D_STIMER)) & 0x00ffffff;
        snd_pcm_group_for_each(pos, substream) {
                s = snd_pcm_group_substream_entry(pos);
-               if ((trident_t *) _snd_pcm_chip(s->pcm) == trident) {
+               if ((trident_t *) snd_pcm_substream_chip(s) == trident) {
                        voice = (snd_trident_voice_t *) s->runtime->private_data;
                        evoice = voice->extra;
                        what |= 1 << (voice->number & 0x1f);
@@ -2127,21 +2125,21 @@ static snd_pcm_ops_t snd_trident_spdif_7018_ops = {
   ---------------------------------------------------------------------------*/
 static void snd_trident_pcm_free(snd_pcm_t *pcm)
 {
-       trident_t *trident = snd_magic_cast(trident_t, pcm->private_data, return);
+       trident_t *trident = pcm->private_data;
        trident->pcm = NULL;
        snd_pcm_lib_preallocate_free_for_all(pcm);
 }
 
 static void snd_trident_foldback_pcm_free(snd_pcm_t *pcm)
 {
-       trident_t *trident = snd_magic_cast(trident_t, pcm->private_data, return);
+       trident_t *trident = pcm->private_data;
        trident->foldback = NULL;
        snd_pcm_lib_preallocate_free_for_all(pcm);
 }
 
 static void snd_trident_spdif_pcm_free(snd_pcm_t *pcm)
 {
-       trident_t *trident = snd_magic_cast(trident_t, pcm->private_data, return);
+       trident_t *trident = pcm->private_data;
        trident->spdif = NULL;
        snd_pcm_lib_preallocate_free_for_all(pcm);
 }
@@ -2324,13 +2322,12 @@ static int snd_trident_spdif_control_get(snd_kcontrol_t * kcontrol,
                                         snd_ctl_elem_value_t * ucontrol)
 {
        trident_t *trident = snd_kcontrol_chip(kcontrol);
-       unsigned long flags;
        unsigned char val;
 
-       spin_lock_irqsave(&trident->reg_lock, flags);
+       spin_lock_irq(&trident->reg_lock);
        val = trident->spdif_ctrl;
        ucontrol->value.integer.value[0] = val == kcontrol->private_value;
-       spin_unlock_irqrestore(&trident->reg_lock, flags);
+       spin_unlock_irq(&trident->reg_lock);
        return 0;
 }
 
@@ -2338,12 +2335,11 @@ static int snd_trident_spdif_control_put(snd_kcontrol_t * kcontrol,
                                         snd_ctl_elem_value_t * ucontrol)
 {
        trident_t *trident = snd_kcontrol_chip(kcontrol);
-       unsigned long flags;
        unsigned char val;
        int change;
 
        val = ucontrol->value.integer.value[0] ? (unsigned char) kcontrol->private_value : 0x00;
-       spin_lock_irqsave(&trident->reg_lock, flags);
+       spin_lock_irq(&trident->reg_lock);
        /* S/PDIF C Channel bits 0-31 : 48khz, SCMS disabled */
        change = trident->spdif_ctrl != val;
        trident->spdif_ctrl = val;
@@ -2362,7 +2358,7 @@ static int snd_trident_spdif_control_put(snd_kcontrol_t * kcontrol,
                        outl(temp, TRID_REG(trident, SI_SERIAL_INTF_CTRL));
                }
        }
-       spin_unlock_irqrestore(&trident->reg_lock, flags);
+       spin_unlock_irq(&trident->reg_lock);
        return change;
 }
 
@@ -2393,14 +2389,13 @@ static int snd_trident_spdif_default_get(snd_kcontrol_t * kcontrol,
                                         snd_ctl_elem_value_t * ucontrol)
 {
        trident_t *trident = snd_kcontrol_chip(kcontrol);
-       unsigned long flags;
 
-       spin_lock_irqsave(&trident->reg_lock, flags);
+       spin_lock_irq(&trident->reg_lock);
        ucontrol->value.iec958.status[0] = (trident->spdif_bits >> 0) & 0xff;
        ucontrol->value.iec958.status[1] = (trident->spdif_bits >> 8) & 0xff;
        ucontrol->value.iec958.status[2] = (trident->spdif_bits >> 16) & 0xff;
        ucontrol->value.iec958.status[3] = (trident->spdif_bits >> 24) & 0xff;
-       spin_unlock_irqrestore(&trident->reg_lock, flags);
+       spin_unlock_irq(&trident->reg_lock);
        return 0;
 }
 
@@ -2408,7 +2403,6 @@ static int snd_trident_spdif_default_put(snd_kcontrol_t * kcontrol,
                                         snd_ctl_elem_value_t * ucontrol)
 {
        trident_t *trident = snd_kcontrol_chip(kcontrol);
-       unsigned long flags;
        unsigned int val;
        int change;
 
@@ -2416,7 +2410,7 @@ static int snd_trident_spdif_default_put(snd_kcontrol_t * kcontrol,
              (ucontrol->value.iec958.status[1] << 8) |
              (ucontrol->value.iec958.status[2] << 16) |
              (ucontrol->value.iec958.status[3] << 24);
-       spin_lock_irqsave(&trident->reg_lock, flags);
+       spin_lock_irq(&trident->reg_lock);
        change = trident->spdif_bits != val;
        trident->spdif_bits = val;
        if (trident->device != TRIDENT_DEVICE_ID_SI7018) {
@@ -2426,7 +2420,7 @@ static int snd_trident_spdif_default_put(snd_kcontrol_t * kcontrol,
                if (trident->spdif == NULL)
                        outl(trident->spdif_bits, TRID_REG(trident, SI_SPDIF_CS));
        }
-       spin_unlock_irqrestore(&trident->reg_lock, flags);
+       spin_unlock_irq(&trident->reg_lock);
        return change;
 }
 
@@ -2488,14 +2482,13 @@ static int snd_trident_spdif_stream_get(snd_kcontrol_t * kcontrol,
                                        snd_ctl_elem_value_t * ucontrol)
 {
        trident_t *trident = snd_kcontrol_chip(kcontrol);
-       unsigned long flags;
 
-       spin_lock_irqsave(&trident->reg_lock, flags);
+       spin_lock_irq(&trident->reg_lock);
        ucontrol->value.iec958.status[0] = (trident->spdif_pcm_bits >> 0) & 0xff;
        ucontrol->value.iec958.status[1] = (trident->spdif_pcm_bits >> 8) & 0xff;
        ucontrol->value.iec958.status[2] = (trident->spdif_pcm_bits >> 16) & 0xff;
        ucontrol->value.iec958.status[3] = (trident->spdif_pcm_bits >> 24) & 0xff;
-       spin_unlock_irqrestore(&trident->reg_lock, flags);
+       spin_unlock_irq(&trident->reg_lock);
        return 0;
 }
 
@@ -2503,7 +2496,6 @@ static int snd_trident_spdif_stream_put(snd_kcontrol_t * kcontrol,
                                        snd_ctl_elem_value_t * ucontrol)
 {
        trident_t *trident = snd_kcontrol_chip(kcontrol);
-       unsigned long flags;
        unsigned int val;
        int change;
 
@@ -2511,7 +2503,7 @@ static int snd_trident_spdif_stream_put(snd_kcontrol_t * kcontrol,
              (ucontrol->value.iec958.status[1] << 8) |
              (ucontrol->value.iec958.status[2] << 16) |
              (ucontrol->value.iec958.status[3] << 24);
-       spin_lock_irqsave(&trident->reg_lock, flags);
+       spin_lock_irq(&trident->reg_lock);
        change = trident->spdif_pcm_bits != val;
        trident->spdif_pcm_bits = val;
        if (trident->spdif != NULL) {
@@ -2521,7 +2513,7 @@ static int snd_trident_spdif_stream_put(snd_kcontrol_t * kcontrol,
                        outl(trident->spdif_bits, TRID_REG(trident, SI_SPDIF_CS));
                }
        }
-       spin_unlock_irqrestore(&trident->reg_lock, flags);
+       spin_unlock_irq(&trident->reg_lock);
        return change;
 }
 
@@ -2554,13 +2546,12 @@ static int snd_trident_ac97_control_get(snd_kcontrol_t * kcontrol,
                                        snd_ctl_elem_value_t * ucontrol)
 {
        trident_t *trident = snd_kcontrol_chip(kcontrol);
-       unsigned long flags;
        unsigned char val;
 
-       spin_lock_irqsave(&trident->reg_lock, flags);
+       spin_lock_irq(&trident->reg_lock);
        val = trident->ac97_ctrl = inl(TRID_REG(trident, NX_ACR0_AC97_COM_STAT));
        ucontrol->value.integer.value[0] = (val & (1 << kcontrol->private_value)) ? 1 : 0;
-       spin_unlock_irqrestore(&trident->reg_lock, flags);
+       spin_unlock_irq(&trident->reg_lock);
        return 0;
 }
 
@@ -2568,11 +2559,10 @@ static int snd_trident_ac97_control_put(snd_kcontrol_t * kcontrol,
                                        snd_ctl_elem_value_t * ucontrol)
 {
        trident_t *trident = snd_kcontrol_chip(kcontrol);
-       unsigned long flags;
        unsigned char val;
        int change = 0;
 
-       spin_lock_irqsave(&trident->reg_lock, flags);
+       spin_lock_irq(&trident->reg_lock);
        val = trident->ac97_ctrl = inl(TRID_REG(trident, NX_ACR0_AC97_COM_STAT));
        val &= ~(1 << kcontrol->private_value);
        if (ucontrol->value.integer.value[0])
@@ -2580,7 +2570,7 @@ static int snd_trident_ac97_control_put(snd_kcontrol_t * kcontrol,
        change = val != trident->ac97_ctrl;
        trident->ac97_ctrl = val;
        outl(trident->ac97_ctrl = val, TRID_REG(trident, NX_ACR0_AC97_COM_STAT));
-       spin_unlock_irqrestore(&trident->reg_lock, flags);
+       spin_unlock_irq(&trident->reg_lock);
        return change;
 }
 
@@ -2624,19 +2614,18 @@ static int snd_trident_vol_control_get(snd_kcontrol_t * kcontrol,
 static int snd_trident_vol_control_put(snd_kcontrol_t * kcontrol,
                                       snd_ctl_elem_value_t * ucontrol)
 {
-       unsigned long flags;
        trident_t *trident = snd_kcontrol_chip(kcontrol);
        unsigned int val;
        int change = 0;
 
-       spin_lock_irqsave(&trident->reg_lock, flags);
+       spin_lock_irq(&trident->reg_lock);
        val = trident->musicvol_wavevol;
        val &= ~(0xffff << kcontrol->private_value);
        val |= ((255 - (ucontrol->value.integer.value[0] & 0xff)) |
                ((255 - (ucontrol->value.integer.value[1] & 0xff)) << 8)) << kcontrol->private_value;
        change = val != trident->musicvol_wavevol;
        outl(trident->musicvol_wavevol = val, TRID_REG(trident, T4D_MUSICVOL_WAVEVOL));
-       spin_unlock_irqrestore(&trident->reg_lock, flags);
+       spin_unlock_irq(&trident->reg_lock);
        return change;
 }
 
@@ -2696,7 +2685,6 @@ static int snd_trident_pcm_vol_control_get(snd_kcontrol_t * kcontrol,
 static int snd_trident_pcm_vol_control_put(snd_kcontrol_t * kcontrol,
                                           snd_ctl_elem_value_t * ucontrol)
 {
-       unsigned long flags;
        trident_t *trident = snd_kcontrol_chip(kcontrol);
        snd_trident_pcm_mixer_t *mix = &trident->pcm_mixer[snd_ctl_get_ioffnum(kcontrol, &ucontrol->id)];
        unsigned int val;
@@ -2707,12 +2695,12 @@ static int snd_trident_pcm_vol_control_put(snd_kcontrol_t * kcontrol,
        } else {
                val = (255 - (ucontrol->value.integer.value[0] & 255)) << 2;
        }
-       spin_lock_irqsave(&trident->reg_lock, flags);
+       spin_lock_irq(&trident->reg_lock);
        change = val != mix->vol;
        mix->vol = val;
        if (mix->voice != NULL)
                snd_trident_write_vol_reg(trident, mix->voice, val);
-       spin_unlock_irqrestore(&trident->reg_lock, flags);
+       spin_unlock_irq(&trident->reg_lock);
        return change;
 }
 
@@ -2760,7 +2748,6 @@ static int snd_trident_pcm_pan_control_get(snd_kcontrol_t * kcontrol,
 static int snd_trident_pcm_pan_control_put(snd_kcontrol_t * kcontrol,
                                           snd_ctl_elem_value_t * ucontrol)
 {
-       unsigned long flags;
        trident_t *trident = snd_kcontrol_chip(kcontrol);
        snd_trident_pcm_mixer_t *mix = &trident->pcm_mixer[snd_ctl_get_ioffnum(kcontrol, &ucontrol->id)];
        unsigned char val;
@@ -2770,12 +2757,12 @@ static int snd_trident_pcm_pan_control_put(snd_kcontrol_t * kcontrol,
                val = ucontrol->value.integer.value[0] & 0x3f;
        else
                val = (0x3f - (ucontrol->value.integer.value[0] & 0x3f)) | 0x40;
-       spin_lock_irqsave(&trident->reg_lock, flags);
+       spin_lock_irq(&trident->reg_lock);
        change = val != mix->pan;
        mix->pan = val;
        if (mix->voice != NULL)
                snd_trident_write_pan_reg(trident, mix->voice, val);
-       spin_unlock_irqrestore(&trident->reg_lock, flags);
+       spin_unlock_irq(&trident->reg_lock);
        return change;
 }
 
@@ -2818,19 +2805,18 @@ static int snd_trident_pcm_rvol_control_get(snd_kcontrol_t * kcontrol,
 static int snd_trident_pcm_rvol_control_put(snd_kcontrol_t * kcontrol,
                                            snd_ctl_elem_value_t * ucontrol)
 {
-       unsigned long flags;
        trident_t *trident = snd_kcontrol_chip(kcontrol);
        snd_trident_pcm_mixer_t *mix = &trident->pcm_mixer[snd_ctl_get_ioffnum(kcontrol, &ucontrol->id)];
        unsigned short val;
        int change = 0;
 
        val = 0x7f - (ucontrol->value.integer.value[0] & 0x7f);
-       spin_lock_irqsave(&trident->reg_lock, flags);
+       spin_lock_irq(&trident->reg_lock);
        change = val != mix->rvol;
        mix->rvol = val;
        if (mix->voice != NULL)
                snd_trident_write_rvol_reg(trident, mix->voice, val);
-       spin_unlock_irqrestore(&trident->reg_lock, flags);
+       spin_unlock_irq(&trident->reg_lock);
        return change;
 }
 
@@ -2873,19 +2859,18 @@ static int snd_trident_pcm_cvol_control_get(snd_kcontrol_t * kcontrol,
 static int snd_trident_pcm_cvol_control_put(snd_kcontrol_t * kcontrol,
                                            snd_ctl_elem_value_t * ucontrol)
 {
-       unsigned long flags;
        trident_t *trident = snd_kcontrol_chip(kcontrol);
        snd_trident_pcm_mixer_t *mix = &trident->pcm_mixer[snd_ctl_get_ioffnum(kcontrol, &ucontrol->id)];
        unsigned short val;
        int change = 0;
 
        val = 0x7f - (ucontrol->value.integer.value[0] & 0x7f);
-       spin_lock_irqsave(&trident->reg_lock, flags);
+       spin_lock_irq(&trident->reg_lock);
        change = val != mix->cvol;
        mix->cvol = val;
        if (mix->voice != NULL)
                snd_trident_write_cvol_reg(trident, mix->voice, val);
-       spin_unlock_irqrestore(&trident->reg_lock, flags);
+       spin_unlock_irq(&trident->reg_lock);
        return change;
 }
 
@@ -2961,21 +2946,21 @@ static int snd_trident_pcm_mixer_free(trident_t *trident, snd_trident_voice_t *v
 
 static int __devinit snd_trident_mixer(trident_t * trident, int pcm_spdif_device)
 {
-       ac97_bus_t _bus;
-       ac97_t _ac97;
+       ac97_template_t _ac97;
        snd_card_t * card = trident->card;
        snd_kcontrol_t *kctl;
        snd_ctl_elem_value_t *uctl;
        int idx, err, retries = 2;
+       static ac97_bus_ops_t ops = {
+               .write = snd_trident_codec_write,
+               .read = snd_trident_codec_read,
+       };
 
-       uctl = (snd_ctl_elem_value_t *)snd_kcalloc(sizeof(*uctl), GFP_KERNEL);
+       uctl = kcalloc(1, sizeof(*uctl), GFP_KERNEL);
        if (!uctl)
                return -ENOMEM;
 
-       memset(&_bus, 0, sizeof(_bus));
-       _bus.write = snd_trident_codec_write;
-       _bus.read = snd_trident_codec_read;
-       if ((err = snd_ac97_bus(trident->card, &_bus, &trident->ac97_bus)) < 0)
+       if ((err = snd_ac97_bus(trident->card, 0, &ops, NULL, &trident->ac97_bus)) < 0)
                goto __out;
 
        memset(&_ac97, 0, sizeof(_ac97));
@@ -3132,7 +3117,7 @@ static unsigned char snd_trident_gameport_read(struct gameport *gameport)
        trident_gameport_t *gp = (trident_gameport_t *)gameport;
        trident_t *chip;
        snd_assert(gp, return 0);
-       chip = snd_magic_cast(trident_t, gp->chip, return 0);
+       chip = gp->chip;
        return inb(TRID_REG(chip, GAMEPORT_LEGACY));
 }
 
@@ -3141,7 +3126,7 @@ static void snd_trident_gameport_trigger(struct gameport *gameport)
        trident_gameport_t *gp = (trident_gameport_t *)gameport;
        trident_t *chip;
        snd_assert(gp, return);
-       chip = snd_magic_cast(trident_t, gp->chip, return);
+       chip = gp->chip;
        outb(0xff, TRID_REG(chip, GAMEPORT_LEGACY));
 }
 
@@ -3152,7 +3137,7 @@ static int snd_trident_gameport_cooked_read(struct gameport *gameport, int *axes
        int i;
 
        snd_assert(gp, return 0);
-       chip = snd_magic_cast(trident_t, gp->chip, return 0);
+       chip = gp->chip;
 
        *buttons = (~inb(TRID_REG(chip, GAMEPORT_LEGACY)) >> 4) & 0xf;
 
@@ -3169,7 +3154,7 @@ static int snd_trident_gameport_open(struct gameport *gameport, int mode)
        trident_gameport_t *gp = (trident_gameport_t *)gameport;
        trident_t *chip;
        snd_assert(gp, return -1);
-       chip = snd_magic_cast(trident_t, gp->chip, return -1);
+       chip = gp->chip;
 
        switch (mode) {
                case GAMEPORT_MODE_COOKED:
@@ -3280,7 +3265,7 @@ static int snd_trident_sis_reset(trident_t *trident)
 static void snd_trident_proc_read(snd_info_entry_t *entry, 
                                  snd_info_buffer_t * buffer)
 {
-       trident_t *trident = snd_magic_cast(trident_t, entry->private_data, return);
+       trident_t *trident = entry->private_data;
        char *s;
 
        switch (trident->device) {
@@ -3331,7 +3316,7 @@ static void __devinit snd_trident_proc_init(trident_t * trident)
 
 static int snd_trident_dev_free(snd_device_t *device)
 {
-       trident_t *trident = snd_magic_cast(trident_t, device->device_data, return -ENXIO);
+       trident_t *trident = device->device_data;
        return snd_trident_free(trident);
 }
 
@@ -3354,7 +3339,8 @@ static int __devinit snd_trident_tlb_alloc(trident_t *trident)
        /* TLB array must be aligned to 16kB !!! so we allocate
           32kB region and correct offset when necessary */
 
-       if (snd_dma_alloc_pages(&trident->dma_dev, 2 * SNDRV_TRIDENT_MAX_PAGES * 4, &trident->tlb.buffer) < 0) {
+       if (snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV, snd_dma_pci_data(trident->pci),
+                               2 * SNDRV_TRIDENT_MAX_PAGES * 4, &trident->tlb.buffer) < 0) {
                snd_printk(KERN_ERR "trident: unable to allocate TLB buffer\n");
                return -ENOMEM;
        }
@@ -3367,7 +3353,8 @@ static int __devinit snd_trident_tlb_alloc(trident_t *trident)
                return -ENOMEM;
        }
        /* allocate and setup silent page and initialise TLB entries */
-       if (snd_dma_alloc_pages(&trident->dma_dev, SNDRV_TRIDENT_PAGE_SIZE, &trident->tlb.silent_page) < 0) {
+       if (snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV, snd_dma_pci_data(trident->pci),
+                               SNDRV_TRIDENT_PAGE_SIZE, &trident->tlb.silent_page) < 0) {
                snd_printk(KERN_ERR "trident: unable to allocate silent page\n");
                return -ENOMEM;
        }
@@ -3553,7 +3540,7 @@ int __devinit snd_trident_create(snd_card_t * card,
                return -ENXIO;
        }
        
-       trident = snd_magic_kcalloc(trident_t, 0, GFP_KERNEL);
+       trident = kcalloc(1, sizeof(*trident), GFP_KERNEL);
        if (trident == NULL)
                return -ENOMEM;
        trident->device = (pci->vendor << 16) | pci->device;
@@ -3570,18 +3557,17 @@ int __devinit snd_trident_create(snd_card_t * card,
        if (max_wavetable_size < 0 )
                max_wavetable_size = 0;
        trident->synth.max_size = max_wavetable_size * 1024;
-       trident->port = pci_resource_start(pci, 0);
        trident->irq = -1;
 
        trident->midi_port = TRID_REG(trident, T4D_MPU401_BASE);
        pci_set_master(pci);
-       trident->port = pci_resource_start(pci, 0);
 
-       if ((trident->res_port = request_region(trident->port, 0x100, "Trident Audio")) == NULL) {
-               snd_printk("unable to grab I/O region 0x%lx-0x%lx\n", trident->port, trident->port + 0x100 - 1);
-               snd_trident_free(trident);
-               return -EBUSY;
+       if ((err = pci_request_regions(pci, "Trident Audio")) < 0) {
+               kfree(trident);
+               return err;
        }
+       trident->port = pci_resource_start(pci, 0);
+
        if (request_irq(pci->irq, snd_trident_interrupt, SA_INTERRUPT|SA_SHIRQ, "Trident Audio", (void *) trident)) {
                snd_printk("unable to grab IRQ %d\n", pci->irq);
                snd_trident_free(trident);
@@ -3589,10 +3575,6 @@ int __devinit snd_trident_create(snd_card_t * card,
        }
        trident->irq = pci->irq;
 
-       memset(&trident->dma_dev, 0, sizeof(trident->dma_dev));
-       trident->dma_dev.type = SNDRV_DMA_TYPE_DEV;
-       trident->dma_dev.dev = snd_dma_pci_data(pci);
-
        /* allocate 16k-aligned TLB for NX cards */
        trident->tlb.entries = NULL;
        trident->tlb.buffer.area = NULL;
@@ -3692,18 +3674,15 @@ int snd_trident_free(trident_t *trident)
                if (trident->tlb.memhdr)
                        snd_util_memhdr_free(trident->tlb.memhdr);
                if (trident->tlb.silent_page.area)
-                       snd_dma_free_pages(&trident->dma_dev, &trident->tlb.silent_page);
+                       snd_dma_free_pages(&trident->tlb.silent_page);
                if (trident->tlb.shadow_entries)
                        vfree(trident->tlb.shadow_entries);
-               snd_dma_free_pages(&trident->dma_dev, &trident->tlb.buffer);
+               snd_dma_free_pages(&trident->tlb.buffer);
        }
        if (trident->irq >= 0)
                free_irq(trident->irq, (void *)trident);
-       if (trident->res_port) {
-               release_resource(trident->res_port);
-               kfree_nocheck(trident->res_port);
-       }
-       snd_magic_kfree(trident);
+       pci_release_regions(trident->pci);
+       kfree(trident);
        return 0;
 }
 
@@ -3727,7 +3706,7 @@ int snd_trident_free(trident_t *trident)
 
 static irqreturn_t snd_trident_interrupt(int irq, void *dev_id, struct pt_regs *regs)
 {
-       trident_t *trident = snd_magic_cast(trident_t, dev_id, return IRQ_NONE);
+       trident_t *trident = dev_id;
        unsigned int audio_int, chn_int, stimer, channel, mask, tmp;
        int delta;
        snd_trident_voice_t *voice;
@@ -3950,7 +3929,7 @@ void snd_trident_clear_voices(trident_t * trident, unsigned short v_min, unsigne
 #ifdef CONFIG_PM
 static int snd_trident_suspend(snd_card_t *card, unsigned int state)
 {
-       trident_t *trident = snd_magic_cast(trident_t, card->pm_private_data, return -EINVAL);
+       trident_t *trident = card->pm_private_data;
 
        trident->in_suspend = 1;
        snd_pcm_suspend_all(trident->pcm);
@@ -3976,7 +3955,7 @@ static int snd_trident_suspend(snd_card_t *card, unsigned int state)
 
 static int snd_trident_resume(snd_card_t *card, unsigned int state)
 {
-       trident_t *trident = snd_magic_cast(trident_t, card->pm_private_data, return -EINVAL);
+       trident_t *trident = card->pm_private_data;
 
        pci_enable_device(trident->pci);
        if (pci_set_dma_mask(trident->pci, 0x3fffffff) < 0 ||