blob: a21c663e7e12564a334b2de16957a99cb95fd21a [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001/*
2 * OSS driver for Linux 2.[46].x for
3 *
4 * Trident 4D-Wave
5 * SiS 7018
6 * ALi 5451
7 * Tvia/IGST CyberPro 5050
8 *
9 * Driver: Alan Cox <alan@redhat.com>
10 *
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>
15 *
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>
23 *
24 *
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.
29 *
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.
34 *
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.
38 *
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
181 *
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)
190 *
191 * Lock order (high->low)
192 * lock - hardware lock
193 * open_sem - guard opens
194 * sem - guard dmabuf, write re-entry etc
195 */
196
197#include <linux/config.h>
198#include <linux/module.h>
199#include <linux/string.h>
200#include <linux/ctype.h>
201#include <linux/ioport.h>
202#include <linux/sched.h>
203#include <linux/delay.h>
204#include <linux/sound.h>
205#include <linux/slab.h>
206#include <linux/soundcard.h>
207#include <linux/pci.h>
208#include <linux/init.h>
209#include <linux/poll.h>
210#include <linux/spinlock.h>
211#include <linux/smp_lock.h>
212#include <linux/ac97_codec.h>
213#include <linux/bitops.h>
214#include <linux/proc_fs.h>
215#include <linux/interrupt.h>
216#include <linux/pm.h>
217#include <linux/gameport.h>
218#include <linux/kernel.h>
219#include <asm/uaccess.h>
220#include <asm/io.h>
221#include <asm/dma.h>
222
223#if defined(CONFIG_ALPHA_NAUTILUS) || defined(CONFIG_ALPHA_GENERIC)
224#include <asm/hwrpb.h>
225#endif
226
227#include "trident.h"
228
229#define DRIVER_VERSION "0.14.10j-2.6"
230
Dmitry Torokhov263aba72005-06-01 02:38:37 -0500231#if defined(CONFIG_GAMEPORT) || (defined(MODULE) && defined(CONFIG_GAMEPORT_MODULE))
232#define SUPPORT_JOYSTICK 1
233#endif
234
Linus Torvalds1da177e2005-04-16 15:20:36 -0700235/* magic numbers to protect our data structures */
236#define TRIDENT_CARD_MAGIC 0x5072696E /* "Prin" */
237#define TRIDENT_STATE_MAGIC 0x63657373 /* "cess" */
238
239#define TRIDENT_DMA_MASK 0x3fffffff /* DMA buffer mask for pci_alloc_consist */
240#define ALI_DMA_MASK 0x7fffffff /* ALI Tridents have 31-bit DMA. Wow. */
241
242#define NR_HW_CH 32
243
244/* maximum number of AC97 codecs connected, AC97 2.0 defined 4, but 7018 and 4D-NX only
245 have 2 SDATA_IN lines (currently) */
246#define NR_AC97 2
247
248/* minor number of /dev/swmodem (temporary, experimental) */
249#define SND_DEV_SWMODEM 7
250
251static const unsigned ali_multi_channels_5_1[] = {
252 /*ALI_SURR_LEFT_CHANNEL, ALI_SURR_RIGHT_CHANNEL, */
253 ALI_CENTER_CHANNEL,
254 ALI_LEF_CHANNEL,
255 ALI_SURR_LEFT_CHANNEL,
256 ALI_SURR_RIGHT_CHANNEL
257};
258
259static const unsigned sample_size[] = { 1, 2, 2, 4 };
260static const unsigned sample_shift[] = { 0, 1, 1, 2 };
261
262static const char invalid_magic[] = KERN_CRIT "trident: invalid magic value in %s\n";
263
264enum {
265 TRIDENT_4D_DX = 0,
266 TRIDENT_4D_NX,
267 SIS_7018,
268 ALI_5451,
269 CYBER5050
270};
271
272static char *card_names[] = {
273 "Trident 4DWave DX",
274 "Trident 4DWave NX",
275 "SiS 7018 PCI Audio",
276 "ALi Audio Accelerator",
277 "Tvia/IGST CyberPro 5050"
278};
279
280static struct pci_device_id trident_pci_tbl[] = {
Jon Masonc2aeacd2006-01-18 17:42:25 -0800281 {PCI_DEVICE(PCI_VENDOR_ID_TRIDENT, PCI_DEVICE_ID_TRIDENT_4DWAVE_DX),
282 PCI_CLASS_MULTIMEDIA_AUDIO << 8, 0xffff00, TRIDENT_4D_DX},
283 {PCI_DEVICE(PCI_VENDOR_ID_TRIDENT, PCI_DEVICE_ID_TRIDENT_4DWAVE_NX),
284 0, 0, TRIDENT_4D_NX},
285 {PCI_DEVICE(PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_7018), 0, 0, SIS_7018},
286 {PCI_DEVICE(PCI_VENDOR_ID_ALI, PCI_DEVICE_ID_ALI_5451), 0, 0, ALI_5451},
287 {PCI_DEVICE(PCI_VENDOR_ID_INTERG, PCI_DEVICE_ID_INTERG_5050),
288 0, 0, CYBER5050},
Linus Torvalds1da177e2005-04-16 15:20:36 -0700289 {0,}
290};
291
292MODULE_DEVICE_TABLE(pci, trident_pci_tbl);
293
294/* "software" or virtual channel, an instance of opened /dev/dsp */
295struct trident_state {
296 unsigned int magic;
297 struct trident_card *card; /* Card info */
298
299 /* file mode */
300 mode_t open_mode;
301
302 /* virtual channel number */
303 int virt;
304
305 struct dmabuf {
306 /* wave sample stuff */
307 unsigned int rate;
308 unsigned char fmt, enable;
309
310 /* hardware channel */
311 struct trident_channel *channel;
312
313 /* OSS buffer management stuff */
314 void *rawbuf;
315 dma_addr_t dma_handle;
316 unsigned buforder;
317 unsigned numfrag;
318 unsigned fragshift;
319
320 /* our buffer acts like a circular ring */
321 unsigned hwptr; /* where dma last started, updated by update_ptr */
322 unsigned swptr; /* where driver last clear/filled, updated by read/write */
323 int count; /* bytes to be comsumed or been generated by dma machine */
324 unsigned total_bytes; /* total bytes dmaed by hardware */
325
326 unsigned error; /* number of over/underruns */
327 /* put process on wait queue when no more space in buffer */
328 wait_queue_head_t wait;
329
330 /* redundant, but makes calculations easier */
331 unsigned fragsize;
332 unsigned dmasize;
333 unsigned fragsamples;
334
335 /* OSS stuff */
336 unsigned mapped:1;
337 unsigned ready:1;
338 unsigned endcleared:1;
339 unsigned update_flag;
340 unsigned ossfragshift;
341 int ossmaxfrags;
342 unsigned subdivision;
343
344 } dmabuf;
345
346 /* 5.1 channels */
347 struct trident_state *other_states[4];
348 int multi_channels_adjust_count;
349 unsigned chans_num;
350 unsigned long fmt_flag;
351 /* Guard against mmap/write/read races */
352 struct semaphore sem;
353
354};
355
356/* hardware channels */
357struct trident_channel {
358 int num; /* channel number */
359 u32 lba; /* Loop Begine Address, where dma buffer starts */
360 u32 eso; /* End Sample Offset, wehre dma buffer ends */
361 /* (in the unit of samples) */
362 u32 delta; /* delta value, sample rate / 48k for playback, */
363 /* 48k/sample rate for recording */
364 u16 attribute; /* control where PCM data go and come */
365 u16 fm_vol;
366 u32 control; /* signed/unsigned, 8/16 bits, mono/stereo */
367};
368
369struct trident_pcm_bank_address {
370 u32 start;
371 u32 stop;
372 u32 aint;
373 u32 aint_en;
374};
375
376static struct trident_pcm_bank_address bank_a_addrs = {
377 T4D_START_A,
378 T4D_STOP_A,
379 T4D_AINT_A,
380 T4D_AINTEN_A
381};
382
383static struct trident_pcm_bank_address bank_b_addrs = {
384 T4D_START_B,
385 T4D_STOP_B,
386 T4D_AINT_B,
387 T4D_AINTEN_B
388};
389
390struct trident_pcm_bank {
391 /* register addresses to control bank operations */
392 struct trident_pcm_bank_address *addresses;
393 /* each bank has 32 channels */
394 u32 bitmap; /* channel allocation bitmap */
395 struct trident_channel channels[32];
396};
397
398struct trident_card {
399 unsigned int magic;
400
401 /* We keep trident cards in a linked list */
402 struct trident_card *next;
403
404 /* single open lock mechanism, only used for recording */
405 struct semaphore open_sem;
406
407 /* The trident has a certain amount of cross channel interaction
408 so we use a single per card lock */
409 spinlock_t lock;
410
411 /* PCI device stuff */
412 struct pci_dev *pci_dev;
413 u16 pci_id;
414 u8 revision;
415
416 /* soundcore stuff */
417 int dev_audio;
418
419 /* structures for abstraction of hardware facilities, codecs, */
420 /* banks and channels */
421 struct ac97_codec *ac97_codec[NR_AC97];
422 struct trident_pcm_bank banks[NR_BANKS];
423 struct trident_state *states[NR_HW_CH];
424
425 /* hardware resources */
426 unsigned long iobase;
427 u32 irq;
428
429 /* Function support */
430 struct trident_channel *(*alloc_pcm_channel) (struct trident_card *);
431 struct trident_channel *(*alloc_rec_pcm_channel) (struct trident_card *);
432 void (*free_pcm_channel) (struct trident_card *, unsigned int chan);
433 void (*address_interrupt) (struct trident_card *);
434
435 /* Added by Matt Wu 01-05-2001 for spdif in */
436 int multi_channel_use_count;
437 int rec_channel_use_count;
438 u16 mixer_regs[64][NR_AC97]; /* Made card local by Alan */
439 int mixer_regs_ready;
440
441 /* Added for hardware volume control */
442 int hwvolctl;
443 struct timer_list timer;
444
445 /* Game port support */
446 struct gameport *gameport;
447};
448
449enum dmabuf_mode {
450 DM_PLAYBACK = 0,
451 DM_RECORD
452};
453
454/* table to map from CHANNELMASK to channel attribute for SiS 7018 */
455static u16 mask2attr[] = {
456 PCM_LR, PCM_LR, SURR_LR, CENTER_LFE,
457 HSET, MIC, MODEM_LINE1, MODEM_LINE2,
458 I2S_LR, SPDIF_LR
459};
460
461/* table to map from channel attribute to CHANNELMASK for SiS 7018 */
462static int attr2mask[] = {
463 DSP_BIND_MODEM1, DSP_BIND_MODEM2, DSP_BIND_FRONT, DSP_BIND_HANDSET,
464 DSP_BIND_I2S, DSP_BIND_CENTER_LFE, DSP_BIND_SURR, DSP_BIND_SPDIF
465};
466
467/* Added by Matt Wu 01-05-2001 for spdif in */
468static int ali_close_multi_channels(void);
469static void ali_delay(struct trident_card *card, int interval);
470static void ali_detect_spdif_rate(struct trident_card *card);
471
472static void ali_ac97_write(struct ac97_codec *codec, u8 reg, u16 val);
473static u16 ali_ac97_read(struct ac97_codec *codec, u8 reg);
474
475static struct trident_card *devs;
476
477static void trident_ac97_set(struct ac97_codec *codec, u8 reg, u16 val);
478static u16 trident_ac97_get(struct ac97_codec *codec, u8 reg);
479
480static int trident_open_mixdev(struct inode *inode, struct file *file);
481static int trident_ioctl_mixdev(struct inode *inode, struct file *file,
482 unsigned int cmd, unsigned long arg);
483
484static void ali_ac97_set(struct trident_card *card, int secondary, u8 reg, u16 val);
485static u16 ali_ac97_get(struct trident_card *card, int secondary, u8 reg);
486static void ali_set_spdif_out_rate(struct trident_card *card, unsigned int rate);
487static void ali_enable_special_channel(struct trident_state *stat);
488static struct trident_channel *ali_alloc_rec_pcm_channel(struct trident_card *card);
489static struct trident_channel *ali_alloc_pcm_channel(struct trident_card *card);
490static void ali_restore_regs(struct trident_card *card);
491static void ali_save_regs(struct trident_card *card);
492static int trident_suspend(struct pci_dev *dev, pm_message_t unused);
493static int trident_resume(struct pci_dev *dev);
494static void ali_free_pcm_channel(struct trident_card *card, unsigned int channel);
495static int ali_setup_multi_channels(struct trident_card *card, int chan_nums);
496static unsigned int ali_get_spdif_in_rate(struct trident_card *card);
497static void ali_setup_spdif_in(struct trident_card *card);
498static void ali_disable_spdif_in(struct trident_card *card);
499static void ali_disable_special_channel(struct trident_card *card, int ch);
500static void ali_setup_spdif_out(struct trident_card *card, int flag);
501static int ali_write_5_1(struct trident_state *state,
502 const char __user *buffer,
503 int cnt_for_multi_channel, unsigned int *copy_count,
504 unsigned int *state_cnt);
505static int ali_allocate_other_states_resources(struct trident_state *state,
506 int chan_nums);
507static void ali_free_other_states_resources(struct trident_state *state);
508
509/* save registers for ALi Power Management */
510static struct ali_saved_registers {
511 unsigned long global_regs[ALI_GLOBAL_REGS];
512 unsigned long channel_regs[ALI_CHANNELS][ALI_CHANNEL_REGS];
513 unsigned mixer_regs[ALI_MIXER_REGS];
514} ali_registers;
515
516#define seek_offset(dma_ptr, buffer, cnt, offset, copy_count) do { \
517 (dma_ptr) += (offset); \
518 (buffer) += (offset); \
519 (cnt) -= (offset); \
520 (copy_count) += (offset); \
521} while (0)
522
523static inline int lock_set_fmt(struct trident_state* state)
524{
525 if (test_and_set_bit(0, &state->fmt_flag))
526 return -EFAULT;
527
528 return 0;
529}
530
531static inline void unlock_set_fmt(struct trident_state* state)
532{
533 clear_bit(0, &state->fmt_flag);
534}
535
536static int
537trident_enable_loop_interrupts(struct trident_card *card)
538{
539 u32 global_control;
540
541 global_control = inl(TRID_REG(card, T4D_LFO_GC_CIR));
542
543 switch (card->pci_id) {
544 case PCI_DEVICE_ID_SI_7018:
545 global_control |= (ENDLP_IE | MIDLP_IE | BANK_B_EN);
546 break;
547 case PCI_DEVICE_ID_ALI_5451:
548 case PCI_DEVICE_ID_TRIDENT_4DWAVE_DX:
549 case PCI_DEVICE_ID_TRIDENT_4DWAVE_NX:
550 case PCI_DEVICE_ID_INTERG_5050:
551 global_control |= (ENDLP_IE | MIDLP_IE);
552 break;
553 default:
554 return 0;
555 }
556
557 outl(global_control, TRID_REG(card, T4D_LFO_GC_CIR));
558
559 pr_debug("trident: Enable Loop Interrupts, globctl = 0x%08X\n",
560 inl(TRID_REG(card, T4D_LFO_GC_CIR)));
561
562 return 1;
563}
564
565static int
566trident_disable_loop_interrupts(struct trident_card *card)
567{
568 u32 global_control;
569
570 global_control = inl(TRID_REG(card, T4D_LFO_GC_CIR));
571 global_control &= ~(ENDLP_IE | MIDLP_IE);
572 outl(global_control, TRID_REG(card, T4D_LFO_GC_CIR));
573
574 pr_debug("trident: Disabled Loop Interrupts, globctl = 0x%08X\n",
575 global_control);
576
577 return 1;
578}
579
580static void
581trident_enable_voice_irq(struct trident_card *card, unsigned int channel)
582{
583 unsigned int mask = 1 << (channel & 0x1f);
584 struct trident_pcm_bank *bank = &card->banks[channel >> 5];
585 u32 reg, addr = bank->addresses->aint_en;
586
587 reg = inl(TRID_REG(card, addr));
588 reg |= mask;
589 outl(reg, TRID_REG(card, addr));
590
591#ifdef DEBUG
592 reg = inl(TRID_REG(card, addr));
593 pr_debug("trident: enabled IRQ on channel %d, %s = 0x%08x(addr:%X)\n",
594 channel, addr == T4D_AINTEN_B ? "AINTEN_B" : "AINTEN_A",
595 reg, addr);
596#endif /* DEBUG */
597}
598
599static void
600trident_disable_voice_irq(struct trident_card *card, unsigned int channel)
601{
602 unsigned int mask = 1 << (channel & 0x1f);
603 struct trident_pcm_bank *bank = &card->banks[channel >> 5];
604 u32 reg, addr = bank->addresses->aint_en;
605
606 reg = inl(TRID_REG(card, addr));
607 reg &= ~mask;
608 outl(reg, TRID_REG(card, addr));
609
610 /* Ack the channel in case the interrupt was set before we disable it. */
611 outl(mask, TRID_REG(card, bank->addresses->aint));
612
613#ifdef DEBUG
614 reg = inl(TRID_REG(card, addr));
615 pr_debug("trident: disabled IRQ on channel %d, %s = 0x%08x(addr:%X)\n",
616 channel, addr == T4D_AINTEN_B ? "AINTEN_B" : "AINTEN_A",
617 reg, addr);
618#endif /* DEBUG */
619}
620
621static void
622trident_start_voice(struct trident_card *card, unsigned int channel)
623{
624 unsigned int mask = 1 << (channel & 0x1f);
625 struct trident_pcm_bank *bank = &card->banks[channel >> 5];
626 u32 addr = bank->addresses->start;
627
628#ifdef DEBUG
629 u32 reg;
630#endif /* DEBUG */
631
632 outl(mask, TRID_REG(card, addr));
633
634#ifdef DEBUG
635 reg = inl(TRID_REG(card, addr));
636 pr_debug("trident: start voice on channel %d, %s = 0x%08x(addr:%X)\n",
637 channel, addr == T4D_START_B ? "START_B" : "START_A",
638 reg, addr);
639#endif /* DEBUG */
640}
641
642static void
643trident_stop_voice(struct trident_card *card, unsigned int channel)
644{
645 unsigned int mask = 1 << (channel & 0x1f);
646 struct trident_pcm_bank *bank = &card->banks[channel >> 5];
647 u32 addr = bank->addresses->stop;
648
649#ifdef DEBUG
650 u32 reg;
651#endif /* DEBUG */
652
653 outl(mask, TRID_REG(card, addr));
654
655#ifdef DEBUG
656 reg = inl(TRID_REG(card, addr));
657 pr_debug("trident: stop voice on channel %d, %s = 0x%08x(addr:%X)\n",
658 channel, addr == T4D_STOP_B ? "STOP_B" : "STOP_A",
659 reg, addr);
660#endif /* DEBUG */
661}
662
663static u32
664trident_get_interrupt_mask(struct trident_card *card, unsigned int channel)
665{
666 struct trident_pcm_bank *bank = &card->banks[channel];
667 u32 addr = bank->addresses->aint;
668 return inl(TRID_REG(card, addr));
669}
670
671static int
672trident_check_channel_interrupt(struct trident_card *card, unsigned int channel)
673{
674 unsigned int mask = 1 << (channel & 0x1f);
675 u32 reg = trident_get_interrupt_mask(card, channel >> 5);
676
677#ifdef DEBUG
678 if (reg & mask)
679 pr_debug("trident: channel %d has interrupt, %s = 0x%08x\n",
680 channel, reg == T4D_AINT_B ? "AINT_B" : "AINT_A",
681 reg);
682#endif /* DEBUG */
683 return (reg & mask) ? 1 : 0;
684}
685
686static void
687trident_ack_channel_interrupt(struct trident_card *card, unsigned int channel)
688{
689 unsigned int mask = 1 << (channel & 0x1f);
690 struct trident_pcm_bank *bank = &card->banks[channel >> 5];
691 u32 reg, addr = bank->addresses->aint;
692
693 reg = inl(TRID_REG(card, addr));
694 reg &= mask;
695 outl(reg, TRID_REG(card, addr));
696
697#ifdef DEBUG
698 reg = inl(TRID_REG(card, T4D_AINT_B));
699 pr_debug("trident: Ack channel %d interrupt, AINT_B = 0x%08x\n",
700 channel, reg);
701#endif /* DEBUG */
702}
703
704static struct trident_channel *
705trident_alloc_pcm_channel(struct trident_card *card)
706{
707 struct trident_pcm_bank *bank;
708 int idx;
709
710 bank = &card->banks[BANK_B];
711
712 for (idx = 31; idx >= 0; idx--) {
713 if (!(bank->bitmap & (1 << idx))) {
714 struct trident_channel *channel = &bank->channels[idx];
715 bank->bitmap |= 1 << idx;
716 channel->num = idx + 32;
717 return channel;
718 }
719 }
720
721 /* no more free channels available */
722 printk(KERN_ERR "trident: no more channels available on Bank B.\n");
723 return NULL;
724}
725
726static void
727trident_free_pcm_channel(struct trident_card *card, unsigned int channel)
728{
729 int bank;
730 unsigned char b;
731
732 if (channel < 31 || channel > 63)
733 return;
734
735 if (card->pci_id == PCI_DEVICE_ID_TRIDENT_4DWAVE_DX ||
736 card->pci_id == PCI_DEVICE_ID_TRIDENT_4DWAVE_NX) {
737 b = inb(TRID_REG(card, T4D_REC_CH));
738 if ((b & ~0x80) == channel)
739 outb(0x0, TRID_REG(card, T4D_REC_CH));
740 }
741
742 bank = channel >> 5;
743 channel = channel & 0x1f;
744
745 card->banks[bank].bitmap &= ~(1 << (channel));
746}
747
748static struct trident_channel *
749cyber_alloc_pcm_channel(struct trident_card *card)
750{
751 struct trident_pcm_bank *bank;
752 int idx;
753
754 /* The cyberpro 5050 has only 32 voices and one bank */
755 /* .. at least they are not documented (if you want to call that
756 * crap documentation), perhaps broken ? */
757
758 bank = &card->banks[BANK_A];
759
760 for (idx = 31; idx >= 0; idx--) {
761 if (!(bank->bitmap & (1 << idx))) {
762 struct trident_channel *channel = &bank->channels[idx];
763 bank->bitmap |= 1 << idx;
764 channel->num = idx;
765 return channel;
766 }
767 }
768
769 /* no more free channels available */
770 printk(KERN_ERR "cyberpro5050: no more channels available on Bank A.\n");
771 return NULL;
772}
773
774static void
775cyber_free_pcm_channel(struct trident_card *card, unsigned int channel)
776{
777 if (channel > 31)
778 return;
779 card->banks[BANK_A].bitmap &= ~(1 << (channel));
780}
781
782static inline void
783cyber_outidx(int port, int idx, int data)
784{
785 outb(idx, port);
786 outb(data, port + 1);
787}
788
789static inline int
790cyber_inidx(int port, int idx)
791{
792 outb(idx, port);
793 return inb(port + 1);
794}
795
796static int
797cyber_init_ritual(struct trident_card *card)
798{
799 /* some black magic, taken from SDK samples */
800 /* remove this and nothing will work */
801 int portDat;
802 int ret = 0;
803 unsigned long flags;
804
805 /*
806 * Keep interrupts off for the configure - we don't want to
807 * clash with another cyberpro config event
808 */
809
810 spin_lock_irqsave(&card->lock, flags);
811 portDat = cyber_inidx(CYBER_PORT_AUDIO, CYBER_IDX_AUDIO_ENABLE);
812 /* enable, if it was disabled */
813 if ((portDat & CYBER_BMSK_AUENZ) != CYBER_BMSK_AUENZ_ENABLE) {
814 printk(KERN_INFO "cyberpro5050: enabling audio controller\n");
815 cyber_outidx(CYBER_PORT_AUDIO, CYBER_IDX_AUDIO_ENABLE,
816 portDat | CYBER_BMSK_AUENZ_ENABLE);
817 /* check again if hardware is enabled now */
818 portDat = cyber_inidx(CYBER_PORT_AUDIO, CYBER_IDX_AUDIO_ENABLE);
819 }
820 if ((portDat & CYBER_BMSK_AUENZ) != CYBER_BMSK_AUENZ_ENABLE) {
821 printk(KERN_ERR "cyberpro5050: initAudioAccess: no success\n");
822 ret = -1;
823 } else {
824 cyber_outidx(CYBER_PORT_AUDIO, CYBER_IDX_IRQ_ENABLE,
825 CYBER_BMSK_AUDIO_INT_ENABLE);
826 cyber_outidx(CYBER_PORT_AUDIO, 0xbf, 0x01);
827 cyber_outidx(CYBER_PORT_AUDIO, 0xba, 0x20);
828 cyber_outidx(CYBER_PORT_AUDIO, 0xbb, 0x08);
829 cyber_outidx(CYBER_PORT_AUDIO, 0xbf, 0x02);
830 cyber_outidx(CYBER_PORT_AUDIO, 0xb3, 0x06);
831 cyber_outidx(CYBER_PORT_AUDIO, 0xbf, 0x00);
832 }
833 spin_unlock_irqrestore(&card->lock, flags);
834 return ret;
835}
836
837/* called with spin lock held */
838
839static int
840trident_load_channel_registers(struct trident_card *card, u32 * data,
841 unsigned int channel)
842{
843 int i;
844
845 if (channel > 63)
846 return 0;
847
848 /* select hardware channel to write */
849 outb(channel, TRID_REG(card, T4D_LFO_GC_CIR));
850
851 /* Output the channel registers, but don't write register
852 three to an ALI chip. */
853 for (i = 0; i < CHANNEL_REGS; i++) {
854 if (i == 3 && card->pci_id == PCI_DEVICE_ID_ALI_5451)
855 continue;
856 outl(data[i], TRID_REG(card, CHANNEL_START + 4 * i));
857 }
858 if (card->pci_id == PCI_DEVICE_ID_ALI_5451 ||
859 card->pci_id == PCI_DEVICE_ID_INTERG_5050) {
860 outl(ALI_EMOD_Still, TRID_REG(card, ALI_EBUF1));
861 outl(ALI_EMOD_Still, TRID_REG(card, ALI_EBUF2));
862 }
863 return 1;
864}
865
866/* called with spin lock held */
867static int
868trident_write_voice_regs(struct trident_state *state)
869{
870 unsigned int data[CHANNEL_REGS + 1];
871 struct trident_channel *channel;
872
873 channel = state->dmabuf.channel;
874
875 data[1] = channel->lba;
876 data[4] = channel->control;
877
878 switch (state->card->pci_id) {
879 case PCI_DEVICE_ID_ALI_5451:
880 data[0] = 0; /* Current Sample Offset */
881 data[2] = (channel->eso << 16) | (channel->delta & 0xffff);
882 data[3] = 0;
883 break;
884 case PCI_DEVICE_ID_SI_7018:
885 case PCI_DEVICE_ID_INTERG_5050:
886 data[0] = 0; /* Current Sample Offset */
887 data[2] = (channel->eso << 16) | (channel->delta & 0xffff);
888 data[3] = (channel->attribute << 16) | (channel->fm_vol & 0xffff);
889 break;
890 case PCI_DEVICE_ID_TRIDENT_4DWAVE_DX:
891 data[0] = 0; /* Current Sample Offset */
892 data[2] = (channel->eso << 16) | (channel->delta & 0xffff);
893 data[3] = channel->fm_vol & 0xffff;
894 break;
895 case PCI_DEVICE_ID_TRIDENT_4DWAVE_NX:
896 data[0] = (channel->delta << 24);
897 data[2] = ((channel->delta << 16) & 0xff000000) |
898 (channel->eso & 0x00ffffff);
899 data[3] = channel->fm_vol & 0xffff;
900 break;
901 default:
902 return 0;
903 }
904
905 return trident_load_channel_registers(state->card, data, channel->num);
906}
907
908static int
909compute_rate_play(u32 rate)
910{
911 int delta;
912 /* We special case 44100 and 8000 since rounding with the equation
913 does not give us an accurate enough value. For 11025 and 22050
914 the equation gives us the best answer. All other frequencies will
915 also use the equation. JDW */
916 if (rate == 44100)
917 delta = 0xeb3;
918 else if (rate == 8000)
919 delta = 0x2ab;
920 else if (rate == 48000)
921 delta = 0x1000;
922 else
923 delta = (((rate << 12) + rate) / 48000) & 0x0000ffff;
924 return delta;
925}
926
927static int
928compute_rate_rec(u32 rate)
929{
930 int delta;
931
932 if (rate == 44100)
933 delta = 0x116a;
934 else if (rate == 8000)
935 delta = 0x6000;
936 else if (rate == 48000)
937 delta = 0x1000;
938 else
939 delta = ((48000 << 12) / rate) & 0x0000ffff;
940
941 return delta;
942}
943
944/* set playback sample rate */
945static unsigned int
946trident_set_dac_rate(struct trident_state *state, unsigned int rate)
947{
948 struct dmabuf *dmabuf = &state->dmabuf;
949
950 if (rate > 48000)
951 rate = 48000;
952 if (rate < 4000)
953 rate = 4000;
954
955 dmabuf->rate = rate;
956 dmabuf->channel->delta = compute_rate_play(rate);
957
958 trident_write_voice_regs(state);
959
960 pr_debug("trident: called trident_set_dac_rate : rate = %d\n", rate);
961
962 return rate;
963}
964
965/* set recording sample rate */
966static unsigned int
967trident_set_adc_rate(struct trident_state *state, unsigned int rate)
968{
969 struct dmabuf *dmabuf = &state->dmabuf;
970
971 if (rate > 48000)
972 rate = 48000;
973 if (rate < 4000)
974 rate = 4000;
975
976 dmabuf->rate = rate;
977 dmabuf->channel->delta = compute_rate_rec(rate);
978
979 trident_write_voice_regs(state);
980
981 pr_debug("trident: called trident_set_adc_rate : rate = %d\n", rate);
982
983 return rate;
984}
985
986/* prepare channel attributes for playback */
987static void
988trident_play_setup(struct trident_state *state)
989{
990 struct dmabuf *dmabuf = &state->dmabuf;
991 struct trident_channel *channel = dmabuf->channel;
992
993 channel->lba = dmabuf->dma_handle;
994 channel->delta = compute_rate_play(dmabuf->rate);
995
996 channel->eso = dmabuf->dmasize >> sample_shift[dmabuf->fmt];
997 channel->eso -= 1;
998
999 if (state->card->pci_id != PCI_DEVICE_ID_SI_7018) {
1000 channel->attribute = 0;
1001 if (state->card->pci_id == PCI_DEVICE_ID_ALI_5451) {
1002 if ((channel->num == ALI_SPDIF_IN_CHANNEL) ||
1003 (channel->num == ALI_PCM_IN_CHANNEL))
1004 ali_disable_special_channel(state->card, channel->num);
1005 else if ((inl(TRID_REG(state->card, ALI_GLOBAL_CONTROL))
1006 & ALI_SPDIF_OUT_CH_ENABLE)
1007 && (channel->num == ALI_SPDIF_OUT_CHANNEL)) {
1008 ali_set_spdif_out_rate(state->card,
1009 state->dmabuf.rate);
1010 state->dmabuf.channel->delta = 0x1000;
1011 }
1012 }
1013 }
1014
1015 channel->fm_vol = 0x0;
1016
1017 channel->control = CHANNEL_LOOP;
1018 if (dmabuf->fmt & TRIDENT_FMT_16BIT) {
1019 /* 16-bits */
1020 channel->control |= CHANNEL_16BITS;
1021 /* signed */
1022 channel->control |= CHANNEL_SIGNED;
1023 }
1024 if (dmabuf->fmt & TRIDENT_FMT_STEREO)
1025 /* stereo */
1026 channel->control |= CHANNEL_STEREO;
1027
1028 pr_debug("trident: trident_play_setup, LBA = 0x%08x, Delta = 0x%08x, "
1029 "ESO = 0x%08x, Control = 0x%08x\n", channel->lba,
1030 channel->delta, channel->eso, channel->control);
1031
1032 trident_write_voice_regs(state);
1033}
1034
1035/* prepare channel attributes for recording */
1036static void
1037trident_rec_setup(struct trident_state *state)
1038{
1039 u16 w;
1040 u8 bval;
1041
1042 struct trident_card *card = state->card;
1043 struct dmabuf *dmabuf = &state->dmabuf;
1044 struct trident_channel *channel = dmabuf->channel;
1045 unsigned int rate;
1046
1047 /* Enable AC-97 ADC (capture) */
1048 switch (card->pci_id) {
1049 case PCI_DEVICE_ID_ALI_5451:
1050 ali_enable_special_channel(state);
1051 break;
1052 case PCI_DEVICE_ID_SI_7018:
1053 /* for 7018, the ac97 is always in playback/record (duplex) mode */
1054 break;
1055 case PCI_DEVICE_ID_TRIDENT_4DWAVE_DX:
1056 w = inb(TRID_REG(card, DX_ACR2_AC97_COM_STAT));
1057 outb(w | 0x48, TRID_REG(card, DX_ACR2_AC97_COM_STAT));
1058 /* enable and set record channel */
1059 outb(0x80 | channel->num, TRID_REG(card, T4D_REC_CH));
1060 break;
1061 case PCI_DEVICE_ID_TRIDENT_4DWAVE_NX:
1062 w = inw(TRID_REG(card, T4D_MISCINT));
1063 outw(w | 0x1000, TRID_REG(card, T4D_MISCINT));
1064 /* enable and set record channel */
1065 outb(0x80 | channel->num, TRID_REG(card, T4D_REC_CH));
1066 break;
1067 case PCI_DEVICE_ID_INTERG_5050:
1068 /* don't know yet, using special channel 22 in GC1(0xd4)? */
1069 break;
1070 default:
1071 return;
1072 }
1073
1074 channel->lba = dmabuf->dma_handle;
1075 channel->delta = compute_rate_rec(dmabuf->rate);
1076 if ((card->pci_id == PCI_DEVICE_ID_ALI_5451) &&
1077 (channel->num == ALI_SPDIF_IN_CHANNEL)) {
1078 rate = ali_get_spdif_in_rate(card);
1079 if (rate == 0) {
1080 printk(KERN_WARNING "trident: ALi 5451 "
1081 "S/PDIF input setup error!\n");
1082 rate = 48000;
1083 }
1084 bval = inb(TRID_REG(card, ALI_SPDIF_CTRL));
1085 if (bval & 0x10) {
1086 outb(bval, TRID_REG(card, ALI_SPDIF_CTRL));
1087 printk(KERN_WARNING "trident: cleared ALi "
1088 "5451 S/PDIF parity error flag.\n");
1089 }
1090
1091 if (rate != 48000)
1092 channel->delta = ((rate << 12) / dmabuf->rate) & 0x0000ffff;
1093 }
1094
1095 channel->eso = dmabuf->dmasize >> sample_shift[dmabuf->fmt];
1096 channel->eso -= 1;
1097
1098 if (state->card->pci_id != PCI_DEVICE_ID_SI_7018) {
1099 channel->attribute = 0;
1100 }
1101
1102 channel->fm_vol = 0x0;
1103
1104 channel->control = CHANNEL_LOOP;
1105 if (dmabuf->fmt & TRIDENT_FMT_16BIT) {
1106 /* 16-bits */
1107 channel->control |= CHANNEL_16BITS;
1108 /* signed */
1109 channel->control |= CHANNEL_SIGNED;
1110 }
1111 if (dmabuf->fmt & TRIDENT_FMT_STEREO)
1112 /* stereo */
1113 channel->control |= CHANNEL_STEREO;
1114
1115 pr_debug("trident: trident_rec_setup, LBA = 0x%08x, Delat = 0x%08x, "
1116 "ESO = 0x%08x, Control = 0x%08x\n", channel->lba,
1117 channel->delta, channel->eso, channel->control);
1118
1119 trident_write_voice_regs(state);
1120}
1121
1122/* get current playback/recording dma buffer pointer (byte offset from LBA),
1123 called with spinlock held! */
1124static inline unsigned
1125trident_get_dma_addr(struct trident_state *state)
1126{
1127 struct dmabuf *dmabuf = &state->dmabuf;
1128 u32 cso;
1129
1130 if (!dmabuf->enable)
1131 return 0;
1132
1133 outb(dmabuf->channel->num, TRID_REG(state->card, T4D_LFO_GC_CIR));
1134
1135 switch (state->card->pci_id) {
1136 case PCI_DEVICE_ID_ALI_5451:
1137 case PCI_DEVICE_ID_SI_7018:
1138 case PCI_DEVICE_ID_TRIDENT_4DWAVE_DX:
1139 case PCI_DEVICE_ID_INTERG_5050:
1140 /* 16 bits ESO, CSO for 7018 and DX */
1141 cso = inw(TRID_REG(state->card, CH_DX_CSO_ALPHA_FMS + 2));
1142 break;
1143 case PCI_DEVICE_ID_TRIDENT_4DWAVE_NX:
1144 /* 24 bits ESO, CSO for NX */
1145 cso = inl(TRID_REG(state->card, CH_NX_DELTA_CSO)) & 0x00ffffff;
1146 break;
1147 default:
1148 return 0;
1149 }
1150
1151 pr_debug("trident: trident_get_dma_addr: chip reported channel: %d, "
1152 "cso = 0x%04x\n", dmabuf->channel->num, cso);
1153
1154 /* ESO and CSO are in units of Samples, convert to byte offset */
1155 cso <<= sample_shift[dmabuf->fmt];
1156
1157 return (cso % dmabuf->dmasize);
1158}
1159
1160/* Stop recording (lock held) */
1161static inline void
1162__stop_adc(struct trident_state *state)
1163{
1164 struct dmabuf *dmabuf = &state->dmabuf;
1165 unsigned int chan_num = dmabuf->channel->num;
1166 struct trident_card *card = state->card;
1167
1168 dmabuf->enable &= ~ADC_RUNNING;
1169 trident_stop_voice(card, chan_num);
1170 trident_disable_voice_irq(card, chan_num);
1171}
1172
1173static void
1174stop_adc(struct trident_state *state)
1175{
1176 struct trident_card *card = state->card;
1177 unsigned long flags;
1178
1179 spin_lock_irqsave(&card->lock, flags);
1180 __stop_adc(state);
1181 spin_unlock_irqrestore(&card->lock, flags);
1182}
1183
1184static void
1185start_adc(struct trident_state *state)
1186{
1187 struct dmabuf *dmabuf = &state->dmabuf;
1188 unsigned int chan_num = dmabuf->channel->num;
1189 struct trident_card *card = state->card;
1190 unsigned long flags;
1191
1192 spin_lock_irqsave(&card->lock, flags);
1193 if ((dmabuf->mapped ||
1194 dmabuf->count < (signed) dmabuf->dmasize) &&
1195 dmabuf->ready) {
1196 dmabuf->enable |= ADC_RUNNING;
1197 trident_enable_voice_irq(card, chan_num);
1198 trident_start_voice(card, chan_num);
1199 }
1200 spin_unlock_irqrestore(&card->lock, flags);
1201}
1202
1203/* stop playback (lock held) */
1204static inline void
1205__stop_dac(struct trident_state *state)
1206{
1207 struct dmabuf *dmabuf = &state->dmabuf;
1208 unsigned int chan_num = dmabuf->channel->num;
1209 struct trident_card *card = state->card;
1210
1211 dmabuf->enable &= ~DAC_RUNNING;
1212 trident_stop_voice(card, chan_num);
1213 if (state->chans_num == 6) {
1214 trident_stop_voice(card, state->other_states[0]->
1215 dmabuf.channel->num);
1216 trident_stop_voice(card, state->other_states[1]->
1217 dmabuf.channel->num);
1218 trident_stop_voice(card, state->other_states[2]->
1219 dmabuf.channel->num);
1220 trident_stop_voice(card, state->other_states[3]->
1221 dmabuf.channel->num);
1222 }
1223 trident_disable_voice_irq(card, chan_num);
1224}
1225
1226static void
1227stop_dac(struct trident_state *state)
1228{
1229 struct trident_card *card = state->card;
1230 unsigned long flags;
1231
1232 spin_lock_irqsave(&card->lock, flags);
1233 __stop_dac(state);
1234 spin_unlock_irqrestore(&card->lock, flags);
1235}
1236
1237static void
1238start_dac(struct trident_state *state)
1239{
1240 struct dmabuf *dmabuf = &state->dmabuf;
1241 unsigned int chan_num = dmabuf->channel->num;
1242 struct trident_card *card = state->card;
1243 unsigned long flags;
1244
1245 spin_lock_irqsave(&card->lock, flags);
1246 if ((dmabuf->mapped || dmabuf->count > 0) && dmabuf->ready) {
1247 dmabuf->enable |= DAC_RUNNING;
1248 trident_enable_voice_irq(card, chan_num);
1249 trident_start_voice(card, chan_num);
1250 if (state->chans_num == 6) {
1251 trident_start_voice(card, state->other_states[0]->
1252 dmabuf.channel->num);
1253 trident_start_voice(card, state->other_states[1]->
1254 dmabuf.channel->num);
1255 trident_start_voice(card, state->other_states[2]->
1256 dmabuf.channel->num);
1257 trident_start_voice(card, state->other_states[3]->
1258 dmabuf.channel->num);
1259 }
1260 }
1261 spin_unlock_irqrestore(&card->lock, flags);
1262}
1263
1264#define DMABUF_DEFAULTORDER (15-PAGE_SHIFT)
1265#define DMABUF_MINORDER 1
1266
1267/* alloc a DMA buffer of with a buffer of this order */
1268static int
1269alloc_dmabuf(struct dmabuf *dmabuf, struct pci_dev *pci_dev, int order)
1270{
1271 void *rawbuf = NULL;
1272 struct page *page, *pend;
1273
1274 if (!(rawbuf = pci_alloc_consistent(pci_dev, PAGE_SIZE << order,
1275 &dmabuf->dma_handle)))
1276 return -ENOMEM;
1277
1278 pr_debug("trident: allocated %ld (order = %d) bytes at %p\n",
1279 PAGE_SIZE << order, order, rawbuf);
1280
1281 dmabuf->ready = dmabuf->mapped = 0;
1282 dmabuf->rawbuf = rawbuf;
1283 dmabuf->buforder = order;
1284
1285 /* now mark the pages as reserved; otherwise */
1286 /* remap_pfn_range doesn't do what we want */
1287 pend = virt_to_page(rawbuf + (PAGE_SIZE << order) - 1);
1288 for (page = virt_to_page(rawbuf); page <= pend; page++)
1289 SetPageReserved(page);
1290
1291 return 0;
1292}
1293
1294/* allocate the main DMA buffer, playback and recording buffer should be */
1295/* allocated separately */
1296static int
1297alloc_main_dmabuf(struct trident_state *state)
1298{
1299 struct dmabuf *dmabuf = &state->dmabuf;
1300 int order;
1301 int ret = -ENOMEM;
1302
1303 /* alloc as big a chunk as we can, FIXME: is this necessary ?? */
1304 for (order = DMABUF_DEFAULTORDER; order >= DMABUF_MINORDER; order--) {
1305 if (!(ret = alloc_dmabuf(dmabuf, state->card->pci_dev, order)))
1306 return 0;
1307 /* else try again */
1308 }
1309 return ret;
1310}
1311
1312/* deallocate a DMA buffer */
1313static void
1314dealloc_dmabuf(struct dmabuf *dmabuf, struct pci_dev *pci_dev)
1315{
1316 struct page *page, *pend;
1317
1318 if (dmabuf->rawbuf) {
1319 /* undo marking the pages as reserved */
1320 pend = virt_to_page(dmabuf->rawbuf + (PAGE_SIZE << dmabuf->buforder) - 1);
1321 for (page = virt_to_page(dmabuf->rawbuf); page <= pend; page++)
1322 ClearPageReserved(page);
1323 pci_free_consistent(pci_dev, PAGE_SIZE << dmabuf->buforder,
1324 dmabuf->rawbuf, dmabuf->dma_handle);
1325 dmabuf->rawbuf = NULL;
1326 }
1327 dmabuf->mapped = dmabuf->ready = 0;
1328}
1329
1330static int
1331prog_dmabuf(struct trident_state *state, enum dmabuf_mode rec)
1332{
1333 struct dmabuf *dmabuf = &state->dmabuf;
1334 unsigned bytepersec;
1335 struct trident_state *s = state;
1336 unsigned bufsize, dma_nums;
1337 unsigned long flags;
1338 int ret, i, order;
1339
1340 if ((ret = lock_set_fmt(state)) < 0)
1341 return ret;
1342
1343 if (state->chans_num == 6)
1344 dma_nums = 5;
1345 else
1346 dma_nums = 1;
1347
1348 for (i = 0; i < dma_nums; i++) {
1349 if (i > 0) {
1350 s = state->other_states[i - 1];
1351 dmabuf = &s->dmabuf;
1352 dmabuf->fmt = state->dmabuf.fmt;
1353 dmabuf->rate = state->dmabuf.rate;
1354 }
1355
1356 spin_lock_irqsave(&s->card->lock, flags);
1357 dmabuf->hwptr = dmabuf->swptr = dmabuf->total_bytes = 0;
1358 dmabuf->count = dmabuf->error = 0;
1359 spin_unlock_irqrestore(&s->card->lock, flags);
1360
1361 /* allocate DMA buffer if not allocated yet */
1362 if (!dmabuf->rawbuf) {
1363 if (i == 0) {
1364 if ((ret = alloc_main_dmabuf(state))) {
1365 unlock_set_fmt(state);
1366 return ret;
1367 }
1368 } else {
1369 ret = -ENOMEM;
1370 order = state->dmabuf.buforder - 1;
1371 if (order >= DMABUF_MINORDER) {
1372 ret = alloc_dmabuf(dmabuf,
1373 state->card->pci_dev,
1374 order);
1375 }
1376 if (ret) {
1377 /* release the main DMA buffer */
1378 dealloc_dmabuf(&state->dmabuf, state->card->pci_dev);
1379 /* release the auxiliary DMA buffers */
1380 for (i -= 2; i >= 0; i--)
1381 dealloc_dmabuf(&state->other_states[i]->dmabuf,
1382 state->card->pci_dev);
1383 unlock_set_fmt(state);
1384 return ret;
1385 }
1386 }
1387 }
1388 /* FIXME: figure out all this OSS fragment stuff */
1389 bytepersec = dmabuf->rate << sample_shift[dmabuf->fmt];
1390 bufsize = PAGE_SIZE << dmabuf->buforder;
1391 if (dmabuf->ossfragshift) {
1392 if ((1000 << dmabuf->ossfragshift) < bytepersec)
1393 dmabuf->fragshift = ld2(bytepersec / 1000);
1394 else
1395 dmabuf->fragshift = dmabuf->ossfragshift;
1396 } else {
1397 /* lets hand out reasonable big ass buffers by default */
1398 dmabuf->fragshift = (dmabuf->buforder + PAGE_SHIFT - 2);
1399 }
1400 dmabuf->numfrag = bufsize >> dmabuf->fragshift;
1401 while (dmabuf->numfrag < 4 && dmabuf->fragshift > 3) {
1402 dmabuf->fragshift--;
1403 dmabuf->numfrag = bufsize >> dmabuf->fragshift;
1404 }
1405 dmabuf->fragsize = 1 << dmabuf->fragshift;
1406 if (dmabuf->ossmaxfrags >= 4 && dmabuf->ossmaxfrags < dmabuf->numfrag)
1407 dmabuf->numfrag = dmabuf->ossmaxfrags;
1408 dmabuf->fragsamples = dmabuf->fragsize >> sample_shift[dmabuf->fmt];
1409 dmabuf->dmasize = dmabuf->numfrag << dmabuf->fragshift;
1410
1411 memset(dmabuf->rawbuf, (dmabuf->fmt & TRIDENT_FMT_16BIT) ? 0 : 0x80,
1412 dmabuf->dmasize);
1413
1414 spin_lock_irqsave(&s->card->lock, flags);
1415 if (rec == DM_RECORD)
1416 trident_rec_setup(s);
1417 else /* DM_PLAYBACK */
1418 trident_play_setup(s);
1419
1420 spin_unlock_irqrestore(&s->card->lock, flags);
1421
1422 /* set the ready flag for the dma buffer */
1423 dmabuf->ready = 1;
1424
1425 pr_debug("trident: prog_dmabuf(%d), sample rate = %d, "
1426 "format = %d, numfrag = %d, fragsize = %d "
1427 "dmasize = %d\n", dmabuf->channel->num,
1428 dmabuf->rate, dmabuf->fmt, dmabuf->numfrag,
1429 dmabuf->fragsize, dmabuf->dmasize);
1430 }
1431 unlock_set_fmt(state);
1432 return 0;
1433}
1434
1435
1436static inline int prog_dmabuf_record(struct trident_state* state)
1437{
1438 return prog_dmabuf(state, DM_RECORD);
1439}
1440
1441static inline int prog_dmabuf_playback(struct trident_state* state)
1442{
1443 return prog_dmabuf(state, DM_PLAYBACK);
1444}
1445
1446/* we are doing quantum mechanics here, the buffer can only be empty, half or full filled i.e.
1447 |------------|------------| or |xxxxxxxxxxxx|------------| or |xxxxxxxxxxxx|xxxxxxxxxxxx|
1448 but we almost always get this
1449 |xxxxxx------|------------| or |xxxxxxxxxxxx|xxxxx-------|
1450 so we have to clear the tail space to "silence"
1451 |xxxxxx000000|------------| or |xxxxxxxxxxxx|xxxxxx000000|
1452*/
1453static void
1454trident_clear_tail(struct trident_state *state)
1455{
1456 struct dmabuf *dmabuf = &state->dmabuf;
1457 unsigned swptr;
1458 unsigned char silence = (dmabuf->fmt & TRIDENT_FMT_16BIT) ? 0 : 0x80;
1459 unsigned int len;
1460 unsigned long flags;
1461
1462 spin_lock_irqsave(&state->card->lock, flags);
1463 swptr = dmabuf->swptr;
1464 spin_unlock_irqrestore(&state->card->lock, flags);
1465
1466 if (swptr == 0 || swptr == dmabuf->dmasize / 2 ||
1467 swptr == dmabuf->dmasize)
1468 return;
1469
1470 if (swptr < dmabuf->dmasize / 2)
1471 len = dmabuf->dmasize / 2 - swptr;
1472 else
1473 len = dmabuf->dmasize - swptr;
1474
1475 memset(dmabuf->rawbuf + swptr, silence, len);
1476 if (state->card->pci_id != PCI_DEVICE_ID_ALI_5451) {
1477 spin_lock_irqsave(&state->card->lock, flags);
1478 dmabuf->swptr += len;
1479 dmabuf->count += len;
1480 spin_unlock_irqrestore(&state->card->lock, flags);
1481 }
1482
1483 /* restart the dma machine in case it is halted */
1484 start_dac(state);
1485}
1486
1487static int
1488drain_dac(struct trident_state *state, int nonblock)
1489{
1490 DECLARE_WAITQUEUE(wait, current);
1491 struct dmabuf *dmabuf = &state->dmabuf;
1492 unsigned long flags;
1493 unsigned long tmo;
1494 int count;
1495 unsigned long diff = 0;
1496
1497 if (dmabuf->mapped || !dmabuf->ready)
1498 return 0;
1499
1500 add_wait_queue(&dmabuf->wait, &wait);
1501 for (;;) {
1502 /* It seems that we have to set the current state to TASK_INTERRUPTIBLE
1503 every time to make the process really go to sleep */
1504 set_current_state(TASK_INTERRUPTIBLE);
1505
1506 spin_lock_irqsave(&state->card->lock, flags);
1507 count = dmabuf->count;
1508 spin_unlock_irqrestore(&state->card->lock, flags);
1509
1510 if (count <= 0)
1511 break;
1512
1513 if (signal_pending(current))
1514 break;
1515
1516 if (nonblock) {
1517 remove_wait_queue(&dmabuf->wait, &wait);
1518 set_current_state(TASK_RUNNING);
1519 return -EBUSY;
1520 }
1521
1522 /* No matter how much data is left in the buffer, we have to wait until
1523 CSO == ESO/2 or CSO == ESO when address engine interrupts */
1524 if (state->card->pci_id == PCI_DEVICE_ID_ALI_5451 ||
1525 state->card->pci_id == PCI_DEVICE_ID_INTERG_5050) {
1526 diff = dmabuf->swptr - trident_get_dma_addr(state) + dmabuf->dmasize;
1527 diff = diff % (dmabuf->dmasize);
1528 tmo = (diff * HZ) / dmabuf->rate;
1529 } else {
1530 tmo = (dmabuf->dmasize * HZ) / dmabuf->rate;
1531 }
1532 tmo >>= sample_shift[dmabuf->fmt];
1533 if (!schedule_timeout(tmo ? tmo : 1) && tmo) {
1534 break;
1535 }
1536 }
1537 remove_wait_queue(&dmabuf->wait, &wait);
1538 set_current_state(TASK_RUNNING);
1539 if (signal_pending(current))
1540 return -ERESTARTSYS;
1541
1542 return 0;
1543}
1544
1545/* update buffer manangement pointers, especially, */
1546/* dmabuf->count and dmabuf->hwptr */
1547static void
1548trident_update_ptr(struct trident_state *state)
1549{
1550 struct dmabuf *dmabuf = &state->dmabuf;
1551 unsigned hwptr, swptr;
1552 int clear_cnt = 0;
1553 int diff;
1554 unsigned char silence;
1555 unsigned half_dmasize;
1556
1557 /* update hardware pointer */
1558 hwptr = trident_get_dma_addr(state);
1559 diff = (dmabuf->dmasize + hwptr - dmabuf->hwptr) % dmabuf->dmasize;
1560 dmabuf->hwptr = hwptr;
1561 dmabuf->total_bytes += diff;
1562
1563 /* error handling and process wake up for ADC */
1564 if (dmabuf->enable == ADC_RUNNING) {
1565 if (dmabuf->mapped) {
1566 dmabuf->count -= diff;
1567 if (dmabuf->count >= (signed) dmabuf->fragsize)
1568 wake_up(&dmabuf->wait);
1569 } else {
1570 dmabuf->count += diff;
1571
1572 if (dmabuf->count < 0 ||
1573 dmabuf->count > dmabuf->dmasize) {
1574 /* buffer underrun or buffer overrun, */
1575 /* we have no way to recover it here, just */
1576 /* stop the machine and let the process */
1577 /* force hwptr and swptr to sync */
1578 __stop_adc(state);
1579 dmabuf->error++;
1580 }
1581 if (dmabuf->count < (signed) dmabuf->dmasize / 2)
1582 wake_up(&dmabuf->wait);
1583 }
1584 }
1585
1586 /* error handling and process wake up for DAC */
1587 if (dmabuf->enable == DAC_RUNNING) {
1588 if (dmabuf->mapped) {
1589 dmabuf->count += diff;
1590 if (dmabuf->count >= (signed) dmabuf->fragsize)
1591 wake_up(&dmabuf->wait);
1592 } else {
1593 dmabuf->count -= diff;
1594
1595 if (dmabuf->count < 0 ||
1596 dmabuf->count > dmabuf->dmasize) {
1597 /* buffer underrun or buffer overrun, we have no way to recover
1598 it here, just stop the machine and let the process force hwptr
1599 and swptr to sync */
1600 __stop_dac(state);
1601 dmabuf->error++;
1602 } else if (!dmabuf->endcleared) {
1603 swptr = dmabuf->swptr;
1604 silence = (dmabuf->fmt & TRIDENT_FMT_16BIT ? 0 : 0x80);
1605 if (dmabuf->update_flag & ALI_ADDRESS_INT_UPDATE) {
1606 /* We must clear end data of 1/2 dmabuf if needed.
1607 According to 1/2 algorithm of Address Engine Interrupt,
1608 check the validation of the data of half dmasize. */
1609 half_dmasize = dmabuf->dmasize / 2;
1610 if ((diff = hwptr - half_dmasize) < 0)
1611 diff = hwptr;
1612 if ((dmabuf->count + diff) < half_dmasize) {
1613 //there is invalid data in the end of half buffer
1614 if ((clear_cnt = half_dmasize - swptr) < 0)
1615 clear_cnt += half_dmasize;
1616 //clear the invalid data
1617 memset(dmabuf->rawbuf + swptr, silence, clear_cnt);
1618 if (state->chans_num == 6) {
1619 clear_cnt = clear_cnt / 2;
1620 swptr = swptr / 2;
1621 memset(state->other_states[0]->dmabuf.rawbuf + swptr,
1622 silence, clear_cnt);
1623 memset(state->other_states[1]->dmabuf.rawbuf + swptr,
1624 silence, clear_cnt);
1625 memset(state->other_states[2]->dmabuf.rawbuf + swptr,
1626 silence, clear_cnt);
1627 memset(state->other_states[3]->dmabuf.rawbuf + swptr,
1628 silence, clear_cnt);
1629 }
1630 dmabuf->endcleared = 1;
1631 }
1632 } else if (dmabuf->count < (signed) dmabuf->fragsize) {
1633 clear_cnt = dmabuf->fragsize;
1634 if ((swptr + clear_cnt) > dmabuf->dmasize)
1635 clear_cnt = dmabuf->dmasize - swptr;
1636 memset(dmabuf->rawbuf + swptr, silence, clear_cnt);
1637 if (state->chans_num == 6) {
1638 clear_cnt = clear_cnt / 2;
1639 swptr = swptr / 2;
1640 memset(state->other_states[0]->dmabuf.rawbuf + swptr,
1641 silence, clear_cnt);
1642 memset(state->other_states[1]->dmabuf.rawbuf + swptr,
1643 silence, clear_cnt);
1644 memset(state->other_states[2]->dmabuf.rawbuf + swptr,
1645 silence, clear_cnt);
1646 memset(state->other_states[3]->dmabuf.rawbuf + swptr,
1647 silence, clear_cnt);
1648 }
1649 dmabuf->endcleared = 1;
1650 }
1651 }
1652 /* trident_update_ptr is called by interrupt handler or by process via
1653 ioctl/poll, we only wake up the waiting process when we have more
1654 than 1/2 buffer free (always true for interrupt handler) */
1655 if (dmabuf->count < (signed) dmabuf->dmasize / 2)
1656 wake_up(&dmabuf->wait);
1657 }
1658 }
1659 dmabuf->update_flag &= ~ALI_ADDRESS_INT_UPDATE;
1660}
1661
1662static void
1663trident_address_interrupt(struct trident_card *card)
1664{
1665 int i;
1666 struct trident_state *state;
1667 unsigned int channel;
1668
1669 /* Update the pointers for all channels we are running. */
1670 /* FIXME: should read interrupt status only once */
1671 for (i = 0; i < NR_HW_CH; i++) {
1672 channel = 63 - i;
1673 if (trident_check_channel_interrupt(card, channel)) {
1674 trident_ack_channel_interrupt(card, channel);
1675 if ((state = card->states[i]) != NULL) {
1676 trident_update_ptr(state);
1677 } else {
1678 printk(KERN_WARNING "trident: spurious channel "
1679 "irq %d.\n", channel);
1680 trident_stop_voice(card, channel);
1681 trident_disable_voice_irq(card, channel);
1682 }
1683 }
1684 }
1685}
1686
1687static void
1688ali_hwvol_control(struct trident_card *card, int opt)
1689{
1690 u16 dwTemp, volume[2], mute, diff, *pVol[2];
1691
1692 dwTemp = ali_ac97_read(card->ac97_codec[0], 0x02);
1693 mute = dwTemp & 0x8000;
1694 volume[0] = dwTemp & 0x001f;
1695 volume[1] = (dwTemp & 0x1f00) >> 8;
1696 if (volume[0] < volume[1]) {
1697 pVol[0] = &volume[0];
1698 pVol[1] = &volume[1];
1699 } else {
1700 pVol[1] = &volume[0];
1701 pVol[0] = &volume[1];
1702 }
1703 diff = *(pVol[1]) - *(pVol[0]);
1704
1705 if (opt == 1) { // MUTE
1706 dwTemp ^= 0x8000;
1707 ali_ac97_write(card->ac97_codec[0],
1708 0x02, dwTemp);
1709 } else if (opt == 2) { // Down
1710 if (mute)
1711 return;
1712 if (*(pVol[1]) < 0x001f) {
1713 (*pVol[1])++;
1714 *(pVol[0]) = *(pVol[1]) - diff;
1715 }
1716 dwTemp &= 0xe0e0;
1717 dwTemp |= (volume[0]) | (volume[1] << 8);
1718 ali_ac97_write(card->ac97_codec[0], 0x02, dwTemp);
1719 card->ac97_codec[0]->mixer_state[0] = ((32 - volume[0]) * 25 / 8) |
1720 (((32 - volume[1]) * 25 / 8) << 8);
1721 } else if (opt == 4) { // Up
1722 if (mute)
1723 return;
1724 if (*(pVol[0]) > 0) {
1725 (*pVol[0])--;
1726 *(pVol[1]) = *(pVol[0]) + diff;
1727 }
1728 dwTemp &= 0xe0e0;
1729 dwTemp |= (volume[0]) | (volume[1] << 8);
1730 ali_ac97_write(card->ac97_codec[0], 0x02, dwTemp);
1731 card->ac97_codec[0]->mixer_state[0] = ((32 - volume[0]) * 25 / 8) |
1732 (((32 - volume[1]) * 25 / 8) << 8);
1733 } else {
1734 /* Nothing needs doing */
1735 }
1736}
1737
1738/*
1739 * Re-enable reporting of vol change after 0.1 seconds
1740 */
1741
1742static void
1743ali_timeout(unsigned long ptr)
1744{
1745 struct trident_card *card = (struct trident_card *) ptr;
1746 u16 temp = 0;
1747
1748 /* Enable GPIO IRQ (MISCINT bit 18h) */
1749 temp = inw(TRID_REG(card, T4D_MISCINT + 2));
1750 temp |= 0x0004;
1751 outw(temp, TRID_REG(card, T4D_MISCINT + 2));
1752}
1753
1754/*
1755 * Set up the timer to clear the vol change notification
1756 */
1757
1758static void
1759ali_set_timer(struct trident_card *card)
1760{
1761 /* Add Timer Routine to Enable GPIO IRQ */
1762 del_timer(&card->timer); /* Never queue twice */
1763 card->timer.function = ali_timeout;
1764 card->timer.data = (unsigned long) card;
1765 card->timer.expires = jiffies + HZ / 10;
1766 add_timer(&card->timer);
1767}
1768
1769/*
1770 * Process a GPIO event
1771 */
1772
1773static void
1774ali_queue_task(struct trident_card *card, int opt)
1775{
1776 u16 temp;
1777
1778 /* Disable GPIO IRQ (MISCINT bit 18h) */
1779 temp = inw(TRID_REG(card, T4D_MISCINT + 2));
1780 temp &= (u16) (~0x0004);
1781 outw(temp, TRID_REG(card, T4D_MISCINT + 2));
1782
1783 /* Adjust the volume */
1784 ali_hwvol_control(card, opt);
1785
1786 /* Set the timer for 1/10th sec */
1787 ali_set_timer(card);
1788}
1789
1790static void
1791cyber_address_interrupt(struct trident_card *card)
1792{
1793 int i, irq_status;
1794 struct trident_state *state;
1795 unsigned int channel;
1796
1797 /* Update the pointers for all channels we are running. */
1798 /* FIXED: read interrupt status only once */
1799 irq_status = inl(TRID_REG(card, T4D_AINT_A));
1800
1801 pr_debug("cyber_address_interrupt: irq_status 0x%X\n", irq_status);
1802
1803 for (i = 0; i < NR_HW_CH; i++) {
1804 channel = 31 - i;
1805 if (irq_status & (1 << channel)) {
1806 /* clear bit by writing a 1, zeroes are ignored */
1807 outl((1 << channel), TRID_REG(card, T4D_AINT_A));
1808
1809 pr_debug("cyber_interrupt: channel %d\n", channel);
1810
1811 if ((state = card->states[i]) != NULL) {
1812 trident_update_ptr(state);
1813 } else {
1814 printk(KERN_WARNING "cyber5050: spurious "
1815 "channel irq %d.\n", channel);
1816 trident_stop_voice(card, channel);
1817 trident_disable_voice_irq(card, channel);
1818 }
1819 }
1820 }
1821}
1822
1823static irqreturn_t
1824trident_interrupt(int irq, void *dev_id, struct pt_regs *regs)
1825{
1826 struct trident_card *card = (struct trident_card *) dev_id;
1827 u32 event;
1828 u32 gpio;
1829
1830 spin_lock(&card->lock);
1831 event = inl(TRID_REG(card, T4D_MISCINT));
1832
1833 pr_debug("trident: trident_interrupt called, MISCINT = 0x%08x\n",
1834 event);
1835
1836 if (event & ADDRESS_IRQ) {
1837 card->address_interrupt(card);
1838 }
1839
1840 if (card->pci_id == PCI_DEVICE_ID_ALI_5451) {
1841 /* GPIO IRQ (H/W Volume Control) */
1842 event = inl(TRID_REG(card, T4D_MISCINT));
1843 if (event & (1 << 25)) {
1844 gpio = inl(TRID_REG(card, ALI_GPIO));
1845 if (!timer_pending(&card->timer))
1846 ali_queue_task(card, gpio & 0x07);
1847 }
1848 event = inl(TRID_REG(card, T4D_MISCINT));
1849 outl(event | (ST_TARGET_REACHED | MIXER_OVERFLOW | MIXER_UNDERFLOW),
1850 TRID_REG(card, T4D_MISCINT));
1851 spin_unlock(&card->lock);
1852 return IRQ_HANDLED;
1853 }
1854
1855 /* manually clear interrupt status, bad hardware design, blame T^2 */
1856 outl((ST_TARGET_REACHED | MIXER_OVERFLOW | MIXER_UNDERFLOW),
1857 TRID_REG(card, T4D_MISCINT));
1858 spin_unlock(&card->lock);
1859 return IRQ_HANDLED;
1860}
1861
1862/* in this loop, dmabuf.count signifies the amount of data that is waiting */
1863/* to be copied to the user's buffer. it is filled by the dma machine and */
1864/* drained by this loop. */
1865static ssize_t
1866trident_read(struct file *file, char __user *buffer, size_t count, loff_t * ppos)
1867{
1868 struct trident_state *state = (struct trident_state *)file->private_data;
1869 struct dmabuf *dmabuf = &state->dmabuf;
1870 ssize_t ret = 0;
1871 unsigned long flags;
1872 unsigned swptr;
1873 int cnt;
1874
1875 pr_debug("trident: trident_read called, count = %d\n", count);
1876
1877 VALIDATE_STATE(state);
1878
1879 if (dmabuf->mapped)
1880 return -ENXIO;
1881 if (!access_ok(VERIFY_WRITE, buffer, count))
1882 return -EFAULT;
1883
1884 down(&state->sem);
1885 if (!dmabuf->ready && (ret = prog_dmabuf_record(state)))
1886 goto out;
1887
1888 while (count > 0) {
1889 spin_lock_irqsave(&state->card->lock, flags);
1890 if (dmabuf->count > (signed) dmabuf->dmasize) {
1891 /* buffer overrun, we are recovering from */
1892 /* sleep_on_timeout, resync hwptr and swptr, */
1893 /* make process flush the buffer */
1894 dmabuf->count = dmabuf->dmasize;
1895 dmabuf->swptr = dmabuf->hwptr;
1896 }
1897 swptr = dmabuf->swptr;
1898 cnt = dmabuf->dmasize - swptr;
1899 if (dmabuf->count < cnt)
1900 cnt = dmabuf->count;
1901 spin_unlock_irqrestore(&state->card->lock, flags);
1902
1903 if (cnt > count)
1904 cnt = count;
1905 if (cnt <= 0) {
1906 unsigned long tmo;
1907 /* buffer is empty, start the dma machine and */
1908 /* wait for data to be recorded */
1909 start_adc(state);
1910 if (file->f_flags & O_NONBLOCK) {
1911 if (!ret)
1912 ret = -EAGAIN;
1913 goto out;
1914 }
1915
1916 up(&state->sem);
1917 /* No matter how much space left in the buffer, */
1918 /* we have to wait until CSO == ESO/2 or CSO == ESO */
1919 /* when address engine interrupts */
1920 tmo = (dmabuf->dmasize * HZ) / (dmabuf->rate * 2);
1921 tmo >>= sample_shift[dmabuf->fmt];
1922 /* There are two situations when sleep_on_timeout returns, one is when
1923 the interrupt is serviced correctly and the process is waked up by
1924 ISR ON TIME. Another is when timeout is expired, which means that
1925 either interrupt is NOT serviced correctly (pending interrupt) or it
1926 is TOO LATE for the process to be scheduled to run (scheduler latency)
1927 which results in a (potential) buffer overrun. And worse, there is
1928 NOTHING we can do to prevent it. */
1929 if (!interruptible_sleep_on_timeout(&dmabuf->wait, tmo)) {
1930 pr_debug(KERN_ERR "trident: recording schedule timeout, "
1931 "dmasz %u fragsz %u count %i hwptr %u swptr %u\n",
1932 dmabuf->dmasize, dmabuf->fragsize, dmabuf->count,
1933 dmabuf->hwptr, dmabuf->swptr);
1934
1935 /* a buffer overrun, we delay the recovery until next time the
1936 while loop begin and we REALLY have space to record */
1937 }
1938 if (signal_pending(current)) {
1939 if (!ret)
1940 ret = -ERESTARTSYS;
1941 goto out;
1942 }
1943 down(&state->sem);
1944 if (dmabuf->mapped) {
1945 if (!ret)
1946 ret = -ENXIO;
1947 goto out;
1948 }
1949 continue;
1950 }
1951
1952 if (copy_to_user(buffer, dmabuf->rawbuf + swptr, cnt)) {
1953 if (!ret)
1954 ret = -EFAULT;
1955 goto out;
1956 }
1957
1958 swptr = (swptr + cnt) % dmabuf->dmasize;
1959
1960 spin_lock_irqsave(&state->card->lock, flags);
1961 dmabuf->swptr = swptr;
1962 dmabuf->count -= cnt;
1963 spin_unlock_irqrestore(&state->card->lock, flags);
1964
1965 count -= cnt;
1966 buffer += cnt;
1967 ret += cnt;
1968 start_adc(state);
1969 }
1970out:
1971 up(&state->sem);
1972 return ret;
1973}
1974
1975/* in this loop, dmabuf.count signifies the amount of data that is waiting to be dma to
1976 the soundcard. it is drained by the dma machine and filled by this loop. */
1977
1978static ssize_t
1979trident_write(struct file *file, const char __user *buffer, size_t count, loff_t * ppos)
1980{
1981 struct trident_state *state = (struct trident_state *)file->private_data;
1982 struct dmabuf *dmabuf = &state->dmabuf;
1983 ssize_t ret;
1984 unsigned long flags;
1985 unsigned swptr;
1986 int cnt;
1987 unsigned int state_cnt;
1988 unsigned int copy_count;
1989 int lret; /* for lock_set_fmt */
1990
1991 pr_debug("trident: trident_write called, count = %d\n", count);
1992
1993 VALIDATE_STATE(state);
1994
1995 /*
1996 * Guard against an mmap or ioctl while writing
1997 */
1998
1999 down(&state->sem);
2000
2001 if (dmabuf->mapped) {
2002 ret = -ENXIO;
2003 goto out;
2004 }
2005 if (!dmabuf->ready && (ret = prog_dmabuf_playback(state)))
2006 goto out;
2007
2008 if (!access_ok(VERIFY_READ, buffer, count)) {
2009 ret = -EFAULT;
2010 goto out;
2011 }
2012
2013 ret = 0;
2014
2015 while (count > 0) {
2016 spin_lock_irqsave(&state->card->lock, flags);
2017 if (dmabuf->count < 0) {
2018 /* buffer underrun, we are recovering from */
2019 /* sleep_on_timeout, resync hwptr and swptr */
2020 dmabuf->count = 0;
2021 dmabuf->swptr = dmabuf->hwptr;
2022 }
2023 swptr = dmabuf->swptr;
2024 cnt = dmabuf->dmasize - swptr;
2025 if (dmabuf->count + cnt > dmabuf->dmasize)
2026 cnt = dmabuf->dmasize - dmabuf->count;
2027 spin_unlock_irqrestore(&state->card->lock, flags);
2028
2029 if (cnt > count)
2030 cnt = count;
2031 if (cnt <= 0) {
2032 unsigned long tmo;
2033 /* buffer is full, start the dma machine and */
2034 /* wait for data to be played */
2035 start_dac(state);
2036 if (file->f_flags & O_NONBLOCK) {
2037 if (!ret)
2038 ret = -EAGAIN;
2039 goto out;
2040 }
2041 /* No matter how much data left in the buffer, */
2042 /* we have to wait until CSO == ESO/2 or CSO == ESO */
2043 /* when address engine interrupts */
2044 lock_set_fmt(state);
2045 tmo = (dmabuf->dmasize * HZ) / (dmabuf->rate * 2);
2046 tmo >>= sample_shift[dmabuf->fmt];
2047 unlock_set_fmt(state);
2048 up(&state->sem);
2049
2050 /* There are two situations when sleep_on_timeout */
2051 /* returns, one is when the interrupt is serviced */
2052 /* correctly and the process is waked up by ISR */
2053 /* ON TIME. Another is when timeout is expired, which */
2054 /* means that either interrupt is NOT serviced */
2055 /* correctly (pending interrupt) or it is TOO LATE */
2056 /* for the process to be scheduled to run */
2057 /* (scheduler latency) which results in a (potential) */
2058 /* buffer underrun. And worse, there is NOTHING we */
2059 /* can do to prevent it. */
2060 if (!interruptible_sleep_on_timeout(&dmabuf->wait, tmo)) {
2061 pr_debug(KERN_ERR "trident: playback schedule "
2062 "timeout, dmasz %u fragsz %u count %i "
2063 "hwptr %u swptr %u\n", dmabuf->dmasize,
2064 dmabuf->fragsize, dmabuf->count,
2065 dmabuf->hwptr, dmabuf->swptr);
2066
2067 /* a buffer underrun, we delay the recovery */
2068 /* until next time the while loop begin and */
2069 /* we REALLY have data to play */
2070 }
2071 if (signal_pending(current)) {
2072 if (!ret)
2073 ret = -ERESTARTSYS;
2074 goto out_nolock;
2075 }
2076 down(&state->sem);
2077 if (dmabuf->mapped) {
2078 if (!ret)
2079 ret = -ENXIO;
2080 goto out;
2081 }
2082 continue;
2083 }
2084 if ((lret = lock_set_fmt(state)) < 0) {
2085 ret = lret;
2086 goto out;
2087 }
2088
2089 if (state->chans_num == 6) {
2090 copy_count = 0;
2091 state_cnt = 0;
2092 if (ali_write_5_1(state, buffer, cnt, &copy_count,
2093 &state_cnt) == -EFAULT) {
2094 if (state_cnt) {
2095 swptr = (swptr + state_cnt) % dmabuf->dmasize;
2096 spin_lock_irqsave(&state->card->lock, flags);
2097 dmabuf->swptr = swptr;
2098 dmabuf->count += state_cnt;
2099 dmabuf->endcleared = 0;
2100 spin_unlock_irqrestore(&state->card->lock, flags);
2101 }
2102 ret += copy_count;
2103 if (!ret)
2104 ret = -EFAULT;
2105 unlock_set_fmt(state);
2106 goto out;
2107 }
2108 } else {
2109 if (copy_from_user(dmabuf->rawbuf + swptr,
2110 buffer, cnt)) {
2111 if (!ret)
2112 ret = -EFAULT;
2113 unlock_set_fmt(state);
2114 goto out;
2115 }
2116 state_cnt = cnt;
2117 }
2118 unlock_set_fmt(state);
2119
2120 swptr = (swptr + state_cnt) % dmabuf->dmasize;
2121
2122 spin_lock_irqsave(&state->card->lock, flags);
2123 dmabuf->swptr = swptr;
2124 dmabuf->count += state_cnt;
2125 dmabuf->endcleared = 0;
2126 spin_unlock_irqrestore(&state->card->lock, flags);
2127
2128 count -= cnt;
2129 buffer += cnt;
2130 ret += cnt;
2131 start_dac(state);
2132 }
2133out:
2134 up(&state->sem);
2135out_nolock:
2136 return ret;
2137}
2138
2139/* No kernel lock - we have our own spinlock */
2140static unsigned int
2141trident_poll(struct file *file, struct poll_table_struct *wait)
2142{
2143 struct trident_state *state = (struct trident_state *)file->private_data;
2144 struct dmabuf *dmabuf = &state->dmabuf;
2145 unsigned long flags;
2146 unsigned int mask = 0;
2147
2148 VALIDATE_STATE(state);
2149
2150 /*
2151 * Guard against a parallel poll and write causing multiple
2152 * prog_dmabuf events
2153 */
2154
2155 down(&state->sem);
2156
2157 if (file->f_mode & FMODE_WRITE) {
2158 if (!dmabuf->ready && prog_dmabuf_playback(state)) {
2159 up(&state->sem);
2160 return 0;
2161 }
2162 poll_wait(file, &dmabuf->wait, wait);
2163 }
2164 if (file->f_mode & FMODE_READ) {
2165 if (!dmabuf->ready && prog_dmabuf_record(state)) {
2166 up(&state->sem);
2167 return 0;
2168 }
2169 poll_wait(file, &dmabuf->wait, wait);
2170 }
2171
2172 up(&state->sem);
2173
2174 spin_lock_irqsave(&state->card->lock, flags);
2175 trident_update_ptr(state);
2176 if (file->f_mode & FMODE_READ) {
2177 if (dmabuf->count >= (signed) dmabuf->fragsize)
2178 mask |= POLLIN | POLLRDNORM;
2179 }
2180 if (file->f_mode & FMODE_WRITE) {
2181 if (dmabuf->mapped) {
2182 if (dmabuf->count >= (signed) dmabuf->fragsize)
2183 mask |= POLLOUT | POLLWRNORM;
2184 } else {
2185 if ((signed) dmabuf->dmasize >= dmabuf->count +
2186 (signed) dmabuf->fragsize)
2187 mask |= POLLOUT | POLLWRNORM;
2188 }
2189 }
2190 spin_unlock_irqrestore(&state->card->lock, flags);
2191
2192 return mask;
2193}
2194
2195static int
2196trident_mmap(struct file *file, struct vm_area_struct *vma)
2197{
2198 struct trident_state *state = (struct trident_state *)file->private_data;
2199 struct dmabuf *dmabuf = &state->dmabuf;
2200 int ret = -EINVAL;
2201 unsigned long size;
2202
2203 VALIDATE_STATE(state);
2204
2205 /*
2206 * Lock against poll read write or mmap creating buffers. Also lock
2207 * a read or write against an mmap.
2208 */
2209
2210 down(&state->sem);
2211
2212 if (vma->vm_flags & VM_WRITE) {
2213 if ((ret = prog_dmabuf_playback(state)) != 0)
2214 goto out;
2215 } else if (vma->vm_flags & VM_READ) {
2216 if ((ret = prog_dmabuf_record(state)) != 0)
2217 goto out;
2218 } else
2219 goto out;
2220
2221 ret = -EINVAL;
2222 if (vma->vm_pgoff != 0)
2223 goto out;
2224 size = vma->vm_end - vma->vm_start;
2225 if (size > (PAGE_SIZE << dmabuf->buforder))
2226 goto out;
2227 ret = -EAGAIN;
2228 if (remap_pfn_range(vma, vma->vm_start,
2229 virt_to_phys(dmabuf->rawbuf) >> PAGE_SHIFT,
2230 size, vma->vm_page_prot))
2231 goto out;
2232 dmabuf->mapped = 1;
2233 ret = 0;
2234out:
2235 up(&state->sem);
2236 return ret;
2237}
2238
2239static int
2240trident_ioctl(struct inode *inode, struct file *file,
2241 unsigned int cmd, unsigned long arg)
2242{
2243 struct trident_state *state = (struct trident_state *)file->private_data;
2244 struct dmabuf *dmabuf = &state->dmabuf;
2245 unsigned long flags;
2246 audio_buf_info abinfo;
2247 count_info cinfo;
2248 int val, mapped, ret = 0;
2249 struct trident_card *card = state->card;
2250 void __user *argp = (void __user *)arg;
2251 int __user *p = argp;
2252
2253 VALIDATE_STATE(state);
2254
2255
2256 mapped = ((file->f_mode & (FMODE_WRITE | FMODE_READ)) && dmabuf->mapped);
2257
2258 pr_debug("trident: trident_ioctl, command = %2d, arg = 0x%08x\n",
2259 _IOC_NR(cmd), arg ? *p : 0);
2260
2261 switch (cmd) {
2262 case OSS_GETVERSION:
2263 ret = put_user(SOUND_VERSION, p);
2264 break;
2265
2266 case SNDCTL_DSP_RESET:
2267 /* FIXME: spin_lock ? */
2268 if (file->f_mode & FMODE_WRITE) {
2269 stop_dac(state);
2270 synchronize_irq(card->irq);
2271 dmabuf->ready = 0;
2272 dmabuf->swptr = dmabuf->hwptr = 0;
2273 dmabuf->count = dmabuf->total_bytes = 0;
2274 }
2275 if (file->f_mode & FMODE_READ) {
2276 stop_adc(state);
2277 synchronize_irq(card->irq);
2278 dmabuf->ready = 0;
2279 dmabuf->swptr = dmabuf->hwptr = 0;
2280 dmabuf->count = dmabuf->total_bytes = 0;
2281 }
2282 break;
2283
2284 case SNDCTL_DSP_SYNC:
2285 if (file->f_mode & FMODE_WRITE)
2286 ret = drain_dac(state, file->f_flags & O_NONBLOCK);
2287 break;
2288
2289 case SNDCTL_DSP_SPEED: /* set smaple rate */
2290 if (get_user(val, p)) {
2291 ret = -EFAULT;
2292 break;
2293 }
2294 if (val >= 0) {
2295 if (file->f_mode & FMODE_WRITE) {
2296 stop_dac(state);
2297 dmabuf->ready = 0;
2298 spin_lock_irqsave(&state->card->lock, flags);
2299 trident_set_dac_rate(state, val);
2300 spin_unlock_irqrestore(&state->card->lock, flags);
2301 }
2302 if (file->f_mode & FMODE_READ) {
2303 stop_adc(state);
2304 dmabuf->ready = 0;
2305 spin_lock_irqsave(&state->card->lock, flags);
2306 trident_set_adc_rate(state, val);
2307 spin_unlock_irqrestore(&state->card->lock, flags);
2308 }
2309 }
2310 ret = put_user(dmabuf->rate, p);
2311 break;
2312
2313 case SNDCTL_DSP_STEREO: /* set stereo or mono channel */
2314 if (get_user(val, p)) {
2315 ret = -EFAULT;
2316 break;
2317 }
2318 if ((ret = lock_set_fmt(state)) < 0)
2319 return ret;
2320
2321 if (file->f_mode & FMODE_WRITE) {
2322 stop_dac(state);
2323 dmabuf->ready = 0;
2324 if (val)
2325 dmabuf->fmt |= TRIDENT_FMT_STEREO;
2326 else
2327 dmabuf->fmt &= ~TRIDENT_FMT_STEREO;
2328 }
2329 if (file->f_mode & FMODE_READ) {
2330 stop_adc(state);
2331 dmabuf->ready = 0;
2332 if (val)
2333 dmabuf->fmt |= TRIDENT_FMT_STEREO;
2334 else
2335 dmabuf->fmt &= ~TRIDENT_FMT_STEREO;
2336 }
2337 unlock_set_fmt(state);
2338 break;
2339
2340 case SNDCTL_DSP_GETBLKSIZE:
2341 if (file->f_mode & FMODE_WRITE) {
2342 if ((val = prog_dmabuf_playback(state)))
2343 ret = val;
2344 else
2345 ret = put_user(dmabuf->fragsize, p);
2346 break;
2347 }
2348 if (file->f_mode & FMODE_READ) {
2349 if ((val = prog_dmabuf_record(state)))
2350 ret = val;
2351 else
2352 ret = put_user(dmabuf->fragsize, p);
2353 break;
2354 }
2355 /* neither READ nor WRITE? is this even possible? */
2356 ret = -EINVAL;
2357 break;
2358
2359
2360 case SNDCTL_DSP_GETFMTS: /* Returns a mask of supported sample format */
2361 ret = put_user(AFMT_S16_LE | AFMT_U16_LE | AFMT_S8 |
2362 AFMT_U8, p);
2363 break;
2364
2365 case SNDCTL_DSP_SETFMT: /* Select sample format */
2366 if (get_user(val, p)) {
2367 ret = -EFAULT;
2368 break;
2369 }
2370 if ((ret = lock_set_fmt(state)) < 0)
2371 return ret;
2372
2373 if (val != AFMT_QUERY) {
2374 if (file->f_mode & FMODE_WRITE) {
2375 stop_dac(state);
2376 dmabuf->ready = 0;
2377 if (val == AFMT_S16_LE)
2378 dmabuf->fmt |= TRIDENT_FMT_16BIT;
2379 else
2380 dmabuf->fmt &= ~TRIDENT_FMT_16BIT;
2381 }
2382 if (file->f_mode & FMODE_READ) {
2383 stop_adc(state);
2384 dmabuf->ready = 0;
2385 if (val == AFMT_S16_LE)
2386 dmabuf->fmt |= TRIDENT_FMT_16BIT;
2387 else
2388 dmabuf->fmt &= ~TRIDENT_FMT_16BIT;
2389 }
2390 }
2391 unlock_set_fmt(state);
2392 ret = put_user((dmabuf->fmt & TRIDENT_FMT_16BIT) ? AFMT_S16_LE :
2393 AFMT_U8, p);
2394 break;
2395
2396 case SNDCTL_DSP_CHANNELS:
2397 if (get_user(val, p)) {
2398 ret = -EFAULT;
2399 break;
2400 }
2401 if (val != 0) {
2402 if ((ret = lock_set_fmt(state)) < 0)
2403 return ret;
2404
2405 if (file->f_mode & FMODE_WRITE) {
2406 stop_dac(state);
2407 dmabuf->ready = 0;
2408
2409 //prevent from memory leak
2410 if ((state->chans_num > 2) && (state->chans_num != val)) {
2411 ali_free_other_states_resources(state);
2412 state->chans_num = 1;
2413 }
2414
2415 if (val >= 2) {
2416
2417 dmabuf->fmt |= TRIDENT_FMT_STEREO;
2418 if ((val == 6) && (state->card->pci_id == PCI_DEVICE_ID_ALI_5451)) {
2419 if (card->rec_channel_use_count > 0) {
2420 printk(KERN_ERR "trident: Record is "
2421 "working on the card!\n");
2422 ret = -EBUSY;
2423 unlock_set_fmt(state);
2424 break;
2425 }
2426
2427 ret = ali_setup_multi_channels(state->card, 6);
2428 if (ret < 0) {
2429 unlock_set_fmt(state);
2430 break;
2431 }
2432 down(&state->card->open_sem);
2433 ret = ali_allocate_other_states_resources(state, 6);
2434 if (ret < 0) {
2435 up(&state->card->open_sem);
2436 unlock_set_fmt(state);
2437 break;
2438 }
2439 state->card->multi_channel_use_count++;
2440 up(&state->card->open_sem);
2441 } else
2442 val = 2; /*yield to 2-channels */
2443 } else
2444 dmabuf->fmt &= ~TRIDENT_FMT_STEREO;
2445 state->chans_num = val;
2446 }
2447 if (file->f_mode & FMODE_READ) {
2448 stop_adc(state);
2449 dmabuf->ready = 0;
2450 if (val >= 2) {
2451 if (!((file->f_mode & FMODE_WRITE) &&
2452 (val == 6)))
2453 val = 2;
2454 dmabuf->fmt |= TRIDENT_FMT_STEREO;
2455 } else
2456 dmabuf->fmt &= ~TRIDENT_FMT_STEREO;
2457 state->chans_num = val;
2458 }
2459 unlock_set_fmt(state);
2460 }
2461 ret = put_user(val, p);
2462 break;
2463
2464 case SNDCTL_DSP_POST:
2465 /* Cause the working fragment to be output */
2466 break;
2467
2468 case SNDCTL_DSP_SUBDIVIDE:
2469 if (dmabuf->subdivision) {
2470 ret = -EINVAL;
2471 break;
2472 }
2473 if (get_user(val, p)) {
2474 ret = -EFAULT;
2475 break;
2476 }
2477 if (val != 1 && val != 2 && val != 4) {
2478 ret = -EINVAL;
2479 break;
2480 }
2481 dmabuf->subdivision = val;
2482 break;
2483
2484 case SNDCTL_DSP_SETFRAGMENT:
2485 if (get_user(val, p)) {
2486 ret = -EFAULT;
2487 break;
2488 }
2489
2490 dmabuf->ossfragshift = val & 0xffff;
2491 dmabuf->ossmaxfrags = (val >> 16) & 0xffff;
2492 if (dmabuf->ossfragshift < 4)
2493 dmabuf->ossfragshift = 4;
2494 if (dmabuf->ossfragshift > 15)
2495 dmabuf->ossfragshift = 15;
2496 if (dmabuf->ossmaxfrags < 4)
2497 dmabuf->ossmaxfrags = 4;
2498
2499 break;
2500
2501 case SNDCTL_DSP_GETOSPACE:
2502 if (!(file->f_mode & FMODE_WRITE)) {
2503 ret = -EINVAL;
2504 break;
2505 }
2506 if (!dmabuf->ready && (val = prog_dmabuf_playback(state)) != 0) {
2507 ret = val;
2508 break;
2509 }
2510 spin_lock_irqsave(&state->card->lock, flags);
2511 trident_update_ptr(state);
2512 abinfo.fragsize = dmabuf->fragsize;
2513 abinfo.bytes = dmabuf->dmasize - dmabuf->count;
2514 abinfo.fragstotal = dmabuf->numfrag;
2515 abinfo.fragments = abinfo.bytes >> dmabuf->fragshift;
2516 spin_unlock_irqrestore(&state->card->lock, flags);
2517 ret = copy_to_user(argp, &abinfo, sizeof (abinfo)) ?
2518 -EFAULT : 0;
2519 break;
2520
2521 case SNDCTL_DSP_GETISPACE:
2522 if (!(file->f_mode & FMODE_READ)) {
2523 ret = -EINVAL;
2524 break;
2525 }
2526 if (!dmabuf->ready && (val = prog_dmabuf_record(state)) != 0) {
2527 ret = val;
2528 break;
2529 }
2530 spin_lock_irqsave(&state->card->lock, flags);
2531 trident_update_ptr(state);
2532 abinfo.fragsize = dmabuf->fragsize;
2533 abinfo.bytes = dmabuf->count;
2534 abinfo.fragstotal = dmabuf->numfrag;
2535 abinfo.fragments = abinfo.bytes >> dmabuf->fragshift;
2536 spin_unlock_irqrestore(&state->card->lock, flags);
2537 ret = copy_to_user(argp, &abinfo, sizeof (abinfo)) ?
2538 -EFAULT : 0;
2539 break;
2540
2541 case SNDCTL_DSP_NONBLOCK:
2542 file->f_flags |= O_NONBLOCK;
2543 break;
2544
2545 case SNDCTL_DSP_GETCAPS:
2546 ret = put_user(DSP_CAP_REALTIME | DSP_CAP_TRIGGER |
2547 DSP_CAP_MMAP | DSP_CAP_BIND, p);
2548 break;
2549
2550 case SNDCTL_DSP_GETTRIGGER:
2551 val = 0;
2552 if ((file->f_mode & FMODE_READ) && dmabuf->enable)
2553 val |= PCM_ENABLE_INPUT;
2554 if ((file->f_mode & FMODE_WRITE) && dmabuf->enable)
2555 val |= PCM_ENABLE_OUTPUT;
2556 ret = put_user(val, p);
2557 break;
2558
2559 case SNDCTL_DSP_SETTRIGGER:
2560 if (get_user(val, p)) {
2561 ret = -EFAULT;
2562 break;
2563 }
2564 if (file->f_mode & FMODE_READ) {
2565 if (val & PCM_ENABLE_INPUT) {
2566 if (!dmabuf->ready &&
2567 (ret = prog_dmabuf_record(state)))
2568 break;
2569 start_adc(state);
2570 } else
2571 stop_adc(state);
2572 }
2573 if (file->f_mode & FMODE_WRITE) {
2574 if (val & PCM_ENABLE_OUTPUT) {
2575 if (!dmabuf->ready &&
2576 (ret = prog_dmabuf_playback(state)))
2577 break;
2578 start_dac(state);
2579 } else
2580 stop_dac(state);
2581 }
2582 break;
2583
2584 case SNDCTL_DSP_GETIPTR:
2585 if (!(file->f_mode & FMODE_READ)) {
2586 ret = -EINVAL;
2587 break;
2588 }
2589 if (!dmabuf->ready && (val = prog_dmabuf_record(state))
2590 != 0) {
2591 ret = val;
2592 break;
2593 }
2594 spin_lock_irqsave(&state->card->lock, flags);
2595 trident_update_ptr(state);
2596 cinfo.bytes = dmabuf->total_bytes;
2597 cinfo.blocks = dmabuf->count >> dmabuf->fragshift;
2598 cinfo.ptr = dmabuf->hwptr;
2599 if (dmabuf->mapped)
2600 dmabuf->count &= dmabuf->fragsize - 1;
2601 spin_unlock_irqrestore(&state->card->lock, flags);
2602 ret = copy_to_user(argp, &cinfo, sizeof (cinfo)) ?
2603 -EFAULT : 0;
2604 break;
2605
2606 case SNDCTL_DSP_GETOPTR:
2607 if (!(file->f_mode & FMODE_WRITE)) {
2608 ret = -EINVAL;
2609 break;
2610 }
2611 if (!dmabuf->ready && (val = prog_dmabuf_playback(state))
2612 != 0) {
2613 ret = val;
2614 break;
2615 }
2616
2617 spin_lock_irqsave(&state->card->lock, flags);
2618 trident_update_ptr(state);
2619 cinfo.bytes = dmabuf->total_bytes;
2620 cinfo.blocks = dmabuf->count >> dmabuf->fragshift;
2621 cinfo.ptr = dmabuf->hwptr;
2622 if (dmabuf->mapped)
2623 dmabuf->count &= dmabuf->fragsize - 1;
2624 spin_unlock_irqrestore(&state->card->lock, flags);
2625 ret = copy_to_user(argp, &cinfo, sizeof (cinfo)) ?
2626 -EFAULT : 0;
2627 break;
2628
2629 case SNDCTL_DSP_SETDUPLEX:
2630 ret = -EINVAL;
2631 break;
2632
2633 case SNDCTL_DSP_GETODELAY:
2634 if (!(file->f_mode & FMODE_WRITE)) {
2635 ret = -EINVAL;
2636 break;
2637 }
2638 if (!dmabuf->ready && (val = prog_dmabuf_playback(state)) != 0) {
2639 ret = val;
2640 break;
2641 }
2642 spin_lock_irqsave(&state->card->lock, flags);
2643 trident_update_ptr(state);
2644 val = dmabuf->count;
2645 spin_unlock_irqrestore(&state->card->lock, flags);
2646 ret = put_user(val, p);
2647 break;
2648
2649 case SOUND_PCM_READ_RATE:
2650 ret = put_user(dmabuf->rate, p);
2651 break;
2652
2653 case SOUND_PCM_READ_CHANNELS:
2654 ret = put_user((dmabuf->fmt & TRIDENT_FMT_STEREO) ? 2 : 1,
2655 p);
2656 break;
2657
2658 case SOUND_PCM_READ_BITS:
2659 ret = put_user((dmabuf->fmt & TRIDENT_FMT_16BIT) ? AFMT_S16_LE :
2660 AFMT_U8, p);
2661 break;
2662
2663 case SNDCTL_DSP_GETCHANNELMASK:
2664 ret = put_user(DSP_BIND_FRONT | DSP_BIND_SURR |
2665 DSP_BIND_CENTER_LFE, p);
2666 break;
2667
2668 case SNDCTL_DSP_BIND_CHANNEL:
2669 if (state->card->pci_id != PCI_DEVICE_ID_SI_7018) {
2670 ret = -EINVAL;
2671 break;
2672 }
2673
2674 if (get_user(val, p)) {
2675 ret = -EFAULT;
2676 break;
2677 }
2678 if (val == DSP_BIND_QUERY) {
2679 val = dmabuf->channel->attribute | 0x3c00;
2680 val = attr2mask[val >> 8];
2681 } else {
2682 dmabuf->ready = 0;
2683 if (file->f_mode & FMODE_READ)
2684 dmabuf->channel->attribute = (CHANNEL_REC |
2685 SRC_ENABLE);
2686 if (file->f_mode & FMODE_WRITE)
2687 dmabuf->channel->attribute = (CHANNEL_SPC_PB |
2688 SRC_ENABLE);
2689 dmabuf->channel->attribute |= mask2attr[ffs(val)];
2690 }
2691 ret = put_user(val, p);
2692 break;
2693
2694 case SNDCTL_DSP_MAPINBUF:
2695 case SNDCTL_DSP_MAPOUTBUF:
2696 case SNDCTL_DSP_SETSYNCRO:
2697 case SOUND_PCM_WRITE_FILTER:
2698 case SOUND_PCM_READ_FILTER:
2699 default:
2700 ret = -EINVAL;
2701 break;
2702
2703 }
2704 return ret;
2705}
2706
2707static int
2708trident_open(struct inode *inode, struct file *file)
2709{
2710 int i = 0;
2711 int minor = iminor(inode);
2712 struct trident_card *card = devs;
2713 struct trident_state *state = NULL;
2714 struct dmabuf *dmabuf = NULL;
2715
2716 /* Added by Matt Wu 01-05-2001 */
2717 /* TODO: there's some redundacy here wrt the check below */
2718 /* for multi_use_count > 0. Should we return -EBUSY or find */
2719 /* a different card? for now, don't break current behaviour */
2720 /* -- mulix */
2721 if (file->f_mode & FMODE_READ) {
2722 if (card->pci_id == PCI_DEVICE_ID_ALI_5451) {
2723 if (card->multi_channel_use_count > 0)
2724 return -EBUSY;
2725 }
2726 }
2727
2728 /* find an available virtual channel (instance of /dev/dsp) */
2729 while (card != NULL) {
2730 down(&card->open_sem);
2731 if (file->f_mode & FMODE_READ) {
2732 /* Skip opens on cards that are in 6 channel mode */
2733 if (card->multi_channel_use_count > 0) {
2734 up(&card->open_sem);
2735 card = card->next;
2736 continue;
2737 }
2738 }
2739 for (i = 0; i < NR_HW_CH; i++) {
2740 if (card->states[i] == NULL) {
2741 state = card->states[i] = kmalloc(sizeof(*state), GFP_KERNEL);
2742 if (state == NULL) {
2743 up(&card->open_sem);
2744 return -ENOMEM;
2745 }
2746 memset(state, 0, sizeof(*state));
2747 init_MUTEX(&state->sem);
2748 dmabuf = &state->dmabuf;
2749 goto found_virt;
2750 }
2751 }
2752 up(&card->open_sem);
2753 card = card->next;
2754 }
2755 /* no more virtual channel avaiable */
2756 if (!state) {
2757 return -ENODEV;
2758 }
2759 found_virt:
2760 /* found a free virtual channel, allocate hardware channels */
2761 if (file->f_mode & FMODE_READ)
2762 dmabuf->channel = card->alloc_rec_pcm_channel(card);
2763 else
2764 dmabuf->channel = card->alloc_pcm_channel(card);
2765
2766 if (dmabuf->channel == NULL) {
2767 kfree(card->states[i]);
2768 card->states[i] = NULL;
2769 return -ENODEV;
2770 }
2771
2772 /* initialize the virtual channel */
2773 state->virt = i;
2774 state->card = card;
2775 state->magic = TRIDENT_STATE_MAGIC;
2776 init_waitqueue_head(&dmabuf->wait);
2777 file->private_data = state;
2778
2779 /* set default sample format. According to OSS Programmer's */
2780 /* Guide /dev/dsp should be default to unsigned 8-bits, mono, */
2781 /* with sample rate 8kHz and /dev/dspW will accept 16-bits sample */
2782 if (file->f_mode & FMODE_WRITE) {
2783 dmabuf->fmt &= ~TRIDENT_FMT_MASK;
2784 if ((minor & 0x0f) == SND_DEV_DSP16)
2785 dmabuf->fmt |= TRIDENT_FMT_16BIT;
2786 dmabuf->ossfragshift = 0;
2787 dmabuf->ossmaxfrags = 0;
2788 dmabuf->subdivision = 0;
2789 if (card->pci_id == PCI_DEVICE_ID_SI_7018) {
2790 /* set default channel attribute to normal playback */
2791 dmabuf->channel->attribute = CHANNEL_PB;
2792 }
2793 trident_set_dac_rate(state, 8000);
2794 }
2795
2796 if (file->f_mode & FMODE_READ) {
2797 /* FIXME: Trident 4d can only record in signed 16-bits stereo, */
2798 /* 48kHz sample, to be dealed with in trident_set_adc_rate() ?? */
2799 dmabuf->fmt &= ~TRIDENT_FMT_MASK;
2800 if ((minor & 0x0f) == SND_DEV_DSP16)
2801 dmabuf->fmt |= TRIDENT_FMT_16BIT;
2802 dmabuf->ossfragshift = 0;
2803 dmabuf->ossmaxfrags = 0;
2804 dmabuf->subdivision = 0;
2805 if (card->pci_id == PCI_DEVICE_ID_SI_7018) {
2806 /* set default channel attribute to 0x8a80, record from
2807 PCM L/R FIFO and mono = (left + right + 1)/2 */
2808 dmabuf->channel->attribute = (CHANNEL_REC | PCM_LR |
2809 MONO_MIX);
2810 }
2811 trident_set_adc_rate(state, 8000);
2812
2813 /* Added by Matt Wu 01-05-2001 */
2814 if (card->pci_id == PCI_DEVICE_ID_ALI_5451)
2815 card->rec_channel_use_count++;
2816 }
2817
2818 state->open_mode |= file->f_mode & (FMODE_READ | FMODE_WRITE);
2819 up(&card->open_sem);
2820
2821 pr_debug("trident: open virtual channel %d, hard channel %d\n",
2822 state->virt, dmabuf->channel->num);
2823
2824 return nonseekable_open(inode, file);
2825}
2826
2827static int
2828trident_release(struct inode *inode, struct file *file)
2829{
2830 struct trident_state *state = (struct trident_state *)file->private_data;
2831 struct trident_card *card;
2832 struct dmabuf *dmabuf;
2833
2834 VALIDATE_STATE(state);
2835
2836 card = state->card;
2837 dmabuf = &state->dmabuf;
2838
2839 if (file->f_mode & FMODE_WRITE) {
2840 trident_clear_tail(state);
2841 drain_dac(state, file->f_flags & O_NONBLOCK);
2842 }
2843
2844 pr_debug("trident: closing virtual channel %d, hard channel %d\n",
2845 state->virt, dmabuf->channel->num);
2846
2847 /* stop DMA state machine and free DMA buffers/channels */
2848 down(&card->open_sem);
2849
2850 if (file->f_mode & FMODE_WRITE) {
2851 stop_dac(state);
2852 dealloc_dmabuf(&state->dmabuf, state->card->pci_dev);
2853 state->card->free_pcm_channel(state->card, dmabuf->channel->num);
2854
2855 /* Added by Matt Wu */
2856 if (card->pci_id == PCI_DEVICE_ID_ALI_5451) {
2857 if (state->chans_num > 2) {
2858 if (card->multi_channel_use_count-- < 0)
2859 card->multi_channel_use_count = 0;
2860 if (card->multi_channel_use_count == 0)
2861 ali_close_multi_channels();
2862 ali_free_other_states_resources(state);
2863 }
2864 }
2865 }
2866 if (file->f_mode & FMODE_READ) {
2867 stop_adc(state);
2868 dealloc_dmabuf(&state->dmabuf, state->card->pci_dev);
2869 state->card->free_pcm_channel(state->card, dmabuf->channel->num);
2870
2871 /* Added by Matt Wu */
2872 if (card->pci_id == PCI_DEVICE_ID_ALI_5451) {
2873 if (card->rec_channel_use_count-- < 0)
2874 card->rec_channel_use_count = 0;
2875 }
2876 }
2877
2878 card->states[state->virt] = NULL;
2879 kfree(state);
2880
2881 /* we're covered by the open_sem */
2882 up(&card->open_sem);
2883
2884 return 0;
2885}
2886
2887static /*const */ struct file_operations trident_audio_fops = {
2888 .owner = THIS_MODULE,
2889 .llseek = no_llseek,
2890 .read = trident_read,
2891 .write = trident_write,
2892 .poll = trident_poll,
2893 .ioctl = trident_ioctl,
2894 .mmap = trident_mmap,
2895 .open = trident_open,
2896 .release = trident_release,
2897};
2898
2899/* trident specific AC97 functions */
2900/* Write AC97 codec registers */
2901static void
2902trident_ac97_set(struct ac97_codec *codec, u8 reg, u16 val)
2903{
2904 struct trident_card *card = (struct trident_card *)codec->private_data;
2905 unsigned int address, mask, busy;
2906 unsigned short count = 0xffff;
2907 unsigned long flags;
2908 u32 data;
2909
2910 data = ((u32) val) << 16;
2911
2912 switch (card->pci_id) {
2913 default:
2914 case PCI_DEVICE_ID_SI_7018:
2915 address = SI_AC97_WRITE;
2916 mask = SI_AC97_BUSY_WRITE | SI_AC97_AUDIO_BUSY;
2917 if (codec->id)
2918 mask |= SI_AC97_SECONDARY;
2919 busy = SI_AC97_BUSY_WRITE;
2920 break;
2921 case PCI_DEVICE_ID_TRIDENT_4DWAVE_DX:
2922 address = DX_ACR0_AC97_W;
2923 mask = busy = DX_AC97_BUSY_WRITE;
2924 break;
2925 case PCI_DEVICE_ID_TRIDENT_4DWAVE_NX:
2926 address = NX_ACR1_AC97_W;
2927 mask = NX_AC97_BUSY_WRITE;
2928 if (codec->id)
2929 mask |= NX_AC97_WRITE_SECONDARY;
2930 busy = NX_AC97_BUSY_WRITE;
2931 break;
2932 case PCI_DEVICE_ID_INTERG_5050:
2933 address = SI_AC97_WRITE;
2934 mask = busy = SI_AC97_BUSY_WRITE;
2935 if (codec->id)
2936 mask |= SI_AC97_SECONDARY;
2937 break;
2938 }
2939
2940 spin_lock_irqsave(&card->lock, flags);
2941 do {
2942 if ((inw(TRID_REG(card, address)) & busy) == 0)
2943 break;
2944 } while (count--);
2945
2946 data |= (mask | (reg & AC97_REG_ADDR));
2947
2948 if (count == 0) {
2949 printk(KERN_ERR "trident: AC97 CODEC write timed out.\n");
2950 spin_unlock_irqrestore(&card->lock, flags);
2951 return;
2952 }
2953
2954 outl(data, TRID_REG(card, address));
2955 spin_unlock_irqrestore(&card->lock, flags);
2956}
2957
2958/* Read AC97 codec registers */
2959static u16
2960trident_ac97_get(struct ac97_codec *codec, u8 reg)
2961{
2962 struct trident_card *card = (struct trident_card *)codec->private_data;
2963 unsigned int address, mask, busy;
2964 unsigned short count = 0xffff;
2965 unsigned long flags;
2966 u32 data;
2967
2968 switch (card->pci_id) {
2969 default:
2970 case PCI_DEVICE_ID_SI_7018:
2971 address = SI_AC97_READ;
2972 mask = SI_AC97_BUSY_READ | SI_AC97_AUDIO_BUSY;
2973 if (codec->id)
2974 mask |= SI_AC97_SECONDARY;
2975 busy = SI_AC97_BUSY_READ;
2976 break;
2977 case PCI_DEVICE_ID_TRIDENT_4DWAVE_DX:
2978 address = DX_ACR1_AC97_R;
2979 mask = busy = DX_AC97_BUSY_READ;
2980 break;
2981 case PCI_DEVICE_ID_TRIDENT_4DWAVE_NX:
2982 if (codec->id)
2983 address = NX_ACR3_AC97_R_SECONDARY;
2984 else
2985 address = NX_ACR2_AC97_R_PRIMARY;
2986 mask = NX_AC97_BUSY_READ;
2987 busy = NX_AC97_BUSY_READ | NX_AC97_BUSY_DATA;
2988 break;
2989 case PCI_DEVICE_ID_INTERG_5050:
2990 address = SI_AC97_READ;
2991 mask = busy = SI_AC97_BUSY_READ;
2992 if (codec->id)
2993 mask |= SI_AC97_SECONDARY;
2994 break;
2995 }
2996
2997 data = (mask | (reg & AC97_REG_ADDR));
2998
2999 spin_lock_irqsave(&card->lock, flags);
3000 outl(data, TRID_REG(card, address));
3001 do {
3002 data = inl(TRID_REG(card, address));
3003 if ((data & busy) == 0)
3004 break;
3005 } while (count--);
3006 spin_unlock_irqrestore(&card->lock, flags);
3007
3008 if (count == 0) {
3009 printk(KERN_ERR "trident: AC97 CODEC read timed out.\n");
3010 data = 0;
3011 }
3012 return ((u16) (data >> 16));
3013}
3014
3015/* rewrite ac97 read and write mixer register by hulei for ALI*/
3016static int
3017acquirecodecaccess(struct trident_card *card)
3018{
3019 u16 wsemamask = 0x6000; /* bit 14..13 */
3020 u16 wsemabits;
3021 u16 wcontrol;
3022 int block = 0;
3023 int ncount = 25;
3024 while (1) {
3025 wcontrol = inw(TRID_REG(card, ALI_AC97_WRITE));
3026 wsemabits = wcontrol & wsemamask;
3027
3028 if (wsemabits == 0x4000)
3029 return 1; /* 0x4000 is audio ,then success */
3030 if (ncount-- < 0)
3031 break;
3032 if (wsemabits == 0) {
3033 unlock:
3034 outl(((u32) (wcontrol & 0x1eff) | 0x00004000),
3035 TRID_REG(card, ALI_AC97_WRITE));
3036 continue;
3037 }
3038 udelay(20);
3039 }
3040 if (!block) {
3041 pr_debug("accesscodecsemaphore: try unlock\n");
3042 block = 1;
3043 goto unlock;
3044 }
3045 return 0;
3046}
3047
3048static void
3049releasecodecaccess(struct trident_card *card)
3050{
3051 unsigned long wcontrol;
3052 wcontrol = inl(TRID_REG(card, ALI_AC97_WRITE));
3053 outl((wcontrol & 0xffff1eff), TRID_REG(card, ALI_AC97_WRITE));
3054}
3055
3056static int
3057waitforstimertick(struct trident_card *card)
3058{
3059 unsigned long chk1, chk2;
3060 unsigned int wcount = 0xffff;
3061 chk1 = inl(TRID_REG(card, ALI_STIMER));
3062
3063 while (1) {
3064 chk2 = inl(TRID_REG(card, ALI_STIMER));
3065 if ((wcount > 0) && chk1 != chk2)
3066 return 1;
3067 if (wcount <= 0)
3068 break;
3069 udelay(50);
3070 }
3071 return 0;
3072}
3073
3074/* Read AC97 codec registers for ALi*/
3075static u16
3076ali_ac97_get(struct trident_card *card, int secondary, u8 reg)
3077{
3078 unsigned int address, mask;
3079 unsigned int ncount;
3080 unsigned long aud_reg;
3081 u32 data;
3082 u16 wcontrol;
3083 unsigned long flags;
3084
3085 if (!card)
3086 BUG();
3087
3088 address = ALI_AC97_READ;
3089 if (card->revision == ALI_5451_V02) {
3090 address = ALI_AC97_WRITE;
3091 }
3092 mask = ALI_AC97_READ_ACTION | ALI_AC97_AUDIO_BUSY;
3093 if (secondary)
3094 mask |= ALI_AC97_SECONDARY;
3095
3096 spin_lock_irqsave(&card->lock, flags);
3097
3098 if (!acquirecodecaccess(card))
3099 printk(KERN_ERR "access codec fail\n");
3100
3101 wcontrol = inw(TRID_REG(card, ALI_AC97_WRITE));
3102 wcontrol &= 0xfe00;
3103 wcontrol |= (0x8000 | reg);
3104 outw(wcontrol, TRID_REG(card, ALI_AC97_WRITE));
3105
3106 data = (mask | (reg & AC97_REG_ADDR));
3107
3108 if (!waitforstimertick(card)) {
3109 printk(KERN_ERR "ali_ac97_read: BIT_CLOCK is dead\n");
3110 goto releasecodec;
3111 }
3112
3113 udelay(20);
3114
3115 ncount = 10;
3116
3117 while (1) {
3118 if ((inw(TRID_REG(card, ALI_AC97_WRITE)) & ALI_AC97_BUSY_READ)
3119 != 0)
3120 break;
3121 if (ncount <= 0)
3122 break;
3123 if (ncount-- == 1) {
3124 pr_debug("ali_ac97_read :try clear busy flag\n");
3125 aud_reg = inl(TRID_REG(card, ALI_AC97_WRITE));
3126 outl((aud_reg & 0xffff7fff),
3127 TRID_REG(card, ALI_AC97_WRITE));
3128 }
3129 udelay(10);
3130 }
3131
3132 data = inl(TRID_REG(card, address));
3133
3134 spin_unlock_irqrestore(&card->lock, flags);
3135
3136 return ((u16) (data >> 16));
3137
3138 releasecodec:
3139 releasecodecaccess(card);
3140 spin_unlock_irqrestore(&card->lock, flags);
3141 printk(KERN_ERR "ali_ac97_read: AC97 CODEC read timed out.\n");
3142 return 0;
3143}
3144
3145/* Write AC97 codec registers for hulei*/
3146static void
3147ali_ac97_set(struct trident_card *card, int secondary, u8 reg, u16 val)
3148{
3149 unsigned int address, mask;
3150 unsigned int ncount;
3151 u32 data;
3152 u16 wcontrol;
3153 unsigned long flags;
3154
3155 data = ((u32) val) << 16;
3156
3157 if (!card)
3158 BUG();
3159
3160 address = ALI_AC97_WRITE;
3161 mask = ALI_AC97_WRITE_ACTION | ALI_AC97_AUDIO_BUSY;
3162 if (secondary)
3163 mask |= ALI_AC97_SECONDARY;
3164 if (card->revision == ALI_5451_V02)
3165 mask |= ALI_AC97_WRITE_MIXER_REGISTER;
3166
3167 spin_lock_irqsave(&card->lock, flags);
3168 if (!acquirecodecaccess(card))
3169 printk(KERN_ERR "ali_ac97_write: access codec fail\n");
3170
3171 wcontrol = inw(TRID_REG(card, ALI_AC97_WRITE));
3172 wcontrol &= 0xff00;
3173 wcontrol |= (0x8100 | reg); /* bit 8=1: (ali1535 )reserved/ */
3174 /* ali1535+ write */
3175 outl((data | wcontrol), TRID_REG(card, ALI_AC97_WRITE));
3176
3177 if (!waitforstimertick(card)) {
3178 printk(KERN_ERR "BIT_CLOCK is dead\n");
3179 goto releasecodec;
3180 }
3181
3182 ncount = 10;
3183 while (1) {
3184 wcontrol = inw(TRID_REG(card, ALI_AC97_WRITE));
3185 if (!(wcontrol & 0x8000))
3186 break;
3187 if (ncount <= 0)
3188 break;
3189 if (ncount-- == 1) {
3190 pr_debug("ali_ac97_set :try clear busy flag!!\n");
3191 outw(wcontrol & 0x7fff,
3192 TRID_REG(card, ALI_AC97_WRITE));
3193 }
3194 udelay(10);
3195 }
3196
3197 releasecodec:
3198 releasecodecaccess(card);
3199 spin_unlock_irqrestore(&card->lock, flags);
3200 return;
3201}
3202
3203static void
3204ali_enable_special_channel(struct trident_state *stat)
3205{
3206 struct trident_card *card = stat->card;
3207 unsigned long s_channels;
3208
3209 s_channels = inl(TRID_REG(card, ALI_GLOBAL_CONTROL));
3210 s_channels |= (1 << stat->dmabuf.channel->num);
3211 outl(s_channels, TRID_REG(card, ALI_GLOBAL_CONTROL));
3212}
3213
3214static u16
3215ali_ac97_read(struct ac97_codec *codec, u8 reg)
3216{
3217 int id;
3218 u16 data;
3219 struct trident_card *card = NULL;
3220
3221 /* Added by Matt Wu */
3222 if (!codec)
3223 BUG();
3224
3225 card = (struct trident_card *) codec->private_data;
3226
3227 if (!card->mixer_regs_ready)
3228 return ali_ac97_get(card, codec->id, reg);
3229
3230 /*
3231 * FIXME: need to stop this caching some registers
3232 */
3233 if (codec->id)
3234 id = 1;
3235 else
3236 id = 0;
3237
3238 data = card->mixer_regs[reg / 2][id];
3239 return data;
3240}
3241
3242static void
3243ali_ac97_write(struct ac97_codec *codec, u8 reg, u16 val)
3244{
3245 int id;
3246 struct trident_card *card;
3247
3248 /* Added by Matt Wu */
3249 if (!codec)
3250 BUG();
3251
3252 card = (struct trident_card *) codec->private_data;
3253
3254 if (!card->mixer_regs_ready) {
3255 ali_ac97_set(card, codec->id, reg, val);
3256 return;
3257 }
3258
3259 if (codec->id)
3260 id = 1;
3261 else
3262 id = 0;
3263
3264 card->mixer_regs[reg / 2][id] = val;
3265 ali_ac97_set(card, codec->id, reg, val);
3266}
3267
3268/*
3269flag: ALI_SPDIF_OUT_TO_SPDIF_OUT
3270 ALI_PCM_TO_SPDIF_OUT
3271*/
3272
3273static void
3274ali_setup_spdif_out(struct trident_card *card, int flag)
3275{
3276 unsigned long spdif;
3277 unsigned char ch;
3278
3279 char temp;
3280 struct pci_dev *pci_dev = NULL;
3281
3282 pci_dev = pci_find_device(PCI_VENDOR_ID_AL, PCI_DEVICE_ID_AL_M1533,
3283 pci_dev);
3284 if (pci_dev == NULL)
3285 return;
3286 pci_read_config_byte(pci_dev, 0x61, &temp);
3287 temp |= 0x40;
3288 pci_write_config_byte(pci_dev, 0x61, temp);
3289 pci_read_config_byte(pci_dev, 0x7d, &temp);
3290 temp |= 0x01;
3291 pci_write_config_byte(pci_dev, 0x7d, temp);
3292 pci_read_config_byte(pci_dev, 0x7e, &temp);
3293 temp &= (~0x20);
3294 temp |= 0x10;
3295 pci_write_config_byte(pci_dev, 0x7e, temp);
3296
3297 ch = inb(TRID_REG(card, ALI_SCTRL));
3298 outb(ch | ALI_SPDIF_OUT_ENABLE, TRID_REG(card, ALI_SCTRL));
3299 ch = inb(TRID_REG(card, ALI_SPDIF_CTRL));
3300 outb(ch & ALI_SPDIF_OUT_CH_STATUS, TRID_REG(card, ALI_SPDIF_CTRL));
3301
3302 if (flag & ALI_SPDIF_OUT_TO_SPDIF_OUT) {
3303 spdif = inw(TRID_REG(card, ALI_GLOBAL_CONTROL));
3304 spdif |= ALI_SPDIF_OUT_CH_ENABLE;
3305 spdif &= ALI_SPDIF_OUT_SEL_SPDIF;
3306 outw(spdif, TRID_REG(card, ALI_GLOBAL_CONTROL));
3307 spdif = inw(TRID_REG(card, ALI_SPDIF_CS));
3308 if (flag & ALI_SPDIF_OUT_NON_PCM)
3309 spdif |= 0x0002;
3310 else
3311 spdif &= (~0x0002);
3312 outw(spdif, TRID_REG(card, ALI_SPDIF_CS));
3313 } else {
3314 spdif = inw(TRID_REG(card, ALI_GLOBAL_CONTROL));
3315 spdif |= ALI_SPDIF_OUT_SEL_PCM;
3316 outw(spdif, TRID_REG(card, ALI_GLOBAL_CONTROL));
3317 }
3318}
3319
3320static void
3321ali_disable_special_channel(struct trident_card *card, int ch)
3322{
3323 unsigned long sc;
3324
3325 sc = inl(TRID_REG(card, ALI_GLOBAL_CONTROL));
3326 sc &= ~(1 << ch);
3327 outl(sc, TRID_REG(card, ALI_GLOBAL_CONTROL));
3328}
3329
3330static void
3331ali_disable_spdif_in(struct trident_card *card)
3332{
3333 unsigned long spdif;
3334
3335 spdif = inl(TRID_REG(card, ALI_GLOBAL_CONTROL));
3336 spdif &= (~ALI_SPDIF_IN_SUPPORT);
3337 outl(spdif, TRID_REG(card, ALI_GLOBAL_CONTROL));
3338
3339 ali_disable_special_channel(card, ALI_SPDIF_IN_CHANNEL);
3340}
3341
3342static void
3343ali_setup_spdif_in(struct trident_card *card)
3344{
3345 unsigned long spdif;
3346
3347 //Set SPDIF IN Supported
3348 spdif = inl(TRID_REG(card, ALI_GLOBAL_CONTROL));
3349 spdif |= ALI_SPDIF_IN_SUPPORT;
3350 outl(spdif, TRID_REG(card, ALI_GLOBAL_CONTROL));
3351
3352 //Set SPDIF IN Rec
3353 spdif = inl(TRID_REG(card, ALI_GLOBAL_CONTROL));
3354 spdif |= ALI_SPDIF_IN_CH_ENABLE;
3355 outl(spdif, TRID_REG(card, ALI_GLOBAL_CONTROL));
3356
3357 spdif = inb(TRID_REG(card, ALI_SPDIF_CTRL));
3358 spdif |= ALI_SPDIF_IN_CH_STATUS;
3359 outb(spdif, TRID_REG(card, ALI_SPDIF_CTRL));
3360/*
3361 spdif = inb(TRID_REG(card, ALI_SPDIF_CTRL));
3362 spdif |= ALI_SPDIF_IN_FUNC_ENABLE;
3363 outb(spdif, TRID_REG(card, ALI_SPDIF_CTRL));
3364*/
3365}
3366
3367static void
3368ali_delay(struct trident_card *card, int interval)
3369{
3370 unsigned long begintimer, currenttimer;
3371
3372 begintimer = inl(TRID_REG(card, ALI_STIMER));
3373 currenttimer = inl(TRID_REG(card, ALI_STIMER));
3374
3375 while (currenttimer < begintimer + interval)
3376 currenttimer = inl(TRID_REG(card, ALI_STIMER));
3377}
3378
3379static void
3380ali_detect_spdif_rate(struct trident_card *card)
3381{
3382 u16 wval = 0;
3383 u16 count = 0;
3384 u8 bval = 0, R1 = 0, R2 = 0;
3385
3386 bval = inb(TRID_REG(card, ALI_SPDIF_CTRL));
3387 bval |= 0x02;
3388 outb(bval, TRID_REG(card, ALI_SPDIF_CTRL));
3389
3390 bval = inb(TRID_REG(card, ALI_SPDIF_CTRL + 1));
3391 bval |= 0x1F;
3392 outb(bval, TRID_REG(card, ALI_SPDIF_CTRL + 1));
3393
3394 while (((R1 < 0x0B) || (R1 > 0x0E)) && (R1 != 0x12) &&
3395 count <= 50000) {
3396 count++;
3397
3398 ali_delay(card, 6);
3399
3400 bval = inb(TRID_REG(card, ALI_SPDIF_CTRL + 1));
3401 R1 = bval & 0x1F;
3402 }
3403
3404 if (count > 50000) {
3405 printk(KERN_WARNING "trident: Error in "
3406 "ali_detect_spdif_rate!\n");
3407 return;
3408 }
3409
3410 count = 0;
3411
3412 while (count <= 50000) {
3413 count++;
3414
3415 ali_delay(card, 6);
3416
3417 bval = inb(TRID_REG(card, ALI_SPDIF_CTRL + 1));
3418 R2 = bval & 0x1F;
3419
3420 if (R2 != R1)
3421 R1 = R2;
3422 else
3423 break;
3424 }
3425
3426 if (count > 50000) {
3427 printk(KERN_WARNING "trident: Error in "
3428 "ali_detect_spdif_rate!\n");
3429 return;
3430 }
3431
3432 switch (R2) {
3433 case 0x0b:
3434 case 0x0c:
3435 case 0x0d:
3436 case 0x0e:
3437 wval = inw(TRID_REG(card, ALI_SPDIF_CTRL + 2));
3438 wval &= 0xE0F0;
3439 wval |= (u16) 0x09 << 8 | (u16) 0x05;
3440 outw(wval, TRID_REG(card, ALI_SPDIF_CTRL + 2));
3441
3442 bval = inb(TRID_REG(card, ALI_SPDIF_CS + 3)) & 0xF0;
3443 outb(bval | 0x02, TRID_REG(card, ALI_SPDIF_CS + 3));
3444 break;
3445
3446 case 0x12:
3447 wval = inw(TRID_REG(card, ALI_SPDIF_CTRL + 2));
3448 wval &= 0xE0F0;
3449 wval |= (u16) 0x0E << 8 | (u16) 0x08;
3450 outw(wval, TRID_REG(card, ALI_SPDIF_CTRL + 2));
3451
3452 bval = inb(TRID_REG(card, ALI_SPDIF_CS + 3)) & 0xF0;
3453 outb(bval | 0x03, TRID_REG(card, ALI_SPDIF_CS + 3));
3454 break;
3455
3456 default:
3457 break;
3458 }
3459
3460}
3461
3462static unsigned int
3463ali_get_spdif_in_rate(struct trident_card *card)
3464{
3465 u32 dwRate = 0;
3466 u8 bval = 0;
3467
3468 ali_detect_spdif_rate(card);
3469
3470 bval = inb(TRID_REG(card, ALI_SPDIF_CTRL));
3471 bval &= 0x7F;
3472 bval |= 0x40;
3473 outb(bval, TRID_REG(card, ALI_SPDIF_CTRL));
3474
3475 bval = inb(TRID_REG(card, ALI_SPDIF_CS + 3));
3476 bval &= 0x0F;
3477
3478 switch (bval) {
3479 case 0:
3480 dwRate = 44100;
3481 break;
3482 case 1:
3483 dwRate = 48000;
3484 break;
3485 case 2:
3486 dwRate = 32000;
3487 break;
3488 default:
3489 // Error occurs
3490 break;
3491 }
3492
3493 return dwRate;
3494
3495}
3496
3497static int
3498ali_close_multi_channels(void)
3499{
3500 char temp = 0;
3501 struct pci_dev *pci_dev = NULL;
3502
3503 pci_dev = pci_find_device(PCI_VENDOR_ID_AL, PCI_DEVICE_ID_AL_M1533,
3504 pci_dev);
3505 if (pci_dev == NULL)
3506 return -1;
3507 pci_read_config_byte(pci_dev, 0x59, &temp);
3508 temp &= ~0x80;
3509 pci_write_config_byte(pci_dev, 0x59, temp);
3510
3511 pci_dev = pci_find_device(PCI_VENDOR_ID_AL, PCI_DEVICE_ID_AL_M7101,
3512 pci_dev);
3513 if (pci_dev == NULL)
3514 return -1;
3515
3516 pci_read_config_byte(pci_dev, 0xB8, &temp);
3517 temp &= ~0x20;
3518 pci_write_config_byte(pci_dev, 0xB8, temp);
3519
3520 return 0;
3521}
3522
3523static int
3524ali_setup_multi_channels(struct trident_card *card, int chan_nums)
3525{
3526 unsigned long dwValue;
3527 char temp = 0;
3528 struct pci_dev *pci_dev = NULL;
3529
3530 pci_dev = pci_find_device(PCI_VENDOR_ID_AL, PCI_DEVICE_ID_AL_M1533,
3531 pci_dev);
3532 if (pci_dev == NULL)
3533 return -1;
3534 pci_read_config_byte(pci_dev, 0x59, &temp);
3535 temp |= 0x80;
3536 pci_write_config_byte(pci_dev, 0x59, temp);
3537
3538 pci_dev = pci_find_device(PCI_VENDOR_ID_AL, PCI_DEVICE_ID_AL_M7101,
3539 pci_dev);
3540 if (pci_dev == NULL)
3541 return -1;
3542 pci_read_config_byte(pci_dev, (int) 0xB8, &temp);
3543 temp |= 0x20;
3544 pci_write_config_byte(pci_dev, (int) 0xB8, (u8) temp);
3545 if (chan_nums == 6) {
3546 dwValue = inl(TRID_REG(card, ALI_SCTRL)) | 0x000f0000;
3547 outl(dwValue, TRID_REG(card, ALI_SCTRL));
3548 mdelay(4);
3549 dwValue = inl(TRID_REG(card, ALI_SCTRL));
3550 if (dwValue & 0x2000000) {
3551 ali_ac97_write(card->ac97_codec[0], 0x02, 8080);
3552 ali_ac97_write(card->ac97_codec[0], 0x36, 0);
3553 ali_ac97_write(card->ac97_codec[0], 0x38, 0);
3554 /*
3555 * On a board with a single codec you won't get the
3556 * surround. On other boards configure it.
3557 */
3558 if (card->ac97_codec[1] != NULL) {
3559 ali_ac97_write(card->ac97_codec[1], 0x36, 0);
3560 ali_ac97_write(card->ac97_codec[1], 0x38, 0);
3561 ali_ac97_write(card->ac97_codec[1], 0x02, 0x0606);
3562 ali_ac97_write(card->ac97_codec[1], 0x18, 0x0303);
3563 ali_ac97_write(card->ac97_codec[1], 0x74, 0x3);
3564 }
3565 return 1;
3566 }
3567 }
3568 return -EINVAL;
3569}
3570
3571static void
3572ali_free_pcm_channel(struct trident_card *card, unsigned int channel)
3573{
3574 int bank;
3575
3576 if (channel > 31)
3577 return;
3578
3579 bank = channel >> 5;
3580 channel = channel & 0x1f;
3581
3582 card->banks[bank].bitmap &= ~(1 << (channel));
3583}
3584
3585static int
3586ali_allocate_other_states_resources(struct trident_state *state, int chan_nums)
3587{
3588 struct trident_card *card = state->card;
3589 struct trident_state *s;
3590 int i, state_count = 0;
3591 struct trident_pcm_bank *bank;
3592 struct trident_channel *channel;
3593 unsigned long num;
3594
3595 bank = &card->banks[BANK_A];
3596
3597 if (chan_nums != 6)
3598 return 0;
3599
3600 for (i = 0; (i < ALI_CHANNELS) && (state_count != 4); i++) {
3601 if (card->states[i])
3602 continue;
3603
3604 num = ali_multi_channels_5_1[state_count];
3605 if (!(bank->bitmap & (1 << num))) {
3606 bank->bitmap |= 1 << num;
3607 channel = &bank->channels[num];
3608 channel->num = num;
3609 } else {
3610 state_count--;
3611 for (; state_count >= 0; state_count--) {
3612 kfree(state->other_states[state_count]);
3613 num = ali_multi_channels_5_1[state_count];
3614 ali_free_pcm_channel(card, num);
3615 }
3616 return -EBUSY;
3617 }
3618 s = card->states[i] = kmalloc(sizeof(*state), GFP_KERNEL);
3619 if (!s) {
3620 num = ali_multi_channels_5_1[state_count];
3621 ali_free_pcm_channel(card, num);
3622 state_count--;
3623 for (; state_count >= 0; state_count--) {
3624 num = ali_multi_channels_5_1[state_count];
3625 ali_free_pcm_channel(card, num);
3626 kfree(state->other_states[state_count]);
3627 }
3628 return -ENOMEM;
3629 }
3630 memset(s, 0, sizeof(*state));
3631
3632 s->dmabuf.channel = channel;
3633 s->dmabuf.ossfragshift = s->dmabuf.ossmaxfrags =
3634 s->dmabuf.subdivision = 0;
3635 init_waitqueue_head(&s->dmabuf.wait);
3636 s->magic = card->magic;
3637 s->card = card;
3638 s->virt = i;
3639 ali_enable_special_channel(s);
3640 state->other_states[state_count++] = s;
3641 }
3642
3643 if (state_count != 4) {
3644 state_count--;
3645 for (; state_count >= 0; state_count--) {
3646 kfree(state->other_states[state_count]);
3647 num = ali_multi_channels_5_1[state_count];
3648 ali_free_pcm_channel(card, num);
3649 }
3650 return -EBUSY;
3651 }
3652 return 0;
3653}
3654
3655static void
3656ali_save_regs(struct trident_card *card)
3657{
3658 unsigned long flags;
3659 int i, j;
3660
3661 spin_lock_irqsave(&card->lock, flags);
3662
3663 ali_registers.global_regs[0x2c] = inl(TRID_REG(card, T4D_MISCINT));
3664 //ali_registers.global_regs[0x20] = inl(TRID_REG(card,T4D_START_A));
3665 ali_registers.global_regs[0x21] = inl(TRID_REG(card, T4D_STOP_A));
3666
3667 //disable all IRQ bits
3668 outl(ALI_DISABLE_ALL_IRQ, TRID_REG(card, T4D_MISCINT));
3669
3670 for (i = 1; i < ALI_MIXER_REGS; i++)
3671 ali_registers.mixer_regs[i] = ali_ac97_read(card->ac97_codec[0],
3672 i * 2);
3673
3674 for (i = 0; i < ALI_GLOBAL_REGS; i++) {
3675 if ((i * 4 == T4D_MISCINT) || (i * 4 == T4D_STOP_A))
3676 continue;
3677 ali_registers.global_regs[i] = inl(TRID_REG(card, i * 4));
3678 }
3679
3680 for (i = 0; i < ALI_CHANNELS; i++) {
3681 outb(i, TRID_REG(card, T4D_LFO_GC_CIR));
3682 for (j = 0; j < ALI_CHANNEL_REGS; j++)
3683 ali_registers.channel_regs[i][j] = inl(TRID_REG(card,
3684 j * 4 + 0xe0));
3685 }
3686
3687 //Stop all HW channel
3688 outl(ALI_STOP_ALL_CHANNELS, TRID_REG(card, T4D_STOP_A));
3689
3690 spin_unlock_irqrestore(&card->lock, flags);
3691}
3692
3693static void
3694ali_restore_regs(struct trident_card *card)
3695{
3696 unsigned long flags;
3697 int i, j;
3698
3699 spin_lock_irqsave(&card->lock, flags);
3700
3701 for (i = 1; i < ALI_MIXER_REGS; i++)
3702 ali_ac97_write(card->ac97_codec[0], i * 2,
3703 ali_registers.mixer_regs[i]);
3704
3705 for (i = 0; i < ALI_CHANNELS; i++) {
3706 outb(i, TRID_REG(card, T4D_LFO_GC_CIR));
3707 for (j = 0; j < ALI_CHANNEL_REGS; j++)
3708 outl(ali_registers.channel_regs[i][j],
3709 TRID_REG(card, j * 4 + 0xe0));
3710 }
3711
3712 for (i = 0; i < ALI_GLOBAL_REGS; i++) {
3713 if ((i * 4 == T4D_MISCINT) || (i * 4 == T4D_STOP_A) ||
3714 (i * 4 == T4D_START_A))
3715 continue;
3716 outl(ali_registers.global_regs[i], TRID_REG(card, i * 4));
3717 }
3718
3719 //start HW channel
3720 outl(ali_registers.global_regs[0x20], TRID_REG(card, T4D_START_A));
3721 //restore IRQ enable bits
3722 outl(ali_registers.global_regs[0x2c], TRID_REG(card, T4D_MISCINT));
3723
3724 spin_unlock_irqrestore(&card->lock, flags);
3725}
3726
3727static int
3728trident_suspend(struct pci_dev *dev, pm_message_t unused)
3729{
3730 struct trident_card *card = pci_get_drvdata(dev);
3731
3732 if (card->pci_id == PCI_DEVICE_ID_ALI_5451) {
3733 ali_save_regs(card);
3734 }
3735 return 0;
3736}
3737
3738static int
3739trident_resume(struct pci_dev *dev)
3740{
3741 struct trident_card *card = pci_get_drvdata(dev);
3742
3743 if (card->pci_id == PCI_DEVICE_ID_ALI_5451) {
3744 ali_restore_regs(card);
3745 }
3746 return 0;
3747}
3748
3749static struct trident_channel *
3750ali_alloc_pcm_channel(struct trident_card *card)
3751{
3752 struct trident_pcm_bank *bank;
3753 int idx;
3754
3755 bank = &card->banks[BANK_A];
3756
3757 if (inl(TRID_REG(card, ALI_GLOBAL_CONTROL)) &
3758 (ALI_SPDIF_OUT_CH_ENABLE)) {
3759 idx = ALI_SPDIF_OUT_CHANNEL;
3760 if (!(bank->bitmap & (1 << idx))) {
3761 struct trident_channel *channel = &bank->channels[idx];
3762 bank->bitmap |= 1 << idx;
3763 channel->num = idx;
3764 return channel;
3765 }
3766 }
3767
3768 for (idx = ALI_PCM_OUT_CHANNEL_FIRST; idx <= ALI_PCM_OUT_CHANNEL_LAST;
3769 idx++) {
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;
3775 }
3776 }
3777
3778 /* no more free channels avaliable */
3779#if 0
3780 printk(KERN_ERR "ali: no more channels available on Bank A.\n");
3781#endif /* 0 */
3782 return NULL;
3783}
3784
3785static struct trident_channel *
3786ali_alloc_rec_pcm_channel(struct trident_card *card)
3787{
3788 struct trident_pcm_bank *bank;
3789 int idx;
3790
3791 if (inl(TRID_REG(card, ALI_GLOBAL_CONTROL)) & ALI_SPDIF_IN_SUPPORT)
3792 idx = ALI_SPDIF_IN_CHANNEL;
3793 else
3794 idx = ALI_PCM_IN_CHANNEL;
3795
3796 bank = &card->banks[BANK_A];
3797
3798 if (!(bank->bitmap & (1 << idx))) {
3799 struct trident_channel *channel = &bank->channels[idx];
3800 bank->bitmap |= 1 << idx;
3801 channel->num = idx;
3802 return channel;
3803 }
3804
3805 /* no free recordable channels avaliable */
3806#if 0
3807 printk(KERN_ERR "ali: no recordable channels available on Bank A.\n");
3808#endif /* 0 */
3809 return NULL;
3810}
3811
3812static void
3813ali_set_spdif_out_rate(struct trident_card *card, unsigned int rate)
3814{
3815 unsigned char ch_st_sel;
3816 unsigned short status_rate;
3817
3818 switch (rate) {
3819 case 44100:
3820 status_rate = 0;
3821 break;
3822 case 32000:
3823 status_rate = 0x300;
3824 break;
3825 case 48000:
3826 default:
3827 status_rate = 0x200;
3828 break;
3829 }
3830
3831 /* select spdif_out */
3832 ch_st_sel = inb(TRID_REG(card, ALI_SPDIF_CTRL)) & ALI_SPDIF_OUT_CH_STATUS;
3833
3834 ch_st_sel |= 0x80; /* select right */
3835 outb(ch_st_sel, TRID_REG(card, ALI_SPDIF_CTRL));
3836 outb(status_rate | 0x20, TRID_REG(card, ALI_SPDIF_CS + 2));
3837
3838 ch_st_sel &= (~0x80); /* select left */
3839 outb(ch_st_sel, TRID_REG(card, ALI_SPDIF_CTRL));
3840 outw(status_rate | 0x10, TRID_REG(card, ALI_SPDIF_CS + 2));
3841}
3842
3843static void
3844ali_address_interrupt(struct trident_card *card)
3845{
3846 int i, channel;
3847 struct trident_state *state;
3848 u32 mask, channel_mask;
3849
3850 mask = trident_get_interrupt_mask(card, 0);
3851 for (i = 0; i < NR_HW_CH; i++) {
3852 if ((state = card->states[i]) == NULL)
3853 continue;
3854 channel = state->dmabuf.channel->num;
3855 if ((channel_mask = 1 << channel) & mask) {
3856 mask &= ~channel_mask;
3857 trident_ack_channel_interrupt(card, channel);
3858 udelay(100);
3859 state->dmabuf.update_flag |= ALI_ADDRESS_INT_UPDATE;
3860 trident_update_ptr(state);
3861 }
3862 }
3863 if (mask) {
3864 for (i = 0; i < NR_HW_CH; i++) {
3865 if (mask & (1 << i)) {
3866 printk("ali: spurious channel irq %d.\n", i);
3867 trident_ack_channel_interrupt(card, i);
3868 trident_stop_voice(card, i);
3869 trident_disable_voice_irq(card, i);
3870 }
3871 }
3872 }
3873}
3874
3875/* Updating the values of counters of other_states' DMAs without lock
3876protection is no harm because all DMAs of multi-channels and interrupt
3877depend on a master state's DMA, and changing the counters of the master
3878state DMA is protected by a spinlock.
3879*/
3880static int
3881ali_write_5_1(struct trident_state *state, const char __user *buf,
3882 int cnt_for_multi_channel, unsigned int *copy_count,
3883 unsigned int *state_cnt)
3884{
3885
3886 struct dmabuf *dmabuf = &state->dmabuf;
3887 struct dmabuf *dmabuf_temp;
3888 const char __user *buffer = buf;
3889 unsigned swptr, other_dma_nums, sample_s;
3890 unsigned int i, loop;
3891
3892 other_dma_nums = 4;
3893 sample_s = sample_size[dmabuf->fmt] >> 1;
3894 swptr = dmabuf->swptr;
3895
3896 if ((i = state->multi_channels_adjust_count) > 0) {
3897 if (i == 1) {
3898 if (copy_from_user(dmabuf->rawbuf + swptr,
3899 buffer, sample_s))
3900 return -EFAULT;
3901 seek_offset(swptr, buffer, cnt_for_multi_channel,
3902 sample_s, *copy_count);
3903 i--;
3904 (*state_cnt) += sample_s;
3905 state->multi_channels_adjust_count++;
3906 } else
3907 i = i - (state->chans_num - other_dma_nums);
3908 for (; (i < other_dma_nums) && (cnt_for_multi_channel > 0); i++) {
3909 dmabuf_temp = &state->other_states[i]->dmabuf;
3910 if (copy_from_user(dmabuf_temp->rawbuf + dmabuf_temp->swptr,
3911 buffer, sample_s))
3912 return -EFAULT;
3913 seek_offset(dmabuf_temp->swptr, buffer, cnt_for_multi_channel,
3914 sample_s, *copy_count);
3915 }
3916 if (cnt_for_multi_channel == 0)
3917 state->multi_channels_adjust_count += i;
3918 }
3919 if (cnt_for_multi_channel > 0) {
3920 loop = cnt_for_multi_channel / (state->chans_num * sample_s);
3921 for (i = 0; i < loop; i++) {
3922 if (copy_from_user(dmabuf->rawbuf + swptr, buffer,
3923 sample_s * 2))
3924 return -EFAULT;
3925 seek_offset(swptr, buffer, cnt_for_multi_channel,
3926 sample_s * 2, *copy_count);
3927 (*state_cnt) += (sample_s * 2);
3928
3929 dmabuf_temp = &state->other_states[0]->dmabuf;
3930 if (copy_from_user(dmabuf_temp->rawbuf + dmabuf_temp->swptr,
3931 buffer, sample_s))
3932 return -EFAULT;
3933 seek_offset(dmabuf_temp->swptr, buffer, cnt_for_multi_channel,
3934 sample_s, *copy_count);
3935
3936 dmabuf_temp = &state->other_states[1]->dmabuf;
3937 if (copy_from_user(dmabuf_temp->rawbuf + dmabuf_temp->swptr,
3938 buffer, sample_s))
3939 return -EFAULT;
3940 seek_offset(dmabuf_temp->swptr, buffer, cnt_for_multi_channel,
3941 sample_s, *copy_count);
3942
3943 dmabuf_temp = &state->other_states[2]->dmabuf;
3944 if (copy_from_user(dmabuf_temp->rawbuf + dmabuf_temp->swptr,
3945 buffer, sample_s))
3946 return -EFAULT;
3947 seek_offset(dmabuf_temp->swptr, buffer, cnt_for_multi_channel,
3948 sample_s, *copy_count);
3949
3950 dmabuf_temp = &state->other_states[3]->dmabuf;
3951 if (copy_from_user(dmabuf_temp->rawbuf + dmabuf_temp->swptr,
3952 buffer, sample_s))
3953 return -EFAULT;
3954 seek_offset(dmabuf_temp->swptr, buffer, cnt_for_multi_channel,
3955 sample_s, *copy_count);
3956 }
3957
3958 if (cnt_for_multi_channel > 0) {
3959 state->multi_channels_adjust_count = cnt_for_multi_channel / sample_s;
3960
3961 if (copy_from_user(dmabuf->rawbuf + swptr, buffer, sample_s))
3962 return -EFAULT;
3963 seek_offset(swptr, buffer, cnt_for_multi_channel,
3964 sample_s, *copy_count);
3965 (*state_cnt) += sample_s;
3966
3967 if (cnt_for_multi_channel > 0) {
3968 if (copy_from_user(dmabuf->rawbuf + swptr,
3969 buffer, sample_s))
3970 return -EFAULT;
3971 seek_offset(swptr, buffer, cnt_for_multi_channel,
3972 sample_s, *copy_count);
3973 (*state_cnt) += sample_s;
3974
3975 if (cnt_for_multi_channel > 0) {
3976 int diff = state->chans_num - other_dma_nums;
3977 loop = state->multi_channels_adjust_count - diff;
3978 for (i = 0; i < loop; i++) {
3979 dmabuf_temp = &state->other_states[i]->dmabuf;
3980 if (copy_from_user(dmabuf_temp->rawbuf +
3981 dmabuf_temp->swptr,
3982 buffer, sample_s))
3983 return -EFAULT;
3984 seek_offset(dmabuf_temp->swptr, buffer,
3985 cnt_for_multi_channel,
3986 sample_s, *copy_count);
3987 }
3988 }
3989 }
3990 } else
3991 state->multi_channels_adjust_count = 0;
3992 }
3993 for (i = 0; i < other_dma_nums; i++) {
3994 dmabuf_temp = &state->other_states[i]->dmabuf;
3995 dmabuf_temp->swptr = dmabuf_temp->swptr % dmabuf_temp->dmasize;
3996 }
3997 return *state_cnt;
3998}
3999
4000static void
4001ali_free_other_states_resources(struct trident_state *state)
4002{
4003 int i;
4004 struct trident_card *card = state->card;
4005 struct trident_state *s;
4006 unsigned other_states_count;
4007
4008 other_states_count = state->chans_num - 2; /* except PCM L/R channels */
4009 for (i = 0; i < other_states_count; i++) {
4010 s = state->other_states[i];
4011 dealloc_dmabuf(&s->dmabuf, card->pci_dev);
4012 ali_disable_special_channel(s->card, s->dmabuf.channel->num);
4013 state->card->free_pcm_channel(s->card, s->dmabuf.channel->num);
4014 card->states[s->virt] = NULL;
4015 kfree(s);
4016 }
4017}
4018
4019static struct proc_dir_entry *res;
4020
4021static int
4022ali_write_proc(struct file *file, const char __user *buffer, unsigned long count, void *data)
4023{
4024 struct trident_card *card = (struct trident_card *) data;
4025 unsigned long flags;
4026 char c;
4027
4028 if (count < 0)
4029 return -EINVAL;
4030 if (count == 0)
4031 return 0;
4032 if (get_user(c, buffer))
4033 return -EFAULT;
4034
4035 spin_lock_irqsave(&card->lock, flags);
4036 switch (c) {
4037 case '0':
4038 ali_setup_spdif_out(card, ALI_PCM_TO_SPDIF_OUT);
4039 ali_disable_special_channel(card, ALI_SPDIF_OUT_CHANNEL);
4040 break;
4041 case '1':
4042 ali_setup_spdif_out(card, ALI_SPDIF_OUT_TO_SPDIF_OUT |
4043 ALI_SPDIF_OUT_PCM);
4044 break;
4045 case '2':
4046 ali_setup_spdif_out(card, ALI_SPDIF_OUT_TO_SPDIF_OUT |
4047 ALI_SPDIF_OUT_NON_PCM);
4048 break;
4049 case '3':
4050 ali_disable_spdif_in(card); //default
4051 break;
4052 case '4':
4053 ali_setup_spdif_in(card);
4054 break;
4055 }
4056 spin_unlock_irqrestore(&card->lock, flags);
4057
4058 return count;
4059}
4060
4061/* OSS /dev/mixer file operation methods */
4062static int
4063trident_open_mixdev(struct inode *inode, struct file *file)
4064{
4065 int i = 0;
4066 int minor = iminor(inode);
4067 struct trident_card *card = devs;
4068
4069 for (card = devs; card != NULL; card = card->next)
4070 for (i = 0; i < NR_AC97; i++)
4071 if (card->ac97_codec[i] != NULL &&
4072 card->ac97_codec[i]->dev_mixer == minor)
4073 goto match;
4074
4075 if (!card) {
4076 return -ENODEV;
4077 }
4078 match:
4079 file->private_data = card->ac97_codec[i];
4080
4081 return nonseekable_open(inode, file);
4082}
4083
4084static int
4085trident_ioctl_mixdev(struct inode *inode, struct file *file, unsigned int cmd,
4086 unsigned long arg)
4087{
4088 struct ac97_codec *codec = (struct ac97_codec *) file->private_data;
4089
4090 return codec->mixer_ioctl(codec, cmd, arg);
4091}
4092
4093static /*const */ struct file_operations trident_mixer_fops = {
4094 .owner = THIS_MODULE,
4095 .llseek = no_llseek,
4096 .ioctl = trident_ioctl_mixdev,
4097 .open = trident_open_mixdev,
4098};
4099
4100static int
4101ali_reset_5451(struct trident_card *card)
4102{
4103 struct pci_dev *pci_dev = NULL;
4104 unsigned int dwVal;
4105 unsigned short wCount, wReg;
4106
4107 pci_dev = pci_find_device(PCI_VENDOR_ID_AL, PCI_DEVICE_ID_AL_M1533,
4108 pci_dev);
4109 if (pci_dev == NULL)
4110 return -1;
4111
4112 pci_read_config_dword(pci_dev, 0x7c, &dwVal);
4113 pci_write_config_dword(pci_dev, 0x7c, dwVal | 0x08000000);
4114 udelay(5000);
4115 pci_read_config_dword(pci_dev, 0x7c, &dwVal);
4116 pci_write_config_dword(pci_dev, 0x7c, dwVal & 0xf7ffffff);
4117 udelay(5000);
4118
4119 pci_dev = card->pci_dev;
4120 if (pci_dev == NULL)
4121 return -1;
4122
4123 pci_read_config_dword(pci_dev, 0x44, &dwVal);
4124 pci_write_config_dword(pci_dev, 0x44, dwVal | 0x000c0000);
4125 udelay(500);
4126 pci_read_config_dword(pci_dev, 0x44, &dwVal);
4127 pci_write_config_dword(pci_dev, 0x44, dwVal & 0xfffbffff);
4128 udelay(5000);
4129
4130 /* TODO: recognize if we have a PM capable codec and only do this */
4131 /* if the codec is PM capable */
4132 wCount = 2000;
4133 while (wCount--) {
4134 wReg = ali_ac97_get(card, 0, AC97_POWER_CONTROL);
4135 if ((wReg & 0x000f) == 0x000f)
4136 return 0;
4137 udelay(5000);
4138 }
4139 /* This is non fatal if you have a non PM capable codec.. */
4140 return 0;
4141}
4142
4143/* AC97 codec initialisation. */
4144static int __devinit
4145trident_ac97_init(struct trident_card *card)
4146{
4147 int num_ac97 = 0;
4148 unsigned long ready_2nd = 0;
4149 struct ac97_codec *codec;
4150 int i = 0;
4151
4152 /* initialize controller side of AC link, and find out if secondary codes
4153 really exist */
4154 switch (card->pci_id) {
4155 case PCI_DEVICE_ID_ALI_5451:
4156 if (ali_reset_5451(card)) {
4157 printk(KERN_ERR "trident_ac97_init: error "
4158 "resetting 5451.\n");
4159 return -1;
4160 }
4161 outl(0x80000001, TRID_REG(card, ALI_GLOBAL_CONTROL));
4162 outl(0x00000000, TRID_REG(card, T4D_AINTEN_A));
4163 outl(0xffffffff, TRID_REG(card, T4D_AINT_A));
4164 outl(0x00000000, TRID_REG(card, T4D_MUSICVOL_WAVEVOL));
4165 outb(0x10, TRID_REG(card, ALI_MPUR2));
4166 ready_2nd = inl(TRID_REG(card, ALI_SCTRL));
4167 ready_2nd &= 0x3fff;
4168 outl(ready_2nd | PCMOUT | 0x8000, TRID_REG(card, ALI_SCTRL));
4169 ready_2nd = inl(TRID_REG(card, ALI_SCTRL));
4170 ready_2nd &= SI_AC97_SECONDARY_READY;
4171 if (card->revision < ALI_5451_V02)
4172 ready_2nd = 0;
4173 break;
4174 case PCI_DEVICE_ID_SI_7018:
4175 /* disable AC97 GPIO interrupt */
4176 outl(0x00, TRID_REG(card, SI_AC97_GPIO));
4177 /* when power up the AC link is in cold reset mode so stop it */
4178 outl(PCMOUT | SURROUT | CENTEROUT | LFEOUT | SECONDARY_ID,
4179 TRID_REG(card, SI_SERIAL_INTF_CTRL));
4180 /* it take a long time to recover from a cold reset */
4181 /* (especially when you have more than one codec) */
4182 udelay(2000);
4183 ready_2nd = inl(TRID_REG(card, SI_SERIAL_INTF_CTRL));
4184 ready_2nd &= SI_AC97_SECONDARY_READY;
4185 break;
4186 case PCI_DEVICE_ID_TRIDENT_4DWAVE_DX:
4187 /* playback on */
4188 outl(DX_AC97_PLAYBACK, TRID_REG(card, DX_ACR2_AC97_COM_STAT));
4189 break;
4190 case PCI_DEVICE_ID_TRIDENT_4DWAVE_NX:
4191 /* enable AC97 Output Slot 3,4 (PCM Left/Right Playback) */
4192 outl(NX_AC97_PCM_OUTPUT, TRID_REG(card, NX_ACR0_AC97_COM_STAT));
4193 ready_2nd = inl(TRID_REG(card, NX_ACR0_AC97_COM_STAT));
4194 ready_2nd &= NX_AC97_SECONDARY_READY;
4195 break;
4196 case PCI_DEVICE_ID_INTERG_5050:
4197 /* disable AC97 GPIO interrupt */
4198 outl(0x00, TRID_REG(card, SI_AC97_GPIO));
4199 /* when power up, the AC link is in cold reset mode, so stop it */
4200 outl(PCMOUT | SURROUT | CENTEROUT | LFEOUT,
4201 TRID_REG(card, SI_SERIAL_INTF_CTRL));
4202 /* it take a long time to recover from a cold reset (especially */
4203 /* when you have more than one codec) */
4204 udelay(2000);
4205 ready_2nd = inl(TRID_REG(card, SI_SERIAL_INTF_CTRL));
4206 ready_2nd &= SI_AC97_SECONDARY_READY;
4207 break;
4208 }
4209
4210 for (num_ac97 = 0; num_ac97 < NR_AC97; num_ac97++) {
4211 if ((codec = ac97_alloc_codec()) == NULL)
4212 return -ENOMEM;
4213
4214 /* initialize some basic codec information, other fields */
4215 /* will be filled in ac97_probe_codec */
4216 codec->private_data = card;
4217 codec->id = num_ac97;
4218
4219 if (card->pci_id == PCI_DEVICE_ID_ALI_5451) {
4220 codec->codec_read = ali_ac97_read;
4221 codec->codec_write = ali_ac97_write;
4222 } else {
4223 codec->codec_read = trident_ac97_get;
4224 codec->codec_write = trident_ac97_set;
4225 }
4226
4227 if (ac97_probe_codec(codec) == 0)
4228 break;
4229
4230 codec->dev_mixer = register_sound_mixer(&trident_mixer_fops, -1);
4231 if (codec->dev_mixer < 0) {
4232 printk(KERN_ERR "trident: couldn't register mixer!\n");
4233 ac97_release_codec(codec);
4234 break;
4235 }
4236
4237 card->ac97_codec[num_ac97] = codec;
4238
4239 /* if there is no secondary codec at all, don't probe any more */
4240 if (!ready_2nd)
4241 break;
4242 }
4243
4244 if (card->pci_id == PCI_DEVICE_ID_ALI_5451) {
4245 for (num_ac97 = 0; num_ac97 < NR_AC97; num_ac97++) {
4246 if (card->ac97_codec[num_ac97] == NULL)
4247 break;
4248 for (i = 0; i < 64; i++) {
4249 u16 reg = ali_ac97_get(card, num_ac97, i * 2);
4250 card->mixer_regs[i][num_ac97] = reg;
4251 }
4252 }
4253 }
4254 return num_ac97 + 1;
4255}
4256
Dmitry Torokhov263aba72005-06-01 02:38:37 -05004257#ifdef SUPPORT_JOYSTICK
Linus Torvalds1da177e2005-04-16 15:20:36 -07004258/* Gameport functions for the cards ADC gameport */
4259
Dmitry Torokhov263aba72005-06-01 02:38:37 -05004260static unsigned char trident_game_read(struct gameport *gameport)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004261{
4262 struct trident_card *card = gameport->port_data;
Dmitry Torokhov263aba72005-06-01 02:38:37 -05004263
Linus Torvalds1da177e2005-04-16 15:20:36 -07004264 return inb(TRID_REG(card, T4D_GAME_LEG));
4265}
4266
Dmitry Torokhov263aba72005-06-01 02:38:37 -05004267static void trident_game_trigger(struct gameport *gameport)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004268{
4269 struct trident_card *card = gameport->port_data;
Dmitry Torokhov263aba72005-06-01 02:38:37 -05004270
Linus Torvalds1da177e2005-04-16 15:20:36 -07004271 outb(0xff, TRID_REG(card, T4D_GAME_LEG));
4272}
4273
Dmitry Torokhov263aba72005-06-01 02:38:37 -05004274static int trident_game_cooked_read(struct gameport *gameport,
4275 int *axes, int *buttons)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004276{
4277 struct trident_card *card = gameport->port_data;
4278 int i;
4279
4280 *buttons = (~inb(TRID_REG(card, T4D_GAME_LEG)) >> 4) & 0xf;
4281
4282 for (i = 0; i < 4; i++) {
4283 axes[i] = inw(TRID_REG(card, T4D_GAME_AXD) + i * sizeof (u16));
4284 if (axes[i] == 0xffff)
4285 axes[i] = -1;
4286 }
4287
4288 return 0;
4289}
4290
Dmitry Torokhov263aba72005-06-01 02:38:37 -05004291static int trident_game_open(struct gameport *gameport, int mode)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004292{
4293 struct trident_card *card = gameport->port_data;
4294
4295 switch (mode) {
4296 case GAMEPORT_MODE_COOKED:
4297 outb(0x80, TRID_REG(card, T4D_GAME_CR));
4298 msleep(20);
4299 return 0;
4300 case GAMEPORT_MODE_RAW:
4301 outb(0x00, TRID_REG(card, T4D_GAME_CR));
4302 return 0;
4303 default:
4304 return -1;
4305 }
4306
4307 return 0;
4308}
4309
Dmitry Torokhov263aba72005-06-01 02:38:37 -05004310static int __devinit trident_register_gameport(struct trident_card *card)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004311{
4312 struct gameport *gp;
4313
4314 card->gameport = gp = gameport_allocate_port();
4315 if (!gp) {
4316 printk(KERN_ERR "trident: can not allocate memory for gameport\n");
4317 return -ENOMEM;
4318 }
4319
4320 gameport_set_name(gp, "Trident 4DWave");
4321 gameport_set_phys(gp, "pci%s/gameport0", pci_name(card->pci_dev));
4322 gp->read = trident_game_read;
4323 gp->trigger = trident_game_trigger;
4324 gp->cooked_read = trident_game_cooked_read;
4325 gp->open = trident_game_open;
4326 gp->fuzz = 64;
4327 gp->port_data = card;
4328
4329 gameport_register_port(gp);
4330
4331 return 0;
4332}
4333
Dmitry Torokhov263aba72005-06-01 02:38:37 -05004334static inline void trident_unregister_gameport(struct trident_card *card)
4335{
4336 if (card->gameport)
4337 gameport_unregister_port(card->gameport);
4338}
4339
4340#else
4341static inline int trident_register_gameport(struct trident_card *card) { return -ENOSYS; }
4342static inline void trident_unregister_gameport(struct trident_card *card) { }
4343#endif /* SUPPORT_JOYSTICK */
4344
Linus Torvalds1da177e2005-04-16 15:20:36 -07004345/* install the driver, we do not allocate hardware channel nor DMA buffer */
4346/* now, they are defered until "ACCESS" time (in prog_dmabuf called by */
4347/* open/read/write/ioctl/mmap) */
4348static int __devinit
4349trident_probe(struct pci_dev *pci_dev, const struct pci_device_id *pci_id)
4350{
4351 unsigned long iobase;
4352 struct trident_card *card;
4353 u8 bits;
4354 u8 revision;
4355 int i = 0;
4356 u16 temp;
4357 struct pci_dev *pci_dev_m1533 = NULL;
4358 int rc = -ENODEV;
4359 u64 dma_mask;
4360
4361 if (pci_enable_device(pci_dev))
4362 goto out;
4363
4364 if (pci_dev->device == PCI_DEVICE_ID_ALI_5451)
4365 dma_mask = ALI_DMA_MASK;
4366 else
4367 dma_mask = TRIDENT_DMA_MASK;
4368 if (pci_set_dma_mask(pci_dev, dma_mask)) {
4369 printk(KERN_ERR "trident: architecture does not support"
4370 " %s PCI busmaster DMA\n",
4371 pci_dev->device == PCI_DEVICE_ID_ALI_5451 ?
4372 "32-bit" : "30-bit");
4373 goto out;
4374 }
4375 pci_read_config_byte(pci_dev, PCI_CLASS_REVISION, &revision);
4376
4377 if (pci_id->device == PCI_DEVICE_ID_INTERG_5050)
4378 iobase = pci_resource_start(pci_dev, 1);
4379 else
4380 iobase = pci_resource_start(pci_dev, 0);
4381
4382 if (!request_region(iobase, 256, card_names[pci_id->driver_data])) {
4383 printk(KERN_ERR "trident: can't allocate I/O space at "
4384 "0x%4.4lx\n", iobase);
4385 goto out;
4386 }
4387
4388 rc = -ENOMEM;
4389 if ((card = kmalloc(sizeof(*card), GFP_KERNEL)) == NULL) {
4390 printk(KERN_ERR "trident: out of memory\n");
4391 goto out_release_region;
4392 }
4393 memset(card, 0, sizeof (*card));
4394
4395 init_timer(&card->timer);
4396 card->iobase = iobase;
4397 card->pci_dev = pci_dev;
4398 card->pci_id = pci_id->device;
4399 card->revision = revision;
4400 card->irq = pci_dev->irq;
4401 card->next = devs;
4402 card->magic = TRIDENT_CARD_MAGIC;
4403 card->banks[BANK_A].addresses = &bank_a_addrs;
4404 card->banks[BANK_A].bitmap = 0UL;
4405 card->banks[BANK_B].addresses = &bank_b_addrs;
4406 card->banks[BANK_B].bitmap = 0UL;
4407
4408 init_MUTEX(&card->open_sem);
4409 spin_lock_init(&card->lock);
4410 init_timer(&card->timer);
4411
4412 devs = card;
4413
4414 pci_set_master(pci_dev);
4415
4416 printk(KERN_INFO "trident: %s found at IO 0x%04lx, IRQ %d\n",
4417 card_names[pci_id->driver_data], card->iobase, card->irq);
4418
4419 if (card->pci_id == PCI_DEVICE_ID_ALI_5451) {
4420 /* ALi channel Management */
4421 card->alloc_pcm_channel = ali_alloc_pcm_channel;
4422 card->alloc_rec_pcm_channel = ali_alloc_rec_pcm_channel;
4423 card->free_pcm_channel = ali_free_pcm_channel;
4424
4425 card->address_interrupt = ali_address_interrupt;
4426
4427 /* Added by Matt Wu 01-05-2001 for spdif in */
4428 card->multi_channel_use_count = 0;
4429 card->rec_channel_use_count = 0;
4430
4431 /* ALi SPDIF OUT function */
4432 if (card->revision == ALI_5451_V02) {
4433 ali_setup_spdif_out(card, ALI_PCM_TO_SPDIF_OUT);
4434 res = create_proc_entry("ALi5451", 0, NULL);
4435 if (res) {
4436 res->write_proc = ali_write_proc;
4437 res->data = card;
4438 }
4439 }
4440
4441 /* Add H/W Volume Control By Matt Wu Jul. 06, 2001 */
4442 card->hwvolctl = 0;
4443 pci_dev_m1533 = pci_find_device(PCI_VENDOR_ID_AL,
4444 PCI_DEVICE_ID_AL_M1533,
4445 pci_dev_m1533);
4446 rc = -ENODEV;
4447 if (pci_dev_m1533 == NULL)
4448 goto out_proc_fs;
4449 pci_read_config_byte(pci_dev_m1533, 0x63, &bits);
4450 if (bits & (1 << 5))
4451 card->hwvolctl = 1;
4452 if (card->hwvolctl) {
4453 /* Clear m1533 pci cfg 78h bit 30 to zero, which makes
4454 GPIO11/12/13 work as ACGP_UP/DOWN/MUTE. */
4455 pci_read_config_byte(pci_dev_m1533, 0x7b, &bits);
4456 bits &= 0xbf; /*clear bit 6 */
4457 pci_write_config_byte(pci_dev_m1533, 0x7b, bits);
4458 }
4459 } else if (card->pci_id == PCI_DEVICE_ID_INTERG_5050) {
4460 card->alloc_pcm_channel = cyber_alloc_pcm_channel;
4461 card->alloc_rec_pcm_channel = cyber_alloc_pcm_channel;
4462 card->free_pcm_channel = cyber_free_pcm_channel;
4463 card->address_interrupt = cyber_address_interrupt;
4464 cyber_init_ritual(card);
4465 } else {
4466 card->alloc_pcm_channel = trident_alloc_pcm_channel;
4467 card->alloc_rec_pcm_channel = trident_alloc_pcm_channel;
4468 card->free_pcm_channel = trident_free_pcm_channel;
4469 card->address_interrupt = trident_address_interrupt;
4470 }
4471
4472 /* claim our irq */
4473 rc = -ENODEV;
4474 if (request_irq(card->irq, &trident_interrupt, SA_SHIRQ,
4475 card_names[pci_id->driver_data], card)) {
4476 printk(KERN_ERR "trident: unable to allocate irq %d\n",
4477 card->irq);
4478 goto out_proc_fs;
4479 }
4480 /* register /dev/dsp */
4481 if ((card->dev_audio = register_sound_dsp(&trident_audio_fops, -1)) < 0) {
4482 printk(KERN_ERR "trident: couldn't register DSP device!\n");
4483 goto out_free_irq;
4484 }
4485 card->mixer_regs_ready = 0;
4486 /* initialize AC97 codec and register /dev/mixer */
4487 if (trident_ac97_init(card) <= 0) {
4488 /* unregister audio devices */
4489 for (i = 0; i < NR_AC97; i++) {
4490 if (card->ac97_codec[i] != NULL) {
4491 struct ac97_codec* codec = card->ac97_codec[i];
4492 unregister_sound_mixer(codec->dev_mixer);
4493 ac97_release_codec(codec);
4494 }
4495 }
4496 goto out_unregister_sound_dsp;
4497 }
4498 card->mixer_regs_ready = 1;
4499 outl(0x00, TRID_REG(card, T4D_MUSICVOL_WAVEVOL));
4500
4501 if (card->pci_id == PCI_DEVICE_ID_ALI_5451) {
4502 /* Add H/W Volume Control By Matt Wu Jul. 06, 2001 */
4503 if (card->hwvolctl) {
4504 /* Enable GPIO IRQ (MISCINT bit 18h) */
4505 temp = inw(TRID_REG(card, T4D_MISCINT + 2));
4506 temp |= 0x0004;
4507 outw(temp, TRID_REG(card, T4D_MISCINT + 2));
4508
4509 /* Enable H/W Volume Control GLOVAL CONTROL bit 0 */
4510 temp = inw(TRID_REG(card, ALI_GLOBAL_CONTROL));
4511 temp |= 0x0001;
4512 outw(temp, TRID_REG(card, ALI_GLOBAL_CONTROL));
4513
4514 }
4515 if (card->revision == ALI_5451_V02)
4516 ali_close_multi_channels();
4517 /* edited by HMSEO for GT sound */
4518#if defined(CONFIG_ALPHA_NAUTILUS) || defined(CONFIG_ALPHA_GENERIC)
4519 {
4520 u16 ac97_data;
4521 extern struct hwrpb_struct *hwrpb;
4522
4523 if ((hwrpb->sys_type) == 201) {
4524 printk(KERN_INFO "trident: Running on Alpha system "
4525 "type Nautilus\n");
4526 ac97_data = ali_ac97_get(card, 0, AC97_POWER_CONTROL);
4527 ali_ac97_set(card, 0, AC97_POWER_CONTROL,
4528 ac97_data | ALI_EAPD_POWER_DOWN);
4529 }
4530 }
4531#endif /* CONFIG_ALPHA_NAUTILUS || CONFIG_ALPHA_GENERIC */
4532 /* edited by HMSEO for GT sound */
4533 }
4534 rc = 0;
4535 pci_set_drvdata(pci_dev, card);
4536
4537 /* Enable Address Engine Interrupts */
4538 trident_enable_loop_interrupts(card);
4539
4540 /* Register gameport */
4541 trident_register_gameport(card);
4542
4543out:
4544 return rc;
4545
4546out_unregister_sound_dsp:
4547 unregister_sound_dsp(card->dev_audio);
4548out_free_irq:
4549 free_irq(card->irq, card);
4550out_proc_fs:
4551 if (res) {
4552 remove_proc_entry("ALi5451", NULL);
4553 res = NULL;
4554 }
4555 kfree(card);
4556 devs = NULL;
4557out_release_region:
4558 release_region(iobase, 256);
4559 return rc;
4560}
4561
4562static void __devexit
4563trident_remove(struct pci_dev *pci_dev)
4564{
4565 int i;
4566 struct trident_card *card = pci_get_drvdata(pci_dev);
4567
4568 /*
4569 * Kill running timers before unload. We can't have them
4570 * going off after rmmod!
4571 */
4572 if (card->hwvolctl)
4573 del_timer_sync(&card->timer);
4574
4575 /* ALi S/PDIF and Power Management */
4576 if (card->pci_id == PCI_DEVICE_ID_ALI_5451) {
4577 ali_setup_spdif_out(card, ALI_PCM_TO_SPDIF_OUT);
4578 ali_disable_special_channel(card, ALI_SPDIF_OUT_CHANNEL);
4579 ali_disable_spdif_in(card);
4580 remove_proc_entry("ALi5451", NULL);
4581 }
4582
4583 /* Unregister gameport */
Dmitry Torokhov263aba72005-06-01 02:38:37 -05004584 trident_unregister_gameport(card);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004585
4586 /* Kill interrupts, and SP/DIF */
4587 trident_disable_loop_interrupts(card);
4588
4589 /* free hardware resources */
4590 free_irq(card->irq, card);
4591 release_region(card->iobase, 256);
4592
4593 /* unregister audio devices */
4594 for (i = 0; i < NR_AC97; i++)
4595 if (card->ac97_codec[i] != NULL) {
4596 unregister_sound_mixer(card->ac97_codec[i]->dev_mixer);
4597 ac97_release_codec(card->ac97_codec[i]);
4598 }
4599 unregister_sound_dsp(card->dev_audio);
4600
4601 kfree(card);
4602
4603 pci_set_drvdata(pci_dev, NULL);
4604}
4605
4606MODULE_AUTHOR("Alan Cox, Aaron Holtzman, Ollie Lho, Ching Ling Lee, Muli Ben-Yehuda");
4607MODULE_DESCRIPTION("Trident 4DWave/SiS 7018/ALi 5451 and Tvia/IGST CyberPro5050 PCI "
4608 "Audio Driver");
4609MODULE_LICENSE("GPL");
4610
4611#define TRIDENT_MODULE_NAME "trident"
4612
4613static struct pci_driver trident_pci_driver = {
4614 .name = TRIDENT_MODULE_NAME,
4615 .id_table = trident_pci_tbl,
4616 .probe = trident_probe,
4617 .remove = __devexit_p(trident_remove),
4618 .suspend = trident_suspend,
4619 .resume = trident_resume
4620};
4621
4622static int __init
4623trident_init_module(void)
4624{
4625 printk(KERN_INFO "Trident 4DWave/SiS 7018/ALi 5451,Tvia CyberPro "
4626 "5050 PCI Audio, version " DRIVER_VERSION ", " __TIME__ " "
4627 __DATE__ "\n");
4628
4629 return pci_register_driver(&trident_pci_driver);
4630}
4631
4632static void __exit
4633trident_cleanup_module(void)
4634{
4635 pci_unregister_driver(&trident_pci_driver);
4636}
4637
4638module_init(trident_init_module);
4639module_exit(trident_cleanup_module);