[PATCH] i2o: block IO errors on i2o disk
[linux-2.6/linux-acpi-2.6/ibm-acpi-2.6.git] / sound / oss / trident.c
blob72a8a0ed36a2855cca84d0d64a1c3844a96ab344
1 /*
2 * OSS driver for Linux 2.[46].x for
4 * Trident 4D-Wave
5 * SiS 7018
6 * ALi 5451
7 * Tvia/IGST CyberPro 5050
9 * Driver: Alan Cox <alan@redhat.com>
11 * Built from:
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>
16 * Hacked up by:
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.
39 * History
40 * v0.14.10j
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.
44 * v0.14.10i
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().
49 * v0.14.10h
50 * Sept 10 2002 Pascal Schmidt <der.eremit@email.de>
51 * added support for ALi 5451 joystick port
52 * v0.14.10g
53 * Sept 05 2002 Alan Cox <alan@redhat.com>
54 * adapt to new pci joystick attachment interface
55 * v0.14.10f
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*.
59 * v0.14.10e
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.
65 * v0.14.10d
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.
69 * v0.14.10c
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.
73 * v0.14.10b
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.
77 * v0.14.10a
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.
81 * v0.14.10
82 * June 6 2002 Lei Hu <Lei_hu@ali.com.tw>
83 * rewrite the part to read/write registers of audio codec for Ali5451
84 * v0.14.9e
85 * January 2 2002 Vojtech Pavlik <vojtech@ucw.cz> added gameport
86 * support to avoid resource conflict with pcigame.c
87 * v0.14.9d
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
91 * v0.14.9c
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)
95 * v0.14.9b
96 * Switch to static inline not extern inline (gcc 3)
97 * v0.14.9a
98 * Aug 6 2001 Alan Cox
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
103 * v0.14.9
104 * Jul 10 2001 Matt Wu
105 * Add H/W Volume Control
106 * v0.14.8a
107 * July 7 2001 Alan Cox
108 * Moved Matt Wu's ac97 register cache into the card structure
109 * v0.14.8
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
114 * unreleased
115 * Mar 09 2001 Matt Wu
116 * Add cache for ac97 access
117 * v0.14.7
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+
123 * v0.14.6
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
182 * ToDo
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)
187 * Mmap support
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>
222 #include <asm/io.h>
223 #include <asm/dma.h>
225 #if defined(CONFIG_ALPHA_NAUTILUS) || defined(CONFIG_ALPHA_GENERIC)
226 #include <asm/hwrpb.h>
227 #endif
229 #include "trident.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
235 #endif
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. */
244 #define NR_HW_CH 32
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) */
248 #define NR_AC97 2
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, */
255 ALI_CENTER_CHANNEL,
256 ALI_LEF_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";
266 enum {
267 TRIDENT_4D_DX = 0,
268 TRIDENT_4D_NX,
269 SIS_7018,
270 ALI_5451,
271 CYBER5050
274 static char *card_names[] = {
275 "Trident 4DWave DX",
276 "Trident 4DWave NX",
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),
290 0, 0, CYBER5050},
291 {0,}
294 MODULE_DEVICE_TABLE(pci, trident_pci_tbl);
296 /* "software" or virtual channel, an instance of opened /dev/dsp */
297 struct trident_state {
298 unsigned int magic;
299 struct trident_card *card; /* Card info */
301 /* file mode */
302 mode_t open_mode;
304 /* virtual channel number */
305 int virt;
307 struct dmabuf {
308 /* wave sample stuff */
309 unsigned int rate;
310 unsigned char fmt, enable;
312 /* hardware channel */
313 struct trident_channel *channel;
315 /* OSS buffer management stuff */
316 void *rawbuf;
317 dma_addr_t dma_handle;
318 unsigned buforder;
319 unsigned numfrag;
320 unsigned fragshift;
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 */
333 unsigned fragsize;
334 unsigned dmasize;
335 unsigned fragsamples;
337 /* OSS stuff */
338 unsigned mapped:1;
339 unsigned ready:1;
340 unsigned endcleared:1;
341 unsigned update_flag;
342 unsigned ossfragshift;
343 int ossmaxfrags;
344 unsigned subdivision;
346 } dmabuf;
348 /* 5.1 channels */
349 struct trident_state *other_states[4];
350 int multi_channels_adjust_count;
351 unsigned chans_num;
352 unsigned long fmt_flag;
353 /* Guard against mmap/write/read races */
354 struct mutex sem;
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 */
367 u16 fm_vol;
368 u32 control; /* signed/unsigned, 8/16 bits, mono/stereo */
371 struct trident_pcm_bank_address {
372 u32 start;
373 u32 stop;
374 u32 aint;
375 u32 aint_en;
378 static struct trident_pcm_bank_address bank_a_addrs = {
379 T4D_START_A,
380 T4D_STOP_A,
381 T4D_AINT_A,
382 T4D_AINTEN_A
385 static struct trident_pcm_bank_address bank_b_addrs = {
386 T4D_START_B,
387 T4D_STOP_B,
388 T4D_AINT_B,
389 T4D_AINTEN_B
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 {
401 unsigned int magic;
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 */
411 spinlock_t lock;
413 /* PCI device stuff */
414 struct pci_dev *pci_dev;
415 u16 pci_id;
416 u8 revision;
418 /* soundcore stuff */
419 int dev_audio;
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;
429 u32 irq;
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 */
444 int hwvolctl;
445 struct timer_list timer;
447 /* Game port support */
448 struct gameport *gameport;
451 enum dmabuf_mode {
452 DM_PLAYBACK = 0,
453 DM_RECORD
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,
460 I2S_LR, SPDIF_LR
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,
504 int chan_nums);
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); \
510 (cnt) -= (offset); \
511 (copy_count) += (offset); \
512 } while (0)
514 static inline int lock_set_fmt(struct trident_state* state)
516 if (test_and_set_bit(0, &state->fmt_flag))
517 return -EFAULT;
519 return 0;
522 static inline void unlock_set_fmt(struct trident_state* state)
524 clear_bit(0, &state->fmt_flag);
527 static int
528 trident_enable_loop_interrupts(struct trident_card *card)
530 u32 global_control;
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);
537 break;
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);
543 break;
544 default:
545 return 0;
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)));
553 return 1;
556 static int
557 trident_disable_loop_interrupts(struct trident_card *card)
559 u32 global_control;
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",
566 global_control);
568 return 1;
571 static void
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));
579 reg |= mask;
580 outl(reg, TRID_REG(card, addr));
582 #ifdef DEBUG
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",
586 reg, addr);
587 #endif /* DEBUG */
590 static void
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));
598 reg &= ~mask;
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));
604 #ifdef DEBUG
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",
608 reg, addr);
609 #endif /* DEBUG */
612 static void
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;
619 #ifdef DEBUG
620 u32 reg;
621 #endif /* DEBUG */
623 outl(mask, TRID_REG(card, addr));
625 #ifdef DEBUG
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",
629 reg, addr);
630 #endif /* DEBUG */
633 static void
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;
640 #ifdef DEBUG
641 u32 reg;
642 #endif /* DEBUG */
644 outl(mask, TRID_REG(card, addr));
646 #ifdef DEBUG
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",
650 reg, addr);
651 #endif /* DEBUG */
654 static u32
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));
662 static int
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);
668 #ifdef DEBUG
669 if (reg & mask)
670 pr_debug("trident: channel %d has interrupt, %s = 0x%08x\n",
671 channel, reg == T4D_AINT_B ? "AINT_B" : "AINT_A",
672 reg);
673 #endif /* DEBUG */
674 return (reg & mask) ? 1 : 0;
677 static void
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));
685 reg &= mask;
686 outl(reg, TRID_REG(card, addr));
688 #ifdef DEBUG
689 reg = inl(TRID_REG(card, T4D_AINT_B));
690 pr_debug("trident: Ack channel %d interrupt, AINT_B = 0x%08x\n",
691 channel, reg);
692 #endif /* DEBUG */
695 static struct trident_channel *
696 trident_alloc_pcm_channel(struct trident_card *card)
698 struct trident_pcm_bank *bank;
699 int idx;
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;
708 return channel;
712 /* no more free channels available */
713 printk(KERN_ERR "trident: no more channels available on Bank B.\n");
714 return NULL;
717 static void
718 trident_free_pcm_channel(struct trident_card *card, unsigned int channel)
720 int bank;
721 unsigned char b;
723 if (channel < 31 || channel > 63)
724 return;
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));
733 bank = channel >> 5;
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;
743 int idx;
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;
755 channel->num = idx;
756 return channel;
760 /* no more free channels available */
761 printk(KERN_ERR "cyberpro5050: no more channels available on Bank A.\n");
762 return NULL;
765 static void
766 cyber_free_pcm_channel(struct trident_card *card, unsigned int channel)
768 if (channel > 31)
769 return;
770 card->banks[BANK_A].bitmap &= ~(1 << (channel));
773 static inline void
774 cyber_outidx(int port, int idx, int data)
776 outb(idx, port);
777 outb(data, port + 1);
780 static inline int
781 cyber_inidx(int port, int idx)
783 outb(idx, port);
784 return inb(port + 1);
787 static int
788 cyber_init_ritual(struct trident_card *card)
790 /* some black magic, taken from SDK samples */
791 /* remove this and nothing will work */
792 int portDat;
793 int ret = 0;
794 unsigned long flags;
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");
813 ret = -1;
814 } else {
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);
825 return ret;
828 /* called with spin lock held */
830 static int
831 trident_load_channel_registers(struct trident_card *card, u32 * data,
832 unsigned int channel)
834 int i;
836 if (channel > 63)
837 return 0;
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)
846 continue;
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));
854 return 1;
857 /* called with spin lock held */
858 static int
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);
873 data[3] = 0;
874 break;
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);
880 break;
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;
885 break;
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;
891 break;
892 default:
893 return 0;
896 return trident_load_channel_registers(state->card, data, channel->num);
899 static int
900 compute_rate_play(u32 rate)
902 int delta;
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 */
907 if (rate == 44100)
908 delta = 0xeb3;
909 else if (rate == 8000)
910 delta = 0x2ab;
911 else if (rate == 48000)
912 delta = 0x1000;
913 else
914 delta = (((rate << 12) + rate) / 48000) & 0x0000ffff;
915 return delta;
918 static int
919 compute_rate_rec(u32 rate)
921 int delta;
923 if (rate == 44100)
924 delta = 0x116a;
925 else if (rate == 8000)
926 delta = 0x6000;
927 else if (rate == 48000)
928 delta = 0x1000;
929 else
930 delta = ((48000 << 12) / rate) & 0x0000ffff;
932 return delta;
935 /* set playback sample rate */
936 static unsigned int
937 trident_set_dac_rate(struct trident_state *state, unsigned int rate)
939 struct dmabuf *dmabuf = &state->dmabuf;
941 if (rate > 48000)
942 rate = 48000;
943 if (rate < 4000)
944 rate = 4000;
946 dmabuf->rate = rate;
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);
953 return rate;
956 /* set recording sample rate */
957 static unsigned int
958 trident_set_adc_rate(struct trident_state *state, unsigned int rate)
960 struct dmabuf *dmabuf = &state->dmabuf;
962 if (rate > 48000)
963 rate = 48000;
964 if (rate < 4000)
965 rate = 4000;
967 dmabuf->rate = rate;
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);
974 return rate;
977 /* prepare channel attributes for playback */
978 static void
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];
988 channel->eso -= 1;
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) {
1010 /* 16-bits */
1011 channel->control |= CHANNEL_16BITS;
1012 /* signed */
1013 channel->control |= CHANNEL_SIGNED;
1015 if (dmabuf->fmt & TRIDENT_FMT_STEREO)
1016 /* 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 */
1027 static void
1028 trident_rec_setup(struct trident_state *state)
1030 u16 w;
1031 u8 bval;
1033 struct trident_card *card = state->card;
1034 struct dmabuf *dmabuf = &state->dmabuf;
1035 struct trident_channel *channel = dmabuf->channel;
1036 unsigned int rate;
1038 /* Enable AC-97 ADC (capture) */
1039 switch (card->pci_id) {
1040 case PCI_DEVICE_ID_ALI_5451:
1041 ali_enable_special_channel(state);
1042 break;
1043 case PCI_DEVICE_ID_SI_7018:
1044 /* for 7018, the ac97 is always in playback/record (duplex) mode */
1045 break;
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));
1051 break;
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));
1057 break;
1058 case PCI_DEVICE_ID_INTERG_5050:
1059 /* don't know yet, using special channel 22 in GC1(0xd4)? */
1060 break;
1061 default:
1062 return;
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);
1070 if (rate == 0) {
1071 printk(KERN_WARNING "trident: ALi 5451 "
1072 "S/PDIF input setup error!\n");
1073 rate = 48000;
1075 bval = inb(TRID_REG(card, ALI_SPDIF_CTRL));
1076 if (bval & 0x10) {
1077 outb(bval, TRID_REG(card, ALI_SPDIF_CTRL));
1078 printk(KERN_WARNING "trident: cleared ALi "
1079 "5451 S/PDIF parity error flag.\n");
1082 if (rate != 48000)
1083 channel->delta = ((rate << 12) / dmabuf->rate) & 0x0000ffff;
1086 channel->eso = dmabuf->dmasize >> sample_shift[dmabuf->fmt];
1087 channel->eso -= 1;
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) {
1097 /* 16-bits */
1098 channel->control |= CHANNEL_16BITS;
1099 /* signed */
1100 channel->control |= CHANNEL_SIGNED;
1102 if (dmabuf->fmt & TRIDENT_FMT_STEREO)
1103 /* 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;
1119 u32 cso;
1121 if (!dmabuf->enable)
1122 return 0;
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));
1133 break;
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;
1137 break;
1138 default:
1139 return 0;
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) */
1152 static inline void
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);
1164 static void
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);
1171 __stop_adc(state);
1172 spin_unlock_irqrestore(&card->lock, flags);
1175 static void
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) &&
1186 dmabuf->ready) {
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) */
1195 static inline void
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);
1217 static void
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);
1224 __stop_dac(state);
1225 spin_unlock_irqrestore(&card->lock, flags);
1228 static void
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 */
1259 static int
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)))
1267 return -ENOMEM;
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);
1282 return 0;
1285 /* allocate the main DMA buffer, playback and recording buffer should be */
1286 /* allocated separately */
1287 static int
1288 alloc_main_dmabuf(struct trident_state *state)
1290 struct dmabuf *dmabuf = &state->dmabuf;
1291 int order;
1292 int ret = -ENOMEM;
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)))
1297 return 0;
1298 /* else try again */
1300 return ret;
1303 /* deallocate a DMA buffer */
1304 static void
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;
1321 static int
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;
1329 int ret, i, order;
1331 if ((ret = lock_set_fmt(state)) < 0)
1332 return ret;
1334 if (state->chans_num == 6)
1335 dma_nums = 5;
1336 else
1337 dma_nums = 1;
1339 for (i = 0; i < dma_nums; i++) {
1340 if (i > 0) {
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) {
1354 if (i == 0) {
1355 if ((ret = alloc_main_dmabuf(state))) {
1356 unlock_set_fmt(state);
1357 return ret;
1359 } else {
1360 ret = -ENOMEM;
1361 order = state->dmabuf.buforder - 1;
1362 if (order >= DMABUF_MINORDER) {
1363 ret = alloc_dmabuf(dmabuf,
1364 state->card->pci_dev,
1365 order);
1367 if (ret) {
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);
1375 return ret;
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);
1385 else
1386 dmabuf->fragshift = dmabuf->ossfragshift;
1387 } else {
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,
1403 dmabuf->dmasize);
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 */
1414 dmabuf->ready = 1;
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);
1423 return 0;
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|
1444 static void
1445 trident_clear_tail(struct trident_state *state)
1447 struct dmabuf *dmabuf = &state->dmabuf;
1448 unsigned swptr;
1449 unsigned char silence = (dmabuf->fmt & TRIDENT_FMT_16BIT) ? 0 : 0x80;
1450 unsigned int len;
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)
1459 return;
1461 if (swptr < dmabuf->dmasize / 2)
1462 len = dmabuf->dmasize / 2 - swptr;
1463 else
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 */
1475 start_dac(state);
1478 static int
1479 drain_dac(struct trident_state *state, int nonblock)
1481 DECLARE_WAITQUEUE(wait, current);
1482 struct dmabuf *dmabuf = &state->dmabuf;
1483 unsigned long flags;
1484 unsigned long tmo;
1485 int count;
1486 unsigned long diff = 0;
1488 if (dmabuf->mapped || !dmabuf->ready)
1489 return 0;
1491 add_wait_queue(&dmabuf->wait, &wait);
1492 for (;;) {
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);
1501 if (count <= 0)
1502 break;
1504 if (signal_pending(current))
1505 break;
1507 if (nonblock) {
1508 remove_wait_queue(&dmabuf->wait, &wait);
1509 set_current_state(TASK_RUNNING);
1510 return -EBUSY;
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;
1520 } else {
1521 tmo = (dmabuf->dmasize * HZ) / dmabuf->rate;
1523 tmo >>= sample_shift[dmabuf->fmt];
1524 if (!schedule_timeout(tmo ? tmo : 1) && tmo) {
1525 break;
1528 remove_wait_queue(&dmabuf->wait, &wait);
1529 set_current_state(TASK_RUNNING);
1530 if (signal_pending(current))
1531 return -ERESTARTSYS;
1533 return 0;
1536 /* update buffer manangement pointers, especially, */
1537 /* dmabuf->count and dmabuf->hwptr */
1538 static void
1539 trident_update_ptr(struct trident_state *state)
1541 struct dmabuf *dmabuf = &state->dmabuf;
1542 unsigned hwptr, swptr;
1543 int clear_cnt = 0;
1544 int diff;
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);
1560 } else {
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 */
1569 __stop_adc(state);
1570 dmabuf->error++;
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);
1583 } else {
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 */
1591 __stop_dac(state);
1592 dmabuf->error++;
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)
1602 diff = hwptr;
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;
1611 swptr = swptr / 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;
1630 swptr = swptr / 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;
1653 static void
1654 trident_address_interrupt(struct trident_card *card)
1656 int i;
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++) {
1663 channel = 63 - 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);
1668 } else {
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);
1678 static void
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];
1690 } else {
1691 pVol[1] = &volume[0];
1692 pVol[0] = &volume[1];
1694 diff = *(pVol[1]) - *(pVol[0]);
1696 if (opt == 1) { // MUTE
1697 dwTemp ^= 0x8000;
1698 ali_ac97_write(card->ac97_codec[0],
1699 0x02, dwTemp);
1700 } else if (opt == 2) { // Down
1701 if (mute)
1702 return;
1703 if (*(pVol[1]) < 0x001f) {
1704 (*pVol[1])++;
1705 *(pVol[0]) = *(pVol[1]) - diff;
1707 dwTemp &= 0xe0e0;
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
1713 if (mute)
1714 return;
1715 if (*(pVol[0]) > 0) {
1716 (*pVol[0])--;
1717 *(pVol[1]) = *(pVol[0]) + diff;
1719 dwTemp &= 0xe0e0;
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);
1724 } else {
1725 /* Nothing needs doing */
1730 * Re-enable reporting of vol change after 0.1 seconds
1733 static void
1734 ali_timeout(unsigned long ptr)
1736 struct trident_card *card = (struct trident_card *) ptr;
1737 u16 temp = 0;
1739 /* Enable GPIO IRQ (MISCINT bit 18h) */
1740 temp = inw(TRID_REG(card, T4D_MISCINT + 2));
1741 temp |= 0x0004;
1742 outw(temp, TRID_REG(card, T4D_MISCINT + 2));
1746 * Set up the timer to clear the vol change notification
1749 static void
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
1764 static void
1765 ali_queue_task(struct trident_card *card, int opt)
1767 u16 temp;
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);
1781 static void
1782 cyber_address_interrupt(struct trident_card *card)
1784 int i, irq_status;
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++) {
1795 channel = 31 - 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);
1804 } else {
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);
1814 static irqreturn_t
1815 trident_interrupt(int irq, void *dev_id)
1817 struct trident_card *card = (struct trident_card *) dev_id;
1818 u32 event;
1819 u32 gpio;
1821 spin_lock(&card->lock);
1822 event = inl(TRID_REG(card, T4D_MISCINT));
1824 pr_debug("trident: trident_interrupt called, MISCINT = 0x%08x\n",
1825 event);
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);
1843 return IRQ_HANDLED;
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);
1850 return IRQ_HANDLED;
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. */
1856 static ssize_t
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;
1861 ssize_t ret = 0;
1862 unsigned long flags;
1863 unsigned swptr;
1864 int cnt;
1866 pr_debug("trident: trident_read called, count = %zd\n", count);
1868 VALIDATE_STATE(state);
1870 if (dmabuf->mapped)
1871 return -ENXIO;
1872 if (!access_ok(VERIFY_WRITE, buffer, count))
1873 return -EFAULT;
1875 mutex_lock(&state->sem);
1876 if (!dmabuf->ready && (ret = prog_dmabuf_record(state)))
1877 goto out;
1879 while (count > 0) {
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);
1894 if (cnt > count)
1895 cnt = count;
1896 if (cnt <= 0) {
1897 unsigned long tmo;
1898 /* buffer is empty, start the dma machine and */
1899 /* wait for data to be recorded */
1900 start_adc(state);
1901 if (file->f_flags & O_NONBLOCK) {
1902 if (!ret)
1903 ret = -EAGAIN;
1904 goto out;
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)) {
1930 if (!ret)
1931 ret = -ERESTARTSYS;
1932 goto out;
1934 mutex_lock(&state->sem);
1935 if (dmabuf->mapped) {
1936 if (!ret)
1937 ret = -ENXIO;
1938 goto out;
1940 continue;
1943 if (copy_to_user(buffer, dmabuf->rawbuf + swptr, cnt)) {
1944 if (!ret)
1945 ret = -EFAULT;
1946 goto out;
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);
1956 count -= cnt;
1957 buffer += cnt;
1958 ret += cnt;
1959 start_adc(state);
1961 out:
1962 mutex_unlock(&state->sem);
1963 return ret;
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. */
1969 static ssize_t
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;
1974 ssize_t ret;
1975 unsigned long flags;
1976 unsigned swptr;
1977 int cnt;
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) {
1993 ret = -ENXIO;
1994 goto out;
1996 if (!dmabuf->ready && (ret = prog_dmabuf_playback(state)))
1997 goto out;
1999 if (!access_ok(VERIFY_READ, buffer, count)) {
2000 ret = -EFAULT;
2001 goto out;
2004 ret = 0;
2006 while (count > 0) {
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 */
2011 dmabuf->count = 0;
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);
2020 if (cnt > count)
2021 cnt = count;
2022 if (cnt <= 0) {
2023 unsigned long tmo;
2024 /* buffer is full, start the dma machine and */
2025 /* wait for data to be played */
2026 start_dac(state);
2027 if (file->f_flags & O_NONBLOCK) {
2028 if (!ret)
2029 ret = -EAGAIN;
2030 goto out;
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)) {
2063 if (!ret)
2064 ret = -ERESTARTSYS;
2065 goto out_nolock;
2067 mutex_lock(&state->sem);
2068 if (dmabuf->mapped) {
2069 if (!ret)
2070 ret = -ENXIO;
2071 goto out;
2073 continue;
2075 if ((lret = lock_set_fmt(state)) < 0) {
2076 ret = lret;
2077 goto out;
2080 if (state->chans_num == 6) {
2081 copy_count = 0;
2082 state_cnt = 0;
2083 if (ali_write_5_1(state, buffer, cnt, &copy_count,
2084 &state_cnt) == -EFAULT) {
2085 if (state_cnt) {
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);
2093 ret += copy_count;
2094 if (!ret)
2095 ret = -EFAULT;
2096 unlock_set_fmt(state);
2097 goto out;
2099 } else {
2100 if (copy_from_user(dmabuf->rawbuf + swptr,
2101 buffer, cnt)) {
2102 if (!ret)
2103 ret = -EFAULT;
2104 unlock_set_fmt(state);
2105 goto out;
2107 state_cnt = cnt;
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);
2119 count -= cnt;
2120 buffer += cnt;
2121 ret += cnt;
2122 start_dac(state);
2124 out:
2125 mutex_unlock(&state->sem);
2126 out_nolock:
2127 return ret;
2130 /* No kernel lock - we have our own spinlock */
2131 static unsigned int
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);
2151 return 0;
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);
2158 return 0;
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;
2175 } else {
2176 if ((signed) dmabuf->dmasize >= dmabuf->count +
2177 (signed) dmabuf->fragsize)
2178 mask |= POLLOUT | POLLWRNORM;
2181 spin_unlock_irqrestore(&state->card->lock, flags);
2183 return mask;
2186 static int
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;
2191 int ret = -EINVAL;
2192 unsigned long size;
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)
2205 goto out;
2206 } else if (vma->vm_flags & VM_READ) {
2207 if ((ret = prog_dmabuf_record(state)) != 0)
2208 goto out;
2209 } else
2210 goto out;
2212 ret = -EINVAL;
2213 if (vma->vm_pgoff != 0)
2214 goto out;
2215 size = vma->vm_end - vma->vm_start;
2216 if (size > (PAGE_SIZE << dmabuf->buforder))
2217 goto out;
2218 ret = -EAGAIN;
2219 if (remap_pfn_range(vma, vma->vm_start,
2220 virt_to_phys(dmabuf->rawbuf) >> PAGE_SHIFT,
2221 size, vma->vm_page_prot))
2222 goto out;
2223 dmabuf->mapped = 1;
2224 ret = 0;
2225 out:
2226 mutex_unlock(&state->sem);
2227 return ret;
2230 static int
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;
2238 count_info cinfo;
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);
2252 switch (cmd) {
2253 case OSS_GETVERSION:
2254 ret = put_user(SOUND_VERSION, p);
2255 break;
2257 case SNDCTL_DSP_RESET:
2258 /* FIXME: spin_lock ? */
2259 if (file->f_mode & FMODE_WRITE) {
2260 stop_dac(state);
2261 synchronize_irq(card->irq);
2262 dmabuf->ready = 0;
2263 dmabuf->swptr = dmabuf->hwptr = 0;
2264 dmabuf->count = dmabuf->total_bytes = 0;
2266 if (file->f_mode & FMODE_READ) {
2267 stop_adc(state);
2268 synchronize_irq(card->irq);
2269 dmabuf->ready = 0;
2270 dmabuf->swptr = dmabuf->hwptr = 0;
2271 dmabuf->count = dmabuf->total_bytes = 0;
2273 break;
2275 case SNDCTL_DSP_SYNC:
2276 if (file->f_mode & FMODE_WRITE)
2277 ret = drain_dac(state, file->f_flags & O_NONBLOCK);
2278 break;
2280 case SNDCTL_DSP_SPEED: /* set smaple rate */
2281 if (get_user(val, p)) {
2282 ret = -EFAULT;
2283 break;
2285 if (val >= 0) {
2286 if (file->f_mode & FMODE_WRITE) {
2287 stop_dac(state);
2288 dmabuf->ready = 0;
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) {
2294 stop_adc(state);
2295 dmabuf->ready = 0;
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);
2302 break;
2304 case SNDCTL_DSP_STEREO: /* set stereo or mono channel */
2305 if (get_user(val, p)) {
2306 ret = -EFAULT;
2307 break;
2309 if ((ret = lock_set_fmt(state)) < 0)
2310 return ret;
2312 if (file->f_mode & FMODE_WRITE) {
2313 stop_dac(state);
2314 dmabuf->ready = 0;
2315 if (val)
2316 dmabuf->fmt |= TRIDENT_FMT_STEREO;
2317 else
2318 dmabuf->fmt &= ~TRIDENT_FMT_STEREO;
2320 if (file->f_mode & FMODE_READ) {
2321 stop_adc(state);
2322 dmabuf->ready = 0;
2323 if (val)
2324 dmabuf->fmt |= TRIDENT_FMT_STEREO;
2325 else
2326 dmabuf->fmt &= ~TRIDENT_FMT_STEREO;
2328 unlock_set_fmt(state);
2329 break;
2331 case SNDCTL_DSP_GETBLKSIZE:
2332 if (file->f_mode & FMODE_WRITE) {
2333 if ((val = prog_dmabuf_playback(state)))
2334 ret = val;
2335 else
2336 ret = put_user(dmabuf->fragsize, p);
2337 break;
2339 if (file->f_mode & FMODE_READ) {
2340 if ((val = prog_dmabuf_record(state)))
2341 ret = val;
2342 else
2343 ret = put_user(dmabuf->fragsize, p);
2344 break;
2346 /* neither READ nor WRITE? is this even possible? */
2347 ret = -EINVAL;
2348 break;
2351 case SNDCTL_DSP_GETFMTS: /* Returns a mask of supported sample format */
2352 ret = put_user(AFMT_S16_LE | AFMT_U16_LE | AFMT_S8 |
2353 AFMT_U8, p);
2354 break;
2356 case SNDCTL_DSP_SETFMT: /* Select sample format */
2357 if (get_user(val, p)) {
2358 ret = -EFAULT;
2359 break;
2361 if ((ret = lock_set_fmt(state)) < 0)
2362 return ret;
2364 if (val != AFMT_QUERY) {
2365 if (file->f_mode & FMODE_WRITE) {
2366 stop_dac(state);
2367 dmabuf->ready = 0;
2368 if (val == AFMT_S16_LE)
2369 dmabuf->fmt |= TRIDENT_FMT_16BIT;
2370 else
2371 dmabuf->fmt &= ~TRIDENT_FMT_16BIT;
2373 if (file->f_mode & FMODE_READ) {
2374 stop_adc(state);
2375 dmabuf->ready = 0;
2376 if (val == AFMT_S16_LE)
2377 dmabuf->fmt |= TRIDENT_FMT_16BIT;
2378 else
2379 dmabuf->fmt &= ~TRIDENT_FMT_16BIT;
2382 unlock_set_fmt(state);
2383 ret = put_user((dmabuf->fmt & TRIDENT_FMT_16BIT) ? AFMT_S16_LE :
2384 AFMT_U8, p);
2385 break;
2387 case SNDCTL_DSP_CHANNELS:
2388 if (get_user(val, p)) {
2389 ret = -EFAULT;
2390 break;
2392 if (val != 0) {
2393 if ((ret = lock_set_fmt(state)) < 0)
2394 return ret;
2396 if (file->f_mode & FMODE_WRITE) {
2397 stop_dac(state);
2398 dmabuf->ready = 0;
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;
2406 if (val >= 2) {
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");
2413 ret = -EBUSY;
2414 unlock_set_fmt(state);
2415 break;
2418 ret = ali_setup_multi_channels(state->card, 6);
2419 if (ret < 0) {
2420 unlock_set_fmt(state);
2421 break;
2423 mutex_lock(&state->card->open_mutex);
2424 ret = ali_allocate_other_states_resources(state, 6);
2425 if (ret < 0) {
2426 mutex_unlock(&state->card->open_mutex);
2427 unlock_set_fmt(state);
2428 break;
2430 state->card->multi_channel_use_count++;
2431 mutex_unlock(&state->card->open_mutex);
2432 } else
2433 val = 2; /*yield to 2-channels */
2434 } else
2435 dmabuf->fmt &= ~TRIDENT_FMT_STEREO;
2436 state->chans_num = val;
2438 if (file->f_mode & FMODE_READ) {
2439 stop_adc(state);
2440 dmabuf->ready = 0;
2441 if (val >= 2) {
2442 if (!((file->f_mode & FMODE_WRITE) &&
2443 (val == 6)))
2444 val = 2;
2445 dmabuf->fmt |= TRIDENT_FMT_STEREO;
2446 } else
2447 dmabuf->fmt &= ~TRIDENT_FMT_STEREO;
2448 state->chans_num = val;
2450 unlock_set_fmt(state);
2452 ret = put_user(val, p);
2453 break;
2455 case SNDCTL_DSP_POST:
2456 /* Cause the working fragment to be output */
2457 break;
2459 case SNDCTL_DSP_SUBDIVIDE:
2460 if (dmabuf->subdivision) {
2461 ret = -EINVAL;
2462 break;
2464 if (get_user(val, p)) {
2465 ret = -EFAULT;
2466 break;
2468 if (val != 1 && val != 2 && val != 4) {
2469 ret = -EINVAL;
2470 break;
2472 dmabuf->subdivision = val;
2473 break;
2475 case SNDCTL_DSP_SETFRAGMENT:
2476 if (get_user(val, p)) {
2477 ret = -EFAULT;
2478 break;
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;
2490 break;
2492 case SNDCTL_DSP_GETOSPACE:
2493 if (!(file->f_mode & FMODE_WRITE)) {
2494 ret = -EINVAL;
2495 break;
2497 if (!dmabuf->ready && (val = prog_dmabuf_playback(state)) != 0) {
2498 ret = val;
2499 break;
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)) ?
2509 -EFAULT : 0;
2510 break;
2512 case SNDCTL_DSP_GETISPACE:
2513 if (!(file->f_mode & FMODE_READ)) {
2514 ret = -EINVAL;
2515 break;
2517 if (!dmabuf->ready && (val = prog_dmabuf_record(state)) != 0) {
2518 ret = val;
2519 break;
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)) ?
2529 -EFAULT : 0;
2530 break;
2532 case SNDCTL_DSP_NONBLOCK:
2533 file->f_flags |= O_NONBLOCK;
2534 break;
2536 case SNDCTL_DSP_GETCAPS:
2537 ret = put_user(DSP_CAP_REALTIME | DSP_CAP_TRIGGER |
2538 DSP_CAP_MMAP | DSP_CAP_BIND, p);
2539 break;
2541 case SNDCTL_DSP_GETTRIGGER:
2542 val = 0;
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);
2548 break;
2550 case SNDCTL_DSP_SETTRIGGER:
2551 if (get_user(val, p)) {
2552 ret = -EFAULT;
2553 break;
2555 if (file->f_mode & FMODE_READ) {
2556 if (val & PCM_ENABLE_INPUT) {
2557 if (!dmabuf->ready &&
2558 (ret = prog_dmabuf_record(state)))
2559 break;
2560 start_adc(state);
2561 } else
2562 stop_adc(state);
2564 if (file->f_mode & FMODE_WRITE) {
2565 if (val & PCM_ENABLE_OUTPUT) {
2566 if (!dmabuf->ready &&
2567 (ret = prog_dmabuf_playback(state)))
2568 break;
2569 start_dac(state);
2570 } else
2571 stop_dac(state);
2573 break;
2575 case SNDCTL_DSP_GETIPTR:
2576 if (!(file->f_mode & FMODE_READ)) {
2577 ret = -EINVAL;
2578 break;
2580 if (!dmabuf->ready && (val = prog_dmabuf_record(state))
2581 != 0) {
2582 ret = val;
2583 break;
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;
2590 if (dmabuf->mapped)
2591 dmabuf->count &= dmabuf->fragsize - 1;
2592 spin_unlock_irqrestore(&state->card->lock, flags);
2593 ret = copy_to_user(argp, &cinfo, sizeof (cinfo)) ?
2594 -EFAULT : 0;
2595 break;
2597 case SNDCTL_DSP_GETOPTR:
2598 if (!(file->f_mode & FMODE_WRITE)) {
2599 ret = -EINVAL;
2600 break;
2602 if (!dmabuf->ready && (val = prog_dmabuf_playback(state))
2603 != 0) {
2604 ret = val;
2605 break;
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;
2613 if (dmabuf->mapped)
2614 dmabuf->count &= dmabuf->fragsize - 1;
2615 spin_unlock_irqrestore(&state->card->lock, flags);
2616 ret = copy_to_user(argp, &cinfo, sizeof (cinfo)) ?
2617 -EFAULT : 0;
2618 break;
2620 case SNDCTL_DSP_SETDUPLEX:
2621 ret = -EINVAL;
2622 break;
2624 case SNDCTL_DSP_GETODELAY:
2625 if (!(file->f_mode & FMODE_WRITE)) {
2626 ret = -EINVAL;
2627 break;
2629 if (!dmabuf->ready && (val = prog_dmabuf_playback(state)) != 0) {
2630 ret = val;
2631 break;
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);
2638 break;
2640 case SOUND_PCM_READ_RATE:
2641 ret = put_user(dmabuf->rate, p);
2642 break;
2644 case SOUND_PCM_READ_CHANNELS:
2645 ret = put_user((dmabuf->fmt & TRIDENT_FMT_STEREO) ? 2 : 1,
2647 break;
2649 case SOUND_PCM_READ_BITS:
2650 ret = put_user((dmabuf->fmt & TRIDENT_FMT_16BIT) ? AFMT_S16_LE :
2651 AFMT_U8, p);
2652 break;
2654 case SNDCTL_DSP_GETCHANNELMASK:
2655 ret = put_user(DSP_BIND_FRONT | DSP_BIND_SURR |
2656 DSP_BIND_CENTER_LFE, p);
2657 break;
2659 case SNDCTL_DSP_BIND_CHANNEL:
2660 if (state->card->pci_id != PCI_DEVICE_ID_SI_7018) {
2661 ret = -EINVAL;
2662 break;
2665 if (get_user(val, p)) {
2666 ret = -EFAULT;
2667 break;
2669 if (val == DSP_BIND_QUERY) {
2670 val = dmabuf->channel->attribute | 0x3c00;
2671 val = attr2mask[val >> 8];
2672 } else {
2673 dmabuf->ready = 0;
2674 if (file->f_mode & FMODE_READ)
2675 dmabuf->channel->attribute = (CHANNEL_REC |
2676 SRC_ENABLE);
2677 if (file->f_mode & FMODE_WRITE)
2678 dmabuf->channel->attribute = (CHANNEL_SPC_PB |
2679 SRC_ENABLE);
2680 dmabuf->channel->attribute |= mask2attr[ffs(val)];
2682 ret = put_user(val, p);
2683 break;
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:
2690 default:
2691 ret = -EINVAL;
2692 break;
2695 return ret;
2698 static int
2699 trident_open(struct inode *inode, struct file *file)
2701 int i = 0;
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 */
2711 /* -- mulix */
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)
2715 return -EBUSY;
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);
2726 card = card->next;
2727 continue;
2730 for (i = 0; i < NR_HW_CH; i++) {
2731 if (card->states[i] == NULL) {
2732 state = card->states[i] = kzalloc(sizeof(*state), GFP_KERNEL);
2733 if (state == NULL) {
2734 mutex_unlock(&card->open_mutex);
2735 return -ENOMEM;
2737 mutex_init(&state->sem);
2738 dmabuf = &state->dmabuf;
2739 goto found_virt;
2742 mutex_unlock(&card->open_mutex);
2743 card = card->next;
2745 /* no more virtual channel avaiable */
2746 if (!state) {
2747 return -ENODEV;
2749 found_virt:
2750 /* found a free virtual channel, allocate hardware channels */
2751 if (file->f_mode & FMODE_READ)
2752 dmabuf->channel = card->alloc_rec_pcm_channel(card);
2753 else
2754 dmabuf->channel = card->alloc_pcm_channel(card);
2756 if (dmabuf->channel == NULL) {
2757 kfree(card->states[i]);
2758 card->states[i] = NULL;
2759 return -ENODEV;
2762 /* initialize the virtual channel */
2763 state->virt = i;
2764 state->card = card;
2765 state->magic = TRIDENT_STATE_MAGIC;
2766 init_waitqueue_head(&dmabuf->wait);
2767 file->private_data = state;
2769 /* set default sample format. According to OSS Programmer's */
2770 /* Guide /dev/dsp should be default to unsigned 8-bits, mono, */
2771 /* with sample rate 8kHz and /dev/dspW will accept 16-bits sample */
2772 if (file->f_mode & FMODE_WRITE) {
2773 dmabuf->fmt &= ~TRIDENT_FMT_MASK;
2774 if ((minor & 0x0f) == SND_DEV_DSP16)
2775 dmabuf->fmt |= TRIDENT_FMT_16BIT;
2776 dmabuf->ossfragshift = 0;
2777 dmabuf->ossmaxfrags = 0;
2778 dmabuf->subdivision = 0;
2779 if (card->pci_id == PCI_DEVICE_ID_SI_7018) {
2780 /* set default channel attribute to normal playback */
2781 dmabuf->channel->attribute = CHANNEL_PB;
2783 trident_set_dac_rate(state, 8000);
2786 if (file->f_mode & FMODE_READ) {
2787 /* FIXME: Trident 4d can only record in signed 16-bits stereo, */
2788 /* 48kHz sample, to be dealed with in trident_set_adc_rate() ?? */
2789 dmabuf->fmt &= ~TRIDENT_FMT_MASK;
2790 if ((minor & 0x0f) == SND_DEV_DSP16)
2791 dmabuf->fmt |= TRIDENT_FMT_16BIT;
2792 dmabuf->ossfragshift = 0;
2793 dmabuf->ossmaxfrags = 0;
2794 dmabuf->subdivision = 0;
2795 if (card->pci_id == PCI_DEVICE_ID_SI_7018) {
2796 /* set default channel attribute to 0x8a80, record from
2797 PCM L/R FIFO and mono = (left + right + 1)/2 */
2798 dmabuf->channel->attribute = (CHANNEL_REC | PCM_LR |
2799 MONO_MIX);
2801 trident_set_adc_rate(state, 8000);
2803 /* Added by Matt Wu 01-05-2001 */
2804 if (card->pci_id == PCI_DEVICE_ID_ALI_5451)
2805 card->rec_channel_use_count++;
2808 state->open_mode |= file->f_mode & (FMODE_READ | FMODE_WRITE);
2809 mutex_unlock(&card->open_mutex);
2811 pr_debug("trident: open virtual channel %d, hard channel %d\n",
2812 state->virt, dmabuf->channel->num);
2814 return nonseekable_open(inode, file);
2817 static int
2818 trident_release(struct inode *inode, struct file *file)
2820 struct trident_state *state = (struct trident_state *)file->private_data;
2821 struct trident_card *card;
2822 struct dmabuf *dmabuf;
2824 VALIDATE_STATE(state);
2826 card = state->card;
2827 dmabuf = &state->dmabuf;
2829 if (file->f_mode & FMODE_WRITE) {
2830 trident_clear_tail(state);
2831 drain_dac(state, file->f_flags & O_NONBLOCK);
2834 pr_debug("trident: closing virtual channel %d, hard channel %d\n",
2835 state->virt, dmabuf->channel->num);
2837 /* stop DMA state machine and free DMA buffers/channels */
2838 mutex_lock(&card->open_mutex);
2840 if (file->f_mode & FMODE_WRITE) {
2841 stop_dac(state);
2842 dealloc_dmabuf(&state->dmabuf, state->card->pci_dev);
2843 state->card->free_pcm_channel(state->card, dmabuf->channel->num);
2845 /* Added by Matt Wu */
2846 if (card->pci_id == PCI_DEVICE_ID_ALI_5451) {
2847 if (state->chans_num > 2) {
2848 if (card->multi_channel_use_count-- < 0)
2849 card->multi_channel_use_count = 0;
2850 if (card->multi_channel_use_count == 0)
2851 ali_close_multi_channels();
2852 ali_free_other_states_resources(state);
2856 if (file->f_mode & FMODE_READ) {
2857 stop_adc(state);
2858 dealloc_dmabuf(&state->dmabuf, state->card->pci_dev);
2859 state->card->free_pcm_channel(state->card, dmabuf->channel->num);
2861 /* Added by Matt Wu */
2862 if (card->pci_id == PCI_DEVICE_ID_ALI_5451) {
2863 if (card->rec_channel_use_count-- < 0)
2864 card->rec_channel_use_count = 0;
2868 card->states[state->virt] = NULL;
2869 kfree(state);
2871 /* we're covered by the open_mutex */
2872 mutex_unlock(&card->open_mutex);
2874 return 0;
2877 static /*const */ struct file_operations trident_audio_fops = {
2878 .owner = THIS_MODULE,
2879 .llseek = no_llseek,
2880 .read = trident_read,
2881 .write = trident_write,
2882 .poll = trident_poll,
2883 .ioctl = trident_ioctl,
2884 .mmap = trident_mmap,
2885 .open = trident_open,
2886 .release = trident_release,
2889 /* trident specific AC97 functions */
2890 /* Write AC97 codec registers */
2891 static void
2892 trident_ac97_set(struct ac97_codec *codec, u8 reg, u16 val)
2894 struct trident_card *card = (struct trident_card *)codec->private_data;
2895 unsigned int address, mask, busy;
2896 unsigned short count = 0xffff;
2897 unsigned long flags;
2898 u32 data;
2900 data = ((u32) val) << 16;
2902 switch (card->pci_id) {
2903 default:
2904 case PCI_DEVICE_ID_SI_7018:
2905 address = SI_AC97_WRITE;
2906 mask = SI_AC97_BUSY_WRITE | SI_AC97_AUDIO_BUSY;
2907 if (codec->id)
2908 mask |= SI_AC97_SECONDARY;
2909 busy = SI_AC97_BUSY_WRITE;
2910 break;
2911 case PCI_DEVICE_ID_TRIDENT_4DWAVE_DX:
2912 address = DX_ACR0_AC97_W;
2913 mask = busy = DX_AC97_BUSY_WRITE;
2914 break;
2915 case PCI_DEVICE_ID_TRIDENT_4DWAVE_NX:
2916 address = NX_ACR1_AC97_W;
2917 mask = NX_AC97_BUSY_WRITE;
2918 if (codec->id)
2919 mask |= NX_AC97_WRITE_SECONDARY;
2920 busy = NX_AC97_BUSY_WRITE;
2921 break;
2922 case PCI_DEVICE_ID_INTERG_5050:
2923 address = SI_AC97_WRITE;
2924 mask = busy = SI_AC97_BUSY_WRITE;
2925 if (codec->id)
2926 mask |= SI_AC97_SECONDARY;
2927 break;
2930 spin_lock_irqsave(&card->lock, flags);
2931 do {
2932 if ((inw(TRID_REG(card, address)) & busy) == 0)
2933 break;
2934 } while (count--);
2936 data |= (mask | (reg & AC97_REG_ADDR));
2938 if (count == 0) {
2939 printk(KERN_ERR "trident: AC97 CODEC write timed out.\n");
2940 spin_unlock_irqrestore(&card->lock, flags);
2941 return;
2944 outl(data, TRID_REG(card, address));
2945 spin_unlock_irqrestore(&card->lock, flags);
2948 /* Read AC97 codec registers */
2949 static u16
2950 trident_ac97_get(struct ac97_codec *codec, u8 reg)
2952 struct trident_card *card = (struct trident_card *)codec->private_data;
2953 unsigned int address, mask, busy;
2954 unsigned short count = 0xffff;
2955 unsigned long flags;
2956 u32 data;
2958 switch (card->pci_id) {
2959 default:
2960 case PCI_DEVICE_ID_SI_7018:
2961 address = SI_AC97_READ;
2962 mask = SI_AC97_BUSY_READ | SI_AC97_AUDIO_BUSY;
2963 if (codec->id)
2964 mask |= SI_AC97_SECONDARY;
2965 busy = SI_AC97_BUSY_READ;
2966 break;
2967 case PCI_DEVICE_ID_TRIDENT_4DWAVE_DX:
2968 address = DX_ACR1_AC97_R;
2969 mask = busy = DX_AC97_BUSY_READ;
2970 break;
2971 case PCI_DEVICE_ID_TRIDENT_4DWAVE_NX:
2972 if (codec->id)
2973 address = NX_ACR3_AC97_R_SECONDARY;
2974 else
2975 address = NX_ACR2_AC97_R_PRIMARY;
2976 mask = NX_AC97_BUSY_READ;
2977 busy = NX_AC97_BUSY_READ | NX_AC97_BUSY_DATA;
2978 break;
2979 case PCI_DEVICE_ID_INTERG_5050:
2980 address = SI_AC97_READ;
2981 mask = busy = SI_AC97_BUSY_READ;
2982 if (codec->id)
2983 mask |= SI_AC97_SECONDARY;
2984 break;
2987 data = (mask | (reg & AC97_REG_ADDR));
2989 spin_lock_irqsave(&card->lock, flags);
2990 outl(data, TRID_REG(card, address));
2991 do {
2992 data = inl(TRID_REG(card, address));
2993 if ((data & busy) == 0)
2994 break;
2995 } while (count--);
2996 spin_unlock_irqrestore(&card->lock, flags);
2998 if (count == 0) {
2999 printk(KERN_ERR "trident: AC97 CODEC read timed out.\n");
3000 data = 0;
3002 return ((u16) (data >> 16));
3005 /* rewrite ac97 read and write mixer register by hulei for ALI*/
3006 static int
3007 acquirecodecaccess(struct trident_card *card)
3009 u16 wsemamask = 0x6000; /* bit 14..13 */
3010 u16 wsemabits;
3011 u16 wcontrol;
3012 int block = 0;
3013 int ncount = 25;
3014 while (1) {
3015 wcontrol = inw(TRID_REG(card, ALI_AC97_WRITE));
3016 wsemabits = wcontrol & wsemamask;
3018 if (wsemabits == 0x4000)
3019 return 1; /* 0x4000 is audio ,then success */
3020 if (ncount-- < 0)
3021 break;
3022 if (wsemabits == 0) {
3023 unlock:
3024 outl(((u32) (wcontrol & 0x1eff) | 0x00004000),
3025 TRID_REG(card, ALI_AC97_WRITE));
3026 continue;
3028 udelay(20);
3030 if (!block) {
3031 pr_debug("accesscodecsemaphore: try unlock\n");
3032 block = 1;
3033 goto unlock;
3035 return 0;
3038 static void
3039 releasecodecaccess(struct trident_card *card)
3041 unsigned long wcontrol;
3042 wcontrol = inl(TRID_REG(card, ALI_AC97_WRITE));
3043 outl((wcontrol & 0xffff1eff), TRID_REG(card, ALI_AC97_WRITE));
3046 static int
3047 waitforstimertick(struct trident_card *card)
3049 unsigned long chk1, chk2;
3050 unsigned int wcount = 0xffff;
3051 chk1 = inl(TRID_REG(card, ALI_STIMER));
3053 while (1) {
3054 chk2 = inl(TRID_REG(card, ALI_STIMER));
3055 if ((wcount > 0) && chk1 != chk2)
3056 return 1;
3057 if (wcount <= 0)
3058 break;
3059 udelay(50);
3061 return 0;
3064 /* Read AC97 codec registers for ALi*/
3065 static u16
3066 ali_ac97_get(struct trident_card *card, int secondary, u8 reg)
3068 unsigned int address, mask;
3069 unsigned int ncount;
3070 unsigned long aud_reg;
3071 u32 data;
3072 u16 wcontrol;
3073 unsigned long flags;
3075 if (!card)
3076 BUG();
3078 address = ALI_AC97_READ;
3079 if (card->revision == ALI_5451_V02) {
3080 address = ALI_AC97_WRITE;
3082 mask = ALI_AC97_READ_ACTION | ALI_AC97_AUDIO_BUSY;
3083 if (secondary)
3084 mask |= ALI_AC97_SECONDARY;
3086 spin_lock_irqsave(&card->lock, flags);
3088 if (!acquirecodecaccess(card))
3089 printk(KERN_ERR "access codec fail\n");
3091 wcontrol = inw(TRID_REG(card, ALI_AC97_WRITE));
3092 wcontrol &= 0xfe00;
3093 wcontrol |= (0x8000 | reg);
3094 outw(wcontrol, TRID_REG(card, ALI_AC97_WRITE));
3096 data = (mask | (reg & AC97_REG_ADDR));
3098 if (!waitforstimertick(card)) {
3099 printk(KERN_ERR "ali_ac97_read: BIT_CLOCK is dead\n");
3100 goto releasecodec;
3103 udelay(20);
3105 ncount = 10;
3107 while (1) {
3108 if ((inw(TRID_REG(card, ALI_AC97_WRITE)) & ALI_AC97_BUSY_READ)
3109 != 0)
3110 break;
3111 if (ncount <= 0)
3112 break;
3113 if (ncount-- == 1) {
3114 pr_debug("ali_ac97_read :try clear busy flag\n");
3115 aud_reg = inl(TRID_REG(card, ALI_AC97_WRITE));
3116 outl((aud_reg & 0xffff7fff),
3117 TRID_REG(card, ALI_AC97_WRITE));
3119 udelay(10);
3122 data = inl(TRID_REG(card, address));
3124 spin_unlock_irqrestore(&card->lock, flags);
3126 return ((u16) (data >> 16));
3128 releasecodec:
3129 releasecodecaccess(card);
3130 spin_unlock_irqrestore(&card->lock, flags);
3131 printk(KERN_ERR "ali_ac97_read: AC97 CODEC read timed out.\n");
3132 return 0;
3135 /* Write AC97 codec registers for hulei*/
3136 static void
3137 ali_ac97_set(struct trident_card *card, int secondary, u8 reg, u16 val)
3139 unsigned int address, mask;
3140 unsigned int ncount;
3141 u32 data;
3142 u16 wcontrol;
3143 unsigned long flags;
3145 data = ((u32) val) << 16;
3147 if (!card)
3148 BUG();
3150 address = ALI_AC97_WRITE;
3151 mask = ALI_AC97_WRITE_ACTION | ALI_AC97_AUDIO_BUSY;
3152 if (secondary)
3153 mask |= ALI_AC97_SECONDARY;
3154 if (card->revision == ALI_5451_V02)
3155 mask |= ALI_AC97_WRITE_MIXER_REGISTER;
3157 spin_lock_irqsave(&card->lock, flags);
3158 if (!acquirecodecaccess(card))
3159 printk(KERN_ERR "ali_ac97_write: access codec fail\n");
3161 wcontrol = inw(TRID_REG(card, ALI_AC97_WRITE));
3162 wcontrol &= 0xff00;
3163 wcontrol |= (0x8100 | reg); /* bit 8=1: (ali1535 )reserved/ */
3164 /* ali1535+ write */
3165 outl((data | wcontrol), TRID_REG(card, ALI_AC97_WRITE));
3167 if (!waitforstimertick(card)) {
3168 printk(KERN_ERR "BIT_CLOCK is dead\n");
3169 goto releasecodec;
3172 ncount = 10;
3173 while (1) {
3174 wcontrol = inw(TRID_REG(card, ALI_AC97_WRITE));
3175 if (!(wcontrol & 0x8000))
3176 break;
3177 if (ncount <= 0)
3178 break;
3179 if (ncount-- == 1) {
3180 pr_debug("ali_ac97_set :try clear busy flag!!\n");
3181 outw(wcontrol & 0x7fff,
3182 TRID_REG(card, ALI_AC97_WRITE));
3184 udelay(10);
3187 releasecodec:
3188 releasecodecaccess(card);
3189 spin_unlock_irqrestore(&card->lock, flags);
3190 return;
3193 static void
3194 ali_enable_special_channel(struct trident_state *stat)
3196 struct trident_card *card = stat->card;
3197 unsigned long s_channels;
3199 s_channels = inl(TRID_REG(card, ALI_GLOBAL_CONTROL));
3200 s_channels |= (1 << stat->dmabuf.channel->num);
3201 outl(s_channels, TRID_REG(card, ALI_GLOBAL_CONTROL));
3204 static u16
3205 ali_ac97_read(struct ac97_codec *codec, u8 reg)
3207 int id;
3208 u16 data;
3209 struct trident_card *card = NULL;
3211 /* Added by Matt Wu */
3212 if (!codec)
3213 BUG();
3215 card = (struct trident_card *) codec->private_data;
3217 if (!card->mixer_regs_ready)
3218 return ali_ac97_get(card, codec->id, reg);
3221 * FIXME: need to stop this caching some registers
3223 if (codec->id)
3224 id = 1;
3225 else
3226 id = 0;
3228 data = card->mixer_regs[reg / 2][id];
3229 return data;
3232 static void
3233 ali_ac97_write(struct ac97_codec *codec, u8 reg, u16 val)
3235 int id;
3236 struct trident_card *card;
3238 /* Added by Matt Wu */
3239 if (!codec)
3240 BUG();
3242 card = (struct trident_card *) codec->private_data;
3244 if (!card->mixer_regs_ready) {
3245 ali_ac97_set(card, codec->id, reg, val);
3246 return;
3249 if (codec->id)
3250 id = 1;
3251 else
3252 id = 0;
3254 card->mixer_regs[reg / 2][id] = val;
3255 ali_ac97_set(card, codec->id, reg, val);
3259 flag: ALI_SPDIF_OUT_TO_SPDIF_OUT
3260 ALI_PCM_TO_SPDIF_OUT
3263 static void
3264 ali_setup_spdif_out(struct trident_card *card, int flag)
3266 unsigned long spdif;
3267 unsigned char ch;
3269 char temp;
3270 struct pci_dev *pci_dev = NULL;
3272 pci_dev = pci_get_device(PCI_VENDOR_ID_AL, PCI_DEVICE_ID_AL_M1533,
3273 pci_dev);
3274 if (pci_dev == NULL)
3275 return;
3276 pci_read_config_byte(pci_dev, 0x61, &temp);
3277 temp |= 0x40;
3278 pci_write_config_byte(pci_dev, 0x61, temp);
3279 pci_read_config_byte(pci_dev, 0x7d, &temp);
3280 temp |= 0x01;
3281 pci_write_config_byte(pci_dev, 0x7d, temp);
3282 pci_read_config_byte(pci_dev, 0x7e, &temp);
3283 temp &= (~0x20);
3284 temp |= 0x10;
3285 pci_write_config_byte(pci_dev, 0x7e, temp);
3287 pci_dev_put(pci_dev);
3289 ch = inb(TRID_REG(card, ALI_SCTRL));
3290 outb(ch | ALI_SPDIF_OUT_ENABLE, TRID_REG(card, ALI_SCTRL));
3291 ch = inb(TRID_REG(card, ALI_SPDIF_CTRL));
3292 outb(ch & ALI_SPDIF_OUT_CH_STATUS, TRID_REG(card, ALI_SPDIF_CTRL));
3294 if (flag & ALI_SPDIF_OUT_TO_SPDIF_OUT) {
3295 spdif = inw(TRID_REG(card, ALI_GLOBAL_CONTROL));
3296 spdif |= ALI_SPDIF_OUT_CH_ENABLE;
3297 spdif &= ALI_SPDIF_OUT_SEL_SPDIF;
3298 outw(spdif, TRID_REG(card, ALI_GLOBAL_CONTROL));
3299 spdif = inw(TRID_REG(card, ALI_SPDIF_CS));
3300 if (flag & ALI_SPDIF_OUT_NON_PCM)
3301 spdif |= 0x0002;
3302 else
3303 spdif &= (~0x0002);
3304 outw(spdif, TRID_REG(card, ALI_SPDIF_CS));
3305 } else {
3306 spdif = inw(TRID_REG(card, ALI_GLOBAL_CONTROL));
3307 spdif |= ALI_SPDIF_OUT_SEL_PCM;
3308 outw(spdif, TRID_REG(card, ALI_GLOBAL_CONTROL));
3312 static void
3313 ali_disable_special_channel(struct trident_card *card, int ch)
3315 unsigned long sc;
3317 sc = inl(TRID_REG(card, ALI_GLOBAL_CONTROL));
3318 sc &= ~(1 << ch);
3319 outl(sc, TRID_REG(card, ALI_GLOBAL_CONTROL));
3322 static void
3323 ali_disable_spdif_in(struct trident_card *card)
3325 unsigned long spdif;
3327 spdif = inl(TRID_REG(card, ALI_GLOBAL_CONTROL));
3328 spdif &= (~ALI_SPDIF_IN_SUPPORT);
3329 outl(spdif, TRID_REG(card, ALI_GLOBAL_CONTROL));
3331 ali_disable_special_channel(card, ALI_SPDIF_IN_CHANNEL);
3334 static void
3335 ali_setup_spdif_in(struct trident_card *card)
3337 unsigned long spdif;
3339 //Set SPDIF IN Supported
3340 spdif = inl(TRID_REG(card, ALI_GLOBAL_CONTROL));
3341 spdif |= ALI_SPDIF_IN_SUPPORT;
3342 outl(spdif, TRID_REG(card, ALI_GLOBAL_CONTROL));
3344 //Set SPDIF IN Rec
3345 spdif = inl(TRID_REG(card, ALI_GLOBAL_CONTROL));
3346 spdif |= ALI_SPDIF_IN_CH_ENABLE;
3347 outl(spdif, TRID_REG(card, ALI_GLOBAL_CONTROL));
3349 spdif = inb(TRID_REG(card, ALI_SPDIF_CTRL));
3350 spdif |= ALI_SPDIF_IN_CH_STATUS;
3351 outb(spdif, TRID_REG(card, ALI_SPDIF_CTRL));
3353 spdif = inb(TRID_REG(card, ALI_SPDIF_CTRL));
3354 spdif |= ALI_SPDIF_IN_FUNC_ENABLE;
3355 outb(spdif, TRID_REG(card, ALI_SPDIF_CTRL));
3359 static void
3360 ali_delay(struct trident_card *card, int interval)
3362 unsigned long begintimer, currenttimer;
3364 begintimer = inl(TRID_REG(card, ALI_STIMER));
3365 currenttimer = inl(TRID_REG(card, ALI_STIMER));
3367 while (currenttimer < begintimer + interval)
3368 currenttimer = inl(TRID_REG(card, ALI_STIMER));
3371 static void
3372 ali_detect_spdif_rate(struct trident_card *card)
3374 u16 wval = 0;
3375 u16 count = 0;
3376 u8 bval = 0, R1 = 0, R2 = 0;
3378 bval = inb(TRID_REG(card, ALI_SPDIF_CTRL));
3379 bval |= 0x02;
3380 outb(bval, TRID_REG(card, ALI_SPDIF_CTRL));
3382 bval = inb(TRID_REG(card, ALI_SPDIF_CTRL + 1));
3383 bval |= 0x1F;
3384 outb(bval, TRID_REG(card, ALI_SPDIF_CTRL + 1));
3386 while (((R1 < 0x0B) || (R1 > 0x0E)) && (R1 != 0x12) &&
3387 count <= 50000) {
3388 count++;
3390 ali_delay(card, 6);
3392 bval = inb(TRID_REG(card, ALI_SPDIF_CTRL + 1));
3393 R1 = bval & 0x1F;
3396 if (count > 50000) {
3397 printk(KERN_WARNING "trident: Error in "
3398 "ali_detect_spdif_rate!\n");
3399 return;
3402 count = 0;
3404 while (count <= 50000) {
3405 count++;
3407 ali_delay(card, 6);
3409 bval = inb(TRID_REG(card, ALI_SPDIF_CTRL + 1));
3410 R2 = bval & 0x1F;
3412 if (R2 != R1)
3413 R1 = R2;
3414 else
3415 break;
3418 if (count > 50000) {
3419 printk(KERN_WARNING "trident: Error in "
3420 "ali_detect_spdif_rate!\n");
3421 return;
3424 switch (R2) {
3425 case 0x0b:
3426 case 0x0c:
3427 case 0x0d:
3428 case 0x0e:
3429 wval = inw(TRID_REG(card, ALI_SPDIF_CTRL + 2));
3430 wval &= 0xE0F0;
3431 wval |= (u16) 0x09 << 8 | (u16) 0x05;
3432 outw(wval, TRID_REG(card, ALI_SPDIF_CTRL + 2));
3434 bval = inb(TRID_REG(card, ALI_SPDIF_CS + 3)) & 0xF0;
3435 outb(bval | 0x02, TRID_REG(card, ALI_SPDIF_CS + 3));
3436 break;
3438 case 0x12:
3439 wval = inw(TRID_REG(card, ALI_SPDIF_CTRL + 2));
3440 wval &= 0xE0F0;
3441 wval |= (u16) 0x0E << 8 | (u16) 0x08;
3442 outw(wval, TRID_REG(card, ALI_SPDIF_CTRL + 2));
3444 bval = inb(TRID_REG(card, ALI_SPDIF_CS + 3)) & 0xF0;
3445 outb(bval | 0x03, TRID_REG(card, ALI_SPDIF_CS + 3));
3446 break;
3448 default:
3449 break;
3454 static unsigned int
3455 ali_get_spdif_in_rate(struct trident_card *card)
3457 u32 dwRate = 0;
3458 u8 bval = 0;
3460 ali_detect_spdif_rate(card);
3462 bval = inb(TRID_REG(card, ALI_SPDIF_CTRL));
3463 bval &= 0x7F;
3464 bval |= 0x40;
3465 outb(bval, TRID_REG(card, ALI_SPDIF_CTRL));
3467 bval = inb(TRID_REG(card, ALI_SPDIF_CS + 3));
3468 bval &= 0x0F;
3470 switch (bval) {
3471 case 0:
3472 dwRate = 44100;
3473 break;
3474 case 1:
3475 dwRate = 48000;
3476 break;
3477 case 2:
3478 dwRate = 32000;
3479 break;
3480 default:
3481 // Error occurs
3482 break;
3485 return dwRate;
3489 static int
3490 ali_close_multi_channels(void)
3492 char temp = 0;
3493 struct pci_dev *pci_dev = NULL;
3495 pci_dev = pci_get_device(PCI_VENDOR_ID_AL, PCI_DEVICE_ID_AL_M1533,
3496 pci_dev);
3497 if (pci_dev == NULL)
3498 return -1;
3500 pci_read_config_byte(pci_dev, 0x59, &temp);
3501 temp &= ~0x80;
3502 pci_write_config_byte(pci_dev, 0x59, temp);
3504 pci_dev_put(pci_dev);
3506 pci_dev = pci_get_device(PCI_VENDOR_ID_AL, PCI_DEVICE_ID_AL_M7101,
3507 NULL);
3508 if (pci_dev == NULL)
3509 return -1;
3511 pci_read_config_byte(pci_dev, 0xB8, &temp);
3512 temp &= ~0x20;
3513 pci_write_config_byte(pci_dev, 0xB8, temp);
3515 pci_dev_put(pci_dev);
3517 return 0;
3520 static int
3521 ali_setup_multi_channels(struct trident_card *card, int chan_nums)
3523 unsigned long dwValue;
3524 char temp = 0;
3525 struct pci_dev *pci_dev = NULL;
3527 pci_dev = pci_get_device(PCI_VENDOR_ID_AL, PCI_DEVICE_ID_AL_M1533,
3528 pci_dev);
3529 if (pci_dev == NULL)
3530 return -1;
3531 pci_read_config_byte(pci_dev, 0x59, &temp);
3532 temp |= 0x80;
3533 pci_write_config_byte(pci_dev, 0x59, temp);
3535 pci_dev_put(pci_dev);
3537 pci_dev = pci_get_device(PCI_VENDOR_ID_AL, PCI_DEVICE_ID_AL_M7101,
3538 NULL);
3539 if (pci_dev == NULL)
3540 return -1;
3541 pci_read_config_byte(pci_dev, (int) 0xB8, &temp);
3542 temp |= 0x20;
3543 pci_write_config_byte(pci_dev, (int) 0xB8, (u8) temp);
3545 pci_dev_put(pci_dev);
3547 if (chan_nums == 6) {
3548 dwValue = inl(TRID_REG(card, ALI_SCTRL)) | 0x000f0000;
3549 outl(dwValue, TRID_REG(card, ALI_SCTRL));
3550 mdelay(4);
3551 dwValue = inl(TRID_REG(card, ALI_SCTRL));
3552 if (dwValue & 0x2000000) {
3553 ali_ac97_write(card->ac97_codec[0], 0x02, 8080);
3554 ali_ac97_write(card->ac97_codec[0], 0x36, 0);
3555 ali_ac97_write(card->ac97_codec[0], 0x38, 0);
3557 * On a board with a single codec you won't get the
3558 * surround. On other boards configure it.
3560 if (card->ac97_codec[1] != NULL) {
3561 ali_ac97_write(card->ac97_codec[1], 0x36, 0);
3562 ali_ac97_write(card->ac97_codec[1], 0x38, 0);
3563 ali_ac97_write(card->ac97_codec[1], 0x02, 0x0606);
3564 ali_ac97_write(card->ac97_codec[1], 0x18, 0x0303);
3565 ali_ac97_write(card->ac97_codec[1], 0x74, 0x3);
3567 return 1;
3570 return -EINVAL;
3573 static void
3574 ali_free_pcm_channel(struct trident_card *card, unsigned int channel)
3576 int bank;
3578 if (channel > 31)
3579 return;
3581 bank = channel >> 5;
3582 channel = channel & 0x1f;
3584 card->banks[bank].bitmap &= ~(1 << (channel));
3587 static int
3588 ali_allocate_other_states_resources(struct trident_state *state, int chan_nums)
3590 struct trident_card *card = state->card;
3591 struct trident_state *s;
3592 int i, state_count = 0;
3593 struct trident_pcm_bank *bank;
3594 struct trident_channel *channel;
3595 unsigned long num;
3597 bank = &card->banks[BANK_A];
3599 if (chan_nums != 6)
3600 return 0;
3602 for (i = 0; (i < ALI_CHANNELS) && (state_count != 4); i++) {
3603 if (card->states[i])
3604 continue;
3606 num = ali_multi_channels_5_1[state_count];
3607 if (!(bank->bitmap & (1 << num))) {
3608 bank->bitmap |= 1 << num;
3609 channel = &bank->channels[num];
3610 channel->num = num;
3611 } else {
3612 state_count--;
3613 for (; state_count >= 0; state_count--) {
3614 kfree(state->other_states[state_count]);
3615 num = ali_multi_channels_5_1[state_count];
3616 ali_free_pcm_channel(card, num);
3618 return -EBUSY;
3620 s = card->states[i] = kzalloc(sizeof(*state), GFP_KERNEL);
3621 if (!s) {
3622 num = ali_multi_channels_5_1[state_count];
3623 ali_free_pcm_channel(card, num);
3624 state_count--;
3625 for (; state_count >= 0; state_count--) {
3626 num = ali_multi_channels_5_1[state_count];
3627 ali_free_pcm_channel(card, num);
3628 kfree(state->other_states[state_count]);
3630 return -ENOMEM;
3633 s->dmabuf.channel = channel;
3634 s->dmabuf.ossfragshift = s->dmabuf.ossmaxfrags =
3635 s->dmabuf.subdivision = 0;
3636 init_waitqueue_head(&s->dmabuf.wait);
3637 s->magic = card->magic;
3638 s->card = card;
3639 s->virt = i;
3640 ali_enable_special_channel(s);
3641 state->other_states[state_count++] = s;
3644 if (state_count != 4) {
3645 state_count--;
3646 for (; state_count >= 0; state_count--) {
3647 kfree(state->other_states[state_count]);
3648 num = ali_multi_channels_5_1[state_count];
3649 ali_free_pcm_channel(card, num);
3651 return -EBUSY;
3653 return 0;
3656 #ifdef CONFIG_PM
3657 /* save registers for ALi Power Management */
3658 static struct ali_saved_registers {
3659 unsigned long global_regs[ALI_GLOBAL_REGS];
3660 unsigned long channel_regs[ALI_CHANNELS][ALI_CHANNEL_REGS];
3661 unsigned mixer_regs[ALI_MIXER_REGS];
3662 } ali_registers;
3664 static void
3665 ali_save_regs(struct trident_card *card)
3667 unsigned long flags;
3668 int i, j;
3670 spin_lock_irqsave(&card->lock, flags);
3672 ali_registers.global_regs[0x2c] = inl(TRID_REG(card, T4D_MISCINT));
3673 //ali_registers.global_regs[0x20] = inl(TRID_REG(card,T4D_START_A));
3674 ali_registers.global_regs[0x21] = inl(TRID_REG(card, T4D_STOP_A));
3676 //disable all IRQ bits
3677 outl(ALI_DISABLE_ALL_IRQ, TRID_REG(card, T4D_MISCINT));
3679 for (i = 1; i < ALI_MIXER_REGS; i++)
3680 ali_registers.mixer_regs[i] = ali_ac97_read(card->ac97_codec[0],
3681 i * 2);
3683 for (i = 0; i < ALI_GLOBAL_REGS; i++) {
3684 if ((i * 4 == T4D_MISCINT) || (i * 4 == T4D_STOP_A))
3685 continue;
3686 ali_registers.global_regs[i] = inl(TRID_REG(card, i * 4));
3689 for (i = 0; i < ALI_CHANNELS; i++) {
3690 outb(i, TRID_REG(card, T4D_LFO_GC_CIR));
3691 for (j = 0; j < ALI_CHANNEL_REGS; j++)
3692 ali_registers.channel_regs[i][j] = inl(TRID_REG(card,
3693 j * 4 + 0xe0));
3696 //Stop all HW channel
3697 outl(ALI_STOP_ALL_CHANNELS, TRID_REG(card, T4D_STOP_A));
3699 spin_unlock_irqrestore(&card->lock, flags);
3702 static void
3703 ali_restore_regs(struct trident_card *card)
3705 unsigned long flags;
3706 int i, j;
3708 spin_lock_irqsave(&card->lock, flags);
3710 for (i = 1; i < ALI_MIXER_REGS; i++)
3711 ali_ac97_write(card->ac97_codec[0], i * 2,
3712 ali_registers.mixer_regs[i]);
3714 for (i = 0; i < ALI_CHANNELS; i++) {
3715 outb(i, TRID_REG(card, T4D_LFO_GC_CIR));
3716 for (j = 0; j < ALI_CHANNEL_REGS; j++)
3717 outl(ali_registers.channel_regs[i][j],
3718 TRID_REG(card, j * 4 + 0xe0));
3721 for (i = 0; i < ALI_GLOBAL_REGS; i++) {
3722 if ((i * 4 == T4D_MISCINT) || (i * 4 == T4D_STOP_A) ||
3723 (i * 4 == T4D_START_A))
3724 continue;
3725 outl(ali_registers.global_regs[i], TRID_REG(card, i * 4));
3728 //start HW channel
3729 outl(ali_registers.global_regs[0x20], TRID_REG(card, T4D_START_A));
3730 //restore IRQ enable bits
3731 outl(ali_registers.global_regs[0x2c], TRID_REG(card, T4D_MISCINT));
3733 spin_unlock_irqrestore(&card->lock, flags);
3736 static int
3737 trident_suspend(struct pci_dev *dev, pm_message_t unused)
3739 struct trident_card *card = pci_get_drvdata(dev);
3741 if (card->pci_id == PCI_DEVICE_ID_ALI_5451) {
3742 ali_save_regs(card);
3744 return 0;
3747 static int
3748 trident_resume(struct pci_dev *dev)
3750 struct trident_card *card = pci_get_drvdata(dev);
3752 if (card->pci_id == PCI_DEVICE_ID_ALI_5451) {
3753 ali_restore_regs(card);
3755 return 0;
3757 #endif
3759 static struct trident_channel *
3760 ali_alloc_pcm_channel(struct trident_card *card)
3762 struct trident_pcm_bank *bank;
3763 int idx;
3765 bank = &card->banks[BANK_A];
3767 if (inl(TRID_REG(card, ALI_GLOBAL_CONTROL)) &
3768 (ALI_SPDIF_OUT_CH_ENABLE)) {
3769 idx = ALI_SPDIF_OUT_CHANNEL;
3770 if (!(bank->bitmap & (1 << idx))) {
3771 struct trident_channel *channel = &bank->channels[idx];
3772 bank->bitmap |= 1 << idx;
3773 channel->num = idx;
3774 return channel;
3778 for (idx = ALI_PCM_OUT_CHANNEL_FIRST; idx <= ALI_PCM_OUT_CHANNEL_LAST;
3779 idx++) {
3780 if (!(bank->bitmap & (1 << idx))) {
3781 struct trident_channel *channel = &bank->channels[idx];
3782 bank->bitmap |= 1 << idx;
3783 channel->num = idx;
3784 return channel;
3788 /* no more free channels avaliable */
3789 #if 0
3790 printk(KERN_ERR "ali: no more channels available on Bank A.\n");
3791 #endif /* 0 */
3792 return NULL;
3795 static struct trident_channel *
3796 ali_alloc_rec_pcm_channel(struct trident_card *card)
3798 struct trident_pcm_bank *bank;
3799 int idx;
3801 if (inl(TRID_REG(card, ALI_GLOBAL_CONTROL)) & ALI_SPDIF_IN_SUPPORT)
3802 idx = ALI_SPDIF_IN_CHANNEL;
3803 else
3804 idx = ALI_PCM_IN_CHANNEL;
3806 bank = &card->banks[BANK_A];
3808 if (!(bank->bitmap & (1 << idx))) {
3809 struct trident_channel *channel = &bank->channels[idx];
3810 bank->bitmap |= 1 << idx;
3811 channel->num = idx;
3812 return channel;
3815 /* no free recordable channels avaliable */
3816 #if 0
3817 printk(KERN_ERR "ali: no recordable channels available on Bank A.\n");
3818 #endif /* 0 */
3819 return NULL;
3822 static void
3823 ali_set_spdif_out_rate(struct trident_card *card, unsigned int rate)
3825 unsigned char ch_st_sel;
3826 unsigned short status_rate;
3828 switch (rate) {
3829 case 44100:
3830 status_rate = 0;
3831 break;
3832 case 32000:
3833 status_rate = 0x300;
3834 break;
3835 case 48000:
3836 default:
3837 status_rate = 0x200;
3838 break;
3841 /* select spdif_out */
3842 ch_st_sel = inb(TRID_REG(card, ALI_SPDIF_CTRL)) & ALI_SPDIF_OUT_CH_STATUS;
3844 ch_st_sel |= 0x80; /* select right */
3845 outb(ch_st_sel, TRID_REG(card, ALI_SPDIF_CTRL));
3846 outb(status_rate | 0x20, TRID_REG(card, ALI_SPDIF_CS + 2));
3848 ch_st_sel &= (~0x80); /* select left */
3849 outb(ch_st_sel, TRID_REG(card, ALI_SPDIF_CTRL));
3850 outw(status_rate | 0x10, TRID_REG(card, ALI_SPDIF_CS + 2));
3853 static void
3854 ali_address_interrupt(struct trident_card *card)
3856 int i, channel;
3857 struct trident_state *state;
3858 u32 mask, channel_mask;
3860 mask = trident_get_interrupt_mask(card, 0);
3861 for (i = 0; i < NR_HW_CH; i++) {
3862 if ((state = card->states[i]) == NULL)
3863 continue;
3864 channel = state->dmabuf.channel->num;
3865 if ((channel_mask = 1 << channel) & mask) {
3866 mask &= ~channel_mask;
3867 trident_ack_channel_interrupt(card, channel);
3868 udelay(100);
3869 state->dmabuf.update_flag |= ALI_ADDRESS_INT_UPDATE;
3870 trident_update_ptr(state);
3873 if (mask) {
3874 for (i = 0; i < NR_HW_CH; i++) {
3875 if (mask & (1 << i)) {
3876 printk("ali: spurious channel irq %d.\n", i);
3877 trident_ack_channel_interrupt(card, i);
3878 trident_stop_voice(card, i);
3879 trident_disable_voice_irq(card, i);
3885 /* Updating the values of counters of other_states' DMAs without lock
3886 protection is no harm because all DMAs of multi-channels and interrupt
3887 depend on a master state's DMA, and changing the counters of the master
3888 state DMA is protected by a spinlock.
3890 static int
3891 ali_write_5_1(struct trident_state *state, const char __user *buf,
3892 int cnt_for_multi_channel, unsigned int *copy_count,
3893 unsigned int *state_cnt)
3896 struct dmabuf *dmabuf = &state->dmabuf;
3897 struct dmabuf *dmabuf_temp;
3898 const char __user *buffer = buf;
3899 unsigned swptr, other_dma_nums, sample_s;
3900 unsigned int i, loop;
3902 other_dma_nums = 4;
3903 sample_s = sample_size[dmabuf->fmt] >> 1;
3904 swptr = dmabuf->swptr;
3906 if ((i = state->multi_channels_adjust_count) > 0) {
3907 if (i == 1) {
3908 if (copy_from_user(dmabuf->rawbuf + swptr,
3909 buffer, sample_s))
3910 return -EFAULT;
3911 seek_offset(swptr, buffer, cnt_for_multi_channel,
3912 sample_s, *copy_count);
3913 i--;
3914 (*state_cnt) += sample_s;
3915 state->multi_channels_adjust_count++;
3916 } else
3917 i = i - (state->chans_num - other_dma_nums);
3918 for (; (i < other_dma_nums) && (cnt_for_multi_channel > 0); i++) {
3919 dmabuf_temp = &state->other_states[i]->dmabuf;
3920 if (copy_from_user(dmabuf_temp->rawbuf + dmabuf_temp->swptr,
3921 buffer, sample_s))
3922 return -EFAULT;
3923 seek_offset(dmabuf_temp->swptr, buffer, cnt_for_multi_channel,
3924 sample_s, *copy_count);
3926 if (cnt_for_multi_channel == 0)
3927 state->multi_channels_adjust_count += i;
3929 if (cnt_for_multi_channel > 0) {
3930 loop = cnt_for_multi_channel / (state->chans_num * sample_s);
3931 for (i = 0; i < loop; i++) {
3932 if (copy_from_user(dmabuf->rawbuf + swptr, buffer,
3933 sample_s * 2))
3934 return -EFAULT;
3935 seek_offset(swptr, buffer, cnt_for_multi_channel,
3936 sample_s * 2, *copy_count);
3937 (*state_cnt) += (sample_s * 2);
3939 dmabuf_temp = &state->other_states[0]->dmabuf;
3940 if (copy_from_user(dmabuf_temp->rawbuf + dmabuf_temp->swptr,
3941 buffer, sample_s))
3942 return -EFAULT;
3943 seek_offset(dmabuf_temp->swptr, buffer, cnt_for_multi_channel,
3944 sample_s, *copy_count);
3946 dmabuf_temp = &state->other_states[1]->dmabuf;
3947 if (copy_from_user(dmabuf_temp->rawbuf + dmabuf_temp->swptr,
3948 buffer, sample_s))
3949 return -EFAULT;
3950 seek_offset(dmabuf_temp->swptr, buffer, cnt_for_multi_channel,
3951 sample_s, *copy_count);
3953 dmabuf_temp = &state->other_states[2]->dmabuf;
3954 if (copy_from_user(dmabuf_temp->rawbuf + dmabuf_temp->swptr,
3955 buffer, sample_s))
3956 return -EFAULT;
3957 seek_offset(dmabuf_temp->swptr, buffer, cnt_for_multi_channel,
3958 sample_s, *copy_count);
3960 dmabuf_temp = &state->other_states[3]->dmabuf;
3961 if (copy_from_user(dmabuf_temp->rawbuf + dmabuf_temp->swptr,
3962 buffer, sample_s))
3963 return -EFAULT;
3964 seek_offset(dmabuf_temp->swptr, buffer, cnt_for_multi_channel,
3965 sample_s, *copy_count);
3968 if (cnt_for_multi_channel > 0) {
3969 state->multi_channels_adjust_count = cnt_for_multi_channel / sample_s;
3971 if (copy_from_user(dmabuf->rawbuf + swptr, buffer, sample_s))
3972 return -EFAULT;
3973 seek_offset(swptr, buffer, cnt_for_multi_channel,
3974 sample_s, *copy_count);
3975 (*state_cnt) += sample_s;
3977 if (cnt_for_multi_channel > 0) {
3978 if (copy_from_user(dmabuf->rawbuf + swptr,
3979 buffer, sample_s))
3980 return -EFAULT;
3981 seek_offset(swptr, buffer, cnt_for_multi_channel,
3982 sample_s, *copy_count);
3983 (*state_cnt) += sample_s;
3985 if (cnt_for_multi_channel > 0) {
3986 int diff = state->chans_num - other_dma_nums;
3987 loop = state->multi_channels_adjust_count - diff;
3988 for (i = 0; i < loop; i++) {
3989 dmabuf_temp = &state->other_states[i]->dmabuf;
3990 if (copy_from_user(dmabuf_temp->rawbuf +
3991 dmabuf_temp->swptr,
3992 buffer, sample_s))
3993 return -EFAULT;
3994 seek_offset(dmabuf_temp->swptr, buffer,
3995 cnt_for_multi_channel,
3996 sample_s, *copy_count);
4000 } else
4001 state->multi_channels_adjust_count = 0;
4003 for (i = 0; i < other_dma_nums; i++) {
4004 dmabuf_temp = &state->other_states[i]->dmabuf;
4005 dmabuf_temp->swptr = dmabuf_temp->swptr % dmabuf_temp->dmasize;
4007 return *state_cnt;
4010 static void
4011 ali_free_other_states_resources(struct trident_state *state)
4013 int i;
4014 struct trident_card *card = state->card;
4015 struct trident_state *s;
4016 unsigned other_states_count;
4018 other_states_count = state->chans_num - 2; /* except PCM L/R channels */
4019 for (i = 0; i < other_states_count; i++) {
4020 s = state->other_states[i];
4021 dealloc_dmabuf(&s->dmabuf, card->pci_dev);
4022 ali_disable_special_channel(s->card, s->dmabuf.channel->num);
4023 state->card->free_pcm_channel(s->card, s->dmabuf.channel->num);
4024 card->states[s->virt] = NULL;
4025 kfree(s);
4029 static struct proc_dir_entry *res;
4031 static int
4032 ali_write_proc(struct file *file, const char __user *buffer, unsigned long count, void *data)
4034 struct trident_card *card = (struct trident_card *) data;
4035 unsigned long flags;
4036 char c;
4038 if (count < 0)
4039 return -EINVAL;
4040 if (count == 0)
4041 return 0;
4042 if (get_user(c, buffer))
4043 return -EFAULT;
4045 spin_lock_irqsave(&card->lock, flags);
4046 switch (c) {
4047 case '0':
4048 ali_setup_spdif_out(card, ALI_PCM_TO_SPDIF_OUT);
4049 ali_disable_special_channel(card, ALI_SPDIF_OUT_CHANNEL);
4050 break;
4051 case '1':
4052 ali_setup_spdif_out(card, ALI_SPDIF_OUT_TO_SPDIF_OUT |
4053 ALI_SPDIF_OUT_PCM);
4054 break;
4055 case '2':
4056 ali_setup_spdif_out(card, ALI_SPDIF_OUT_TO_SPDIF_OUT |
4057 ALI_SPDIF_OUT_NON_PCM);
4058 break;
4059 case '3':
4060 ali_disable_spdif_in(card); //default
4061 break;
4062 case '4':
4063 ali_setup_spdif_in(card);
4064 break;
4066 spin_unlock_irqrestore(&card->lock, flags);
4068 return count;
4071 /* OSS /dev/mixer file operation methods */
4072 static int
4073 trident_open_mixdev(struct inode *inode, struct file *file)
4075 int i = 0;
4076 int minor = iminor(inode);
4077 struct trident_card *card = devs;
4079 for (card = devs; card != NULL; card = card->next)
4080 for (i = 0; i < NR_AC97; i++)
4081 if (card->ac97_codec[i] != NULL &&
4082 card->ac97_codec[i]->dev_mixer == minor)
4083 goto match;
4085 if (!card) {
4086 return -ENODEV;
4088 match:
4089 file->private_data = card->ac97_codec[i];
4091 return nonseekable_open(inode, file);
4094 static int
4095 trident_ioctl_mixdev(struct inode *inode, struct file *file, unsigned int cmd,
4096 unsigned long arg)
4098 struct ac97_codec *codec = (struct ac97_codec *) file->private_data;
4100 return codec->mixer_ioctl(codec, cmd, arg);
4103 static /*const */ struct file_operations trident_mixer_fops = {
4104 .owner = THIS_MODULE,
4105 .llseek = no_llseek,
4106 .ioctl = trident_ioctl_mixdev,
4107 .open = trident_open_mixdev,
4110 static int
4111 ali_reset_5451(struct trident_card *card)
4113 struct pci_dev *pci_dev = NULL;
4114 unsigned int dwVal;
4115 unsigned short wCount, wReg;
4117 pci_dev = pci_get_device(PCI_VENDOR_ID_AL, PCI_DEVICE_ID_AL_M1533,
4118 pci_dev);
4119 if (pci_dev == NULL)
4120 return -1;
4122 pci_read_config_dword(pci_dev, 0x7c, &dwVal);
4123 pci_write_config_dword(pci_dev, 0x7c, dwVal | 0x08000000);
4124 udelay(5000);
4125 pci_read_config_dword(pci_dev, 0x7c, &dwVal);
4126 pci_write_config_dword(pci_dev, 0x7c, dwVal & 0xf7ffffff);
4127 udelay(5000);
4128 pci_dev_put(pci_dev);
4130 pci_dev = card->pci_dev;
4131 if (pci_dev == NULL)
4132 return -1;
4134 pci_read_config_dword(pci_dev, 0x44, &dwVal);
4135 pci_write_config_dword(pci_dev, 0x44, dwVal | 0x000c0000);
4136 udelay(500);
4137 pci_read_config_dword(pci_dev, 0x44, &dwVal);
4138 pci_write_config_dword(pci_dev, 0x44, dwVal & 0xfffbffff);
4139 udelay(5000);
4141 /* TODO: recognize if we have a PM capable codec and only do this */
4142 /* if the codec is PM capable */
4143 wCount = 2000;
4144 while (wCount--) {
4145 wReg = ali_ac97_get(card, 0, AC97_POWER_CONTROL);
4146 if ((wReg & 0x000f) == 0x000f)
4147 return 0;
4148 udelay(5000);
4150 /* This is non fatal if you have a non PM capable codec.. */
4151 return 0;
4154 /* AC97 codec initialisation. */
4155 static int __devinit
4156 trident_ac97_init(struct trident_card *card)
4158 int num_ac97 = 0;
4159 unsigned long ready_2nd = 0;
4160 struct ac97_codec *codec;
4161 int i = 0;
4163 /* initialize controller side of AC link, and find out if secondary codes
4164 really exist */
4165 switch (card->pci_id) {
4166 case PCI_DEVICE_ID_ALI_5451:
4167 if (ali_reset_5451(card)) {
4168 printk(KERN_ERR "trident_ac97_init: error "
4169 "resetting 5451.\n");
4170 return -1;
4172 outl(0x80000001, TRID_REG(card, ALI_GLOBAL_CONTROL));
4173 outl(0x00000000, TRID_REG(card, T4D_AINTEN_A));
4174 outl(0xffffffff, TRID_REG(card, T4D_AINT_A));
4175 outl(0x00000000, TRID_REG(card, T4D_MUSICVOL_WAVEVOL));
4176 outb(0x10, TRID_REG(card, ALI_MPUR2));
4177 ready_2nd = inl(TRID_REG(card, ALI_SCTRL));
4178 ready_2nd &= 0x3fff;
4179 outl(ready_2nd | PCMOUT | 0x8000, TRID_REG(card, ALI_SCTRL));
4180 ready_2nd = inl(TRID_REG(card, ALI_SCTRL));
4181 ready_2nd &= SI_AC97_SECONDARY_READY;
4182 if (card->revision < ALI_5451_V02)
4183 ready_2nd = 0;
4184 break;
4185 case PCI_DEVICE_ID_SI_7018:
4186 /* disable AC97 GPIO interrupt */
4187 outl(0x00, TRID_REG(card, SI_AC97_GPIO));
4188 /* when power up the AC link is in cold reset mode so stop it */
4189 outl(PCMOUT | SURROUT | CENTEROUT | LFEOUT | SECONDARY_ID,
4190 TRID_REG(card, SI_SERIAL_INTF_CTRL));
4191 /* it take a long time to recover from a cold reset */
4192 /* (especially when you have more than one codec) */
4193 udelay(2000);
4194 ready_2nd = inl(TRID_REG(card, SI_SERIAL_INTF_CTRL));
4195 ready_2nd &= SI_AC97_SECONDARY_READY;
4196 break;
4197 case PCI_DEVICE_ID_TRIDENT_4DWAVE_DX:
4198 /* playback on */
4199 outl(DX_AC97_PLAYBACK, TRID_REG(card, DX_ACR2_AC97_COM_STAT));
4200 break;
4201 case PCI_DEVICE_ID_TRIDENT_4DWAVE_NX:
4202 /* enable AC97 Output Slot 3,4 (PCM Left/Right Playback) */
4203 outl(NX_AC97_PCM_OUTPUT, TRID_REG(card, NX_ACR0_AC97_COM_STAT));
4204 ready_2nd = inl(TRID_REG(card, NX_ACR0_AC97_COM_STAT));
4205 ready_2nd &= NX_AC97_SECONDARY_READY;
4206 break;
4207 case PCI_DEVICE_ID_INTERG_5050:
4208 /* disable AC97 GPIO interrupt */
4209 outl(0x00, TRID_REG(card, SI_AC97_GPIO));
4210 /* when power up, the AC link is in cold reset mode, so stop it */
4211 outl(PCMOUT | SURROUT | CENTEROUT | LFEOUT,
4212 TRID_REG(card, SI_SERIAL_INTF_CTRL));
4213 /* it take a long time to recover from a cold reset (especially */
4214 /* when you have more than one codec) */
4215 udelay(2000);
4216 ready_2nd = inl(TRID_REG(card, SI_SERIAL_INTF_CTRL));
4217 ready_2nd &= SI_AC97_SECONDARY_READY;
4218 break;
4221 for (num_ac97 = 0; num_ac97 < NR_AC97; num_ac97++) {
4222 if ((codec = ac97_alloc_codec()) == NULL)
4223 return -ENOMEM;
4225 /* initialize some basic codec information, other fields */
4226 /* will be filled in ac97_probe_codec */
4227 codec->private_data = card;
4228 codec->id = num_ac97;
4230 if (card->pci_id == PCI_DEVICE_ID_ALI_5451) {
4231 codec->codec_read = ali_ac97_read;
4232 codec->codec_write = ali_ac97_write;
4233 } else {
4234 codec->codec_read = trident_ac97_get;
4235 codec->codec_write = trident_ac97_set;
4238 if (ac97_probe_codec(codec) == 0)
4239 break;
4241 codec->dev_mixer = register_sound_mixer(&trident_mixer_fops, -1);
4242 if (codec->dev_mixer < 0) {
4243 printk(KERN_ERR "trident: couldn't register mixer!\n");
4244 ac97_release_codec(codec);
4245 break;
4248 card->ac97_codec[num_ac97] = codec;
4250 /* if there is no secondary codec at all, don't probe any more */
4251 if (!ready_2nd)
4252 break;
4255 if (card->pci_id == PCI_DEVICE_ID_ALI_5451) {
4256 for (num_ac97 = 0; num_ac97 < NR_AC97; num_ac97++) {
4257 if (card->ac97_codec[num_ac97] == NULL)
4258 break;
4259 for (i = 0; i < 64; i++) {
4260 u16 reg = ali_ac97_get(card, num_ac97, i * 2);
4261 card->mixer_regs[i][num_ac97] = reg;
4265 return num_ac97 + 1;
4268 #ifdef SUPPORT_JOYSTICK
4269 /* Gameport functions for the cards ADC gameport */
4271 static unsigned char trident_game_read(struct gameport *gameport)
4273 struct trident_card *card = gameport->port_data;
4275 return inb(TRID_REG(card, T4D_GAME_LEG));
4278 static void trident_game_trigger(struct gameport *gameport)
4280 struct trident_card *card = gameport->port_data;
4282 outb(0xff, TRID_REG(card, T4D_GAME_LEG));
4285 static int trident_game_cooked_read(struct gameport *gameport,
4286 int *axes, int *buttons)
4288 struct trident_card *card = gameport->port_data;
4289 int i;
4291 *buttons = (~inb(TRID_REG(card, T4D_GAME_LEG)) >> 4) & 0xf;
4293 for (i = 0; i < 4; i++) {
4294 axes[i] = inw(TRID_REG(card, T4D_GAME_AXD) + i * sizeof (u16));
4295 if (axes[i] == 0xffff)
4296 axes[i] = -1;
4299 return 0;
4302 static int trident_game_open(struct gameport *gameport, int mode)
4304 struct trident_card *card = gameport->port_data;
4306 switch (mode) {
4307 case GAMEPORT_MODE_COOKED:
4308 outb(0x80, TRID_REG(card, T4D_GAME_CR));
4309 msleep(20);
4310 return 0;
4311 case GAMEPORT_MODE_RAW:
4312 outb(0x00, TRID_REG(card, T4D_GAME_CR));
4313 return 0;
4314 default:
4315 return -1;
4318 return 0;
4321 static int __devinit trident_register_gameport(struct trident_card *card)
4323 struct gameport *gp;
4325 card->gameport = gp = gameport_allocate_port();
4326 if (!gp) {
4327 printk(KERN_ERR "trident: can not allocate memory for gameport\n");
4328 return -ENOMEM;
4331 gameport_set_name(gp, "Trident 4DWave");
4332 gameport_set_phys(gp, "pci%s/gameport0", pci_name(card->pci_dev));
4333 gp->read = trident_game_read;
4334 gp->trigger = trident_game_trigger;
4335 gp->cooked_read = trident_game_cooked_read;
4336 gp->open = trident_game_open;
4337 gp->fuzz = 64;
4338 gp->port_data = card;
4340 gameport_register_port(gp);
4342 return 0;
4345 static inline void trident_unregister_gameport(struct trident_card *card)
4347 if (card->gameport)
4348 gameport_unregister_port(card->gameport);
4351 #else
4352 static inline int trident_register_gameport(struct trident_card *card) { return -ENOSYS; }
4353 static inline void trident_unregister_gameport(struct trident_card *card) { }
4354 #endif /* SUPPORT_JOYSTICK */
4356 /* install the driver, we do not allocate hardware channel nor DMA buffer */
4357 /* now, they are defered until "ACCESS" time (in prog_dmabuf called by */
4358 /* open/read/write/ioctl/mmap) */
4359 static int __devinit
4360 trident_probe(struct pci_dev *pci_dev, const struct pci_device_id *pci_id)
4362 unsigned long iobase;
4363 struct trident_card *card;
4364 u8 bits;
4365 u8 revision;
4366 int i = 0;
4367 u16 temp;
4368 struct pci_dev *pci_dev_m1533 = NULL;
4369 int rc = -ENODEV;
4370 u64 dma_mask;
4372 if (pci_enable_device(pci_dev))
4373 goto out;
4375 if (pci_dev->device == PCI_DEVICE_ID_ALI_5451)
4376 dma_mask = ALI_DMA_MASK;
4377 else
4378 dma_mask = TRIDENT_DMA_MASK;
4379 if (pci_set_dma_mask(pci_dev, dma_mask)) {
4380 printk(KERN_ERR "trident: architecture does not support"
4381 " %s PCI busmaster DMA\n",
4382 pci_dev->device == PCI_DEVICE_ID_ALI_5451 ?
4383 "32-bit" : "30-bit");
4384 goto out;
4386 pci_read_config_byte(pci_dev, PCI_CLASS_REVISION, &revision);
4388 if (pci_id->device == PCI_DEVICE_ID_INTERG_5050)
4389 iobase = pci_resource_start(pci_dev, 1);
4390 else
4391 iobase = pci_resource_start(pci_dev, 0);
4393 if (!request_region(iobase, 256, card_names[pci_id->driver_data])) {
4394 printk(KERN_ERR "trident: can't allocate I/O space at "
4395 "0x%4.4lx\n", iobase);
4396 goto out;
4399 rc = -ENOMEM;
4400 if ((card = kzalloc(sizeof(*card), GFP_KERNEL)) == NULL) {
4401 printk(KERN_ERR "trident: out of memory\n");
4402 goto out_release_region;
4405 init_timer(&card->timer);
4406 card->iobase = iobase;
4407 card->pci_dev = pci_dev_get(pci_dev);
4408 card->pci_id = pci_id->device;
4409 card->revision = revision;
4410 card->irq = pci_dev->irq;
4411 card->next = devs;
4412 card->magic = TRIDENT_CARD_MAGIC;
4413 card->banks[BANK_A].addresses = &bank_a_addrs;
4414 card->banks[BANK_A].bitmap = 0UL;
4415 card->banks[BANK_B].addresses = &bank_b_addrs;
4416 card->banks[BANK_B].bitmap = 0UL;
4418 mutex_init(&card->open_mutex);
4419 spin_lock_init(&card->lock);
4420 init_timer(&card->timer);
4422 devs = card;
4424 pci_set_master(pci_dev);
4426 printk(KERN_INFO "trident: %s found at IO 0x%04lx, IRQ %d\n",
4427 card_names[pci_id->driver_data], card->iobase, card->irq);
4429 if (card->pci_id == PCI_DEVICE_ID_ALI_5451) {
4430 /* ALi channel Management */
4431 card->alloc_pcm_channel = ali_alloc_pcm_channel;
4432 card->alloc_rec_pcm_channel = ali_alloc_rec_pcm_channel;
4433 card->free_pcm_channel = ali_free_pcm_channel;
4435 card->address_interrupt = ali_address_interrupt;
4437 /* Added by Matt Wu 01-05-2001 for spdif in */
4438 card->multi_channel_use_count = 0;
4439 card->rec_channel_use_count = 0;
4441 /* ALi SPDIF OUT function */
4442 if (card->revision == ALI_5451_V02) {
4443 ali_setup_spdif_out(card, ALI_PCM_TO_SPDIF_OUT);
4444 res = create_proc_entry("ALi5451", 0, NULL);
4445 if (res) {
4446 res->write_proc = ali_write_proc;
4447 res->data = card;
4451 /* Add H/W Volume Control By Matt Wu Jul. 06, 2001 */
4452 card->hwvolctl = 0;
4453 pci_dev_m1533 = pci_find_device(PCI_VENDOR_ID_AL,
4454 PCI_DEVICE_ID_AL_M1533,
4455 pci_dev_m1533);
4456 rc = -ENODEV;
4457 if (pci_dev_m1533 == NULL)
4458 goto out_proc_fs;
4459 pci_read_config_byte(pci_dev_m1533, 0x63, &bits);
4460 if (bits & (1 << 5))
4461 card->hwvolctl = 1;
4462 if (card->hwvolctl) {
4463 /* Clear m1533 pci cfg 78h bit 30 to zero, which makes
4464 GPIO11/12/13 work as ACGP_UP/DOWN/MUTE. */
4465 pci_read_config_byte(pci_dev_m1533, 0x7b, &bits);
4466 bits &= 0xbf; /*clear bit 6 */
4467 pci_write_config_byte(pci_dev_m1533, 0x7b, bits);
4469 } else if (card->pci_id == PCI_DEVICE_ID_INTERG_5050) {
4470 card->alloc_pcm_channel = cyber_alloc_pcm_channel;
4471 card->alloc_rec_pcm_channel = cyber_alloc_pcm_channel;
4472 card->free_pcm_channel = cyber_free_pcm_channel;
4473 card->address_interrupt = cyber_address_interrupt;
4474 cyber_init_ritual(card);
4475 } else {
4476 card->alloc_pcm_channel = trident_alloc_pcm_channel;
4477 card->alloc_rec_pcm_channel = trident_alloc_pcm_channel;
4478 card->free_pcm_channel = trident_free_pcm_channel;
4479 card->address_interrupt = trident_address_interrupt;
4482 /* claim our irq */
4483 rc = -ENODEV;
4484 if (request_irq(card->irq, &trident_interrupt, IRQF_SHARED,
4485 card_names[pci_id->driver_data], card)) {
4486 printk(KERN_ERR "trident: unable to allocate irq %d\n",
4487 card->irq);
4488 goto out_proc_fs;
4490 /* register /dev/dsp */
4491 if ((card->dev_audio = register_sound_dsp(&trident_audio_fops, -1)) < 0) {
4492 printk(KERN_ERR "trident: couldn't register DSP device!\n");
4493 goto out_free_irq;
4495 card->mixer_regs_ready = 0;
4496 /* initialize AC97 codec and register /dev/mixer */
4497 if (trident_ac97_init(card) <= 0) {
4498 /* unregister audio devices */
4499 for (i = 0; i < NR_AC97; i++) {
4500 if (card->ac97_codec[i] != NULL) {
4501 struct ac97_codec* codec = card->ac97_codec[i];
4502 unregister_sound_mixer(codec->dev_mixer);
4503 ac97_release_codec(codec);
4506 goto out_unregister_sound_dsp;
4508 card->mixer_regs_ready = 1;
4509 outl(0x00, TRID_REG(card, T4D_MUSICVOL_WAVEVOL));
4511 if (card->pci_id == PCI_DEVICE_ID_ALI_5451) {
4512 /* Add H/W Volume Control By Matt Wu Jul. 06, 2001 */
4513 if (card->hwvolctl) {
4514 /* Enable GPIO IRQ (MISCINT bit 18h) */
4515 temp = inw(TRID_REG(card, T4D_MISCINT + 2));
4516 temp |= 0x0004;
4517 outw(temp, TRID_REG(card, T4D_MISCINT + 2));
4519 /* Enable H/W Volume Control GLOVAL CONTROL bit 0 */
4520 temp = inw(TRID_REG(card, ALI_GLOBAL_CONTROL));
4521 temp |= 0x0001;
4522 outw(temp, TRID_REG(card, ALI_GLOBAL_CONTROL));
4525 if (card->revision == ALI_5451_V02)
4526 ali_close_multi_channels();
4527 /* edited by HMSEO for GT sound */
4528 #if defined(CONFIG_ALPHA_NAUTILUS) || defined(CONFIG_ALPHA_GENERIC)
4530 u16 ac97_data;
4531 extern struct hwrpb_struct *hwrpb;
4533 if ((hwrpb->sys_type) == 201) {
4534 printk(KERN_INFO "trident: Running on Alpha system "
4535 "type Nautilus\n");
4536 ac97_data = ali_ac97_get(card, 0, AC97_POWER_CONTROL);
4537 ali_ac97_set(card, 0, AC97_POWER_CONTROL,
4538 ac97_data | ALI_EAPD_POWER_DOWN);
4541 #endif /* CONFIG_ALPHA_NAUTILUS || CONFIG_ALPHA_GENERIC */
4542 /* edited by HMSEO for GT sound */
4544 rc = 0;
4545 pci_set_drvdata(pci_dev, card);
4547 /* Enable Address Engine Interrupts */
4548 trident_enable_loop_interrupts(card);
4550 /* Register gameport */
4551 trident_register_gameport(card);
4553 out:
4554 return rc;
4556 out_unregister_sound_dsp:
4557 unregister_sound_dsp(card->dev_audio);
4558 out_free_irq:
4559 free_irq(card->irq, card);
4560 out_proc_fs:
4561 pci_dev_put(card->pci_dev);
4562 if (res) {
4563 remove_proc_entry("ALi5451", NULL);
4564 res = NULL;
4566 kfree(card);
4567 devs = NULL;
4568 out_release_region:
4569 release_region(iobase, 256);
4570 return rc;
4573 static void __devexit
4574 trident_remove(struct pci_dev *pci_dev)
4576 int i;
4577 struct trident_card *card = pci_get_drvdata(pci_dev);
4580 * Kill running timers before unload. We can't have them
4581 * going off after rmmod!
4583 if (card->hwvolctl)
4584 del_timer_sync(&card->timer);
4586 /* ALi S/PDIF and Power Management */
4587 if (card->pci_id == PCI_DEVICE_ID_ALI_5451) {
4588 ali_setup_spdif_out(card, ALI_PCM_TO_SPDIF_OUT);
4589 ali_disable_special_channel(card, ALI_SPDIF_OUT_CHANNEL);
4590 ali_disable_spdif_in(card);
4591 remove_proc_entry("ALi5451", NULL);
4594 /* Unregister gameport */
4595 trident_unregister_gameport(card);
4597 /* Kill interrupts, and SP/DIF */
4598 trident_disable_loop_interrupts(card);
4600 /* free hardware resources */
4601 free_irq(card->irq, card);
4602 release_region(card->iobase, 256);
4604 /* unregister audio devices */
4605 for (i = 0; i < NR_AC97; i++)
4606 if (card->ac97_codec[i] != NULL) {
4607 unregister_sound_mixer(card->ac97_codec[i]->dev_mixer);
4608 ac97_release_codec(card->ac97_codec[i]);
4610 unregister_sound_dsp(card->dev_audio);
4612 pci_set_drvdata(pci_dev, NULL);
4613 pci_dev_put(card->pci_dev);
4614 kfree(card);
4617 MODULE_AUTHOR("Alan Cox, Aaron Holtzman, Ollie Lho, Ching Ling Lee, Muli Ben-Yehuda");
4618 MODULE_DESCRIPTION("Trident 4DWave/SiS 7018/ALi 5451 and Tvia/IGST CyberPro5050 PCI "
4619 "Audio Driver");
4620 MODULE_LICENSE("GPL");
4622 #define TRIDENT_MODULE_NAME "trident"
4624 static struct pci_driver trident_pci_driver = {
4625 .name = TRIDENT_MODULE_NAME,
4626 .id_table = trident_pci_tbl,
4627 .probe = trident_probe,
4628 .remove = __devexit_p(trident_remove),
4629 #ifdef CONFIG_PM
4630 .suspend = trident_suspend,
4631 .resume = trident_resume
4632 #endif
4635 static int __init
4636 trident_init_module(void)
4638 printk(KERN_INFO "Trident 4DWave/SiS 7018/ALi 5451,Tvia CyberPro "
4639 "5050 PCI Audio, version " DRIVER_VERSION ", " __TIME__ " "
4640 __DATE__ "\n");
4642 return pci_register_driver(&trident_pci_driver);
4645 static void __exit
4646 trident_cleanup_module(void)
4648 pci_unregister_driver(&trident_pci_driver);
4651 module_init(trident_init_module);
4652 module_exit(trident_cleanup_module);