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