Lines Matching refs:trident

34 static int snd_trident_pcm_mixer_build(struct snd_trident *trident,
37 static int snd_trident_pcm_mixer_free(struct snd_trident *trident,
41 static int snd_trident_sis_reset(struct snd_trident *trident);
43 static void snd_trident_clear_voices(struct snd_trident * trident,
45 static int snd_trident_free(struct snd_trident *trident);
53 static void snd_trident_print_voice_regs(struct snd_trident *trident, int voice)
57 dev_dbg(trident->card->dev, "Trident voice %i:\n", voice);
58 outb(voice, TRID_REG(trident, T4D_LFO_GC_CIR));
59 val = inl(TRID_REG(trident, CH_LBA));
60 dev_dbg(trident->card->dev, "LBA: 0x%x\n", val);
61 val = inl(TRID_REG(trident, CH_GVSEL_PAN_VOL_CTRL_EC));
62 dev_dbg(trident->card->dev, "GVSel: %i\n", val >> 31);
63 dev_dbg(trident->card->dev, "Pan: 0x%x\n", (val >> 24) & 0x7f);
64 dev_dbg(trident->card->dev, "Vol: 0x%x\n", (val >> 16) & 0xff);
65 dev_dbg(trident->card->dev, "CTRL: 0x%x\n", (val >> 12) & 0x0f);
66 dev_dbg(trident->card->dev, "EC: 0x%x\n", val & 0x0fff);
67 if (trident->device != TRIDENT_DEVICE_ID_NX) {
68 val = inl(TRID_REG(trident, CH_DX_CSO_ALPHA_FMS));
69 dev_dbg(trident->card->dev, "CSO: 0x%x\n", val >> 16);
70 dev_dbg(trident->card->dev, "Alpha: 0x%x\n", (val >> 4) & 0x0fff);
71 dev_dbg(trident->card->dev, "FMS: 0x%x\n", val & 0x0f);
72 val = inl(TRID_REG(trident, CH_DX_ESO_DELTA));
73 dev_dbg(trident->card->dev, "ESO: 0x%x\n", val >> 16);
74 dev_dbg(trident->card->dev, "Delta: 0x%x\n", val & 0xffff);
75 val = inl(TRID_REG(trident, CH_DX_FMC_RVOL_CVOL));
77 val = inl(TRID_REG(trident, CH_NX_DELTA_CSO));
79 dev_dbg(trident->card->dev, "CSO: 0x%x\n", val & 0x00ffffff);
80 val = inl(TRID_REG(trident, CH_NX_DELTA_ESO));
82 dev_dbg(trident->card->dev, "Delta: 0x%x\n", tmp);
83 dev_dbg(trident->card->dev, "ESO: 0x%x\n", val & 0x00ffffff);
84 val = inl(TRID_REG(trident, CH_NX_ALPHA_FMS_FMC_RVOL_CVOL));
85 dev_dbg(trident->card->dev, "Alpha: 0x%x\n", val >> 20);
86 dev_dbg(trident->card->dev, "FMS: 0x%x\n", (val >> 16) & 0x0f);
88 dev_dbg(trident->card->dev, "FMC: 0x%x\n", (val >> 14) & 3);
89 dev_dbg(trident->card->dev, "RVol: 0x%x\n", (val >> 7) & 0x7f);
90 dev_dbg(trident->card->dev, "CVol: 0x%x\n", val & 0x7f);
111 struct snd_trident *trident = ac97->private_data; in snd_trident_codec_read() local
113 spin_lock_irqsave(&trident->reg_lock, flags); in snd_trident_codec_read()
114 if (trident->device == TRIDENT_DEVICE_ID_DX) { in snd_trident_codec_read()
116 outl(data, TRID_REG(trident, DX_ACR1_AC97_R)); in snd_trident_codec_read()
118 data = inl(TRID_REG(trident, DX_ACR1_AC97_R)); in snd_trident_codec_read()
122 } else if (trident->device == TRIDENT_DEVICE_ID_NX) { in snd_trident_codec_read()
125 outl(data, TRID_REG(trident, treg)); in snd_trident_codec_read()
127 data = inl(TRID_REG(trident, treg)); in snd_trident_codec_read()
131 } else if (trident->device == TRIDENT_DEVICE_ID_SI7018) { in snd_trident_codec_read()
135 outl(data, TRID_REG(trident, SI_AC97_READ)); in snd_trident_codec_read()
137 data = inl(TRID_REG(trident, SI_AC97_READ)); in snd_trident_codec_read()
143 if (count == 0 && !trident->ac97_detect) { in snd_trident_codec_read()
144 dev_err(trident->card->dev, in snd_trident_codec_read()
150 spin_unlock_irqrestore(&trident->reg_lock, flags); in snd_trident_codec_read()
174 struct snd_trident *trident = ac97->private_data; in snd_trident_codec_write() local
178 spin_lock_irqsave(&trident->reg_lock, flags); in snd_trident_codec_write()
179 if (trident->device == TRIDENT_DEVICE_ID_DX) { in snd_trident_codec_write()
184 if ((inw(TRID_REG(trident, address)) & DX_AC97_BUSY_WRITE) == 0) in snd_trident_codec_write()
189 } else if (trident->device == TRIDENT_DEVICE_ID_NX) { in snd_trident_codec_write()
194 if ((inw(TRID_REG(trident, address)) & NX_AC97_BUSY_WRITE) == 0) in snd_trident_codec_write()
199 } else if (trident->device == TRIDENT_DEVICE_ID_SI7018) { in snd_trident_codec_write()
204 if ((inw(TRID_REG(trident, address)) & (SI_AC97_BUSY_WRITE)) == 0) in snd_trident_codec_write()
217 spin_unlock_irqrestore(&trident->reg_lock, flags); in snd_trident_codec_write()
220 outl(data, TRID_REG(trident, address)); in snd_trident_codec_write()
221 spin_unlock_irqrestore(&trident->reg_lock, flags); in snd_trident_codec_write()
236 static void snd_trident_enable_eso(struct snd_trident * trident) in snd_trident_enable_eso() argument
240 val = inl(TRID_REG(trident, T4D_LFO_GC_CIR)); in snd_trident_enable_eso()
243 if (trident->device == TRIDENT_DEVICE_ID_SI7018) in snd_trident_enable_eso()
245 outl(val, TRID_REG(trident, T4D_LFO_GC_CIR)); in snd_trident_enable_eso()
263 static void snd_trident_disable_eso(struct snd_trident * trident) in snd_trident_disable_eso() argument
267 tmp = inl(TRID_REG(trident, T4D_LFO_GC_CIR)); in snd_trident_disable_eso()
270 outl(tmp, TRID_REG(trident, T4D_LFO_GC_CIR)); in snd_trident_disable_eso()
287 void snd_trident_start_voice(struct snd_trident * trident, unsigned int voice) in snd_trident_start_voice() argument
292 outl(mask, TRID_REG(trident, reg)); in snd_trident_start_voice()
311 void snd_trident_stop_voice(struct snd_trident * trident, unsigned int voice) in snd_trident_stop_voice() argument
316 outl(mask, TRID_REG(trident, reg)); in snd_trident_stop_voice()
332 static int snd_trident_allocate_pcm_channel(struct snd_trident * trident) in snd_trident_allocate_pcm_channel() argument
336 if (trident->ChanPCMcnt >= trident->ChanPCM) in snd_trident_allocate_pcm_channel()
339 if (!(trident->ChanMap[T4D_BANK_B] & (1 << idx))) { in snd_trident_allocate_pcm_channel()
340 trident->ChanMap[T4D_BANK_B] |= 1 << idx; in snd_trident_allocate_pcm_channel()
341 trident->ChanPCMcnt++; in snd_trident_allocate_pcm_channel()
360 static void snd_trident_free_pcm_channel(struct snd_trident *trident, int channel) in snd_trident_free_pcm_channel() argument
365 if (trident->ChanMap[T4D_BANK_B] & (1 << channel)) { in snd_trident_free_pcm_channel()
366 trident->ChanMap[T4D_BANK_B] &= ~(1 << channel); in snd_trident_free_pcm_channel()
367 trident->ChanPCMcnt--; in snd_trident_free_pcm_channel()
382 static int snd_trident_allocate_synth_channel(struct snd_trident * trident) in snd_trident_allocate_synth_channel() argument
387 if (!(trident->ChanMap[T4D_BANK_A] & (1 << idx))) { in snd_trident_allocate_synth_channel()
388 trident->ChanMap[T4D_BANK_A] |= 1 << idx; in snd_trident_allocate_synth_channel()
389 trident->synth.ChanSynthCount++; in snd_trident_allocate_synth_channel()
408 static void snd_trident_free_synth_channel(struct snd_trident *trident, int channel) in snd_trident_free_synth_channel() argument
413 if (trident->ChanMap[T4D_BANK_A] & (1 << channel)) { in snd_trident_free_synth_channel()
414 trident->ChanMap[T4D_BANK_A] &= ~(1 << channel); in snd_trident_free_synth_channel()
415 trident->synth.ChanSynthCount--; in snd_trident_free_synth_channel()
431 void snd_trident_write_voice_regs(struct snd_trident * trident, in snd_trident_write_voice_regs() argument
445 switch (trident->device) { in snd_trident_write_voice_regs()
478 outb(voice->number, TRID_REG(trident, T4D_LFO_GC_CIR)); in snd_trident_write_voice_regs()
479 outl(regs[0], TRID_REG(trident, CH_START + 0)); in snd_trident_write_voice_regs()
480 outl(regs[1], TRID_REG(trident, CH_START + 4)); in snd_trident_write_voice_regs()
481 outl(regs[2], TRID_REG(trident, CH_START + 8)); in snd_trident_write_voice_regs()
482 outl(regs[3], TRID_REG(trident, CH_START + 12)); in snd_trident_write_voice_regs()
483 outl(regs[4], TRID_REG(trident, CH_START + 16)); in snd_trident_write_voice_regs()
486 dev_dbg(trident->card->dev, "written %i channel:\n", voice->number); in snd_trident_write_voice_regs()
487 dev_dbg(trident->card->dev, " regs[0] = 0x%x/0x%x\n", in snd_trident_write_voice_regs()
488 regs[0], inl(TRID_REG(trident, CH_START + 0))); in snd_trident_write_voice_regs()
489 dev_dbg(trident->card->dev, " regs[1] = 0x%x/0x%x\n", in snd_trident_write_voice_regs()
490 regs[1], inl(TRID_REG(trident, CH_START + 4))); in snd_trident_write_voice_regs()
491 dev_dbg(trident->card->dev, " regs[2] = 0x%x/0x%x\n", in snd_trident_write_voice_regs()
492 regs[2], inl(TRID_REG(trident, CH_START + 8))); in snd_trident_write_voice_regs()
493 dev_dbg(trident->card->dev, " regs[3] = 0x%x/0x%x\n", in snd_trident_write_voice_regs()
494 regs[3], inl(TRID_REG(trident, CH_START + 12))); in snd_trident_write_voice_regs()
495 dev_dbg(trident->card->dev, " regs[4] = 0x%x/0x%x\n", in snd_trident_write_voice_regs()
496 regs[4], inl(TRID_REG(trident, CH_START + 16))); in snd_trident_write_voice_regs()
514 static void snd_trident_write_cso_reg(struct snd_trident * trident, in snd_trident_write_cso_reg() argument
519 outb(voice->number, TRID_REG(trident, T4D_LFO_GC_CIR)); in snd_trident_write_cso_reg()
520 if (trident->device != TRIDENT_DEVICE_ID_NX) { in snd_trident_write_cso_reg()
521 outw(voice->CSO, TRID_REG(trident, CH_DX_CSO_ALPHA_FMS) + 2); in snd_trident_write_cso_reg()
524 (voice->CSO & 0x00ffffff), TRID_REG(trident, CH_NX_DELTA_CSO)); in snd_trident_write_cso_reg()
540 static void snd_trident_write_eso_reg(struct snd_trident * trident, in snd_trident_write_eso_reg() argument
545 outb(voice->number, TRID_REG(trident, T4D_LFO_GC_CIR)); in snd_trident_write_eso_reg()
546 if (trident->device != TRIDENT_DEVICE_ID_NX) { in snd_trident_write_eso_reg()
547 outw(voice->ESO, TRID_REG(trident, CH_DX_ESO_DELTA) + 2); in snd_trident_write_eso_reg()
550 TRID_REG(trident, CH_NX_DELTA_ESO)); in snd_trident_write_eso_reg()
566 static void snd_trident_write_vol_reg(struct snd_trident * trident, in snd_trident_write_vol_reg() argument
571 outb(voice->number, TRID_REG(trident, T4D_LFO_GC_CIR)); in snd_trident_write_vol_reg()
572 switch (trident->device) { in snd_trident_write_vol_reg()
575 outb(voice->Vol >> 2, TRID_REG(trident, CH_GVSEL_PAN_VOL_CTRL_EC + 2)); in snd_trident_write_vol_reg()
580 TRID_REG(trident, CH_GVSEL_PAN_VOL_CTRL_EC)); in snd_trident_write_vol_reg()
597 static void snd_trident_write_pan_reg(struct snd_trident * trident, in snd_trident_write_pan_reg() argument
602 outb(voice->number, TRID_REG(trident, T4D_LFO_GC_CIR)); in snd_trident_write_pan_reg()
604 TRID_REG(trident, CH_GVSEL_PAN_VOL_CTRL_EC + 3)); in snd_trident_write_pan_reg()
619 static void snd_trident_write_rvol_reg(struct snd_trident * trident, in snd_trident_write_rvol_reg() argument
624 outb(voice->number, TRID_REG(trident, T4D_LFO_GC_CIR)); in snd_trident_write_rvol_reg()
627 TRID_REG(trident, trident->device == TRIDENT_DEVICE_ID_NX ? in snd_trident_write_rvol_reg()
643 static void snd_trident_write_cvol_reg(struct snd_trident * trident, in snd_trident_write_cvol_reg() argument
648 outb(voice->number, TRID_REG(trident, T4D_LFO_GC_CIR)); in snd_trident_write_cvol_reg()
651 TRID_REG(trident, trident->device == TRIDENT_DEVICE_ID_NX ? in snd_trident_write_cvol_reg()
785 struct snd_trident *trident = snd_pcm_substream_chip(substream); in snd_trident_allocate_pcm_mem() local
789 if (trident->tlb.entries) { in snd_trident_allocate_pcm_mem()
792 snd_trident_free_pages(trident, voice->memblk); in snd_trident_allocate_pcm_mem()
793 voice->memblk = snd_trident_alloc_pages(trident, substream); in snd_trident_allocate_pcm_mem()
816 struct snd_trident *trident = snd_pcm_substream_chip(substream); in snd_trident_allocate_evoice() local
825 evoice = snd_trident_alloc_voice(trident, SNDRV_TRIDENT_VOICE_TYPE_PCM, 0, 0); in snd_trident_allocate_evoice()
833 snd_trident_free_voice(trident, evoice); in snd_trident_allocate_evoice()
877 struct snd_trident *trident = snd_pcm_substream_chip(substream); in snd_trident_hw_free() local
882 if (trident->tlb.entries) { in snd_trident_hw_free()
884 snd_trident_free_pages(trident, voice->memblk); in snd_trident_hw_free()
889 snd_trident_free_voice(trident, evoice); in snd_trident_hw_free()
908 struct snd_trident *trident = snd_pcm_substream_chip(substream); in snd_trident_playback_prepare() local
912 struct snd_trident_pcm_mixer *mix = &trident->pcm_mixer[substream->number]; in snd_trident_playback_prepare()
914 spin_lock_irq(&trident->reg_lock); in snd_trident_playback_prepare()
946 snd_trident_write_voice_regs(trident, voice); in snd_trident_playback_prepare()
956 evoice->GVSel = trident->device == TRIDENT_DEVICE_ID_SI7018 ? 0 : 1; in snd_trident_playback_prepare()
969 snd_trident_write_voice_regs(trident, evoice); in snd_trident_playback_prepare()
975 spin_unlock_irq(&trident->reg_lock); in snd_trident_playback_prepare()
1011 struct snd_trident *trident = snd_pcm_substream_chip(substream); in snd_trident_capture_prepare() local
1016 spin_lock_irq(&trident->reg_lock); in snd_trident_capture_prepare()
1019 outb(0, TRID_REG(trident, LEGACY_DMAR15)); in snd_trident_capture_prepare()
1022 outb(0x54, TRID_REG(trident, LEGACY_DMAR11)); in snd_trident_capture_prepare()
1026 outl(voice->LBA, TRID_REG(trident, LEGACY_DMAR0)); in snd_trident_capture_prepare()
1032 outb((ESO_bytes & 0x00ff0000) >> 16, TRID_REG(trident, LEGACY_DMAR6)); in snd_trident_capture_prepare()
1033 outw((ESO_bytes & 0x0000ffff), TRID_REG(trident, LEGACY_DMAR4)); in snd_trident_capture_prepare()
1038 outw(val, TRID_REG(trident, T4D_SBDELTA_DELTA_R)); in snd_trident_capture_prepare()
1047 outl((val << 16) | val, TRID_REG(trident, T4D_SBBL_SBCL)); in snd_trident_capture_prepare()
1051 trident->bDMAStart = 0x19; // 0001 1001b in snd_trident_capture_prepare()
1054 trident->bDMAStart |= 0x80; in snd_trident_capture_prepare()
1056 trident->bDMAStart |= 0x20; in snd_trident_capture_prepare()
1058 trident->bDMAStart |= 0x40; in snd_trident_capture_prepare()
1083 snd_trident_write_voice_regs(trident, voice); in snd_trident_capture_prepare()
1085 spin_unlock_irq(&trident->reg_lock); in snd_trident_capture_prepare()
1120 struct snd_trident *trident = snd_pcm_substream_chip(substream); in snd_trident_si7018_capture_hw_free() local
1126 snd_trident_free_voice(trident, evoice); in snd_trident_si7018_capture_hw_free()
1145 struct snd_trident *trident = snd_pcm_substream_chip(substream); in snd_trident_si7018_capture_prepare() local
1150 spin_lock_irq(&trident->reg_lock); in snd_trident_si7018_capture_prepare()
1175 snd_trident_write_voice_regs(trident, voice); in snd_trident_si7018_capture_prepare()
1193 snd_trident_write_voice_regs(trident, evoice); in snd_trident_si7018_capture_prepare()
1199 spin_unlock_irq(&trident->reg_lock); in snd_trident_si7018_capture_prepare()
1216 struct snd_trident *trident = snd_pcm_substream_chip(substream); in snd_trident_foldback_prepare() local
1221 spin_lock_irq(&trident->reg_lock); in snd_trident_foldback_prepare()
1250 outb(((voice->number & 0x3f) | 0x80), TRID_REG(trident, T4D_RCI + voice->foldback_chan)); in snd_trident_foldback_prepare()
1252 snd_trident_write_voice_regs(trident, voice); in snd_trident_foldback_prepare()
1262 evoice->GVSel = trident->device == TRIDENT_DEVICE_ID_SI7018 ? 0 : 1; in snd_trident_foldback_prepare()
1270 snd_trident_write_voice_regs(trident, evoice); in snd_trident_foldback_prepare()
1276 spin_unlock_irq(&trident->reg_lock); in snd_trident_foldback_prepare()
1295 struct snd_trident *trident = snd_pcm_substream_chip(substream); in snd_trident_spdif_hw_params() local
1303 if (trident->device == TRIDENT_DEVICE_ID_SI7018) { in snd_trident_spdif_hw_params()
1310 spin_lock_irq(&trident->reg_lock); in snd_trident_spdif_hw_params()
1311 old_bits = trident->spdif_pcm_bits; in snd_trident_spdif_hw_params()
1313 trident->spdif_pcm_bits &= ~IEC958_AES0_PRO_FS; in snd_trident_spdif_hw_params()
1315 trident->spdif_pcm_bits &= ~(IEC958_AES3_CON_FS << 24); in snd_trident_spdif_hw_params()
1317 trident->spdif_pcm_ctrl = 0x3c; // 48000 Hz in snd_trident_spdif_hw_params()
1318 trident->spdif_pcm_bits |= in snd_trident_spdif_hw_params()
1319 trident->spdif_bits & IEC958_AES0_PROFESSIONAL ? in snd_trident_spdif_hw_params()
1324 trident->spdif_pcm_ctrl = 0x3e; // 44100 Hz in snd_trident_spdif_hw_params()
1325 trident->spdif_pcm_bits |= in snd_trident_spdif_hw_params()
1326 trident->spdif_bits & IEC958_AES0_PROFESSIONAL ? in snd_trident_spdif_hw_params()
1331 trident->spdif_pcm_ctrl = 0x3d; // 32000 Hz in snd_trident_spdif_hw_params()
1332 trident->spdif_pcm_bits |= in snd_trident_spdif_hw_params()
1333 trident->spdif_bits & IEC958_AES0_PROFESSIONAL ? in snd_trident_spdif_hw_params()
1337 change = old_bits != trident->spdif_pcm_bits; in snd_trident_spdif_hw_params()
1338 spin_unlock_irq(&trident->reg_lock); in snd_trident_spdif_hw_params()
1341 snd_ctl_notify(trident->card, SNDRV_CTL_EVENT_MASK_VALUE, &trident->spdif_pcm_ctl->id); in snd_trident_spdif_hw_params()
1359 struct snd_trident *trident = snd_pcm_substream_chip(substream); in snd_trident_spdif_prepare() local
1363 struct snd_trident_pcm_mixer *mix = &trident->pcm_mixer[substream->number]; in snd_trident_spdif_prepare()
1367 spin_lock_irq(&trident->reg_lock); in snd_trident_spdif_prepare()
1369 if (trident->device != TRIDENT_DEVICE_ID_SI7018) { in snd_trident_spdif_prepare()
1407 snd_trident_write_voice_regs(trident, voice); in snd_trident_spdif_prepare()
1409 outw((RESO & 0xffff), TRID_REG(trident, NX_SPESO)); in snd_trident_spdif_prepare()
1410 outb((RESO >> 16), TRID_REG(trident, NX_SPESO + 2)); in snd_trident_spdif_prepare()
1411 outl((LBAO & 0xfffffffc), TRID_REG(trident, NX_SPLBA)); in snd_trident_spdif_prepare()
1412 outw((voice->CSO & 0xffff), TRID_REG(trident, NX_SPCTRL_SPCSO)); in snd_trident_spdif_prepare()
1413 outb((voice->CSO >> 16), TRID_REG(trident, NX_SPCTRL_SPCSO + 2)); in snd_trident_spdif_prepare()
1416 outb(trident->spdif_pcm_ctrl, TRID_REG(trident, NX_SPCTRL_SPCSO + 3)); in snd_trident_spdif_prepare()
1417 outl(trident->spdif_pcm_bits, TRID_REG(trident, NX_SPCSTATUS)); in snd_trident_spdif_prepare()
1446 snd_trident_write_voice_regs(trident, voice); in snd_trident_spdif_prepare()
1456 evoice->GVSel = trident->device == TRIDENT_DEVICE_ID_SI7018 ? 0 : 1; in snd_trident_spdif_prepare()
1464 snd_trident_write_voice_regs(trident, evoice); in snd_trident_spdif_prepare()
1470 outl(trident->spdif_pcm_bits, TRID_REG(trident, SI_SPDIF_CS)); in snd_trident_spdif_prepare()
1471 temp = inl(TRID_REG(trident, T4D_LFO_GC_CIR)); in snd_trident_spdif_prepare()
1473 outl(temp, TRID_REG(trident, T4D_LFO_GC_CIR)); in snd_trident_spdif_prepare()
1474 temp = inl(TRID_REG(trident, SI_SERIAL_INTF_CTRL)); in snd_trident_spdif_prepare()
1476 outl(temp, TRID_REG(trident, SI_SERIAL_INTF_CTRL)); in snd_trident_spdif_prepare()
1479 spin_unlock_irq(&trident->reg_lock); in snd_trident_spdif_prepare()
1500 struct snd_trident *trident = snd_pcm_substream_chip(substream); in snd_trident_trigger() local
1521 spin_lock(&trident->reg_lock); in snd_trident_trigger()
1522 val = inl(TRID_REG(trident, T4D_STIMER)) & 0x00ffffff; in snd_trident_trigger()
1524 if ((struct snd_trident *) snd_pcm_substream_chip(s) == trident) { in snd_trident_trigger()
1550 if (trident->device != TRIDENT_DEVICE_ID_SI7018) { in snd_trident_trigger()
1551 outl(trident->spdif_pcm_bits, TRID_REG(trident, NX_SPCSTATUS)); in snd_trident_trigger()
1552 val = trident->spdif_pcm_ctrl; in snd_trident_trigger()
1555 outb(val, TRID_REG(trident, NX_SPCTRL_SPCSO + 3)); in snd_trident_trigger()
1557 outl(trident->spdif_pcm_bits, TRID_REG(trident, SI_SPDIF_CS)); in snd_trident_trigger()
1558 val = inl(TRID_REG(trident, SI_SERIAL_INTF_CTRL)) | SPDIF_EN; in snd_trident_trigger()
1559 outl(val, TRID_REG(trident, SI_SERIAL_INTF_CTRL)); in snd_trident_trigger()
1563 outl(what, TRID_REG(trident, T4D_STOP_B)); in snd_trident_trigger()
1564 val = inl(TRID_REG(trident, T4D_AINTEN_B)); in snd_trident_trigger()
1570 outl(val, TRID_REG(trident, T4D_AINTEN_B)); in snd_trident_trigger()
1572 outl(what, TRID_REG(trident, T4D_START_B)); in snd_trident_trigger()
1574 if (capture_flag && trident->device != TRIDENT_DEVICE_ID_SI7018) in snd_trident_trigger()
1575 outb(trident->bDMAStart, TRID_REG(trident, T4D_SBCTRL_SBE2R_SBDD)); in snd_trident_trigger()
1577 if (capture_flag && trident->device != TRIDENT_DEVICE_ID_SI7018) in snd_trident_trigger()
1578 outb(0x00, TRID_REG(trident, T4D_SBCTRL_SBE2R_SBDD)); in snd_trident_trigger()
1580 spin_unlock(&trident->reg_lock); in snd_trident_trigger()
1597 struct snd_trident *trident = snd_pcm_substream_chip(substream); in snd_trident_playback_pointer() local
1605 spin_lock(&trident->reg_lock); in snd_trident_playback_pointer()
1607 outb(voice->number, TRID_REG(trident, T4D_LFO_GC_CIR)); in snd_trident_playback_pointer()
1609 if (trident->device != TRIDENT_DEVICE_ID_NX) { in snd_trident_playback_pointer()
1610 cso = inw(TRID_REG(trident, CH_DX_CSO_ALPHA_FMS + 2)); in snd_trident_playback_pointer()
1612 cso = (unsigned int) inl(TRID_REG(trident, CH_NX_DELTA_CSO)) & 0x00ffffff; in snd_trident_playback_pointer()
1615 spin_unlock(&trident->reg_lock); in snd_trident_playback_pointer()
1636 struct snd_trident *trident = snd_pcm_substream_chip(substream); in snd_trident_capture_pointer() local
1644 result = inw(TRID_REG(trident, T4D_SBBL_SBCL)); in snd_trident_capture_pointer()
1666 struct snd_trident *trident = snd_pcm_substream_chip(substream); in snd_trident_spdif_pointer() local
1674 result = inl(TRID_REG(trident, NX_SPCTRL_SPCSO)) & 0x00ffffff; in snd_trident_spdif_pointer()
1801 struct snd_trident *trident; in snd_trident_pcm_free_substream() local
1804 trident = voice->trident; in snd_trident_pcm_free_substream()
1805 snd_trident_free_voice(trident, voice); in snd_trident_pcm_free_substream()
1811 struct snd_trident *trident = snd_pcm_substream_chip(substream); in snd_trident_playback_open() local
1815 voice = snd_trident_alloc_voice(trident, SNDRV_TRIDENT_VOICE_TYPE_PCM, 0, 0); in snd_trident_playback_open()
1818 snd_trident_pcm_mixer_build(trident, voice, substream); in snd_trident_playback_open()
1839 struct snd_trident *trident = snd_pcm_substream_chip(substream); in snd_trident_playback_close() local
1843 snd_trident_pcm_mixer_free(trident, voice, substream); in snd_trident_playback_close()
1860 struct snd_trident *trident = snd_pcm_substream_chip(substream); in snd_trident_spdif_open() local
1864 voice = snd_trident_alloc_voice(trident, SNDRV_TRIDENT_VOICE_TYPE_PCM, 0, 0); in snd_trident_spdif_open()
1869 spin_lock_irq(&trident->reg_lock); in snd_trident_spdif_open()
1870 trident->spdif_pcm_bits = trident->spdif_bits; in snd_trident_spdif_open()
1871 spin_unlock_irq(&trident->reg_lock); in snd_trident_spdif_open()
1875 if (trident->device == TRIDENT_DEVICE_ID_SI7018) { in snd_trident_spdif_open()
1881 trident->spdif_pcm_ctl->vd[0].access &= ~SNDRV_CTL_ELEM_ACCESS_INACTIVE; in snd_trident_spdif_open()
1882 snd_ctl_notify(trident->card, SNDRV_CTL_EVENT_MASK_VALUE | in snd_trident_spdif_open()
1883 SNDRV_CTL_EVENT_MASK_INFO, &trident->spdif_pcm_ctl->id); in snd_trident_spdif_open()
1901 struct snd_trident *trident = snd_pcm_substream_chip(substream); in snd_trident_spdif_close() local
1904 spin_lock_irq(&trident->reg_lock); in snd_trident_spdif_close()
1906 if (trident->device != TRIDENT_DEVICE_ID_SI7018) { in snd_trident_spdif_close()
1907 outb(trident->spdif_ctrl, TRID_REG(trident, NX_SPCTRL_SPCSO + 3)); in snd_trident_spdif_close()
1908 outl(trident->spdif_bits, TRID_REG(trident, NX_SPCSTATUS)); in snd_trident_spdif_close()
1910 outl(trident->spdif_bits, TRID_REG(trident, SI_SPDIF_CS)); in snd_trident_spdif_close()
1911 temp = inl(TRID_REG(trident, SI_SERIAL_INTF_CTRL)); in snd_trident_spdif_close()
1912 if (trident->spdif_ctrl) { in snd_trident_spdif_close()
1917 outl(temp, TRID_REG(trident, SI_SERIAL_INTF_CTRL)); in snd_trident_spdif_close()
1919 spin_unlock_irq(&trident->reg_lock); in snd_trident_spdif_close()
1920 trident->spdif_pcm_ctl->vd[0].access |= SNDRV_CTL_ELEM_ACCESS_INACTIVE; in snd_trident_spdif_close()
1921 snd_ctl_notify(trident->card, SNDRV_CTL_EVENT_MASK_VALUE | in snd_trident_spdif_close()
1922 SNDRV_CTL_EVENT_MASK_INFO, &trident->spdif_pcm_ctl->id); in snd_trident_spdif_close()
1939 struct snd_trident *trident = snd_pcm_substream_chip(substream); in snd_trident_capture_open() local
1943 voice = snd_trident_alloc_voice(trident, SNDRV_TRIDENT_VOICE_TYPE_PCM, 0, 0); in snd_trident_capture_open()
1983 struct snd_trident *trident = snd_pcm_substream_chip(substream); in snd_trident_foldback_open() local
1987 voice = snd_trident_alloc_voice(trident, SNDRV_TRIDENT_VOICE_TYPE_PCM, 0, 0); in snd_trident_foldback_open()
2010 struct snd_trident *trident = snd_pcm_substream_chip(substream); in snd_trident_foldback_close() local
2016 spin_lock_irq(&trident->reg_lock); in snd_trident_foldback_close()
2017 outb(0x00, TRID_REG(trident, T4D_RCI + voice->foldback_chan)); in snd_trident_foldback_close()
2018 spin_unlock_irq(&trident->reg_lock); in snd_trident_foldback_close()
2117 int snd_trident_pcm(struct snd_trident *trident, int device) in snd_trident_pcm() argument
2122 if ((err = snd_pcm_new(trident->card, "trident_dx_nx", device, trident->ChanPCM, 1, &pcm)) < 0) in snd_trident_pcm()
2125 pcm->private_data = trident; in snd_trident_pcm()
2127 if (trident->tlb.entries) { in snd_trident_pcm()
2133 trident->device != TRIDENT_DEVICE_ID_SI7018 ? in snd_trident_pcm()
2140 trident->pcm = pcm; in snd_trident_pcm()
2142 if (trident->tlb.entries) { in snd_trident_pcm()
2146 &trident->pci->dev, in snd_trident_pcm()
2150 &trident->pci->dev, in snd_trident_pcm()
2154 &trident->pci->dev, in snd_trident_pcm()
2172 int snd_trident_foldback_pcm(struct snd_trident *trident, int device) in snd_trident_foldback_pcm() argument
2179 if (trident->device == TRIDENT_DEVICE_ID_NX) in snd_trident_foldback_pcm()
2181 if ((err = snd_pcm_new(trident->card, "trident_dx_nx", device, 0, num_chan, &foldback)) < 0) in snd_trident_foldback_pcm()
2184 foldback->private_data = trident; in snd_trident_foldback_pcm()
2185 if (trident->tlb.entries) in snd_trident_foldback_pcm()
2201 trident->foldback = foldback; in snd_trident_foldback_pcm()
2203 if (trident->tlb.entries) in snd_trident_foldback_pcm()
2205 &trident->pci->dev, in snd_trident_foldback_pcm()
2209 &trident->pci->dev, in snd_trident_foldback_pcm()
2226 int snd_trident_spdif_pcm(struct snd_trident *trident, int device) in snd_trident_spdif_pcm() argument
2231 if ((err = snd_pcm_new(trident->card, "trident_dx_nx IEC958", device, 1, 0, &spdif)) < 0) in snd_trident_spdif_pcm()
2234 spdif->private_data = trident; in snd_trident_spdif_pcm()
2235 if (trident->device != TRIDENT_DEVICE_ID_SI7018) { in snd_trident_spdif_pcm()
2242 trident->spdif = spdif; in snd_trident_spdif_pcm()
2245 &trident->pci->dev, 64*1024, 128*1024); in snd_trident_spdif_pcm()
2266 struct snd_trident *trident = snd_kcontrol_chip(kcontrol); in snd_trident_spdif_control_get() local
2269 spin_lock_irq(&trident->reg_lock); in snd_trident_spdif_control_get()
2270 val = trident->spdif_ctrl; in snd_trident_spdif_control_get()
2272 spin_unlock_irq(&trident->reg_lock); in snd_trident_spdif_control_get()
2279 struct snd_trident *trident = snd_kcontrol_chip(kcontrol); in snd_trident_spdif_control_put() local
2284 spin_lock_irq(&trident->reg_lock); in snd_trident_spdif_control_put()
2286 change = trident->spdif_ctrl != val; in snd_trident_spdif_control_put()
2287 trident->spdif_ctrl = val; in snd_trident_spdif_control_put()
2288 if (trident->device != TRIDENT_DEVICE_ID_SI7018) { in snd_trident_spdif_control_put()
2289 if ((inb(TRID_REG(trident, NX_SPCTRL_SPCSO + 3)) & 0x10) == 0) { in snd_trident_spdif_control_put()
2290 outl(trident->spdif_bits, TRID_REG(trident, NX_SPCSTATUS)); in snd_trident_spdif_control_put()
2291 outb(trident->spdif_ctrl, TRID_REG(trident, NX_SPCTRL_SPCSO + 3)); in snd_trident_spdif_control_put()
2294 if (trident->spdif == NULL) { in snd_trident_spdif_control_put()
2296 outl(trident->spdif_bits, TRID_REG(trident, SI_SPDIF_CS)); in snd_trident_spdif_control_put()
2297 temp = inl(TRID_REG(trident, SI_SERIAL_INTF_CTRL)) & ~SPDIF_EN; in snd_trident_spdif_control_put()
2300 outl(temp, TRID_REG(trident, SI_SERIAL_INTF_CTRL)); in snd_trident_spdif_control_put()
2303 spin_unlock_irq(&trident->reg_lock); in snd_trident_spdif_control_put()
2334 struct snd_trident *trident = snd_kcontrol_chip(kcontrol); in snd_trident_spdif_default_get() local
2336 spin_lock_irq(&trident->reg_lock); in snd_trident_spdif_default_get()
2337 ucontrol->value.iec958.status[0] = (trident->spdif_bits >> 0) & 0xff; in snd_trident_spdif_default_get()
2338 ucontrol->value.iec958.status[1] = (trident->spdif_bits >> 8) & 0xff; in snd_trident_spdif_default_get()
2339 ucontrol->value.iec958.status[2] = (trident->spdif_bits >> 16) & 0xff; in snd_trident_spdif_default_get()
2340 ucontrol->value.iec958.status[3] = (trident->spdif_bits >> 24) & 0xff; in snd_trident_spdif_default_get()
2341 spin_unlock_irq(&trident->reg_lock); in snd_trident_spdif_default_get()
2348 struct snd_trident *trident = snd_kcontrol_chip(kcontrol); in snd_trident_spdif_default_put() local
2356 spin_lock_irq(&trident->reg_lock); in snd_trident_spdif_default_put()
2357 change = trident->spdif_bits != val; in snd_trident_spdif_default_put()
2358 trident->spdif_bits = val; in snd_trident_spdif_default_put()
2359 if (trident->device != TRIDENT_DEVICE_ID_SI7018) { in snd_trident_spdif_default_put()
2360 if ((inb(TRID_REG(trident, NX_SPCTRL_SPCSO + 3)) & 0x10) == 0) in snd_trident_spdif_default_put()
2361 outl(trident->spdif_bits, TRID_REG(trident, NX_SPCSTATUS)); in snd_trident_spdif_default_put()
2363 if (trident->spdif == NULL) in snd_trident_spdif_default_put()
2364 outl(trident->spdif_bits, TRID_REG(trident, SI_SPDIF_CS)); in snd_trident_spdif_default_put()
2366 spin_unlock_irq(&trident->reg_lock); in snd_trident_spdif_default_put()
2429 struct snd_trident *trident = snd_kcontrol_chip(kcontrol); in snd_trident_spdif_stream_get() local
2431 spin_lock_irq(&trident->reg_lock); in snd_trident_spdif_stream_get()
2432 ucontrol->value.iec958.status[0] = (trident->spdif_pcm_bits >> 0) & 0xff; in snd_trident_spdif_stream_get()
2433 ucontrol->value.iec958.status[1] = (trident->spdif_pcm_bits >> 8) & 0xff; in snd_trident_spdif_stream_get()
2434 ucontrol->value.iec958.status[2] = (trident->spdif_pcm_bits >> 16) & 0xff; in snd_trident_spdif_stream_get()
2435 ucontrol->value.iec958.status[3] = (trident->spdif_pcm_bits >> 24) & 0xff; in snd_trident_spdif_stream_get()
2436 spin_unlock_irq(&trident->reg_lock); in snd_trident_spdif_stream_get()
2443 struct snd_trident *trident = snd_kcontrol_chip(kcontrol); in snd_trident_spdif_stream_put() local
2451 spin_lock_irq(&trident->reg_lock); in snd_trident_spdif_stream_put()
2452 change = trident->spdif_pcm_bits != val; in snd_trident_spdif_stream_put()
2453 trident->spdif_pcm_bits = val; in snd_trident_spdif_stream_put()
2454 if (trident->spdif != NULL) { in snd_trident_spdif_stream_put()
2455 if (trident->device != TRIDENT_DEVICE_ID_SI7018) { in snd_trident_spdif_stream_put()
2456 outl(trident->spdif_pcm_bits, TRID_REG(trident, NX_SPCSTATUS)); in snd_trident_spdif_stream_put()
2458 outl(trident->spdif_bits, TRID_REG(trident, SI_SPDIF_CS)); in snd_trident_spdif_stream_put()
2461 spin_unlock_irq(&trident->reg_lock); in snd_trident_spdif_stream_put()
2486 struct snd_trident *trident = snd_kcontrol_chip(kcontrol); in snd_trident_ac97_control_get() local
2489 spin_lock_irq(&trident->reg_lock); in snd_trident_ac97_control_get()
2490 val = trident->ac97_ctrl = inl(TRID_REG(trident, NX_ACR0_AC97_COM_STAT)); in snd_trident_ac97_control_get()
2492 spin_unlock_irq(&trident->reg_lock); in snd_trident_ac97_control_get()
2499 struct snd_trident *trident = snd_kcontrol_chip(kcontrol); in snd_trident_ac97_control_put() local
2503 spin_lock_irq(&trident->reg_lock); in snd_trident_ac97_control_put()
2504 val = trident->ac97_ctrl = inl(TRID_REG(trident, NX_ACR0_AC97_COM_STAT)); in snd_trident_ac97_control_put()
2508 change = val != trident->ac97_ctrl; in snd_trident_ac97_control_put()
2509 trident->ac97_ctrl = val; in snd_trident_ac97_control_put()
2510 outl(trident->ac97_ctrl = val, TRID_REG(trident, NX_ACR0_AC97_COM_STAT)); in snd_trident_ac97_control_put()
2511 spin_unlock_irq(&trident->reg_lock); in snd_trident_ac97_control_put()
2544 struct snd_trident *trident = snd_kcontrol_chip(kcontrol); in snd_trident_vol_control_get() local
2547 val = trident->musicvol_wavevol; in snd_trident_vol_control_get()
2558 struct snd_trident *trident = snd_kcontrol_chip(kcontrol); in snd_trident_vol_control_put() local
2562 spin_lock_irq(&trident->reg_lock); in snd_trident_vol_control_put()
2563 val = trident->musicvol_wavevol; in snd_trident_vol_control_put()
2567 change = val != trident->musicvol_wavevol; in snd_trident_vol_control_put()
2568 outl(trident->musicvol_wavevol = val, TRID_REG(trident, T4D_MUSICVOL_WAVEVOL)); in snd_trident_vol_control_put()
2569 spin_unlock_irq(&trident->reg_lock); in snd_trident_vol_control_put()
2604 struct snd_trident *trident = snd_kcontrol_chip(kcontrol); in snd_trident_pcm_vol_control_info() local
2610 if (trident->device == TRIDENT_DEVICE_ID_SI7018) in snd_trident_pcm_vol_control_info()
2618 struct snd_trident *trident = snd_kcontrol_chip(kcontrol); in snd_trident_pcm_vol_control_get() local
2619 …struct snd_trident_pcm_mixer *mix = &trident->pcm_mixer[snd_ctl_get_ioffnum(kcontrol, &ucontrol->i… in snd_trident_pcm_vol_control_get()
2621 if (trident->device == TRIDENT_DEVICE_ID_SI7018) { in snd_trident_pcm_vol_control_get()
2632 struct snd_trident *trident = snd_kcontrol_chip(kcontrol); in snd_trident_pcm_vol_control_put() local
2633 …struct snd_trident_pcm_mixer *mix = &trident->pcm_mixer[snd_ctl_get_ioffnum(kcontrol, &ucontrol->i… in snd_trident_pcm_vol_control_put()
2637 if (trident->device == TRIDENT_DEVICE_ID_SI7018) { in snd_trident_pcm_vol_control_put()
2642 spin_lock_irq(&trident->reg_lock); in snd_trident_pcm_vol_control_put()
2646 snd_trident_write_vol_reg(trident, mix->voice, val); in snd_trident_pcm_vol_control_put()
2647 spin_unlock_irq(&trident->reg_lock); in snd_trident_pcm_vol_control_put()
2682 struct snd_trident *trident = snd_kcontrol_chip(kcontrol); in snd_trident_pcm_pan_control_get() local
2683 …struct snd_trident_pcm_mixer *mix = &trident->pcm_mixer[snd_ctl_get_ioffnum(kcontrol, &ucontrol->i… in snd_trident_pcm_pan_control_get()
2697 struct snd_trident *trident = snd_kcontrol_chip(kcontrol); in snd_trident_pcm_pan_control_put() local
2698 …struct snd_trident_pcm_mixer *mix = &trident->pcm_mixer[snd_ctl_get_ioffnum(kcontrol, &ucontrol->i… in snd_trident_pcm_pan_control_put()
2706 spin_lock_irq(&trident->reg_lock); in snd_trident_pcm_pan_control_put()
2710 snd_trident_write_pan_reg(trident, mix->voice, val); in snd_trident_pcm_pan_control_put()
2711 spin_unlock_irq(&trident->reg_lock); in snd_trident_pcm_pan_control_put()
2745 struct snd_trident *trident = snd_kcontrol_chip(kcontrol); in snd_trident_pcm_rvol_control_get() local
2746 …struct snd_trident_pcm_mixer *mix = &trident->pcm_mixer[snd_ctl_get_ioffnum(kcontrol, &ucontrol->i… in snd_trident_pcm_rvol_control_get()
2755 struct snd_trident *trident = snd_kcontrol_chip(kcontrol); in snd_trident_pcm_rvol_control_put() local
2756 …struct snd_trident_pcm_mixer *mix = &trident->pcm_mixer[snd_ctl_get_ioffnum(kcontrol, &ucontrol->i… in snd_trident_pcm_rvol_control_put()
2761 spin_lock_irq(&trident->reg_lock); in snd_trident_pcm_rvol_control_put()
2765 snd_trident_write_rvol_reg(trident, mix->voice, val); in snd_trident_pcm_rvol_control_put()
2766 spin_unlock_irq(&trident->reg_lock); in snd_trident_pcm_rvol_control_put()
2803 struct snd_trident *trident = snd_kcontrol_chip(kcontrol); in snd_trident_pcm_cvol_control_get() local
2804 …struct snd_trident_pcm_mixer *mix = &trident->pcm_mixer[snd_ctl_get_ioffnum(kcontrol, &ucontrol->i… in snd_trident_pcm_cvol_control_get()
2813 struct snd_trident *trident = snd_kcontrol_chip(kcontrol); in snd_trident_pcm_cvol_control_put() local
2814 …struct snd_trident_pcm_mixer *mix = &trident->pcm_mixer[snd_ctl_get_ioffnum(kcontrol, &ucontrol->i… in snd_trident_pcm_cvol_control_put()
2819 spin_lock_irq(&trident->reg_lock); in snd_trident_pcm_cvol_control_put()
2823 snd_trident_write_cvol_reg(trident, mix->voice, val); in snd_trident_pcm_cvol_control_put()
2824 spin_unlock_irq(&trident->reg_lock); in snd_trident_pcm_cvol_control_put()
2857 static void snd_trident_notify_pcm_change(struct snd_trident *trident, in snd_trident_notify_pcm_change() argument
2861 snd_trident_notify_pcm_change1(trident->card, trident->ctl_vol, num, activate); in snd_trident_notify_pcm_change()
2862 snd_trident_notify_pcm_change1(trident->card, trident->ctl_pan, num, activate); in snd_trident_notify_pcm_change()
2863 snd_trident_notify_pcm_change1(trident->card, trident->ctl_rvol, num, activate); in snd_trident_notify_pcm_change()
2864 snd_trident_notify_pcm_change1(trident->card, trident->ctl_cvol, num, activate); in snd_trident_notify_pcm_change()
2867 static int snd_trident_pcm_mixer_build(struct snd_trident *trident, in snd_trident_pcm_mixer_build() argument
2873 if (snd_BUG_ON(!trident || !voice || !substream)) in snd_trident_pcm_mixer_build()
2875 tmix = &trident->pcm_mixer[substream->number]; in snd_trident_pcm_mixer_build()
2881 snd_trident_notify_pcm_change(trident, tmix, substream->number, 1); in snd_trident_pcm_mixer_build()
2885 static int snd_trident_pcm_mixer_free(struct snd_trident *trident, struct snd_trident_voice *voice,… in snd_trident_pcm_mixer_free() argument
2889 if (snd_BUG_ON(!trident || !substream)) in snd_trident_pcm_mixer_free()
2891 tmix = &trident->pcm_mixer[substream->number]; in snd_trident_pcm_mixer_free()
2893 snd_trident_notify_pcm_change(trident, tmix, substream->number, 0); in snd_trident_pcm_mixer_free()
2908 static int snd_trident_mixer(struct snd_trident *trident, int pcm_spdif_device) in snd_trident_mixer() argument
2911 struct snd_card *card = trident->card; in snd_trident_mixer()
2924 if ((err = snd_ac97_bus(trident->card, 0, &ops, NULL, &trident->ac97_bus)) < 0) in snd_trident_mixer()
2928 _ac97.private_data = trident; in snd_trident_mixer()
2929 trident->ac97_detect = 1; in snd_trident_mixer()
2932 if ((err = snd_ac97_mixer(trident->ac97_bus, &_ac97, &trident->ac97)) < 0) { in snd_trident_mixer()
2933 if (trident->device == TRIDENT_DEVICE_ID_SI7018) { in snd_trident_mixer()
2934 if ((err = snd_trident_sis_reset(trident)) < 0) in snd_trident_mixer()
2944 if (trident->device == TRIDENT_DEVICE_ID_SI7018 && in snd_trident_mixer()
2945 (inl(TRID_REG(trident, SI_SERIAL_INTF_CTRL)) & SI_AC97_PRIMARY_READY) != 0) { in snd_trident_mixer()
2947 err = snd_ac97_mixer(trident->ac97_bus, &_ac97, &trident->ac97_sec); in snd_trident_mixer()
2949 dev_err(trident->card->dev, in snd_trident_mixer()
2954 err = snd_ac97_modem(trident->card, &_ac97, &mc97); in snd_trident_mixer()
2956 dev_err(trident->card->dev, in snd_trident_mixer()
2962 trident->ac97_detect = 0; in snd_trident_mixer()
2964 if (trident->device != TRIDENT_DEVICE_ID_SI7018) { in snd_trident_mixer()
2965 if ((err = snd_ctl_add(card, kctl = snd_ctl_new1(&snd_trident_vol_wave_control, trident))) < 0) in snd_trident_mixer()
2968 if ((err = snd_ctl_add(card, kctl = snd_ctl_new1(&snd_trident_vol_music_control, trident))) < 0) in snd_trident_mixer()
2971 outl(trident->musicvol_wavevol = 0x00000000, TRID_REG(trident, T4D_MUSICVOL_WAVEVOL)); in snd_trident_mixer()
2973 outl(trident->musicvol_wavevol = 0xffff0000, TRID_REG(trident, T4D_MUSICVOL_WAVEVOL)); in snd_trident_mixer()
2979 tmix = &trident->pcm_mixer[idx]; in snd_trident_mixer()
2982 if ((trident->ctl_vol = snd_ctl_new1(&snd_trident_pcm_vol_control, trident)) == NULL) in snd_trident_mixer()
2984 if ((err = snd_ctl_add(card, trident->ctl_vol))) in snd_trident_mixer()
2987 if ((trident->ctl_pan = snd_ctl_new1(&snd_trident_pcm_pan_control, trident)) == NULL) in snd_trident_mixer()
2989 if ((err = snd_ctl_add(card, trident->ctl_pan))) in snd_trident_mixer()
2992 if ((trident->ctl_rvol = snd_ctl_new1(&snd_trident_pcm_rvol_control, trident)) == NULL) in snd_trident_mixer()
2994 if ((err = snd_ctl_add(card, trident->ctl_rvol))) in snd_trident_mixer()
2997 if ((trident->ctl_cvol = snd_ctl_new1(&snd_trident_pcm_cvol_control, trident)) == NULL) in snd_trident_mixer()
2999 if ((err = snd_ctl_add(card, trident->ctl_cvol))) in snd_trident_mixer()
3002 if (trident->device == TRIDENT_DEVICE_ID_NX) { in snd_trident_mixer()
3003 if ((err = snd_ctl_add(card, kctl = snd_ctl_new1(&snd_trident_ac97_rear_control, trident))) < 0) in snd_trident_mixer()
3007 if (trident->device == TRIDENT_DEVICE_ID_NX || trident->device == TRIDENT_DEVICE_ID_SI7018) { in snd_trident_mixer()
3009 kctl = snd_ctl_new1(&snd_trident_spdif_control, trident); in snd_trident_mixer()
3014 if (trident->ac97->ext_id & AC97_EI_SPDIF) in snd_trident_mixer()
3016 if (trident->ac97_sec && (trident->ac97_sec->ext_id & AC97_EI_SPDIF)) in snd_trident_mixer()
3023 kctl = snd_ctl_new1(&snd_trident_spdif_default, trident); in snd_trident_mixer()
3033 kctl = snd_ctl_new1(&snd_trident_spdif_mask, trident); in snd_trident_mixer()
3043 kctl = snd_ctl_new1(&snd_trident_spdif_stream, trident); in snd_trident_mixer()
3052 trident->spdif_pcm_ctl = kctl; in snd_trident_mixer()
3180 static int snd_trident_sis_reset(struct snd_trident *trident) in snd_trident_sis_reset() argument
3186 r = trident->in_suspend ? 0 : 2; /* count of retries */ in snd_trident_sis_reset()
3188 pci_write_config_byte(trident->pci, 0x46, 0x04); /* SOFTWARE RESET */ in snd_trident_sis_reset()
3190 pci_write_config_byte(trident->pci, 0x46, 0x00); in snd_trident_sis_reset()
3193 outb(0x00, TRID_REG(trident, SI_AC97_GPIO)); in snd_trident_sis_reset()
3196 outl(i, TRID_REG(trident, SI_SERIAL_INTF_CTRL)); in snd_trident_sis_reset()
3200 outl(i, TRID_REG(trident, SI_SERIAL_INTF_CTRL)); in snd_trident_sis_reset()
3205 if ((inl(TRID_REG(trident, SI_SERIAL_INTF_CTRL)) & SI_AC97_PRIMARY_READY) != 0) in snd_trident_sis_reset()
3207 do_delay(trident); in snd_trident_sis_reset()
3209 dev_err(trident->card->dev, "AC'97 codec ready error [0x%x]\n", in snd_trident_sis_reset()
3210 inl(TRID_REG(trident, SI_SERIAL_INTF_CTRL))); in snd_trident_sis_reset()
3214 do_delay(trident); in snd_trident_sis_reset()
3221 if ((inl(TRID_REG(trident, SI_SERIAL_INTF_CTRL)) & SI_AC97_SECONDARY_READY) != 0) in snd_trident_sis_reset()
3223 do_delay(trident); in snd_trident_sis_reset()
3226 outl(BANK_B_EN, TRID_REG(trident, T4D_LFO_GC_CIR)); in snd_trident_sis_reset()
3237 struct snd_trident *trident = entry->private_data; in snd_trident_proc_read() local
3240 switch (trident->device) { in snd_trident_proc_read()
3254 snd_iprintf(buffer, "Spurious IRQs : %d\n", trident->spurious_irq_count); in snd_trident_proc_read()
3255 snd_iprintf(buffer, "Spurious IRQ dlta: %d\n", trident->spurious_irq_max_delta); in snd_trident_proc_read()
3256 if (trident->device == TRIDENT_DEVICE_ID_NX || trident->device == TRIDENT_DEVICE_ID_SI7018) in snd_trident_proc_read()
3257 snd_iprintf(buffer, "IEC958 Mixer Out : %s\n", trident->spdif_ctrl == 0x28 ? "on" : "off"); in snd_trident_proc_read()
3258 if (trident->device == TRIDENT_DEVICE_ID_NX) { in snd_trident_proc_read()
3259 snd_iprintf(buffer, "Rear Speakers : %s\n", trident->ac97_ctrl & 0x00000010 ? "on" : "off"); in snd_trident_proc_read()
3260 if (trident->tlb.entries) { in snd_trident_proc_read()
3262 snd_iprintf(buffer, "Memory Maximum : %d\n", trident->tlb.memhdr->size); in snd_trident_proc_read()
3263 snd_iprintf(buffer, "Memory Used : %d\n", trident->tlb.memhdr->used); in snd_trident_proc_read()
3264 snd_iprintf(buffer, "Memory Free : %d\n", snd_util_mem_avail(trident->tlb.memhdr)); in snd_trident_proc_read()
3269 static void snd_trident_proc_init(struct snd_trident *trident) in snd_trident_proc_init() argument
3273 if (trident->device == TRIDENT_DEVICE_ID_SI7018) in snd_trident_proc_init()
3275 snd_card_ro_proc_new(trident->card, s, trident, snd_trident_proc_read); in snd_trident_proc_init()
3280 struct snd_trident *trident = device->device_data; in snd_trident_dev_free() local
3281 return snd_trident_free(trident); in snd_trident_dev_free()
3296 static int snd_trident_tlb_alloc(struct snd_trident *trident) in snd_trident_tlb_alloc() argument
3303 if (snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV, &trident->pci->dev, in snd_trident_tlb_alloc()
3304 2 * SNDRV_TRIDENT_MAX_PAGES * 4, &trident->tlb.buffer) < 0) { in snd_trident_tlb_alloc()
3305 dev_err(trident->card->dev, "unable to allocate TLB buffer\n"); in snd_trident_tlb_alloc()
3308trident->tlb.entries = (__le32 *)ALIGN((unsigned long)trident->tlb.buffer.area, SNDRV_TRIDENT_MAX_… in snd_trident_tlb_alloc()
3309 trident->tlb.entries_dmaaddr = ALIGN(trident->tlb.buffer.addr, SNDRV_TRIDENT_MAX_PAGES * 4); in snd_trident_tlb_alloc()
3311 trident->tlb.shadow_entries = in snd_trident_tlb_alloc()
3314 if (!trident->tlb.shadow_entries) in snd_trident_tlb_alloc()
3318 if (snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV, &trident->pci->dev, in snd_trident_tlb_alloc()
3319 SNDRV_TRIDENT_PAGE_SIZE, &trident->tlb.silent_page) < 0) { in snd_trident_tlb_alloc()
3320 dev_err(trident->card->dev, "unable to allocate silent page\n"); in snd_trident_tlb_alloc()
3323 memset(trident->tlb.silent_page.area, 0, SNDRV_TRIDENT_PAGE_SIZE); in snd_trident_tlb_alloc()
3325trident->tlb.entries[i] = cpu_to_le32(trident->tlb.silent_page.addr & ~(SNDRV_TRIDENT_PAGE_SIZE-1)… in snd_trident_tlb_alloc()
3326 trident->tlb.shadow_entries[i] = (unsigned long)trident->tlb.silent_page.area; in snd_trident_tlb_alloc()
3330 trident->tlb.memhdr = snd_util_memhdr_new(SNDRV_TRIDENT_PAGE_SIZE * SNDRV_TRIDENT_MAX_PAGES); in snd_trident_tlb_alloc()
3331 if (trident->tlb.memhdr == NULL) in snd_trident_tlb_alloc()
3334 trident->tlb.memhdr->block_extra_size = sizeof(struct snd_trident_memblk_arg); in snd_trident_tlb_alloc()
3342 static void snd_trident_stop_all_voices(struct snd_trident *trident) in snd_trident_stop_all_voices() argument
3344 outl(0xffffffff, TRID_REG(trident, T4D_STOP_A)); in snd_trident_stop_all_voices()
3345 outl(0xffffffff, TRID_REG(trident, T4D_STOP_B)); in snd_trident_stop_all_voices()
3346 outl(0, TRID_REG(trident, T4D_AINTEN_A)); in snd_trident_stop_all_voices()
3347 outl(0, TRID_REG(trident, T4D_AINTEN_B)); in snd_trident_stop_all_voices()
3350 static int snd_trident_4d_dx_init(struct snd_trident *trident) in snd_trident_4d_dx_init() argument
3352 struct pci_dev *pci = trident->pci; in snd_trident_4d_dx_init()
3365 outl(0x00000001, TRID_REG(trident, DX_ACR2_AC97_COM_STAT)); in snd_trident_4d_dx_init()
3367 outl(0x00000000, TRID_REG(trident, DX_ACR2_AC97_COM_STAT)); in snd_trident_4d_dx_init()
3369 trident->ac97_ctrl = 0x0000004a; in snd_trident_4d_dx_init()
3370 outl(trident->ac97_ctrl, TRID_REG(trident, DX_ACR2_AC97_COM_STAT)); in snd_trident_4d_dx_init()
3374 if ((inl(TRID_REG(trident, DX_ACR2_AC97_COM_STAT)) & 0x0010) != 0) in snd_trident_4d_dx_init()
3376 do_delay(trident); in snd_trident_4d_dx_init()
3378 dev_err(trident->card->dev, "AC'97 codec ready error\n"); in snd_trident_4d_dx_init()
3382 snd_trident_stop_all_voices(trident); in snd_trident_4d_dx_init()
3390 static int snd_trident_4d_nx_init(struct snd_trident *trident) in snd_trident_4d_nx_init() argument
3392 struct pci_dev *pci = trident->pci; in snd_trident_4d_nx_init()
3406 outl(0x00000001, TRID_REG(trident, NX_ACR0_AC97_COM_STAT)); in snd_trident_4d_nx_init()
3408 outl(0x00000000, TRID_REG(trident, NX_ACR0_AC97_COM_STAT)); in snd_trident_4d_nx_init()
3412 if ((inl(TRID_REG(trident, NX_ACR0_AC97_COM_STAT)) & 0x0008) != 0) in snd_trident_4d_nx_init()
3414 do_delay(trident); in snd_trident_4d_nx_init()
3416 dev_err(trident->card->dev, "AC'97 codec ready error [0x%x]\n", in snd_trident_4d_nx_init()
3417 inl(TRID_REG(trident, NX_ACR0_AC97_COM_STAT))); in snd_trident_4d_nx_init()
3422 trident->ac97_ctrl = 0x00000002; in snd_trident_4d_nx_init()
3423 outl(trident->ac97_ctrl, TRID_REG(trident, NX_ACR0_AC97_COM_STAT)); in snd_trident_4d_nx_init()
3425 outl(NX_SB_IRQ_DISABLE, TRID_REG(trident, T4D_MISCINT)); in snd_trident_4d_nx_init()
3427 snd_trident_stop_all_voices(trident); in snd_trident_4d_nx_init()
3429 if (trident->tlb.entries != NULL) { in snd_trident_4d_nx_init()
3432 i = trident->tlb.entries_dmaaddr; in snd_trident_4d_nx_init()
3434 outl(i, TRID_REG(trident, NX_TLBC)); in snd_trident_4d_nx_init()
3436 outl(0, TRID_REG(trident, NX_TLBC)); in snd_trident_4d_nx_init()
3439 outl(trident->spdif_bits, TRID_REG(trident, NX_SPCSTATUS)); in snd_trident_4d_nx_init()
3440 outb(trident->spdif_ctrl, TRID_REG(trident, NX_SPCTRL_SPCSO + 3)); in snd_trident_4d_nx_init()
3448 static int snd_trident_sis_init(struct snd_trident *trident) in snd_trident_sis_init() argument
3452 if ((err = snd_trident_sis_reset(trident)) < 0) in snd_trident_sis_init()
3455 snd_trident_stop_all_voices(trident); in snd_trident_sis_init()
3458 outl(trident->spdif_bits, TRID_REG(trident, SI_SPDIF_CS)); in snd_trident_sis_init()
3486 struct snd_trident *trident; in snd_trident_create() local
3508 trident = kzalloc(sizeof(*trident), GFP_KERNEL); in snd_trident_create()
3509 if (trident == NULL) { in snd_trident_create()
3513 trident->device = (pci->vendor << 16) | pci->device; in snd_trident_create()
3514 trident->card = card; in snd_trident_create()
3515 trident->pci = pci; in snd_trident_create()
3516 spin_lock_init(&trident->reg_lock); in snd_trident_create()
3517 spin_lock_init(&trident->event_lock); in snd_trident_create()
3518 spin_lock_init(&trident->voice_alloc); in snd_trident_create()
3523 trident->ChanPCM = pcm_streams; in snd_trident_create()
3526 trident->synth.max_size = max_wavetable_size * 1024; in snd_trident_create()
3527 trident->irq = -1; in snd_trident_create()
3529 trident->midi_port = TRID_REG(trident, T4D_MPU401_BASE); in snd_trident_create()
3533 kfree(trident); in snd_trident_create()
3537 trident->port = pci_resource_start(pci, 0); in snd_trident_create()
3540 KBUILD_MODNAME, trident)) { in snd_trident_create()
3542 snd_trident_free(trident); in snd_trident_create()
3545 trident->irq = pci->irq; in snd_trident_create()
3546 card->sync_irq = trident->irq; in snd_trident_create()
3549 trident->tlb.entries = NULL; in snd_trident_create()
3550 trident->tlb.buffer.area = NULL; in snd_trident_create()
3551 if (trident->device == TRIDENT_DEVICE_ID_NX) { in snd_trident_create()
3552 if ((err = snd_trident_tlb_alloc(trident)) < 0) { in snd_trident_create()
3553 snd_trident_free(trident); in snd_trident_create()
3558 trident->spdif_bits = trident->spdif_pcm_bits = SNDRV_PCM_DEFAULT_CON_SPDIF; in snd_trident_create()
3561 switch (trident->device) { in snd_trident_create()
3563 err = snd_trident_4d_dx_init(trident); in snd_trident_create()
3566 err = snd_trident_4d_nx_init(trident); in snd_trident_create()
3569 err = snd_trident_sis_init(trident); in snd_trident_create()
3576 snd_trident_free(trident); in snd_trident_create()
3580 if ((err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, trident, &ops)) < 0) { in snd_trident_create()
3581 snd_trident_free(trident); in snd_trident_create()
3585 if ((err = snd_trident_mixer(trident, pcm_spdif_device)) < 0) in snd_trident_create()
3590 voice = &trident->synth.voices[i]; in snd_trident_create()
3592 voice->trident = trident; in snd_trident_create()
3596 tmix = &trident->pcm_mixer[i]; in snd_trident_create()
3603 snd_trident_enable_eso(trident); in snd_trident_create()
3605 snd_trident_proc_init(trident); in snd_trident_create()
3606 *rtrident = trident; in snd_trident_create()
3622 static int snd_trident_free(struct snd_trident *trident) in snd_trident_free() argument
3624 snd_trident_free_gameport(trident); in snd_trident_free()
3625 snd_trident_disable_eso(trident); in snd_trident_free()
3627 if (trident->device == TRIDENT_DEVICE_ID_NX) in snd_trident_free()
3628 outb(0x00, TRID_REG(trident, NX_SPCTRL_SPCSO + 3)); in snd_trident_free()
3629 else if (trident->device == TRIDENT_DEVICE_ID_SI7018) { in snd_trident_free()
3630 outl(0, TRID_REG(trident, SI_SERIAL_INTF_CTRL)); in snd_trident_free()
3632 if (trident->irq >= 0) in snd_trident_free()
3633 free_irq(trident->irq, trident); in snd_trident_free()
3634 if (trident->tlb.buffer.area) { in snd_trident_free()
3635 outl(0, TRID_REG(trident, NX_TLBC)); in snd_trident_free()
3636 snd_util_memhdr_free(trident->tlb.memhdr); in snd_trident_free()
3637 if (trident->tlb.silent_page.area) in snd_trident_free()
3638 snd_dma_free_pages(&trident->tlb.silent_page); in snd_trident_free()
3639 vfree(trident->tlb.shadow_entries); in snd_trident_free()
3640 snd_dma_free_pages(&trident->tlb.buffer); in snd_trident_free()
3642 pci_release_regions(trident->pci); in snd_trident_free()
3643 pci_disable_device(trident->pci); in snd_trident_free()
3644 kfree(trident); in snd_trident_free()
3668 struct snd_trident *trident = dev_id; in snd_trident_interrupt() local
3673 audio_int = inl(TRID_REG(trident, T4D_MISCINT)); in snd_trident_interrupt()
3678 spin_lock(&trident->reg_lock); in snd_trident_interrupt()
3679 stimer = inl(TRID_REG(trident, T4D_STIMER)) & 0x00ffffff; in snd_trident_interrupt()
3680 chn_int = inl(TRID_REG(trident, T4D_AINT_A)); in snd_trident_interrupt()
3683 outl(chn_int, TRID_REG(trident, T4D_AINT_A)); /* ack */ in snd_trident_interrupt()
3685 chn_int = inl(TRID_REG(trident, T4D_AINT_B)); in snd_trident_interrupt()
3692 voice = &trident->synth.voices[channel]; in snd_trident_interrupt()
3694 outl(mask, TRID_REG(trident, T4D_STOP_B)); in snd_trident_interrupt()
3702 trident->spurious_irq_count++; in snd_trident_interrupt()
3703 if (trident->spurious_irq_max_delta < (unsigned int)delta) in snd_trident_interrupt()
3704 trident->spurious_irq_max_delta = delta; in snd_trident_interrupt()
3710 tmp = inw(TRID_REG(trident, T4D_SBBL_SBCL)); in snd_trident_interrupt()
3711 if (trident->bDMAStart & 0x40) in snd_trident_interrupt()
3716 tmp = inl(TRID_REG(trident, NX_SPCTRL_SPCSO)) & 0x00ffffff; in snd_trident_interrupt()
3724 snd_trident_stop_voice(trident, voice->number); in snd_trident_interrupt()
3725 snd_trident_write_eso_reg(trident, voice, tmp); in snd_trident_interrupt()
3726 snd_trident_start_voice(trident, voice->number); in snd_trident_interrupt()
3731 snd_trident_stop_voice(trident, voice->number); in snd_trident_interrupt()
3732 snd_trident_write_cso_reg(trident, voice, voice->isync_mark); in snd_trident_interrupt()
3733 snd_trident_write_eso_reg(trident, voice, voice->ESO); in snd_trident_interrupt()
3734 snd_trident_start_voice(trident, voice->number); in snd_trident_interrupt()
3739 snd_trident_stop_voice(trident, voice->extra->number); in snd_trident_interrupt()
3740 snd_trident_write_cso_reg(trident, voice->extra, 0); in snd_trident_interrupt()
3741 snd_trident_start_voice(trident, voice->extra->number); in snd_trident_interrupt()
3744 spin_unlock(&trident->reg_lock); in snd_trident_interrupt()
3746 spin_lock(&trident->reg_lock); in snd_trident_interrupt()
3748 outl(chn_int, TRID_REG(trident, T4D_AINT_B)); /* ack */ in snd_trident_interrupt()
3750 spin_unlock(&trident->reg_lock); in snd_trident_interrupt()
3753 if (trident->rmidi) { in snd_trident_interrupt()
3754 snd_mpu401_uart_interrupt(irq, trident->rmidi->private_data); in snd_trident_interrupt()
3756 inb(TRID_REG(trident, T4D_MPUR0)); in snd_trident_interrupt()
3763 struct snd_trident_voice *snd_trident_alloc_voice(struct snd_trident * trident, int type, int clien… in snd_trident_alloc_voice() argument
3769 spin_lock_irqsave(&trident->voice_alloc, flags); in snd_trident_alloc_voice()
3771 idx = snd_trident_allocate_pcm_channel(trident); in snd_trident_alloc_voice()
3773 spin_unlock_irqrestore(&trident->voice_alloc, flags); in snd_trident_alloc_voice()
3776 pvoice = &trident->synth.voices[idx]; in snd_trident_alloc_voice()
3783 spin_unlock_irqrestore(&trident->voice_alloc, flags); in snd_trident_alloc_voice()
3787 idx = snd_trident_allocate_synth_channel(trident); in snd_trident_alloc_voice()
3789 spin_unlock_irqrestore(&trident->voice_alloc, flags); in snd_trident_alloc_voice()
3792 pvoice = &trident->synth.voices[idx]; in snd_trident_alloc_voice()
3798 spin_unlock_irqrestore(&trident->voice_alloc, flags); in snd_trident_alloc_voice()
3803 spin_unlock_irqrestore(&trident->voice_alloc, flags); in snd_trident_alloc_voice()
3809 void snd_trident_free_voice(struct snd_trident * trident, struct snd_trident_voice *voice) in snd_trident_free_voice() argument
3816 snd_trident_clear_voices(trident, voice->number, voice->number); in snd_trident_free_voice()
3817 spin_lock_irqsave(&trident->voice_alloc, flags); in snd_trident_free_voice()
3822 snd_trident_free_pcm_channel(trident, voice->number); in snd_trident_free_voice()
3824 snd_trident_free_synth_channel(trident, voice->number); in snd_trident_free_voice()
3830 spin_unlock_irqrestore(&trident->voice_alloc, flags); in snd_trident_free_voice()
3837 static void snd_trident_clear_voices(struct snd_trident * trident, unsigned short v_min, unsigned s… in snd_trident_clear_voices() argument
3846 outl(mask[0], TRID_REG(trident, T4D_STOP_A)); in snd_trident_clear_voices()
3847 val = inl(TRID_REG(trident, T4D_AINTEN_A)); in snd_trident_clear_voices()
3848 outl(val & ~mask[0], TRID_REG(trident, T4D_AINTEN_A)); in snd_trident_clear_voices()
3851 outl(mask[1], TRID_REG(trident, T4D_STOP_B)); in snd_trident_clear_voices()
3852 val = inl(TRID_REG(trident, T4D_AINTEN_B)); in snd_trident_clear_voices()
3853 outl(val & ~mask[1], TRID_REG(trident, T4D_AINTEN_B)); in snd_trident_clear_voices()
3861 struct snd_trident *trident = card->private_data; in snd_trident_suspend() local
3863 trident->in_suspend = 1; in snd_trident_suspend()
3865 snd_ac97_suspend(trident->ac97); in snd_trident_suspend()
3866 snd_ac97_suspend(trident->ac97_sec); in snd_trident_suspend()
3873 struct snd_trident *trident = card->private_data; in snd_trident_resume() local
3875 switch (trident->device) { in snd_trident_resume()
3877 snd_trident_4d_dx_init(trident); in snd_trident_resume()
3880 snd_trident_4d_nx_init(trident); in snd_trident_resume()
3883 snd_trident_sis_init(trident); in snd_trident_resume()
3887 snd_ac97_resume(trident->ac97); in snd_trident_resume()
3888 snd_ac97_resume(trident->ac97_sec); in snd_trident_resume()
3891 outl(trident->musicvol_wavevol, TRID_REG(trident, T4D_MUSICVOL_WAVEVOL)); in snd_trident_resume()
3893 snd_trident_enable_eso(trident); in snd_trident_resume()
3896 trident->in_suspend = 0; in snd_trident_resume()