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