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] = kmalloc(sizeof(*state), GFP_KERNEL);
2733 if (state == NULL) {
2734 mutex_unlock(&card->open_mutex);
2737 memset(state, 0, sizeof(*state));
2738 mutex_init(&state->sem);
2739 dmabuf = &state->dmabuf;
2743 mutex_unlock(&card->open_mutex);
2746 /* no more virtual channel avaiable */
2751 /* found a free virtual channel, allocate hardware channels */
2752 if (file->f_mode & FMODE_READ)
2753 dmabuf->channel = card->alloc_rec_pcm_channel(card);
2755 dmabuf->channel = card->alloc_pcm_channel(card);
2757 if (dmabuf->channel == NULL) {
2758 kfree(card->states[i]);
2759 card->states[i] = NULL;
2763 /* initialize the virtual channel */
2766 state->magic = TRIDENT_STATE_MAGIC;
2767 init_waitqueue_head(&dmabuf->wait);
2768 file->private_data = state;
2770 /* set default sample format. According to OSS Programmer's */
2771 /* Guide /dev/dsp should be default to unsigned 8-bits, mono, */
2772 /* with sample rate 8kHz and /dev/dspW will accept 16-bits sample */
2773 if (file->f_mode & FMODE_WRITE) {
2774 dmabuf->fmt &= ~TRIDENT_FMT_MASK;
2775 if ((minor & 0x0f) == SND_DEV_DSP16)
2776 dmabuf->fmt |= TRIDENT_FMT_16BIT;
2777 dmabuf->ossfragshift = 0;
2778 dmabuf->ossmaxfrags = 0;
2779 dmabuf->subdivision = 0;
2780 if (card->pci_id == PCI_DEVICE_ID_SI_7018) {
2781 /* set default channel attribute to normal playback */
2782 dmabuf->channel->attribute = CHANNEL_PB;
2784 trident_set_dac_rate(state, 8000);
2787 if (file->f_mode & FMODE_READ) {
2788 /* FIXME: Trident 4d can only record in signed 16-bits stereo, */
2789 /* 48kHz sample, to be dealed with in trident_set_adc_rate() ?? */
2790 dmabuf->fmt &= ~TRIDENT_FMT_MASK;
2791 if ((minor & 0x0f) == SND_DEV_DSP16)
2792 dmabuf->fmt |= TRIDENT_FMT_16BIT;
2793 dmabuf->ossfragshift = 0;
2794 dmabuf->ossmaxfrags = 0;
2795 dmabuf->subdivision = 0;
2796 if (card->pci_id == PCI_DEVICE_ID_SI_7018) {
2797 /* set default channel attribute to 0x8a80, record from
2798 PCM L/R FIFO and mono = (left + right + 1)/2 */
2799 dmabuf->channel->attribute = (CHANNEL_REC | PCM_LR |
2802 trident_set_adc_rate(state, 8000);
2804 /* Added by Matt Wu 01-05-2001 */
2805 if (card->pci_id == PCI_DEVICE_ID_ALI_5451)
2806 card->rec_channel_use_count++;
2809 state->open_mode |= file->f_mode & (FMODE_READ | FMODE_WRITE);
2810 mutex_unlock(&card->open_mutex);
2812 pr_debug("trident: open virtual channel %d, hard channel %d\n",
2813 state->virt, dmabuf->channel->num);
2815 return nonseekable_open(inode, file);
2819 trident_release(struct inode *inode, struct file *file)
2821 struct trident_state *state = (struct trident_state *)file->private_data;
2822 struct trident_card *card;
2823 struct dmabuf *dmabuf;
2825 VALIDATE_STATE(state);
2828 dmabuf = &state->dmabuf;
2830 if (file->f_mode & FMODE_WRITE) {
2831 trident_clear_tail(state);
2832 drain_dac(state, file->f_flags & O_NONBLOCK);
2835 pr_debug("trident: closing virtual channel %d, hard channel %d\n",
2836 state->virt, dmabuf->channel->num);
2838 /* stop DMA state machine and free DMA buffers/channels */
2839 mutex_lock(&card->open_mutex);
2841 if (file->f_mode & FMODE_WRITE) {
2843 dealloc_dmabuf(&state->dmabuf, state->card->pci_dev);
2844 state->card->free_pcm_channel(state->card, dmabuf->channel->num);
2846 /* Added by Matt Wu */
2847 if (card->pci_id == PCI_DEVICE_ID_ALI_5451) {
2848 if (state->chans_num > 2) {
2849 if (card->multi_channel_use_count-- < 0)
2850 card->multi_channel_use_count = 0;
2851 if (card->multi_channel_use_count == 0)
2852 ali_close_multi_channels();
2853 ali_free_other_states_resources(state);
2857 if (file->f_mode & FMODE_READ) {
2859 dealloc_dmabuf(&state->dmabuf, state->card->pci_dev);
2860 state->card->free_pcm_channel(state->card, dmabuf->channel->num);
2862 /* Added by Matt Wu */
2863 if (card->pci_id == PCI_DEVICE_ID_ALI_5451) {
2864 if (card->rec_channel_use_count-- < 0)
2865 card->rec_channel_use_count = 0;
2869 card->states[state->virt] = NULL;
2872 /* we're covered by the open_mutex */
2873 mutex_unlock(&card->open_mutex);
2878 static /*const */ struct file_operations trident_audio_fops = {
2879 .owner = THIS_MODULE,
2880 .llseek = no_llseek,
2881 .read = trident_read,
2882 .write = trident_write,
2883 .poll = trident_poll,
2884 .ioctl = trident_ioctl,
2885 .mmap = trident_mmap,
2886 .open = trident_open,
2887 .release = trident_release,
2890 /* trident specific AC97 functions */
2891 /* Write AC97 codec registers */
2893 trident_ac97_set(struct ac97_codec *codec, u8 reg, u16 val)
2895 struct trident_card *card = (struct trident_card *)codec->private_data;
2896 unsigned int address, mask, busy;
2897 unsigned short count = 0xffff;
2898 unsigned long flags;
2901 data = ((u32) val) << 16;
2903 switch (card->pci_id) {
2905 case PCI_DEVICE_ID_SI_7018:
2906 address = SI_AC97_WRITE;
2907 mask = SI_AC97_BUSY_WRITE | SI_AC97_AUDIO_BUSY;
2909 mask |= SI_AC97_SECONDARY;
2910 busy = SI_AC97_BUSY_WRITE;
2912 case PCI_DEVICE_ID_TRIDENT_4DWAVE_DX:
2913 address = DX_ACR0_AC97_W;
2914 mask = busy = DX_AC97_BUSY_WRITE;
2916 case PCI_DEVICE_ID_TRIDENT_4DWAVE_NX:
2917 address = NX_ACR1_AC97_W;
2918 mask = NX_AC97_BUSY_WRITE;
2920 mask |= NX_AC97_WRITE_SECONDARY;
2921 busy = NX_AC97_BUSY_WRITE;
2923 case PCI_DEVICE_ID_INTERG_5050:
2924 address = SI_AC97_WRITE;
2925 mask = busy = SI_AC97_BUSY_WRITE;
2927 mask |= SI_AC97_SECONDARY;
2931 spin_lock_irqsave(&card->lock, flags);
2933 if ((inw(TRID_REG(card, address)) & busy) == 0)
2937 data |= (mask | (reg & AC97_REG_ADDR));
2940 printk(KERN_ERR "trident: AC97 CODEC write timed out.\n");
2941 spin_unlock_irqrestore(&card->lock, flags);
2945 outl(data, TRID_REG(card, address));
2946 spin_unlock_irqrestore(&card->lock, flags);
2949 /* Read AC97 codec registers */
2951 trident_ac97_get(struct ac97_codec *codec, u8 reg)
2953 struct trident_card *card = (struct trident_card *)codec->private_data;
2954 unsigned int address, mask, busy;
2955 unsigned short count = 0xffff;
2956 unsigned long flags;
2959 switch (card->pci_id) {
2961 case PCI_DEVICE_ID_SI_7018:
2962 address = SI_AC97_READ;
2963 mask = SI_AC97_BUSY_READ | SI_AC97_AUDIO_BUSY;
2965 mask |= SI_AC97_SECONDARY;
2966 busy = SI_AC97_BUSY_READ;
2968 case PCI_DEVICE_ID_TRIDENT_4DWAVE_DX:
2969 address = DX_ACR1_AC97_R;
2970 mask = busy = DX_AC97_BUSY_READ;
2972 case PCI_DEVICE_ID_TRIDENT_4DWAVE_NX:
2974 address = NX_ACR3_AC97_R_SECONDARY;
2976 address = NX_ACR2_AC97_R_PRIMARY;
2977 mask = NX_AC97_BUSY_READ;
2978 busy = NX_AC97_BUSY_READ | NX_AC97_BUSY_DATA;
2980 case PCI_DEVICE_ID_INTERG_5050:
2981 address = SI_AC97_READ;
2982 mask = busy = SI_AC97_BUSY_READ;
2984 mask |= SI_AC97_SECONDARY;
2988 data = (mask | (reg & AC97_REG_ADDR));
2990 spin_lock_irqsave(&card->lock, flags);
2991 outl(data, TRID_REG(card, address));
2993 data = inl(TRID_REG(card, address));
2994 if ((data & busy) == 0)
2997 spin_unlock_irqrestore(&card->lock, flags);
3000 printk(KERN_ERR "trident: AC97 CODEC read timed out.\n");
3003 return ((u16) (data >> 16));
3006 /* rewrite ac97 read and write mixer register by hulei for ALI*/
3008 acquirecodecaccess(struct trident_card *card)
3010 u16 wsemamask = 0x6000; /* bit 14..13 */
3016 wcontrol = inw(TRID_REG(card, ALI_AC97_WRITE));
3017 wsemabits = wcontrol & wsemamask;
3019 if (wsemabits == 0x4000)
3020 return 1; /* 0x4000 is audio ,then success */
3023 if (wsemabits == 0) {
3025 outl(((u32) (wcontrol & 0x1eff) | 0x00004000),
3026 TRID_REG(card, ALI_AC97_WRITE));
3032 pr_debug("accesscodecsemaphore: try unlock\n");
3040 releasecodecaccess(struct trident_card *card)
3042 unsigned long wcontrol;
3043 wcontrol = inl(TRID_REG(card, ALI_AC97_WRITE));
3044 outl((wcontrol & 0xffff1eff), TRID_REG(card, ALI_AC97_WRITE));
3048 waitforstimertick(struct trident_card *card)
3050 unsigned long chk1, chk2;
3051 unsigned int wcount = 0xffff;
3052 chk1 = inl(TRID_REG(card, ALI_STIMER));
3055 chk2 = inl(TRID_REG(card, ALI_STIMER));
3056 if ((wcount > 0) && chk1 != chk2)
3065 /* Read AC97 codec registers for ALi*/
3067 ali_ac97_get(struct trident_card *card, int secondary, u8 reg)
3069 unsigned int address, mask;
3070 unsigned int ncount;
3071 unsigned long aud_reg;
3074 unsigned long flags;
3079 address = ALI_AC97_READ;
3080 if (card->revision == ALI_5451_V02) {
3081 address = ALI_AC97_WRITE;
3083 mask = ALI_AC97_READ_ACTION | ALI_AC97_AUDIO_BUSY;
3085 mask |= ALI_AC97_SECONDARY;
3087 spin_lock_irqsave(&card->lock, flags);
3089 if (!acquirecodecaccess(card))
3090 printk(KERN_ERR "access codec fail\n");
3092 wcontrol = inw(TRID_REG(card, ALI_AC97_WRITE));
3094 wcontrol |= (0x8000 | reg);
3095 outw(wcontrol, TRID_REG(card, ALI_AC97_WRITE));
3097 data = (mask | (reg & AC97_REG_ADDR));
3099 if (!waitforstimertick(card)) {
3100 printk(KERN_ERR "ali_ac97_read: BIT_CLOCK is dead\n");
3109 if ((inw(TRID_REG(card, ALI_AC97_WRITE)) & ALI_AC97_BUSY_READ)
3114 if (ncount-- == 1) {
3115 pr_debug("ali_ac97_read :try clear busy flag\n");
3116 aud_reg = inl(TRID_REG(card, ALI_AC97_WRITE));
3117 outl((aud_reg & 0xffff7fff),
3118 TRID_REG(card, ALI_AC97_WRITE));
3123 data = inl(TRID_REG(card, address));
3125 spin_unlock_irqrestore(&card->lock, flags);
3127 return ((u16) (data >> 16));
3130 releasecodecaccess(card);
3131 spin_unlock_irqrestore(&card->lock, flags);
3132 printk(KERN_ERR "ali_ac97_read: AC97 CODEC read timed out.\n");
3136 /* Write AC97 codec registers for hulei*/
3138 ali_ac97_set(struct trident_card *card, int secondary, u8 reg, u16 val)
3140 unsigned int address, mask;
3141 unsigned int ncount;
3144 unsigned long flags;
3146 data = ((u32) val) << 16;
3151 address = ALI_AC97_WRITE;
3152 mask = ALI_AC97_WRITE_ACTION | ALI_AC97_AUDIO_BUSY;
3154 mask |= ALI_AC97_SECONDARY;
3155 if (card->revision == ALI_5451_V02)
3156 mask |= ALI_AC97_WRITE_MIXER_REGISTER;
3158 spin_lock_irqsave(&card->lock, flags);
3159 if (!acquirecodecaccess(card))
3160 printk(KERN_ERR "ali_ac97_write: access codec fail\n");
3162 wcontrol = inw(TRID_REG(card, ALI_AC97_WRITE));
3164 wcontrol |= (0x8100 | reg); /* bit 8=1: (ali1535 )reserved/ */
3165 /* ali1535+ write */
3166 outl((data | wcontrol), TRID_REG(card, ALI_AC97_WRITE));
3168 if (!waitforstimertick(card)) {
3169 printk(KERN_ERR "BIT_CLOCK is dead\n");
3175 wcontrol = inw(TRID_REG(card, ALI_AC97_WRITE));
3176 if (!(wcontrol & 0x8000))
3180 if (ncount-- == 1) {
3181 pr_debug("ali_ac97_set :try clear busy flag!!\n");
3182 outw(wcontrol & 0x7fff,
3183 TRID_REG(card, ALI_AC97_WRITE));
3189 releasecodecaccess(card);
3190 spin_unlock_irqrestore(&card->lock, flags);
3195 ali_enable_special_channel(struct trident_state *stat)
3197 struct trident_card *card = stat->card;
3198 unsigned long s_channels;
3200 s_channels = inl(TRID_REG(card, ALI_GLOBAL_CONTROL));
3201 s_channels |= (1 << stat->dmabuf.channel->num);
3202 outl(s_channels, TRID_REG(card, ALI_GLOBAL_CONTROL));
3206 ali_ac97_read(struct ac97_codec *codec, u8 reg)
3210 struct trident_card *card = NULL;
3212 /* Added by Matt Wu */
3216 card = (struct trident_card *) codec->private_data;
3218 if (!card->mixer_regs_ready)
3219 return ali_ac97_get(card, codec->id, reg);
3222 * FIXME: need to stop this caching some registers
3229 data = card->mixer_regs[reg / 2][id];
3234 ali_ac97_write(struct ac97_codec *codec, u8 reg, u16 val)
3237 struct trident_card *card;
3239 /* Added by Matt Wu */
3243 card = (struct trident_card *) codec->private_data;
3245 if (!card->mixer_regs_ready) {
3246 ali_ac97_set(card, codec->id, reg, val);
3255 card->mixer_regs[reg / 2][id] = val;
3256 ali_ac97_set(card, codec->id, reg, val);
3260 flag: ALI_SPDIF_OUT_TO_SPDIF_OUT
3261 ALI_PCM_TO_SPDIF_OUT
3265 ali_setup_spdif_out(struct trident_card *card, int flag)
3267 unsigned long spdif;
3271 struct pci_dev *pci_dev = NULL;
3273 pci_dev = pci_get_device(PCI_VENDOR_ID_AL, PCI_DEVICE_ID_AL_M1533,
3275 if (pci_dev == NULL)
3277 pci_read_config_byte(pci_dev, 0x61, &temp);
3279 pci_write_config_byte(pci_dev, 0x61, temp);
3280 pci_read_config_byte(pci_dev, 0x7d, &temp);
3282 pci_write_config_byte(pci_dev, 0x7d, temp);
3283 pci_read_config_byte(pci_dev, 0x7e, &temp);
3286 pci_write_config_byte(pci_dev, 0x7e, temp);
3288 pci_dev_put(pci_dev);
3290 ch = inb(TRID_REG(card, ALI_SCTRL));
3291 outb(ch | ALI_SPDIF_OUT_ENABLE, TRID_REG(card, ALI_SCTRL));
3292 ch = inb(TRID_REG(card, ALI_SPDIF_CTRL));
3293 outb(ch & ALI_SPDIF_OUT_CH_STATUS, TRID_REG(card, ALI_SPDIF_CTRL));
3295 if (flag & ALI_SPDIF_OUT_TO_SPDIF_OUT) {
3296 spdif = inw(TRID_REG(card, ALI_GLOBAL_CONTROL));
3297 spdif |= ALI_SPDIF_OUT_CH_ENABLE;
3298 spdif &= ALI_SPDIF_OUT_SEL_SPDIF;
3299 outw(spdif, TRID_REG(card, ALI_GLOBAL_CONTROL));
3300 spdif = inw(TRID_REG(card, ALI_SPDIF_CS));
3301 if (flag & ALI_SPDIF_OUT_NON_PCM)
3305 outw(spdif, TRID_REG(card, ALI_SPDIF_CS));
3307 spdif = inw(TRID_REG(card, ALI_GLOBAL_CONTROL));
3308 spdif |= ALI_SPDIF_OUT_SEL_PCM;
3309 outw(spdif, TRID_REG(card, ALI_GLOBAL_CONTROL));
3314 ali_disable_special_channel(struct trident_card *card, int ch)
3318 sc = inl(TRID_REG(card, ALI_GLOBAL_CONTROL));
3320 outl(sc, TRID_REG(card, ALI_GLOBAL_CONTROL));
3324 ali_disable_spdif_in(struct trident_card *card)
3326 unsigned long spdif;
3328 spdif = inl(TRID_REG(card, ALI_GLOBAL_CONTROL));
3329 spdif &= (~ALI_SPDIF_IN_SUPPORT);
3330 outl(spdif, TRID_REG(card, ALI_GLOBAL_CONTROL));
3332 ali_disable_special_channel(card, ALI_SPDIF_IN_CHANNEL);
3336 ali_setup_spdif_in(struct trident_card *card)
3338 unsigned long spdif;
3340 //Set SPDIF IN Supported
3341 spdif = inl(TRID_REG(card, ALI_GLOBAL_CONTROL));
3342 spdif |= ALI_SPDIF_IN_SUPPORT;
3343 outl(spdif, TRID_REG(card, ALI_GLOBAL_CONTROL));
3346 spdif = inl(TRID_REG(card, ALI_GLOBAL_CONTROL));
3347 spdif |= ALI_SPDIF_IN_CH_ENABLE;
3348 outl(spdif, TRID_REG(card, ALI_GLOBAL_CONTROL));
3350 spdif = inb(TRID_REG(card, ALI_SPDIF_CTRL));
3351 spdif |= ALI_SPDIF_IN_CH_STATUS;
3352 outb(spdif, TRID_REG(card, ALI_SPDIF_CTRL));
3354 spdif = inb(TRID_REG(card, ALI_SPDIF_CTRL));
3355 spdif |= ALI_SPDIF_IN_FUNC_ENABLE;
3356 outb(spdif, TRID_REG(card, ALI_SPDIF_CTRL));
3361 ali_delay(struct trident_card *card, int interval)
3363 unsigned long begintimer, currenttimer;
3365 begintimer = inl(TRID_REG(card, ALI_STIMER));
3366 currenttimer = inl(TRID_REG(card, ALI_STIMER));
3368 while (currenttimer < begintimer + interval)
3369 currenttimer = inl(TRID_REG(card, ALI_STIMER));
3373 ali_detect_spdif_rate(struct trident_card *card)
3377 u8 bval = 0, R1 = 0, R2 = 0;
3379 bval = inb(TRID_REG(card, ALI_SPDIF_CTRL));
3381 outb(bval, TRID_REG(card, ALI_SPDIF_CTRL));
3383 bval = inb(TRID_REG(card, ALI_SPDIF_CTRL + 1));
3385 outb(bval, TRID_REG(card, ALI_SPDIF_CTRL + 1));
3387 while (((R1 < 0x0B) || (R1 > 0x0E)) && (R1 != 0x12) &&
3393 bval = inb(TRID_REG(card, ALI_SPDIF_CTRL + 1));
3397 if (count > 50000) {
3398 printk(KERN_WARNING "trident: Error in "
3399 "ali_detect_spdif_rate!\n");
3405 while (count <= 50000) {
3410 bval = inb(TRID_REG(card, ALI_SPDIF_CTRL + 1));
3419 if (count > 50000) {
3420 printk(KERN_WARNING "trident: Error in "
3421 "ali_detect_spdif_rate!\n");
3430 wval = inw(TRID_REG(card, ALI_SPDIF_CTRL + 2));
3432 wval |= (u16) 0x09 << 8 | (u16) 0x05;
3433 outw(wval, TRID_REG(card, ALI_SPDIF_CTRL + 2));
3435 bval = inb(TRID_REG(card, ALI_SPDIF_CS + 3)) & 0xF0;
3436 outb(bval | 0x02, TRID_REG(card, ALI_SPDIF_CS + 3));
3440 wval = inw(TRID_REG(card, ALI_SPDIF_CTRL + 2));
3442 wval |= (u16) 0x0E << 8 | (u16) 0x08;
3443 outw(wval, TRID_REG(card, ALI_SPDIF_CTRL + 2));
3445 bval = inb(TRID_REG(card, ALI_SPDIF_CS + 3)) & 0xF0;
3446 outb(bval | 0x03, TRID_REG(card, ALI_SPDIF_CS + 3));
3456 ali_get_spdif_in_rate(struct trident_card *card)
3461 ali_detect_spdif_rate(card);
3463 bval = inb(TRID_REG(card, ALI_SPDIF_CTRL));
3466 outb(bval, TRID_REG(card, ALI_SPDIF_CTRL));
3468 bval = inb(TRID_REG(card, ALI_SPDIF_CS + 3));
3491 ali_close_multi_channels(void)
3494 struct pci_dev *pci_dev = NULL;
3496 pci_dev = pci_get_device(PCI_VENDOR_ID_AL, PCI_DEVICE_ID_AL_M1533,
3498 if (pci_dev == NULL)
3501 pci_read_config_byte(pci_dev, 0x59, &temp);
3503 pci_write_config_byte(pci_dev, 0x59, temp);
3505 pci_dev_put(pci_dev);
3507 pci_dev = pci_get_device(PCI_VENDOR_ID_AL, PCI_DEVICE_ID_AL_M7101,
3509 if (pci_dev == NULL)
3512 pci_read_config_byte(pci_dev, 0xB8, &temp);
3514 pci_write_config_byte(pci_dev, 0xB8, temp);
3516 pci_dev_put(pci_dev);
3522 ali_setup_multi_channels(struct trident_card *card, int chan_nums)
3524 unsigned long dwValue;
3526 struct pci_dev *pci_dev = NULL;
3528 pci_dev = pci_get_device(PCI_VENDOR_ID_AL, PCI_DEVICE_ID_AL_M1533,
3530 if (pci_dev == NULL)
3532 pci_read_config_byte(pci_dev, 0x59, &temp);
3534 pci_write_config_byte(pci_dev, 0x59, temp);
3536 pci_dev_put(pci_dev);
3538 pci_dev = pci_get_device(PCI_VENDOR_ID_AL, PCI_DEVICE_ID_AL_M7101,
3540 if (pci_dev == NULL)
3542 pci_read_config_byte(pci_dev, (int) 0xB8, &temp);
3544 pci_write_config_byte(pci_dev, (int) 0xB8, (u8) temp);
3546 pci_dev_put(pci_dev);
3548 if (chan_nums == 6) {
3549 dwValue = inl(TRID_REG(card, ALI_SCTRL)) | 0x000f0000;
3550 outl(dwValue, TRID_REG(card, ALI_SCTRL));
3552 dwValue = inl(TRID_REG(card, ALI_SCTRL));
3553 if (dwValue & 0x2000000) {
3554 ali_ac97_write(card->ac97_codec[0], 0x02, 8080);
3555 ali_ac97_write(card->ac97_codec[0], 0x36, 0);
3556 ali_ac97_write(card->ac97_codec[0], 0x38, 0);
3558 * On a board with a single codec you won't get the
3559 * surround. On other boards configure it.
3561 if (card->ac97_codec[1] != NULL) {
3562 ali_ac97_write(card->ac97_codec[1], 0x36, 0);
3563 ali_ac97_write(card->ac97_codec[1], 0x38, 0);
3564 ali_ac97_write(card->ac97_codec[1], 0x02, 0x0606);
3565 ali_ac97_write(card->ac97_codec[1], 0x18, 0x0303);
3566 ali_ac97_write(card->ac97_codec[1], 0x74, 0x3);
3575 ali_free_pcm_channel(struct trident_card *card, unsigned int channel)
3582 bank = channel >> 5;
3583 channel = channel & 0x1f;
3585 card->banks[bank].bitmap &= ~(1 << (channel));
3589 ali_allocate_other_states_resources(struct trident_state *state, int chan_nums)
3591 struct trident_card *card = state->card;
3592 struct trident_state *s;
3593 int i, state_count = 0;
3594 struct trident_pcm_bank *bank;
3595 struct trident_channel *channel;
3598 bank = &card->banks[BANK_A];
3603 for (i = 0; (i < ALI_CHANNELS) && (state_count != 4); i++) {
3604 if (card->states[i])
3607 num = ali_multi_channels_5_1[state_count];
3608 if (!(bank->bitmap & (1 << num))) {
3609 bank->bitmap |= 1 << num;
3610 channel = &bank->channels[num];
3614 for (; state_count >= 0; state_count--) {
3615 kfree(state->other_states[state_count]);
3616 num = ali_multi_channels_5_1[state_count];
3617 ali_free_pcm_channel(card, num);
3621 s = card->states[i] = kmalloc(sizeof(*state), GFP_KERNEL);
3623 num = ali_multi_channels_5_1[state_count];
3624 ali_free_pcm_channel(card, num);
3626 for (; state_count >= 0; state_count--) {
3627 num = ali_multi_channels_5_1[state_count];
3628 ali_free_pcm_channel(card, num);
3629 kfree(state->other_states[state_count]);
3633 memset(s, 0, sizeof(*state));
3635 s->dmabuf.channel = channel;
3636 s->dmabuf.ossfragshift = s->dmabuf.ossmaxfrags =
3637 s->dmabuf.subdivision = 0;
3638 init_waitqueue_head(&s->dmabuf.wait);
3639 s->magic = card->magic;
3642 ali_enable_special_channel(s);
3643 state->other_states[state_count++] = s;
3646 if (state_count != 4) {
3648 for (; state_count >= 0; state_count--) {
3649 kfree(state->other_states[state_count]);
3650 num = ali_multi_channels_5_1[state_count];
3651 ali_free_pcm_channel(card, num);
3659 /* save registers for ALi Power Management */
3660 static struct ali_saved_registers {
3661 unsigned long global_regs[ALI_GLOBAL_REGS];
3662 unsigned long channel_regs[ALI_CHANNELS][ALI_CHANNEL_REGS];
3663 unsigned mixer_regs[ALI_MIXER_REGS];
3667 ali_save_regs(struct trident_card *card)
3669 unsigned long flags;
3672 spin_lock_irqsave(&card->lock, flags);
3674 ali_registers.global_regs[0x2c] = inl(TRID_REG(card, T4D_MISCINT));
3675 //ali_registers.global_regs[0x20] = inl(TRID_REG(card,T4D_START_A));
3676 ali_registers.global_regs[0x21] = inl(TRID_REG(card, T4D_STOP_A));
3678 //disable all IRQ bits
3679 outl(ALI_DISABLE_ALL_IRQ, TRID_REG(card, T4D_MISCINT));
3681 for (i = 1; i < ALI_MIXER_REGS; i++)
3682 ali_registers.mixer_regs[i] = ali_ac97_read(card->ac97_codec[0],
3685 for (i = 0; i < ALI_GLOBAL_REGS; i++) {
3686 if ((i * 4 == T4D_MISCINT) || (i * 4 == T4D_STOP_A))
3688 ali_registers.global_regs[i] = inl(TRID_REG(card, i * 4));
3691 for (i = 0; i < ALI_CHANNELS; i++) {
3692 outb(i, TRID_REG(card, T4D_LFO_GC_CIR));
3693 for (j = 0; j < ALI_CHANNEL_REGS; j++)
3694 ali_registers.channel_regs[i][j] = inl(TRID_REG(card,
3698 //Stop all HW channel
3699 outl(ALI_STOP_ALL_CHANNELS, TRID_REG(card, T4D_STOP_A));
3701 spin_unlock_irqrestore(&card->lock, flags);
3705 ali_restore_regs(struct trident_card *card)
3707 unsigned long flags;
3710 spin_lock_irqsave(&card->lock, flags);
3712 for (i = 1; i < ALI_MIXER_REGS; i++)
3713 ali_ac97_write(card->ac97_codec[0], i * 2,
3714 ali_registers.mixer_regs[i]);
3716 for (i = 0; i < ALI_CHANNELS; i++) {
3717 outb(i, TRID_REG(card, T4D_LFO_GC_CIR));
3718 for (j = 0; j < ALI_CHANNEL_REGS; j++)
3719 outl(ali_registers.channel_regs[i][j],
3720 TRID_REG(card, j * 4 + 0xe0));
3723 for (i = 0; i < ALI_GLOBAL_REGS; i++) {
3724 if ((i * 4 == T4D_MISCINT) || (i * 4 == T4D_STOP_A) ||
3725 (i * 4 == T4D_START_A))
3727 outl(ali_registers.global_regs[i], TRID_REG(card, i * 4));
3731 outl(ali_registers.global_regs[0x20], TRID_REG(card, T4D_START_A));
3732 //restore IRQ enable bits
3733 outl(ali_registers.global_regs[0x2c], TRID_REG(card, T4D_MISCINT));
3735 spin_unlock_irqrestore(&card->lock, flags);
3739 trident_suspend(struct pci_dev *dev, pm_message_t unused)
3741 struct trident_card *card = pci_get_drvdata(dev);
3743 if (card->pci_id == PCI_DEVICE_ID_ALI_5451) {
3744 ali_save_regs(card);
3750 trident_resume(struct pci_dev *dev)
3752 struct trident_card *card = pci_get_drvdata(dev);
3754 if (card->pci_id == PCI_DEVICE_ID_ALI_5451) {
3755 ali_restore_regs(card);
3761 static struct trident_channel *
3762 ali_alloc_pcm_channel(struct trident_card *card)
3764 struct trident_pcm_bank *bank;
3767 bank = &card->banks[BANK_A];
3769 if (inl(TRID_REG(card, ALI_GLOBAL_CONTROL)) &
3770 (ALI_SPDIF_OUT_CH_ENABLE)) {
3771 idx = ALI_SPDIF_OUT_CHANNEL;
3772 if (!(bank->bitmap & (1 << idx))) {
3773 struct trident_channel *channel = &bank->channels[idx];
3774 bank->bitmap |= 1 << idx;
3780 for (idx = ALI_PCM_OUT_CHANNEL_FIRST; idx <= ALI_PCM_OUT_CHANNEL_LAST;
3782 if (!(bank->bitmap & (1 << idx))) {
3783 struct trident_channel *channel = &bank->channels[idx];
3784 bank->bitmap |= 1 << idx;
3790 /* no more free channels avaliable */
3792 printk(KERN_ERR "ali: no more channels available on Bank A.\n");
3797 static struct trident_channel *
3798 ali_alloc_rec_pcm_channel(struct trident_card *card)
3800 struct trident_pcm_bank *bank;
3803 if (inl(TRID_REG(card, ALI_GLOBAL_CONTROL)) & ALI_SPDIF_IN_SUPPORT)
3804 idx = ALI_SPDIF_IN_CHANNEL;
3806 idx = ALI_PCM_IN_CHANNEL;
3808 bank = &card->banks[BANK_A];
3810 if (!(bank->bitmap & (1 << idx))) {
3811 struct trident_channel *channel = &bank->channels[idx];
3812 bank->bitmap |= 1 << idx;
3817 /* no free recordable channels avaliable */
3819 printk(KERN_ERR "ali: no recordable channels available on Bank A.\n");
3825 ali_set_spdif_out_rate(struct trident_card *card, unsigned int rate)
3827 unsigned char ch_st_sel;
3828 unsigned short status_rate;
3835 status_rate = 0x300;
3839 status_rate = 0x200;
3843 /* select spdif_out */
3844 ch_st_sel = inb(TRID_REG(card, ALI_SPDIF_CTRL)) & ALI_SPDIF_OUT_CH_STATUS;
3846 ch_st_sel |= 0x80; /* select right */
3847 outb(ch_st_sel, TRID_REG(card, ALI_SPDIF_CTRL));
3848 outb(status_rate | 0x20, TRID_REG(card, ALI_SPDIF_CS + 2));
3850 ch_st_sel &= (~0x80); /* select left */
3851 outb(ch_st_sel, TRID_REG(card, ALI_SPDIF_CTRL));
3852 outw(status_rate | 0x10, TRID_REG(card, ALI_SPDIF_CS + 2));
3856 ali_address_interrupt(struct trident_card *card)
3859 struct trident_state *state;
3860 u32 mask, channel_mask;
3862 mask = trident_get_interrupt_mask(card, 0);
3863 for (i = 0; i < NR_HW_CH; i++) {
3864 if ((state = card->states[i]) == NULL)
3866 channel = state->dmabuf.channel->num;
3867 if ((channel_mask = 1 << channel) & mask) {
3868 mask &= ~channel_mask;
3869 trident_ack_channel_interrupt(card, channel);
3871 state->dmabuf.update_flag |= ALI_ADDRESS_INT_UPDATE;
3872 trident_update_ptr(state);
3876 for (i = 0; i < NR_HW_CH; i++) {
3877 if (mask & (1 << i)) {
3878 printk("ali: spurious channel irq %d.\n", i);
3879 trident_ack_channel_interrupt(card, i);
3880 trident_stop_voice(card, i);
3881 trident_disable_voice_irq(card, i);
3887 /* Updating the values of counters of other_states' DMAs without lock
3888 protection is no harm because all DMAs of multi-channels and interrupt
3889 depend on a master state's DMA, and changing the counters of the master
3890 state DMA is protected by a spinlock.
3893 ali_write_5_1(struct trident_state *state, const char __user *buf,
3894 int cnt_for_multi_channel, unsigned int *copy_count,
3895 unsigned int *state_cnt)
3898 struct dmabuf *dmabuf = &state->dmabuf;
3899 struct dmabuf *dmabuf_temp;
3900 const char __user *buffer = buf;
3901 unsigned swptr, other_dma_nums, sample_s;
3902 unsigned int i, loop;
3905 sample_s = sample_size[dmabuf->fmt] >> 1;
3906 swptr = dmabuf->swptr;
3908 if ((i = state->multi_channels_adjust_count) > 0) {
3910 if (copy_from_user(dmabuf->rawbuf + swptr,
3913 seek_offset(swptr, buffer, cnt_for_multi_channel,
3914 sample_s, *copy_count);
3916 (*state_cnt) += sample_s;
3917 state->multi_channels_adjust_count++;
3919 i = i - (state->chans_num - other_dma_nums);
3920 for (; (i < other_dma_nums) && (cnt_for_multi_channel > 0); i++) {
3921 dmabuf_temp = &state->other_states[i]->dmabuf;
3922 if (copy_from_user(dmabuf_temp->rawbuf + dmabuf_temp->swptr,
3925 seek_offset(dmabuf_temp->swptr, buffer, cnt_for_multi_channel,
3926 sample_s, *copy_count);
3928 if (cnt_for_multi_channel == 0)
3929 state->multi_channels_adjust_count += i;
3931 if (cnt_for_multi_channel > 0) {
3932 loop = cnt_for_multi_channel / (state->chans_num * sample_s);
3933 for (i = 0; i < loop; i++) {
3934 if (copy_from_user(dmabuf->rawbuf + swptr, buffer,
3937 seek_offset(swptr, buffer, cnt_for_multi_channel,
3938 sample_s * 2, *copy_count);
3939 (*state_cnt) += (sample_s * 2);
3941 dmabuf_temp = &state->other_states[0]->dmabuf;
3942 if (copy_from_user(dmabuf_temp->rawbuf + dmabuf_temp->swptr,
3945 seek_offset(dmabuf_temp->swptr, buffer, cnt_for_multi_channel,
3946 sample_s, *copy_count);
3948 dmabuf_temp = &state->other_states[1]->dmabuf;
3949 if (copy_from_user(dmabuf_temp->rawbuf + dmabuf_temp->swptr,
3952 seek_offset(dmabuf_temp->swptr, buffer, cnt_for_multi_channel,
3953 sample_s, *copy_count);
3955 dmabuf_temp = &state->other_states[2]->dmabuf;
3956 if (copy_from_user(dmabuf_temp->rawbuf + dmabuf_temp->swptr,
3959 seek_offset(dmabuf_temp->swptr, buffer, cnt_for_multi_channel,
3960 sample_s, *copy_count);
3962 dmabuf_temp = &state->other_states[3]->dmabuf;
3963 if (copy_from_user(dmabuf_temp->rawbuf + dmabuf_temp->swptr,
3966 seek_offset(dmabuf_temp->swptr, buffer, cnt_for_multi_channel,
3967 sample_s, *copy_count);
3970 if (cnt_for_multi_channel > 0) {
3971 state->multi_channels_adjust_count = cnt_for_multi_channel / sample_s;
3973 if (copy_from_user(dmabuf->rawbuf + swptr, buffer, sample_s))
3975 seek_offset(swptr, buffer, cnt_for_multi_channel,
3976 sample_s, *copy_count);
3977 (*state_cnt) += sample_s;
3979 if (cnt_for_multi_channel > 0) {
3980 if (copy_from_user(dmabuf->rawbuf + swptr,
3983 seek_offset(swptr, buffer, cnt_for_multi_channel,
3984 sample_s, *copy_count);
3985 (*state_cnt) += sample_s;
3987 if (cnt_for_multi_channel > 0) {
3988 int diff = state->chans_num - other_dma_nums;
3989 loop = state->multi_channels_adjust_count - diff;
3990 for (i = 0; i < loop; i++) {
3991 dmabuf_temp = &state->other_states[i]->dmabuf;
3992 if (copy_from_user(dmabuf_temp->rawbuf +
3996 seek_offset(dmabuf_temp->swptr, buffer,
3997 cnt_for_multi_channel,
3998 sample_s, *copy_count);
4003 state->multi_channels_adjust_count = 0;
4005 for (i = 0; i < other_dma_nums; i++) {
4006 dmabuf_temp = &state->other_states[i]->dmabuf;
4007 dmabuf_temp->swptr = dmabuf_temp->swptr % dmabuf_temp->dmasize;
4013 ali_free_other_states_resources(struct trident_state *state)
4016 struct trident_card *card = state->card;
4017 struct trident_state *s;
4018 unsigned other_states_count;
4020 other_states_count = state->chans_num - 2; /* except PCM L/R channels */
4021 for (i = 0; i < other_states_count; i++) {
4022 s = state->other_states[i];
4023 dealloc_dmabuf(&s->dmabuf, card->pci_dev);
4024 ali_disable_special_channel(s->card, s->dmabuf.channel->num);
4025 state->card->free_pcm_channel(s->card, s->dmabuf.channel->num);
4026 card->states[s->virt] = NULL;
4031 static struct proc_dir_entry *res;
4034 ali_write_proc(struct file *file, const char __user *buffer, unsigned long count, void *data)
4036 struct trident_card *card = (struct trident_card *) data;
4037 unsigned long flags;
4044 if (get_user(c, buffer))
4047 spin_lock_irqsave(&card->lock, flags);
4050 ali_setup_spdif_out(card, ALI_PCM_TO_SPDIF_OUT);
4051 ali_disable_special_channel(card, ALI_SPDIF_OUT_CHANNEL);
4054 ali_setup_spdif_out(card, ALI_SPDIF_OUT_TO_SPDIF_OUT |
4058 ali_setup_spdif_out(card, ALI_SPDIF_OUT_TO_SPDIF_OUT |
4059 ALI_SPDIF_OUT_NON_PCM);
4062 ali_disable_spdif_in(card); //default
4065 ali_setup_spdif_in(card);
4068 spin_unlock_irqrestore(&card->lock, flags);
4073 /* OSS /dev/mixer file operation methods */
4075 trident_open_mixdev(struct inode *inode, struct file *file)
4078 int minor = iminor(inode);
4079 struct trident_card *card = devs;
4081 for (card = devs; card != NULL; card = card->next)
4082 for (i = 0; i < NR_AC97; i++)
4083 if (card->ac97_codec[i] != NULL &&
4084 card->ac97_codec[i]->dev_mixer == minor)
4091 file->private_data = card->ac97_codec[i];
4093 return nonseekable_open(inode, file);
4097 trident_ioctl_mixdev(struct inode *inode, struct file *file, unsigned int cmd,
4100 struct ac97_codec *codec = (struct ac97_codec *) file->private_data;
4102 return codec->mixer_ioctl(codec, cmd, arg);
4105 static /*const */ struct file_operations trident_mixer_fops = {
4106 .owner = THIS_MODULE,
4107 .llseek = no_llseek,
4108 .ioctl = trident_ioctl_mixdev,
4109 .open = trident_open_mixdev,
4113 ali_reset_5451(struct trident_card *card)
4115 struct pci_dev *pci_dev = NULL;
4117 unsigned short wCount, wReg;
4119 pci_dev = pci_get_device(PCI_VENDOR_ID_AL, PCI_DEVICE_ID_AL_M1533,
4121 if (pci_dev == NULL)
4124 pci_read_config_dword(pci_dev, 0x7c, &dwVal);
4125 pci_write_config_dword(pci_dev, 0x7c, dwVal | 0x08000000);
4127 pci_read_config_dword(pci_dev, 0x7c, &dwVal);
4128 pci_write_config_dword(pci_dev, 0x7c, dwVal & 0xf7ffffff);
4130 pci_dev_put(pci_dev);
4132 pci_dev = card->pci_dev;
4133 if (pci_dev == NULL)
4136 pci_read_config_dword(pci_dev, 0x44, &dwVal);
4137 pci_write_config_dword(pci_dev, 0x44, dwVal | 0x000c0000);
4139 pci_read_config_dword(pci_dev, 0x44, &dwVal);
4140 pci_write_config_dword(pci_dev, 0x44, dwVal & 0xfffbffff);
4143 /* TODO: recognize if we have a PM capable codec and only do this */
4144 /* if the codec is PM capable */
4147 wReg = ali_ac97_get(card, 0, AC97_POWER_CONTROL);
4148 if ((wReg & 0x000f) == 0x000f)
4152 /* This is non fatal if you have a non PM capable codec.. */
4156 /* AC97 codec initialisation. */
4157 static int __devinit
4158 trident_ac97_init(struct trident_card *card)
4161 unsigned long ready_2nd = 0;
4162 struct ac97_codec *codec;
4165 /* initialize controller side of AC link, and find out if secondary codes
4167 switch (card->pci_id) {
4168 case PCI_DEVICE_ID_ALI_5451:
4169 if (ali_reset_5451(card)) {
4170 printk(KERN_ERR "trident_ac97_init: error "
4171 "resetting 5451.\n");
4174 outl(0x80000001, TRID_REG(card, ALI_GLOBAL_CONTROL));
4175 outl(0x00000000, TRID_REG(card, T4D_AINTEN_A));
4176 outl(0xffffffff, TRID_REG(card, T4D_AINT_A));
4177 outl(0x00000000, TRID_REG(card, T4D_MUSICVOL_WAVEVOL));
4178 outb(0x10, TRID_REG(card, ALI_MPUR2));
4179 ready_2nd = inl(TRID_REG(card, ALI_SCTRL));
4180 ready_2nd &= 0x3fff;
4181 outl(ready_2nd | PCMOUT | 0x8000, TRID_REG(card, ALI_SCTRL));
4182 ready_2nd = inl(TRID_REG(card, ALI_SCTRL));
4183 ready_2nd &= SI_AC97_SECONDARY_READY;
4184 if (card->revision < ALI_5451_V02)
4187 case PCI_DEVICE_ID_SI_7018:
4188 /* disable AC97 GPIO interrupt */
4189 outl(0x00, TRID_REG(card, SI_AC97_GPIO));
4190 /* when power up the AC link is in cold reset mode so stop it */
4191 outl(PCMOUT | SURROUT | CENTEROUT | LFEOUT | SECONDARY_ID,
4192 TRID_REG(card, SI_SERIAL_INTF_CTRL));
4193 /* it take a long time to recover from a cold reset */
4194 /* (especially when you have more than one codec) */
4196 ready_2nd = inl(TRID_REG(card, SI_SERIAL_INTF_CTRL));
4197 ready_2nd &= SI_AC97_SECONDARY_READY;
4199 case PCI_DEVICE_ID_TRIDENT_4DWAVE_DX:
4201 outl(DX_AC97_PLAYBACK, TRID_REG(card, DX_ACR2_AC97_COM_STAT));
4203 case PCI_DEVICE_ID_TRIDENT_4DWAVE_NX:
4204 /* enable AC97 Output Slot 3,4 (PCM Left/Right Playback) */
4205 outl(NX_AC97_PCM_OUTPUT, TRID_REG(card, NX_ACR0_AC97_COM_STAT));
4206 ready_2nd = inl(TRID_REG(card, NX_ACR0_AC97_COM_STAT));
4207 ready_2nd &= NX_AC97_SECONDARY_READY;
4209 case PCI_DEVICE_ID_INTERG_5050:
4210 /* disable AC97 GPIO interrupt */
4211 outl(0x00, TRID_REG(card, SI_AC97_GPIO));
4212 /* when power up, the AC link is in cold reset mode, so stop it */
4213 outl(PCMOUT | SURROUT | CENTEROUT | LFEOUT,
4214 TRID_REG(card, SI_SERIAL_INTF_CTRL));
4215 /* it take a long time to recover from a cold reset (especially */
4216 /* when you have more than one codec) */
4218 ready_2nd = inl(TRID_REG(card, SI_SERIAL_INTF_CTRL));
4219 ready_2nd &= SI_AC97_SECONDARY_READY;
4223 for (num_ac97 = 0; num_ac97 < NR_AC97; num_ac97++) {
4224 if ((codec = ac97_alloc_codec()) == NULL)
4227 /* initialize some basic codec information, other fields */
4228 /* will be filled in ac97_probe_codec */
4229 codec->private_data = card;
4230 codec->id = num_ac97;
4232 if (card->pci_id == PCI_DEVICE_ID_ALI_5451) {
4233 codec->codec_read = ali_ac97_read;
4234 codec->codec_write = ali_ac97_write;
4236 codec->codec_read = trident_ac97_get;
4237 codec->codec_write = trident_ac97_set;
4240 if (ac97_probe_codec(codec) == 0)
4243 codec->dev_mixer = register_sound_mixer(&trident_mixer_fops, -1);
4244 if (codec->dev_mixer < 0) {
4245 printk(KERN_ERR "trident: couldn't register mixer!\n");
4246 ac97_release_codec(codec);
4250 card->ac97_codec[num_ac97] = codec;
4252 /* if there is no secondary codec at all, don't probe any more */
4257 if (card->pci_id == PCI_DEVICE_ID_ALI_5451) {
4258 for (num_ac97 = 0; num_ac97 < NR_AC97; num_ac97++) {
4259 if (card->ac97_codec[num_ac97] == NULL)
4261 for (i = 0; i < 64; i++) {
4262 u16 reg = ali_ac97_get(card, num_ac97, i * 2);
4263 card->mixer_regs[i][num_ac97] = reg;
4267 return num_ac97 + 1;
4270 #ifdef SUPPORT_JOYSTICK
4271 /* Gameport functions for the cards ADC gameport */
4273 static unsigned char trident_game_read(struct gameport *gameport)
4275 struct trident_card *card = gameport->port_data;
4277 return inb(TRID_REG(card, T4D_GAME_LEG));
4280 static void trident_game_trigger(struct gameport *gameport)
4282 struct trident_card *card = gameport->port_data;
4284 outb(0xff, TRID_REG(card, T4D_GAME_LEG));
4287 static int trident_game_cooked_read(struct gameport *gameport,
4288 int *axes, int *buttons)
4290 struct trident_card *card = gameport->port_data;
4293 *buttons = (~inb(TRID_REG(card, T4D_GAME_LEG)) >> 4) & 0xf;
4295 for (i = 0; i < 4; i++) {
4296 axes[i] = inw(TRID_REG(card, T4D_GAME_AXD) + i * sizeof (u16));
4297 if (axes[i] == 0xffff)
4304 static int trident_game_open(struct gameport *gameport, int mode)
4306 struct trident_card *card = gameport->port_data;
4309 case GAMEPORT_MODE_COOKED:
4310 outb(0x80, TRID_REG(card, T4D_GAME_CR));
4313 case GAMEPORT_MODE_RAW:
4314 outb(0x00, TRID_REG(card, T4D_GAME_CR));
4323 static int __devinit trident_register_gameport(struct trident_card *card)
4325 struct gameport *gp;
4327 card->gameport = gp = gameport_allocate_port();
4329 printk(KERN_ERR "trident: can not allocate memory for gameport\n");
4333 gameport_set_name(gp, "Trident 4DWave");
4334 gameport_set_phys(gp, "pci%s/gameport0", pci_name(card->pci_dev));
4335 gp->read = trident_game_read;
4336 gp->trigger = trident_game_trigger;
4337 gp->cooked_read = trident_game_cooked_read;
4338 gp->open = trident_game_open;
4340 gp->port_data = card;
4342 gameport_register_port(gp);
4347 static inline void trident_unregister_gameport(struct trident_card *card)
4350 gameport_unregister_port(card->gameport);
4354 static inline int trident_register_gameport(struct trident_card *card) { return -ENOSYS; }
4355 static inline void trident_unregister_gameport(struct trident_card *card) { }
4356 #endif /* SUPPORT_JOYSTICK */
4358 /* install the driver, we do not allocate hardware channel nor DMA buffer */
4359 /* now, they are defered until "ACCESS" time (in prog_dmabuf called by */
4360 /* open/read/write/ioctl/mmap) */
4361 static int __devinit
4362 trident_probe(struct pci_dev *pci_dev, const struct pci_device_id *pci_id)
4364 unsigned long iobase;
4365 struct trident_card *card;
4370 struct pci_dev *pci_dev_m1533 = NULL;
4374 if (pci_enable_device(pci_dev))
4377 if (pci_dev->device == PCI_DEVICE_ID_ALI_5451)
4378 dma_mask = ALI_DMA_MASK;
4380 dma_mask = TRIDENT_DMA_MASK;
4381 if (pci_set_dma_mask(pci_dev, dma_mask)) {
4382 printk(KERN_ERR "trident: architecture does not support"
4383 " %s PCI busmaster DMA\n",
4384 pci_dev->device == PCI_DEVICE_ID_ALI_5451 ?
4385 "32-bit" : "30-bit");
4388 pci_read_config_byte(pci_dev, PCI_CLASS_REVISION, &revision);
4390 if (pci_id->device == PCI_DEVICE_ID_INTERG_5050)
4391 iobase = pci_resource_start(pci_dev, 1);
4393 iobase = pci_resource_start(pci_dev, 0);
4395 if (!request_region(iobase, 256, card_names[pci_id->driver_data])) {
4396 printk(KERN_ERR "trident: can't allocate I/O space at "
4397 "0x%4.4lx\n", iobase);
4402 if ((card = kmalloc(sizeof(*card), GFP_KERNEL)) == NULL) {
4403 printk(KERN_ERR "trident: out of memory\n");
4404 goto out_release_region;
4406 memset(card, 0, sizeof (*card));
4408 init_timer(&card->timer);
4409 card->iobase = iobase;
4410 card->pci_dev = pci_dev_get(pci_dev);
4411 card->pci_id = pci_id->device;
4412 card->revision = revision;
4413 card->irq = pci_dev->irq;
4415 card->magic = TRIDENT_CARD_MAGIC;
4416 card->banks[BANK_A].addresses = &bank_a_addrs;
4417 card->banks[BANK_A].bitmap = 0UL;
4418 card->banks[BANK_B].addresses = &bank_b_addrs;
4419 card->banks[BANK_B].bitmap = 0UL;
4421 mutex_init(&card->open_mutex);
4422 spin_lock_init(&card->lock);
4423 init_timer(&card->timer);
4427 pci_set_master(pci_dev);
4429 printk(KERN_INFO "trident: %s found at IO 0x%04lx, IRQ %d\n",
4430 card_names[pci_id->driver_data], card->iobase, card->irq);
4432 if (card->pci_id == PCI_DEVICE_ID_ALI_5451) {
4433 /* ALi channel Management */
4434 card->alloc_pcm_channel = ali_alloc_pcm_channel;
4435 card->alloc_rec_pcm_channel = ali_alloc_rec_pcm_channel;
4436 card->free_pcm_channel = ali_free_pcm_channel;
4438 card->address_interrupt = ali_address_interrupt;
4440 /* Added by Matt Wu 01-05-2001 for spdif in */
4441 card->multi_channel_use_count = 0;
4442 card->rec_channel_use_count = 0;
4444 /* ALi SPDIF OUT function */
4445 if (card->revision == ALI_5451_V02) {
4446 ali_setup_spdif_out(card, ALI_PCM_TO_SPDIF_OUT);
4447 res = create_proc_entry("ALi5451", 0, NULL);
4449 res->write_proc = ali_write_proc;
4454 /* Add H/W Volume Control By Matt Wu Jul. 06, 2001 */
4456 pci_dev_m1533 = pci_find_device(PCI_VENDOR_ID_AL,
4457 PCI_DEVICE_ID_AL_M1533,
4460 if (pci_dev_m1533 == NULL)
4462 pci_read_config_byte(pci_dev_m1533, 0x63, &bits);
4463 if (bits & (1 << 5))
4465 if (card->hwvolctl) {
4466 /* Clear m1533 pci cfg 78h bit 30 to zero, which makes
4467 GPIO11/12/13 work as ACGP_UP/DOWN/MUTE. */
4468 pci_read_config_byte(pci_dev_m1533, 0x7b, &bits);
4469 bits &= 0xbf; /*clear bit 6 */
4470 pci_write_config_byte(pci_dev_m1533, 0x7b, bits);
4472 } else if (card->pci_id == PCI_DEVICE_ID_INTERG_5050) {
4473 card->alloc_pcm_channel = cyber_alloc_pcm_channel;
4474 card->alloc_rec_pcm_channel = cyber_alloc_pcm_channel;
4475 card->free_pcm_channel = cyber_free_pcm_channel;
4476 card->address_interrupt = cyber_address_interrupt;
4477 cyber_init_ritual(card);
4479 card->alloc_pcm_channel = trident_alloc_pcm_channel;
4480 card->alloc_rec_pcm_channel = trident_alloc_pcm_channel;
4481 card->free_pcm_channel = trident_free_pcm_channel;
4482 card->address_interrupt = trident_address_interrupt;
4487 if (request_irq(card->irq, &trident_interrupt, IRQF_SHARED,
4488 card_names[pci_id->driver_data], card)) {
4489 printk(KERN_ERR "trident: unable to allocate irq %d\n",
4493 /* register /dev/dsp */
4494 if ((card->dev_audio = register_sound_dsp(&trident_audio_fops, -1)) < 0) {
4495 printk(KERN_ERR "trident: couldn't register DSP device!\n");
4498 card->mixer_regs_ready = 0;
4499 /* initialize AC97 codec and register /dev/mixer */
4500 if (trident_ac97_init(card) <= 0) {
4501 /* unregister audio devices */
4502 for (i = 0; i < NR_AC97; i++) {
4503 if (card->ac97_codec[i] != NULL) {
4504 struct ac97_codec* codec = card->ac97_codec[i];
4505 unregister_sound_mixer(codec->dev_mixer);
4506 ac97_release_codec(codec);
4509 goto out_unregister_sound_dsp;
4511 card->mixer_regs_ready = 1;
4512 outl(0x00, TRID_REG(card, T4D_MUSICVOL_WAVEVOL));
4514 if (card->pci_id == PCI_DEVICE_ID_ALI_5451) {
4515 /* Add H/W Volume Control By Matt Wu Jul. 06, 2001 */
4516 if (card->hwvolctl) {
4517 /* Enable GPIO IRQ (MISCINT bit 18h) */
4518 temp = inw(TRID_REG(card, T4D_MISCINT + 2));
4520 outw(temp, TRID_REG(card, T4D_MISCINT + 2));
4522 /* Enable H/W Volume Control GLOVAL CONTROL bit 0 */
4523 temp = inw(TRID_REG(card, ALI_GLOBAL_CONTROL));
4525 outw(temp, TRID_REG(card, ALI_GLOBAL_CONTROL));
4528 if (card->revision == ALI_5451_V02)
4529 ali_close_multi_channels();
4530 /* edited by HMSEO for GT sound */
4531 #if defined(CONFIG_ALPHA_NAUTILUS) || defined(CONFIG_ALPHA_GENERIC)
4534 extern struct hwrpb_struct *hwrpb;
4536 if ((hwrpb->sys_type) == 201) {
4537 printk(KERN_INFO "trident: Running on Alpha system "
4539 ac97_data = ali_ac97_get(card, 0, AC97_POWER_CONTROL);
4540 ali_ac97_set(card, 0, AC97_POWER_CONTROL,
4541 ac97_data | ALI_EAPD_POWER_DOWN);
4544 #endif /* CONFIG_ALPHA_NAUTILUS || CONFIG_ALPHA_GENERIC */
4545 /* edited by HMSEO for GT sound */
4548 pci_set_drvdata(pci_dev, card);
4550 /* Enable Address Engine Interrupts */
4551 trident_enable_loop_interrupts(card);
4553 /* Register gameport */
4554 trident_register_gameport(card);
4559 out_unregister_sound_dsp:
4560 unregister_sound_dsp(card->dev_audio);
4562 free_irq(card->irq, card);
4564 pci_dev_put(card->pci_dev);
4566 remove_proc_entry("ALi5451", NULL);
4572 release_region(iobase, 256);
4576 static void __devexit
4577 trident_remove(struct pci_dev *pci_dev)
4580 struct trident_card *card = pci_get_drvdata(pci_dev);
4583 * Kill running timers before unload. We can't have them
4584 * going off after rmmod!
4587 del_timer_sync(&card->timer);
4589 /* ALi S/PDIF and Power Management */
4590 if (card->pci_id == PCI_DEVICE_ID_ALI_5451) {
4591 ali_setup_spdif_out(card, ALI_PCM_TO_SPDIF_OUT);
4592 ali_disable_special_channel(card, ALI_SPDIF_OUT_CHANNEL);
4593 ali_disable_spdif_in(card);
4594 remove_proc_entry("ALi5451", NULL);
4597 /* Unregister gameport */
4598 trident_unregister_gameport(card);
4600 /* Kill interrupts, and SP/DIF */
4601 trident_disable_loop_interrupts(card);
4603 /* free hardware resources */
4604 free_irq(card->irq, card);
4605 release_region(card->iobase, 256);
4607 /* unregister audio devices */
4608 for (i = 0; i < NR_AC97; i++)
4609 if (card->ac97_codec[i] != NULL) {
4610 unregister_sound_mixer(card->ac97_codec[i]->dev_mixer);
4611 ac97_release_codec(card->ac97_codec[i]);
4613 unregister_sound_dsp(card->dev_audio);
4615 pci_set_drvdata(pci_dev, NULL);
4616 pci_dev_put(card->pci_dev);
4620 MODULE_AUTHOR("Alan Cox, Aaron Holtzman, Ollie Lho, Ching Ling Lee, Muli Ben-Yehuda");
4621 MODULE_DESCRIPTION("Trident 4DWave/SiS 7018/ALi 5451 and Tvia/IGST CyberPro5050 PCI "
4623 MODULE_LICENSE("GPL");
4625 #define TRIDENT_MODULE_NAME "trident"
4627 static struct pci_driver trident_pci_driver = {
4628 .name = TRIDENT_MODULE_NAME,
4629 .id_table = trident_pci_tbl,
4630 .probe = trident_probe,
4631 .remove = __devexit_p(trident_remove),
4633 .suspend = trident_suspend,
4634 .resume = trident_resume
4639 trident_init_module(void)
4641 printk(KERN_INFO "Trident 4DWave/SiS 7018/ALi 5451,Tvia CyberPro "
4642 "5050 PCI Audio, version " DRIVER_VERSION ", " __TIME__ " "
4645 return pci_register_driver(&trident_pci_driver);
4649 trident_cleanup_module(void)
4651 pci_unregister_driver(&trident_pci_driver);
4654 module_init(trident_init_module);
4655 module_exit(trident_cleanup_module);