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#include <linux/init.h>
45#include <linux/interrupt.h>
46#include <linux/module.h>
47#include <linux/stddef.h>
48#include <linux/slab.h>
49#include <linux/isapnp.h>
50#include <linux/pnp.h>
51#include <linux/spinlock.h>
52
53#include "sound_config.h"
54
55#include "ad1848.h"
56#include "ad1848_mixer.h"
57
58typedef struct
59{
60 spinlock_t lock;
61 int base;
62 int irq;
63 int dma1, dma2;
64 int dual_dma;
65 int subtype;
66 unsigned char MCE_bit;
67 unsigned char saved_regs[64];
68 int debug_flag;
69
70 int audio_flags;
71 int record_dev, playback_dev;
72
73 int xfer_count;
74 int audio_mode;
75 int open_mode;
76 int intr_active;
77 char *chip_name, *name;
78 int model;
79#define MD_1848 1
80#define MD_4231 2
81#define MD_4231A 3
82#define MD_1845 4
83#define MD_4232 5
84#define MD_C930 6
85#define MD_IWAVE 7
86#define MD_4235 8
87#define MD_1845_SSCAPE 9
88#define MD_4236 10
89#define MD_42xB 11
90#define MD_4239 12
91
92
93 int recmask;
94 int supported_devices, orig_devices;
95 int supported_rec_devices, orig_rec_devices;
96 int *levels;
97 short mixer_reroute[32];
98 int dev_no;
99 volatile unsigned long timer_ticks;
100 int timer_running;
101 int irq_ok;
102 mixer_ents *mix_devices;
103 int mixer_output_port;
104} ad1848_info;
105
106typedef struct ad1848_port_info
107{
108 int open_mode;
109 int speed;
110 unsigned char speed_bits;
111 int channels;
112 int audio_format;
113 unsigned char format_bits;
114}
115ad1848_port_info;
116
117static struct address_info cfg;
118static int nr_ad1848_devs;
119
120static bool deskpro_xl;
121static bool deskpro_m;
122static bool soundpro;
123
124static volatile signed char irq2dev[17] = {
125 -1, -1, -1, -1, -1, -1, -1, -1,
126 -1, -1, -1, -1, -1, -1, -1, -1, -1
127};
128
129#ifndef EXCLUDE_TIMERS
130static int timer_installed = -1;
131#endif
132
133static int loaded;
134
135static int ad_format_mask[13 ] =
136{
137 0,
138 AFMT_U8 | AFMT_S16_LE | AFMT_MU_LAW | AFMT_A_LAW,
139 AFMT_U8 | AFMT_S16_LE | AFMT_MU_LAW | AFMT_A_LAW | AFMT_S16_BE | AFMT_IMA_ADPCM,
140 AFMT_U8 | AFMT_S16_LE | AFMT_MU_LAW | AFMT_A_LAW | AFMT_S16_BE | AFMT_IMA_ADPCM,
141 AFMT_U8 | AFMT_S16_LE | AFMT_MU_LAW | AFMT_A_LAW,
142 AFMT_U8 | AFMT_S16_LE | AFMT_MU_LAW | AFMT_A_LAW | AFMT_S16_BE | AFMT_IMA_ADPCM,
143 AFMT_U8 | AFMT_S16_LE | AFMT_MU_LAW | AFMT_A_LAW | AFMT_S16_BE | AFMT_IMA_ADPCM,
144 AFMT_U8 | AFMT_S16_LE | AFMT_MU_LAW | AFMT_A_LAW | AFMT_S16_BE | AFMT_IMA_ADPCM,
145 AFMT_U8 | AFMT_S16_LE ,
146 AFMT_U8 | AFMT_S16_LE | AFMT_MU_LAW | AFMT_A_LAW ,
147 AFMT_U8 | AFMT_S16_LE | AFMT_MU_LAW | AFMT_A_LAW | AFMT_S16_BE | AFMT_IMA_ADPCM,
148 AFMT_U8 | AFMT_S16_LE | AFMT_MU_LAW | AFMT_A_LAW | AFMT_S16_BE | AFMT_IMA_ADPCM,
149 AFMT_U8 | AFMT_S16_LE | AFMT_MU_LAW | AFMT_A_LAW | AFMT_S16_BE | AFMT_IMA_ADPCM
150};
151
152static ad1848_info adev_info[MAX_AUDIO_DEV];
153
154#define io_Index_Addr(d) ((d)->base)
155#define io_Indexed_Data(d) ((d)->base+1)
156#define io_Status(d) ((d)->base+2)
157#define io_Polled_IO(d) ((d)->base+3)
158
159static struct {
160 unsigned char flags;
161#define CAP_F_TIMER 0x01
162} capabilities [10 ] = {
163 {0}
164 ,{0}
165 ,{CAP_F_TIMER}
166 ,{CAP_F_TIMER}
167 ,{CAP_F_TIMER}
168 ,{CAP_F_TIMER}
169 ,{0}
170 ,{CAP_F_TIMER}
171 ,{0}
172 ,{CAP_F_TIMER}
173};
174
175#ifdef CONFIG_PNP
176static int isapnp = 1;
177static int isapnpjump;
178static bool reverse;
179
180static int audio_activated;
181#else
182static int isapnp;
183#endif
184
185
186
187static int ad1848_open(int dev, int mode);
188static void ad1848_close(int dev);
189static void ad1848_output_block(int dev, unsigned long buf, int count, int intrflag);
190static void ad1848_start_input(int dev, unsigned long buf, int count, int intrflag);
191static int ad1848_prepare_for_output(int dev, int bsize, int bcount);
192static int ad1848_prepare_for_input(int dev, int bsize, int bcount);
193static void ad1848_halt(int dev);
194static void ad1848_halt_input(int dev);
195static void ad1848_halt_output(int dev);
196static void ad1848_trigger(int dev, int bits);
197static irqreturn_t adintr(int irq, void *dev_id);
198
199#ifndef EXCLUDE_TIMERS
200static int ad1848_tmr_install(int dev);
201static void ad1848_tmr_reprogram(int dev);
202#endif
203
204static int ad_read(ad1848_info * devc, int reg)
205{
206 int x;
207 int timeout = 900000;
208
209 while (timeout > 0 && inb(devc->base) == 0x80)
210 timeout--;
211
212 if(reg < 32)
213 {
214 outb(((unsigned char) (reg & 0xff) | devc->MCE_bit), io_Index_Addr(devc));
215 x = inb(io_Indexed_Data(devc));
216 }
217 else
218 {
219 int xreg, xra;
220
221 xreg = (reg & 0xff) - 32;
222 xra = (((xreg & 0x0f) << 4) & 0xf0) | 0x08 | ((xreg & 0x10) >> 2);
223 outb(((unsigned char) (23 & 0xff) | devc->MCE_bit), io_Index_Addr(devc));
224 outb(((unsigned char) (xra & 0xff)), io_Indexed_Data(devc));
225 x = inb(io_Indexed_Data(devc));
226 }
227
228 return x;
229}
230
231static void ad_write(ad1848_info * devc, int reg, int data)
232{
233 int timeout = 900000;
234
235 while (timeout > 0 && inb(devc->base) == 0x80)
236 timeout--;
237
238 if(reg < 32)
239 {
240 outb(((unsigned char) (reg & 0xff) | devc->MCE_bit), io_Index_Addr(devc));
241 outb(((unsigned char) (data & 0xff)), io_Indexed_Data(devc));
242 }
243 else
244 {
245 int xreg, xra;
246
247 xreg = (reg & 0xff) - 32;
248 xra = (((xreg & 0x0f) << 4) & 0xf0) | 0x08 | ((xreg & 0x10) >> 2);
249 outb(((unsigned char) (23 & 0xff) | devc->MCE_bit), io_Index_Addr(devc));
250 outb(((unsigned char) (xra & 0xff)), io_Indexed_Data(devc));
251 outb((unsigned char) (data & 0xff), io_Indexed_Data(devc));
252 }
253}
254
255static void wait_for_calibration(ad1848_info * devc)
256{
257 int timeout = 0;
258
259
260
261
262
263
264
265
266 timeout = 100000;
267 while (timeout > 0 && inb(devc->base) == 0x80)
268 timeout--;
269 if (inb(devc->base) & 0x80)
270 printk(KERN_WARNING "ad1848: Auto calibration timed out(1).\n");
271
272 timeout = 100;
273 while (timeout > 0 && !(ad_read(devc, 11) & 0x20))
274 timeout--;
275 if (!(ad_read(devc, 11) & 0x20))
276 return;
277
278 timeout = 80000;
279 while (timeout > 0 && (ad_read(devc, 11) & 0x20))
280 timeout--;
281 if (ad_read(devc, 11) & 0x20)
282 if ((devc->model != MD_1845) && (devc->model != MD_1845_SSCAPE))
283 printk(KERN_WARNING "ad1848: Auto calibration timed out(3).\n");
284}
285
286static void ad_mute(ad1848_info * devc)
287{
288 int i;
289 unsigned char prev;
290
291
292
293
294
295 for (i = 6; i < 8; i++)
296 {
297 prev = devc->saved_regs[i] = ad_read(devc, i);
298 }
299
300}
301
302static void ad_unmute(ad1848_info * devc)
303{
304}
305
306static void ad_enter_MCE(ad1848_info * devc)
307{
308 int timeout = 1000;
309 unsigned short prev;
310
311 while (timeout > 0 && inb(devc->base) == 0x80)
312 timeout--;
313
314 devc->MCE_bit = 0x40;
315 prev = inb(io_Index_Addr(devc));
316 if (prev & 0x40)
317 {
318 return;
319 }
320 outb((devc->MCE_bit), io_Index_Addr(devc));
321}
322
323static void ad_leave_MCE(ad1848_info * devc)
324{
325 unsigned char prev, acal;
326 int timeout = 1000;
327
328 while (timeout > 0 && inb(devc->base) == 0x80)
329 timeout--;
330
331 acal = ad_read(devc, 9);
332
333 devc->MCE_bit = 0x00;
334 prev = inb(io_Index_Addr(devc));
335 outb((0x00), io_Index_Addr(devc));
336
337 if ((prev & 0x40) == 0)
338 {
339 return;
340 }
341 outb((0x00), io_Index_Addr(devc));
342 if (acal & 0x08)
343 wait_for_calibration(devc);
344}
345
346static int ad1848_set_recmask(ad1848_info * devc, int mask)
347{
348 unsigned char recdev;
349 int i, n;
350 unsigned long flags;
351
352 mask &= devc->supported_rec_devices;
353
354
355 for (i = 0; i < 32; i++)
356 {
357 if (devc->mixer_reroute[i] != i)
358 {
359 if (mask & (1 << i))
360 {
361 mask &= ~(1 << i);
362 mask |= (1 << devc->mixer_reroute[i]);
363 }
364 }
365 }
366
367 n = 0;
368 for (i = 0; i < 32; i++)
369 if (mask & (1 << i))
370 n++;
371
372 spin_lock_irqsave(&devc->lock,flags);
373 if (!soundpro) {
374 if (n == 0)
375 mask = SOUND_MASK_MIC;
376 else if (n != 1) {
377 mask &= ~devc->recmask;
378
379 n = 0;
380 for (i = 0; i < 32; i++)
381 if (mask & (1 << i))
382 n++;
383
384 if (n != 1)
385 mask = SOUND_MASK_MIC;
386 }
387 switch (mask) {
388 case SOUND_MASK_MIC:
389 recdev = 2;
390 break;
391
392 case SOUND_MASK_LINE:
393 case SOUND_MASK_LINE3:
394 recdev = 0;
395 break;
396
397 case SOUND_MASK_CD:
398 case SOUND_MASK_LINE1:
399 recdev = 1;
400 break;
401
402 case SOUND_MASK_IMIX:
403 recdev = 3;
404 break;
405
406 default:
407 mask = SOUND_MASK_MIC;
408 recdev = 2;
409 }
410
411 recdev <<= 6;
412 ad_write(devc, 0, (ad_read(devc, 0) & 0x3f) | recdev);
413 ad_write(devc, 1, (ad_read(devc, 1) & 0x3f) | recdev);
414 } else {
415 unsigned char val;
416 int set_rec_bit;
417 int j;
418
419 for (i = 0; i < 32; i++) {
420 if ((devc->supported_rec_devices & (1 << i)) == 0)
421 continue;
422
423 for (j = LEFT_CHN; j <= RIGHT_CHN; j++) {
424 if (devc->mix_devices[i][j].nbits == 0)
425 continue;
426
427
428
429
430
431
432 set_rec_bit = ((mask & (1 << i)) != 0) ^ devc->mix_devices[i][j].recpol;
433
434 val = ad_read(devc, devc->mix_devices[i][j].recreg);
435 val &= ~(1 << devc->mix_devices[i][j].recpos);
436 val |= (set_rec_bit << devc->mix_devices[i][j].recpos);
437 ad_write(devc, devc->mix_devices[i][j].recreg, val);
438 }
439 }
440 }
441 spin_unlock_irqrestore(&devc->lock,flags);
442
443
444 for (i = 0; i < 32; i++)
445 {
446 if (devc->mixer_reroute[i] != i)
447 {
448 if (mask & (1 << devc->mixer_reroute[i]))
449 {
450 mask &= ~(1 << devc->mixer_reroute[i]);
451 mask |= (1 << i);
452 }
453 }
454 }
455 devc->recmask = mask;
456 return mask;
457}
458
459static void oss_change_bits(ad1848_info *devc, unsigned char *regval,
460 unsigned char *muteval, int dev, int chn, int newval)
461{
462 unsigned char mask;
463 int shift;
464 int mute;
465 int mutemask;
466 int set_mute_bit;
467
468 set_mute_bit = (newval == 0) ^ devc->mix_devices[dev][chn].mutepol;
469
470 if (devc->mix_devices[dev][chn].polarity == 1)
471 newval = 100 - newval;
472
473 mask = (1 << devc->mix_devices[dev][chn].nbits) - 1;
474 shift = devc->mix_devices[dev][chn].bitpos;
475
476 if (devc->mix_devices[dev][chn].mutepos == 8)
477 {
478 mute = 0;
479 mutemask = ~0;
480 }
481 else
482 {
483 mute = (set_mute_bit << devc->mix_devices[dev][chn].mutepos);
484 mutemask = ~(1 << devc->mix_devices[dev][chn].mutepos);
485 }
486
487 newval = (int) ((newval * mask) + 50) / 100;
488 *regval &= ~(mask << shift);
489 *regval |= (newval & mask) << shift;
490
491 *muteval &= mutemask;
492 *muteval |= mute;
493}
494
495static int ad1848_mixer_get(ad1848_info * devc, int dev)
496{
497 if (!((1 << dev) & devc->supported_devices))
498 return -EINVAL;
499
500 dev = devc->mixer_reroute[dev];
501
502 return devc->levels[dev];
503}
504
505static void ad1848_mixer_set_channel(ad1848_info *devc, int dev, int value, int channel)
506{
507 int regoffs, muteregoffs;
508 unsigned char val, muteval;
509 unsigned long flags;
510
511 regoffs = devc->mix_devices[dev][channel].regno;
512 muteregoffs = devc->mix_devices[dev][channel].mutereg;
513 val = ad_read(devc, regoffs);
514
515 if (muteregoffs != regoffs) {
516 muteval = ad_read(devc, muteregoffs);
517 oss_change_bits(devc, &val, &muteval, dev, channel, value);
518 }
519 else
520 oss_change_bits(devc, &val, &val, dev, channel, value);
521
522 spin_lock_irqsave(&devc->lock,flags);
523 ad_write(devc, regoffs, val);
524 devc->saved_regs[regoffs] = val;
525 if (muteregoffs != regoffs) {
526 ad_write(devc, muteregoffs, muteval);
527 devc->saved_regs[muteregoffs] = muteval;
528 }
529 spin_unlock_irqrestore(&devc->lock,flags);
530}
531
532static int ad1848_mixer_set(ad1848_info * devc, int dev, int value)
533{
534 int left = value & 0x000000ff;
535 int right = (value & 0x0000ff00) >> 8;
536 int retvol;
537
538 if (dev > 31)
539 return -EINVAL;
540
541 if (!(devc->supported_devices & (1 << dev)))
542 return -EINVAL;
543
544 dev = devc->mixer_reroute[dev];
545
546 if (devc->mix_devices[dev][LEFT_CHN].nbits == 0)
547 return -EINVAL;
548
549 if (left > 100)
550 left = 100;
551 if (right > 100)
552 right = 100;
553
554 if (devc->mix_devices[dev][RIGHT_CHN].nbits == 0)
555 right = left;
556
557 retvol = left | (right << 8);
558
559
560 left = mix_cvt[left];
561 right = mix_cvt[right];
562
563 devc->levels[dev] = retvol;
564
565
566
567
568 ad1848_mixer_set_channel(devc, dev, left, LEFT_CHN);
569
570
571
572
573 if (devc->mix_devices[dev][RIGHT_CHN].nbits == 0)
574 goto out;
575 ad1848_mixer_set_channel(devc, dev, right, RIGHT_CHN);
576
577 out:
578 return retvol;
579}
580
581static void ad1848_mixer_reset(ad1848_info * devc)
582{
583 int i;
584 char name[32];
585 unsigned long flags;
586
587 devc->mix_devices = &(ad1848_mix_devices[0]);
588
589 sprintf(name, "%s_%d", devc->chip_name, nr_ad1848_devs);
590
591 for (i = 0; i < 32; i++)
592 devc->mixer_reroute[i] = i;
593
594 devc->supported_rec_devices = MODE1_REC_DEVICES;
595
596 switch (devc->model)
597 {
598 case MD_4231:
599 case MD_4231A:
600 case MD_1845:
601 case MD_1845_SSCAPE:
602 devc->supported_devices = MODE2_MIXER_DEVICES;
603 break;
604
605 case MD_C930:
606 devc->supported_devices = C930_MIXER_DEVICES;
607 devc->mix_devices = &(c930_mix_devices[0]);
608 break;
609
610 case MD_IWAVE:
611 devc->supported_devices = MODE3_MIXER_DEVICES;
612 devc->mix_devices = &(iwave_mix_devices[0]);
613 break;
614
615 case MD_42xB:
616 case MD_4239:
617 devc->mix_devices = &(cs42xb_mix_devices[0]);
618 devc->supported_devices = MODE3_MIXER_DEVICES;
619 break;
620 case MD_4232:
621 case MD_4235:
622 case MD_4236:
623 devc->supported_devices = MODE3_MIXER_DEVICES;
624 break;
625
626 case MD_1848:
627 if (soundpro) {
628 devc->supported_devices = SPRO_MIXER_DEVICES;
629 devc->supported_rec_devices = SPRO_REC_DEVICES;
630 devc->mix_devices = &(spro_mix_devices[0]);
631 break;
632 }
633
634 default:
635 devc->supported_devices = MODE1_MIXER_DEVICES;
636 }
637
638 devc->orig_devices = devc->supported_devices;
639 devc->orig_rec_devices = devc->supported_rec_devices;
640
641 devc->levels = load_mixer_volumes(name, default_mixer_levels, 1);
642
643 for (i = 0; i < SOUND_MIXER_NRDEVICES; i++)
644 {
645 if (devc->supported_devices & (1 << i))
646 ad1848_mixer_set(devc, i, devc->levels[i]);
647 }
648
649 ad1848_set_recmask(devc, SOUND_MASK_MIC);
650
651 devc->mixer_output_port = devc->levels[31] | AUDIO_HEADPHONE | AUDIO_LINE_OUT;
652
653 spin_lock_irqsave(&devc->lock,flags);
654 if (!soundpro) {
655 if (devc->mixer_output_port & AUDIO_SPEAKER)
656 ad_write(devc, 26, ad_read(devc, 26) & ~0x40);
657 else
658 ad_write(devc, 26, ad_read(devc, 26) | 0x40);
659 } else {
660
661
662
663
664
665 ad_write(devc, 16, 0x60);
666 }
667 spin_unlock_irqrestore(&devc->lock,flags);
668}
669
670static int ad1848_mixer_ioctl(int dev, unsigned int cmd, void __user *arg)
671{
672 ad1848_info *devc = mixer_devs[dev]->devc;
673 int val;
674
675 if (cmd == SOUND_MIXER_PRIVATE1)
676 {
677 if (get_user(val, (int __user *)arg))
678 return -EFAULT;
679
680 if (val != 0xffff)
681 {
682 unsigned long flags;
683 val &= (AUDIO_SPEAKER | AUDIO_HEADPHONE | AUDIO_LINE_OUT);
684 devc->mixer_output_port = val;
685 val |= AUDIO_HEADPHONE | AUDIO_LINE_OUT;
686 devc->mixer_output_port = val;
687 spin_lock_irqsave(&devc->lock,flags);
688 if (val & AUDIO_SPEAKER)
689 ad_write(devc, 26, ad_read(devc, 26) & ~0x40);
690 else
691 ad_write(devc, 26, ad_read(devc, 26) | 0x40);
692 spin_unlock_irqrestore(&devc->lock,flags);
693 }
694 val = devc->mixer_output_port;
695 return put_user(val, (int __user *)arg);
696 }
697 if (cmd == SOUND_MIXER_PRIVATE2)
698 {
699 if (get_user(val, (int __user *)arg))
700 return -EFAULT;
701 return(ad1848_control(AD1848_MIXER_REROUTE, val));
702 }
703 if (((cmd >> 8) & 0xff) == 'M')
704 {
705 if (_SIOC_DIR(cmd) & _SIOC_WRITE)
706 {
707 switch (cmd & 0xff)
708 {
709 case SOUND_MIXER_RECSRC:
710 if (get_user(val, (int __user *)arg))
711 return -EFAULT;
712 val = ad1848_set_recmask(devc, val);
713 break;
714
715 default:
716 if (get_user(val, (int __user *)arg))
717 return -EFAULT;
718 val = ad1848_mixer_set(devc, cmd & 0xff, val);
719 break;
720 }
721 return put_user(val, (int __user *)arg);
722 }
723 else
724 {
725 switch (cmd & 0xff)
726 {
727
728
729
730
731 case SOUND_MIXER_RECSRC:
732 val = devc->recmask;
733 break;
734
735 case SOUND_MIXER_DEVMASK:
736 val = devc->supported_devices;
737 break;
738
739 case SOUND_MIXER_STEREODEVS:
740 val = devc->supported_devices;
741 if (devc->model != MD_C930)
742 val &= ~(SOUND_MASK_SPEAKER | SOUND_MASK_IMIX);
743 break;
744
745 case SOUND_MIXER_RECMASK:
746 val = devc->supported_rec_devices;
747 break;
748
749 case SOUND_MIXER_CAPS:
750 val=SOUND_CAP_EXCL_INPUT;
751 break;
752
753 default:
754 val = ad1848_mixer_get(devc, cmd & 0xff);
755 break;
756 }
757 return put_user(val, (int __user *)arg);
758 }
759 }
760 else
761 return -EINVAL;
762}
763
764static int ad1848_set_speed(int dev, int arg)
765{
766 ad1848_info *devc = (ad1848_info *) audio_devs[dev]->devc;
767 ad1848_port_info *portc = (ad1848_port_info *) audio_devs[dev]->portc;
768
769
770
771
772
773
774
775
776
777 typedef struct
778 {
779 int speed;
780 unsigned char bits;
781 }
782 speed_struct;
783
784 static speed_struct speed_table[] =
785 {
786 {5510, (0 << 1) | 1},
787 {5510, (0 << 1) | 1},
788 {6620, (7 << 1) | 1},
789 {8000, (0 << 1) | 0},
790 {9600, (7 << 1) | 0},
791 {11025, (1 << 1) | 1},
792 {16000, (1 << 1) | 0},
793 {18900, (2 << 1) | 1},
794 {22050, (3 << 1) | 1},
795 {27420, (2 << 1) | 0},
796 {32000, (3 << 1) | 0},
797 {33075, (6 << 1) | 1},
798 {37800, (4 << 1) | 1},
799 {44100, (5 << 1) | 1},
800 {48000, (6 << 1) | 0}
801 };
802
803 int i, n, selected = -1;
804
805 n = sizeof(speed_table) / sizeof(speed_struct);
806
807 if (arg <= 0)
808 return portc->speed;
809
810 if (devc->model == MD_1845 || devc->model == MD_1845_SSCAPE)
811 {
812 if (arg < 4000)
813 arg = 4000;
814 if (arg > 50000)
815 arg = 50000;
816
817 portc->speed = arg;
818 portc->speed_bits = speed_table[3].bits;
819 return portc->speed;
820 }
821 if (arg < speed_table[0].speed)
822 selected = 0;
823 if (arg > speed_table[n - 1].speed)
824 selected = n - 1;
825
826 for (i = 1 ; selected == -1 && i < n; i++)
827 {
828 if (speed_table[i].speed == arg)
829 selected = i;
830 else if (speed_table[i].speed > arg)
831 {
832 int diff1, diff2;
833
834 diff1 = arg - speed_table[i - 1].speed;
835 diff2 = speed_table[i].speed - arg;
836
837 if (diff1 < diff2)
838 selected = i - 1;
839 else
840 selected = i;
841 }
842 }
843 if (selected == -1)
844 {
845 printk(KERN_WARNING "ad1848: Can't find speed???\n");
846 selected = 3;
847 }
848 portc->speed = speed_table[selected].speed;
849 portc->speed_bits = speed_table[selected].bits;
850 return portc->speed;
851}
852
853static short ad1848_set_channels(int dev, short arg)
854{
855 ad1848_port_info *portc = (ad1848_port_info *) audio_devs[dev]->portc;
856
857 if (arg != 1 && arg != 2)
858 return portc->channels;
859
860 portc->channels = arg;
861 return arg;
862}
863
864static unsigned int ad1848_set_bits(int dev, unsigned int arg)
865{
866 ad1848_info *devc = (ad1848_info *) audio_devs[dev]->devc;
867 ad1848_port_info *portc = (ad1848_port_info *) audio_devs[dev]->portc;
868
869 static struct format_tbl
870 {
871 int format;
872 unsigned char bits;
873 }
874 format2bits[] =
875 {
876 {
877 0, 0
878 }
879 ,
880 {
881 AFMT_MU_LAW, 1
882 }
883 ,
884 {
885 AFMT_A_LAW, 3
886 }
887 ,
888 {
889 AFMT_IMA_ADPCM, 5
890 }
891 ,
892 {
893 AFMT_U8, 0
894 }
895 ,
896 {
897 AFMT_S16_LE, 2
898 }
899 ,
900 {
901 AFMT_S16_BE, 6
902 }
903 ,
904 {
905 AFMT_S8, 0
906 }
907 ,
908 {
909 AFMT_U16_LE, 0
910 }
911 ,
912 {
913 AFMT_U16_BE, 0
914 }
915 };
916 int i, n = sizeof(format2bits) / sizeof(struct format_tbl);
917
918 if (arg == 0)
919 return portc->audio_format;
920
921 if (!(arg & ad_format_mask[devc->model]))
922 arg = AFMT_U8;
923
924 portc->audio_format = arg;
925
926 for (i = 0; i < n; i++)
927 if (format2bits[i].format == arg)
928 {
929 if ((portc->format_bits = format2bits[i].bits) == 0)
930 return portc->audio_format = AFMT_U8;
931
932 return arg;
933 }
934
935 portc->format_bits = 0;
936 return portc->audio_format = AFMT_U8;
937}
938
939static struct audio_driver ad1848_audio_driver =
940{
941 .owner = THIS_MODULE,
942 .open = ad1848_open,
943 .close = ad1848_close,
944 .output_block = ad1848_output_block,
945 .start_input = ad1848_start_input,
946 .prepare_for_input = ad1848_prepare_for_input,
947 .prepare_for_output = ad1848_prepare_for_output,
948 .halt_io = ad1848_halt,
949 .halt_input = ad1848_halt_input,
950 .halt_output = ad1848_halt_output,
951 .trigger = ad1848_trigger,
952 .set_speed = ad1848_set_speed,
953 .set_bits = ad1848_set_bits,
954 .set_channels = ad1848_set_channels
955};
956
957static struct mixer_operations ad1848_mixer_operations =
958{
959 .owner = THIS_MODULE,
960 .id = "SOUNDPORT",
961 .name = "AD1848/CS4248/CS4231",
962 .ioctl = ad1848_mixer_ioctl
963};
964
965static int ad1848_open(int dev, int mode)
966{
967 ad1848_info *devc;
968 ad1848_port_info *portc;
969 unsigned long flags;
970
971 if (dev < 0 || dev >= num_audiodevs)
972 return -ENXIO;
973
974 devc = (ad1848_info *) audio_devs[dev]->devc;
975 portc = (ad1848_port_info *) audio_devs[dev]->portc;
976
977
978 spin_lock(&devc->lock);
979 if (portc->open_mode || (devc->open_mode & mode))
980 {
981 spin_unlock(&devc->lock);
982 return -EBUSY;
983 }
984 devc->dual_dma = 0;
985
986 if (audio_devs[dev]->flags & DMA_DUPLEX)
987 {
988 devc->dual_dma = 1;
989 }
990 devc->intr_active = 0;
991 devc->audio_mode = 0;
992 devc->open_mode |= mode;
993 portc->open_mode = mode;
994 spin_unlock(&devc->lock);
995 ad1848_trigger(dev, 0);
996
997 if (mode & OPEN_READ)
998 devc->record_dev = dev;
999 if (mode & OPEN_WRITE)
1000 devc->playback_dev = dev;
1001
1002
1003
1004 spin_lock_irqsave(&devc->lock,flags);
1005 ad_mute(devc);
1006 spin_unlock_irqrestore(&devc->lock,flags);
1007
1008 return 0;
1009}
1010
1011static void ad1848_close(int dev)
1012{
1013 unsigned long flags;
1014 ad1848_info *devc = (ad1848_info *) audio_devs[dev]->devc;
1015 ad1848_port_info *portc = (ad1848_port_info *) audio_devs[dev]->portc;
1016
1017 devc->intr_active = 0;
1018 ad1848_halt(dev);
1019
1020 spin_lock_irqsave(&devc->lock,flags);
1021
1022 devc->audio_mode = 0;
1023 devc->open_mode &= ~portc->open_mode;
1024 portc->open_mode = 0;
1025
1026 ad_unmute(devc);
1027 spin_unlock_irqrestore(&devc->lock,flags);
1028}
1029
1030static void ad1848_output_block(int dev, unsigned long buf, int count, int intrflag)
1031{
1032 unsigned long flags, cnt;
1033 ad1848_info *devc = (ad1848_info *) audio_devs[dev]->devc;
1034 ad1848_port_info *portc = (ad1848_port_info *) audio_devs[dev]->portc;
1035
1036 cnt = count;
1037
1038 if (portc->audio_format == AFMT_IMA_ADPCM)
1039 {
1040 cnt /= 4;
1041 }
1042 else
1043 {
1044 if (portc->audio_format & (AFMT_S16_LE | AFMT_S16_BE))
1045 cnt >>= 1;
1046 }
1047 if (portc->channels > 1)
1048 cnt >>= 1;
1049 cnt--;
1050
1051 if ((devc->audio_mode & PCM_ENABLE_OUTPUT) && (audio_devs[dev]->flags & DMA_AUTOMODE) &&
1052 intrflag &&
1053 cnt == devc->xfer_count)
1054 {
1055 devc->audio_mode |= PCM_ENABLE_OUTPUT;
1056 devc->intr_active = 1;
1057 return;
1058
1059
1060 }
1061 spin_lock_irqsave(&devc->lock,flags);
1062
1063 ad_write(devc, 15, (unsigned char) (cnt & 0xff));
1064 ad_write(devc, 14, (unsigned char) ((cnt >> 8) & 0xff));
1065
1066 devc->xfer_count = cnt;
1067 devc->audio_mode |= PCM_ENABLE_OUTPUT;
1068 devc->intr_active = 1;
1069 spin_unlock_irqrestore(&devc->lock,flags);
1070}
1071
1072static void ad1848_start_input(int dev, unsigned long buf, int count, int intrflag)
1073{
1074 unsigned long flags, cnt;
1075 ad1848_info *devc = (ad1848_info *) audio_devs[dev]->devc;
1076 ad1848_port_info *portc = (ad1848_port_info *) audio_devs[dev]->portc;
1077
1078 cnt = count;
1079 if (portc->audio_format == AFMT_IMA_ADPCM)
1080 {
1081 cnt /= 4;
1082 }
1083 else
1084 {
1085 if (portc->audio_format & (AFMT_S16_LE | AFMT_S16_BE))
1086 cnt >>= 1;
1087 }
1088 if (portc->channels > 1)
1089 cnt >>= 1;
1090 cnt--;
1091
1092 if ((devc->audio_mode & PCM_ENABLE_INPUT) && (audio_devs[dev]->flags & DMA_AUTOMODE) &&
1093 intrflag &&
1094 cnt == devc->xfer_count)
1095 {
1096 devc->audio_mode |= PCM_ENABLE_INPUT;
1097 devc->intr_active = 1;
1098 return;
1099
1100
1101 }
1102 spin_lock_irqsave(&devc->lock,flags);
1103
1104 if (devc->model == MD_1848)
1105 {
1106 ad_write(devc, 15, (unsigned char) (cnt & 0xff));
1107 ad_write(devc, 14, (unsigned char) ((cnt >> 8) & 0xff));
1108 }
1109 else
1110 {
1111 ad_write(devc, 31, (unsigned char) (cnt & 0xff));
1112 ad_write(devc, 30, (unsigned char) ((cnt >> 8) & 0xff));
1113 }
1114
1115 ad_unmute(devc);
1116
1117 devc->xfer_count = cnt;
1118 devc->audio_mode |= PCM_ENABLE_INPUT;
1119 devc->intr_active = 1;
1120 spin_unlock_irqrestore(&devc->lock,flags);
1121}
1122
1123static int ad1848_prepare_for_output(int dev, int bsize, int bcount)
1124{
1125 int timeout;
1126 unsigned char fs, old_fs, tmp = 0;
1127 unsigned long flags;
1128 ad1848_info *devc = (ad1848_info *) audio_devs[dev]->devc;
1129 ad1848_port_info *portc = (ad1848_port_info *) audio_devs[dev]->portc;
1130
1131 ad_mute(devc);
1132
1133 spin_lock_irqsave(&devc->lock,flags);
1134 fs = portc->speed_bits | (portc->format_bits << 5);
1135
1136 if (portc->channels > 1)
1137 fs |= 0x10;
1138
1139 ad_enter_MCE(devc);
1140
1141 if (devc->model == MD_1845 || devc->model == MD_1845_SSCAPE)
1142 {
1143 fs &= 0xf0;
1144
1145 ad_write(devc, 22, (portc->speed >> 8) & 0xff);
1146 ad_write(devc, 23, portc->speed & 0xff);
1147 }
1148 old_fs = ad_read(devc, 8);
1149
1150 if (devc->model == MD_4232 || devc->model >= MD_4236)
1151 {
1152 tmp = ad_read(devc, 16);
1153 ad_write(devc, 16, tmp | 0x30);
1154 }
1155 if (devc->model == MD_IWAVE)
1156 ad_write(devc, 17, 0xc2);
1157
1158 ad_write(devc, 8, fs);
1159
1160
1161
1162
1163
1164 timeout = 0;
1165 while (timeout < 100 && inb(devc->base) != 0x80)
1166 timeout++;
1167 timeout = 0;
1168 while (timeout < 10000 && inb(devc->base) == 0x80)
1169 timeout++;
1170
1171 if (devc->model >= MD_4232)
1172 ad_write(devc, 16, tmp & ~0x30);
1173
1174 ad_leave_MCE(devc);
1175
1176
1177 spin_unlock_irqrestore(&devc->lock,flags);
1178 devc->xfer_count = 0;
1179
1180#ifndef EXCLUDE_TIMERS
1181 if (dev == timer_installed && devc->timer_running)
1182 if ((fs & 0x01) != (old_fs & 0x01))
1183 {
1184 ad1848_tmr_reprogram(dev);
1185 }
1186#endif
1187 ad1848_halt_output(dev);
1188 return 0;
1189}
1190
1191static int ad1848_prepare_for_input(int dev, int bsize, int bcount)
1192{
1193 int timeout;
1194 unsigned char fs, old_fs, tmp = 0;
1195 unsigned long flags;
1196 ad1848_info *devc = (ad1848_info *) audio_devs[dev]->devc;
1197 ad1848_port_info *portc = (ad1848_port_info *) audio_devs[dev]->portc;
1198
1199 if (devc->audio_mode)
1200 return 0;
1201
1202 spin_lock_irqsave(&devc->lock,flags);
1203 fs = portc->speed_bits | (portc->format_bits << 5);
1204
1205 if (portc->channels > 1)
1206 fs |= 0x10;
1207
1208 ad_enter_MCE(devc);
1209
1210 if ((devc->model == MD_1845) || (devc->model == MD_1845_SSCAPE))
1211 {
1212 fs &= 0xf0;
1213
1214 ad_write(devc, 22, (portc->speed >> 8) & 0xff);
1215 ad_write(devc, 23, portc->speed & 0xff);
1216 }
1217 if (devc->model == MD_4232)
1218 {
1219 tmp = ad_read(devc, 16);
1220 ad_write(devc, 16, tmp | 0x30);
1221 }
1222 if (devc->model == MD_IWAVE)
1223 ad_write(devc, 17, 0xc2);
1224
1225
1226
1227
1228
1229 if (devc->model != MD_1848)
1230 {
1231 old_fs = ad_read(devc, 28);
1232 ad_write(devc, 28, fs);
1233
1234
1235
1236
1237
1238 timeout = 0;
1239 while (timeout < 100 && inb(devc->base) != 0x80)
1240 timeout++;
1241
1242 timeout = 0;
1243 while (timeout < 10000 && inb(devc->base) == 0x80)
1244 timeout++;
1245
1246 if (devc->model != MD_1848 && devc->model != MD_1845 && devc->model != MD_1845_SSCAPE)
1247 {
1248
1249
1250
1251
1252
1253 unsigned char tmp = portc->speed_bits | (ad_read(devc, 8) & 0xf0);
1254
1255 ad_write(devc, 8, tmp);
1256
1257
1258
1259 timeout = 0;
1260 while (timeout < 100 && inb(devc->base) != 0x80)
1261 timeout++;
1262
1263 timeout = 0;
1264 while (timeout < 10000 && inb(devc->base) == 0x80)
1265 timeout++;
1266 }
1267 }
1268 else
1269 {
1270
1271 old_fs = ad_read(devc, 8);
1272 ad_write(devc, 8, fs);
1273
1274
1275
1276 timeout = 0;
1277 while (timeout < 100 && inb(devc->base) != 0x80)
1278 timeout++;
1279 timeout = 0;
1280 while (timeout < 10000 && inb(devc->base) == 0x80)
1281 timeout++;
1282 }
1283
1284 if (devc->model == MD_4232)
1285 ad_write(devc, 16, tmp & ~0x30);
1286
1287 ad_leave_MCE(devc);
1288
1289
1290 spin_unlock_irqrestore(&devc->lock,flags);
1291 devc->xfer_count = 0;
1292
1293#ifndef EXCLUDE_TIMERS
1294 if (dev == timer_installed && devc->timer_running)
1295 {
1296 if ((fs & 0x01) != (old_fs & 0x01))
1297 {
1298 ad1848_tmr_reprogram(dev);
1299 }
1300 }
1301#endif
1302 ad1848_halt_input(dev);
1303 return 0;
1304}
1305
1306static void ad1848_halt(int dev)
1307{
1308 ad1848_info *devc = (ad1848_info *) audio_devs[dev]->devc;
1309 ad1848_port_info *portc = (ad1848_port_info *) audio_devs[dev]->portc;
1310
1311 unsigned char bits = ad_read(devc, 9);
1312
1313 if (bits & 0x01 && (portc->open_mode & OPEN_WRITE))
1314 ad1848_halt_output(dev);
1315
1316 if (bits & 0x02 && (portc->open_mode & OPEN_READ))
1317 ad1848_halt_input(dev);
1318 devc->audio_mode = 0;
1319}
1320
1321static void ad1848_halt_input(int dev)
1322{
1323 ad1848_info *devc = (ad1848_info *) audio_devs[dev]->devc;
1324 unsigned long flags;
1325
1326 if (!(ad_read(devc, 9) & 0x02))
1327 return;
1328
1329 spin_lock_irqsave(&devc->lock,flags);
1330
1331 ad_mute(devc);
1332
1333 {
1334 int tmout;
1335
1336 if(!isa_dma_bridge_buggy)
1337 disable_dma(audio_devs[dev]->dmap_in->dma);
1338
1339 for (tmout = 0; tmout < 100000; tmout++)
1340 if (ad_read(devc, 11) & 0x10)
1341 break;
1342 ad_write(devc, 9, ad_read(devc, 9) & ~0x02);
1343
1344 if(!isa_dma_bridge_buggy)
1345 enable_dma(audio_devs[dev]->dmap_in->dma);
1346 devc->audio_mode &= ~PCM_ENABLE_INPUT;
1347 }
1348
1349 outb(0, io_Status(devc));
1350 outb(0, io_Status(devc));
1351
1352 devc->audio_mode &= ~PCM_ENABLE_INPUT;
1353
1354 spin_unlock_irqrestore(&devc->lock,flags);
1355}
1356
1357static void ad1848_halt_output(int dev)
1358{
1359 ad1848_info *devc = (ad1848_info *) audio_devs[dev]->devc;
1360 unsigned long flags;
1361
1362 if (!(ad_read(devc, 9) & 0x01))
1363 return;
1364
1365 spin_lock_irqsave(&devc->lock,flags);
1366
1367 ad_mute(devc);
1368 {
1369 int tmout;
1370
1371 if(!isa_dma_bridge_buggy)
1372 disable_dma(audio_devs[dev]->dmap_out->dma);
1373
1374 for (tmout = 0; tmout < 100000; tmout++)
1375 if (ad_read(devc, 11) & 0x10)
1376 break;
1377 ad_write(devc, 9, ad_read(devc, 9) & ~0x01);
1378
1379 if(!isa_dma_bridge_buggy)
1380 enable_dma(audio_devs[dev]->dmap_out->dma);
1381
1382 devc->audio_mode &= ~PCM_ENABLE_OUTPUT;
1383 }
1384
1385 outb((0), io_Status(devc));
1386 outb((0), io_Status(devc));
1387
1388 devc->audio_mode &= ~PCM_ENABLE_OUTPUT;
1389
1390 spin_unlock_irqrestore(&devc->lock,flags);
1391}
1392
1393static void ad1848_trigger(int dev, int state)
1394{
1395 ad1848_info *devc = (ad1848_info *) audio_devs[dev]->devc;
1396 ad1848_port_info *portc = (ad1848_port_info *) audio_devs[dev]->portc;
1397 unsigned long flags;
1398 unsigned char tmp, old;
1399
1400 spin_lock_irqsave(&devc->lock,flags);
1401 state &= devc->audio_mode;
1402
1403 tmp = old = ad_read(devc, 9);
1404
1405 if (portc->open_mode & OPEN_READ)
1406 {
1407 if (state & PCM_ENABLE_INPUT)
1408 tmp |= 0x02;
1409 else
1410 tmp &= ~0x02;
1411 }
1412 if (portc->open_mode & OPEN_WRITE)
1413 {
1414 if (state & PCM_ENABLE_OUTPUT)
1415 tmp |= 0x01;
1416 else
1417 tmp &= ~0x01;
1418 }
1419
1420 if (tmp != old)
1421 {
1422 ad_write(devc, 9, tmp);
1423 ad_unmute(devc);
1424 }
1425 spin_unlock_irqrestore(&devc->lock,flags);
1426}
1427
1428static void ad1848_init_hw(ad1848_info * devc)
1429{
1430 int i;
1431 int *init_values;
1432
1433
1434
1435
1436 static int init_values_a[] =
1437 {
1438 0xa8, 0xa8, 0x08, 0x08, 0x08, 0x08, 0x00, 0x00,
1439 0x00, 0x0c, 0x02, 0x00, 0x8a, 0x01, 0x00, 0x00,
1440
1441
1442 0x80, 0x00, 0x10, 0x10, 0x00, 0x00, 0x1f, 0x40,
1443 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
1444 };
1445
1446 static int init_values_b[] =
1447 {
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458 0xa8, 0xa8, 0x08, 0x08, 0x08, 0x08, 0x00, 0x00,
1459 0x00, 0x00, 0x06, 0x00, 0xe0, 0x01, 0x00, 0x00,
1460 0x80, 0x00, 0x10, 0x10, 0x00, 0x00, 0x1f, 0x40,
1461 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
1462 };
1463
1464
1465
1466
1467
1468 init_values = init_values_a;
1469 if(devc->model >= MD_4236)
1470 init_values = init_values_b;
1471
1472 for (i = 0; i < 16; i++)
1473 ad_write(devc, i, init_values[i]);
1474
1475
1476 ad_mute(devc);
1477 ad_unmute(devc);
1478
1479 if (devc->model > MD_1848)
1480 {
1481 if (devc->model == MD_1845_SSCAPE)
1482 ad_write(devc, 12, ad_read(devc, 12) | 0x50);
1483 else
1484 ad_write(devc, 12, ad_read(devc, 12) | 0x40);
1485
1486 if (devc->model == MD_IWAVE)
1487 ad_write(devc, 12, 0x6c);
1488
1489 if (devc->model != MD_1845_SSCAPE)
1490 for (i = 16; i < 32; i++)
1491 ad_write(devc, i, init_values[i]);
1492
1493 if (devc->model == MD_IWAVE)
1494 ad_write(devc, 16, 0x30);
1495 }
1496 if (devc->model > MD_1848)
1497 {
1498 if (devc->audio_flags & DMA_DUPLEX)
1499 ad_write(devc, 9, ad_read(devc, 9) & ~0x04);
1500 else
1501 ad_write(devc, 9, ad_read(devc, 9) | 0x04);
1502
1503 if (devc->model == MD_1845 || devc->model == MD_1845_SSCAPE)
1504 ad_write(devc, 27, ad_read(devc, 27) | 0x08);
1505
1506 if (devc->model == MD_IWAVE)
1507 {
1508 ad_write(devc, 12, 0x6c);
1509 ad_write(devc, 16, 0x30);
1510 ad_write(devc, 17, 0xc2);
1511 }
1512 }
1513 else
1514 {
1515 devc->audio_flags &= ~DMA_DUPLEX;
1516 ad_write(devc, 9, ad_read(devc, 9) | 0x04);
1517 if (soundpro)
1518 ad_write(devc, 12, ad_read(devc, 12) | 0x40);
1519 }
1520
1521 outb((0), io_Status(devc));
1522
1523
1524
1525
1526
1527 ad_enter_MCE(devc);
1528 ad_leave_MCE(devc);
1529
1530 ad1848_mixer_reset(devc);
1531}
1532
1533int ad1848_detect(struct resource *ports, int *ad_flags, int *osp)
1534{
1535 unsigned char tmp;
1536 ad1848_info *devc = &adev_info[nr_ad1848_devs];
1537 unsigned char tmp1 = 0xff, tmp2 = 0xff;
1538 int optiC930 = 0;
1539 int interwave = 0;
1540 int ad1847_flag = 0;
1541 int cs4248_flag = 0;
1542 int sscape_flag = 0;
1543 int io_base = ports->start;
1544
1545 int i;
1546
1547 DDB(printk("ad1848_detect(%x)\n", io_base));
1548
1549 if (ad_flags)
1550 {
1551 if (*ad_flags == 0x12345678)
1552 {
1553 interwave = 1;
1554 *ad_flags = 0;
1555 }
1556
1557 if (*ad_flags == 0x87654321)
1558 {
1559 sscape_flag = 1;
1560 *ad_flags = 0;
1561 }
1562
1563 if (*ad_flags == 0x12345677)
1564 {
1565 cs4248_flag = 1;
1566 *ad_flags = 0;
1567 }
1568 }
1569 if (nr_ad1848_devs >= MAX_AUDIO_DEV)
1570 {
1571 printk(KERN_ERR "ad1848 - Too many audio devices\n");
1572 return 0;
1573 }
1574 spin_lock_init(&devc->lock);
1575 devc->base = io_base;
1576 devc->irq_ok = 0;
1577 devc->timer_running = 0;
1578 devc->MCE_bit = 0x40;
1579 devc->irq = 0;
1580 devc->open_mode = 0;
1581 devc->chip_name = devc->name = "AD1848";
1582 devc->model = MD_1848;
1583 devc->levels = NULL;
1584 devc->debug_flag = 0;
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596 if (inb(devc->base) == 0xff)
1597 {
1598 DDB(printk("ad1848_detect: The base I/O address appears to be dead\n"));
1599 }
1600
1601
1602
1603
1604
1605 DDB(printk("ad1848_detect() - step 0\n"));
1606
1607 for (i = 0; i < 10000000; i++)
1608 {
1609 unsigned char x = inb(devc->base);
1610
1611 if (x == 0xff || !(x & 0x80))
1612 break;
1613 }
1614
1615 DDB(printk("ad1848_detect() - step A\n"));
1616
1617 if (inb(devc->base) == 0x80)
1618 ad_leave_MCE(devc);
1619
1620 if ((inb(devc->base) & 0x80) != 0x00)
1621 {
1622 DDB(printk("ad1848 detect error - step A (%02x)\n", (int) inb(devc->base)));
1623 return 0;
1624 }
1625
1626
1627
1628
1629
1630
1631
1632 DDB(printk("ad1848_detect() - step B\n"));
1633 ad_write(devc, 0, 0xaa);
1634 ad_write(devc, 1, 0x45);
1635
1636 if ((tmp1 = ad_read(devc, 0)) != 0xaa || (tmp2 = ad_read(devc, 1)) != 0x45)
1637 {
1638 if (tmp2 == 0x65)
1639 ad1847_flag = 1;
1640 else
1641 {
1642 DDB(printk("ad1848 detect error - step B (%x/%x)\n", tmp1, tmp2));
1643 return 0;
1644 }
1645 }
1646 DDB(printk("ad1848_detect() - step C\n"));
1647 ad_write(devc, 0, 0x45);
1648 ad_write(devc, 1, 0xaa);
1649
1650 if ((tmp1 = ad_read(devc, 0)) != 0x45 || (tmp2 = ad_read(devc, 1)) != 0xaa)
1651 {
1652 if (tmp2 == 0x8a)
1653 ad1847_flag = 1;
1654 else
1655 {
1656 DDB(printk("ad1848 detect error - step C (%x/%x)\n", tmp1, tmp2));
1657 return 0;
1658 }
1659 }
1660
1661
1662
1663
1664
1665
1666 DDB(printk("ad1848_detect() - step D\n"));
1667 tmp = ad_read(devc, 12);
1668 ad_write(devc, 12, (~tmp) & 0x0f);
1669
1670 if ((tmp & 0x0f) != ((tmp1 = ad_read(devc, 12)) & 0x0f))
1671 {
1672 DDB(printk("ad1848 detect error - step D (%x)\n", tmp1));
1673 return 0;
1674 }
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695 DDB(printk("ad1848_detect() - step F\n"));
1696 ad_write(devc, 12, 0);
1697
1698 for (i = 0; i < 16; i++)
1699 {
1700 if ((tmp1 = ad_read(devc, i)) != (tmp2 = ad_read(devc, i + 16)))
1701 {
1702 DDB(printk("ad1848 detect step F(%d/%x/%x) - OPTi chip???\n", i, tmp1, tmp2));
1703 if (!ad1847_flag)
1704 optiC930 = 1;
1705 break;
1706 }
1707 }
1708
1709
1710
1711
1712
1713
1714 DDB(printk("ad1848_detect() - step G\n"));
1715
1716 if (ad_flags && *ad_flags == 400)
1717 *ad_flags = 0;
1718 else
1719 ad_write(devc, 12, 0x40);
1720
1721
1722 if (ad_flags)
1723 *ad_flags = 0;
1724
1725 tmp1 = ad_read(devc, 12);
1726 if (tmp1 & 0x80)
1727 {
1728 if (ad_flags)
1729 *ad_flags |= AD_F_CS4248;
1730
1731 devc->chip_name = "CS4248";
1732 }
1733 if (optiC930 || (tmp1 & 0xc0) == (0x80 | 0x40))
1734 {
1735
1736
1737
1738
1739
1740
1741 DDB(printk("ad1848_detect() - step H\n"));
1742 ad_write(devc, 16, 0);
1743
1744 ad_write(devc, 0, 0x45);
1745 if ((tmp1 = ad_read(devc, 16)) != 0x45)
1746 {
1747 ad_write(devc, 0, 0xaa);
1748 if ((tmp1 = ad_read(devc, 16)) == 0xaa)
1749 {
1750 DDB(printk("ad1848 detect error - step H(%x)\n", tmp1));
1751 return 0;
1752 }
1753
1754
1755
1756
1757
1758 DDB(printk("ad1848_detect() - step I\n"));
1759 tmp1 = ad_read(devc, 25);
1760 ad_write(devc, 25, ~tmp1);
1761 if ((ad_read(devc, 25) & 0xe7) == (tmp1 & 0xe7))
1762 {
1763 int id;
1764
1765
1766
1767
1768
1769 devc->chip_name = "CS4231";
1770 devc->model = MD_4231;
1771
1772
1773
1774
1775
1776
1777
1778 id = ad_read(devc, 25);
1779 if ((id & 0xe7) == 0x80)
1780 id = ad_read(devc, 25);
1781 if ((id & 0xe7) == 0x80)
1782 id = ad_read(devc, 25);
1783 DDB(printk("ad1848_detect() - step J (%02x/%02x)\n", id, ad_read(devc, 25)));
1784
1785 if ((id & 0xe7) == 0x80) {
1786
1787
1788
1789
1790
1791
1792
1793 unsigned char tmp = ad_read(devc, 23);
1794 ad_write(devc, 23, ~tmp);
1795
1796 if (interwave)
1797 {
1798 devc->model = MD_IWAVE;
1799 devc->chip_name = "IWave";
1800 }
1801 else if (ad_read(devc, 23) != tmp)
1802 {
1803 devc->chip_name = "AD1845";
1804 devc->model = MD_1845;
1805 }
1806 else if (cs4248_flag)
1807 {
1808 if (ad_flags)
1809 *ad_flags |= AD_F_CS4248;
1810 devc->chip_name = "CS4248";
1811 devc->model = MD_1848;
1812 ad_write(devc, 12, ad_read(devc, 12) & ~0x40);
1813 }
1814 ad_write(devc, 23, tmp);
1815 }
1816 else
1817 {
1818 switch (id & 0x1f) {
1819 case 3:
1820 {
1821 int xid;
1822 ad_write(devc, 12, ad_read(devc, 12) | 0x60);
1823 ad_write(devc, 23, 0x9c);
1824 xid = inb(io_Indexed_Data(devc));
1825 ad_write(devc, 12, ad_read(devc, 12) & ~0x60);
1826 switch (xid & 0x1f)
1827 {
1828 case 0x00:
1829 devc->chip_name = "CS4237B(B)";
1830 devc->model = MD_42xB;
1831 break;
1832 case 0x08:
1833
1834 devc->chip_name = "CS4238";
1835 devc->model = MD_42xB;
1836 break;
1837 case 0x09:
1838 devc->chip_name = "CS4238B";
1839 devc->model = MD_42xB;
1840 break;
1841 case 0x0b:
1842 devc->chip_name = "CS4236B";
1843 devc->model = MD_4236;
1844 break;
1845 case 0x10:
1846 devc->chip_name = "CS4237B";
1847 devc->model = MD_42xB;
1848 break;
1849 case 0x1d:
1850 devc->chip_name = "CS4235";
1851 devc->model = MD_4235;
1852 break;
1853 case 0x1e:
1854 devc->chip_name = "CS4239";
1855 devc->model = MD_4239;
1856 break;
1857 default:
1858 printk("Chip ident is %X.\n", xid&0x1F);
1859 devc->chip_name = "CS42xx";
1860 devc->model = MD_4232;
1861 break;
1862 }
1863 }
1864 break;
1865
1866 case 2:
1867 devc->chip_name = "CS4232";
1868 devc->model = MD_4232;
1869 break;
1870
1871 case 0:
1872 if ((id & 0xe0) == 0xa0)
1873 {
1874 devc->chip_name = "CS4231A";
1875 devc->model = MD_4231A;
1876 }
1877 else
1878 {
1879 devc->chip_name = "CS4321";
1880 devc->model = MD_4231;
1881 }
1882 break;
1883
1884 default:
1885 DDB(printk("ad1848: I25 = %02x/%02x\n", ad_read(devc, 25), ad_read(devc, 25) & 0xe7));
1886 if (optiC930)
1887 {
1888 devc->chip_name = "82C930";
1889 devc->model = MD_C930;
1890 }
1891 else
1892 {
1893 devc->chip_name = "CS4231";
1894 devc->model = MD_4231;
1895 }
1896 }
1897 }
1898 }
1899 ad_write(devc, 25, tmp1);
1900
1901 DDB(printk("ad1848_detect() - step K\n"));
1902 }
1903 } else if (tmp1 == 0x0a) {
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914 for (i = 0; i < 16; i++) {
1915 if ((tmp1 = ad_read(devc, i)) != (tmp2 = ad_read(devc, i + 16))) {
1916 DDB(printk("ad1848 detect step H(%d/%x/%x) - SoundPro chip?\n", i, tmp1, tmp2));
1917 soundpro = 1;
1918 devc->chip_name = "SoundPro CMI 8330";
1919 break;
1920 }
1921 }
1922 }
1923
1924 DDB(printk("ad1848_detect() - step L\n"));
1925 if (ad_flags)
1926 {
1927 if (devc->model != MD_1848)
1928 *ad_flags |= AD_F_CS4231;
1929 }
1930 DDB(printk("ad1848_detect() - Detected OK\n"));
1931
1932 if (devc->model == MD_1848 && ad1847_flag)
1933 devc->chip_name = "AD1847";
1934
1935
1936 if (sscape_flag == 1)
1937 devc->model = MD_1845_SSCAPE;
1938
1939 return 1;
1940}
1941
1942int ad1848_init (char *name, struct resource *ports, int irq, int dma_playback,
1943 int dma_capture, int share_dma, int *osp, struct module *owner)
1944{
1945
1946
1947
1948
1949
1950
1951 int my_dev;
1952 char dev_name[100];
1953 int e;
1954
1955 ad1848_info *devc = &adev_info[nr_ad1848_devs];
1956
1957 ad1848_port_info *portc = NULL;
1958
1959 devc->irq = (irq > 0) ? irq : 0;
1960 devc->open_mode = 0;
1961 devc->timer_ticks = 0;
1962 devc->dma1 = dma_playback;
1963 devc->dma2 = dma_capture;
1964 devc->subtype = cfg.card_subtype;
1965 devc->audio_flags = DMA_AUTOMODE;
1966 devc->playback_dev = devc->record_dev = 0;
1967 if (name != NULL)
1968 devc->name = name;
1969
1970 if (name != NULL && name[0] != 0)
1971 sprintf(dev_name,
1972 "%s (%s)", name, devc->chip_name);
1973 else
1974 sprintf(dev_name,
1975 "Generic audio codec (%s)", devc->chip_name);
1976
1977 rename_region(ports, devc->name);
1978
1979 conf_printf2(dev_name, devc->base, devc->irq, dma_playback, dma_capture);
1980
1981 if (devc->model == MD_1848 || devc->model == MD_C930)
1982 devc->audio_flags |= DMA_HARDSTOP;
1983
1984 if (devc->model > MD_1848)
1985 {
1986 if (devc->dma1 == devc->dma2 || devc->dma2 == -1 || devc->dma1 == -1)
1987 devc->audio_flags &= ~DMA_DUPLEX;
1988 else
1989 devc->audio_flags |= DMA_DUPLEX;
1990 }
1991
1992 portc = kmalloc(sizeof(ad1848_port_info), GFP_KERNEL);
1993 if(portc==NULL) {
1994 release_region(devc->base, 4);
1995 return -1;
1996 }
1997
1998 if ((my_dev = sound_install_audiodrv(AUDIO_DRIVER_VERSION,
1999 dev_name,
2000 &ad1848_audio_driver,
2001 sizeof(struct audio_driver),
2002 devc->audio_flags,
2003 ad_format_mask[devc->model],
2004 devc,
2005 dma_playback,
2006 dma_capture)) < 0)
2007 {
2008 release_region(devc->base, 4);
2009 kfree(portc);
2010 return -1;
2011 }
2012
2013 audio_devs[my_dev]->portc = portc;
2014 audio_devs[my_dev]->mixer_dev = -1;
2015 if (owner)
2016 audio_devs[my_dev]->d->owner = owner;
2017 memset((char *) portc, 0, sizeof(*portc));
2018
2019 nr_ad1848_devs++;
2020
2021 ad1848_init_hw(devc);
2022
2023 if (irq > 0)
2024 {
2025 devc->dev_no = my_dev;
2026 if (request_irq(devc->irq, adintr, 0, devc->name,
2027 (void *)(long)my_dev) < 0)
2028 {
2029 printk(KERN_WARNING "ad1848: Unable to allocate IRQ\n");
2030
2031 devc->irq = 0;
2032 }
2033 if (capabilities[devc->model].flags & CAP_F_TIMER)
2034 {
2035#ifndef CONFIG_SMP
2036 int x;
2037 unsigned char tmp = ad_read(devc, 16);
2038#endif
2039
2040 devc->timer_ticks = 0;
2041
2042 ad_write(devc, 21, 0x00);
2043 ad_write(devc, 20, 0x10);
2044#ifndef CONFIG_SMP
2045 ad_write(devc, 16, tmp | 0x40);
2046 for (x = 0; x < 100000 && devc->timer_ticks == 0; x++);
2047 ad_write(devc, 16, tmp & ~0x40);
2048
2049 if (devc->timer_ticks == 0)
2050 printk(KERN_WARNING "ad1848: Interrupt test failed (IRQ%d)\n", irq);
2051 else
2052 {
2053 DDB(printk("Interrupt test OK\n"));
2054 devc->irq_ok = 1;
2055 }
2056#else
2057 devc->irq_ok = 1;
2058#endif
2059 }
2060 else
2061 devc->irq_ok = 1;
2062 } else if (irq < 0)
2063 irq2dev[-irq] = devc->dev_no = my_dev;
2064
2065#ifndef EXCLUDE_TIMERS
2066 if ((capabilities[devc->model].flags & CAP_F_TIMER) &&
2067 devc->irq_ok)
2068 ad1848_tmr_install(my_dev);
2069#endif
2070
2071 if (!share_dma)
2072 {
2073 if (sound_alloc_dma(dma_playback, devc->name))
2074 printk(KERN_WARNING "ad1848.c: Can't allocate DMA%d\n", dma_playback);
2075
2076 if (dma_capture != dma_playback)
2077 if (sound_alloc_dma(dma_capture, devc->name))
2078 printk(KERN_WARNING "ad1848.c: Can't allocate DMA%d\n", dma_capture);
2079 }
2080
2081 if ((e = sound_install_mixer(MIXER_DRIVER_VERSION,
2082 dev_name,
2083 &ad1848_mixer_operations,
2084 sizeof(struct mixer_operations),
2085 devc)) >= 0)
2086 {
2087 audio_devs[my_dev]->mixer_dev = e;
2088 if (owner)
2089 mixer_devs[e]->owner = owner;
2090 }
2091 return my_dev;
2092}
2093
2094int ad1848_control(int cmd, int arg)
2095{
2096 ad1848_info *devc;
2097 unsigned long flags;
2098
2099 if (nr_ad1848_devs < 1)
2100 return -ENODEV;
2101
2102 devc = &adev_info[nr_ad1848_devs - 1];
2103
2104 switch (cmd)
2105 {
2106 case AD1848_SET_XTAL:
2107 if (devc->model != MD_1845 && devc->model != MD_1845_SSCAPE)
2108 return -EINVAL;
2109 spin_lock_irqsave(&devc->lock,flags);
2110 ad_enter_MCE(devc);
2111 ad_write(devc, 29, (ad_read(devc, 29) & 0x1f) | (arg << 5));
2112 ad_leave_MCE(devc);
2113 spin_unlock_irqrestore(&devc->lock,flags);
2114 break;
2115
2116 case AD1848_MIXER_REROUTE:
2117 {
2118 int o = (arg >> 8) & 0xff;
2119 int n = arg & 0xff;
2120
2121 if (o < 0 || o >= SOUND_MIXER_NRDEVICES)
2122 return -EINVAL;
2123
2124 if (!(devc->supported_devices & (1 << o)) &&
2125 !(devc->supported_rec_devices & (1 << o)))
2126 return -EINVAL;
2127
2128 if (n == SOUND_MIXER_NONE)
2129 {
2130 ad1848_mixer_set(devc, o, 0);
2131 devc->supported_devices &= ~(1 << o);
2132 devc->supported_rec_devices &= ~(1 << o);
2133 break;
2134 }
2135
2136
2137 if (n < 0 || n >= SOUND_MIXER_NRDEVICES)
2138 return -EINVAL;
2139
2140 devc->mixer_reroute[n] = o;
2141 if (devc->supported_devices & (1 << o))
2142 devc->supported_devices |= (1 << n);
2143 if (devc->supported_rec_devices & (1 << o))
2144 devc->supported_rec_devices |= (1 << n);
2145
2146 devc->supported_devices &= ~(1 << o);
2147 devc->supported_rec_devices &= ~(1 << o);
2148 }
2149 break;
2150 }
2151 return 0;
2152}
2153
2154void ad1848_unload(int io_base, int irq, int dma_playback, int dma_capture, int share_dma)
2155{
2156 int i, mixer, dev = 0;
2157 ad1848_info *devc = NULL;
2158
2159 for (i = 0; devc == NULL && i < nr_ad1848_devs; i++)
2160 {
2161 if (adev_info[i].base == io_base)
2162 {
2163 devc = &adev_info[i];
2164 dev = devc->dev_no;
2165 }
2166 }
2167
2168 if (devc != NULL)
2169 {
2170 kfree(audio_devs[dev]->portc);
2171 release_region(devc->base, 4);
2172
2173 if (!share_dma)
2174 {
2175 if (devc->irq > 0)
2176 free_irq(devc->irq, (void *)(long)devc->dev_no);
2177
2178 sound_free_dma(dma_playback);
2179
2180 if (dma_playback != dma_capture)
2181 sound_free_dma(dma_capture);
2182
2183 }
2184 mixer = audio_devs[devc->dev_no]->mixer_dev;
2185 if(mixer>=0)
2186 sound_unload_mixerdev(mixer);
2187
2188 nr_ad1848_devs--;
2189 for ( ; i < nr_ad1848_devs ; i++)
2190 adev_info[i] = adev_info[i+1];
2191 }
2192 else
2193 printk(KERN_ERR "ad1848: Can't find device to be unloaded. Base=%x\n", io_base);
2194}
2195
2196static irqreturn_t adintr(int irq, void *dev_id)
2197{
2198 unsigned char status;
2199 ad1848_info *devc;
2200 int dev;
2201 int alt_stat = 0xff;
2202 unsigned char c930_stat = 0;
2203 int cnt = 0;
2204
2205 dev = (long)dev_id;
2206 devc = (ad1848_info *) audio_devs[dev]->devc;
2207
2208interrupt_again:
2209
2210 status = inb(io_Status(devc));
2211
2212 if (status == 0x80)
2213 printk(KERN_DEBUG "adintr: Why?\n");
2214 if (devc->model == MD_1848)
2215 outb((0), io_Status(devc));
2216
2217 if (status & 0x01)
2218 {
2219 if (devc->model == MD_C930)
2220 {
2221
2222 spin_lock(&devc->lock);
2223
2224
2225
2226
2227 outb(11, 0xe0e);
2228 c930_stat = inb(0xe0f);
2229 outb((~c930_stat), 0xe0f);
2230
2231 spin_unlock(&devc->lock);
2232
2233 alt_stat = (c930_stat << 2) & 0x30;
2234 }
2235 else if (devc->model != MD_1848)
2236 {
2237 spin_lock(&devc->lock);
2238 alt_stat = ad_read(devc, 24);
2239 ad_write(devc, 24, ad_read(devc, 24) & ~alt_stat);
2240 spin_unlock(&devc->lock);
2241 }
2242
2243 if ((devc->open_mode & OPEN_READ) && (devc->audio_mode & PCM_ENABLE_INPUT) && (alt_stat & 0x20))
2244 {
2245 DMAbuf_inputintr(devc->record_dev);
2246 }
2247 if ((devc->open_mode & OPEN_WRITE) && (devc->audio_mode & PCM_ENABLE_OUTPUT) &&
2248 (alt_stat & 0x10))
2249 {
2250 DMAbuf_outputintr(devc->playback_dev, 1);
2251 }
2252 if (devc->model != MD_1848 && (alt_stat & 0x40))
2253 {
2254 devc->timer_ticks++;
2255#ifndef EXCLUDE_TIMERS
2256 if (timer_installed == dev && devc->timer_running)
2257 sound_timer_interrupt();
2258#endif
2259 }
2260 }
2261
2262
2263
2264
2265
2266
2267 if (inb(io_Status(devc)) & 0x01 && cnt++ < 4)
2268 {
2269 goto interrupt_again;
2270 }
2271 return IRQ_HANDLED;
2272}
2273
2274
2275
2276
2277
2278
2279static int init_deskpro_m(struct address_info *hw_config)
2280{
2281 unsigned char tmp;
2282
2283 if ((tmp = inb(0xc44)) == 0xff)
2284 {
2285 DDB(printk("init_deskpro_m: Dead port 0xc44\n"));
2286 return 0;
2287 }
2288
2289 outb(0x10, 0xc44);
2290 outb(0x40, 0xc45);
2291 outb(0x00, 0xc46);
2292 outb(0xe8, 0xc47);
2293 outb(0x14, 0xc44);
2294 outb(0x40, 0xc45);
2295 outb(0x00, 0xc46);
2296 outb(0xe8, 0xc47);
2297 outb(0x10, 0xc44);
2298
2299 return 1;
2300}
2301
2302
2303
2304
2305
2306
2307static int init_deskpro(struct address_info *hw_config)
2308{
2309 unsigned char tmp;
2310
2311 if ((tmp = inb(0xc44)) == 0xff)
2312 {
2313 DDB(printk("init_deskpro: Dead port 0xc44\n"));
2314 return 0;
2315 }
2316 outb((tmp | 0x04), 0xc44);
2317 if (inb(0xc44) != 0x04)
2318 {
2319 DDB(printk("init_deskpro: Invalid bank1 signature in port 0xc44\n"));
2320 return 0;
2321 }
2322
2323
2324
2325
2326
2327
2328
2329
2330
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352
2353#ifdef DEBUGXL
2354
2355 printk("Port 0xc44 (before): ");
2356 outb((tmp & ~0x04), 0xc44);
2357 printk("%02x ", inb(0xc44));
2358 outb((tmp | 0x04), 0xc44);
2359 printk("%02x\n", inb(0xc44));
2360#endif
2361
2362
2363 tmp = 0x58;
2364
2365 switch (hw_config->io_base)
2366 {
2367 case 0x530:
2368 tmp |= 0x00;
2369 break;
2370 case 0x604:
2371 tmp |= 0x01;
2372 break;
2373 case 0xf40:
2374 tmp |= 0x02;
2375 break;
2376 case 0xe80:
2377 tmp |= 0x03;
2378 break;
2379 default:
2380 DDB(printk("init_deskpro: Invalid MSS port %x\n", hw_config->io_base));
2381 return 0;
2382 }
2383 outb((tmp & ~0x04), 0xc44);
2384
2385#ifdef DEBUGXL
2386
2387 printk("Port 0xc44 (after): ");
2388 outb((tmp & ~0x04), 0xc44);
2389 printk("%02x ", inb(0xc44));
2390 outb((tmp | 0x04), 0xc44);
2391 printk("%02x\n", inb(0xc44));
2392#endif
2393
2394
2395
2396
2397
2398
2399
2400
2401
2402
2403
2404#ifdef DEBUGXL
2405
2406 printk("Port 0xc45 (before): ");
2407 outb((tmp & ~0x04), 0xc44);
2408 printk("%02x ", inb(0xc45));
2409 outb((tmp | 0x04), 0xc44);
2410 printk("%02x\n", inb(0xc45));
2411#endif
2412
2413 outb((tmp & ~0x04), 0xc44);
2414 outb((0x88), 0xc45);
2415 outb((tmp | 0x04), 0xc44);
2416 outb((0x10), 0xc45);
2417
2418#ifdef DEBUGXL
2419
2420 printk("Port 0xc45 (after): ");
2421 outb((tmp & ~0x04), 0xc44);
2422 printk("%02x ", inb(0xc45));
2423 outb((tmp | 0x04), 0xc44);
2424 printk("%02x\n", inb(0xc45));
2425#endif
2426
2427
2428
2429
2430
2431
2432
2433
2434
2435#ifdef DEBUGXL
2436
2437 printk("Port 0xc46 (before): ");
2438 outb((tmp & ~0x04), 0xc44);
2439 printk("%02x ", inb(0xc46));
2440 outb((tmp | 0x04), 0xc44);
2441 printk("%02x\n", inb(0xc46));
2442#endif
2443
2444 outb((tmp & ~0x04), 0xc44);
2445 outb((0x03), 0xc46);
2446 outb((tmp | 0x04), 0xc44);
2447 outb((0x11), 0xc46);
2448
2449#ifdef DEBUGXL
2450
2451 printk("Port 0xc46 (after): ");
2452 outb((tmp & ~0x04), 0xc44);
2453 printk("%02x ", inb(0xc46));
2454 outb((tmp | 0x04), 0xc44);
2455 printk("%02x\n", inb(0xc46));
2456#endif
2457
2458
2459
2460
2461
2462
2463
2464
2465#ifdef DEBUGXL
2466
2467 printk("Port 0xc47 (before): ");
2468 outb((tmp & ~0x04), 0xc44);
2469 printk("%02x ", inb(0xc47));
2470 outb((tmp | 0x04), 0xc44);
2471 printk("%02x\n", inb(0xc47));
2472#endif
2473
2474 outb((tmp & ~0x04), 0xc44);
2475 outb((0x7c), 0xc47);
2476 outb((tmp | 0x04), 0xc44);
2477 outb((0x00), 0xc47);
2478
2479#ifdef DEBUGXL
2480
2481 printk("Port 0xc47 (after): ");
2482 outb((tmp & ~0x04), 0xc44);
2483 printk("%02x ", inb(0xc47));
2484 outb((tmp | 0x04), 0xc44);
2485 printk("%02x\n", inb(0xc47));
2486#endif
2487
2488
2489
2490
2491
2492#ifdef DEBUGXL
2493 printk("Port 0xc6f (before) = %02x\n", inb(0xc6f));
2494#endif
2495
2496 outb((0x80), 0xc6f);
2497
2498#ifdef DEBUGXL
2499 printk("Port 0xc6f (after) = %02x\n", inb(0xc6f));
2500#endif
2501
2502 return 1;
2503}
2504
2505int probe_ms_sound(struct address_info *hw_config, struct resource *ports)
2506{
2507 unsigned char tmp;
2508
2509 DDB(printk("Entered probe_ms_sound(%x, %d)\n", hw_config->io_base, hw_config->card_subtype));
2510
2511 if (hw_config->card_subtype == 1)
2512 {
2513
2514 return ad1848_detect(ports, NULL, hw_config->osp);
2515 }
2516
2517 if (deskpro_xl && hw_config->card_subtype == 2)
2518 {
2519 if (!init_deskpro(hw_config))
2520 return 0;
2521 }
2522
2523 if (deskpro_m)
2524 {
2525 if (!init_deskpro_m(hw_config))
2526 return 0;
2527 }
2528
2529
2530
2531
2532
2533
2534
2535 if ((tmp = inb(hw_config->io_base + 3)) == 0xff)
2536 {
2537 int ret;
2538
2539 DDB(printk("I/O address is inactive (%x)\n", tmp));
2540 if (!(ret = ad1848_detect(ports, NULL, hw_config->osp)))
2541 return 0;
2542 return 1;
2543 }
2544 DDB(printk("MSS signature = %x\n", tmp & 0x3f));
2545 if ((tmp & 0x3f) != 0x04 &&
2546 (tmp & 0x3f) != 0x0f &&
2547 (tmp & 0x3f) != 0x00)
2548 {
2549 int ret;
2550
2551 MDB(printk(KERN_ERR "No MSS signature detected on port 0x%x (0x%x)\n", hw_config->io_base, (int) inb(hw_config->io_base + 3)));
2552 DDB(printk("Trying to detect codec anyway but IRQ/DMA may not work\n"));
2553 if (!(ret = ad1848_detect(ports, NULL, hw_config->osp)))
2554 return 0;
2555
2556 hw_config->card_subtype = 1;
2557 return 1;
2558 }
2559 if ((hw_config->irq != 5) &&
2560 (hw_config->irq != 7) &&
2561 (hw_config->irq != 9) &&
2562 (hw_config->irq != 10) &&
2563 (hw_config->irq != 11) &&
2564 (hw_config->irq != 12))
2565 {
2566 printk(KERN_ERR "MSS: Bad IRQ %d\n", hw_config->irq);
2567 return 0;
2568 }
2569 if (hw_config->dma != 0 && hw_config->dma != 1 && hw_config->dma != 3)
2570 {
2571 printk(KERN_ERR "MSS: Bad DMA %d\n", hw_config->dma);
2572 return 0;
2573 }
2574
2575
2576
2577
2578 if (hw_config->dma == 0 && inb(hw_config->io_base + 3) & 0x80)
2579 {
2580 printk(KERN_ERR "MSS: Can't use DMA0 with a 8 bit card/slot\n");
2581 return 0;
2582 }
2583 if (hw_config->irq > 7 && hw_config->irq != 9 && inb(hw_config->io_base + 3) & 0x80)
2584 {
2585 printk(KERN_ERR "MSS: Can't use IRQ%d with a 8 bit card/slot\n", hw_config->irq);
2586 return 0;
2587 }
2588 return ad1848_detect(ports, NULL, hw_config->osp);
2589}
2590
2591void attach_ms_sound(struct address_info *hw_config, struct resource *ports, struct module *owner)
2592{
2593 static signed char interrupt_bits[12] =
2594 {
2595 -1, -1, -1, -1, -1, 0x00, -1, 0x08, -1, 0x10, 0x18, 0x20
2596 };
2597 signed char bits;
2598 char dma2_bit = 0;
2599
2600 static char dma_bits[4] =
2601 {
2602 1, 2, 0, 3
2603 };
2604
2605 int config_port = hw_config->io_base + 0;
2606 int version_port = hw_config->io_base + 3;
2607 int dma = hw_config->dma;
2608 int dma2 = hw_config->dma2;
2609
2610 if (hw_config->card_subtype == 1)
2611 {
2612 hw_config->slots[0] = ad1848_init("MS Sound System", ports,
2613 hw_config->irq,
2614 hw_config->dma,
2615 hw_config->dma2, 0,
2616 hw_config->osp,
2617 owner);
2618 return;
2619 }
2620
2621
2622
2623
2624 bits = interrupt_bits[hw_config->irq];
2625 if (bits == -1)
2626 {
2627 printk(KERN_ERR "MSS: Bad IRQ %d\n", hw_config->irq);
2628 release_region(ports->start, 4);
2629 release_region(ports->start - 4, 4);
2630 return;
2631 }
2632 outb((bits | 0x40), config_port);
2633 if ((inb(version_port) & 0x40) == 0)
2634 printk(KERN_ERR "[MSS: IRQ Conflict?]\n");
2635
2636
2637
2638
2639
2640 if (dma2 != -1 && dma2 != dma)
2641 {
2642 if (!((dma == 0 && dma2 == 1) ||
2643 (dma == 1 && dma2 == 0) ||
2644 (dma == 3 && dma2 == 0)))
2645 {
2646 int tmp = dma;
2647
2648 dma = dma2;
2649 dma2 = tmp;
2650 }
2651 if ((dma == 0 && dma2 == 1) ||
2652 (dma == 1 && dma2 == 0) ||
2653 (dma == 3 && dma2 == 0))
2654 {
2655 dma2_bit = 0x04;
2656 }
2657 else
2658 {
2659 printk(KERN_WARNING "MSS: Invalid capture DMA\n");
2660 dma2 = dma;
2661 }
2662 }
2663 else
2664 {
2665 dma2 = dma;
2666 }
2667
2668 hw_config->dma = dma;
2669 hw_config->dma2 = dma2;
2670
2671 outb((bits | dma_bits[dma] | dma2_bit), config_port);
2672
2673 hw_config->slots[0] = ad1848_init("MS Sound System", ports,
2674 hw_config->irq,
2675 dma, dma2, 0,
2676 hw_config->osp,
2677 THIS_MODULE);
2678}
2679
2680void unload_ms_sound(struct address_info *hw_config)
2681{
2682 ad1848_unload(hw_config->io_base + 4,
2683 hw_config->irq,
2684 hw_config->dma,
2685 hw_config->dma2, 0);
2686 sound_unload_audiodev(hw_config->slots[0]);
2687 release_region(hw_config->io_base, 4);
2688}
2689
2690#ifndef EXCLUDE_TIMERS
2691
2692
2693
2694
2695
2696static unsigned int current_interval;
2697
2698static unsigned int ad1848_tmr_start(int dev, unsigned int usecs)
2699{
2700 unsigned long flags;
2701 ad1848_info *devc = (ad1848_info *) audio_devs[dev]->devc;
2702 unsigned long xtal_nsecs;
2703 unsigned long divider;
2704
2705 spin_lock_irqsave(&devc->lock,flags);
2706
2707
2708
2709
2710
2711
2712
2713
2714
2715
2716
2717
2718 if (devc->model == MD_1845 || devc->model == MD_1845_SSCAPE)
2719 xtal_nsecs = 10050;
2720 else if (ad_read(devc, 8) & 0x01)
2721 xtal_nsecs = 9920;
2722 else
2723 xtal_nsecs = 9969;
2724
2725 divider = (usecs * 1000 + xtal_nsecs / 2) / xtal_nsecs;
2726
2727 if (divider < 100)
2728 divider = 100;
2729
2730 if (divider > 65535)
2731 divider = 65535;
2732
2733 ad_write(devc, 21, (divider >> 8) & 0xff);
2734 ad_write(devc, 20, divider & 0xff);
2735 ad_write(devc, 16, ad_read(devc, 16) | 0x40);
2736 devc->timer_running = 1;
2737 spin_unlock_irqrestore(&devc->lock,flags);
2738
2739 return current_interval = (divider * xtal_nsecs + 500) / 1000;
2740}
2741
2742static void ad1848_tmr_reprogram(int dev)
2743{
2744
2745
2746
2747
2748
2749 ad1848_tmr_start(dev, current_interval);
2750 sound_timer_syncinterval(current_interval);
2751}
2752
2753static void ad1848_tmr_disable(int dev)
2754{
2755 unsigned long flags;
2756 ad1848_info *devc = (ad1848_info *) audio_devs[dev]->devc;
2757
2758 spin_lock_irqsave(&devc->lock,flags);
2759 ad_write(devc, 16, ad_read(devc, 16) & ~0x40);
2760 devc->timer_running = 0;
2761 spin_unlock_irqrestore(&devc->lock,flags);
2762}
2763
2764static void ad1848_tmr_restart(int dev)
2765{
2766 unsigned long flags;
2767 ad1848_info *devc = (ad1848_info *) audio_devs[dev]->devc;
2768
2769 if (current_interval == 0)
2770 return;
2771
2772 spin_lock_irqsave(&devc->lock,flags);
2773 ad_write(devc, 16, ad_read(devc, 16) | 0x40);
2774 devc->timer_running = 1;
2775 spin_unlock_irqrestore(&devc->lock,flags);
2776}
2777
2778static struct sound_lowlev_timer ad1848_tmr =
2779{
2780 0,
2781 2,
2782 ad1848_tmr_start,
2783 ad1848_tmr_disable,
2784 ad1848_tmr_restart
2785};
2786
2787static int ad1848_tmr_install(int dev)
2788{
2789 if (timer_installed != -1)
2790 return 0;
2791
2792 timer_installed = ad1848_tmr.dev = dev;
2793 sound_timer_init(&ad1848_tmr, audio_devs[dev]->name);
2794
2795 return 1;
2796}
2797#endif
2798
2799EXPORT_SYMBOL(ad1848_detect);
2800EXPORT_SYMBOL(ad1848_init);
2801EXPORT_SYMBOL(ad1848_unload);
2802EXPORT_SYMBOL(ad1848_control);
2803EXPORT_SYMBOL(probe_ms_sound);
2804EXPORT_SYMBOL(attach_ms_sound);
2805EXPORT_SYMBOL(unload_ms_sound);
2806
2807static int __initdata io = -1;
2808static int __initdata irq = -1;
2809static int __initdata dma = -1;
2810static int __initdata dma2 = -1;
2811static int __initdata type = 0;
2812
2813module_param(io, int, 0);
2814module_param(irq, int, 0);
2815module_param(dma, int, 0);
2816module_param(dma2, int, 0);
2817module_param(type, int, 0);
2818module_param(deskpro_xl, bool, 0);
2819module_param(deskpro_m, bool, 0);
2820module_param(soundpro, bool, 0);
2821
2822#ifdef CONFIG_PNP
2823module_param(isapnp, int, 0);
2824module_param(isapnpjump, int, 0);
2825module_param(reverse, bool, 0);
2826MODULE_PARM_DESC(isapnp, "When set to 0, Plug & Play support will be disabled");
2827MODULE_PARM_DESC(isapnpjump, "Jumps to a specific slot in the driver's PnP table. Use the source, Luke.");
2828MODULE_PARM_DESC(reverse, "When set to 1, will reverse ISAPnP search order");
2829
2830static struct pnp_dev *ad1848_dev = NULL;
2831
2832
2833static struct {
2834 char *name;
2835 unsigned short card_vendor, card_device,
2836 vendor, function;
2837 short mss_io, irq, dma, dma2;
2838 int type;
2839} ad1848_isapnp_list[] __initdata = {
2840 {"CMI 8330 SoundPRO",
2841 ISAPNP_VENDOR('C','M','I'), ISAPNP_DEVICE(0x0001),
2842 ISAPNP_VENDOR('@','@','@'), ISAPNP_FUNCTION(0x0001),
2843 0, 0, 0,-1, 0},
2844 {"CS4232 based card",
2845 ISAPNP_ANY_ID, ISAPNP_ANY_ID,
2846 ISAPNP_VENDOR('C','S','C'), ISAPNP_FUNCTION(0x0000),
2847 0, 0, 0, 1, 0},
2848 {"CS4232 based card",
2849 ISAPNP_ANY_ID, ISAPNP_ANY_ID,
2850 ISAPNP_VENDOR('C','S','C'), ISAPNP_FUNCTION(0x0100),
2851 0, 0, 0, 1, 0},
2852 {"OPL3-SA2 WSS mode",
2853 ISAPNP_ANY_ID, ISAPNP_ANY_ID,
2854 ISAPNP_VENDOR('Y','M','H'), ISAPNP_FUNCTION(0x0021),
2855 1, 0, 0, 1, 1},
2856 {"Advanced Gravis InterWave Audio",
2857 ISAPNP_VENDOR('G','R','V'), ISAPNP_DEVICE(0x0001),
2858 ISAPNP_VENDOR('G','R','V'), ISAPNP_FUNCTION(0x0000),
2859 0, 0, 0, 1, 0},
2860 {NULL}
2861};
2862
2863#ifdef MODULE
2864static struct isapnp_device_id id_table[] = {
2865 { ISAPNP_VENDOR('C','M','I'), ISAPNP_DEVICE(0x0001),
2866 ISAPNP_VENDOR('@','@','@'), ISAPNP_FUNCTION(0x0001), 0 },
2867 { ISAPNP_ANY_ID, ISAPNP_ANY_ID,
2868 ISAPNP_VENDOR('C','S','C'), ISAPNP_FUNCTION(0x0000), 0 },
2869 { ISAPNP_ANY_ID, ISAPNP_ANY_ID,
2870 ISAPNP_VENDOR('C','S','C'), ISAPNP_FUNCTION(0x0100), 0 },
2871
2872
2873
2874
2875 { ISAPNP_VENDOR('G','R','V'), ISAPNP_DEVICE(0x0001),
2876 ISAPNP_VENDOR('G','R','V'), ISAPNP_FUNCTION(0x0000), 0 },
2877 {0}
2878};
2879
2880MODULE_DEVICE_TABLE(isapnp, id_table);
2881#endif
2882
2883static struct pnp_dev *activate_dev(char *devname, char *resname, struct pnp_dev *dev)
2884{
2885 int err;
2886
2887 err = pnp_device_attach(dev);
2888 if (err < 0)
2889 return(NULL);
2890
2891 if((err = pnp_activate_dev(dev)) < 0) {
2892 printk(KERN_ERR "ad1848: %s %s config failed (out of resources?)[%d]\n", devname, resname, err);
2893
2894 pnp_device_detach(dev);
2895
2896 return(NULL);
2897 }
2898 audio_activated = 1;
2899 return(dev);
2900}
2901
2902static struct pnp_dev __init *ad1848_init_generic(struct pnp_card *bus,
2903 struct address_info *hw_config, int slot)
2904{
2905
2906
2907 if((ad1848_dev = pnp_find_dev(bus, ad1848_isapnp_list[slot].vendor, ad1848_isapnp_list[slot].function, NULL)))
2908 {
2909 if((ad1848_dev = activate_dev(ad1848_isapnp_list[slot].name, "ad1848", ad1848_dev)))
2910 {
2911 hw_config->io_base = pnp_port_start(ad1848_dev, ad1848_isapnp_list[slot].mss_io);
2912 hw_config->irq = pnp_irq(ad1848_dev, ad1848_isapnp_list[slot].irq);
2913 hw_config->dma = pnp_dma(ad1848_dev, ad1848_isapnp_list[slot].dma);
2914 if(ad1848_isapnp_list[slot].dma2 != -1)
2915 hw_config->dma2 = pnp_dma(ad1848_dev, ad1848_isapnp_list[slot].dma2);
2916 else
2917 hw_config->dma2 = -1;
2918 hw_config->card_subtype = ad1848_isapnp_list[slot].type;
2919 } else
2920 return(NULL);
2921 } else
2922 return(NULL);
2923
2924 return(ad1848_dev);
2925}
2926
2927static int __init ad1848_isapnp_init(struct address_info *hw_config, struct pnp_card *bus, int slot)
2928{
2929 char *busname = bus->name[0] ? bus->name : ad1848_isapnp_list[slot].name;
2930
2931
2932
2933 if(ad1848_init_generic(bus, hw_config, slot)) {
2934
2935
2936 printk(KERN_NOTICE "ad1848: PnP reports '%s' at i/o %#x, irq %d, dma %d, %d\n",
2937 busname,
2938 hw_config->io_base, hw_config->irq, hw_config->dma,
2939 hw_config->dma2);
2940 return 1;
2941 }
2942 return 0;
2943}
2944
2945static int __init ad1848_isapnp_probe(struct address_info *hw_config)
2946{
2947 static int first = 1;
2948 int i;
2949
2950
2951 for (i = 0; ad1848_isapnp_list[i].card_vendor != 0; i++);
2952 i--;
2953
2954
2955 if( isapnpjump < 0 || isapnpjump > i) {
2956 isapnpjump = reverse ? i : 0;
2957 printk(KERN_ERR "ad1848: Valid range for isapnpjump is 0-%d. Adjusted to %d.\n", i, isapnpjump);
2958 }
2959
2960 if(!first || !reverse)
2961 i = isapnpjump;
2962 first = 0;
2963 while(ad1848_isapnp_list[i].card_vendor != 0) {
2964 static struct pnp_card *bus = NULL;
2965
2966 while ((bus = pnp_find_card(
2967 ad1848_isapnp_list[i].card_vendor,
2968 ad1848_isapnp_list[i].card_device,
2969 bus))) {
2970
2971 if(ad1848_isapnp_init(hw_config, bus, i)) {
2972 isapnpjump = i;
2973 return 0;
2974 }
2975 }
2976 i += reverse ? -1 : 1;
2977 }
2978
2979 return -ENODEV;
2980}
2981#endif
2982
2983
2984static int __init init_ad1848(void)
2985{
2986 printk(KERN_INFO "ad1848/cs4248 codec driver Copyright (C) by Hannu Savolainen 1993-1996\n");
2987
2988#ifdef CONFIG_PNP
2989 if(isapnp && (ad1848_isapnp_probe(&cfg) < 0) ) {
2990 printk(KERN_NOTICE "ad1848: No ISAPnP cards found, trying standard ones...\n");
2991 isapnp = 0;
2992 }
2993#endif
2994
2995 if(io != -1) {
2996 struct resource *ports;
2997 if( isapnp == 0 )
2998 {
2999 if(irq == -1 || dma == -1) {
3000 printk(KERN_WARNING "ad1848: must give I/O , IRQ and DMA.\n");
3001 return -EINVAL;
3002 }
3003
3004 cfg.irq = irq;
3005 cfg.io_base = io;
3006 cfg.dma = dma;
3007 cfg.dma2 = dma2;
3008 cfg.card_subtype = type;
3009 }
3010
3011 ports = request_region(io + 4, 4, "ad1848");
3012
3013 if (!ports)
3014 return -EBUSY;
3015
3016 if (!request_region(io, 4, "WSS config")) {
3017 release_region(io + 4, 4);
3018 return -EBUSY;
3019 }
3020
3021 if (!probe_ms_sound(&cfg, ports)) {
3022 release_region(io + 4, 4);
3023 release_region(io, 4);
3024 return -ENODEV;
3025 }
3026 attach_ms_sound(&cfg, ports, THIS_MODULE);
3027 loaded = 1;
3028 }
3029 return 0;
3030}
3031
3032static void __exit cleanup_ad1848(void)
3033{
3034 if(loaded)
3035 unload_ms_sound(&cfg);
3036
3037#ifdef CONFIG_PNP
3038 if(ad1848_dev){
3039 if(audio_activated)
3040 pnp_device_detach(ad1848_dev);
3041 }
3042#endif
3043}
3044
3045module_init(init_ad1848);
3046module_exit(cleanup_ad1848);
3047
3048#ifndef MODULE
3049static int __init setup_ad1848(char *str)
3050{
3051
3052 int ints[6];
3053
3054 str = get_options(str, ARRAY_SIZE(ints), ints);
3055
3056 io = ints[1];
3057 irq = ints[2];
3058 dma = ints[3];
3059 dma2 = ints[4];
3060 type = ints[5];
3061
3062 return 1;
3063}
3064
3065__setup("ad1848=", setup_ad1848);
3066#endif
3067MODULE_LICENSE("GPL");
3068