2 * OSS driver for Linux 2.[46].x for
7 * Tvia/IGST CyberPro 5050
9 * Driver: Alan Cox <alan@redhat.com>
12 * Low level code: <audio@tridentmicro.com> from ALSA
13 * Framework: Thomas Sailer <sailer@ife.ee.ethz.ch>
14 * Extended by: Zach Brown <zab@redhat.com>
17 * Aaron Holtzman <aholtzma@ess.engr.uvic.ca>
18 * Ollie Lho <ollie@sis.com.tw> SiS 7018 Audio Core Support
19 * Ching-Ling Lee <cling-li@ali.com.tw> ALi 5451 Audio Core Support
20 * Matt Wu <mattwu@acersoftech.com.cn> ALi 5451 Audio Core Support
21 * Peter Wächtler <pwaechtler@loewe-komp.de> CyberPro5050 support
22 * Muli Ben-Yehuda <mulix@mulix.org>
25 * This program is free software; you can redistribute it and/or modify
26 * it under the terms of the GNU General Public License as published by
27 * the Free Software Foundation; either version 2 of the License, or
28 * (at your option) any later version.
30 * This program is distributed in the hope that it will be useful,
31 * but WITHOUT ANY WARRANTY; without even the implied warranty of
32 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
33 * GNU General Public License for more details.
35 * You should have received a copy of the GNU General Public License
36 * along with this program; if not, write to the Free Software
37 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
41 * January 3 2004 Eugene Teo <eugeneteo@eugeneteo.net>
42 * minor cleanup to use pr_debug instead of TRDBG since it is already
43 * defined in linux/kernel.h.
45 * December 29 2003 Muli Ben-Yehuda <mulix@mulix.org>
46 * major cleanup for 2.6, fix a few error patch buglets
47 * with returning without properly cleaning up first,
48 * get rid of lock_kernel().
50 * Sept 10 2002 Pascal Schmidt <der.eremit@email.de>
51 * added support for ALi 5451 joystick port
53 * Sept 05 2002 Alan Cox <alan@redhat.com>
54 * adapt to new pci joystick attachment interface
56 * July 24 2002 Muli Ben-Yehuda <mulix@actcom.co.il>
57 * patch from Eric Lemar (via Ian Soboroff): in suspend and resume,
58 * fix wrong cast from pci_dev* to struct trident_card*.
60 * July 19 2002 Muli Ben-Yehuda <mulix@actcom.co.il>
61 * rewrite the DMA buffer allocation/deallcoation functions, to make it
62 * modular and fix a bug where we would call free_pages on memory
63 * obtained with pci_alloc_consistent. Also remove unnecessary #ifdef
64 * CONFIG_PROC_FS and various other cleanups.
66 * July 19 2002 Muli Ben-Yehuda <mulix@actcom.co.il>
67 * made several printk(KERN_NOTICE...) into TRDBG(...), to avoid spamming
68 * my syslog with hundreds of messages.
70 * July 16 2002 Muli Ben-Yehuda <mulix@actcom.co.il>
71 * Cleaned up Lei Hu's 0.4.10 driver to conform to Documentation/CodingStyle
72 * and the coding style used in the rest of the file.
74 * June 23 2002 Muli Ben-Yehuda <mulix@actcom.co.il>
75 * add a missing unlock_set_fmt, remove a superflous lock/unlock pair
76 * with nothing in between.
78 * June 21 2002 Muli Ben-Yehuda <mulix@actcom.co.il>
79 * use a debug macro instead of #ifdef CONFIG_DEBUG, trim to 80 columns
80 * per line, use 'do {} while (0)' in statement macros.
82 * June 6 2002 Lei Hu <Lei_hu@ali.com.tw>
83 * rewrite the part to read/write registers of audio codec for Ali5451
85 * January 2 2002 Vojtech Pavlik <vojtech@ucw.cz> added gameport
86 * support to avoid resource conflict with pcigame.c
88 * October 8 2001 Arnaldo Carvalho de Melo <acme@conectiva.com.br>
89 * use set_current_state, properly release resources on failure in
90 * trident_probe, get rid of check_region
92 * August 10 2001 Peter Wächtler <pwaechtler@loewe-komp.de>
93 * added support for Tvia (formerly Integraphics/IGST) CyberPro5050
94 * this chip is often found in settop boxes (combined video+audio)
96 * Switch to static inline not extern inline (gcc 3)
99 * 0.14.9 crashed on rmmod due to a timer/bh left running. Simplified
100 * the existing logic (the BH doesn't help as ac97 is lock_irqsave)
101 * and used del_timer_sync to clean up
102 * Fixed a problem where the ALi change broke my generic card
104 * Jul 10 2001 Matt Wu
105 * Add H/W Volume Control
107 * July 7 2001 Alan Cox
108 * Moved Matt Wu's ac97 register cache into the card structure
110 * Apr 30 2001 Matt Wu
111 * Set EBUF1 and EBUF2 to still mode
112 * Add dc97/ac97 reset function
113 * Fix power management: ali_restore_regs
115 * Mar 09 2001 Matt Wu
116 * Add cache for ac97 access
118 * Feb 06 2001 Matt Wu
119 * Fix ac97 initialization
120 * Fix bug: an extra tail will be played when playing
121 * Jan 05 2001 Matt Wu
122 * Implement multi-channels and S/PDIF in support for ALi 1535+
124 * Nov 1 2000 Ching-Ling Lee
125 * Fix the bug of memory leak when switching 5.1-channels to 2 channels.
126 * Add lock protection into dynamic changing format of data.
127 * Oct 18 2000 Ching-Ling Lee
128 * 5.1-channels support for ALi
129 * June 28 2000 Ching-Ling Lee
130 * S/PDIF out/in(playback/record) support for ALi 1535+, using /proc to be selected by user
131 * Simple Power Management support for ALi
132 * v0.14.5 May 23 2000 Ollie Lho
133 * Misc bug fix from the Net
134 * v0.14.4 May 20 2000 Aaron Holtzman
135 * Fix kfree'd memory access in release
136 * Fix race in open while looking for a free virtual channel slot
137 * remove open_wait wq (which appears to be unused)
138 * v0.14.3 May 10 2000 Ollie Lho
139 * fixed a small bug in trident_update_ptr, xmms 1.0.1 no longer uses 100% CPU
140 * v0.14.2 Mar 29 2000 Ching-Ling Lee
141 * Add clear to silence advance in trident_update_ptr
142 * fix invalid data of the end of the sound
143 * v0.14.1 Mar 24 2000 Ching-Ling Lee
144 * ALi 5451 support added, playback and recording O.K.
145 * ALi 5451 originally developed and structured based on sonicvibes, and
146 * suggested to merge into this file by Alan Cox.
147 * v0.14 Mar 15 2000 Ollie Lho
148 * 5.1 channel output support with channel binding. What's the Matrix ?
149 * v0.13.1 Mar 10 2000 Ollie Lho
150 * few minor bugs on dual codec support, needs more testing
151 * v0.13 Mar 03 2000 Ollie Lho
152 * new pci_* for 2.4 kernel, back ported to 2.2
153 * v0.12 Feb 23 2000 Ollie Lho
154 * Preliminary Recording support
155 * v0.11.2 Feb 19 2000 Ollie Lho
156 * removed incomplete full-dulplex support
157 * v0.11.1 Jan 28 2000 Ollie Lho
158 * small bug in setting sample rate for 4d-nx (reported by Aaron)
159 * v0.11 Jan 27 2000 Ollie Lho
160 * DMA bug, scheduler latency, second try
161 * v0.10 Jan 24 2000 Ollie Lho
162 * DMA bug fixed, found kernel scheduling problem
163 * v0.09 Jan 20 2000 Ollie Lho
164 * Clean up of channel register access routine (prepare for channel binding)
165 * v0.08 Jan 14 2000 Ollie Lho
166 * Isolation of AC97 codec code
167 * v0.07 Jan 13 2000 Ollie Lho
168 * Get rid of ugly old low level access routines (e.g. CHRegs.lp****)
169 * v0.06 Jan 11 2000 Ollie Lho
170 * Preliminary support for dual (more ?) AC97 codecs
171 * v0.05 Jan 08 2000 Luca Montecchiani <m.luca@iname.com>
172 * adapt to 2.3.x new __setup/__init call
173 * v0.04 Dec 31 1999 Ollie Lho
174 * Multiple Open, using Middle Loop Interrupt to smooth playback
175 * v0.03 Dec 24 1999 Ollie Lho
176 * mem leak in prog_dmabuf and dealloc_dmabuf removed
177 * v0.02 Dec 15 1999 Ollie Lho
178 * SiS 7018 support added, playback O.K.
179 * v0.01 Alan Cox et. al.
180 * Initial Release in kernel 2.3.30, does not work
183 * Clean up of low level channel register access code. (done)
184 * Fix the bug on dma buffer management in update_ptr, read/write, drain_dac (done)
185 * Dual AC97 codecs support (done)
186 * Recording support (done)
188 * "Channel Binding" ioctl extension (done)
189 * new pci device driver interface for 2.4 kernel (done)
191 * Lock order (high->low)
192 * lock - hardware lock
193 * open_mutex - guard opens
194 * sem - guard dmabuf, write re-entry etc
197 #include <linux/module.h>
198 #include <linux/string.h>
199 #include <linux/ctype.h>
200 #include <linux/ioport.h>
201 #include <linux/sched.h>
202 #include <linux/delay.h>
203 #include <linux/sound.h>
204 #include <linux/slab.h>
205 #include <linux/soundcard.h>
206 #include <linux/pci.h>
207 #include <linux/init.h>
208 #include <linux/poll.h>
209 #include <linux/spinlock.h>
210 #include <linux/smp_lock.h>
211 #include <linux/ac97_codec.h>
212 #include <linux/bitops.h>
213 #include <linux/proc_fs.h>
214 #include <linux/interrupt.h>
215 #include <linux/pm.h>
216 #include <linux/gameport.h>
217 #include <linux/kernel.h>
218 #include <linux/mutex.h>
219 #include <linux/mm.h>
221 #include <asm/uaccess.h>
225 #if defined(CONFIG_ALPHA_NAUTILUS) || defined(CONFIG_ALPHA_GENERIC)
226 #include <asm/hwrpb.h>
231 #define DRIVER_VERSION "0.14.10j-2.6"
233 #if defined(CONFIG_GAMEPORT) || (defined(MODULE) && defined(CONFIG_GAMEPORT_MODULE))
234 #define SUPPORT_JOYSTICK 1
237 /* magic numbers to protect our data structures */
238 #define TRIDENT_CARD_MAGIC 0x5072696E /* "Prin" */
239 #define TRIDENT_STATE_MAGIC 0x63657373 /* "cess" */
241 #define TRIDENT_DMA_MASK 0x3fffffff /* DMA buffer mask for pci_alloc_consist */
242 #define ALI_DMA_MASK 0x7fffffff /* ALI Tridents have 31-bit DMA. Wow. */
246 /* maximum number of AC97 codecs connected, AC97 2.0 defined 4, but 7018 and 4D-NX only
247 have 2 SDATA_IN lines (currently) */
250 /* minor number of /dev/swmodem (temporary, experimental) */
251 #define SND_DEV_SWMODEM 7
253 static const unsigned ali_multi_channels_5_1[] = {
254 /*ALI_SURR_LEFT_CHANNEL, ALI_SURR_RIGHT_CHANNEL, */
257 ALI_SURR_LEFT_CHANNEL,
258 ALI_SURR_RIGHT_CHANNEL
261 static const unsigned sample_size[] = { 1, 2, 2, 4 };
262 static const unsigned sample_shift[] = { 0, 1, 1, 2 };
264 static const char invalid_magic[] = KERN_CRIT "trident: invalid magic value in %s\n";
274 static char *card_names[] = {
277 "SiS 7018 PCI Audio",
278 "ALi Audio Accelerator",
279 "Tvia/IGST CyberPro 5050"
282 static struct pci_device_id trident_pci_tbl[] = {
283 {PCI_DEVICE(PCI_VENDOR_ID_TRIDENT, PCI_DEVICE_ID_TRIDENT_4DWAVE_DX),
284 PCI_CLASS_MULTIMEDIA_AUDIO << 8, 0xffff00, TRIDENT_4D_DX},
285 {PCI_DEVICE(PCI_VENDOR_ID_TRIDENT, PCI_DEVICE_ID_TRIDENT_4DWAVE_NX),
286 0, 0, TRIDENT_4D_NX},
287 {PCI_DEVICE(PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_7018), 0, 0, SIS_7018},
288 {PCI_DEVICE(PCI_VENDOR_ID_ALI, PCI_DEVICE_ID_ALI_5451), 0, 0, ALI_5451},
289 {PCI_DEVICE(PCI_VENDOR_ID_INTERG, PCI_DEVICE_ID_INTERG_5050),
294 MODULE_DEVICE_TABLE(pci, trident_pci_tbl);
296 /* "software" or virtual channel, an instance of opened /dev/dsp */
297 struct trident_state {
299 struct trident_card *card; /* Card info */
304 /* virtual channel number */
308 /* wave sample stuff */
310 unsigned char fmt, enable;
312 /* hardware channel */
313 struct trident_channel *channel;
315 /* OSS buffer management stuff */
317 dma_addr_t dma_handle;
322 /* our buffer acts like a circular ring */
323 unsigned hwptr; /* where dma last started, updated by update_ptr */
324 unsigned swptr; /* where driver last clear/filled, updated by read/write */
325 int count; /* bytes to be comsumed or been generated by dma machine */
326 unsigned total_bytes; /* total bytes dmaed by hardware */
328 unsigned error; /* number of over/underruns */
329 /* put process on wait queue when no more space in buffer */
330 wait_queue_head_t wait;
332 /* redundant, but makes calculations easier */
335 unsigned fragsamples;
340 unsigned endcleared:1;
341 unsigned update_flag;
342 unsigned ossfragshift;
344 unsigned subdivision;
349 struct trident_state *other_states[4];
350 int multi_channels_adjust_count;
352 unsigned long fmt_flag;
353 /* Guard against mmap/write/read races */
358 /* hardware channels */
359 struct trident_channel {
360 int num; /* channel number */
361 u32 lba; /* Loop Begine Address, where dma buffer starts */
362 u32 eso; /* End Sample Offset, wehre dma buffer ends */
363 /* (in the unit of samples) */
364 u32 delta; /* delta value, sample rate / 48k for playback, */
365 /* 48k/sample rate for recording */
366 u16 attribute; /* control where PCM data go and come */
368 u32 control; /* signed/unsigned, 8/16 bits, mono/stereo */
371 struct trident_pcm_bank_address {
378 static struct trident_pcm_bank_address bank_a_addrs = {
385 static struct trident_pcm_bank_address bank_b_addrs = {
392 struct trident_pcm_bank {
393 /* register addresses to control bank operations */
394 struct trident_pcm_bank_address *addresses;
395 /* each bank has 32 channels */
396 u32 bitmap; /* channel allocation bitmap */
397 struct trident_channel channels[32];
400 struct trident_card {
403 /* We keep trident cards in a linked list */
404 struct trident_card *next;
406 /* single open lock mechanism, only used for recording */
407 struct mutex open_mutex;
409 /* The trident has a certain amount of cross channel interaction
410 so we use a single per card lock */
413 /* PCI device stuff */
414 struct pci_dev *pci_dev;
418 /* soundcore stuff */
421 /* structures for abstraction of hardware facilities, codecs, */
422 /* banks and channels */
423 struct ac97_codec *ac97_codec[NR_AC97];
424 struct trident_pcm_bank banks[NR_BANKS];
425 struct trident_state *states[NR_HW_CH];
427 /* hardware resources */
428 unsigned long iobase;
431 /* Function support */
432 struct trident_channel *(*alloc_pcm_channel) (struct trident_card *);
433 struct trident_channel *(*alloc_rec_pcm_channel) (struct trident_card *);
434 void (*free_pcm_channel) (struct trident_card *, unsigned int chan);
435 void (*address_interrupt) (struct trident_card *);
437 /* Added by Matt Wu 01-05-2001 for spdif in */
438 int multi_channel_use_count;
439 int rec_channel_use_count;
440 u16 mixer_regs[64][NR_AC97]; /* Made card local by Alan */
441 int mixer_regs_ready;
443 /* Added for hardware volume control */
445 struct timer_list timer;
447 /* Game port support */
448 struct gameport *gameport;
456 /* table to map from CHANNELMASK to channel attribute for SiS 7018 */
457 static u16 mask2attr[] = {
458 PCM_LR, PCM_LR, SURR_LR, CENTER_LFE,
459 HSET, MIC, MODEM_LINE1, MODEM_LINE2,
463 /* table to map from channel attribute to CHANNELMASK for SiS 7018 */
464 static int attr2mask[] = {
465 DSP_BIND_MODEM1, DSP_BIND_MODEM2, DSP_BIND_FRONT, DSP_BIND_HANDSET,
466 DSP_BIND_I2S, DSP_BIND_CENTER_LFE, DSP_BIND_SURR, DSP_BIND_SPDIF
469 /* Added by Matt Wu 01-05-2001 for spdif in */
470 static int ali_close_multi_channels(void);
471 static void ali_delay(struct trident_card *card, int interval);
472 static void ali_detect_spdif_rate(struct trident_card *card);
474 static void ali_ac97_write(struct ac97_codec *codec, u8 reg, u16 val);
475 static u16 ali_ac97_read(struct ac97_codec *codec, u8 reg);
477 static struct trident_card *devs;
479 static void trident_ac97_set(struct ac97_codec *codec, u8 reg, u16 val);
480 static u16 trident_ac97_get(struct ac97_codec *codec, u8 reg);
482 static int trident_open_mixdev(struct inode *inode, struct file *file);
483 static int trident_ioctl_mixdev(struct inode *inode, struct file *file,
484 unsigned int cmd, unsigned long arg);
486 static void ali_ac97_set(struct trident_card *card, int secondary, u8 reg, u16 val);
487 static u16 ali_ac97_get(struct trident_card *card, int secondary, u8 reg);
488 static void ali_set_spdif_out_rate(struct trident_card *card, unsigned int rate);
489 static void ali_enable_special_channel(struct trident_state *stat);
490 static struct trident_channel *ali_alloc_rec_pcm_channel(struct trident_card *card);
491 static struct trident_channel *ali_alloc_pcm_channel(struct trident_card *card);
492 static void ali_free_pcm_channel(struct trident_card *card, unsigned int channel);
493 static int ali_setup_multi_channels(struct trident_card *card, int chan_nums);
494 static unsigned int ali_get_spdif_in_rate(struct trident_card *card);
495 static void ali_setup_spdif_in(struct trident_card *card);
496 static void ali_disable_spdif_in(struct trident_card *card);
497 static void ali_disable_special_channel(struct trident_card *card, int ch);
498 static void ali_setup_spdif_out(struct trident_card *card, int flag);
499 static int ali_write_5_1(struct trident_state *state,
500 const char __user *buffer,
501 int cnt_for_multi_channel, unsigned int *copy_count,
502 unsigned int *state_cnt);
503 static int ali_allocate_other_states_resources(struct trident_state *state,
505 static void ali_free_other_states_resources(struct trident_state *state);
507 #define seek_offset(dma_ptr, buffer, cnt, offset, copy_count) do { \
508 (dma_ptr) += (offset); \
509 (buffer) += (offset); \
511 (copy_count) += (offset); \
514 static inline int lock_set_fmt(struct trident_state* state)
516 if (test_and_set_bit(0, &state->fmt_flag))
522 static inline void unlock_set_fmt(struct trident_state* state)
524 clear_bit(0, &state->fmt_flag);
528 trident_enable_loop_interrupts(struct trident_card *card)
532 global_control = inl(TRID_REG(card, T4D_LFO_GC_CIR));
534 switch (card->pci_id) {
535 case PCI_DEVICE_ID_SI_7018:
536 global_control |= (ENDLP_IE | MIDLP_IE | BANK_B_EN);
538 case PCI_DEVICE_ID_ALI_5451:
539 case PCI_DEVICE_ID_TRIDENT_4DWAVE_DX:
540 case PCI_DEVICE_ID_TRIDENT_4DWAVE_NX:
541 case PCI_DEVICE_ID_INTERG_5050:
542 global_control |= (ENDLP_IE | MIDLP_IE);
548 outl(global_control, TRID_REG(card, T4D_LFO_GC_CIR));
550 pr_debug("trident: Enable Loop Interrupts, globctl = 0x%08X\n",
551 inl(TRID_REG(card, T4D_LFO_GC_CIR)));
557 trident_disable_loop_interrupts(struct trident_card *card)
561 global_control = inl(TRID_REG(card, T4D_LFO_GC_CIR));
562 global_control &= ~(ENDLP_IE | MIDLP_IE);
563 outl(global_control, TRID_REG(card, T4D_LFO_GC_CIR));
565 pr_debug("trident: Disabled Loop Interrupts, globctl = 0x%08X\n",
572 trident_enable_voice_irq(struct trident_card *card, unsigned int channel)
574 unsigned int mask = 1 << (channel & 0x1f);
575 struct trident_pcm_bank *bank = &card->banks[channel >> 5];
576 u32 reg, addr = bank->addresses->aint_en;
578 reg = inl(TRID_REG(card, addr));
580 outl(reg, TRID_REG(card, addr));
583 reg = inl(TRID_REG(card, addr));
584 pr_debug("trident: enabled IRQ on channel %d, %s = 0x%08x(addr:%X)\n",
585 channel, addr == T4D_AINTEN_B ? "AINTEN_B" : "AINTEN_A",
591 trident_disable_voice_irq(struct trident_card *card, unsigned int channel)
593 unsigned int mask = 1 << (channel & 0x1f);
594 struct trident_pcm_bank *bank = &card->banks[channel >> 5];
595 u32 reg, addr = bank->addresses->aint_en;
597 reg = inl(TRID_REG(card, addr));
599 outl(reg, TRID_REG(card, addr));
601 /* Ack the channel in case the interrupt was set before we disable it. */
602 outl(mask, TRID_REG(card, bank->addresses->aint));
605 reg = inl(TRID_REG(card, addr));
606 pr_debug("trident: disabled IRQ on channel %d, %s = 0x%08x(addr:%X)\n",
607 channel, addr == T4D_AINTEN_B ? "AINTEN_B" : "AINTEN_A",
613 trident_start_voice(struct trident_card *card, unsigned int channel)
615 unsigned int mask = 1 << (channel & 0x1f);
616 struct trident_pcm_bank *bank = &card->banks[channel >> 5];
617 u32 addr = bank->addresses->start;
623 outl(mask, TRID_REG(card, addr));
626 reg = inl(TRID_REG(card, addr));
627 pr_debug("trident: start voice on channel %d, %s = 0x%08x(addr:%X)\n",
628 channel, addr == T4D_START_B ? "START_B" : "START_A",
634 trident_stop_voice(struct trident_card *card, unsigned int channel)
636 unsigned int mask = 1 << (channel & 0x1f);
637 struct trident_pcm_bank *bank = &card->banks[channel >> 5];
638 u32 addr = bank->addresses->stop;
644 outl(mask, TRID_REG(card, addr));
647 reg = inl(TRID_REG(card, addr));
648 pr_debug("trident: stop voice on channel %d, %s = 0x%08x(addr:%X)\n",
649 channel, addr == T4D_STOP_B ? "STOP_B" : "STOP_A",
655 trident_get_interrupt_mask(struct trident_card *card, unsigned int channel)
657 struct trident_pcm_bank *bank = &card->banks[channel];
658 u32 addr = bank->addresses->aint;
659 return inl(TRID_REG(card, addr));
663 trident_check_channel_interrupt(struct trident_card *card, unsigned int channel)
665 unsigned int mask = 1 << (channel & 0x1f);
666 u32 reg = trident_get_interrupt_mask(card, channel >> 5);
670 pr_debug("trident: channel %d has interrupt, %s = 0x%08x\n",
671 channel, reg == T4D_AINT_B ? "AINT_B" : "AINT_A",
674 return (reg & mask) ? 1 : 0;
678 trident_ack_channel_interrupt(struct trident_card *card, unsigned int channel)
680 unsigned int mask = 1 << (channel & 0x1f);
681 struct trident_pcm_bank *bank = &card->banks[channel >> 5];
682 u32 reg, addr = bank->addresses->aint;
684 reg = inl(TRID_REG(card, addr));
686 outl(reg, TRID_REG(card, addr));
689 reg = inl(TRID_REG(card, T4D_AINT_B));
690 pr_debug("trident: Ack channel %d interrupt, AINT_B = 0x%08x\n",
695 static struct trident_channel *
696 trident_alloc_pcm_channel(struct trident_card *card)
698 struct trident_pcm_bank *bank;
701 bank = &card->banks[BANK_B];
703 for (idx = 31; idx >= 0; idx--) {
704 if (!(bank->bitmap & (1 << idx))) {
705 struct trident_channel *channel = &bank->channels[idx];
706 bank->bitmap |= 1 << idx;
707 channel->num = idx + 32;
712 /* no more free channels available */
713 printk(KERN_ERR "trident: no more channels available on Bank B.\n");
718 trident_free_pcm_channel(struct trident_card *card, unsigned int channel)
723 if (channel < 31 || channel > 63)
726 if (card->pci_id == PCI_DEVICE_ID_TRIDENT_4DWAVE_DX ||
727 card->pci_id == PCI_DEVICE_ID_TRIDENT_4DWAVE_NX) {
728 b = inb(TRID_REG(card, T4D_REC_CH));
729 if ((b & ~0x80) == channel)
730 outb(0x0, TRID_REG(card, T4D_REC_CH));
734 channel = channel & 0x1f;
736 card->banks[bank].bitmap &= ~(1 << (channel));
739 static struct trident_channel *
740 cyber_alloc_pcm_channel(struct trident_card *card)
742 struct trident_pcm_bank *bank;
745 /* The cyberpro 5050 has only 32 voices and one bank */
746 /* .. at least they are not documented (if you want to call that
747 * crap documentation), perhaps broken ? */
749 bank = &card->banks[BANK_A];
751 for (idx = 31; idx >= 0; idx--) {
752 if (!(bank->bitmap & (1 << idx))) {
753 struct trident_channel *channel = &bank->channels[idx];
754 bank->bitmap |= 1 << idx;
760 /* no more free channels available */
761 printk(KERN_ERR "cyberpro5050: no more channels available on Bank A.\n");
766 cyber_free_pcm_channel(struct trident_card *card, unsigned int channel)
770 card->banks[BANK_A].bitmap &= ~(1 << (channel));
774 cyber_outidx(int port, int idx, int data)
777 outb(data, port + 1);
781 cyber_inidx(int port, int idx)
784 return inb(port + 1);
788 cyber_init_ritual(struct trident_card *card)
790 /* some black magic, taken from SDK samples */
791 /* remove this and nothing will work */
797 * Keep interrupts off for the configure - we don't want to
798 * clash with another cyberpro config event
801 spin_lock_irqsave(&card->lock, flags);
802 portDat = cyber_inidx(CYBER_PORT_AUDIO, CYBER_IDX_AUDIO_ENABLE);
803 /* enable, if it was disabled */
804 if ((portDat & CYBER_BMSK_AUENZ) != CYBER_BMSK_AUENZ_ENABLE) {
805 printk(KERN_INFO "cyberpro5050: enabling audio controller\n");
806 cyber_outidx(CYBER_PORT_AUDIO, CYBER_IDX_AUDIO_ENABLE,
807 portDat | CYBER_BMSK_AUENZ_ENABLE);
808 /* check again if hardware is enabled now */
809 portDat = cyber_inidx(CYBER_PORT_AUDIO, CYBER_IDX_AUDIO_ENABLE);
811 if ((portDat & CYBER_BMSK_AUENZ) != CYBER_BMSK_AUENZ_ENABLE) {
812 printk(KERN_ERR "cyberpro5050: initAudioAccess: no success\n");
815 cyber_outidx(CYBER_PORT_AUDIO, CYBER_IDX_IRQ_ENABLE,
816 CYBER_BMSK_AUDIO_INT_ENABLE);
817 cyber_outidx(CYBER_PORT_AUDIO, 0xbf, 0x01);
818 cyber_outidx(CYBER_PORT_AUDIO, 0xba, 0x20);
819 cyber_outidx(CYBER_PORT_AUDIO, 0xbb, 0x08);
820 cyber_outidx(CYBER_PORT_AUDIO, 0xbf, 0x02);
821 cyber_outidx(CYBER_PORT_AUDIO, 0xb3, 0x06);
822 cyber_outidx(CYBER_PORT_AUDIO, 0xbf, 0x00);
824 spin_unlock_irqrestore(&card->lock, flags);
828 /* called with spin lock held */
831 trident_load_channel_registers(struct trident_card *card, u32 * data,
832 unsigned int channel)
839 /* select hardware channel to write */
840 outb(channel, TRID_REG(card, T4D_LFO_GC_CIR));
842 /* Output the channel registers, but don't write register
843 three to an ALI chip. */
844 for (i = 0; i < CHANNEL_REGS; i++) {
845 if (i == 3 && card->pci_id == PCI_DEVICE_ID_ALI_5451)
847 outl(data[i], TRID_REG(card, CHANNEL_START + 4 * i));
849 if (card->pci_id == PCI_DEVICE_ID_ALI_5451 ||
850 card->pci_id == PCI_DEVICE_ID_INTERG_5050) {
851 outl(ALI_EMOD_Still, TRID_REG(card, ALI_EBUF1));
852 outl(ALI_EMOD_Still, TRID_REG(card, ALI_EBUF2));
857 /* called with spin lock held */
859 trident_write_voice_regs(struct trident_state *state)
861 unsigned int data[CHANNEL_REGS + 1];
862 struct trident_channel *channel;
864 channel = state->dmabuf.channel;
866 data[1] = channel->lba;
867 data[4] = channel->control;
869 switch (state->card->pci_id) {
870 case PCI_DEVICE_ID_ALI_5451:
871 data[0] = 0; /* Current Sample Offset */
872 data[2] = (channel->eso << 16) | (channel->delta & 0xffff);
875 case PCI_DEVICE_ID_SI_7018:
876 case PCI_DEVICE_ID_INTERG_5050:
877 data[0] = 0; /* Current Sample Offset */
878 data[2] = (channel->eso << 16) | (channel->delta & 0xffff);
879 data[3] = (channel->attribute << 16) | (channel->fm_vol & 0xffff);
881 case PCI_DEVICE_ID_TRIDENT_4DWAVE_DX:
882 data[0] = 0; /* Current Sample Offset */
883 data[2] = (channel->eso << 16) | (channel->delta & 0xffff);
884 data[3] = channel->fm_vol & 0xffff;
886 case PCI_DEVICE_ID_TRIDENT_4DWAVE_NX:
887 data[0] = (channel->delta << 24);
888 data[2] = ((channel->delta << 16) & 0xff000000) |
889 (channel->eso & 0x00ffffff);
890 data[3] = channel->fm_vol & 0xffff;
896 return trident_load_channel_registers(state->card, data, channel->num);
900 compute_rate_play(u32 rate)
903 /* We special case 44100 and 8000 since rounding with the equation
904 does not give us an accurate enough value. For 11025 and 22050
905 the equation gives us the best answer. All other frequencies will
906 also use the equation. JDW */
909 else if (rate == 8000)
911 else if (rate == 48000)
914 delta = (((rate << 12) + rate) / 48000) & 0x0000ffff;
919 compute_rate_rec(u32 rate)
925 else if (rate == 8000)
927 else if (rate == 48000)
930 delta = ((48000 << 12) / rate) & 0x0000ffff;
935 /* set playback sample rate */
937 trident_set_dac_rate(struct trident_state *state, unsigned int rate)
939 struct dmabuf *dmabuf = &state->dmabuf;
947 dmabuf->channel->delta = compute_rate_play(rate);
949 trident_write_voice_regs(state);
951 pr_debug("trident: called trident_set_dac_rate : rate = %d\n", rate);
956 /* set recording sample rate */
958 trident_set_adc_rate(struct trident_state *state, unsigned int rate)
960 struct dmabuf *dmabuf = &state->dmabuf;
968 dmabuf->channel->delta = compute_rate_rec(rate);
970 trident_write_voice_regs(state);
972 pr_debug("trident: called trident_set_adc_rate : rate = %d\n", rate);
977 /* prepare channel attributes for playback */
979 trident_play_setup(struct trident_state *state)
981 struct dmabuf *dmabuf = &state->dmabuf;
982 struct trident_channel *channel = dmabuf->channel;
984 channel->lba = dmabuf->dma_handle;
985 channel->delta = compute_rate_play(dmabuf->rate);
987 channel->eso = dmabuf->dmasize >> sample_shift[dmabuf->fmt];
990 if (state->card->pci_id != PCI_DEVICE_ID_SI_7018) {
991 channel->attribute = 0;
992 if (state->card->pci_id == PCI_DEVICE_ID_ALI_5451) {
993 if ((channel->num == ALI_SPDIF_IN_CHANNEL) ||
994 (channel->num == ALI_PCM_IN_CHANNEL))
995 ali_disable_special_channel(state->card, channel->num);
996 else if ((inl(TRID_REG(state->card, ALI_GLOBAL_CONTROL))
997 & ALI_SPDIF_OUT_CH_ENABLE)
998 && (channel->num == ALI_SPDIF_OUT_CHANNEL)) {
999 ali_set_spdif_out_rate(state->card,
1000 state->dmabuf.rate);
1001 state->dmabuf.channel->delta = 0x1000;
1006 channel->fm_vol = 0x0;
1008 channel->control = CHANNEL_LOOP;
1009 if (dmabuf->fmt & TRIDENT_FMT_16BIT) {
1011 channel->control |= CHANNEL_16BITS;
1013 channel->control |= CHANNEL_SIGNED;
1015 if (dmabuf->fmt & TRIDENT_FMT_STEREO)
1017 channel->control |= CHANNEL_STEREO;
1019 pr_debug("trident: trident_play_setup, LBA = 0x%08x, Delta = 0x%08x, "
1020 "ESO = 0x%08x, Control = 0x%08x\n", channel->lba,
1021 channel->delta, channel->eso, channel->control);
1023 trident_write_voice_regs(state);
1026 /* prepare channel attributes for recording */
1028 trident_rec_setup(struct trident_state *state)
1033 struct trident_card *card = state->card;
1034 struct dmabuf *dmabuf = &state->dmabuf;
1035 struct trident_channel *channel = dmabuf->channel;
1038 /* Enable AC-97 ADC (capture) */
1039 switch (card->pci_id) {
1040 case PCI_DEVICE_ID_ALI_5451:
1041 ali_enable_special_channel(state);
1043 case PCI_DEVICE_ID_SI_7018:
1044 /* for 7018, the ac97 is always in playback/record (duplex) mode */
1046 case PCI_DEVICE_ID_TRIDENT_4DWAVE_DX:
1047 w = inb(TRID_REG(card, DX_ACR2_AC97_COM_STAT));
1048 outb(w | 0x48, TRID_REG(card, DX_ACR2_AC97_COM_STAT));
1049 /* enable and set record channel */
1050 outb(0x80 | channel->num, TRID_REG(card, T4D_REC_CH));
1052 case PCI_DEVICE_ID_TRIDENT_4DWAVE_NX:
1053 w = inw(TRID_REG(card, T4D_MISCINT));
1054 outw(w | 0x1000, TRID_REG(card, T4D_MISCINT));
1055 /* enable and set record channel */
1056 outb(0x80 | channel->num, TRID_REG(card, T4D_REC_CH));
1058 case PCI_DEVICE_ID_INTERG_5050:
1059 /* don't know yet, using special channel 22 in GC1(0xd4)? */
1065 channel->lba = dmabuf->dma_handle;
1066 channel->delta = compute_rate_rec(dmabuf->rate);
1067 if ((card->pci_id == PCI_DEVICE_ID_ALI_5451) &&
1068 (channel->num == ALI_SPDIF_IN_CHANNEL)) {
1069 rate = ali_get_spdif_in_rate(card);
1071 printk(KERN_WARNING "trident: ALi 5451 "
1072 "S/PDIF input setup error!\n");
1075 bval = inb(TRID_REG(card, ALI_SPDIF_CTRL));
1077 outb(bval, TRID_REG(card, ALI_SPDIF_CTRL));
1078 printk(KERN_WARNING "trident: cleared ALi "
1079 "5451 S/PDIF parity error flag.\n");
1083 channel->delta = ((rate << 12) / dmabuf->rate) & 0x0000ffff;
1086 channel->eso = dmabuf->dmasize >> sample_shift[dmabuf->fmt];
1089 if (state->card->pci_id != PCI_DEVICE_ID_SI_7018) {
1090 channel->attribute = 0;
1093 channel->fm_vol = 0x0;
1095 channel->control = CHANNEL_LOOP;
1096 if (dmabuf->fmt & TRIDENT_FMT_16BIT) {
1098 channel->control |= CHANNEL_16BITS;
1100 channel->control |= CHANNEL_SIGNED;
1102 if (dmabuf->fmt & TRIDENT_FMT_STEREO)
1104 channel->control |= CHANNEL_STEREO;
1106 pr_debug("trident: trident_rec_setup, LBA = 0x%08x, Delat = 0x%08x, "
1107 "ESO = 0x%08x, Control = 0x%08x\n", channel->lba,
1108 channel->delta, channel->eso, channel->control);
1110 trident_write_voice_regs(state);
1113 /* get current playback/recording dma buffer pointer (byte offset from LBA),
1114 called with spinlock held! */
1115 static inline unsigned
1116 trident_get_dma_addr(struct trident_state *state)
1118 struct dmabuf *dmabuf = &state->dmabuf;
1121 if (!dmabuf->enable)
1124 outb(dmabuf->channel->num, TRID_REG(state->card, T4D_LFO_GC_CIR));
1126 switch (state->card->pci_id) {
1127 case PCI_DEVICE_ID_ALI_5451:
1128 case PCI_DEVICE_ID_SI_7018:
1129 case PCI_DEVICE_ID_TRIDENT_4DWAVE_DX:
1130 case PCI_DEVICE_ID_INTERG_5050:
1131 /* 16 bits ESO, CSO for 7018 and DX */
1132 cso = inw(TRID_REG(state->card, CH_DX_CSO_ALPHA_FMS + 2));
1134 case PCI_DEVICE_ID_TRIDENT_4DWAVE_NX:
1135 /* 24 bits ESO, CSO for NX */
1136 cso = inl(TRID_REG(state->card, CH_NX_DELTA_CSO)) & 0x00ffffff;
1142 pr_debug("trident: trident_get_dma_addr: chip reported channel: %d, "
1143 "cso = 0x%04x\n", dmabuf->channel->num, cso);
1145 /* ESO and CSO are in units of Samples, convert to byte offset */
1146 cso <<= sample_shift[dmabuf->fmt];
1148 return (cso % dmabuf->dmasize);
1151 /* Stop recording (lock held) */
1153 __stop_adc(struct trident_state *state)
1155 struct dmabuf *dmabuf = &state->dmabuf;
1156 unsigned int chan_num = dmabuf->channel->num;
1157 struct trident_card *card = state->card;
1159 dmabuf->enable &= ~ADC_RUNNING;
1160 trident_stop_voice(card, chan_num);
1161 trident_disable_voice_irq(card, chan_num);
1165 stop_adc(struct trident_state *state)
1167 struct trident_card *card = state->card;
1168 unsigned long flags;
1170 spin_lock_irqsave(&card->lock, flags);
1172 spin_unlock_irqrestore(&card->lock, flags);
1176 start_adc(struct trident_state *state)
1178 struct dmabuf *dmabuf = &state->dmabuf;
1179 unsigned int chan_num = dmabuf->channel->num;
1180 struct trident_card *card = state->card;
1181 unsigned long flags;
1183 spin_lock_irqsave(&card->lock, flags);
1184 if ((dmabuf->mapped ||
1185 dmabuf->count < (signed) dmabuf->dmasize) &&
1187 dmabuf->enable |= ADC_RUNNING;
1188 trident_enable_voice_irq(card, chan_num);
1189 trident_start_voice(card, chan_num);
1191 spin_unlock_irqrestore(&card->lock, flags);
1194 /* stop playback (lock held) */
1196 __stop_dac(struct trident_state *state)
1198 struct dmabuf *dmabuf = &state->dmabuf;
1199 unsigned int chan_num = dmabuf->channel->num;
1200 struct trident_card *card = state->card;
1202 dmabuf->enable &= ~DAC_RUNNING;
1203 trident_stop_voice(card, chan_num);
1204 if (state->chans_num == 6) {
1205 trident_stop_voice(card, state->other_states[0]->
1206 dmabuf.channel->num);
1207 trident_stop_voice(card, state->other_states[1]->
1208 dmabuf.channel->num);
1209 trident_stop_voice(card, state->other_states[2]->
1210 dmabuf.channel->num);
1211 trident_stop_voice(card, state->other_states[3]->
1212 dmabuf.channel->num);
1214 trident_disable_voice_irq(card, chan_num);
1218 stop_dac(struct trident_state *state)
1220 struct trident_card *card = state->card;
1221 unsigned long flags;
1223 spin_lock_irqsave(&card->lock, flags);
1225 spin_unlock_irqrestore(&card->lock, flags);
1229 start_dac(struct trident_state *state)
1231 struct dmabuf *dmabuf = &state->dmabuf;
1232 unsigned int chan_num = dmabuf->channel->num;
1233 struct trident_card *card = state->card;
1234 unsigned long flags;
1236 spin_lock_irqsave(&card->lock, flags);
1237 if ((dmabuf->mapped || dmabuf->count > 0) && dmabuf->ready) {
1238 dmabuf->enable |= DAC_RUNNING;
1239 trident_enable_voice_irq(card, chan_num);
1240 trident_start_voice(card, chan_num);
1241 if (state->chans_num == 6) {
1242 trident_start_voice(card, state->other_states[0]->
1243 dmabuf.channel->num);
1244 trident_start_voice(card, state->other_states[1]->
1245 dmabuf.channel->num);
1246 trident_start_voice(card, state->other_states[2]->
1247 dmabuf.channel->num);
1248 trident_start_voice(card, state->other_states[3]->
1249 dmabuf.channel->num);
1252 spin_unlock_irqrestore(&card->lock, flags);
1255 #define DMABUF_DEFAULTORDER (15-PAGE_SHIFT)
1256 #define DMABUF_MINORDER 1
1258 /* alloc a DMA buffer of with a buffer of this order */
1260 alloc_dmabuf(struct dmabuf *dmabuf, struct pci_dev *pci_dev, int order)
1262 void *rawbuf = NULL;
1263 struct page *page, *pend;
1265 if (!(rawbuf = pci_alloc_consistent(pci_dev, PAGE_SIZE << order,
1266 &dmabuf->dma_handle)))
1269 pr_debug("trident: allocated %ld (order = %d) bytes at %p\n",
1270 PAGE_SIZE << order, order, rawbuf);
1272 dmabuf->ready = dmabuf->mapped = 0;
1273 dmabuf->rawbuf = rawbuf;
1274 dmabuf->buforder = order;
1276 /* now mark the pages as reserved; otherwise */
1277 /* remap_pfn_range doesn't do what we want */
1278 pend = virt_to_page(rawbuf + (PAGE_SIZE << order) - 1);
1279 for (page = virt_to_page(rawbuf); page <= pend; page++)
1280 SetPageReserved(page);
1285 /* allocate the main DMA buffer, playback and recording buffer should be */
1286 /* allocated separately */
1288 alloc_main_dmabuf(struct trident_state *state)
1290 struct dmabuf *dmabuf = &state->dmabuf;
1294 /* alloc as big a chunk as we can, FIXME: is this necessary ?? */
1295 for (order = DMABUF_DEFAULTORDER; order >= DMABUF_MINORDER; order--) {
1296 if (!(ret = alloc_dmabuf(dmabuf, state->card->pci_dev, order)))
1298 /* else try again */
1303 /* deallocate a DMA buffer */
1305 dealloc_dmabuf(struct dmabuf *dmabuf, struct pci_dev *pci_dev)
1307 struct page *page, *pend;
1309 if (dmabuf->rawbuf) {
1310 /* undo marking the pages as reserved */
1311 pend = virt_to_page(dmabuf->rawbuf + (PAGE_SIZE << dmabuf->buforder) - 1);
1312 for (page = virt_to_page(dmabuf->rawbuf); page <= pend; page++)
1313 ClearPageReserved(page);
1314 pci_free_consistent(pci_dev, PAGE_SIZE << dmabuf->buforder,
1315 dmabuf->rawbuf, dmabuf->dma_handle);
1316 dmabuf->rawbuf = NULL;
1318 dmabuf->mapped = dmabuf->ready = 0;
1322 prog_dmabuf(struct trident_state *state, enum dmabuf_mode rec)
1324 struct dmabuf *dmabuf = &state->dmabuf;
1325 unsigned bytepersec;
1326 struct trident_state *s = state;
1327 unsigned bufsize, dma_nums;
1328 unsigned long flags;
1331 if ((ret = lock_set_fmt(state)) < 0)
1334 if (state->chans_num == 6)
1339 for (i = 0; i < dma_nums; i++) {
1341 s = state->other_states[i - 1];
1342 dmabuf = &s->dmabuf;
1343 dmabuf->fmt = state->dmabuf.fmt;
1344 dmabuf->rate = state->dmabuf.rate;
1347 spin_lock_irqsave(&s->card->lock, flags);
1348 dmabuf->hwptr = dmabuf->swptr = dmabuf->total_bytes = 0;
1349 dmabuf->count = dmabuf->error = 0;
1350 spin_unlock_irqrestore(&s->card->lock, flags);
1352 /* allocate DMA buffer if not allocated yet */
1353 if (!dmabuf->rawbuf) {
1355 if ((ret = alloc_main_dmabuf(state))) {
1356 unlock_set_fmt(state);
1361 order = state->dmabuf.buforder - 1;
1362 if (order >= DMABUF_MINORDER) {
1363 ret = alloc_dmabuf(dmabuf,
1364 state->card->pci_dev,
1368 /* release the main DMA buffer */
1369 dealloc_dmabuf(&state->dmabuf, state->card->pci_dev);
1370 /* release the auxiliary DMA buffers */
1371 for (i -= 2; i >= 0; i--)
1372 dealloc_dmabuf(&state->other_states[i]->dmabuf,
1373 state->card->pci_dev);
1374 unlock_set_fmt(state);
1379 /* FIXME: figure out all this OSS fragment stuff */
1380 bytepersec = dmabuf->rate << sample_shift[dmabuf->fmt];
1381 bufsize = PAGE_SIZE << dmabuf->buforder;
1382 if (dmabuf->ossfragshift) {
1383 if ((1000 << dmabuf->ossfragshift) < bytepersec)
1384 dmabuf->fragshift = ld2(bytepersec / 1000);
1386 dmabuf->fragshift = dmabuf->ossfragshift;
1388 /* lets hand out reasonable big ass buffers by default */
1389 dmabuf->fragshift = (dmabuf->buforder + PAGE_SHIFT - 2);
1391 dmabuf->numfrag = bufsize >> dmabuf->fragshift;
1392 while (dmabuf->numfrag < 4 && dmabuf->fragshift > 3) {
1393 dmabuf->fragshift--;
1394 dmabuf->numfrag = bufsize >> dmabuf->fragshift;
1396 dmabuf->fragsize = 1 << dmabuf->fragshift;
1397 if (dmabuf->ossmaxfrags >= 4 && dmabuf->ossmaxfrags < dmabuf->numfrag)
1398 dmabuf->numfrag = dmabuf->ossmaxfrags;
1399 dmabuf->fragsamples = dmabuf->fragsize >> sample_shift[dmabuf->fmt];
1400 dmabuf->dmasize = dmabuf->numfrag << dmabuf->fragshift;
1402 memset(dmabuf->rawbuf, (dmabuf->fmt & TRIDENT_FMT_16BIT) ? 0 : 0x80,
1405 spin_lock_irqsave(&s->card->lock, flags);
1406 if (rec == DM_RECORD)
1407 trident_rec_setup(s);
1408 else /* DM_PLAYBACK */
1409 trident_play_setup(s);
1411 spin_unlock_irqrestore(&s->card->lock, flags);
1413 /* set the ready flag for the dma buffer */
1416 pr_debug("trident: prog_dmabuf(%d), sample rate = %d, "
1417 "format = %d, numfrag = %d, fragsize = %d "
1418 "dmasize = %d\n", dmabuf->channel->num,
1419 dmabuf->rate, dmabuf->fmt, dmabuf->numfrag,
1420 dmabuf->fragsize, dmabuf->dmasize);
1422 unlock_set_fmt(state);
1427 static inline int prog_dmabuf_record(struct trident_state* state)
1429 return prog_dmabuf(state, DM_RECORD);
1432 static inline int prog_dmabuf_playback(struct trident_state* state)
1434 return prog_dmabuf(state, DM_PLAYBACK);
1437 /* we are doing quantum mechanics here, the buffer can only be empty, half or full filled i.e.
1438 |------------|------------| or |xxxxxxxxxxxx|------------| or |xxxxxxxxxxxx|xxxxxxxxxxxx|
1439 but we almost always get this
1440 |xxxxxx------|------------| or |xxxxxxxxxxxx|xxxxx-------|
1441 so we have to clear the tail space to "silence"
1442 |xxxxxx000000|------------| or |xxxxxxxxxxxx|xxxxxx000000|
1445 trident_clear_tail(struct trident_state *state)
1447 struct dmabuf *dmabuf = &state->dmabuf;
1449 unsigned char silence = (dmabuf->fmt & TRIDENT_FMT_16BIT) ? 0 : 0x80;
1451 unsigned long flags;
1453 spin_lock_irqsave(&state->card->lock, flags);
1454 swptr = dmabuf->swptr;
1455 spin_unlock_irqrestore(&state->card->lock, flags);
1457 if (swptr == 0 || swptr == dmabuf->dmasize / 2 ||
1458 swptr == dmabuf->dmasize)
1461 if (swptr < dmabuf->dmasize / 2)
1462 len = dmabuf->dmasize / 2 - swptr;
1464 len = dmabuf->dmasize - swptr;
1466 memset(dmabuf->rawbuf + swptr, silence, len);
1467 if (state->card->pci_id != PCI_DEVICE_ID_ALI_5451) {
1468 spin_lock_irqsave(&state->card->lock, flags);
1469 dmabuf->swptr += len;
1470 dmabuf->count += len;
1471 spin_unlock_irqrestore(&state->card->lock, flags);
1474 /* restart the dma machine in case it is halted */
1479 drain_dac(struct trident_state *state, int nonblock)
1481 DECLARE_WAITQUEUE(wait, current);
1482 struct dmabuf *dmabuf = &state->dmabuf;
1483 unsigned long flags;
1486 unsigned long diff = 0;
1488 if (dmabuf->mapped || !dmabuf->ready)
1491 add_wait_queue(&dmabuf->wait, &wait);
1493 /* It seems that we have to set the current state to TASK_INTERRUPTIBLE
1494 every time to make the process really go to sleep */
1495 set_current_state(TASK_INTERRUPTIBLE);
1497 spin_lock_irqsave(&state->card->lock, flags);
1498 count = dmabuf->count;
1499 spin_unlock_irqrestore(&state->card->lock, flags);
1504 if (signal_pending(current))
1508 remove_wait_queue(&dmabuf->wait, &wait);
1509 set_current_state(TASK_RUNNING);
1513 /* No matter how much data is left in the buffer, we have to wait until
1514 CSO == ESO/2 or CSO == ESO when address engine interrupts */
1515 if (state->card->pci_id == PCI_DEVICE_ID_ALI_5451 ||
1516 state->card->pci_id == PCI_DEVICE_ID_INTERG_5050) {
1517 diff = dmabuf->swptr - trident_get_dma_addr(state) + dmabuf->dmasize;
1518 diff = diff % (dmabuf->dmasize);
1519 tmo = (diff * HZ) / dmabuf->rate;
1521 tmo = (dmabuf->dmasize * HZ) / dmabuf->rate;
1523 tmo >>= sample_shift[dmabuf->fmt];
1524 if (!schedule_timeout(tmo ? tmo : 1) && tmo) {
1528 remove_wait_queue(&dmabuf->wait, &wait);
1529 set_current_state(TASK_RUNNING);
1530 if (signal_pending(current))
1531 return -ERESTARTSYS;
1536 /* update buffer manangement pointers, especially, */
1537 /* dmabuf->count and dmabuf->hwptr */
1539 trident_update_ptr(struct trident_state *state)
1541 struct dmabuf *dmabuf = &state->dmabuf;
1542 unsigned hwptr, swptr;
1545 unsigned char silence;
1546 unsigned half_dmasize;
1548 /* update hardware pointer */
1549 hwptr = trident_get_dma_addr(state);
1550 diff = (dmabuf->dmasize + hwptr - dmabuf->hwptr) % dmabuf->dmasize;
1551 dmabuf->hwptr = hwptr;
1552 dmabuf->total_bytes += diff;
1554 /* error handling and process wake up for ADC */
1555 if (dmabuf->enable == ADC_RUNNING) {
1556 if (dmabuf->mapped) {
1557 dmabuf->count -= diff;
1558 if (dmabuf->count >= (signed) dmabuf->fragsize)
1559 wake_up(&dmabuf->wait);
1561 dmabuf->count += diff;
1563 if (dmabuf->count < 0 ||
1564 dmabuf->count > dmabuf->dmasize) {
1565 /* buffer underrun or buffer overrun, */
1566 /* we have no way to recover it here, just */
1567 /* stop the machine and let the process */
1568 /* force hwptr and swptr to sync */
1572 if (dmabuf->count < (signed) dmabuf->dmasize / 2)
1573 wake_up(&dmabuf->wait);
1577 /* error handling and process wake up for DAC */
1578 if (dmabuf->enable == DAC_RUNNING) {
1579 if (dmabuf->mapped) {
1580 dmabuf->count += diff;
1581 if (dmabuf->count >= (signed) dmabuf->fragsize)
1582 wake_up(&dmabuf->wait);
1584 dmabuf->count -= diff;
1586 if (dmabuf->count < 0 ||
1587 dmabuf->count > dmabuf->dmasize) {
1588 /* buffer underrun or buffer overrun, we have no way to recover
1589 it here, just stop the machine and let the process force hwptr
1590 and swptr to sync */
1593 } else if (!dmabuf->endcleared) {
1594 swptr = dmabuf->swptr;
1595 silence = (dmabuf->fmt & TRIDENT_FMT_16BIT ? 0 : 0x80);
1596 if (dmabuf->update_flag & ALI_ADDRESS_INT_UPDATE) {
1597 /* We must clear end data of 1/2 dmabuf if needed.
1598 According to 1/2 algorithm of Address Engine Interrupt,
1599 check the validation of the data of half dmasize. */
1600 half_dmasize = dmabuf->dmasize / 2;
1601 if ((diff = hwptr - half_dmasize) < 0)
1603 if ((dmabuf->count + diff) < half_dmasize) {
1604 //there is invalid data in the end of half buffer
1605 if ((clear_cnt = half_dmasize - swptr) < 0)
1606 clear_cnt += half_dmasize;
1607 //clear the invalid data
1608 memset(dmabuf->rawbuf + swptr, silence, clear_cnt);
1609 if (state->chans_num == 6) {
1610 clear_cnt = clear_cnt / 2;
1612 memset(state->other_states[0]->dmabuf.rawbuf + swptr,
1613 silence, clear_cnt);
1614 memset(state->other_states[1]->dmabuf.rawbuf + swptr,
1615 silence, clear_cnt);
1616 memset(state->other_states[2]->dmabuf.rawbuf + swptr,
1617 silence, clear_cnt);
1618 memset(state->other_states[3]->dmabuf.rawbuf + swptr,
1619 silence, clear_cnt);
1621 dmabuf->endcleared = 1;
1623 } else if (dmabuf->count < (signed) dmabuf->fragsize) {
1624 clear_cnt = dmabuf->fragsize;
1625 if ((swptr + clear_cnt) > dmabuf->dmasize)
1626 clear_cnt = dmabuf->dmasize - swptr;
1627 memset(dmabuf->rawbuf + swptr, silence, clear_cnt);
1628 if (state->chans_num == 6) {
1629 clear_cnt = clear_cnt / 2;
1631 memset(state->other_states[0]->dmabuf.rawbuf + swptr,
1632 silence, clear_cnt);
1633 memset(state->other_states[1]->dmabuf.rawbuf + swptr,
1634 silence, clear_cnt);
1635 memset(state->other_states[2]->dmabuf.rawbuf + swptr,
1636 silence, clear_cnt);
1637 memset(state->other_states[3]->dmabuf.rawbuf + swptr,
1638 silence, clear_cnt);
1640 dmabuf->endcleared = 1;
1643 /* trident_update_ptr is called by interrupt handler or by process via
1644 ioctl/poll, we only wake up the waiting process when we have more
1645 than 1/2 buffer free (always true for interrupt handler) */
1646 if (dmabuf->count < (signed) dmabuf->dmasize / 2)
1647 wake_up(&dmabuf->wait);
1650 dmabuf->update_flag &= ~ALI_ADDRESS_INT_UPDATE;
1654 trident_address_interrupt(struct trident_card *card)
1657 struct trident_state *state;
1658 unsigned int channel;
1660 /* Update the pointers for all channels we are running. */
1661 /* FIXME: should read interrupt status only once */
1662 for (i = 0; i < NR_HW_CH; i++) {
1664 if (trident_check_channel_interrupt(card, channel)) {
1665 trident_ack_channel_interrupt(card, channel);
1666 if ((state = card->states[i]) != NULL) {
1667 trident_update_ptr(state);
1669 printk(KERN_WARNING "trident: spurious channel "
1670 "irq %d.\n", channel);
1671 trident_stop_voice(card, channel);
1672 trident_disable_voice_irq(card, channel);
1679 ali_hwvol_control(struct trident_card *card, int opt)
1681 u16 dwTemp, volume[2], mute, diff, *pVol[2];
1683 dwTemp = ali_ac97_read(card->ac97_codec[0], 0x02);
1684 mute = dwTemp & 0x8000;
1685 volume[0] = dwTemp & 0x001f;
1686 volume[1] = (dwTemp & 0x1f00) >> 8;
1687 if (volume[0] < volume[1]) {
1688 pVol[0] = &volume[0];
1689 pVol[1] = &volume[1];
1691 pVol[1] = &volume[0];
1692 pVol[0] = &volume[1];
1694 diff = *(pVol[1]) - *(pVol[0]);
1696 if (opt == 1) { // MUTE
1698 ali_ac97_write(card->ac97_codec[0],
1700 } else if (opt == 2) { // Down
1703 if (*(pVol[1]) < 0x001f) {
1705 *(pVol[0]) = *(pVol[1]) - diff;
1708 dwTemp |= (volume[0]) | (volume[1] << 8);
1709 ali_ac97_write(card->ac97_codec[0], 0x02, dwTemp);
1710 card->ac97_codec[0]->mixer_state[0] = ((32 - volume[0]) * 25 / 8) |
1711 (((32 - volume[1]) * 25 / 8) << 8);
1712 } else if (opt == 4) { // Up
1715 if (*(pVol[0]) > 0) {
1717 *(pVol[1]) = *(pVol[0]) + diff;
1720 dwTemp |= (volume[0]) | (volume[1] << 8);
1721 ali_ac97_write(card->ac97_codec[0], 0x02, dwTemp);
1722 card->ac97_codec[0]->mixer_state[0] = ((32 - volume[0]) * 25 / 8) |
1723 (((32 - volume[1]) * 25 / 8) << 8);
1725 /* Nothing needs doing */
1730 * Re-enable reporting of vol change after 0.1 seconds
1734 ali_timeout(unsigned long ptr)
1736 struct trident_card *card = (struct trident_card *) ptr;
1739 /* Enable GPIO IRQ (MISCINT bit 18h) */
1740 temp = inw(TRID_REG(card, T4D_MISCINT + 2));
1742 outw(temp, TRID_REG(card, T4D_MISCINT + 2));
1746 * Set up the timer to clear the vol change notification
1750 ali_set_timer(struct trident_card *card)
1752 /* Add Timer Routine to Enable GPIO IRQ */
1753 del_timer(&card->timer); /* Never queue twice */
1754 card->timer.function = ali_timeout;
1755 card->timer.data = (unsigned long) card;
1756 card->timer.expires = jiffies + HZ / 10;
1757 add_timer(&card->timer);
1761 * Process a GPIO event
1765 ali_queue_task(struct trident_card *card, int opt)
1769 /* Disable GPIO IRQ (MISCINT bit 18h) */
1770 temp = inw(TRID_REG(card, T4D_MISCINT + 2));
1771 temp &= (u16) (~0x0004);
1772 outw(temp, TRID_REG(card, T4D_MISCINT + 2));
1774 /* Adjust the volume */
1775 ali_hwvol_control(card, opt);
1777 /* Set the timer for 1/10th sec */
1778 ali_set_timer(card);
1782 cyber_address_interrupt(struct trident_card *card)
1785 struct trident_state *state;
1786 unsigned int channel;
1788 /* Update the pointers for all channels we are running. */
1789 /* FIXED: read interrupt status only once */
1790 irq_status = inl(TRID_REG(card, T4D_AINT_A));
1792 pr_debug("cyber_address_interrupt: irq_status 0x%X\n", irq_status);
1794 for (i = 0; i < NR_HW_CH; i++) {
1796 if (irq_status & (1 << channel)) {
1797 /* clear bit by writing a 1, zeroes are ignored */
1798 outl((1 << channel), TRID_REG(card, T4D_AINT_A));
1800 pr_debug("cyber_interrupt: channel %d\n", channel);
1802 if ((state = card->states[i]) != NULL) {
1803 trident_update_ptr(state);
1805 printk(KERN_WARNING "cyber5050: spurious "
1806 "channel irq %d.\n", channel);
1807 trident_stop_voice(card, channel);
1808 trident_disable_voice_irq(card, channel);
1815 trident_interrupt(int irq, void *dev_id)
1817 struct trident_card *card = (struct trident_card *) dev_id;
1821 spin_lock(&card->lock);
1822 event = inl(TRID_REG(card, T4D_MISCINT));
1824 pr_debug("trident: trident_interrupt called, MISCINT = 0x%08x\n",
1827 if (event & ADDRESS_IRQ) {
1828 card->address_interrupt(card);
1831 if (card->pci_id == PCI_DEVICE_ID_ALI_5451) {
1832 /* GPIO IRQ (H/W Volume Control) */
1833 event = inl(TRID_REG(card, T4D_MISCINT));
1834 if (event & (1 << 25)) {
1835 gpio = inl(TRID_REG(card, ALI_GPIO));
1836 if (!timer_pending(&card->timer))
1837 ali_queue_task(card, gpio & 0x07);
1839 event = inl(TRID_REG(card, T4D_MISCINT));
1840 outl(event | (ST_TARGET_REACHED | MIXER_OVERFLOW | MIXER_UNDERFLOW),
1841 TRID_REG(card, T4D_MISCINT));
1842 spin_unlock(&card->lock);
1846 /* manually clear interrupt status, bad hardware design, blame T^2 */
1847 outl((ST_TARGET_REACHED | MIXER_OVERFLOW | MIXER_UNDERFLOW),
1848 TRID_REG(card, T4D_MISCINT));
1849 spin_unlock(&card->lock);
1853 /* in this loop, dmabuf.count signifies the amount of data that is waiting */
1854 /* to be copied to the user's buffer. it is filled by the dma machine and */
1855 /* drained by this loop. */
1857 trident_read(struct file *file, char __user *buffer, size_t count, loff_t * ppos)
1859 struct trident_state *state = (struct trident_state *)file->private_data;
1860 struct dmabuf *dmabuf = &state->dmabuf;
1862 unsigned long flags;
1866 pr_debug("trident: trident_read called, count = %zd\n", count);
1868 VALIDATE_STATE(state);
1872 if (!access_ok(VERIFY_WRITE, buffer, count))
1875 mutex_lock(&state->sem);
1876 if (!dmabuf->ready && (ret = prog_dmabuf_record(state)))
1880 spin_lock_irqsave(&state->card->lock, flags);
1881 if (dmabuf->count > (signed) dmabuf->dmasize) {
1882 /* buffer overrun, we are recovering from */
1883 /* sleep_on_timeout, resync hwptr and swptr, */
1884 /* make process flush the buffer */
1885 dmabuf->count = dmabuf->dmasize;
1886 dmabuf->swptr = dmabuf->hwptr;
1888 swptr = dmabuf->swptr;
1889 cnt = dmabuf->dmasize - swptr;
1890 if (dmabuf->count < cnt)
1891 cnt = dmabuf->count;
1892 spin_unlock_irqrestore(&state->card->lock, flags);
1898 /* buffer is empty, start the dma machine and */
1899 /* wait for data to be recorded */
1901 if (file->f_flags & O_NONBLOCK) {
1907 mutex_unlock(&state->sem);
1908 /* No matter how much space left in the buffer, */
1909 /* we have to wait until CSO == ESO/2 or CSO == ESO */
1910 /* when address engine interrupts */
1911 tmo = (dmabuf->dmasize * HZ) / (dmabuf->rate * 2);
1912 tmo >>= sample_shift[dmabuf->fmt];
1913 /* There are two situations when sleep_on_timeout returns, one is when
1914 the interrupt is serviced correctly and the process is waked up by
1915 ISR ON TIME. Another is when timeout is expired, which means that
1916 either interrupt is NOT serviced correctly (pending interrupt) or it
1917 is TOO LATE for the process to be scheduled to run (scheduler latency)
1918 which results in a (potential) buffer overrun. And worse, there is
1919 NOTHING we can do to prevent it. */
1920 if (!interruptible_sleep_on_timeout(&dmabuf->wait, tmo)) {
1921 pr_debug(KERN_ERR "trident: recording schedule timeout, "
1922 "dmasz %u fragsz %u count %i hwptr %u swptr %u\n",
1923 dmabuf->dmasize, dmabuf->fragsize, dmabuf->count,
1924 dmabuf->hwptr, dmabuf->swptr);
1926 /* a buffer overrun, we delay the recovery until next time the
1927 while loop begin and we REALLY have space to record */
1929 if (signal_pending(current)) {
1934 mutex_lock(&state->sem);
1935 if (dmabuf->mapped) {
1943 if (copy_to_user(buffer, dmabuf->rawbuf + swptr, cnt)) {
1949 swptr = (swptr + cnt) % dmabuf->dmasize;
1951 spin_lock_irqsave(&state->card->lock, flags);
1952 dmabuf->swptr = swptr;
1953 dmabuf->count -= cnt;
1954 spin_unlock_irqrestore(&state->card->lock, flags);
1962 mutex_unlock(&state->sem);
1966 /* in this loop, dmabuf.count signifies the amount of data that is waiting to be dma to
1967 the soundcard. it is drained by the dma machine and filled by this loop. */
1970 trident_write(struct file *file, const char __user *buffer, size_t count, loff_t * ppos)
1972 struct trident_state *state = (struct trident_state *)file->private_data;
1973 struct dmabuf *dmabuf = &state->dmabuf;
1975 unsigned long flags;
1978 unsigned int state_cnt;
1979 unsigned int copy_count;
1980 int lret; /* for lock_set_fmt */
1982 pr_debug("trident: trident_write called, count = %zd\n", count);
1984 VALIDATE_STATE(state);
1987 * Guard against an mmap or ioctl while writing
1990 mutex_lock(&state->sem);
1992 if (dmabuf->mapped) {
1996 if (!dmabuf->ready && (ret = prog_dmabuf_playback(state)))
1999 if (!access_ok(VERIFY_READ, buffer, count)) {
2007 spin_lock_irqsave(&state->card->lock, flags);
2008 if (dmabuf->count < 0) {
2009 /* buffer underrun, we are recovering from */
2010 /* sleep_on_timeout, resync hwptr and swptr */
2012 dmabuf->swptr = dmabuf->hwptr;
2014 swptr = dmabuf->swptr;
2015 cnt = dmabuf->dmasize - swptr;
2016 if (dmabuf->count + cnt > dmabuf->dmasize)
2017 cnt = dmabuf->dmasize - dmabuf->count;
2018 spin_unlock_irqrestore(&state->card->lock, flags);
2024 /* buffer is full, start the dma machine and */
2025 /* wait for data to be played */
2027 if (file->f_flags & O_NONBLOCK) {
2032 /* No matter how much data left in the buffer, */
2033 /* we have to wait until CSO == ESO/2 or CSO == ESO */
2034 /* when address engine interrupts */
2035 lock_set_fmt(state);
2036 tmo = (dmabuf->dmasize * HZ) / (dmabuf->rate * 2);
2037 tmo >>= sample_shift[dmabuf->fmt];
2038 unlock_set_fmt(state);
2039 mutex_unlock(&state->sem);
2041 /* There are two situations when sleep_on_timeout */
2042 /* returns, one is when the interrupt is serviced */
2043 /* correctly and the process is waked up by ISR */
2044 /* ON TIME. Another is when timeout is expired, which */
2045 /* means that either interrupt is NOT serviced */
2046 /* correctly (pending interrupt) or it is TOO LATE */
2047 /* for the process to be scheduled to run */
2048 /* (scheduler latency) which results in a (potential) */
2049 /* buffer underrun. And worse, there is NOTHING we */
2050 /* can do to prevent it. */
2051 if (!interruptible_sleep_on_timeout(&dmabuf->wait, tmo)) {
2052 pr_debug(KERN_ERR "trident: playback schedule "
2053 "timeout, dmasz %u fragsz %u count %i "
2054 "hwptr %u swptr %u\n", dmabuf->dmasize,
2055 dmabuf->fragsize, dmabuf->count,
2056 dmabuf->hwptr, dmabuf->swptr);
2058 /* a buffer underrun, we delay the recovery */
2059 /* until next time the while loop begin and */
2060 /* we REALLY have data to play */
2062 if (signal_pending(current)) {
2067 mutex_lock(&state->sem);
2068 if (dmabuf->mapped) {
2075 if ((lret = lock_set_fmt(state)) < 0) {
2080 if (state->chans_num == 6) {
2083 if (ali_write_5_1(state, buffer, cnt, ©_count,
2084 &state_cnt) == -EFAULT) {
2086 swptr = (swptr + state_cnt) % dmabuf->dmasize;
2087 spin_lock_irqsave(&state->card->lock, flags);
2088 dmabuf->swptr = swptr;
2089 dmabuf->count += state_cnt;
2090 dmabuf->endcleared = 0;
2091 spin_unlock_irqrestore(&state->card->lock, flags);
2096 unlock_set_fmt(state);
2100 if (copy_from_user(dmabuf->rawbuf + swptr,
2104 unlock_set_fmt(state);
2109 unlock_set_fmt(state);
2111 swptr = (swptr + state_cnt) % dmabuf->dmasize;
2113 spin_lock_irqsave(&state->card->lock, flags);
2114 dmabuf->swptr = swptr;
2115 dmabuf->count += state_cnt;
2116 dmabuf->endcleared = 0;
2117 spin_unlock_irqrestore(&state->card->lock, flags);
2125 mutex_unlock(&state->sem);
2130 /* No kernel lock - we have our own spinlock */
2132 trident_poll(struct file *file, struct poll_table_struct *wait)
2134 struct trident_state *state = (struct trident_state *)file->private_data;
2135 struct dmabuf *dmabuf = &state->dmabuf;
2136 unsigned long flags;
2137 unsigned int mask = 0;
2139 VALIDATE_STATE(state);
2142 * Guard against a parallel poll and write causing multiple
2143 * prog_dmabuf events
2146 mutex_lock(&state->sem);
2148 if (file->f_mode & FMODE_WRITE) {
2149 if (!dmabuf->ready && prog_dmabuf_playback(state)) {
2150 mutex_unlock(&state->sem);
2153 poll_wait(file, &dmabuf->wait, wait);
2155 if (file->f_mode & FMODE_READ) {
2156 if (!dmabuf->ready && prog_dmabuf_record(state)) {
2157 mutex_unlock(&state->sem);
2160 poll_wait(file, &dmabuf->wait, wait);
2163 mutex_unlock(&state->sem);
2165 spin_lock_irqsave(&state->card->lock, flags);
2166 trident_update_ptr(state);
2167 if (file->f_mode & FMODE_READ) {
2168 if (dmabuf->count >= (signed) dmabuf->fragsize)
2169 mask |= POLLIN | POLLRDNORM;
2171 if (file->f_mode & FMODE_WRITE) {
2172 if (dmabuf->mapped) {
2173 if (dmabuf->count >= (signed) dmabuf->fragsize)
2174 mask |= POLLOUT | POLLWRNORM;
2176 if ((signed) dmabuf->dmasize >= dmabuf->count +
2177 (signed) dmabuf->fragsize)
2178 mask |= POLLOUT | POLLWRNORM;
2181 spin_unlock_irqrestore(&state->card->lock, flags);
2187 trident_mmap(struct file *file, struct vm_area_struct *vma)
2189 struct trident_state *state = (struct trident_state *)file->private_data;
2190 struct dmabuf *dmabuf = &state->dmabuf;
2194 VALIDATE_STATE(state);
2197 * Lock against poll read write or mmap creating buffers. Also lock
2198 * a read or write against an mmap.
2201 mutex_lock(&state->sem);
2203 if (vma->vm_flags & VM_WRITE) {
2204 if ((ret = prog_dmabuf_playback(state)) != 0)
2206 } else if (vma->vm_flags & VM_READ) {
2207 if ((ret = prog_dmabuf_record(state)) != 0)
2213 if (vma->vm_pgoff != 0)
2215 size = vma->vm_end - vma->vm_start;
2216 if (size > (PAGE_SIZE << dmabuf->buforder))
2219 if (remap_pfn_range(vma, vma->vm_start,
2220 virt_to_phys(dmabuf->rawbuf) >> PAGE_SHIFT,
2221 size, vma->vm_page_prot))
2226 mutex_unlock(&state->sem);
2231 trident_ioctl(struct inode *inode, struct file *file,
2232 unsigned int cmd, unsigned long arg)
2234 struct trident_state *state = (struct trident_state *)file->private_data;
2235 struct dmabuf *dmabuf = &state->dmabuf;
2236 unsigned long flags;
2237 audio_buf_info abinfo;
2239 int val, mapped, ret = 0;
2240 struct trident_card *card = state->card;
2241 void __user *argp = (void __user *)arg;
2242 int __user *p = argp;
2244 VALIDATE_STATE(state);
2247 mapped = ((file->f_mode & (FMODE_WRITE | FMODE_READ)) && dmabuf->mapped);
2249 pr_debug("trident: trident_ioctl, command = %2d, arg = 0x%08x\n",
2250 _IOC_NR(cmd), arg ? *p : 0);
2253 case OSS_GETVERSION:
2254 ret = put_user(SOUND_VERSION, p);
2257 case SNDCTL_DSP_RESET:
2258 /* FIXME: spin_lock ? */
2259 if (file->f_mode & FMODE_WRITE) {
2261 synchronize_irq(card->irq);
2263 dmabuf->swptr = dmabuf->hwptr = 0;
2264 dmabuf->count = dmabuf->total_bytes = 0;
2266 if (file->f_mode & FMODE_READ) {
2268 synchronize_irq(card->irq);
2270 dmabuf->swptr = dmabuf->hwptr = 0;
2271 dmabuf->count = dmabuf->total_bytes = 0;
2275 case SNDCTL_DSP_SYNC:
2276 if (file->f_mode & FMODE_WRITE)
2277 ret = drain_dac(state, file->f_flags & O_NONBLOCK);
2280 case SNDCTL_DSP_SPEED: /* set smaple rate */
2281 if (get_user(val, p)) {
2286 if (file->f_mode & FMODE_WRITE) {
2289 spin_lock_irqsave(&state->card->lock, flags);
2290 trident_set_dac_rate(state, val);
2291 spin_unlock_irqrestore(&state->card->lock, flags);
2293 if (file->f_mode & FMODE_READ) {
2296 spin_lock_irqsave(&state->card->lock, flags);
2297 trident_set_adc_rate(state, val);
2298 spin_unlock_irqrestore(&state->card->lock, flags);
2301 ret = put_user(dmabuf->rate, p);
2304 case SNDCTL_DSP_STEREO: /* set stereo or mono channel */
2305 if (get_user(val, p)) {
2309 if ((ret = lock_set_fmt(state)) < 0)
2312 if (file->f_mode & FMODE_WRITE) {
2316 dmabuf->fmt |= TRIDENT_FMT_STEREO;
2318 dmabuf->fmt &= ~TRIDENT_FMT_STEREO;
2320 if (file->f_mode & FMODE_READ) {
2324 dmabuf->fmt |= TRIDENT_FMT_STEREO;
2326 dmabuf->fmt &= ~TRIDENT_FMT_STEREO;
2328 unlock_set_fmt(state);
2331 case SNDCTL_DSP_GETBLKSIZE:
2332 if (file->f_mode & FMODE_WRITE) {
2333 if ((val = prog_dmabuf_playback(state)))
2336 ret = put_user(dmabuf->fragsize, p);
2339 if (file->f_mode & FMODE_READ) {
2340 if ((val = prog_dmabuf_record(state)))
2343 ret = put_user(dmabuf->fragsize, p);
2346 /* neither READ nor WRITE? is this even possible? */
2351 case SNDCTL_DSP_GETFMTS: /* Returns a mask of supported sample format */
2352 ret = put_user(AFMT_S16_LE | AFMT_U16_LE | AFMT_S8 |
2356 case SNDCTL_DSP_SETFMT: /* Select sample format */
2357 if (get_user(val, p)) {
2361 if ((ret = lock_set_fmt(state)) < 0)
2364 if (val != AFMT_QUERY) {
2365 if (file->f_mode & FMODE_WRITE) {
2368 if (val == AFMT_S16_LE)
2369 dmabuf->fmt |= TRIDENT_FMT_16BIT;
2371 dmabuf->fmt &= ~TRIDENT_FMT_16BIT;
2373 if (file->f_mode & FMODE_READ) {
2376 if (val == AFMT_S16_LE)
2377 dmabuf->fmt |= TRIDENT_FMT_16BIT;
2379 dmabuf->fmt &= ~TRIDENT_FMT_16BIT;
2382 unlock_set_fmt(state);
2383 ret = put_user((dmabuf->fmt & TRIDENT_FMT_16BIT) ? AFMT_S16_LE :
2387 case SNDCTL_DSP_CHANNELS:
2388 if (get_user(val, p)) {
2393 if ((ret = lock_set_fmt(state)) < 0)
2396 if (file->f_mode & FMODE_WRITE) {
2400 //prevent from memory leak
2401 if ((state->chans_num > 2) && (state->chans_num != val)) {
2402 ali_free_other_states_resources(state);
2403 state->chans_num = 1;
2408 dmabuf->fmt |= TRIDENT_FMT_STEREO;
2409 if ((val == 6) && (state->card->pci_id == PCI_DEVICE_ID_ALI_5451)) {
2410 if (card->rec_channel_use_count > 0) {
2411 printk(KERN_ERR "trident: Record is "
2412 "working on the card!\n");
2414 unlock_set_fmt(state);
2418 ret = ali_setup_multi_channels(state->card, 6);
2420 unlock_set_fmt(state);
2423 mutex_lock(&state->card->open_mutex);
2424 ret = ali_allocate_other_states_resources(state, 6);
2426 mutex_unlock(&state->card->open_mutex);
2427 unlock_set_fmt(state);
2430 state->card->multi_channel_use_count++;
2431 mutex_unlock(&state->card->open_mutex);
2433 val = 2; /*yield to 2-channels */
2435 dmabuf->fmt &= ~TRIDENT_FMT_STEREO;
2436 state->chans_num = val;
2438 if (file->f_mode & FMODE_READ) {
2442 if (!((file->f_mode & FMODE_WRITE) &&
2445 dmabuf->fmt |= TRIDENT_FMT_STEREO;
2447 dmabuf->fmt &= ~TRIDENT_FMT_STEREO;
2448 state->chans_num = val;
2450 unlock_set_fmt(state);
2452 ret = put_user(val, p);
2455 case SNDCTL_DSP_POST:
2456 /* Cause the working fragment to be output */
2459 case SNDCTL_DSP_SUBDIVIDE:
2460 if (dmabuf->subdivision) {
2464 if (get_user(val, p)) {
2468 if (val != 1 && val != 2 && val != 4) {
2472 dmabuf->subdivision = val;
2475 case SNDCTL_DSP_SETFRAGMENT:
2476 if (get_user(val, p)) {
2481 dmabuf->ossfragshift = val & 0xffff;
2482 dmabuf->ossmaxfrags = (val >> 16) & 0xffff;
2483 if (dmabuf->ossfragshift < 4)
2484 dmabuf->ossfragshift = 4;
2485 if (dmabuf->ossfragshift > 15)
2486 dmabuf->ossfragshift = 15;
2487 if (dmabuf->ossmaxfrags < 4)
2488 dmabuf->ossmaxfrags = 4;
2492 case SNDCTL_DSP_GETOSPACE:
2493 if (!(file->f_mode & FMODE_WRITE)) {
2497 if (!dmabuf->ready && (val = prog_dmabuf_playback(state)) != 0) {
2501 spin_lock_irqsave(&state->card->lock, flags);
2502 trident_update_ptr(state);
2503 abinfo.fragsize = dmabuf->fragsize;
2504 abinfo.bytes = dmabuf->dmasize - dmabuf->count;
2505 abinfo.fragstotal = dmabuf->numfrag;
2506 abinfo.fragments = abinfo.bytes >> dmabuf->fragshift;
2507 spin_unlock_irqrestore(&state->card->lock, flags);
2508 ret = copy_to_user(argp, &abinfo, sizeof (abinfo)) ?
2512 case SNDCTL_DSP_GETISPACE:
2513 if (!(file->f_mode & FMODE_READ)) {
2517 if (!dmabuf->ready && (val = prog_dmabuf_record(state)) != 0) {
2521 spin_lock_irqsave(&state->card->lock, flags);
2522 trident_update_ptr(state);
2523 abinfo.fragsize = dmabuf->fragsize;
2524 abinfo.bytes = dmabuf->count;
2525 abinfo.fragstotal = dmabuf->numfrag;
2526 abinfo.fragments = abinfo.bytes >> dmabuf->fragshift;
2527 spin_unlock_irqrestore(&state->card->lock, flags);
2528 ret = copy_to_user(argp, &abinfo, sizeof (abinfo)) ?
2532 case SNDCTL_DSP_NONBLOCK:
2533 file->f_flags |= O_NONBLOCK;
2536 case SNDCTL_DSP_GETCAPS:
2537 ret = put_user(DSP_CAP_REALTIME | DSP_CAP_TRIGGER |
2538 DSP_CAP_MMAP | DSP_CAP_BIND, p);
2541 case SNDCTL_DSP_GETTRIGGER:
2543 if ((file->f_mode & FMODE_READ) && dmabuf->enable)
2544 val |= PCM_ENABLE_INPUT;
2545 if ((file->f_mode & FMODE_WRITE) && dmabuf->enable)
2546 val |= PCM_ENABLE_OUTPUT;
2547 ret = put_user(val, p);
2550 case SNDCTL_DSP_SETTRIGGER:
2551 if (get_user(val, p)) {
2555 if (file->f_mode & FMODE_READ) {
2556 if (val & PCM_ENABLE_INPUT) {
2557 if (!dmabuf->ready &&
2558 (ret = prog_dmabuf_record(state)))
2564 if (file->f_mode & FMODE_WRITE) {
2565 if (val & PCM_ENABLE_OUTPUT) {
2566 if (!dmabuf->ready &&
2567 (ret = prog_dmabuf_playback(state)))
2575 case SNDCTL_DSP_GETIPTR:
2576 if (!(file->f_mode & FMODE_READ)) {
2580 if (!dmabuf->ready && (val = prog_dmabuf_record(state))
2585 spin_lock_irqsave(&state->card->lock, flags);
2586 trident_update_ptr(state);
2587 cinfo.bytes = dmabuf->total_bytes;
2588 cinfo.blocks = dmabuf->count >> dmabuf->fragshift;
2589 cinfo.ptr = dmabuf->hwptr;
2591 dmabuf->count &= dmabuf->fragsize - 1;
2592 spin_unlock_irqrestore(&state->card->lock, flags);
2593 ret = copy_to_user(argp, &cinfo, sizeof (cinfo)) ?
2597 case SNDCTL_DSP_GETOPTR:
2598 if (!(file->f_mode & FMODE_WRITE)) {
2602 if (!dmabuf->ready && (val = prog_dmabuf_playback(state))
2608 spin_lock_irqsave(&state->card->lock, flags);
2609 trident_update_ptr(state);
2610 cinfo.bytes = dmabuf->total_bytes;
2611 cinfo.blocks = dmabuf->count >> dmabuf->fragshift;
2612 cinfo.ptr = dmabuf->hwptr;
2614 dmabuf->count &= dmabuf->fragsize - 1;
2615 spin_unlock_irqrestore(&state->card->lock, flags);
2616 ret = copy_to_user(argp, &cinfo, sizeof (cinfo)) ?
2620 case SNDCTL_DSP_SETDUPLEX:
2624 case SNDCTL_DSP_GETODELAY:
2625 if (!(file->f_mode & FMODE_WRITE)) {
2629 if (!dmabuf->ready && (val = prog_dmabuf_playback(state)) != 0) {
2633 spin_lock_irqsave(&state->card->lock, flags);
2634 trident_update_ptr(state);
2635 val = dmabuf->count;
2636 spin_unlock_irqrestore(&state->card->lock, flags);
2637 ret = put_user(val, p);
2640 case SOUND_PCM_READ_RATE:
2641 ret = put_user(dmabuf->rate, p);
2644 case SOUND_PCM_READ_CHANNELS:
2645 ret = put_user((dmabuf->fmt & TRIDENT_FMT_STEREO) ? 2 : 1,
2649 case SOUND_PCM_READ_BITS:
2650 ret = put_user((dmabuf->fmt & TRIDENT_FMT_16BIT) ? AFMT_S16_LE :
2654 case SNDCTL_DSP_GETCHANNELMASK:
2655 ret = put_user(DSP_BIND_FRONT | DSP_BIND_SURR |
2656 DSP_BIND_CENTER_LFE, p);
2659 case SNDCTL_DSP_BIND_CHANNEL:
2660 if (state->card->pci_id != PCI_DEVICE_ID_SI_7018) {
2665 if (get_user(val, p)) {
2669 if (val == DSP_BIND_QUERY) {
2670 val = dmabuf->channel->attribute | 0x3c00;
2671 val = attr2mask[val >> 8];
2674 if (file->f_mode & FMODE_READ)
2675 dmabuf->channel->attribute = (CHANNEL_REC |
2677 if (file->f_mode & FMODE_WRITE)
2678 dmabuf->channel->attribute = (CHANNEL_SPC_PB |
2680 dmabuf->channel->attribute |= mask2attr[ffs(val)];
2682 ret = put_user(val, p);
2685 case SNDCTL_DSP_MAPINBUF:
2686 case SNDCTL_DSP_MAPOUTBUF:
2687 case SNDCTL_DSP_SETSYNCRO:
2688 case SOUND_PCM_WRITE_FILTER:
2689 case SOUND_PCM_READ_FILTER:
2699 trident_open(struct inode *inode, struct file *file)
2702 int minor = iminor(inode);
2703 struct trident_card *card = devs;
2704 struct trident_state *state = NULL;
2705 struct dmabuf *dmabuf = NULL;
2707 /* Added by Matt Wu 01-05-2001 */
2708 /* TODO: there's some redundacy here wrt the check below */
2709 /* for multi_use_count > 0. Should we return -EBUSY or find */
2710 /* a different card? for now, don't break current behaviour */
2712 if (file->f_mode & FMODE_READ) {
2713 if (card->pci_id == PCI_DEVICE_ID_ALI_5451) {
2714 if (card->multi_channel_use_count > 0)
2719 /* find an available virtual channel (instance of /dev/dsp) */
2720 while (card != NULL) {
2721 mutex_lock(&card->open_mutex);
2722 if (file->f_mode & FMODE_READ) {
2723 /* Skip opens on cards that are in 6 channel mode */
2724 if (card->multi_channel_use_count > 0) {
2725 mutex_unlock(&card->open_mutex);
2730 for (i = 0; i < NR_HW_CH; i++) {
2731 if (card->states[i] == NULL) {
2732 state = card->states[i] = kzalloc(sizeof(*state), GFP_KERNEL);
2733 if (state == NULL) {
2734 mutex_unlock(&card->open_mutex);
2737 mutex_init(&state->sem);
2738 dmabuf = &state->dmabuf;
2742 mutex_unlock(&card->open_mutex);
2745 /* no more virtual channel avaiable */
2750 /* found a free virtual channel, allocate hardware channels */
2751 if (file->f_mode & FMODE_READ)
2752 dmabuf->channel = card->alloc_rec_pcm_channel(card);
2754 dmabuf->channel = card->alloc_pcm_channel(card);
2756 if (dmabuf->channel == NULL) {
2757 kfree(card->states[i]);
2758 card->states[i] = NULL;
2762 /* initialize the virtual channel */
2765 state->magic = TRIDENT_STATE_MAGIC;
2766 init_waitqueue_head(&dmabuf->wait);
2767 file->private_data = state;
2769 /* set default sample format. According to OSS Programmer's */
2770 /* Guide /dev/dsp should be default to unsigned 8-bits, mono, */
2771 /* with sample rate 8kHz and /dev/dspW will accept 16-bits sample */
2772 if (file->f_mode & FMODE_WRITE) {
2773 dmabuf->fmt &= ~TRIDENT_FMT_MASK;
2774 if ((minor & 0x0f) == SND_DEV_DSP16)
2775 dmabuf->fmt |= TRIDENT_FMT_16BIT;
2776 dmabuf->ossfragshift = 0;
2777 dmabuf->ossmaxfrags = 0;
2778 dmabuf->subdivision = 0;
2779 if (card->pci_id == PCI_DEVICE_ID_SI_7018) {
2780 /* set default channel attribute to normal playback */
2781 dmabuf->channel->attribute = CHANNEL_PB;
2783 trident_set_dac_rate(state, 8000);
2786 if (file->f_mode & FMODE_READ) {
2787 /* FIXME: Trident 4d can only record in signed 16-bits stereo, */
2788 /* 48kHz sample, to be dealed with in trident_set_adc_rate() ?? */
2789 dmabuf->fmt &= ~TRIDENT_FMT_MASK;
2790 if ((minor & 0x0f) == SND_DEV_DSP16)
2791 dmabuf->fmt |= TRIDENT_FMT_16BIT;
2792 dmabuf->ossfragshift = 0;
2793 dmabuf->ossmaxfrags = 0;
2794 dmabuf->subdivision = 0;
2795 if (card->pci_id == PCI_DEVICE_ID_SI_7018) {
2796 /* set default channel attribute to 0x8a80, record from
2797 PCM L/R FIFO and mono = (left + right + 1)/2 */
2798 dmabuf->channel->attribute = (CHANNEL_REC | PCM_LR |
2801 trident_set_adc_rate(state, 8000);
2803 /* Added by Matt Wu 01-05-2001 */
2804 if (card->pci_id == PCI_DEVICE_ID_ALI_5451)
2805 card->rec_channel_use_count++;
2808 state->open_mode |= file->f_mode & (FMODE_READ | FMODE_WRITE);
2809 mutex_unlock(&card->open_mutex);
2811 pr_debug("trident: open virtual channel %d, hard channel %d\n",
2812 state->virt, dmabuf->channel->num);
2814 return nonseekable_open(inode, file);
2818 trident_release(struct inode *inode, struct file *file)
2820 struct trident_state *state = (struct trident_state *)file->private_data;
2821 struct trident_card *card;
2822 struct dmabuf *dmabuf;
2824 VALIDATE_STATE(state);
2827 dmabuf = &state->dmabuf;
2829 if (file->f_mode & FMODE_WRITE) {
2830 trident_clear_tail(state);
2831 drain_dac(state, file->f_flags & O_NONBLOCK);
2834 pr_debug("trident: closing virtual channel %d, hard channel %d\n",
2835 state->virt, dmabuf->channel->num);
2837 /* stop DMA state machine and free DMA buffers/channels */
2838 mutex_lock(&card->open_mutex);
2840 if (file->f_mode & FMODE_WRITE) {
2842 dealloc_dmabuf(&state->dmabuf, state->card->pci_dev);
2843 state->card->free_pcm_channel(state->card, dmabuf->channel->num);
2845 /* Added by Matt Wu */
2846 if (card->pci_id == PCI_DEVICE_ID_ALI_5451) {
2847 if (state->chans_num > 2) {
2848 if (card->multi_channel_use_count-- < 0)
2849 card->multi_channel_use_count = 0;
2850 if (card->multi_channel_use_count == 0)
2851 ali_close_multi_channels();
2852 ali_free_other_states_resources(state);
2856 if (file->f_mode & FMODE_READ) {
2858 dealloc_dmabuf(&state->dmabuf, state->card->pci_dev);
2859 state->card->free_pcm_channel(state->card, dmabuf->channel->num);
2861 /* Added by Matt Wu */
2862 if (card->pci_id == PCI_DEVICE_ID_ALI_5451) {
2863 if (card->rec_channel_use_count-- < 0)
2864 card->rec_channel_use_count = 0;
2868 card->states[state->virt] = NULL;
2871 /* we're covered by the open_mutex */
2872 mutex_unlock(&card->open_mutex);
2877 static /*const */ struct file_operations trident_audio_fops = {
2878 .owner = THIS_MODULE,
2879 .llseek = no_llseek,
2880 .read = trident_read,
2881 .write = trident_write,
2882 .poll = trident_poll,
2883 .ioctl = trident_ioctl,
2884 .mmap = trident_mmap,
2885 .open = trident_open,
2886 .release = trident_release,
2889 /* trident specific AC97 functions */
2890 /* Write AC97 codec registers */
2892 trident_ac97_set(struct ac97_codec *codec, u8 reg, u16 val)
2894 struct trident_card *card = (struct trident_card *)codec->private_data;
2895 unsigned int address, mask, busy;
2896 unsigned short count = 0xffff;
2897 unsigned long flags;
2900 data = ((u32) val) << 16;
2902 switch (card->pci_id) {
2904 case PCI_DEVICE_ID_SI_7018:
2905 address = SI_AC97_WRITE;
2906 mask = SI_AC97_BUSY_WRITE | SI_AC97_AUDIO_BUSY;
2908 mask |= SI_AC97_SECONDARY;
2909 busy = SI_AC97_BUSY_WRITE;
2911 case PCI_DEVICE_ID_TRIDENT_4DWAVE_DX:
2912 address = DX_ACR0_AC97_W;
2913 mask = busy = DX_AC97_BUSY_WRITE;
2915 case PCI_DEVICE_ID_TRIDENT_4DWAVE_NX:
2916 address = NX_ACR1_AC97_W;
2917 mask = NX_AC97_BUSY_WRITE;
2919 mask |= NX_AC97_WRITE_SECONDARY;
2920 busy = NX_AC97_BUSY_WRITE;
2922 case PCI_DEVICE_ID_INTERG_5050:
2923 address = SI_AC97_WRITE;
2924 mask = busy = SI_AC97_BUSY_WRITE;
2926 mask |= SI_AC97_SECONDARY;
2930 spin_lock_irqsave(&card->lock, flags);
2932 if ((inw(TRID_REG(card, address)) & busy) == 0)
2936 data |= (mask | (reg & AC97_REG_ADDR));
2939 printk(KERN_ERR "trident: AC97 CODEC write timed out.\n");
2940 spin_unlock_irqrestore(&card->lock, flags);
2944 outl(data, TRID_REG(card, address));
2945 spin_unlock_irqrestore(&card->lock, flags);
2948 /* Read AC97 codec registers */
2950 trident_ac97_get(struct ac97_codec *codec, u8 reg)
2952 struct trident_card *card = (struct trident_card *)codec->private_data;
2953 unsigned int address, mask, busy;
2954 unsigned short count = 0xffff;
2955 unsigned long flags;
2958 switch (card->pci_id) {
2960 case PCI_DEVICE_ID_SI_7018:
2961 address = SI_AC97_READ;
2962 mask = SI_AC97_BUSY_READ | SI_AC97_AUDIO_BUSY;
2964 mask |= SI_AC97_SECONDARY;
2965 busy = SI_AC97_BUSY_READ;
2967 case PCI_DEVICE_ID_TRIDENT_4DWAVE_DX:
2968 address = DX_ACR1_AC97_R;
2969 mask = busy = DX_AC97_BUSY_READ;
2971 case PCI_DEVICE_ID_TRIDENT_4DWAVE_NX:
2973 address = NX_ACR3_AC97_R_SECONDARY;
2975 address = NX_ACR2_AC97_R_PRIMARY;
2976 mask = NX_AC97_BUSY_READ;
2977 busy = NX_AC97_BUSY_READ | NX_AC97_BUSY_DATA;
2979 case PCI_DEVICE_ID_INTERG_5050:
2980 address = SI_AC97_READ;
2981 mask = busy = SI_AC97_BUSY_READ;
2983 mask |= SI_AC97_SECONDARY;
2987 data = (mask | (reg & AC97_REG_ADDR));
2989 spin_lock_irqsave(&card->lock, flags);
2990 outl(data, TRID_REG(card, address));
2992 data = inl(TRID_REG(card, address));
2993 if ((data & busy) == 0)
2996 spin_unlock_irqrestore(&card->lock, flags);
2999 printk(KERN_ERR "trident: AC97 CODEC read timed out.\n");
3002 return ((u16) (data >> 16));
3005 /* rewrite ac97 read and write mixer register by hulei for ALI*/
3007 acquirecodecaccess(struct trident_card *card)
3009 u16 wsemamask = 0x6000; /* bit 14..13 */
3015 wcontrol = inw(TRID_REG(card, ALI_AC97_WRITE));
3016 wsemabits = wcontrol & wsemamask;
3018 if (wsemabits == 0x4000)
3019 return 1; /* 0x4000 is audio ,then success */
3022 if (wsemabits == 0) {
3024 outl(((u32) (wcontrol & 0x1eff) | 0x00004000),
3025 TRID_REG(card, ALI_AC97_WRITE));
3031 pr_debug("accesscodecsemaphore: try unlock\n");
3039 releasecodecaccess(struct trident_card *card)
3041 unsigned long wcontrol;
3042 wcontrol = inl(TRID_REG(card, ALI_AC97_WRITE));
3043 outl((wcontrol & 0xffff1eff), TRID_REG(card, ALI_AC97_WRITE));
3047 waitforstimertick(struct trident_card *card)
3049 unsigned long chk1, chk2;
3050 unsigned int wcount = 0xffff;
3051 chk1 = inl(TRID_REG(card, ALI_STIMER));
3054 chk2 = inl(TRID_REG(card, ALI_STIMER));
3055 if ((wcount > 0) && chk1 != chk2)
3064 /* Read AC97 codec registers for ALi*/
3066 ali_ac97_get(struct trident_card *card, int secondary, u8 reg)
3068 unsigned int address, mask;
3069 unsigned int ncount;
3070 unsigned long aud_reg;
3073 unsigned long flags;
3078 address = ALI_AC97_READ;
3079 if (card->revision == ALI_5451_V02) {
3080 address = ALI_AC97_WRITE;
3082 mask = ALI_AC97_READ_ACTION | ALI_AC97_AUDIO_BUSY;
3084 mask |= ALI_AC97_SECONDARY;
3086 spin_lock_irqsave(&card->lock, flags);
3088 if (!acquirecodecaccess(card))
3089 printk(KERN_ERR "access codec fail\n");
3091 wcontrol = inw(TRID_REG(card, ALI_AC97_WRITE));
3093 wcontrol |= (0x8000 | reg);
3094 outw(wcontrol, TRID_REG(card, ALI_AC97_WRITE));
3096 data = (mask | (reg & AC97_REG_ADDR));
3098 if (!waitforstimertick(card)) {
3099 printk(KERN_ERR "ali_ac97_read: BIT_CLOCK is dead\n");
3108 if ((inw(TRID_REG(card, ALI_AC97_WRITE)) & ALI_AC97_BUSY_READ)
3113 if (ncount-- == 1) {
3114 pr_debug("ali_ac97_read :try clear busy flag\n");
3115 aud_reg = inl(TRID_REG(card, ALI_AC97_WRITE));
3116 outl((aud_reg & 0xffff7fff),
3117 TRID_REG(card, ALI_AC97_WRITE));
3122 data = inl(TRID_REG(card, address));
3124 spin_unlock_irqrestore(&card->lock, flags);
3126 return ((u16) (data >> 16));
3129 releasecodecaccess(card);
3130 spin_unlock_irqrestore(&card->lock, flags);
3131 printk(KERN_ERR "ali_ac97_read: AC97 CODEC read timed out.\n");
3135 /* Write AC97 codec registers for hulei*/
3137 ali_ac97_set(struct trident_card *card, int secondary, u8 reg, u16 val)
3139 unsigned int address, mask;
3140 unsigned int ncount;
3143 unsigned long flags;
3145 data = ((u32) val) << 16;
3150 address = ALI_AC97_WRITE;
3151 mask = ALI_AC97_WRITE_ACTION | ALI_AC97_AUDIO_BUSY;
3153 mask |= ALI_AC97_SECONDARY;
3154 if (card->revision == ALI_5451_V02)
3155 mask |= ALI_AC97_WRITE_MIXER_REGISTER;
3157 spin_lock_irqsave(&card->lock, flags);
3158 if (!acquirecodecaccess(card))
3159 printk(KERN_ERR "ali_ac97_write: access codec fail\n");
3161 wcontrol = inw(TRID_REG(card, ALI_AC97_WRITE));
3163 wcontrol |= (0x8100 | reg); /* bit 8=1: (ali1535 )reserved/ */
3164 /* ali1535+ write */
3165 outl((data | wcontrol), TRID_REG(card, ALI_AC97_WRITE));
3167 if (!waitforstimertick(card)) {
3168 printk(KERN_ERR "BIT_CLOCK is dead\n");
3174 wcontrol = inw(TRID_REG(card, ALI_AC97_WRITE));
3175 if (!(wcontrol & 0x8000))
3179 if (ncount-- == 1) {
3180 pr_debug("ali_ac97_set :try clear busy flag!!\n");
3181 outw(wcontrol & 0x7fff,
3182 TRID_REG(card, ALI_AC97_WRITE));
3188 releasecodecaccess(card);
3189 spin_unlock_irqrestore(&card->lock, flags);
3194 ali_enable_special_channel(struct trident_state *stat)
3196 struct trident_card *card = stat->card;
3197 unsigned long s_channels;
3199 s_channels = inl(TRID_REG(card, ALI_GLOBAL_CONTROL));
3200 s_channels |= (1 << stat->dmabuf.channel->num);
3201 outl(s_channels, TRID_REG(card, ALI_GLOBAL_CONTROL));
3205 ali_ac97_read(struct ac97_codec *codec, u8 reg)
3209 struct trident_card *card = NULL;
3211 /* Added by Matt Wu */
3215 card = (struct trident_card *) codec->private_data;
3217 if (!card->mixer_regs_ready)
3218 return ali_ac97_get(card, codec->id, reg);
3221 * FIXME: need to stop this caching some registers
3228 data = card->mixer_regs[reg / 2][id];
3233 ali_ac97_write(struct ac97_codec *codec, u8 reg, u16 val)
3236 struct trident_card *card;
3238 /* Added by Matt Wu */
3242 card = (struct trident_card *) codec->private_data;
3244 if (!card->mixer_regs_ready) {
3245 ali_ac97_set(card, codec->id, reg, val);
3254 card->mixer_regs[reg / 2][id] = val;
3255 ali_ac97_set(card, codec->id, reg, val);
3259 flag: ALI_SPDIF_OUT_TO_SPDIF_OUT
3260 ALI_PCM_TO_SPDIF_OUT
3264 ali_setup_spdif_out(struct trident_card *card, int flag)
3266 unsigned long spdif;
3270 struct pci_dev *pci_dev = NULL;
3272 pci_dev = pci_get_device(PCI_VENDOR_ID_AL, PCI_DEVICE_ID_AL_M1533,
3274 if (pci_dev == NULL)
3276 pci_read_config_byte(pci_dev, 0x61, &temp);
3278 pci_write_config_byte(pci_dev, 0x61, temp);
3279 pci_read_config_byte(pci_dev, 0x7d, &temp);
3281 pci_write_config_byte(pci_dev, 0x7d, temp);
3282 pci_read_config_byte(pci_dev, 0x7e, &temp);
3285 pci_write_config_byte(pci_dev, 0x7e, temp);
3287 pci_dev_put(pci_dev);
3289 ch = inb(TRID_REG(card, ALI_SCTRL));
3290 outb(ch | ALI_SPDIF_OUT_ENABLE, TRID_REG(card, ALI_SCTRL));
3291 ch = inb(TRID_REG(card, ALI_SPDIF_CTRL));
3292 outb(ch & ALI_SPDIF_OUT_CH_STATUS, TRID_REG(card, ALI_SPDIF_CTRL));
3294 if (flag & ALI_SPDIF_OUT_TO_SPDIF_OUT) {
3295 spdif = inw(TRID_REG(card, ALI_GLOBAL_CONTROL));
3296 spdif |= ALI_SPDIF_OUT_CH_ENABLE;
3297 spdif &= ALI_SPDIF_OUT_SEL_SPDIF;
3298 outw(spdif, TRID_REG(card, ALI_GLOBAL_CONTROL));
3299 spdif = inw(TRID_REG(card, ALI_SPDIF_CS));
3300 if (flag & ALI_SPDIF_OUT_NON_PCM)
3304 outw(spdif, TRID_REG(card, ALI_SPDIF_CS));
3306 spdif = inw(TRID_REG(card, ALI_GLOBAL_CONTROL));
3307 spdif |= ALI_SPDIF_OUT_SEL_PCM;
3308 outw(spdif, TRID_REG(card, ALI_GLOBAL_CONTROL));
3313 ali_disable_special_channel(struct trident_card *card, int ch)
3317 sc = inl(TRID_REG(card, ALI_GLOBAL_CONTROL));
3319 outl(sc, TRID_REG(card, ALI_GLOBAL_CONTROL));
3323 ali_disable_spdif_in(struct trident_card *card)
3325 unsigned long spdif;
3327 spdif = inl(TRID_REG(card, ALI_GLOBAL_CONTROL));
3328 spdif &= (~ALI_SPDIF_IN_SUPPORT);
3329 outl(spdif, TRID_REG(card, ALI_GLOBAL_CONTROL));
3331 ali_disable_special_channel(card, ALI_SPDIF_IN_CHANNEL);
3335 ali_setup_spdif_in(struct trident_card *card)
3337 unsigned long spdif;
3339 //Set SPDIF IN Supported
3340 spdif = inl(TRID_REG(card, ALI_GLOBAL_CONTROL));
3341 spdif |= ALI_SPDIF_IN_SUPPORT;
3342 outl(spdif, TRID_REG(card, ALI_GLOBAL_CONTROL));
3345 spdif = inl(TRID_REG(card, ALI_GLOBAL_CONTROL));
3346 spdif |= ALI_SPDIF_IN_CH_ENABLE;
3347 outl(spdif, TRID_REG(card, ALI_GLOBAL_CONTROL));
3349 spdif = inb(TRID_REG(card, ALI_SPDIF_CTRL));
3350 spdif |= ALI_SPDIF_IN_CH_STATUS;
3351 outb(spdif, TRID_REG(card, ALI_SPDIF_CTRL));
3353 spdif = inb(TRID_REG(card, ALI_SPDIF_CTRL));
3354 spdif |= ALI_SPDIF_IN_FUNC_ENABLE;
3355 outb(spdif, TRID_REG(card, ALI_SPDIF_CTRL));
3360 ali_delay(struct trident_card *card, int interval)
3362 unsigned long begintimer, currenttimer;
3364 begintimer = inl(TRID_REG(card, ALI_STIMER));
3365 currenttimer = inl(TRID_REG(card, ALI_STIMER));
3367 while (currenttimer < begintimer + interval)
3368 currenttimer = inl(TRID_REG(card, ALI_STIMER));
3372 ali_detect_spdif_rate(struct trident_card *card)
3376 u8 bval = 0, R1 = 0, R2 = 0;
3378 bval = inb(TRID_REG(card, ALI_SPDIF_CTRL));
3380 outb(bval, TRID_REG(card, ALI_SPDIF_CTRL));
3382 bval = inb(TRID_REG(card, ALI_SPDIF_CTRL + 1));
3384 outb(bval, TRID_REG(card, ALI_SPDIF_CTRL + 1));
3386 while (((R1 < 0x0B) || (R1 > 0x0E)) && (R1 != 0x12) &&
3392 bval = inb(TRID_REG(card, ALI_SPDIF_CTRL + 1));
3396 if (count > 50000) {
3397 printk(KERN_WARNING "trident: Error in "
3398 "ali_detect_spdif_rate!\n");
3404 while (count <= 50000) {
3409 bval = inb(TRID_REG(card, ALI_SPDIF_CTRL + 1));
3418 if (count > 50000) {
3419 printk(KERN_WARNING "trident: Error in "
3420 "ali_detect_spdif_rate!\n");
3429 wval = inw(TRID_REG(card, ALI_SPDIF_CTRL + 2));
3431 wval |= (u16) 0x09 << 8 | (u16) 0x05;
3432 outw(wval, TRID_REG(card, ALI_SPDIF_CTRL + 2));
3434 bval = inb(TRID_REG(card, ALI_SPDIF_CS + 3)) & 0xF0;
3435 outb(bval | 0x02, TRID_REG(card, ALI_SPDIF_CS + 3));
3439 wval = inw(TRID_REG(card, ALI_SPDIF_CTRL + 2));
3441 wval |= (u16) 0x0E << 8 | (u16) 0x08;
3442 outw(wval, TRID_REG(card, ALI_SPDIF_CTRL + 2));
3444 bval = inb(TRID_REG(card, ALI_SPDIF_CS + 3)) & 0xF0;
3445 outb(bval | 0x03, TRID_REG(card, ALI_SPDIF_CS + 3));
3455 ali_get_spdif_in_rate(struct trident_card *card)
3460 ali_detect_spdif_rate(card);
3462 bval = inb(TRID_REG(card, ALI_SPDIF_CTRL));
3465 outb(bval, TRID_REG(card, ALI_SPDIF_CTRL));
3467 bval = inb(TRID_REG(card, ALI_SPDIF_CS + 3));
3490 ali_close_multi_channels(void)
3493 struct pci_dev *pci_dev = NULL;
3495 pci_dev = pci_get_device(PCI_VENDOR_ID_AL, PCI_DEVICE_ID_AL_M1533,
3497 if (pci_dev == NULL)
3500 pci_read_config_byte(pci_dev, 0x59, &temp);
3502 pci_write_config_byte(pci_dev, 0x59, temp);
3504 pci_dev_put(pci_dev);
3506 pci_dev = pci_get_device(PCI_VENDOR_ID_AL, PCI_DEVICE_ID_AL_M7101,
3508 if (pci_dev == NULL)
3511 pci_read_config_byte(pci_dev, 0xB8, &temp);
3513 pci_write_config_byte(pci_dev, 0xB8, temp);
3515 pci_dev_put(pci_dev);
3521 ali_setup_multi_channels(struct trident_card *card, int chan_nums)
3523 unsigned long dwValue;
3525 struct pci_dev *pci_dev = NULL;
3527 pci_dev = pci_get_device(PCI_VENDOR_ID_AL, PCI_DEVICE_ID_AL_M1533,
3529 if (pci_dev == NULL)
3531 pci_read_config_byte(pci_dev, 0x59, &temp);
3533 pci_write_config_byte(pci_dev, 0x59, temp);
3535 pci_dev_put(pci_dev);
3537 pci_dev = pci_get_device(PCI_VENDOR_ID_AL, PCI_DEVICE_ID_AL_M7101,
3539 if (pci_dev == NULL)
3541 pci_read_config_byte(pci_dev, (int) 0xB8, &temp);
3543 pci_write_config_byte(pci_dev, (int) 0xB8, (u8) temp);
3545 pci_dev_put(pci_dev);
3547 if (chan_nums == 6) {
3548 dwValue = inl(TRID_REG(card, ALI_SCTRL)) | 0x000f0000;
3549 outl(dwValue, TRID_REG(card, ALI_SCTRL));
3551 dwValue = inl(TRID_REG(card, ALI_SCTRL));
3552 if (dwValue & 0x2000000) {
3553 ali_ac97_write(card->ac97_codec[0], 0x02, 8080);
3554 ali_ac97_write(card->ac97_codec[0], 0x36, 0);
3555 ali_ac97_write(card->ac97_codec[0], 0x38, 0);
3557 * On a board with a single codec you won't get the
3558 * surround. On other boards configure it.
3560 if (card->ac97_codec[1] != NULL) {
3561 ali_ac97_write(card->ac97_codec[1], 0x36, 0);
3562 ali_ac97_write(card->ac97_codec[1], 0x38, 0);
3563 ali_ac97_write(card->ac97_codec[1], 0x02, 0x0606);
3564 ali_ac97_write(card->ac97_codec[1], 0x18, 0x0303);
3565 ali_ac97_write(card->ac97_codec[1], 0x74, 0x3);
3574 ali_free_pcm_channel(struct trident_card *card, unsigned int channel)
3581 bank = channel >> 5;
3582 channel = channel & 0x1f;
3584 card->banks[bank].bitmap &= ~(1 << (channel));
3588 ali_allocate_other_states_resources(struct trident_state *state, int chan_nums)
3590 struct trident_card *card = state->card;
3591 struct trident_state *s;
3592 int i, state_count = 0;
3593 struct trident_pcm_bank *bank;
3594 struct trident_channel *channel;
3597 bank = &card->banks[BANK_A];
3602 for (i = 0; (i < ALI_CHANNELS) && (state_count != 4); i++) {
3603 if (card->states[i])
3606 num = ali_multi_channels_5_1[state_count];
3607 if (!(bank->bitmap & (1 << num))) {
3608 bank->bitmap |= 1 << num;
3609 channel = &bank->channels[num];
3613 for (; state_count >= 0; state_count--) {
3614 kfree(state->other_states[state_count]);
3615 num = ali_multi_channels_5_1[state_count];
3616 ali_free_pcm_channel(card, num);
3620 s = card->states[i] = kzalloc(sizeof(*state), GFP_KERNEL);
3622 num = ali_multi_channels_5_1[state_count];
3623 ali_free_pcm_channel(card, num);
3625 for (; state_count >= 0; state_count--) {
3626 num = ali_multi_channels_5_1[state_count];
3627 ali_free_pcm_channel(card, num);
3628 kfree(state->other_states[state_count]);
3633 s->dmabuf.channel = channel;
3634 s->dmabuf.ossfragshift = s->dmabuf.ossmaxfrags =
3635 s->dmabuf.subdivision = 0;
3636 init_waitqueue_head(&s->dmabuf.wait);
3637 s->magic = card->magic;
3640 ali_enable_special_channel(s);
3641 state->other_states[state_count++] = s;
3644 if (state_count != 4) {
3646 for (; state_count >= 0; state_count--) {
3647 kfree(state->other_states[state_count]);
3648 num = ali_multi_channels_5_1[state_count];
3649 ali_free_pcm_channel(card, num);
3657 /* save registers for ALi Power Management */
3658 static struct ali_saved_registers {
3659 unsigned long global_regs[ALI_GLOBAL_REGS];
3660 unsigned long channel_regs[ALI_CHANNELS][ALI_CHANNEL_REGS];
3661 unsigned mixer_regs[ALI_MIXER_REGS];
3665 ali_save_regs(struct trident_card *card)
3667 unsigned long flags;
3670 spin_lock_irqsave(&card->lock, flags);
3672 ali_registers.global_regs[0x2c] = inl(TRID_REG(card, T4D_MISCINT));
3673 //ali_registers.global_regs[0x20] = inl(TRID_REG(card,T4D_START_A));
3674 ali_registers.global_regs[0x21] = inl(TRID_REG(card, T4D_STOP_A));
3676 //disable all IRQ bits
3677 outl(ALI_DISABLE_ALL_IRQ, TRID_REG(card, T4D_MISCINT));
3679 for (i = 1; i < ALI_MIXER_REGS; i++)
3680 ali_registers.mixer_regs[i] = ali_ac97_read(card->ac97_codec[0],
3683 for (i = 0; i < ALI_GLOBAL_REGS; i++) {
3684 if ((i * 4 == T4D_MISCINT) || (i * 4 == T4D_STOP_A))
3686 ali_registers.global_regs[i] = inl(TRID_REG(card, i * 4));
3689 for (i = 0; i < ALI_CHANNELS; i++) {
3690 outb(i, TRID_REG(card, T4D_LFO_GC_CIR));
3691 for (j = 0; j < ALI_CHANNEL_REGS; j++)
3692 ali_registers.channel_regs[i][j] = inl(TRID_REG(card,
3696 //Stop all HW channel
3697 outl(ALI_STOP_ALL_CHANNELS, TRID_REG(card, T4D_STOP_A));
3699 spin_unlock_irqrestore(&card->lock, flags);
3703 ali_restore_regs(struct trident_card *card)
3705 unsigned long flags;
3708 spin_lock_irqsave(&card->lock, flags);
3710 for (i = 1; i < ALI_MIXER_REGS; i++)
3711 ali_ac97_write(card->ac97_codec[0], i * 2,
3712 ali_registers.mixer_regs[i]);
3714 for (i = 0; i < ALI_CHANNELS; i++) {
3715 outb(i, TRID_REG(card, T4D_LFO_GC_CIR));
3716 for (j = 0; j < ALI_CHANNEL_REGS; j++)
3717 outl(ali_registers.channel_regs[i][j],
3718 TRID_REG(card, j * 4 + 0xe0));
3721 for (i = 0; i < ALI_GLOBAL_REGS; i++) {
3722 if ((i * 4 == T4D_MISCINT) || (i * 4 == T4D_STOP_A) ||
3723 (i * 4 == T4D_START_A))
3725 outl(ali_registers.global_regs[i], TRID_REG(card, i * 4));
3729 outl(ali_registers.global_regs[0x20], TRID_REG(card, T4D_START_A));
3730 //restore IRQ enable bits
3731 outl(ali_registers.global_regs[0x2c], TRID_REG(card, T4D_MISCINT));
3733 spin_unlock_irqrestore(&card->lock, flags);
3737 trident_suspend(struct pci_dev *dev, pm_message_t unused)
3739 struct trident_card *card = pci_get_drvdata(dev);
3741 if (card->pci_id == PCI_DEVICE_ID_ALI_5451) {
3742 ali_save_regs(card);
3748 trident_resume(struct pci_dev *dev)
3750 struct trident_card *card = pci_get_drvdata(dev);
3752 if (card->pci_id == PCI_DEVICE_ID_ALI_5451) {
3753 ali_restore_regs(card);
3759 static struct trident_channel *
3760 ali_alloc_pcm_channel(struct trident_card *card)
3762 struct trident_pcm_bank *bank;
3765 bank = &card->banks[BANK_A];
3767 if (inl(TRID_REG(card, ALI_GLOBAL_CONTROL)) &
3768 (ALI_SPDIF_OUT_CH_ENABLE)) {
3769 idx = ALI_SPDIF_OUT_CHANNEL;
3770 if (!(bank->bitmap & (1 << idx))) {
3771 struct trident_channel *channel = &bank->channels[idx];
3772 bank->bitmap |= 1 << idx;
3778 for (idx = ALI_PCM_OUT_CHANNEL_FIRST; idx <= ALI_PCM_OUT_CHANNEL_LAST;
3780 if (!(bank->bitmap & (1 << idx))) {
3781 struct trident_channel *channel = &bank->channels[idx];
3782 bank->bitmap |= 1 << idx;
3788 /* no more free channels avaliable */
3790 printk(KERN_ERR "ali: no more channels available on Bank A.\n");
3795 static struct trident_channel *
3796 ali_alloc_rec_pcm_channel(struct trident_card *card)
3798 struct trident_pcm_bank *bank;
3801 if (inl(TRID_REG(card, ALI_GLOBAL_CONTROL)) & ALI_SPDIF_IN_SUPPORT)
3802 idx = ALI_SPDIF_IN_CHANNEL;
3804 idx = ALI_PCM_IN_CHANNEL;
3806 bank = &card->banks[BANK_A];
3808 if (!(bank->bitmap & (1 << idx))) {
3809 struct trident_channel *channel = &bank->channels[idx];
3810 bank->bitmap |= 1 << idx;
3815 /* no free recordable channels avaliable */
3817 printk(KERN_ERR "ali: no recordable channels available on Bank A.\n");
3823 ali_set_spdif_out_rate(struct trident_card *card, unsigned int rate)
3825 unsigned char ch_st_sel;
3826 unsigned short status_rate;
3833 status_rate = 0x300;
3837 status_rate = 0x200;
3841 /* select spdif_out */
3842 ch_st_sel = inb(TRID_REG(card, ALI_SPDIF_CTRL)) & ALI_SPDIF_OUT_CH_STATUS;
3844 ch_st_sel |= 0x80; /* select right */
3845 outb(ch_st_sel, TRID_REG(card, ALI_SPDIF_CTRL));
3846 outb(status_rate | 0x20, TRID_REG(card, ALI_SPDIF_CS + 2));
3848 ch_st_sel &= (~0x80); /* select left */
3849 outb(ch_st_sel, TRID_REG(card, ALI_SPDIF_CTRL));
3850 outw(status_rate | 0x10, TRID_REG(card, ALI_SPDIF_CS + 2));
3854 ali_address_interrupt(struct trident_card *card)
3857 struct trident_state *state;
3858 u32 mask, channel_mask;
3860 mask = trident_get_interrupt_mask(card, 0);
3861 for (i = 0; i < NR_HW_CH; i++) {
3862 if ((state = card->states[i]) == NULL)
3864 channel = state->dmabuf.channel->num;
3865 if ((channel_mask = 1 << channel) & mask) {
3866 mask &= ~channel_mask;
3867 trident_ack_channel_interrupt(card, channel);
3869 state->dmabuf.update_flag |= ALI_ADDRESS_INT_UPDATE;
3870 trident_update_ptr(state);
3874 for (i = 0; i < NR_HW_CH; i++) {
3875 if (mask & (1 << i)) {
3876 printk("ali: spurious channel irq %d.\n", i);
3877 trident_ack_channel_interrupt(card, i);
3878 trident_stop_voice(card, i);
3879 trident_disable_voice_irq(card, i);
3885 /* Updating the values of counters of other_states' DMAs without lock
3886 protection is no harm because all DMAs of multi-channels and interrupt
3887 depend on a master state's DMA, and changing the counters of the master
3888 state DMA is protected by a spinlock.
3891 ali_write_5_1(struct trident_state *state, const char __user *buf,
3892 int cnt_for_multi_channel, unsigned int *copy_count,
3893 unsigned int *state_cnt)
3896 struct dmabuf *dmabuf = &state->dmabuf;
3897 struct dmabuf *dmabuf_temp;
3898 const char __user *buffer = buf;
3899 unsigned swptr, other_dma_nums, sample_s;
3900 unsigned int i, loop;
3903 sample_s = sample_size[dmabuf->fmt] >> 1;
3904 swptr = dmabuf->swptr;
3906 if ((i = state->multi_channels_adjust_count) > 0) {
3908 if (copy_from_user(dmabuf->rawbuf + swptr,
3911 seek_offset(swptr, buffer, cnt_for_multi_channel,
3912 sample_s, *copy_count);
3914 (*state_cnt) += sample_s;
3915 state->multi_channels_adjust_count++;
3917 i = i - (state->chans_num - other_dma_nums);
3918 for (; (i < other_dma_nums) && (cnt_for_multi_channel > 0); i++) {
3919 dmabuf_temp = &state->other_states[i]->dmabuf;
3920 if (copy_from_user(dmabuf_temp->rawbuf + dmabuf_temp->swptr,
3923 seek_offset(dmabuf_temp->swptr, buffer, cnt_for_multi_channel,
3924 sample_s, *copy_count);
3926 if (cnt_for_multi_channel == 0)
3927 state->multi_channels_adjust_count += i;
3929 if (cnt_for_multi_channel > 0) {
3930 loop = cnt_for_multi_channel / (state->chans_num * sample_s);
3931 for (i = 0; i < loop; i++) {
3932 if (copy_from_user(dmabuf->rawbuf + swptr, buffer,
3935 seek_offset(swptr, buffer, cnt_for_multi_channel,
3936 sample_s * 2, *copy_count);
3937 (*state_cnt) += (sample_s * 2);
3939 dmabuf_temp = &state->other_states[0]->dmabuf;
3940 if (copy_from_user(dmabuf_temp->rawbuf + dmabuf_temp->swptr,
3943 seek_offset(dmabuf_temp->swptr, buffer, cnt_for_multi_channel,
3944 sample_s, *copy_count);
3946 dmabuf_temp = &state->other_states[1]->dmabuf;
3947 if (copy_from_user(dmabuf_temp->rawbuf + dmabuf_temp->swptr,
3950 seek_offset(dmabuf_temp->swptr, buffer, cnt_for_multi_channel,
3951 sample_s, *copy_count);
3953 dmabuf_temp = &state->other_states[2]->dmabuf;
3954 if (copy_from_user(dmabuf_temp->rawbuf + dmabuf_temp->swptr,
3957 seek_offset(dmabuf_temp->swptr, buffer, cnt_for_multi_channel,
3958 sample_s, *copy_count);
3960 dmabuf_temp = &state->other_states[3]->dmabuf;
3961 if (copy_from_user(dmabuf_temp->rawbuf + dmabuf_temp->swptr,
3964 seek_offset(dmabuf_temp->swptr, buffer, cnt_for_multi_channel,
3965 sample_s, *copy_count);
3968 if (cnt_for_multi_channel > 0) {
3969 state->multi_channels_adjust_count = cnt_for_multi_channel / sample_s;
3971 if (copy_from_user(dmabuf->rawbuf + swptr, buffer, sample_s))
3973 seek_offset(swptr, buffer, cnt_for_multi_channel,
3974 sample_s, *copy_count);
3975 (*state_cnt) += sample_s;
3977 if (cnt_for_multi_channel > 0) {
3978 if (copy_from_user(dmabuf->rawbuf + swptr,
3981 seek_offset(swptr, buffer, cnt_for_multi_channel,
3982 sample_s, *copy_count);
3983 (*state_cnt) += sample_s;
3985 if (cnt_for_multi_channel > 0) {
3986 int diff = state->chans_num - other_dma_nums;
3987 loop = state->multi_channels_adjust_count - diff;
3988 for (i = 0; i < loop; i++) {
3989 dmabuf_temp = &state->other_states[i]->dmabuf;
3990 if (copy_from_user(dmabuf_temp->rawbuf +
3994 seek_offset(dmabuf_temp->swptr, buffer,
3995 cnt_for_multi_channel,
3996 sample_s, *copy_count);
4001 state->multi_channels_adjust_count = 0;
4003 for (i = 0; i < other_dma_nums; i++) {
4004 dmabuf_temp = &state->other_states[i]->dmabuf;
4005 dmabuf_temp->swptr = dmabuf_temp->swptr % dmabuf_temp->dmasize;
4011 ali_free_other_states_resources(struct trident_state *state)
4014 struct trident_card *card = state->card;
4015 struct trident_state *s;
4016 unsigned other_states_count;
4018 other_states_count = state->chans_num - 2; /* except PCM L/R channels */
4019 for (i = 0; i < other_states_count; i++) {
4020 s = state->other_states[i];
4021 dealloc_dmabuf(&s->dmabuf, card->pci_dev);
4022 ali_disable_special_channel(s->card, s->dmabuf.channel->num);
4023 state->card->free_pcm_channel(s->card, s->dmabuf.channel->num);
4024 card->states[s->virt] = NULL;
4029 static struct proc_dir_entry *res;
4032 ali_write_proc(struct file *file, const char __user *buffer, unsigned long count, void *data)
4034 struct trident_card *card = (struct trident_card *) data;
4035 unsigned long flags;
4042 if (get_user(c, buffer))
4045 spin_lock_irqsave(&card->lock, flags);
4048 ali_setup_spdif_out(card, ALI_PCM_TO_SPDIF_OUT);
4049 ali_disable_special_channel(card, ALI_SPDIF_OUT_CHANNEL);
4052 ali_setup_spdif_out(card, ALI_SPDIF_OUT_TO_SPDIF_OUT |
4056 ali_setup_spdif_out(card, ALI_SPDIF_OUT_TO_SPDIF_OUT |
4057 ALI_SPDIF_OUT_NON_PCM);
4060 ali_disable_spdif_in(card); //default
4063 ali_setup_spdif_in(card);
4066 spin_unlock_irqrestore(&card->lock, flags);
4071 /* OSS /dev/mixer file operation methods */
4073 trident_open_mixdev(struct inode *inode, struct file *file)
4076 int minor = iminor(inode);
4077 struct trident_card *card = devs;
4079 for (card = devs; card != NULL; card = card->next)
4080 for (i = 0; i < NR_AC97; i++)
4081 if (card->ac97_codec[i] != NULL &&
4082 card->ac97_codec[i]->dev_mixer == minor)
4089 file->private_data = card->ac97_codec[i];
4091 return nonseekable_open(inode, file);
4095 trident_ioctl_mixdev(struct inode *inode, struct file *file, unsigned int cmd,
4098 struct ac97_codec *codec = (struct ac97_codec *) file->private_data;
4100 return codec->mixer_ioctl(codec, cmd, arg);
4103 static /*const */ struct file_operations trident_mixer_fops = {
4104 .owner = THIS_MODULE,
4105 .llseek = no_llseek,
4106 .ioctl = trident_ioctl_mixdev,
4107 .open = trident_open_mixdev,
4111 ali_reset_5451(struct trident_card *card)
4113 struct pci_dev *pci_dev = NULL;
4115 unsigned short wCount, wReg;
4117 pci_dev = pci_get_device(PCI_VENDOR_ID_AL, PCI_DEVICE_ID_AL_M1533,
4119 if (pci_dev == NULL)
4122 pci_read_config_dword(pci_dev, 0x7c, &dwVal);
4123 pci_write_config_dword(pci_dev, 0x7c, dwVal | 0x08000000);
4125 pci_read_config_dword(pci_dev, 0x7c, &dwVal);
4126 pci_write_config_dword(pci_dev, 0x7c, dwVal & 0xf7ffffff);
4128 pci_dev_put(pci_dev);
4130 pci_dev = card->pci_dev;
4131 if (pci_dev == NULL)
4134 pci_read_config_dword(pci_dev, 0x44, &dwVal);
4135 pci_write_config_dword(pci_dev, 0x44, dwVal | 0x000c0000);
4137 pci_read_config_dword(pci_dev, 0x44, &dwVal);
4138 pci_write_config_dword(pci_dev, 0x44, dwVal & 0xfffbffff);
4141 /* TODO: recognize if we have a PM capable codec and only do this */
4142 /* if the codec is PM capable */
4145 wReg = ali_ac97_get(card, 0, AC97_POWER_CONTROL);
4146 if ((wReg & 0x000f) == 0x000f)
4150 /* This is non fatal if you have a non PM capable codec.. */
4154 /* AC97 codec initialisation. */
4155 static int __devinit
4156 trident_ac97_init(struct trident_card *card)
4159 unsigned long ready_2nd = 0;
4160 struct ac97_codec *codec;
4163 /* initialize controller side of AC link, and find out if secondary codes
4165 switch (card->pci_id) {
4166 case PCI_DEVICE_ID_ALI_5451:
4167 if (ali_reset_5451(card)) {
4168 printk(KERN_ERR "trident_ac97_init: error "
4169 "resetting 5451.\n");
4172 outl(0x80000001, TRID_REG(card, ALI_GLOBAL_CONTROL));
4173 outl(0x00000000, TRID_REG(card, T4D_AINTEN_A));
4174 outl(0xffffffff, TRID_REG(card, T4D_AINT_A));
4175 outl(0x00000000, TRID_REG(card, T4D_MUSICVOL_WAVEVOL));
4176 outb(0x10, TRID_REG(card, ALI_MPUR2));
4177 ready_2nd = inl(TRID_REG(card, ALI_SCTRL));
4178 ready_2nd &= 0x3fff;
4179 outl(ready_2nd | PCMOUT | 0x8000, TRID_REG(card, ALI_SCTRL));
4180 ready_2nd = inl(TRID_REG(card, ALI_SCTRL));
4181 ready_2nd &= SI_AC97_SECONDARY_READY;
4182 if (card->revision < ALI_5451_V02)
4185 case PCI_DEVICE_ID_SI_7018:
4186 /* disable AC97 GPIO interrupt */
4187 outl(0x00, TRID_REG(card, SI_AC97_GPIO));
4188 /* when power up the AC link is in cold reset mode so stop it */
4189 outl(PCMOUT | SURROUT | CENTEROUT | LFEOUT | SECONDARY_ID,
4190 TRID_REG(card, SI_SERIAL_INTF_CTRL));
4191 /* it take a long time to recover from a cold reset */
4192 /* (especially when you have more than one codec) */
4194 ready_2nd = inl(TRID_REG(card, SI_SERIAL_INTF_CTRL));
4195 ready_2nd &= SI_AC97_SECONDARY_READY;
4197 case PCI_DEVICE_ID_TRIDENT_4DWAVE_DX:
4199 outl(DX_AC97_PLAYBACK, TRID_REG(card, DX_ACR2_AC97_COM_STAT));
4201 case PCI_DEVICE_ID_TRIDENT_4DWAVE_NX:
4202 /* enable AC97 Output Slot 3,4 (PCM Left/Right Playback) */
4203 outl(NX_AC97_PCM_OUTPUT, TRID_REG(card, NX_ACR0_AC97_COM_STAT));
4204 ready_2nd = inl(TRID_REG(card, NX_ACR0_AC97_COM_STAT));
4205 ready_2nd &= NX_AC97_SECONDARY_READY;
4207 case PCI_DEVICE_ID_INTERG_5050:
4208 /* disable AC97 GPIO interrupt */
4209 outl(0x00, TRID_REG(card, SI_AC97_GPIO));
4210 /* when power up, the AC link is in cold reset mode, so stop it */
4211 outl(PCMOUT | SURROUT | CENTEROUT | LFEOUT,
4212 TRID_REG(card, SI_SERIAL_INTF_CTRL));
4213 /* it take a long time to recover from a cold reset (especially */
4214 /* when you have more than one codec) */
4216 ready_2nd = inl(TRID_REG(card, SI_SERIAL_INTF_CTRL));
4217 ready_2nd &= SI_AC97_SECONDARY_READY;
4221 for (num_ac97 = 0; num_ac97 < NR_AC97; num_ac97++) {
4222 if ((codec = ac97_alloc_codec()) == NULL)
4225 /* initialize some basic codec information, other fields */
4226 /* will be filled in ac97_probe_codec */
4227 codec->private_data = card;
4228 codec->id = num_ac97;
4230 if (card->pci_id == PCI_DEVICE_ID_ALI_5451) {
4231 codec->codec_read = ali_ac97_read;
4232 codec->codec_write = ali_ac97_write;
4234 codec->codec_read = trident_ac97_get;
4235 codec->codec_write = trident_ac97_set;
4238 if (ac97_probe_codec(codec) == 0)
4241 codec->dev_mixer = register_sound_mixer(&trident_mixer_fops, -1);
4242 if (codec->dev_mixer < 0) {
4243 printk(KERN_ERR "trident: couldn't register mixer!\n");
4244 ac97_release_codec(codec);
4248 card->ac97_codec[num_ac97] = codec;
4250 /* if there is no secondary codec at all, don't probe any more */
4255 if (card->pci_id == PCI_DEVICE_ID_ALI_5451) {
4256 for (num_ac97 = 0; num_ac97 < NR_AC97; num_ac97++) {
4257 if (card->ac97_codec[num_ac97] == NULL)
4259 for (i = 0; i < 64; i++) {
4260 u16 reg = ali_ac97_get(card, num_ac97, i * 2);
4261 card->mixer_regs[i][num_ac97] = reg;
4265 return num_ac97 + 1;
4268 #ifdef SUPPORT_JOYSTICK
4269 /* Gameport functions for the cards ADC gameport */
4271 static unsigned char trident_game_read(struct gameport *gameport)
4273 struct trident_card *card = gameport->port_data;
4275 return inb(TRID_REG(card, T4D_GAME_LEG));
4278 static void trident_game_trigger(struct gameport *gameport)
4280 struct trident_card *card = gameport->port_data;
4282 outb(0xff, TRID_REG(card, T4D_GAME_LEG));
4285 static int trident_game_cooked_read(struct gameport *gameport,
4286 int *axes, int *buttons)
4288 struct trident_card *card = gameport->port_data;
4291 *buttons = (~inb(TRID_REG(card, T4D_GAME_LEG)) >> 4) & 0xf;
4293 for (i = 0; i < 4; i++) {
4294 axes[i] = inw(TRID_REG(card, T4D_GAME_AXD) + i * sizeof (u16));
4295 if (axes[i] == 0xffff)
4302 static int trident_game_open(struct gameport *gameport, int mode)
4304 struct trident_card *card = gameport->port_data;
4307 case GAMEPORT_MODE_COOKED:
4308 outb(0x80, TRID_REG(card, T4D_GAME_CR));
4311 case GAMEPORT_MODE_RAW:
4312 outb(0x00, TRID_REG(card, T4D_GAME_CR));
4321 static int __devinit trident_register_gameport(struct trident_card *card)
4323 struct gameport *gp;
4325 card->gameport = gp = gameport_allocate_port();
4327 printk(KERN_ERR "trident: can not allocate memory for gameport\n");
4331 gameport_set_name(gp, "Trident 4DWave");
4332 gameport_set_phys(gp, "pci%s/gameport0", pci_name(card->pci_dev));
4333 gp->read = trident_game_read;
4334 gp->trigger = trident_game_trigger;
4335 gp->cooked_read = trident_game_cooked_read;
4336 gp->open = trident_game_open;
4338 gp->port_data = card;
4340 gameport_register_port(gp);
4345 static inline void trident_unregister_gameport(struct trident_card *card)
4348 gameport_unregister_port(card->gameport);
4352 static inline int trident_register_gameport(struct trident_card *card) { return -ENOSYS; }
4353 static inline void trident_unregister_gameport(struct trident_card *card) { }
4354 #endif /* SUPPORT_JOYSTICK */
4356 /* install the driver, we do not allocate hardware channel nor DMA buffer */
4357 /* now, they are defered until "ACCESS" time (in prog_dmabuf called by */
4358 /* open/read/write/ioctl/mmap) */
4359 static int __devinit
4360 trident_probe(struct pci_dev *pci_dev, const struct pci_device_id *pci_id)
4362 unsigned long iobase;
4363 struct trident_card *card;
4368 struct pci_dev *pci_dev_m1533 = NULL;
4372 if (pci_enable_device(pci_dev))
4375 if (pci_dev->device == PCI_DEVICE_ID_ALI_5451)
4376 dma_mask = ALI_DMA_MASK;
4378 dma_mask = TRIDENT_DMA_MASK;
4379 if (pci_set_dma_mask(pci_dev, dma_mask)) {
4380 printk(KERN_ERR "trident: architecture does not support"
4381 " %s PCI busmaster DMA\n",
4382 pci_dev->device == PCI_DEVICE_ID_ALI_5451 ?
4383 "32-bit" : "30-bit");
4386 pci_read_config_byte(pci_dev, PCI_CLASS_REVISION, &revision);
4388 if (pci_id->device == PCI_DEVICE_ID_INTERG_5050)
4389 iobase = pci_resource_start(pci_dev, 1);
4391 iobase = pci_resource_start(pci_dev, 0);
4393 if (!request_region(iobase, 256, card_names[pci_id->driver_data])) {
4394 printk(KERN_ERR "trident: can't allocate I/O space at "
4395 "0x%4.4lx\n", iobase);
4400 if ((card = kzalloc(sizeof(*card), GFP_KERNEL)) == NULL) {
4401 printk(KERN_ERR "trident: out of memory\n");
4402 goto out_release_region;
4405 init_timer(&card->timer);
4406 card->iobase = iobase;
4407 card->pci_dev = pci_dev_get(pci_dev);
4408 card->pci_id = pci_id->device;
4409 card->revision = revision;
4410 card->irq = pci_dev->irq;
4412 card->magic = TRIDENT_CARD_MAGIC;
4413 card->banks[BANK_A].addresses = &bank_a_addrs;
4414 card->banks[BANK_A].bitmap = 0UL;
4415 card->banks[BANK_B].addresses = &bank_b_addrs;
4416 card->banks[BANK_B].bitmap = 0UL;
4418 mutex_init(&card->open_mutex);
4419 spin_lock_init(&card->lock);
4420 init_timer(&card->timer);
4424 pci_set_master(pci_dev);
4426 printk(KERN_INFO "trident: %s found at IO 0x%04lx, IRQ %d\n",
4427 card_names[pci_id->driver_data], card->iobase, card->irq);
4429 if (card->pci_id == PCI_DEVICE_ID_ALI_5451) {
4430 /* ALi channel Management */
4431 card->alloc_pcm_channel = ali_alloc_pcm_channel;
4432 card->alloc_rec_pcm_channel = ali_alloc_rec_pcm_channel;
4433 card->free_pcm_channel = ali_free_pcm_channel;
4435 card->address_interrupt = ali_address_interrupt;
4437 /* Added by Matt Wu 01-05-2001 for spdif in */
4438 card->multi_channel_use_count = 0;
4439 card->rec_channel_use_count = 0;
4441 /* ALi SPDIF OUT function */
4442 if (card->revision == ALI_5451_V02) {
4443 ali_setup_spdif_out(card, ALI_PCM_TO_SPDIF_OUT);
4444 res = create_proc_entry("ALi5451", 0, NULL);
4446 res->write_proc = ali_write_proc;
4451 /* Add H/W Volume Control By Matt Wu Jul. 06, 2001 */
4453 pci_dev_m1533 = pci_find_device(PCI_VENDOR_ID_AL,
4454 PCI_DEVICE_ID_AL_M1533,
4457 if (pci_dev_m1533 == NULL)
4459 pci_read_config_byte(pci_dev_m1533, 0x63, &bits);
4460 if (bits & (1 << 5))
4462 if (card->hwvolctl) {
4463 /* Clear m1533 pci cfg 78h bit 30 to zero, which makes
4464 GPIO11/12/13 work as ACGP_UP/DOWN/MUTE. */
4465 pci_read_config_byte(pci_dev_m1533, 0x7b, &bits);
4466 bits &= 0xbf; /*clear bit 6 */
4467 pci_write_config_byte(pci_dev_m1533, 0x7b, bits);
4469 } else if (card->pci_id == PCI_DEVICE_ID_INTERG_5050) {
4470 card->alloc_pcm_channel = cyber_alloc_pcm_channel;
4471 card->alloc_rec_pcm_channel = cyber_alloc_pcm_channel;
4472 card->free_pcm_channel = cyber_free_pcm_channel;
4473 card->address_interrupt = cyber_address_interrupt;
4474 cyber_init_ritual(card);
4476 card->alloc_pcm_channel = trident_alloc_pcm_channel;
4477 card->alloc_rec_pcm_channel = trident_alloc_pcm_channel;
4478 card->free_pcm_channel = trident_free_pcm_channel;
4479 card->address_interrupt = trident_address_interrupt;
4484 if (request_irq(card->irq, &trident_interrupt, IRQF_SHARED,
4485 card_names[pci_id->driver_data], card)) {
4486 printk(KERN_ERR "trident: unable to allocate irq %d\n",
4490 /* register /dev/dsp */
4491 if ((card->dev_audio = register_sound_dsp(&trident_audio_fops, -1)) < 0) {
4492 printk(KERN_ERR "trident: couldn't register DSP device!\n");
4495 card->mixer_regs_ready = 0;
4496 /* initialize AC97 codec and register /dev/mixer */
4497 if (trident_ac97_init(card) <= 0) {
4498 /* unregister audio devices */
4499 for (i = 0; i < NR_AC97; i++) {
4500 if (card->ac97_codec[i] != NULL) {
4501 struct ac97_codec* codec = card->ac97_codec[i];
4502 unregister_sound_mixer(codec->dev_mixer);
4503 ac97_release_codec(codec);
4506 goto out_unregister_sound_dsp;
4508 card->mixer_regs_ready = 1;
4509 outl(0x00, TRID_REG(card, T4D_MUSICVOL_WAVEVOL));
4511 if (card->pci_id == PCI_DEVICE_ID_ALI_5451) {
4512 /* Add H/W Volume Control By Matt Wu Jul. 06, 2001 */
4513 if (card->hwvolctl) {
4514 /* Enable GPIO IRQ (MISCINT bit 18h) */
4515 temp = inw(TRID_REG(card, T4D_MISCINT + 2));
4517 outw(temp, TRID_REG(card, T4D_MISCINT + 2));
4519 /* Enable H/W Volume Control GLOVAL CONTROL bit 0 */
4520 temp = inw(TRID_REG(card, ALI_GLOBAL_CONTROL));
4522 outw(temp, TRID_REG(card, ALI_GLOBAL_CONTROL));
4525 if (card->revision == ALI_5451_V02)
4526 ali_close_multi_channels();
4527 /* edited by HMSEO for GT sound */
4528 #if defined(CONFIG_ALPHA_NAUTILUS) || defined(CONFIG_ALPHA_GENERIC)
4531 extern struct hwrpb_struct *hwrpb;
4533 if ((hwrpb->sys_type) == 201) {
4534 printk(KERN_INFO "trident: Running on Alpha system "
4536 ac97_data = ali_ac97_get(card, 0, AC97_POWER_CONTROL);
4537 ali_ac97_set(card, 0, AC97_POWER_CONTROL,
4538 ac97_data | ALI_EAPD_POWER_DOWN);
4541 #endif /* CONFIG_ALPHA_NAUTILUS || CONFIG_ALPHA_GENERIC */
4542 /* edited by HMSEO for GT sound */
4545 pci_set_drvdata(pci_dev, card);
4547 /* Enable Address Engine Interrupts */
4548 trident_enable_loop_interrupts(card);
4550 /* Register gameport */
4551 trident_register_gameport(card);
4556 out_unregister_sound_dsp:
4557 unregister_sound_dsp(card->dev_audio);
4559 free_irq(card->irq, card);
4561 pci_dev_put(card->pci_dev);
4563 remove_proc_entry("ALi5451", NULL);
4569 release_region(iobase, 256);
4573 static void __devexit
4574 trident_remove(struct pci_dev *pci_dev)
4577 struct trident_card *card = pci_get_drvdata(pci_dev);
4580 * Kill running timers before unload. We can't have them
4581 * going off after rmmod!
4584 del_timer_sync(&card->timer);
4586 /* ALi S/PDIF and Power Management */
4587 if (card->pci_id == PCI_DEVICE_ID_ALI_5451) {
4588 ali_setup_spdif_out(card, ALI_PCM_TO_SPDIF_OUT);
4589 ali_disable_special_channel(card, ALI_SPDIF_OUT_CHANNEL);
4590 ali_disable_spdif_in(card);
4591 remove_proc_entry("ALi5451", NULL);
4594 /* Unregister gameport */
4595 trident_unregister_gameport(card);
4597 /* Kill interrupts, and SP/DIF */
4598 trident_disable_loop_interrupts(card);
4600 /* free hardware resources */
4601 free_irq(card->irq, card);
4602 release_region(card->iobase, 256);
4604 /* unregister audio devices */
4605 for (i = 0; i < NR_AC97; i++)
4606 if (card->ac97_codec[i] != NULL) {
4607 unregister_sound_mixer(card->ac97_codec[i]->dev_mixer);
4608 ac97_release_codec(card->ac97_codec[i]);
4610 unregister_sound_dsp(card->dev_audio);
4612 pci_set_drvdata(pci_dev, NULL);
4613 pci_dev_put(card->pci_dev);
4617 MODULE_AUTHOR("Alan Cox, Aaron Holtzman, Ollie Lho, Ching Ling Lee, Muli Ben-Yehuda");
4618 MODULE_DESCRIPTION("Trident 4DWave/SiS 7018/ALi 5451 and Tvia/IGST CyberPro5050 PCI "
4620 MODULE_LICENSE("GPL");
4622 #define TRIDENT_MODULE_NAME "trident"
4624 static struct pci_driver trident_pci_driver = {
4625 .name = TRIDENT_MODULE_NAME,
4626 .id_table = trident_pci_tbl,
4627 .probe = trident_probe,
4628 .remove = __devexit_p(trident_remove),
4630 .suspend = trident_suspend,
4631 .resume = trident_resume
4636 trident_init_module(void)
4638 printk(KERN_INFO "Trident 4DWave/SiS 7018/ALi 5451,Tvia CyberPro "
4639 "5050 PCI Audio, version " DRIVER_VERSION ", " __TIME__ " "
4642 return pci_register_driver(&trident_pci_driver);
4646 trident_cleanup_module(void)
4648 pci_unregister_driver(&trident_pci_driver);
4651 module_init(trident_init_module);
4652 module_exit(trident_cleanup_module);