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,
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 err = snd_pcm_new(trident->card, "trident_dx_nx", device, trident->ChanPCM, 1, &pcm); in snd_trident_pcm()
2126 pcm->private_data = trident; in snd_trident_pcm()
2128 if (trident->tlb.entries) { in snd_trident_pcm()
2134 trident->device != TRIDENT_DEVICE_ID_SI7018 ? in snd_trident_pcm()
2141 trident->pcm = pcm; in snd_trident_pcm()
2143 if (trident->tlb.entries) { in snd_trident_pcm()
2147 &trident->pci->dev, in snd_trident_pcm()
2151 &trident->pci->dev, in snd_trident_pcm()
2155 &trident->pci->dev, in snd_trident_pcm()
2173 int snd_trident_foldback_pcm(struct snd_trident *trident, int device) in snd_trident_foldback_pcm() argument
2180 if (trident->device == TRIDENT_DEVICE_ID_NX) in snd_trident_foldback_pcm()
2182 err = snd_pcm_new(trident->card, "trident_dx_nx", device, 0, num_chan, &foldback); in snd_trident_foldback_pcm()
2186 foldback->private_data = trident; in snd_trident_foldback_pcm()
2187 if (trident->tlb.entries) in snd_trident_foldback_pcm()
2203 trident->foldback = foldback; in snd_trident_foldback_pcm()
2205 if (trident->tlb.entries) in snd_trident_foldback_pcm()
2207 &trident->pci->dev, in snd_trident_foldback_pcm()
2211 &trident->pci->dev, in snd_trident_foldback_pcm()
2228 int snd_trident_spdif_pcm(struct snd_trident *trident, int device) in snd_trident_spdif_pcm() argument
2233 err = snd_pcm_new(trident->card, "trident_dx_nx IEC958", device, 1, 0, &spdif); in snd_trident_spdif_pcm()
2237 spdif->private_data = trident; in snd_trident_spdif_pcm()
2238 if (trident->device != TRIDENT_DEVICE_ID_SI7018) { in snd_trident_spdif_pcm()
2245 trident->spdif = spdif; in snd_trident_spdif_pcm()
2248 &trident->pci->dev, 64*1024, 128*1024); in snd_trident_spdif_pcm()
2269 struct snd_trident *trident = snd_kcontrol_chip(kcontrol); in snd_trident_spdif_control_get() local
2272 spin_lock_irq(&trident->reg_lock); in snd_trident_spdif_control_get()
2273 val = trident->spdif_ctrl; in snd_trident_spdif_control_get()
2275 spin_unlock_irq(&trident->reg_lock); in snd_trident_spdif_control_get()
2282 struct snd_trident *trident = snd_kcontrol_chip(kcontrol); in snd_trident_spdif_control_put() local
2287 spin_lock_irq(&trident->reg_lock); in snd_trident_spdif_control_put()
2289 change = trident->spdif_ctrl != val; in snd_trident_spdif_control_put()
2290 trident->spdif_ctrl = val; in snd_trident_spdif_control_put()
2291 if (trident->device != TRIDENT_DEVICE_ID_SI7018) { in snd_trident_spdif_control_put()
2292 if ((inb(TRID_REG(trident, NX_SPCTRL_SPCSO + 3)) & 0x10) == 0) { in snd_trident_spdif_control_put()
2293 outl(trident->spdif_bits, TRID_REG(trident, NX_SPCSTATUS)); in snd_trident_spdif_control_put()
2294 outb(trident->spdif_ctrl, TRID_REG(trident, NX_SPCTRL_SPCSO + 3)); in snd_trident_spdif_control_put()
2297 if (trident->spdif == NULL) { in snd_trident_spdif_control_put()
2299 outl(trident->spdif_bits, TRID_REG(trident, SI_SPDIF_CS)); in snd_trident_spdif_control_put()
2300 temp = inl(TRID_REG(trident, SI_SERIAL_INTF_CTRL)) & ~SPDIF_EN; in snd_trident_spdif_control_put()
2303 outl(temp, TRID_REG(trident, SI_SERIAL_INTF_CTRL)); in snd_trident_spdif_control_put()
2306 spin_unlock_irq(&trident->reg_lock); in snd_trident_spdif_control_put()
2337 struct snd_trident *trident = snd_kcontrol_chip(kcontrol); in snd_trident_spdif_default_get() local
2339 spin_lock_irq(&trident->reg_lock); in snd_trident_spdif_default_get()
2340 ucontrol->value.iec958.status[0] = (trident->spdif_bits >> 0) & 0xff; in snd_trident_spdif_default_get()
2341 ucontrol->value.iec958.status[1] = (trident->spdif_bits >> 8) & 0xff; in snd_trident_spdif_default_get()
2342 ucontrol->value.iec958.status[2] = (trident->spdif_bits >> 16) & 0xff; in snd_trident_spdif_default_get()
2343 ucontrol->value.iec958.status[3] = (trident->spdif_bits >> 24) & 0xff; in snd_trident_spdif_default_get()
2344 spin_unlock_irq(&trident->reg_lock); in snd_trident_spdif_default_get()
2351 struct snd_trident *trident = snd_kcontrol_chip(kcontrol); in snd_trident_spdif_default_put() local
2359 spin_lock_irq(&trident->reg_lock); in snd_trident_spdif_default_put()
2360 change = trident->spdif_bits != val; in snd_trident_spdif_default_put()
2361 trident->spdif_bits = val; in snd_trident_spdif_default_put()
2362 if (trident->device != TRIDENT_DEVICE_ID_SI7018) { in snd_trident_spdif_default_put()
2363 if ((inb(TRID_REG(trident, NX_SPCTRL_SPCSO + 3)) & 0x10) == 0) in snd_trident_spdif_default_put()
2364 outl(trident->spdif_bits, TRID_REG(trident, NX_SPCSTATUS)); in snd_trident_spdif_default_put()
2366 if (trident->spdif == NULL) in snd_trident_spdif_default_put()
2367 outl(trident->spdif_bits, TRID_REG(trident, SI_SPDIF_CS)); in snd_trident_spdif_default_put()
2369 spin_unlock_irq(&trident->reg_lock); in snd_trident_spdif_default_put()
2432 struct snd_trident *trident = snd_kcontrol_chip(kcontrol); in snd_trident_spdif_stream_get() local
2434 spin_lock_irq(&trident->reg_lock); in snd_trident_spdif_stream_get()
2435 ucontrol->value.iec958.status[0] = (trident->spdif_pcm_bits >> 0) & 0xff; in snd_trident_spdif_stream_get()
2436 ucontrol->value.iec958.status[1] = (trident->spdif_pcm_bits >> 8) & 0xff; in snd_trident_spdif_stream_get()
2437 ucontrol->value.iec958.status[2] = (trident->spdif_pcm_bits >> 16) & 0xff; in snd_trident_spdif_stream_get()
2438 ucontrol->value.iec958.status[3] = (trident->spdif_pcm_bits >> 24) & 0xff; in snd_trident_spdif_stream_get()
2439 spin_unlock_irq(&trident->reg_lock); in snd_trident_spdif_stream_get()
2446 struct snd_trident *trident = snd_kcontrol_chip(kcontrol); in snd_trident_spdif_stream_put() local
2454 spin_lock_irq(&trident->reg_lock); in snd_trident_spdif_stream_put()
2455 change = trident->spdif_pcm_bits != val; in snd_trident_spdif_stream_put()
2456 trident->spdif_pcm_bits = val; in snd_trident_spdif_stream_put()
2457 if (trident->spdif != NULL) { in snd_trident_spdif_stream_put()
2458 if (trident->device != TRIDENT_DEVICE_ID_SI7018) { in snd_trident_spdif_stream_put()
2459 outl(trident->spdif_pcm_bits, TRID_REG(trident, NX_SPCSTATUS)); in snd_trident_spdif_stream_put()
2461 outl(trident->spdif_bits, TRID_REG(trident, SI_SPDIF_CS)); in snd_trident_spdif_stream_put()
2464 spin_unlock_irq(&trident->reg_lock); in snd_trident_spdif_stream_put()
2489 struct snd_trident *trident = snd_kcontrol_chip(kcontrol); in snd_trident_ac97_control_get() local
2492 spin_lock_irq(&trident->reg_lock); in snd_trident_ac97_control_get()
2493 val = trident->ac97_ctrl = inl(TRID_REG(trident, NX_ACR0_AC97_COM_STAT)); in snd_trident_ac97_control_get()
2495 spin_unlock_irq(&trident->reg_lock); in snd_trident_ac97_control_get()
2502 struct snd_trident *trident = snd_kcontrol_chip(kcontrol); in snd_trident_ac97_control_put() local
2506 spin_lock_irq(&trident->reg_lock); in snd_trident_ac97_control_put()
2507 val = trident->ac97_ctrl = inl(TRID_REG(trident, NX_ACR0_AC97_COM_STAT)); in snd_trident_ac97_control_put()
2511 change = val != trident->ac97_ctrl; in snd_trident_ac97_control_put()
2512 trident->ac97_ctrl = val; in snd_trident_ac97_control_put()
2513 outl(trident->ac97_ctrl = val, TRID_REG(trident, NX_ACR0_AC97_COM_STAT)); in snd_trident_ac97_control_put()
2514 spin_unlock_irq(&trident->reg_lock); in snd_trident_ac97_control_put()
2547 struct snd_trident *trident = snd_kcontrol_chip(kcontrol); in snd_trident_vol_control_get() local
2550 val = trident->musicvol_wavevol; in snd_trident_vol_control_get()
2561 struct snd_trident *trident = snd_kcontrol_chip(kcontrol); in snd_trident_vol_control_put() local
2565 spin_lock_irq(&trident->reg_lock); in snd_trident_vol_control_put()
2566 val = trident->musicvol_wavevol; in snd_trident_vol_control_put()
2570 change = val != trident->musicvol_wavevol; in snd_trident_vol_control_put()
2571 outl(trident->musicvol_wavevol = val, TRID_REG(trident, T4D_MUSICVOL_WAVEVOL)); in snd_trident_vol_control_put()
2572 spin_unlock_irq(&trident->reg_lock); in snd_trident_vol_control_put()
2607 struct snd_trident *trident = snd_kcontrol_chip(kcontrol); in snd_trident_pcm_vol_control_info() local
2613 if (trident->device == TRIDENT_DEVICE_ID_SI7018) in snd_trident_pcm_vol_control_info()
2621 struct snd_trident *trident = snd_kcontrol_chip(kcontrol); in snd_trident_pcm_vol_control_get() local
2622 …struct snd_trident_pcm_mixer *mix = &trident->pcm_mixer[snd_ctl_get_ioffnum(kcontrol, &ucontrol->i… in snd_trident_pcm_vol_control_get()
2624 if (trident->device == TRIDENT_DEVICE_ID_SI7018) { in snd_trident_pcm_vol_control_get()
2635 struct snd_trident *trident = snd_kcontrol_chip(kcontrol); in snd_trident_pcm_vol_control_put() local
2636 …struct snd_trident_pcm_mixer *mix = &trident->pcm_mixer[snd_ctl_get_ioffnum(kcontrol, &ucontrol->i… in snd_trident_pcm_vol_control_put()
2640 if (trident->device == TRIDENT_DEVICE_ID_SI7018) { in snd_trident_pcm_vol_control_put()
2645 spin_lock_irq(&trident->reg_lock); in snd_trident_pcm_vol_control_put()
2649 snd_trident_write_vol_reg(trident, mix->voice, val); in snd_trident_pcm_vol_control_put()
2650 spin_unlock_irq(&trident->reg_lock); in snd_trident_pcm_vol_control_put()
2685 struct snd_trident *trident = snd_kcontrol_chip(kcontrol); in snd_trident_pcm_pan_control_get() local
2686 …struct snd_trident_pcm_mixer *mix = &trident->pcm_mixer[snd_ctl_get_ioffnum(kcontrol, &ucontrol->i… in snd_trident_pcm_pan_control_get()
2700 struct snd_trident *trident = snd_kcontrol_chip(kcontrol); in snd_trident_pcm_pan_control_put() local
2701 …struct snd_trident_pcm_mixer *mix = &trident->pcm_mixer[snd_ctl_get_ioffnum(kcontrol, &ucontrol->i… in snd_trident_pcm_pan_control_put()
2709 spin_lock_irq(&trident->reg_lock); in snd_trident_pcm_pan_control_put()
2713 snd_trident_write_pan_reg(trident, mix->voice, val); in snd_trident_pcm_pan_control_put()
2714 spin_unlock_irq(&trident->reg_lock); in snd_trident_pcm_pan_control_put()
2748 struct snd_trident *trident = snd_kcontrol_chip(kcontrol); in snd_trident_pcm_rvol_control_get() local
2749 …struct snd_trident_pcm_mixer *mix = &trident->pcm_mixer[snd_ctl_get_ioffnum(kcontrol, &ucontrol->i… in snd_trident_pcm_rvol_control_get()
2758 struct snd_trident *trident = snd_kcontrol_chip(kcontrol); in snd_trident_pcm_rvol_control_put() local
2759 …struct snd_trident_pcm_mixer *mix = &trident->pcm_mixer[snd_ctl_get_ioffnum(kcontrol, &ucontrol->i… in snd_trident_pcm_rvol_control_put()
2764 spin_lock_irq(&trident->reg_lock); in snd_trident_pcm_rvol_control_put()
2768 snd_trident_write_rvol_reg(trident, mix->voice, val); in snd_trident_pcm_rvol_control_put()
2769 spin_unlock_irq(&trident->reg_lock); in snd_trident_pcm_rvol_control_put()
2806 struct snd_trident *trident = snd_kcontrol_chip(kcontrol); in snd_trident_pcm_cvol_control_get() local
2807 …struct snd_trident_pcm_mixer *mix = &trident->pcm_mixer[snd_ctl_get_ioffnum(kcontrol, &ucontrol->i… in snd_trident_pcm_cvol_control_get()
2816 struct snd_trident *trident = snd_kcontrol_chip(kcontrol); in snd_trident_pcm_cvol_control_put() local
2817 …struct snd_trident_pcm_mixer *mix = &trident->pcm_mixer[snd_ctl_get_ioffnum(kcontrol, &ucontrol->i… in snd_trident_pcm_cvol_control_put()
2822 spin_lock_irq(&trident->reg_lock); in snd_trident_pcm_cvol_control_put()
2826 snd_trident_write_cvol_reg(trident, mix->voice, val); in snd_trident_pcm_cvol_control_put()
2827 spin_unlock_irq(&trident->reg_lock); in snd_trident_pcm_cvol_control_put()
2860 static void snd_trident_notify_pcm_change(struct snd_trident *trident, in snd_trident_notify_pcm_change() argument
2864 snd_trident_notify_pcm_change1(trident->card, trident->ctl_vol, num, activate); in snd_trident_notify_pcm_change()
2865 snd_trident_notify_pcm_change1(trident->card, trident->ctl_pan, num, activate); in snd_trident_notify_pcm_change()
2866 snd_trident_notify_pcm_change1(trident->card, trident->ctl_rvol, num, activate); in snd_trident_notify_pcm_change()
2867 snd_trident_notify_pcm_change1(trident->card, trident->ctl_cvol, num, activate); in snd_trident_notify_pcm_change()
2870 static int snd_trident_pcm_mixer_build(struct snd_trident *trident, in snd_trident_pcm_mixer_build() argument
2876 if (snd_BUG_ON(!trident || !voice || !substream)) in snd_trident_pcm_mixer_build()
2878 tmix = &trident->pcm_mixer[substream->number]; in snd_trident_pcm_mixer_build()
2884 snd_trident_notify_pcm_change(trident, tmix, substream->number, 1); in snd_trident_pcm_mixer_build()
2888 static int snd_trident_pcm_mixer_free(struct snd_trident *trident, struct snd_trident_voice *voice,… in snd_trident_pcm_mixer_free() argument
2892 if (snd_BUG_ON(!trident || !substream)) in snd_trident_pcm_mixer_free()
2894 tmix = &trident->pcm_mixer[substream->number]; in snd_trident_pcm_mixer_free()
2896 snd_trident_notify_pcm_change(trident, tmix, substream->number, 0); in snd_trident_pcm_mixer_free()
2911 static int snd_trident_mixer(struct snd_trident *trident, int pcm_spdif_device) in snd_trident_mixer() argument
2914 struct snd_card *card = trident->card; in snd_trident_mixer()
2927 err = snd_ac97_bus(trident->card, 0, &ops, NULL, &trident->ac97_bus); in snd_trident_mixer()
2932 _ac97.private_data = trident; in snd_trident_mixer()
2933 trident->ac97_detect = 1; in snd_trident_mixer()
2936 err = snd_ac97_mixer(trident->ac97_bus, &_ac97, &trident->ac97); in snd_trident_mixer()
2938 if (trident->device == TRIDENT_DEVICE_ID_SI7018) { in snd_trident_mixer()
2939 err = snd_trident_sis_reset(trident); in snd_trident_mixer()
2950 if (trident->device == TRIDENT_DEVICE_ID_SI7018 && in snd_trident_mixer()
2951 (inl(TRID_REG(trident, SI_SERIAL_INTF_CTRL)) & SI_AC97_PRIMARY_READY) != 0) { in snd_trident_mixer()
2953 err = snd_ac97_mixer(trident->ac97_bus, &_ac97, &trident->ac97_sec); in snd_trident_mixer()
2955 dev_err(trident->card->dev, in snd_trident_mixer()
2960 err = snd_ac97_modem(trident->card, &_ac97, &mc97); in snd_trident_mixer()
2962 dev_err(trident->card->dev, in snd_trident_mixer()
2968 trident->ac97_detect = 0; in snd_trident_mixer()
2970 if (trident->device != TRIDENT_DEVICE_ID_SI7018) { in snd_trident_mixer()
2971 kctl = snd_ctl_new1(&snd_trident_vol_wave_control, trident); in snd_trident_mixer()
2976 kctl = snd_ctl_new1(&snd_trident_vol_music_control, trident); in snd_trident_mixer()
2981 outl(trident->musicvol_wavevol = 0x00000000, TRID_REG(trident, T4D_MUSICVOL_WAVEVOL)); in snd_trident_mixer()
2983 outl(trident->musicvol_wavevol = 0xffff0000, TRID_REG(trident, T4D_MUSICVOL_WAVEVOL)); in snd_trident_mixer()
2989 tmix = &trident->pcm_mixer[idx]; in snd_trident_mixer()
2992 trident->ctl_vol = snd_ctl_new1(&snd_trident_pcm_vol_control, trident); in snd_trident_mixer()
2993 if (!trident->ctl_vol) in snd_trident_mixer()
2995 err = snd_ctl_add(card, trident->ctl_vol); in snd_trident_mixer()
2999 trident->ctl_pan = snd_ctl_new1(&snd_trident_pcm_pan_control, trident); in snd_trident_mixer()
3000 if (!trident->ctl_pan) in snd_trident_mixer()
3002 err = snd_ctl_add(card, trident->ctl_pan); in snd_trident_mixer()
3006 trident->ctl_rvol = snd_ctl_new1(&snd_trident_pcm_rvol_control, trident); in snd_trident_mixer()
3007 if (!trident->ctl_rvol) in snd_trident_mixer()
3009 err = snd_ctl_add(card, trident->ctl_rvol); in snd_trident_mixer()
3013 trident->ctl_cvol = snd_ctl_new1(&snd_trident_pcm_cvol_control, trident); in snd_trident_mixer()
3014 if (!trident->ctl_cvol) in snd_trident_mixer()
3016 err = snd_ctl_add(card, trident->ctl_cvol); in snd_trident_mixer()
3020 if (trident->device == TRIDENT_DEVICE_ID_NX) { in snd_trident_mixer()
3021 kctl = snd_ctl_new1(&snd_trident_ac97_rear_control, trident); in snd_trident_mixer()
3027 if (trident->device == TRIDENT_DEVICE_ID_NX || trident->device == TRIDENT_DEVICE_ID_SI7018) { in snd_trident_mixer()
3029 kctl = snd_ctl_new1(&snd_trident_spdif_control, trident); in snd_trident_mixer()
3034 if (trident->ac97->ext_id & AC97_EI_SPDIF) in snd_trident_mixer()
3036 if (trident->ac97_sec && (trident->ac97_sec->ext_id & AC97_EI_SPDIF)) in snd_trident_mixer()
3044 kctl = snd_ctl_new1(&snd_trident_spdif_default, trident); in snd_trident_mixer()
3055 kctl = snd_ctl_new1(&snd_trident_spdif_mask, trident); in snd_trident_mixer()
3066 kctl = snd_ctl_new1(&snd_trident_spdif_stream, trident); in snd_trident_mixer()
3076 trident->spdif_pcm_ctl = kctl; in snd_trident_mixer()
3204 static int snd_trident_sis_reset(struct snd_trident *trident) in snd_trident_sis_reset() argument
3210 r = trident->in_suspend ? 0 : 2; /* count of retries */ in snd_trident_sis_reset()
3212 pci_write_config_byte(trident->pci, 0x46, 0x04); /* SOFTWARE RESET */ in snd_trident_sis_reset()
3214 pci_write_config_byte(trident->pci, 0x46, 0x00); in snd_trident_sis_reset()
3217 outb(0x00, TRID_REG(trident, SI_AC97_GPIO)); in snd_trident_sis_reset()
3220 outl(i, TRID_REG(trident, SI_SERIAL_INTF_CTRL)); in snd_trident_sis_reset()
3224 outl(i, TRID_REG(trident, SI_SERIAL_INTF_CTRL)); in snd_trident_sis_reset()
3229 if ((inl(TRID_REG(trident, SI_SERIAL_INTF_CTRL)) & SI_AC97_PRIMARY_READY) != 0) in snd_trident_sis_reset()
3231 do_delay(trident); in snd_trident_sis_reset()
3233 dev_err(trident->card->dev, "AC'97 codec ready error [0x%x]\n", in snd_trident_sis_reset()
3234 inl(TRID_REG(trident, SI_SERIAL_INTF_CTRL))); in snd_trident_sis_reset()
3238 do_delay(trident); in snd_trident_sis_reset()
3245 if ((inl(TRID_REG(trident, SI_SERIAL_INTF_CTRL)) & SI_AC97_SECONDARY_READY) != 0) in snd_trident_sis_reset()
3247 do_delay(trident); in snd_trident_sis_reset()
3250 outl(BANK_B_EN, TRID_REG(trident, T4D_LFO_GC_CIR)); in snd_trident_sis_reset()
3261 struct snd_trident *trident = entry->private_data; in snd_trident_proc_read() local
3264 switch (trident->device) { in snd_trident_proc_read()
3278 snd_iprintf(buffer, "Spurious IRQs : %d\n", trident->spurious_irq_count); in snd_trident_proc_read()
3279 snd_iprintf(buffer, "Spurious IRQ dlta: %d\n", trident->spurious_irq_max_delta); in snd_trident_proc_read()
3280 if (trident->device == TRIDENT_DEVICE_ID_NX || trident->device == TRIDENT_DEVICE_ID_SI7018) in snd_trident_proc_read()
3281 snd_iprintf(buffer, "IEC958 Mixer Out : %s\n", trident->spdif_ctrl == 0x28 ? "on" : "off"); in snd_trident_proc_read()
3282 if (trident->device == TRIDENT_DEVICE_ID_NX) { in snd_trident_proc_read()
3283 snd_iprintf(buffer, "Rear Speakers : %s\n", trident->ac97_ctrl & 0x00000010 ? "on" : "off"); in snd_trident_proc_read()
3284 if (trident->tlb.entries) { in snd_trident_proc_read()
3286 snd_iprintf(buffer, "Memory Maximum : %d\n", trident->tlb.memhdr->size); in snd_trident_proc_read()
3287 snd_iprintf(buffer, "Memory Used : %d\n", trident->tlb.memhdr->used); in snd_trident_proc_read()
3288 snd_iprintf(buffer, "Memory Free : %d\n", snd_util_mem_avail(trident->tlb.memhdr)); in snd_trident_proc_read()
3293 static void snd_trident_proc_init(struct snd_trident *trident) in snd_trident_proc_init() argument
3297 if (trident->device == TRIDENT_DEVICE_ID_SI7018) in snd_trident_proc_init()
3299 snd_card_ro_proc_new(trident->card, s, trident, snd_trident_proc_read); in snd_trident_proc_init()
3314 static int snd_trident_tlb_alloc(struct snd_trident *trident) in snd_trident_tlb_alloc() argument
3321 trident->tlb.buffer = in snd_trident_tlb_alloc()
3322 snd_devm_alloc_pages(&trident->pci->dev, SNDRV_DMA_TYPE_DEV, in snd_trident_tlb_alloc()
3324 if (!trident->tlb.buffer) { in snd_trident_tlb_alloc()
3325 dev_err(trident->card->dev, "unable to allocate TLB buffer\n"); in snd_trident_tlb_alloc()
3328trident->tlb.entries = (__le32 *)ALIGN((unsigned long)trident->tlb.buffer->area, SNDRV_TRIDENT_MAX… in snd_trident_tlb_alloc()
3329 trident->tlb.entries_dmaaddr = ALIGN(trident->tlb.buffer->addr, SNDRV_TRIDENT_MAX_PAGES * 4); in snd_trident_tlb_alloc()
3332 trident->tlb.silent_page = in snd_trident_tlb_alloc()
3333 snd_devm_alloc_pages(&trident->pci->dev, SNDRV_DMA_TYPE_DEV, in snd_trident_tlb_alloc()
3335 if (!trident->tlb.silent_page) { in snd_trident_tlb_alloc()
3336 dev_err(trident->card->dev, "unable to allocate silent page\n"); in snd_trident_tlb_alloc()
3339 memset(trident->tlb.silent_page->area, 0, SNDRV_TRIDENT_PAGE_SIZE); in snd_trident_tlb_alloc()
3341trident->tlb.entries[i] = cpu_to_le32(trident->tlb.silent_page->addr & ~(SNDRV_TRIDENT_PAGE_SIZE-1… in snd_trident_tlb_alloc()
3344 trident->tlb.memhdr = snd_util_memhdr_new(SNDRV_TRIDENT_PAGE_SIZE * SNDRV_TRIDENT_MAX_PAGES); in snd_trident_tlb_alloc()
3345 if (trident->tlb.memhdr == NULL) in snd_trident_tlb_alloc()
3348 trident->tlb.memhdr->block_extra_size = sizeof(struct snd_trident_memblk_arg); in snd_trident_tlb_alloc()
3356 static void snd_trident_stop_all_voices(struct snd_trident *trident) in snd_trident_stop_all_voices() argument
3358 outl(0xffffffff, TRID_REG(trident, T4D_STOP_A)); in snd_trident_stop_all_voices()
3359 outl(0xffffffff, TRID_REG(trident, T4D_STOP_B)); in snd_trident_stop_all_voices()
3360 outl(0, TRID_REG(trident, T4D_AINTEN_A)); in snd_trident_stop_all_voices()
3361 outl(0, TRID_REG(trident, T4D_AINTEN_B)); in snd_trident_stop_all_voices()
3364 static int snd_trident_4d_dx_init(struct snd_trident *trident) in snd_trident_4d_dx_init() argument
3366 struct pci_dev *pci = trident->pci; in snd_trident_4d_dx_init()
3379 outl(0x00000001, TRID_REG(trident, DX_ACR2_AC97_COM_STAT)); in snd_trident_4d_dx_init()
3381 outl(0x00000000, TRID_REG(trident, DX_ACR2_AC97_COM_STAT)); in snd_trident_4d_dx_init()
3383 trident->ac97_ctrl = 0x0000004a; in snd_trident_4d_dx_init()
3384 outl(trident->ac97_ctrl, TRID_REG(trident, DX_ACR2_AC97_COM_STAT)); in snd_trident_4d_dx_init()
3388 if ((inl(TRID_REG(trident, DX_ACR2_AC97_COM_STAT)) & 0x0010) != 0) in snd_trident_4d_dx_init()
3390 do_delay(trident); in snd_trident_4d_dx_init()
3392 dev_err(trident->card->dev, "AC'97 codec ready error\n"); in snd_trident_4d_dx_init()
3396 snd_trident_stop_all_voices(trident); in snd_trident_4d_dx_init()
3404 static int snd_trident_4d_nx_init(struct snd_trident *trident) in snd_trident_4d_nx_init() argument
3406 struct pci_dev *pci = trident->pci; in snd_trident_4d_nx_init()
3420 outl(0x00000001, TRID_REG(trident, NX_ACR0_AC97_COM_STAT)); in snd_trident_4d_nx_init()
3422 outl(0x00000000, TRID_REG(trident, NX_ACR0_AC97_COM_STAT)); in snd_trident_4d_nx_init()
3426 if ((inl(TRID_REG(trident, NX_ACR0_AC97_COM_STAT)) & 0x0008) != 0) in snd_trident_4d_nx_init()
3428 do_delay(trident); in snd_trident_4d_nx_init()
3430 dev_err(trident->card->dev, "AC'97 codec ready error [0x%x]\n", in snd_trident_4d_nx_init()
3431 inl(TRID_REG(trident, NX_ACR0_AC97_COM_STAT))); in snd_trident_4d_nx_init()
3436 trident->ac97_ctrl = 0x00000002; in snd_trident_4d_nx_init()
3437 outl(trident->ac97_ctrl, TRID_REG(trident, NX_ACR0_AC97_COM_STAT)); in snd_trident_4d_nx_init()
3439 outl(NX_SB_IRQ_DISABLE, TRID_REG(trident, T4D_MISCINT)); in snd_trident_4d_nx_init()
3441 snd_trident_stop_all_voices(trident); in snd_trident_4d_nx_init()
3443 if (trident->tlb.entries != NULL) { in snd_trident_4d_nx_init()
3446 i = trident->tlb.entries_dmaaddr; in snd_trident_4d_nx_init()
3448 outl(i, TRID_REG(trident, NX_TLBC)); in snd_trident_4d_nx_init()
3450 outl(0, TRID_REG(trident, NX_TLBC)); in snd_trident_4d_nx_init()
3453 outl(trident->spdif_bits, TRID_REG(trident, NX_SPCSTATUS)); in snd_trident_4d_nx_init()
3454 outb(trident->spdif_ctrl, TRID_REG(trident, NX_SPCTRL_SPCSO + 3)); in snd_trident_4d_nx_init()
3462 static int snd_trident_sis_init(struct snd_trident *trident) in snd_trident_sis_init() argument
3466 err = snd_trident_sis_reset(trident); in snd_trident_sis_init()
3470 snd_trident_stop_all_voices(trident); in snd_trident_sis_init()
3473 outl(trident->spdif_bits, TRID_REG(trident, SI_SPDIF_CS)); in snd_trident_sis_init()
3500 struct snd_trident *trident = card->private_data; in snd_trident_create() local
3516 trident->device = (pci->vendor << 16) | pci->device; in snd_trident_create()
3517 trident->card = card; in snd_trident_create()
3518 trident->pci = pci; in snd_trident_create()
3519 spin_lock_init(&trident->reg_lock); in snd_trident_create()
3520 spin_lock_init(&trident->event_lock); in snd_trident_create()
3521 spin_lock_init(&trident->voice_alloc); in snd_trident_create()
3526 trident->ChanPCM = pcm_streams; in snd_trident_create()
3529 trident->synth.max_size = max_wavetable_size * 1024; in snd_trident_create()
3530 trident->irq = -1; in snd_trident_create()
3533 trident->midi_port = TRID_REG(trident, T4D_MPU401_BASE); in snd_trident_create()
3539 trident->port = pci_resource_start(pci, 0); in snd_trident_create()
3542 IRQF_SHARED, KBUILD_MODNAME, trident)) { in snd_trident_create()
3546 trident->irq = pci->irq; in snd_trident_create()
3547 card->sync_irq = trident->irq; in snd_trident_create()
3550 trident->tlb.entries = NULL; in snd_trident_create()
3551 if (trident->device == TRIDENT_DEVICE_ID_NX) { in snd_trident_create()
3552 err = snd_trident_tlb_alloc(trident); in snd_trident_create()
3557 trident->spdif_bits = trident->spdif_pcm_bits = SNDRV_PCM_DEFAULT_CON_SPDIF; in snd_trident_create()
3560 switch (trident->device) { in snd_trident_create()
3562 err = snd_trident_4d_dx_init(trident); in snd_trident_create()
3565 err = snd_trident_4d_nx_init(trident); in snd_trident_create()
3568 err = snd_trident_sis_init(trident); in snd_trident_create()
3577 err = snd_trident_mixer(trident, pcm_spdif_device); in snd_trident_create()
3583 voice = &trident->synth.voices[i]; in snd_trident_create()
3585 voice->trident = trident; in snd_trident_create()
3589 tmix = &trident->pcm_mixer[i]; in snd_trident_create()
3596 snd_trident_enable_eso(trident); in snd_trident_create()
3598 snd_trident_proc_init(trident); in snd_trident_create()
3616 struct snd_trident *trident = card->private_data; in snd_trident_free() local
3618 snd_trident_free_gameport(trident); in snd_trident_free()
3619 snd_trident_disable_eso(trident); in snd_trident_free()
3621 if (trident->device == TRIDENT_DEVICE_ID_NX) in snd_trident_free()
3622 outb(0x00, TRID_REG(trident, NX_SPCTRL_SPCSO + 3)); in snd_trident_free()
3623 else if (trident->device == TRIDENT_DEVICE_ID_SI7018) { in snd_trident_free()
3624 outl(0, TRID_REG(trident, SI_SERIAL_INTF_CTRL)); in snd_trident_free()
3626 if (trident->tlb.buffer) { in snd_trident_free()
3627 outl(0, TRID_REG(trident, NX_TLBC)); in snd_trident_free()
3628 snd_util_memhdr_free(trident->tlb.memhdr); in snd_trident_free()
3652 struct snd_trident *trident = dev_id; in snd_trident_interrupt() local
3657 audio_int = inl(TRID_REG(trident, T4D_MISCINT)); in snd_trident_interrupt()
3662 spin_lock(&trident->reg_lock); in snd_trident_interrupt()
3663 stimer = inl(TRID_REG(trident, T4D_STIMER)) & 0x00ffffff; in snd_trident_interrupt()
3664 chn_int = inl(TRID_REG(trident, T4D_AINT_A)); in snd_trident_interrupt()
3667 outl(chn_int, TRID_REG(trident, T4D_AINT_A)); /* ack */ in snd_trident_interrupt()
3669 chn_int = inl(TRID_REG(trident, T4D_AINT_B)); in snd_trident_interrupt()
3676 voice = &trident->synth.voices[channel]; in snd_trident_interrupt()
3678 outl(mask, TRID_REG(trident, T4D_STOP_B)); in snd_trident_interrupt()
3686 trident->spurious_irq_count++; in snd_trident_interrupt()
3687 if (trident->spurious_irq_max_delta < (unsigned int)delta) in snd_trident_interrupt()
3688 trident->spurious_irq_max_delta = delta; in snd_trident_interrupt()
3694 tmp = inw(TRID_REG(trident, T4D_SBBL_SBCL)); in snd_trident_interrupt()
3695 if (trident->bDMAStart & 0x40) in snd_trident_interrupt()
3700 tmp = inl(TRID_REG(trident, NX_SPCTRL_SPCSO)) & 0x00ffffff; in snd_trident_interrupt()
3708 snd_trident_stop_voice(trident, voice->number); in snd_trident_interrupt()
3709 snd_trident_write_eso_reg(trident, voice, tmp); in snd_trident_interrupt()
3710 snd_trident_start_voice(trident, voice->number); in snd_trident_interrupt()
3715 snd_trident_stop_voice(trident, voice->number); in snd_trident_interrupt()
3716 snd_trident_write_cso_reg(trident, voice, voice->isync_mark); in snd_trident_interrupt()
3717 snd_trident_write_eso_reg(trident, voice, voice->ESO); in snd_trident_interrupt()
3718 snd_trident_start_voice(trident, voice->number); in snd_trident_interrupt()
3723 snd_trident_stop_voice(trident, voice->extra->number); in snd_trident_interrupt()
3724 snd_trident_write_cso_reg(trident, voice->extra, 0); in snd_trident_interrupt()
3725 snd_trident_start_voice(trident, voice->extra->number); in snd_trident_interrupt()
3728 spin_unlock(&trident->reg_lock); in snd_trident_interrupt()
3730 spin_lock(&trident->reg_lock); in snd_trident_interrupt()
3732 outl(chn_int, TRID_REG(trident, T4D_AINT_B)); /* ack */ in snd_trident_interrupt()
3734 spin_unlock(&trident->reg_lock); in snd_trident_interrupt()
3737 if (trident->rmidi) { in snd_trident_interrupt()
3738 snd_mpu401_uart_interrupt(irq, trident->rmidi->private_data); in snd_trident_interrupt()
3740 inb(TRID_REG(trident, T4D_MPUR0)); in snd_trident_interrupt()
3747 struct snd_trident_voice *snd_trident_alloc_voice(struct snd_trident * trident, int type, int clien… in snd_trident_alloc_voice() argument
3753 spin_lock_irqsave(&trident->voice_alloc, flags); in snd_trident_alloc_voice()
3755 idx = snd_trident_allocate_pcm_channel(trident); in snd_trident_alloc_voice()
3757 spin_unlock_irqrestore(&trident->voice_alloc, flags); in snd_trident_alloc_voice()
3760 pvoice = &trident->synth.voices[idx]; in snd_trident_alloc_voice()
3767 spin_unlock_irqrestore(&trident->voice_alloc, flags); in snd_trident_alloc_voice()
3771 idx = snd_trident_allocate_synth_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()
3782 spin_unlock_irqrestore(&trident->voice_alloc, flags); in snd_trident_alloc_voice()
3787 spin_unlock_irqrestore(&trident->voice_alloc, flags); in snd_trident_alloc_voice()
3793 void snd_trident_free_voice(struct snd_trident * trident, struct snd_trident_voice *voice) in snd_trident_free_voice() argument
3800 snd_trident_clear_voices(trident, voice->number, voice->number); in snd_trident_free_voice()
3801 spin_lock_irqsave(&trident->voice_alloc, flags); in snd_trident_free_voice()
3806 snd_trident_free_pcm_channel(trident, voice->number); in snd_trident_free_voice()
3808 snd_trident_free_synth_channel(trident, voice->number); in snd_trident_free_voice()
3814 spin_unlock_irqrestore(&trident->voice_alloc, flags); in snd_trident_free_voice()
3821 static void snd_trident_clear_voices(struct snd_trident * trident, unsigned short v_min, unsigned s… in snd_trident_clear_voices() argument
3830 outl(mask[0], TRID_REG(trident, T4D_STOP_A)); in snd_trident_clear_voices()
3831 val = inl(TRID_REG(trident, T4D_AINTEN_A)); in snd_trident_clear_voices()
3832 outl(val & ~mask[0], TRID_REG(trident, T4D_AINTEN_A)); in snd_trident_clear_voices()
3835 outl(mask[1], TRID_REG(trident, T4D_STOP_B)); in snd_trident_clear_voices()
3836 val = inl(TRID_REG(trident, T4D_AINTEN_B)); in snd_trident_clear_voices()
3837 outl(val & ~mask[1], TRID_REG(trident, T4D_AINTEN_B)); in snd_trident_clear_voices()
3845 struct snd_trident *trident = card->private_data; in snd_trident_suspend() local
3847 trident->in_suspend = 1; in snd_trident_suspend()
3849 snd_ac97_suspend(trident->ac97); in snd_trident_suspend()
3850 snd_ac97_suspend(trident->ac97_sec); in snd_trident_suspend()
3857 struct snd_trident *trident = card->private_data; in snd_trident_resume() local
3859 switch (trident->device) { in snd_trident_resume()
3861 snd_trident_4d_dx_init(trident); in snd_trident_resume()
3864 snd_trident_4d_nx_init(trident); in snd_trident_resume()
3867 snd_trident_sis_init(trident); in snd_trident_resume()
3871 snd_ac97_resume(trident->ac97); in snd_trident_resume()
3872 snd_ac97_resume(trident->ac97_sec); in snd_trident_resume()
3875 outl(trident->musicvol_wavevol, TRID_REG(trident, T4D_MUSICVOL_WAVEVOL)); in snd_trident_resume()
3877 snd_trident_enable_eso(trident); in snd_trident_resume()
3880 trident->in_suspend = 0; in snd_trident_resume()