2
* Purpose: Driver for CMEDIA CM8738 PCI audio controller.
6
* This file is part of Open Sound System.
8
* Copyright (C) 4Front Technologies 1996-2008.
10
* This this source file is released under GPL v2 license (no other versions).
11
* See the COPYING file included in the main directory of this source
12
* distribution for the license terms and conditions.
16
#include "oss_cmpci_cfg.h"
20
#define CMEDIA_VENDOR_ID 0x13F6
21
#define CMEDIA_CM8738 0x0111
22
#define CMEDIA_CM8338A 0x0100
23
#define CMEDIA_CM8338B 0x0101
25
* CM8338 registers definition
28
#define FUNCTRL0 (devc->base+0x00)
29
#define FUNCTRL1 (devc->base+0x04)
30
#define CHFORMAT (devc->base+0x08)
31
#define INT_HLDCLR (devc->base+0x0C)
32
#define INT_STATUS (devc->base+0x10)
33
#define LEGACY_CTRL (devc->base+0x14)
34
#define MISC_CTRL (devc->base+0x18)
35
#define TDMA_POS (devc->base+0x1C)
36
#define MIXER (devc->base+0x20)
37
#define MIXER_DATA (devc->base+0x22)
38
#define MIXER_ADDR (devc->base+0x23)
39
#define MIXER1 (devc->base+0x24)
40
#define MIXER2 (devc->base+0x25)
41
#define AUX_VOL (devc->base+0x26)
42
#define MIXER3 (devc->base+0x27)
43
#define AC97 (devc->base+0x28)
45
#define CH0_FRAME1 (devc->base+0x80)
46
#define CH0_FRAME2 (devc->base+0x84)
47
#define CH1_FRAME1 (devc->base+0x88)
48
#define CH1_FRAME2 (devc->base+0x8C)
50
#define SPDIF_STAT (devc->base+0x90)
51
#define MISC2_CTRL (devc->base+0x92)
53
#define MPU_MIRROR (devc->base+0x40)
54
#define FM_MIRROR (devc->base+0x50)
55
#define JOY_MIRROR (devc->base+0x60)
57
#define DSP_MIX_DATARESETIDX (0x00)
58
#define DSP_MIX_OUTMIXIDX (0x3c)
59
#define CM_CH0_ENABLE 0x01
60
#define CM_CH1_ENABLE 0x02
61
#define CM_CH0_RESET 0x04
62
#define CM_CH1_RESET 0x08
63
#define CM_CH0_RECORD 0x01
64
#define CM_CH1_RECORD 0x02
65
#define CM_CH0_PLAY ~0x01
66
#define CM_CH1_PLAY ~0x02
69
#define CM_EXTENT_CODEC 0x100
70
#define CM_EXTENT_MIDI 0x2
71
#define CM_EXTENT_SYNTH 0x4
72
#define CM_CFMT_STEREO 0x01
73
#define CM_CFMT_16BIT 0x02
74
#define CM_CFMT_MASK 0x03
75
#define CM_CFMT_DACSHIFT 0
76
#define CM_CFMT_ADCSHIFT 2
113
5512, (0 + 5512) / 2, (5512 + 8000) / 2, 0}
116
8000, (5512 + 8000) / 2, (8000 + 11025) / 2, 4}
119
11025, (8000 + 11025) / 2, (11025 + 16000) / 2, 1}
122
16000, (11025 + 16000) / 2, (16000 + 22050) / 2, 5}
125
22050, (16000 + 22050) / 2, (22050 + 32000) / 2, 2}
128
32000, (22050 + 32000) / 2, (32000 + 44100) / 2, 6}
131
44100, (32000 + 44100) / 2, (44100 + 48000) / 2, 3}
134
48000, (48000 + 44100) / 2, (48000 + 96000) / 2, 7}
137
static unsigned char cmpci_recmasks_L[SOUND_MIXER_NRDEVICES] = {
138
0x00, /* SOUND_MIXER_VOLUME */
139
0x00, /* SOUND_MIXER_BASS */
140
0x00, /* SOUND_MIXER_TREBLE */
141
0x40, /* SOUND_MIXER_SYNTH */
142
0x00, /* SOUND_MIXER_PCM */
143
0x00, /* SOUND_MIXER_SPEAKER */
144
0x10, /* SOUND_MIXER_LINE */
145
0x01, /* SOUND_MIXER_MIC */
146
0x04, /* SOUND_MIXER_CD */
147
0x00, /* SOUND_MIXER_IMIX */
148
0x00, /* SOUND_MIXER_LINE1 */
149
0x00, /* SOUND_MIXER_RECLEV */
150
0x00, /* SOUND_MIXER_IGAIN */
151
0x00 /* SOUND_MIXER_OGAIN */
154
static unsigned char cmpci_recmasks_R[SOUND_MIXER_NRDEVICES] = {
155
0x00, /* SOUND_MIXER_VOLUME */
156
0x00, /* SOUND_MIXER_BASS */
157
0x00, /* SOUND_MIXER_TREBLE */
158
0x20, /* SOUND_MIXER_SYNTH */
159
0x00, /* SOUND_MIXER_PCM */
160
0x00, /* SOUND_MIXER_SPEAKER */
161
0x08, /* SOUND_MIXER_LINE */
162
0x01, /* SOUND_MIXER_MIC */
163
0x02, /* SOUND_MIXER_CD */
164
0x00, /* SOUND_MIXER_IMIX */
165
0x00, /* SOUND_MIXER_LINE1 */
166
0x00, /* SOUND_MIXER_RECLEV */
167
0x00, /* SOUND_MIXER_IGAIN */
168
0x00 /* SOUND_MIXER_OGAIN */
171
#define CMEDIA_RECORDING_DEVICES (SOUND_MASK_SYNTH | SOUND_MASK_LINE | \
172
SOUND_MASK_MIC | SOUND_MASK_CD | SOUND_MASK_LINE1)
174
#define CMEDIA_MIXER_DEVICES (SOUND_MASK_SYNTH | SOUND_MASK_PCM | \
175
SOUND_MASK_LINE | SOUND_MASK_MIC | \
176
SOUND_MASK_IGAIN | SOUND_MASK_CD | \
177
SOUND_MASK_VOLUME | SOUND_MASK_SPEAKER |\
178
SOUND_MASK_LINE1|SOUND_MASK_RECLEV)
183
* Mixer registers of CMPCI
185
#define CMPCI_IMASK_L 0x3d
186
#define CMPCI_IMASK_R 0x3e
189
int default_levels[32] = {
190
0x5a5a, /* Master Volume */
195
0x4b4b, /* PC Speaker */
196
0x4b4b, /* Ext Line */
199
0x0000, /* Recording monitor */
201
0x4b4b, /* Recording level */
202
0x4b4b, /* Input gain */
203
0x4b4b, /* Output gain */
209
typedef struct cmpci_portc
211
int speed, bits, channels;
217
int chan0_play, chan0_rec;
218
int chan1_play, chan1_rec;
224
typedef struct cmpci_devc
227
oss_native_word base;
231
volatile unsigned char intr_mask;
234
#define MDL_CM8338A 2
235
#define MDL_CM8338B 3
241
#define DEFAULT_MODE 1
242
#define DUALDAC_MODE 2
243
#define SPDIFIN_MODE 4
244
unsigned char spdif_control_bits[24];
245
/* Audio parameters */
247
oss_mutex_t low_mutex;
249
int audio_initialized;
250
cmpci_portc portc[MAX_PORTC];
252
/* spdif/ac3 stuff */
256
/* Mixer parameters */
262
int uart401_attached;
263
uart401_devc uart401devc;
269
set_spdif_rate (cmpci_devc * devc, cmpci_portc * portc)
271
if (portc->speed == 48000)
273
/* setup MISC control reg */
274
OUTL (devc->osdev, INL (devc->osdev, MISC_CTRL) | (1 << 24) | (1 << 15),
279
OUTL (devc->osdev, INL (devc->osdev, MISC_CTRL) & ~(1 << 15),
281
OUTL (devc->osdev, INL (devc->osdev, MISC_CTRL) & ~(1 << 24),
287
setup_ac3 (cmpci_devc * devc, cmpci_portc * portc, int value)
289
if (value && (portc->speed == 48000 || portc->speed == 44100))
291
if (devc->chiprev == 37)
293
OUTL (devc->osdev, INL (devc->osdev, CHFORMAT) | (1 << 20),
299
OUTL (devc->osdev, INL (devc->osdev, MISC_CTRL) | (1 << 18),
305
if (devc->chiprev == 37)
307
OUTL (devc->osdev, INL (devc->osdev, CHFORMAT) & ~(1 << 20),
313
OUTL (devc->osdev, INL (devc->osdev, MISC_CTRL) & ~(1 << 18),
321
cmpci_setmixer (cmpci_devc * devc, unsigned int port, unsigned int value)
323
oss_native_word flags;
324
MUTEX_ENTER_IRQDISABLE (devc->low_mutex, flags);
325
OUTB (devc->osdev, (unsigned char) (port & 0xff), MIXER_ADDR);
327
OUTB (devc->osdev, (unsigned char) (value & 0xff), MIXER_DATA);
328
MUTEX_EXIT_IRQRESTORE (devc->low_mutex, flags);
333
cmpci_getmixer (cmpci_devc * devc, unsigned int port)
337
oss_native_word flags;
338
MUTEX_ENTER_IRQDISABLE (devc->low_mutex, flags);
339
OUTB (devc->osdev, (unsigned char) (port & 0xff), MIXER_ADDR);
343
val = INB (devc->osdev, MIXER_DATA);
344
MUTEX_EXIT_IRQRESTORE (devc->low_mutex, flags);
351
unsigned int regno:8;
352
unsigned int bitoffs:4;
353
unsigned int nbits:4;
356
typedef struct mixer_def mixer_tab[32][2];
357
typedef struct mixer_def mixer_ent;
359
#define MIX_ENT(name, reg_l, bit_l, len_l, reg_r, bit_r, len_r) \
360
{{reg_l, bit_l, len_l}, {reg_r, bit_r, len_r}}
362
static mixer_tab cmpci_mix = {
363
MIX_ENT (SOUND_MIXER_VOLUME, 0x30, 7, 5, 0x31, 7, 5),
364
MIX_ENT (SOUND_MIXER_BASS, 0x46, 7, 4, 0x47, 7, 4),
365
MIX_ENT (SOUND_MIXER_TREBLE, 0x44, 7, 4, 0x45, 7, 4),
366
MIX_ENT (SOUND_MIXER_SYNTH, 0x34, 7, 5, 0x35, 7, 5),
367
MIX_ENT (SOUND_MIXER_PCM, 0x32, 7, 5, 0x33, 7, 5),
368
MIX_ENT (SOUND_MIXER_SPEAKER, 0x3b, 7, 2, 0x00, 0, 0),
369
MIX_ENT (SOUND_MIXER_LINE, 0x38, 7, 5, 0x39, 7, 5),
370
MIX_ENT (SOUND_MIXER_MIC, 0x3a, 7, 5, 0x00, 0, 0),
371
MIX_ENT (SOUND_MIXER_CD, 0x36, 7, 5, 0x37, 7, 5),
372
MIX_ENT (SOUND_MIXER_IMIX, 0x3c, 0, 1, 0x00, 0, 0),
373
MIX_ENT (SOUND_MIXER_LINE1, 0, 0, 0, 0, 0, 0),
374
MIX_ENT (SOUND_MIXER_RECLEV, 0x3f, 7, 2, 0x40, 7, 2),
375
MIX_ENT (SOUND_MIXER_IGAIN, 0x3f, 7, 2, 0x40, 7, 2),
376
MIX_ENT (SOUND_MIXER_OGAIN, 0x41, 7, 2, 0x42, 7, 2)
381
change_bits (cmpci_devc * devc, unsigned char *regval, int dev, int chn,
387
mask = (1 << cmpci_mix[dev][chn].nbits) - 1;
388
newval = (int) ((newval * mask) + 50) / 100; /* Scale */
390
shift = cmpci_mix[dev][chn].bitoffs - cmpci_mix[dev][LEFT_CHN].nbits + 1;
392
*regval &= ~(mask << shift); /* Mask out previous value */
393
*regval |= (newval & mask) << shift; /* Set the new value */
396
static int set_recmask (int dev, int mask);
399
cmpci_mixer_set (cmpci_devc * devc, int chan, int value)
401
int left = value & 0x000000ff;
402
int right = (value & 0x0000ff00) >> 8;
415
if (!(CMEDIA_MIXER_DEVICES & (1 << chan))) /*
420
regoffs = cmpci_mix[chan][LEFT_CHN].regno;
425
val = cmpci_getmixer (devc, regoffs);
426
change_bits (devc, &val, chan, LEFT_CHN, left);
428
devc->levels[chan] = left | (left << 8);
430
if (cmpci_mix[chan][RIGHT_CHN].regno != regoffs) /*
434
cmpci_setmixer (devc, regoffs, val); /*
437
regoffs = cmpci_mix[chan][RIGHT_CHN].regno;
440
return left | (left << 8); /*
441
* Just left channel present
444
val = cmpci_getmixer (devc, regoffs); /*
449
change_bits (devc, &val, chan, RIGHT_CHN, right);
451
cmpci_setmixer (devc, regoffs, val);
453
devc->levels[chan] = left | (right << 8);
454
return left | (right << 8);
457
static int cmpci_outsw (int dev, int ctrl, unsigned int cmd, int value);
461
cmpci_mixer_ioctl (int dev, int audiodev, unsigned int cmd, ioctl_arg arg)
463
cmpci_devc *devc = mixer_devs[dev]->devc;
466
if (((cmd >> 8) & 0xff) == 'M')
468
if (IOC_IS_OUTPUT (cmd))
471
case SOUND_MIXER_RECSRC:
473
if (val == SOUND_MASK_LINE1)
474
*arg = cmpci_outsw (dev, AUX_REC, SNDCTL_MIX_WRITE, 1);
476
*arg = cmpci_outsw (dev, AUX_REC, SNDCTL_MIX_WRITE, 0);
477
return *arg = set_recmask (dev, val);
480
case SOUND_MIXER_LINE1:
482
return *arg = cmpci_outsw (dev, AUX_LEVEL, SNDCTL_MIX_WRITE, val);
487
return *arg = cmpci_mixer_set (devc, cmd & 0xff, val);
493
case SOUND_MIXER_RECSRC:
494
return *arg = devc->recmask;
497
case SOUND_MIXER_DEVMASK:
498
return *arg = CMEDIA_MIXER_DEVICES;
501
case SOUND_MIXER_STEREODEVS:
502
return *arg = CMEDIA_MIXER_DEVICES &
503
~(SOUND_MASK_MIC | SOUND_MASK_SPEAKER | SOUND_MASK_IMIX);
506
case SOUND_MIXER_RECMASK:
507
return *arg = CMEDIA_RECORDING_DEVICES;
510
case SOUND_MIXER_LINE1:
511
val = cmpci_outsw (dev, AUX_LEVEL, SNDCTL_MIX_READ, 0);
515
case SOUND_MIXER_CAPS:
516
return *arg = SOUND_CAP_EXCL_INPUT;
520
return *arg = devc->levels[cmd & 0x1f];
528
set_recmask (int dev, int mask)
530
cmpci_devc *devc = mixer_devs[dev]->devc;
531
int devmask = mask & CMEDIA_RECORDING_DEVICES;
533
unsigned char regimageL, regimageR;
536
devmask = SOUND_MASK_MIC;
538
regimageL = regimageR = 0;
539
for (i = 0; i < SOUND_MIXER_NRDEVICES; i++)
540
if ((1 << i) & devmask)
542
regimageL |= cmpci_recmasks_L[i];
543
regimageR |= cmpci_recmasks_R[i];
545
cmpci_setmixer (devc, CMPCI_IMASK_L, regimageL);
546
cmpci_setmixer (devc, CMPCI_IMASK_R, regimageR);
547
devc->recmask = devmask;
548
return devc->recmask;
552
cmpci_outsw (int dev, int ctrl, unsigned int cmd, int value)
555
* Access function for CMPCI mixer extension bits
557
cmpci_devc *devc = mixer_devs[dev]->devc;
558
int left, right, tmp;
560
if (cmd == SNDCTL_MIX_READ)
565
case MUTE_LINE: /* Left line in to output connection */
566
value = (cmpci_getmixer (devc, 0x3c) & 0x18) ? 0 : 1;
569
case MUTE_CD: /* Cd in to output connection */
570
value = (cmpci_getmixer (devc, 0x3c) & 0x06) ? 0 : 1;
573
case MUTE_MIC: /* Mic in to output connection */
574
value = (cmpci_getmixer (devc, 0x3c) & 0x01) ? 0 : 1;
577
case MODE_4SPK: /* 4Speaker out */
578
value = INL (devc->osdev, MISC_CTRL) & (1 << 26) ? 1 : 0;
581
case DUALDAC: /* dual dac */
582
value = devc->dev_mode & DUALDAC_MODE ? 1 : 0;
585
case REAR2LINE: /* rear to line in */
586
value = INB (devc->osdev, MIXER1) & (1 << 5) ? 1 : 0;
589
case CEN2LINE: /* center to line in */
590
value = INL (devc->osdev, LEGACY_CTRL) & (1 << 14) ? 1 : 0;
593
case BASS2LINE: /* basss to line in */
594
value = INL (devc->osdev, LEGACY_CTRL) & (1 << 13) ? 1 : 0;
597
case SPDIF_PLAY: /* spdif out */
598
value = INL (devc->osdev, LEGACY_CTRL) & (1 << 23) ? 1 : 0;
601
case SPDIF_LOOP: /* S/PDIF I/O Loop */
602
value = (INL (devc->osdev, FUNCTRL1) & (1 << 7)) ? 1 : 0;
605
case SPDIF_REC: /* spdif record mode */
606
value = devc->dev_mode & SPDIFIN_MODE ? 1 : 0;
609
case SPDIF_IMON: /* spdif input monitor */
610
value = INB (devc->osdev, MIXER1) & 0x1 ? 1 : 0;
613
case SPDIF_POL: /* spdif input reverse */
614
if (devc->chiprev < 39)
615
value = INB (devc->osdev, MIXER3) & 0x06 ? 1 : 0;
617
value = INL (devc->osdev, CHFORMAT) & 0x80 ? 1 : 0;
620
case SPDIF_AC3: /* ac3 */
621
value = INL (devc->osdev, MISC_CTRL) & (1 << 18) ? 1 : 0;
624
case SPDIF_COPY: /* copy protect (indirect) */
625
value = INL (devc->osdev, LEGACY_CTRL) & (1 << 22) ? 1 : 0;
628
case SPDIF_OPT: /* Coax/Optical Select */
629
value = INL (devc->osdev, MISC_CTRL) & (1 << 25) ? 1 : 0;
632
case CEN2MIC: /* Center2MIC */
633
if (devc->chiprev >= 39)
634
value = INB (devc->osdev, MIXER3) & 0x4 ? 1 : 0;
637
case MICBOOST: /* MIC Boost */
638
value = INB (devc->osdev, MIXER2) & 0x1 ? 0 : 1;
642
value = devc->levels[SOUND_MIXER_LINE1];
645
case AUX_REC: /* set LINE1 as rec source - handled by set_recmask */
648
case MUTE_AUX: /* AUX mute */
649
value = INB (devc->osdev, MIXER2) & 0x30 ? 0 : 1;
659
if (cmd == SNDCTL_MIX_WRITE)
663
case MUTE_LINE: /* L/R line in to output connection */
665
cmpci_setmixer (devc, 0x3c, cmpci_getmixer (devc, 0x3c) | 0x18);
667
cmpci_setmixer (devc, 0x3c, cmpci_getmixer (devc, 0x3c) & ~0x18);
670
case MUTE_CD: /* Cd in to output connection */
672
cmpci_setmixer (devc, 0x3c, cmpci_getmixer (devc, 0x3c) | 0x06);
674
cmpci_setmixer (devc, 0x3c, cmpci_getmixer (devc, 0x3c) & ~0x06);
677
case MUTE_MIC: /* Mic in to output connection */
679
cmpci_setmixer (devc, 0x3c, cmpci_getmixer (devc, 0x3c) | 0x01);
681
cmpci_setmixer (devc, 0x3c, cmpci_getmixer (devc, 0x3c) & ~0x01);
684
case MODE_4SPK: /* 4Speaker out */
687
OUTL (devc->osdev, INL (devc->osdev, MISC_CTRL) | (1 << 26),
692
OUTL (devc->osdev, INL (devc->osdev, MISC_CTRL) & ~(1 << 26),
697
case DUALDAC: /* DUAL DAC mode */
700
OUTL (devc->osdev, INL (devc->osdev, MISC_CTRL) | (1 << 23),
702
/* Disable 4Speaker mode */
703
OUTL (devc->osdev, INL (devc->osdev, MISC_CTRL) & ~(1 << 26),
705
devc->dev_mode = DUALDAC_MODE;
709
OUTL (devc->osdev, INL (devc->osdev, MISC_CTRL) & ~(1 << 23),
712
/* enable back the 4Speaker mode */
713
OUTL (devc->osdev, INL (devc->osdev, MISC_CTRL) | 1 << 26,
716
devc->dev_mode = DEFAULT_MODE;
720
case REAR2LINE: /* REAR TO LINEIN */
723
OUTB (devc->osdev, (INB (devc->osdev, MIXER1) | (1 << 5)),
727
OUTB (devc->osdev, (INB (devc->osdev, MIXER1) & ~(1 << 5)),
731
case CEN2LINE: /* CENTER TO LINEIN */
734
OUTL (devc->osdev, INL (devc->osdev, LEGACY_CTRL) | (1 << 14),
738
OUTL (devc->osdev, INL (devc->osdev, LEGACY_CTRL) & ~(1 << 14),
742
case BASS2LINE: /* BASS TO LINEIN */
745
OUTL (devc->osdev, INL (devc->osdev, LEGACY_CTRL) | (1 << 13),
749
OUTL (devc->osdev, INL (devc->osdev, LEGACY_CTRL) & ~(1 << 13),
753
case SPDIF_PLAY: /* SPDIF ENABLE */
756
OUTL (devc->osdev, INL (devc->osdev, LEGACY_CTRL) | (1 << 23),
759
/* enable wave/fm/midi to spdif OUT DAC2SPDO on rev 33/37 */
760
if (devc->chiprev < 39)
761
OUTL (devc->osdev, INL (devc->osdev, LEGACY_CTRL) | (1 << 21),
763
devc->spdif_enabled = 1;
767
OUTL (devc->osdev, INL (devc->osdev, LEGACY_CTRL) & ~(1 << 23),
769
/* Disable wave/fm/midi to spdif OUT (DAC2SPDO) */
770
if (devc->chiprev < 39)
772
INL (devc->osdev, LEGACY_CTRL) & ~(1 << 21),
774
devc->spdif_enabled = 0;
778
case SPDIF_LOOP: /* S/PDIF I/O Loop */
781
OUTL (devc->osdev, INL (devc->osdev, FUNCTRL1) | (1 << 7),
785
OUTL (devc->osdev, INL (devc->osdev, FUNCTRL1) & ~(1 << 7),
789
case SPDIF_REC: /* SPDIF Record Mode */
792
devc->dev_mode = SPDIFIN_MODE;
795
devc->dev_mode = DEFAULT_MODE;
798
case SPDIF_IMON: /* spdif monitor */
801
OUTB (devc->osdev, INB (devc->osdev, MIXER1) | 0x0D, MIXER1);
804
OUTB (devc->osdev, INB (devc->osdev, MIXER1) & ~0xD, MIXER1);
807
case SPDIF_POL: /* spdif reverse */
810
if (devc->chiprev < 39)
812
OUTB (devc->osdev, INB (devc->osdev, MIXER3) | 0x06,
816
OUTL (devc->osdev, INL (devc->osdev, CHFORMAT) | 0x80,
821
if (devc->chiprev < 39)
823
OUTB (devc->osdev, INB (devc->osdev, MIXER3) & ~0x06,
827
OUTL (devc->osdev, INL (devc->osdev, CHFORMAT) & ~0x80,
832
case SPDIF_AC3: /* AC3 enabled on S/PDIF */
835
OUTL (devc->osdev, INL (devc->osdev, MISC_CTRL) | (1 << 18),
839
OUTL (devc->osdev, INL (devc->osdev, MISC_CTRL) & ~(1 << 18),
843
case SPDIF_COPY: /* Copy protect */
846
OUTL (devc->osdev, INL (devc->osdev, LEGACY_CTRL) | (1 << 22),
850
OUTL (devc->osdev, INL (devc->osdev, LEGACY_CTRL) & ~(1 << 22),
854
case SPDIF_OPT: /* Coax/Optical */
857
OUTL (devc->osdev, INL (devc->osdev, MISC_CTRL) | (1 << 25),
861
OUTL (devc->osdev, INL (devc->osdev, MISC_CTRL) & ~(1 << 25),
865
case CEN2MIC: /* Center -> Mic OUT */
868
if (devc->chiprev >= 39)
870
OUTB (devc->osdev, INB (devc->osdev, MIXER3) | 0x4, MIXER3);
873
else if (devc->chiprev >= 39)
875
OUTB (devc->osdev, INB (devc->osdev, MIXER3) & ~0x4, MIXER3);
879
case MICBOOST: /* Mic Boost */
882
OUTB (devc->osdev, INB (devc->osdev, MIXER2) | 0x1, MIXER2);
885
OUTB (devc->osdev, INB (devc->osdev, MIXER2) & ~0x1, MIXER2);
888
case AUX_LEVEL: /* Aux levels */
890
right = (value >> 8) & 0xff;
895
value = left | (right << 8);
896
left = mix_cvt[left];
897
right = mix_cvt[right];
899
tmp = ((right * ((1 << 4) - 1) / 100) << 4) |
900
(left * ((1 << 4) - 1) / 100);
902
OUTB (devc->osdev, tmp, AUX_VOL);
903
devc->levels[SOUND_MIXER_LINE1] = value;
906
case AUX_REC: /* line1 record select */
909
OUTB (devc->osdev, INB (devc->osdev, MIXER2) | 0xc0, MIXER2);
912
OUTB (devc->osdev, INB (devc->osdev, MIXER2) & ~0xc0, MIXER2);
915
case MUTE_AUX: /* line1 mute control */
918
OUTB (devc->osdev, INB (devc->osdev, MIXER2) | 0x30, MIXER2);
921
OUTB (devc->osdev, INB (devc->osdev, MIXER2) & ~0x30, MIXER2);
934
cmpci_mix_init (int dev)
938
if ((group = mixer_ext_create_group (dev, 0, "CMPCI_MUTECTL")) < 0)
942
mixer_ext_create_control (dev, group, MUTE_LINE, cmpci_outsw,
943
MIXT_ONOFF, "CMPCI_LINEMUTE", 1,
944
MIXF_READABLE | MIXF_WRITEABLE)) < 0)
948
mixer_ext_create_control (dev, group, MUTE_CD, cmpci_outsw, MIXT_ONOFF,
950
MIXF_READABLE | MIXF_WRITEABLE)) < 0)
954
mixer_ext_create_control (dev, group, MUTE_MIC, cmpci_outsw,
955
MIXT_ONOFF, "CMPCI_MICMUTE", 1,
956
MIXF_READABLE | MIXF_WRITEABLE)) < 0)
960
mixer_ext_create_control (dev, group, MUTE_AUX, cmpci_outsw,
961
MIXT_ONOFF, "CMPCI_LINE1MUTE", 1,
962
MIXF_READABLE | MIXF_WRITEABLE)) < 0)
965
if ((group = mixer_ext_create_group (dev, 0, "CMPCI_JACKCTL")) < 0)
968
mixer_ext_create_control (dev, group, REAR2LINE, cmpci_outsw,
969
MIXT_ONOFF, "CMPCI_REAR2LINE", 1,
970
MIXF_READABLE | MIXF_WRITEABLE)) < 0)
973
mixer_ext_create_control (dev, group, CEN2LINE, cmpci_outsw,
974
MIXT_ONOFF, "CMPCI_CEN2LINE", 1,
975
MIXF_READABLE | MIXF_WRITEABLE)) < 0)
978
mixer_ext_create_control (dev, group, BASS2LINE, cmpci_outsw,
979
MIXT_ONOFF, "CMPCI_BASS2LINE", 1,
980
MIXF_READABLE | MIXF_WRITEABLE)) < 0)
984
mixer_ext_create_control (dev, group, CEN2MIC, cmpci_outsw, MIXT_ONOFF,
986
MIXF_READABLE | MIXF_WRITEABLE)) < 0)
990
if ((group = mixer_ext_create_group (dev, 0, "CMPCI_MIXEXT")) < 0)
994
mixer_ext_create_control (dev, group, MODE_4SPK, cmpci_outsw,
995
MIXT_ENUM, "CMPCI_SPKMODE", 2,
996
MIXF_READABLE | MIXF_WRITEABLE)) < 0)
1000
mixer_ext_create_control (dev, group, DUALDAC, cmpci_outsw, MIXT_ONOFF,
1002
MIXF_READABLE | MIXF_WRITEABLE)) < 0)
1006
mixer_ext_create_control (dev, group, MICBOOST, cmpci_outsw,
1007
MIXT_ONOFF, "CMPCI_MICBOOST", 1,
1008
MIXF_READABLE | MIXF_WRITEABLE)) < 0)
1011
/* Create a new SPDIF group */
1012
if ((group = mixer_ext_create_group (dev, 0, "CMPCI_SPDIF")) < 0)
1016
mixer_ext_create_control (dev, group, SPDIF_PLAY, cmpci_outsw,
1017
MIXT_ONOFF, "CMPCI_Play", 1,
1018
MIXF_READABLE | MIXF_WRITEABLE)) < 0)
1022
mixer_ext_create_control (dev, group, SPDIF_LOOP, cmpci_outsw,
1023
MIXT_ONOFF, "CMPCI_LOOP", 1,
1024
MIXF_READABLE | MIXF_WRITEABLE)) < 0)
1027
/* Having this in mixer doesn't make any sense */
1029
mixer_ext_create_control (dev, group, SPDIF_REC, cmpci_outsw,
1030
MIXT_ONOFF, "CMPCI_RECORD", 1,
1031
MIXF_READABLE | MIXF_WRITEABLE)) < 0)
1035
mixer_ext_create_control (dev, group, SPDIF_IMON, cmpci_outsw,
1036
MIXT_ONOFF, "CMPCI_IMON", 1,
1037
MIXF_READABLE | MIXF_WRITEABLE)) < 0)
1041
mixer_ext_create_control (dev, group, SPDIF_POL, cmpci_outsw,
1042
MIXT_ONOFF, "CMPCI_POLREV", 1,
1043
MIXF_READABLE | MIXF_WRITEABLE)) < 0)
1047
/* Having this in mixer doesn't make any sense */
1049
mixer_ext_create_control (dev, group, SPDIF_AC3, cmpci_outsw,
1050
MIXT_ONOFF, "CMPCI_AC3", 1,
1051
MIXF_READABLE | MIXF_WRITEABLE)) < 0)
1056
mixer_ext_create_control (dev, group, SPDIF_COPY, cmpci_outsw,
1057
MIXT_ONOFF, "CMPCI_COPYPROT", 1,
1058
MIXF_READABLE | MIXF_WRITEABLE)) < 0)
1062
mixer_ext_create_control (dev, group, SPDIF_OPT, cmpci_outsw,
1063
MIXT_ONOFF, "CMPCI_OPTICAL", 1,
1064
MIXF_READABLE | MIXF_WRITEABLE)) < 0)
1071
cmpci_mixer_reset (int dev)
1074
cmpci_devc *devc = mixer_devs[dev]->devc;
1076
devc->levels = load_mixer_volumes ("CM8738_Mixer", default_levels, 1);
1079
for (i = 0; i < SOUND_MIXER_NRDEVICES; i++)
1080
cmpci_mixer_set (devc, i, devc->levels[i]);
1082
set_recmask (dev, SOUND_MASK_MIC);
1086
static mixer_driver_t cmpci_mixer_driver = {
1092
cmpciintr (oss_device_t * osdev)
1094
cmpci_devc *devc = (cmpci_devc *) osdev->devc;
1095
unsigned int intstat, intsrc;
1099
/* see if this is our interrupt */
1100
intsrc = INL (devc->osdev, INT_STATUS);
1101
if (intsrc & (CM_CH0_INT | CM_CH1_INT))
1103
/* Handle playback */
1106
intstat = INB (devc->osdev, INT_HLDCLR + 2);
1108
for (i = 0; i < MAX_PORTC; i++)
1110
cmpci_portc *portc = &devc->portc[i];
1112
if (intstat & CM_CH1_INT)
1114
/* do chan1 playback */
1115
if ((portc->chan1_play) &&
1116
(portc->trigger_bits & PCM_ENABLE_OUTPUT))
1118
OUTB (devc->osdev, intstat & ~CM_CH1_INT, INT_HLDCLR + 2);
1119
OUTB (devc->osdev, intstat | CM_CH1_INT, INT_HLDCLR + 2);
1120
oss_audio_outputintr (portc->audiodev, 0);
1123
/* do chan1 record */
1124
if ((portc->chan1_rec) &&
1125
(portc->trigger_bits & PCM_ENABLE_INPUT))
1127
OUTB (devc->osdev, intstat & ~CM_CH1_INT, INT_HLDCLR + 2);
1128
OUTB (devc->osdev, intstat | CM_CH1_INT, INT_HLDCLR + 2);
1129
oss_audio_inputintr (portc->audiodev, 0);
1133
if (intstat & CM_CH0_INT)
1135
/* do chan0 playback */
1136
if ((portc->chan0_play) &&
1137
(portc->trigger_bits & PCM_ENABLE_OUTPUT))
1139
OUTB (devc->osdev, intstat & ~CM_CH0_INT, INT_HLDCLR + 2);
1140
OUTB (devc->osdev, intstat | CM_CH0_INT, INT_HLDCLR + 2);
1141
oss_audio_outputintr (portc->audiodev, 0);
1144
/* do chan0 record */
1145
if ((portc->chan0_rec) &&
1146
(portc->trigger_bits & PCM_ENABLE_INPUT))
1148
OUTB (devc->osdev, intstat & ~CM_CH0_INT, INT_HLDCLR + 2);
1149
OUTB (devc->osdev, intstat | CM_CH0_INT, INT_HLDCLR + 2);
1150
oss_audio_inputintr (portc->audiodev, 0);
1156
if (intsrc & 0x10000)
1159
uart401_irq (&devc->uart401devc);
1166
cmpci_audio_set_rate (int dev, int arg)
1168
cmpci_portc *portc = audio_engines[dev]->portc;
1171
return portc->speed;
1178
return portc->speed;
1182
cmpci_audio_set_channels (int dev, short arg)
1184
cmpci_devc *devc = audio_engines[dev]->devc;
1185
cmpci_portc *portc = audio_engines[dev]->portc;
1187
if (devc->model == MDL_CM8768)
1192
if ((arg != 1) && (arg != 2) && (arg != 4) && (arg != 6) && (arg != 8))
1193
return portc->channels;
1200
if ((arg != 1) && (arg != 2) && (arg != 4) && (arg != 6))
1201
return portc->channels;
1203
portc->channels = arg;
1205
return portc->channels;
1209
cmpci_audio_set_format (int dev, unsigned int arg)
1211
cmpci_portc *portc = audio_engines[dev]->portc;
1216
if (!(arg & (AFMT_U8 | AFMT_S16_LE | AFMT_AC3)))
1225
cmpci_audio_ioctl (int dev, unsigned int cmd, ioctl_arg arg)
1230
static void cmpci_audio_trigger (int dev, int state);
1233
cmpci_audio_reset (int dev)
1235
cmpci_audio_trigger (dev, 0);
1239
cmpci_audio_reset_input (int dev)
1241
cmpci_portc *portc = audio_engines[dev]->portc;
1242
cmpci_audio_trigger (dev, portc->trigger_bits & ~PCM_ENABLE_INPUT);
1246
cmpci_audio_reset_output (int dev)
1248
cmpci_portc *portc = audio_engines[dev]->portc;
1249
cmpci_audio_trigger (dev, portc->trigger_bits & ~PCM_ENABLE_OUTPUT);
1254
cmpci_audio_open (int dev, int mode, int open_flags)
1256
cmpci_portc *portc = audio_engines[dev]->portc;
1257
cmpci_devc *devc = audio_engines[dev]->devc;
1258
oss_native_word flags;
1260
MUTEX_ENTER_IRQDISABLE (devc->mutex, flags);
1261
if (portc->open_mode)
1263
MUTEX_EXIT_IRQRESTORE (devc->mutex, flags);
1267
if (!(devc->dev_mode & DUALDAC_MODE))
1269
if (devc->open_mode & mode)
1271
MUTEX_EXIT_IRQRESTORE (devc->mutex, flags);
1275
devc->open_mode |= mode;
1277
portc->open_mode = mode;
1278
portc->audio_enabled &= ~mode;
1279
MUTEX_EXIT_IRQRESTORE (devc->mutex, flags);
1284
cmpci_audio_close (int dev, int mode)
1286
cmpci_portc *portc = audio_engines[dev]->portc;
1287
cmpci_devc *devc = audio_engines[dev]->devc;
1289
cmpci_audio_reset (dev);
1290
portc->open_mode = 0;
1291
devc->open_mode &= ~mode;
1292
portc->audio_enabled &= ~mode;
1294
if ((devc->spdif_enabled) || (devc->dev_mode & SPDIFIN_MODE))
1295
OUTL (devc->osdev, INL (devc->osdev, FUNCTRL1) & ~(1 << 9), FUNCTRL1);
1297
if (portc->chan0_play)
1298
portc->chan0_play = 0;
1300
if (portc->chan1_play)
1301
portc->chan1_play = 0;
1303
if (portc->chan0_rec)
1304
portc->chan0_rec = 0;
1306
if (portc->chan1_rec)
1307
portc->chan1_rec = 0;
1312
cmpci_audio_output_block (int dev, oss_native_word buf, int count,
1313
int fragsize, int intrflag)
1315
cmpci_portc *portc = audio_engines[dev]->portc;
1317
portc->audio_enabled |= PCM_ENABLE_OUTPUT;
1318
portc->trigger_bits &= ~PCM_ENABLE_OUTPUT;
1323
cmpci_audio_start_input (int dev, oss_native_word buf, int count,
1324
int fragsize, int intrflag)
1326
cmpci_portc *portc = audio_engines[dev]->portc;
1328
portc->audio_enabled |= PCM_ENABLE_INPUT;
1329
portc->trigger_bits &= ~PCM_ENABLE_INPUT;
1333
cmpci_audio_trigger (int dev, int state)
1335
cmpci_portc *portc = audio_engines[dev]->portc;
1336
cmpci_devc *devc = audio_engines[dev]->devc;
1337
oss_native_word flags;
1339
MUTEX_ENTER_IRQDISABLE (devc->mutex, flags);
1340
if (portc->open_mode & OPEN_WRITE)
1342
if (state & PCM_ENABLE_OUTPUT)
1344
if ((portc->audio_enabled & PCM_ENABLE_OUTPUT) &&
1345
!(portc->trigger_bits & PCM_ENABLE_OUTPUT))
1347
if (portc->chan0_play)
1349
/* enable the channel0 */
1351
INB (devc->osdev, FUNCTRL0 + 2) | CM_CH0_ENABLE,
1354
INB (devc->osdev, INT_HLDCLR + 2) | CM_CH0_INT,
1358
if (portc->chan1_play)
1360
/* enable the channel1 */
1362
INB (devc->osdev, FUNCTRL0 + 2) | CM_CH1_ENABLE,
1365
INB (devc->osdev, INT_HLDCLR + 2) | CM_CH1_INT,
1368
portc->trigger_bits |= PCM_ENABLE_OUTPUT;
1373
if ((portc->audio_enabled & PCM_ENABLE_OUTPUT) &&
1374
(portc->trigger_bits & PCM_ENABLE_OUTPUT))
1376
portc->audio_enabled &= ~PCM_ENABLE_OUTPUT;
1377
portc->trigger_bits &= ~PCM_ENABLE_OUTPUT;
1379
if (portc->chan0_play)
1381
/* disable interrupt */
1383
INB (devc->osdev, INT_HLDCLR + 2) & ~CM_CH0_INT,
1386
/* disable channel0 */
1388
INB (devc->osdev, FUNCTRL0 + 2) & ~CM_CH0_ENABLE,
1391
if (portc->chan1_play)
1393
/* disable interrupt */
1395
INB (devc->osdev, INT_HLDCLR + 2) & ~CM_CH1_INT,
1398
/* disable channel */
1400
INB (devc->osdev, FUNCTRL0 + 2) & ~CM_CH1_ENABLE,
1407
if (portc->open_mode & OPEN_READ)
1409
if (state & PCM_ENABLE_INPUT)
1411
if ((portc->audio_enabled & PCM_ENABLE_INPUT) &&
1412
!(portc->trigger_bits & PCM_ENABLE_INPUT))
1414
if (portc->chan1_rec)
1416
/* enable the channel1 */
1418
INB (devc->osdev, FUNCTRL0 + 2) | CM_CH1_ENABLE,
1421
INB (devc->osdev, INT_HLDCLR + 2) | CM_CH1_INT,
1424
if (portc->chan0_rec)
1426
/* enable the channel0 */
1428
INB (devc->osdev, FUNCTRL0 + 2) | CM_CH0_ENABLE,
1431
INB (devc->osdev, INT_HLDCLR + 2) | CM_CH0_INT,
1434
portc->trigger_bits |= PCM_ENABLE_INPUT;
1439
if ((portc->audio_enabled & PCM_ENABLE_INPUT) &&
1440
(portc->trigger_bits & PCM_ENABLE_INPUT))
1442
portc->trigger_bits &= ~PCM_ENABLE_INPUT;
1443
portc->audio_enabled &= ~PCM_ENABLE_INPUT;
1444
if (portc->chan1_rec)
1446
/* disable interrupt */
1448
INB (devc->osdev, INT_HLDCLR + 2) & ~CM_CH1_INT,
1451
/* disable channel 1 */
1453
INB (devc->osdev, FUNCTRL0 + 2) & ~CM_CH1_ENABLE,
1456
if (portc->chan0_rec)
1458
/* disable interrupt */
1460
INB (devc->osdev, INT_HLDCLR + 2) & ~CM_CH0_INT,
1463
/* disable channel 0 */
1465
INB (devc->osdev, FUNCTRL0 + 2) & ~CM_CH0_ENABLE,
1472
MUTEX_EXIT_IRQRESTORE (devc->mutex, flags);
1476
set_dac_rate (int dev, int chan_type)
1478
cmpci_devc *devc = audio_engines[dev]->devc;
1479
cmpci_portc *portc = audio_engines[dev]->portc;
1480
unsigned char freq = 4, val;
1482
int rate = portc->speed;
1489
for (i = 0; i < sizeof (rate_lookup) / sizeof (rate_lookup[0]); i++)
1491
if (rate > rate_lookup[i].lower && rate <= rate_lookup[i].upper)
1493
rate = rate_lookup[i].rate;
1494
freq = rate_lookup[i].freq;
1498
if (chan_type == CHAN0)
1500
val = INB (devc->osdev, FUNCTRL1 + 1) & ~0x1c;
1501
OUTB (devc->osdev, val | freq << 2, FUNCTRL1 + 1);
1505
val = INB (devc->osdev, FUNCTRL1 + 1) & ~0xe0;
1506
OUTB (devc->osdev, val | freq << 5, FUNCTRL1 + 1);
1508
if (devc->spdif_enabled)
1509
set_spdif_rate (devc, portc);
1513
set_dac_fmt (int dev, int chan_type)
1516
cmpci_devc *devc = audio_engines[dev]->devc;
1517
cmpci_portc *portc = audio_engines[dev]->portc;
1518
int channels = portc->channels;
1519
int bits = portc->bits;
1521
if (chan_type == CHAN0)
1523
/* Set the format on Channl 0 */
1524
val = INB (devc->osdev, CHFORMAT) & ~0x3;
1526
if ((channels == 1) && (bits == 8))
1528
OUTB (devc->osdev, 0x00 | val, CHFORMAT);
1532
if ((channels == 2) && (bits == 8))
1534
OUTB (devc->osdev, 0x01 | val, CHFORMAT);
1538
if ((channels == 1) && (bits == 16))
1540
OUTB (devc->osdev, 0x02 | val, CHFORMAT);
1544
if ((channels > 1) && (bits == 16))
1546
OUTB (devc->osdev, 0x03 | val, CHFORMAT);
1552
/* Set the format on Channel 1 */
1553
val = INB (devc->osdev, CHFORMAT) & ~0xC;
1555
if ((channels == 1) && (bits == 8))
1557
OUTB (devc->osdev, 0x00 | val, CHFORMAT);
1561
if ((channels == 2) && (bits == 8))
1563
OUTB (devc->osdev, 0x04 | val, CHFORMAT);
1567
if ((channels == 1) && (bits == 16))
1569
OUTB (devc->osdev, 0x08 | val, CHFORMAT);
1573
if ((channels > 1) && (bits == 16))
1575
OUTB (devc->osdev, 0x0C | val, CHFORMAT);
1583
set_adc_rate (int dev, int chan_type)
1585
cmpci_devc *devc = audio_engines[dev]->devc;
1586
cmpci_portc *portc = audio_engines[dev]->portc;
1587
unsigned char freq = 4, val;
1589
int rate = portc->speed;
1595
for (i = 0; i < sizeof (rate_lookup) / sizeof (rate_lookup[0]); i++)
1597
if (rate > rate_lookup[i].lower && rate <= rate_lookup[i].upper)
1599
rate = rate_lookup[i].rate;
1600
freq = rate_lookup[i].freq;
1604
if (chan_type == CHAN1)
1606
val = INB (devc->osdev, FUNCTRL1 + 1) & ~0xe0;
1607
OUTB (devc->osdev, val | freq << 5, FUNCTRL1 + 1);
1611
val = INB (devc->osdev, FUNCTRL1 + 1) & ~0x1c;
1612
OUTB (devc->osdev, val | freq << 2, FUNCTRL1 + 1);
1615
if (devc->dev_mode & SPDIFIN_MODE)
1616
set_spdif_rate (devc, portc);
1620
set_adc_fmt (int dev, int chan_type)
1623
cmpci_devc *devc = audio_engines[dev]->devc;
1624
cmpci_portc *portc = audio_engines[dev]->portc;
1625
int channels = portc->channels;
1626
int bits = portc->bits;
1628
if (chan_type == CHAN1)
1630
/* Set the format on Channel 1 */
1631
val = INB (devc->osdev, CHFORMAT) & ~0xC;
1633
if ((channels == 1) && (bits == 8))
1635
OUTB (devc->osdev, 0x00 | val, CHFORMAT);
1639
if ((channels == 2) && (bits == 8))
1641
OUTB (devc->osdev, 0x04 | val, CHFORMAT);
1645
if ((channels == 1) && (bits == 16))
1647
OUTB (devc->osdev, 0x08 | val, CHFORMAT);
1651
if ((channels > 1) && (bits == 16))
1653
OUTB (devc->osdev, 0x0C | val, CHFORMAT);
1659
/* Set the format on Channl 0 */
1660
val = INB (devc->osdev, CHFORMAT) & ~0x3;
1662
if ((channels == 1) && (bits == 8))
1664
OUTB (devc->osdev, 0x00 | val, CHFORMAT);
1668
if ((channels == 2) && (bits == 8))
1670
OUTB (devc->osdev, 0x01 | val, CHFORMAT);
1674
if ((channels == 1) && (bits == 16))
1676
OUTB (devc->osdev, 0x02 | val, CHFORMAT);
1680
if ((channels == 2) && (bits == 16))
1682
OUTB (devc->osdev, 0x03 | val, CHFORMAT);
1689
setup_record (int dev, int chan_type)
1691
cmpci_devc *devc = audio_engines[dev]->devc;
1692
cmpci_portc *portc = audio_engines[dev]->portc;
1693
dmap_t *dmap = audio_engines[dev]->dmap_in;
1695
if (chan_type == CHAN1) /* SPDIF Record can only occur on CHAN1 */
1697
/* reset and disable channel */
1699
INB (devc->osdev, FUNCTRL0 + 2) | CM_CH1_RESET, FUNCTRL0 + 2);
1702
INB (devc->osdev, FUNCTRL0 + 2) & ~CM_CH1_RESET, FUNCTRL0 + 2);
1704
cmpci_outsw (devc->mixer_dev, SPDIF_PLAY, SNDCTL_MIX_WRITE, 0);
1706
OUTL (devc->osdev, dmap->dmabuf_phys, CH1_FRAME1);
1707
OUTW (devc->osdev, (dmap->bytes_in_use >> portc->adcfmt) - 1,
1709
OUTW (devc->osdev, (dmap->fragment_size >> portc->adcfmt),
1712
/* set channel 1 to record mode */
1713
OUTB (devc->osdev, INB (devc->osdev, FUNCTRL0) | CM_CH1_RECORD,
1715
portc->chan1_rec = 1;
1717
/* setup SPDIF in on CHAN A */
1718
OUTL (devc->osdev, INL (devc->osdev, FUNCTRL1) | (1 << 9), FUNCTRL1);
1720
else /* Normal PCM record on Channel 0 */
1722
/* reset and disable channel */
1724
INB (devc->osdev, FUNCTRL0 + 2) | CM_CH0_RESET, FUNCTRL0 + 2);
1727
INB (devc->osdev, FUNCTRL0 + 2) & ~CM_CH0_RESET, FUNCTRL0 + 2);
1729
OUTL (devc->osdev, dmap->dmabuf_phys, CH0_FRAME1);
1730
OUTW (devc->osdev, (dmap->bytes_in_use >> portc->adcfmt) - 1,
1732
OUTW (devc->osdev, (dmap->fragment_size >> portc->adcfmt),
1735
/* set channel 0 to record mode */
1736
OUTB (devc->osdev, INB (devc->osdev, FUNCTRL0) | CM_CH0_RECORD,
1738
portc->chan0_rec = 1;
1744
cmpci_audio_prepare_for_input (int dev, int bsize, int bcount)
1746
cmpci_devc *devc = audio_engines[dev]->devc;
1747
cmpci_portc *portc = audio_engines[dev]->portc;
1748
oss_native_word flags;
1750
MUTEX_ENTER_IRQDISABLE (devc->mutex, flags);
1752
switch (devc->dev_mode)
1755
set_adc_rate (dev, CHAN0);
1756
set_adc_fmt (dev, CHAN0);
1757
setup_record (dev, CHAN0);
1761
cmn_err (CE_WARN, "Cannot record because DUALDAC mode is ON.\n");
1762
MUTEX_EXIT_IRQRESTORE (devc->mutex, flags);
1766
if (portc->speed < 44100)
1769
"Cannot record spdif at sampling rate less than 44.1Khz.\n");
1770
MUTEX_EXIT_IRQRESTORE (devc->mutex, flags);
1773
set_adc_rate (dev, CHAN1);
1774
set_adc_fmt (dev, CHAN1);
1775
setup_record (dev, CHAN1);
1778
portc->audio_enabled &= ~PCM_ENABLE_INPUT;
1779
portc->trigger_bits &= ~PCM_ENABLE_INPUT;
1780
MUTEX_EXIT_IRQRESTORE (devc->mutex, flags);
1785
setup_play (int dev, int chan_type)
1787
cmpci_devc *devc = audio_engines[dev]->devc;
1788
cmpci_portc *portc = audio_engines[dev]->portc;
1789
dmap_t *dmap = audio_engines[dev]->dmap_out;
1791
if (chan_type == CHAN0)
1795
INB (devc->osdev, FUNCTRL0 + 2) | CM_CH0_RESET, FUNCTRL0 + 2);
1798
INB (devc->osdev, FUNCTRL0 + 2) & ~CM_CH0_RESET, FUNCTRL0 + 2);
1801
/* Now set the buffer address/sizes */
1802
OUTL (devc->osdev, dmap->dmabuf_phys, CH0_FRAME1);
1803
OUTW (devc->osdev, (dmap->bytes_in_use >> portc->dacfmt) - 1,
1805
OUTW (devc->osdev, (dmap->fragment_size >> portc->dacfmt),
1808
/* set channel 0 to play mode */
1809
OUTB (devc->osdev, INB (devc->osdev, FUNCTRL0) & CM_CH0_PLAY, FUNCTRL0);
1810
portc->chan0_play = 1;
1812
/* setup spdif output on CHAN A , disable CHAN B spdif */
1813
if (devc->spdif_enabled)
1815
OUTL (devc->osdev, INL (devc->osdev, FUNCTRL1) | (1 << 8),
1817
OUTL (devc->osdev, INL (devc->osdev, FUNCTRL1) & ~(1 << 9),
1823
/* reset and disable channel */
1825
INB (devc->osdev, FUNCTRL0 + 2) | CM_CH1_RESET, FUNCTRL0 + 2);
1828
INB (devc->osdev, FUNCTRL0 + 2) & ~CM_CH1_RESET, FUNCTRL0 + 2);
1831
/* Handle 4/5/6 channel mode */
1832
if (portc->channels < 4)
1834
/* check if 4speaker mode is enabled from mixer or not */
1835
if (devc->mode_4spk)
1836
OUTL (devc->osdev, INL (devc->osdev, MISC_CTRL) & ~(1 << 26),
1839
/* disable 4channel mode on CHAN B */
1840
OUTL (devc->osdev, INL (devc->osdev, CHFORMAT) & ~(1 << 29),
1842
/* disable 5 channel mode on CHAN B */
1843
OUTL (devc->osdev, INL (devc->osdev, CHFORMAT) & ~(0x80000000),
1845
/* disable 6channel mode out CHAN B */
1846
OUTL (devc->osdev, INL (devc->osdev, LEGACY_CTRL) & ~(1 << 15),
1848
/* disable 8 channel decode on CHAN B - only for CMI8768 */
1849
if (devc->model == MDL_CM8768)
1850
OUTB (devc->osdev, INB (devc->osdev, MISC2_CTRL) & ~0x20,
1853
OUTL (devc->osdev, INL (devc->osdev, LEGACY_CTRL) & ~(0x80000000),
1857
if ((portc->channels == 4) && (devc->chiprev > 37))
1859
/* disable 4 speaker mode */
1860
OUTL (devc->osdev, INL (devc->osdev, MISC_CTRL) & ~(1 << 26),
1862
/* enable 4channel mode on CHAN B */
1863
OUTL (devc->osdev, INL (devc->osdev, CHFORMAT) | (1 << 29),
1866
/* disable 5 channel mode on CHAN B */
1867
OUTL (devc->osdev, INL (devc->osdev, CHFORMAT) & ~(0x80000000),
1869
/* disable 6channel mode out CHAN B */
1870
OUTL (devc->osdev, INL (devc->osdev, LEGACY_CTRL) & ~(1 << 15),
1872
/* disable center/bass channel */
1873
OUTL (devc->osdev, INL (devc->osdev, MISC_CTRL) & ~(1 << 7),
1876
OUTL (devc->osdev, INL (devc->osdev, LEGACY_CTRL) & ~(1 << 12),
1879
/* disable 8 channel decode on CHAN B - only for CMI8768 */
1880
if (devc->model == MDL_CM8768)
1881
OUTB (devc->osdev, INB (devc->osdev, MISC2_CTRL) & ~0x20,
1884
OUTL (devc->osdev, INL (devc->osdev, LEGACY_CTRL) & ~(0x80000000),
1888
if ((portc->channels == 6) && (devc->chiprev > 37))
1890
/* disable 4 speaker mode */
1891
OUTL (devc->osdev, INL (devc->osdev, MISC_CTRL) & ~(1 << 26),
1893
/* disable 4channel mode on CHAN B */
1894
OUTL (devc->osdev, INL (devc->osdev, CHFORMAT) & ~(1 << 29),
1897
/* enable center channel */
1898
OUTL (devc->osdev, INL (devc->osdev, MISC_CTRL) | (1 << 7),
1901
OUTL (devc->osdev, INL (devc->osdev, LEGACY_CTRL) | (1 << 12),
1903
/* enable 5 channel mode on CHAN B */
1904
OUTL (devc->osdev, INL (devc->osdev, CHFORMAT) | (0x80000000),
1906
/* enable 6 channel decode on CHAN B */
1907
OUTL (devc->osdev, INL (devc->osdev, LEGACY_CTRL) | (1 << 15),
1910
/* disable 8 channel decode on CHAN B - only for CMI8768 */
1911
if (devc->model == MDL_CM8768)
1912
OUTB (devc->osdev, INB (devc->osdev, MISC2_CTRL) & ~0x20,
1916
OUTL (devc->osdev, INL (devc->osdev, LEGACY_CTRL) | (0x80000000),
1920
if ((portc->channels == 8) && (devc->model == MDL_CM8768))
1922
/* disable 4 speaker mode */
1923
OUTL (devc->osdev, INL (devc->osdev, MISC_CTRL) & ~(1 << 26),
1925
/* disable 4channel mode on CHAN B */
1926
OUTL (devc->osdev, INL (devc->osdev, CHFORMAT) & ~(1 << 29),
1929
/* enable center channel */
1930
OUTL (devc->osdev, INL (devc->osdev, MISC_CTRL) | (1 << 7),
1932
/* enable bass channel */
1933
OUTL (devc->osdev, INL (devc->osdev, LEGACY_CTRL) | (1 << 12),
1935
/* disable 5 channel mode on CHAN B */
1936
OUTL (devc->osdev, INL (devc->osdev, CHFORMAT) & ~(0x80000000),
1938
/* disable 6 channel decode on CHAN B */
1939
OUTL (devc->osdev, INL (devc->osdev, LEGACY_CTRL) & ~(1 << 15),
1942
/* enable 8 channel decode on CHAN B */
1943
OUTB (devc->osdev, INB (devc->osdev, MISC2_CTRL) | 0x20,
1946
OUTL (devc->osdev, INL (devc->osdev, LEGACY_CTRL) | (0x80000000),
1950
/* Now set the buffer address/sizes */
1951
OUTL (devc->osdev, dmap->dmabuf_phys, CH1_FRAME1);
1952
OUTW (devc->osdev, (dmap->bytes_in_use >> portc->dacfmt) - 1,
1954
OUTW (devc->osdev, (dmap->fragment_size >> portc->dacfmt),
1958
/* set channel 1 to play mode */
1959
OUTB (devc->osdev, INB (devc->osdev, FUNCTRL0) & CM_CH1_PLAY, FUNCTRL0);
1960
portc->chan1_play = 1;
1962
/* setup spdif output on CHAN B , disable CHAN A spdif */
1963
if (devc->spdif_enabled)
1965
OUTL (devc->osdev, INL (devc->osdev, FUNCTRL1) | (1 << 9),
1967
OUTL (devc->osdev, INL (devc->osdev, FUNCTRL1) & ~(1 << 8),
1975
cmpci_audio_prepare_for_output (int dev, int bsize, int bcount)
1977
cmpci_devc *devc = audio_engines[dev]->devc;
1978
cmpci_portc *portc = audio_engines[dev]->portc;
1979
oss_native_word flags;
1981
MUTEX_ENTER_IRQDISABLE (devc->mutex, flags);
1983
if ((portc->bits == AFMT_AC3) && devc->can_ac3)
1986
portc->channels = 2;
1987
cmpci_outsw (devc->mixer_dev, SPDIF_PLAY, SNDCTL_MIX_WRITE, 1);
1988
setup_ac3 (devc, portc, 1);
1991
setup_ac3 (devc, portc, 0);
1993
switch (devc->dev_mode)
1997
set_dac_rate (dev, CHAN1);
1999
set_dac_fmt (dev, CHAN1);
2000
/* set buffer address/size and other setups */
2001
setup_play (dev, CHAN1);
2005
if (dev == devc->portc[0].audiodev)
2007
set_dac_rate (dev, CHAN1);
2008
set_dac_fmt (dev, CHAN1);
2009
setup_play (dev, CHAN1);
2010
setup_ac3 (devc, portc, 0);
2012
if (dev == devc->portc[1].audiodev)
2014
set_dac_rate (dev, CHAN0);
2015
set_dac_fmt (dev, CHAN0);
2016
setup_play (dev, CHAN0);
2017
setup_ac3 (devc, portc, 0);
2022
set_dac_rate (dev, CHAN0);
2023
set_dac_fmt (dev, CHAN0);
2024
setup_play (dev, CHAN0);
2025
setup_ac3 (devc, portc, 0);
2029
portc->audio_enabled &= ~PCM_ENABLE_OUTPUT;
2030
portc->trigger_bits &= ~PCM_ENABLE_OUTPUT;
2031
MUTEX_EXIT_IRQRESTORE (devc->mutex, flags);
2036
cmpci_get_buffer_pointer (int dev, dmap_t * dmap, int direction)
2038
cmpci_devc *devc = audio_engines[dev]->devc;
2039
cmpci_portc *portc = audio_engines[dev]->portc;
2040
unsigned int ptr = 0;
2041
oss_native_word flags;
2043
if (!(portc->open_mode & direction))
2046
MUTEX_ENTER_IRQDISABLE (devc->low_mutex, flags);
2047
if (direction == PCM_ENABLE_INPUT)
2049
if (portc->chan0_rec)
2050
ptr = INW (devc->osdev, CH0_FRAME1);
2051
if (portc->chan1_rec)
2052
ptr = INW (devc->osdev, CH1_FRAME1);
2055
if (direction == PCM_ENABLE_OUTPUT)
2057
if (portc->chan0_play)
2058
ptr = INW (devc->osdev, CH0_FRAME1);
2059
if (portc->chan1_play)
2060
ptr = INW (devc->osdev, CH1_FRAME1);
2062
MUTEX_EXIT_IRQRESTORE (devc->low_mutex, flags);
2063
return ptr % dmap->bytes_in_use;
2066
static audiodrv_t cmpci_audio_driver = {
2069
cmpci_audio_output_block,
2070
cmpci_audio_start_input,
2072
cmpci_audio_prepare_for_input,
2073
cmpci_audio_prepare_for_output,
2077
cmpci_audio_reset_input,
2078
cmpci_audio_reset_output,
2079
cmpci_audio_trigger,
2080
cmpci_audio_set_rate,
2081
cmpci_audio_set_format,
2082
cmpci_audio_set_channels,
2087
NULL, /* cmpci_alloc_buffer, */
2088
NULL, /* cmpci_free_buffer, */
2091
cmpci_get_buffer_pointer
2094
#ifdef OBSOLETED_STUFF
2096
attach_mpu (cmpci_devc * devc)
2100
if (devc->chiprev == 33)
2101
base = 0x330; /* Chiprev033 doen't have bas+0x40 */
2103
base = MPU_MIRROR; /* base+0x40 is MPU PCI mirror */
2105
uart401_init (&devc->uart401devc, devc->osdev, base, "Cmedia MIDI UART");
2106
devc->uart401_attached = 1;
2111
init_cmpci (cmpci_devc * devc)
2113
oss_native_word val;
2117
devc->fm_attached = 0;
2120
* Enable BusMasterMode and IOSpace Access
2122
/* Check the model number of the chip */
2123
val = INL (devc->osdev, INT_HLDCLR) & 0xff000000;
2127
val = INL (devc->osdev, CHFORMAT) & 0x1f000000;
2132
devc->max_channels = 6;
2138
devc->max_channels = 6;
2143
if (val & 0x04000000)
2147
devc->max_channels = 6;
2149
if (val & 0x08000000)
2153
devc->max_channels = 6;
2155
if (val & 0x28000000)
2159
devc->model = MDL_CM8768;
2160
devc->max_channels = 8;
2161
devc->chip_name = "CMedia CM8768";
2165
/* enable uart, joystick in Function Control Reg1 */
2166
OUTB (devc->osdev, INB (devc->osdev, FUNCTRL1) | 0x06, FUNCTRL1);
2168
OUTL (devc->osdev, INL (devc->osdev, MISC_CTRL) | (1 << 19), MISC_CTRL);
2169
OUTB (devc->osdev, 0, INT_HLDCLR + 2); /* disable ints */
2170
OUTB (devc->osdev, 0, FUNCTRL0 + 2); /* reset channels */
2172
#ifdef OBSOLETED_STUFF
2176
/* install the CMPCI mixer */
2177
if ((devc->mixer_dev = oss_install_mixer (OSS_MIXER_DRIVER_VERSION,
2181
&cmpci_mixer_driver,
2182
sizeof (mixer_driver_t),
2188
mixer_devs[devc->mixer_dev]->hw_devc = devc;
2189
mixer_devs[devc->mixer_dev]->priority = 1; /* Possible default mixer candidate */
2191
cmpci_mixer_reset (devc->mixer_dev);
2192
mixer_ext_set_init_fn (devc->mixer_dev, cmpci_mix_init, 25);
2193
OUTB (devc->osdev, 0xF, MIXER2);
2195
/* setup 4speaker output */
2196
OUTL (devc->osdev, INL (devc->osdev, MISC_CTRL) | (1 << 26), MISC_CTRL);
2197
/* enable subwoofer/center channel */
2198
OUTL (devc->osdev, INL (devc->osdev, LEGACY_CTRL) | (1 << 12), LEGACY_CTRL);
2199
OUTL (devc->osdev, INL (devc->osdev, MISC_CTRL) | (1 << 7), MISC_CTRL);
2201
for (i = 0; i < MAX_PORTC; i++)
2204
cmpci_portc *portc = &devc->portc[i];
2205
int caps = ADEV_AUTOMODE;
2209
sprintf (tmp_name, "%s (rev %0d)", devc->chip_name, devc->chiprev);
2210
caps |= ADEV_DUPLEX;
2214
sprintf (tmp_name, "%s (playback only)", devc->chip_name);
2215
caps |= ADEV_NOINPUT;
2217
if ((portc->audiodev = oss_install_audiodev (OSS_AUDIO_DRIVER_VERSION,
2221
&cmpci_audio_driver,
2222
sizeof (audiodrv_t),
2224
AFMT_U8 | AFMT_S16_LE |
2225
AFMT_AC3, devc, -1)) < 0)
2232
first_dev = portc->audiodev;
2233
audio_engines[portc->audiodev]->portc = portc;
2234
audio_engines[portc->audiodev]->rate_source = first_dev;
2235
audio_engines[portc->audiodev]->caps =
2236
PCM_CAP_ANALOGOUT | PCM_CAP_ANALOGIN | PCM_CAP_DIGITALOUT |
2238
audio_engines[portc->audiodev]->min_rate = 5000;
2239
audio_engines[portc->audiodev]->max_rate = 48000;
2240
audio_engines[portc->audiodev]->caps |= PCM_CAP_FREERATE;
2241
audio_engines[portc->audiodev]->min_channels = 2;
2242
audio_engines[portc->audiodev]->max_channels = devc->max_channels;
2243
audio_engines[portc->audiodev]->vmix_flags = VMIX_MULTIFRAG;
2244
audio_engines[portc->audiodev]->dmabuf_alloc_flags |=
2246
portc->open_mode = 0;
2247
portc->audio_enabled = 0;
2248
audio_engines[portc->audiodev]->mixer_dev = devc->mixer_dev;
2249
devc->dev_mode = DEFAULT_MODE;
2250
devc->spdif_enabled = 0;
2251
#ifdef CONFIG_OSS_VMIX
2253
vmix_attach_audiodev(devc->osdev, portc->audiodev, -1, 0);
2261
oss_cmpci_attach (oss_device_t * osdev)
2263
unsigned char pci_irq_line, pci_revision;
2264
unsigned short pci_command, vendor, device;
2265
unsigned int pci_ioaddr;
2269
DDB (cmn_err (CE_CONT, "Entered CMEDIA CMPCI attach routine\n"));
2270
pci_read_config_word (osdev, PCI_VENDOR_ID, &vendor);
2271
pci_read_config_word (osdev, PCI_DEVICE_ID, &device);
2273
if (vendor != CMEDIA_VENDOR_ID
2274
|| ((device != CMEDIA_CM8738) && (device != CMEDIA_CM8338A)
2275
&& (device != CMEDIA_CM8338B)))
2278
pci_read_config_byte (osdev, PCI_REVISION_ID, &pci_revision);
2279
pci_read_config_word (osdev, PCI_COMMAND, &pci_command);
2280
pci_read_config_irq (osdev, PCI_INTERRUPT_LINE, &pci_irq_line);
2281
pci_read_config_dword (osdev, PCI_BASE_ADDRESS_0, &pci_ioaddr);
2283
DDB (cmn_err (CE_WARN, "CMPCI I/O base %04x\n", pci_ioaddr));
2285
if (pci_ioaddr == 0)
2287
cmn_err (CE_WARN, "I/O address not assigned by BIOS.\n");
2291
if (pci_irq_line == 0)
2293
cmn_err (CE_WARN, "IRQ not assigned by BIOS (%d).\n", pci_irq_line);
2297
if ((devc = PMALLOC (osdev, sizeof (*devc))) == NULL)
2299
cmn_err (CE_WARN, "Out of memory\n");
2304
devc->osdev = osdev;
2306
devc->irq = pci_irq_line;
2308
/* Map the IO Base address */
2309
devc->base = MAP_PCI_IOADDR (devc->osdev, 0, pci_ioaddr);
2311
/* Remove I/O space marker in bit 0. */
2314
/* set the PCI_COMMAND register to master mode */
2315
pci_command |= PCI_COMMAND_MASTER | PCI_COMMAND_IO;
2316
pci_write_config_word (osdev, PCI_COMMAND, pci_command);
2321
devc->model = MDL_CM8738;
2322
devc->chip_name = "CMedia CM8738";
2323
devc->max_channels = 6;
2326
case CMEDIA_CM8338A:
2327
devc->model = MDL_CM8338A;
2328
devc->chip_name = "CMedia CM8338A";
2329
devc->max_channels = 6;
2332
case CMEDIA_CM8338B:
2333
devc->model = MDL_CM8338B;
2334
devc->chip_name = "CMedia CM8338B";
2335
devc->max_channels = 6;
2339
MUTEX_INIT (devc->osdev, devc->mutex, MH_DRV);
2340
MUTEX_INIT (devc->osdev, devc->low_mutex, MH_DRV + 1);
2342
oss_register_device (osdev, devc->chip_name);
2344
if ((err = oss_register_interrupts (devc->osdev, 0, cmpciintr, NULL)) < 0)
2346
cmn_err (CE_WARN, "Can't allocate IRQ%d, err=%d\n", pci_irq_line, err);
2350
return init_cmpci (devc); /* Detected */
2354
oss_cmpci_detach (oss_device_t * osdev)
2356
cmpci_devc *devc = (cmpci_devc *) osdev->devc;
2358
if (oss_disable_device (osdev) < 0)
2361
/* disable Interrupts */
2362
OUTB (devc->osdev, 0, INT_HLDCLR + 2);
2364
/* disable channels */
2365
OUTB (devc->osdev, 0, FUNCTRL0 + 2);
2367
/* uninstall UART401 */
2368
if (devc->uart401_attached)
2369
uart401_disable (&devc->uart401devc);
2371
oss_unregister_interrupts (devc->osdev);
2373
MUTEX_CLEANUP (devc->mutex);
2374
MUTEX_CLEANUP (devc->low_mutex);
2375
UNMAP_PCI_IOADDR (devc->osdev, 0);
2377
oss_unregister_device (osdev);