2 * Support the ENSONIQ AudioPCI board and Creative Labs SoundBlaster PCI
3 * boards based on the ES1370, ES1371 and ES1373 chips.
5 * Copyright (c) 1999 Russell Cattelan <cattelan@thebarn.com>
6 * Copyright (c) 1999 Cameron Grant <gandalf@vilnya.demon.co.uk>
7 * Copyright (c) 1998 by Joachim Kuebart. All rights reserved.
9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted provided that the following conditions
13 * 1. Redistributions of source code must retain the above copyright
14 * notice, this list of conditions and the following disclaimer.
16 * 2. Redistributions in binary form must reproduce the above copyright
17 * notice, this list of conditions and the following disclaimer in
18 * the documentation and/or other materials provided with the
21 * 3. All advertising materials mentioning features or use of this
22 * software must display the following acknowledgement:
23 * This product includes software developed by Joachim Kuebart.
25 * 4. The name of the author may not be used to endorse or promote
26 * products derived from this software without specific prior
29 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
30 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
31 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
32 * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
33 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
34 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
35 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
36 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
37 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
38 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
39 * OF THE POSSIBILITY OF SUCH DAMAGE.
41 * $FreeBSD: src/sys/dev/sound/pci/es137x.c,v 1.13.2.10 2002/05/07 17:02:25 greid Exp $
42 * $DragonFly: src/sys/dev/sound/pci/es137x.c,v 1.7 2006/12/20 18:14:40 dillon Exp $
46 * Part of this code was heavily inspired by the linux driver from
47 * Thomas Sailer (sailer@ife.ee.ethz.ch)
48 * Just about everything has been touched and reworked in some way but
49 * the all the underlying sequences/timing/register values are from
54 #include <dev/sound/pcm/sound.h>
55 #include <dev/sound/pcm/ac97.h>
56 #include <dev/sound/pci/es137x.h>
58 #include <bus/pci/pcireg.h>
59 #include <bus/pci/pcivar.h>
61 #include <sys/sysctl.h>
65 SND_DECLARE_FILE("$DragonFly: src/sys/dev/sound/pci/es137x.c,v 1.7 2006/12/20 18:14:40 dillon Exp $");
68 SYSCTL_INT(_debug
, OID_AUTO
, es_debug
, CTLFLAG_RW
, &debug
, 0, "");
70 #define MEM_MAP_REG 0x14
72 /* PCI IDs of supported chips */
73 #define ES1370_PCI_ID 0x50001274
74 #define ES1371_PCI_ID 0x13711274
75 #define ES1371_PCI_ID2 0x13713274
76 #define CT5880_PCI_ID 0x58801274
78 #define ES1371REV_ES1371_A 0x02
79 #define ES1371REV_ES1371_B 0x09
81 #define ES1371REV_ES1373_8 0x08
82 #define ES1371REV_ES1373_A 0x04
83 #define ES1371REV_ES1373_B 0x06
85 #define ES1371REV_CT5880_A 0x07
87 #define CT5880REV_CT5880_C 0x02
88 #define CT5880REV_CT5880_D 0x03
89 #define CT5880REV_CT5880_E 0x04
91 #define ES_DEFAULT_BUFSZ 4096
93 /* device private data */
97 struct es_info
*parent
;
98 struct pcm_channel
*channel
;
99 struct snd_dbuf
*buffer
;
101 u_int32_t fmt
, blksz
, bufsz
;
106 bus_space_handle_t sh
;
107 bus_dma_tag_t parent_dmat
;
109 struct resource
*reg
, *irq
;
110 int regtype
, regid
, irqid
;
117 /* Contents of board's registers */
120 struct es_chinfo pch
, rch
;
123 /* -------------------------------------------------------------------- */
126 static void es_intr(void *);
128 static u_int
es1371_wait_src_ready(struct es_info
*);
129 static void es1371_src_write(struct es_info
*, u_short
, unsigned short);
130 static u_int
es1371_adc_rate(struct es_info
*, u_int
, int);
131 static u_int
es1371_dac_rate(struct es_info
*, u_int
, int);
132 static int es1371_init(struct es_info
*, device_t
);
133 static int es1370_init(struct es_info
*);
134 static int es1370_wrcodec(struct es_info
*, u_char
, u_char
);
136 static u_int32_t es_playfmt
[] = {
138 AFMT_STEREO
| AFMT_U8
,
140 AFMT_STEREO
| AFMT_S16_LE
,
143 static struct pcmchan_caps es_playcaps
= {4000, 48000, es_playfmt
, 0};
145 static u_int32_t es_recfmt
[] = {
147 AFMT_STEREO
| AFMT_U8
,
149 AFMT_STEREO
| AFMT_S16_LE
,
152 static struct pcmchan_caps es_reccaps
= {4000, 48000, es_recfmt
, 0};
154 static const struct {
161 } mixtable
[SOUND_MIXER_NRDEVICES
] = {
162 [SOUND_MIXER_VOLUME
] = { 0, 0x0, 0x1, 1, 0x0000, 1 },
163 [SOUND_MIXER_PCM
] = { 1, 0x2, 0x3, 1, 0x0400, 1 },
164 [SOUND_MIXER_SYNTH
] = { 2, 0x4, 0x5, 1, 0x0060, 1 },
165 [SOUND_MIXER_CD
] = { 3, 0x6, 0x7, 1, 0x0006, 1 },
166 [SOUND_MIXER_LINE
] = { 4, 0x8, 0x9, 1, 0x0018, 1 },
167 [SOUND_MIXER_LINE1
] = { 5, 0xa, 0xb, 1, 0x1800, 1 },
168 [SOUND_MIXER_LINE2
] = { 6, 0xc, 0x0, 0, 0x0100, 1 },
169 [SOUND_MIXER_LINE3
] = { 7, 0xd, 0x0, 0, 0x0200, 1 },
170 [SOUND_MIXER_MIC
] = { 8, 0xe, 0x0, 0, 0x0001, 1 },
171 [SOUND_MIXER_OGAIN
] = { 9, 0xf, 0x0, 0, 0x0000, 1 }
174 /* -------------------------------------------------------------------- */
175 /* The es1370 mixer interface */
178 es1370_mixinit(struct snd_mixer
*m
)
184 for (i
= 0; i
< SOUND_MIXER_NRDEVICES
; i
++)
185 if (mixtable
[i
].avail
) v
|= (1 << i
);
188 for (i
= 0; i
< SOUND_MIXER_NRDEVICES
; i
++)
189 if (mixtable
[i
].recmask
) v
|= (1 << i
);
190 mix_setrecdevs(m
, v
);
195 es1370_mixset(struct snd_mixer
*m
, unsigned dev
, unsigned left
, unsigned right
)
199 if (!mixtable
[dev
].avail
) return -1;
201 r
= mixtable
[dev
].stereo
? right
: l
;
202 if (mixtable
[dev
].left
== 0xf) {
203 rl
= (l
< 2)? 0x80 : 7 - (l
- 2) / 14;
205 rl
= (l
< 10)? 0x80 : 15 - (l
- 10) / 6;
207 if (mixtable
[dev
].stereo
) {
208 rr
= (r
< 10)? 0x80 : 15 - (r
- 10) / 6;
209 es1370_wrcodec(mix_getdevinfo(m
), mixtable
[dev
].right
, rr
);
211 es1370_wrcodec(mix_getdevinfo(m
), mixtable
[dev
].left
, rl
);
216 es1370_mixsetrecsrc(struct snd_mixer
*m
, u_int32_t src
)
220 if (src
== 0) src
= 1 << SOUND_MIXER_MIC
;
221 src
&= mix_getrecdevs(m
);
222 for (i
= 0; i
< SOUND_MIXER_NRDEVICES
; i
++)
223 if ((src
& (1 << i
)) != 0) j
|= mixtable
[i
].recmask
;
225 es1370_wrcodec(mix_getdevinfo(m
), CODEC_LIMIX1
, j
& 0x55);
226 es1370_wrcodec(mix_getdevinfo(m
), CODEC_RIMIX1
, j
& 0xaa);
227 es1370_wrcodec(mix_getdevinfo(m
), CODEC_LIMIX2
, (j
>> 8) & 0x17);
228 es1370_wrcodec(mix_getdevinfo(m
), CODEC_RIMIX2
, (j
>> 8) & 0x0f);
229 es1370_wrcodec(mix_getdevinfo(m
), CODEC_OMIX1
, 0x7f);
230 es1370_wrcodec(mix_getdevinfo(m
), CODEC_OMIX2
, 0x3f);
234 static kobj_method_t es1370_mixer_methods
[] = {
235 KOBJMETHOD(mixer_init
, es1370_mixinit
),
236 KOBJMETHOD(mixer_set
, es1370_mixset
),
237 KOBJMETHOD(mixer_setrecsrc
, es1370_mixsetrecsrc
),
240 MIXER_DECLARE(es1370_mixer
);
242 /* -------------------------------------------------------------------- */
245 es1370_wrcodec(struct es_info
*es
, u_char i
, u_char data
)
247 int wait
= 100; /* 100 msec timeout */
250 if ((bus_space_read_4(es
->st
, es
->sh
, ES1370_REG_STATUS
) &
252 bus_space_write_2(es
->st
, es
->sh
, ES1370_REG_CODEC
,
253 ((u_short
)i
<< CODEC_INDEX_SHIFT
) | data
);
258 printf("pcm: es1370_wrcodec timed out\n");
262 /* -------------------------------------------------------------------- */
264 /* channel interface */
266 eschan_init(kobj_t obj
, void *devinfo
, struct snd_dbuf
*b
, struct pcm_channel
*c
, int dir
)
268 struct es_info
*es
= devinfo
;
269 struct es_chinfo
*ch
= (dir
== PCMDIR_PLAY
)? &es
->pch
: &es
->rch
;
274 ch
->bufsz
= es
->bufsz
;
275 ch
->blksz
= ch
->bufsz
/ 2;
276 ch
->num
= ch
->parent
->num
++;
277 if (sndbuf_alloc(ch
->buffer
, es
->parent_dmat
, ch
->bufsz
) == -1) return NULL
;
282 eschan_setdir(kobj_t obj
, void *data
, int dir
)
284 struct es_chinfo
*ch
= data
;
285 struct es_info
*es
= ch
->parent
;
287 if (dir
== PCMDIR_PLAY
) {
288 bus_space_write_1(es
->st
, es
->sh
, ES1370_REG_MEMPAGE
, ES1370_REG_DAC2_FRAMEADR
>> 8);
289 bus_space_write_4(es
->st
, es
->sh
, ES1370_REG_DAC2_FRAMEADR
& 0xff, vtophys(sndbuf_getbuf(ch
->buffer
)));
290 bus_space_write_4(es
->st
, es
->sh
, ES1370_REG_DAC2_FRAMECNT
& 0xff, (ch
->bufsz
>> 2) - 1);
292 bus_space_write_1(es
->st
, es
->sh
, ES1370_REG_MEMPAGE
, ES1370_REG_ADC_FRAMEADR
>> 8);
293 bus_space_write_4(es
->st
, es
->sh
, ES1370_REG_ADC_FRAMEADR
& 0xff, vtophys(sndbuf_getbuf(ch
->buffer
)));
294 bus_space_write_4(es
->st
, es
->sh
, ES1370_REG_ADC_FRAMECNT
& 0xff, (ch
->bufsz
>> 2) - 1);
301 eschan_setformat(kobj_t obj
, void *data
, u_int32_t format
)
303 struct es_chinfo
*ch
= data
;
304 struct es_info
*es
= ch
->parent
;
306 if (ch
->dir
== PCMDIR_PLAY
) {
307 es
->sctrl
&= ~SCTRL_P2FMT
;
308 if (format
& AFMT_S16_LE
) es
->sctrl
|= SCTRL_P2SEB
;
309 if (format
& AFMT_STEREO
) es
->sctrl
|= SCTRL_P2SMB
;
311 es
->sctrl
&= ~SCTRL_R1FMT
;
312 if (format
& AFMT_S16_LE
) es
->sctrl
|= SCTRL_R1SEB
;
313 if (format
& AFMT_STEREO
) es
->sctrl
|= SCTRL_R1SMB
;
315 bus_space_write_4(es
->st
, es
->sh
, ES1370_REG_SERIAL_CONTROL
, es
->sctrl
);
321 eschan1370_setspeed(kobj_t obj
, void *data
, u_int32_t speed
)
323 struct es_chinfo
*ch
= data
;
324 struct es_info
*es
= ch
->parent
;
326 es
->ctrl
&= ~CTRL_PCLKDIV
;
327 es
->ctrl
|= DAC2_SRTODIV(speed
) << CTRL_SH_PCLKDIV
;
328 bus_space_write_4(es
->st
, es
->sh
, ES1370_REG_CONTROL
, es
->ctrl
);
329 /* rec/play speeds locked together - should indicate in flags */
330 return speed
; /* XXX calc real speed */
334 eschan1371_setspeed(kobj_t obj
, void *data
, u_int32_t speed
)
336 struct es_chinfo
*ch
= data
;
337 struct es_info
*es
= ch
->parent
;
339 if (ch
->dir
== PCMDIR_PLAY
) {
340 return es1371_dac_rate(es
, speed
, 3 - ch
->num
); /* play */
342 return es1371_adc_rate(es
, speed
, 1); /* record */
347 eschan_setblocksize(kobj_t obj
, void *data
, u_int32_t blocksize
)
349 struct es_chinfo
*ch
= data
;
351 ch
->blksz
= blocksize
;
352 ch
->bufsz
= ch
->blksz
* 2;
353 sndbuf_resize(ch
->buffer
, 2, ch
->blksz
);
359 eschan_trigger(kobj_t obj
, void *data
, int go
)
361 struct es_chinfo
*ch
= data
;
362 struct es_info
*es
= ch
->parent
;
365 if (go
== PCMTRIG_EMLDMAWR
|| go
== PCMTRIG_EMLDMARD
)
368 cnt
= (ch
->blksz
/ sndbuf_getbps(ch
->buffer
)) - 1;
370 if (ch
->dir
== PCMDIR_PLAY
) {
371 if (go
== PCMTRIG_START
) {
372 int b
= (ch
->fmt
& AFMT_S16_LE
)? 2 : 1;
373 es
->ctrl
|= CTRL_DAC2_EN
;
374 es
->sctrl
&= ~(SCTRL_P2ENDINC
| SCTRL_P2STINC
| SCTRL_P2LOOPSEL
| SCTRL_P2PAUSE
| SCTRL_P2DACSEN
);
375 es
->sctrl
|= SCTRL_P2INTEN
| (b
<< SCTRL_SH_P2ENDINC
);
376 bus_space_write_4(es
->st
, es
->sh
, ES1370_REG_DAC2_SCOUNT
, cnt
);
377 /* start at beginning of buffer */
378 bus_space_write_4(es
->st
, es
->sh
, ES1370_REG_MEMPAGE
, ES1370_REG_DAC2_FRAMECNT
>> 8);
379 bus_space_write_4(es
->st
, es
->sh
, ES1370_REG_DAC2_FRAMECNT
& 0xff, (ch
->bufsz
>> 2) - 1);
380 } else es
->ctrl
&= ~CTRL_DAC2_EN
;
382 if (go
== PCMTRIG_START
) {
383 es
->ctrl
|= CTRL_ADC_EN
;
384 es
->sctrl
&= ~SCTRL_R1LOOPSEL
;
385 es
->sctrl
|= SCTRL_R1INTEN
;
386 bus_space_write_4(es
->st
, es
->sh
, ES1370_REG_ADC_SCOUNT
, cnt
);
387 /* start at beginning of buffer */
388 bus_space_write_4(es
->st
, es
->sh
, ES1370_REG_MEMPAGE
, ES1370_REG_ADC_FRAMECNT
>> 8);
389 bus_space_write_4(es
->st
, es
->sh
, ES1370_REG_ADC_FRAMECNT
& 0xff, (ch
->bufsz
>> 2) - 1);
390 } else es
->ctrl
&= ~CTRL_ADC_EN
;
392 bus_space_write_4(es
->st
, es
->sh
, ES1370_REG_SERIAL_CONTROL
, es
->sctrl
);
393 bus_space_write_4(es
->st
, es
->sh
, ES1370_REG_CONTROL
, es
->ctrl
);
398 eschan_getptr(kobj_t obj
, void *data
)
400 struct es_chinfo
*ch
= data
;
401 struct es_info
*es
= ch
->parent
;
404 if (ch
->dir
== PCMDIR_PLAY
)
405 reg
= ES1370_REG_DAC2_FRAMECNT
;
407 reg
= ES1370_REG_ADC_FRAMECNT
;
409 bus_space_write_4(es
->st
, es
->sh
, ES1370_REG_MEMPAGE
, reg
>> 8);
410 cnt
= bus_space_read_4(es
->st
, es
->sh
, reg
& 0x000000ff) >> 16;
411 /* cnt is longwords */
415 static struct pcmchan_caps
*
416 eschan_getcaps(kobj_t obj
, void *data
)
418 struct es_chinfo
*ch
= data
;
419 return (ch
->dir
== PCMDIR_PLAY
)? &es_playcaps
: &es_reccaps
;
422 static kobj_method_t eschan1370_methods
[] = {
423 KOBJMETHOD(channel_init
, eschan_init
),
424 KOBJMETHOD(channel_setdir
, eschan_setdir
),
425 KOBJMETHOD(channel_setformat
, eschan_setformat
),
426 KOBJMETHOD(channel_setspeed
, eschan1370_setspeed
),
427 KOBJMETHOD(channel_setblocksize
, eschan_setblocksize
),
428 KOBJMETHOD(channel_trigger
, eschan_trigger
),
429 KOBJMETHOD(channel_getptr
, eschan_getptr
),
430 KOBJMETHOD(channel_getcaps
, eschan_getcaps
),
433 CHANNEL_DECLARE(eschan1370
);
435 static kobj_method_t eschan1371_methods
[] = {
436 KOBJMETHOD(channel_init
, eschan_init
),
437 KOBJMETHOD(channel_setdir
, eschan_setdir
),
438 KOBJMETHOD(channel_setformat
, eschan_setformat
),
439 KOBJMETHOD(channel_setspeed
, eschan1371_setspeed
),
440 KOBJMETHOD(channel_setblocksize
, eschan_setblocksize
),
441 KOBJMETHOD(channel_trigger
, eschan_trigger
),
442 KOBJMETHOD(channel_getptr
, eschan_getptr
),
443 KOBJMETHOD(channel_getcaps
, eschan_getcaps
),
446 CHANNEL_DECLARE(eschan1371
);
448 /* -------------------------------------------------------------------- */
449 /* The interrupt handler */
453 struct es_info
*es
= p
;
454 unsigned intsrc
, sctrl
;
456 intsrc
= bus_space_read_4(es
->st
, es
->sh
, ES1370_REG_STATUS
);
457 if ((intsrc
& STAT_INTR
) == 0) return;
460 if (intsrc
& STAT_ADC
) sctrl
&= ~SCTRL_R1INTEN
;
461 if (intsrc
& STAT_DAC1
) sctrl
&= ~SCTRL_P1INTEN
;
462 if (intsrc
& STAT_DAC2
) sctrl
&= ~SCTRL_P2INTEN
;
464 bus_space_write_4(es
->st
, es
->sh
, ES1370_REG_SERIAL_CONTROL
, sctrl
);
465 bus_space_write_4(es
->st
, es
->sh
, ES1370_REG_SERIAL_CONTROL
, es
->sctrl
);
467 if (intsrc
& STAT_ADC
) chn_intr(es
->rch
.channel
);
468 if (intsrc
& STAT_DAC1
);
469 if (intsrc
& STAT_DAC2
) chn_intr(es
->pch
.channel
);
472 /* ES1370 specific */
474 es1370_init(struct es_info
*es
)
476 es
->ctrl
= CTRL_CDC_EN
| CTRL_SERR_DIS
|
477 (DAC2_SRTODIV(DSP_DEFAULT_SPEED
) << CTRL_SH_PCLKDIV
);
478 bus_space_write_4(es
->st
, es
->sh
, ES1370_REG_CONTROL
, es
->ctrl
);
481 bus_space_write_4(es
->st
, es
->sh
, ES1370_REG_SERIAL_CONTROL
, es
->sctrl
);
483 es1370_wrcodec(es
, CODEC_RES_PD
, 3);/* No RST, PD */
484 es1370_wrcodec(es
, CODEC_CSEL
, 0); /* CODEC ADC and CODEC DAC use
485 * {LR,B}CLK2 and run off the LRCLK2
486 * PLL; program DAC_SYNC=0! */
487 es1370_wrcodec(es
, CODEC_ADSEL
, 0);/* Recording source is mixer */
488 es1370_wrcodec(es
, CODEC_MGAIN
, 0);/* MIC amp is 0db */
493 /* ES1371 specific */
495 es1371_init(struct es_info
*es
, device_t dev
)
498 int devid
= pci_get_devid(dev
);
499 int revid
= pci_get_revid(dev
);
501 if (debug
> 0) printf("es_init\n");
506 /* initialize the chips */
507 if ((devid
== ES1371_PCI_ID
&& revid
== ES1371REV_ES1373_8
) ||
508 (devid
== ES1371_PCI_ID
&& revid
== ES1371REV_CT5880_A
) ||
509 (devid
== CT5880_PCI_ID
&& revid
== CT5880REV_CT5880_C
) ||
510 (devid
== CT5880_PCI_ID
&& revid
== CT5880REV_CT5880_D
) ||
511 (devid
== CT5880_PCI_ID
&& revid
== CT5880REV_CT5880_E
)) {
512 bus_space_write_4(es
->st
, es
->sh
, ES1370_REG_STATUS
, 0x20000000);
514 if (debug
> 0) device_printf(dev
, "ac97 2.1 enabled\n");
515 } else { /* pre ac97 2.1 card */
516 bus_space_write_4(es
->st
, es
->sh
, ES1370_REG_CONTROL
, es
->ctrl
);
517 if (debug
> 0) device_printf(dev
, "ac97 pre-2.1 enabled\n");
519 bus_space_write_4(es
->st
, es
->sh
, ES1370_REG_SERIAL_CONTROL
, es
->sctrl
);
520 bus_space_write_4(es
->st
, es
->sh
, ES1371_REG_LEGACY
, 0);
521 /* AC'97 warm reset to start the bitclk */
522 bus_space_write_4(es
->st
, es
->sh
, ES1371_REG_LEGACY
, es
->ctrl
| ES1371_SYNC_RES
);
524 bus_space_write_4(es
->st
, es
->sh
, ES1370_REG_SERIAL_CONTROL
, es
->ctrl
);
525 /* Init the sample rate converter */
526 bus_space_write_4(es
->st
, es
->sh
, ES1371_REG_SMPRATE
, ES1371_DIS_SRC
);
527 for (idx
= 0; idx
< 0x80; idx
++)
528 es1371_src_write(es
, idx
, 0);
529 es1371_src_write(es
, ES_SMPREG_DAC1
+ ES_SMPREG_TRUNC_N
, 16 << 4);
530 es1371_src_write(es
, ES_SMPREG_DAC1
+ ES_SMPREG_INT_REGS
, 16 << 10);
531 es1371_src_write(es
, ES_SMPREG_DAC2
+ ES_SMPREG_TRUNC_N
, 16 << 4);
532 es1371_src_write(es
, ES_SMPREG_DAC2
+ ES_SMPREG_INT_REGS
, 16 << 10);
533 es1371_src_write(es
, ES_SMPREG_VOL_ADC
, 1 << 12);
534 es1371_src_write(es
, ES_SMPREG_VOL_ADC
+ 1, 1 << 12);
535 es1371_src_write(es
, ES_SMPREG_VOL_DAC1
, 1 << 12);
536 es1371_src_write(es
, ES_SMPREG_VOL_DAC1
+ 1, 1 << 12);
537 es1371_src_write(es
, ES_SMPREG_VOL_DAC2
, 1 << 12);
538 es1371_src_write(es
, ES_SMPREG_VOL_DAC2
+ 1, 1 << 12);
539 es1371_adc_rate (es
, 22050, 1);
540 es1371_dac_rate (es
, 22050, 1);
541 es1371_dac_rate (es
, 22050, 2);
543 * enabling the sample rate converter without properly programming
544 * its parameters causes the chip to lock up (the SRC busy bit will
545 * be stuck high, and I've found no way to rectify this other than
548 bus_space_write_4(es
->st
, es
->sh
, ES1371_REG_SMPRATE
, 0);
553 /* -------------------------------------------------------------------- */
556 es1371_wrcd(kobj_t obj
, void *s
, int addr
, u_int32_t data
)
559 struct es_info
*es
= (struct es_info
*)s
;
561 if (debug
> 0) printf("wrcodec addr 0x%x data 0x%x\n", addr
, data
);
563 for (t
= 0; t
< 0x1000; t
++)
564 if (!(bus_space_read_4(es
->st
, es
->sh
,(ES1371_REG_CODEC
& CODEC_WIP
))))
567 /* save the current state for later */
568 x
= bus_space_read_4(es
->st
, es
->sh
, ES1371_REG_SMPRATE
);
569 /* enable SRC state data in SRC mux */
570 bus_space_write_4(es
->st
, es
->sh
, ES1371_REG_SMPRATE
,
571 (es1371_wait_src_ready(s
) &
572 (ES1371_DIS_SRC
| ES1371_DIS_P1
| ES1371_DIS_P2
| ES1371_DIS_R1
)));
573 /* wait for a SAFE time to write addr/data and then do it, dammit */
574 for (t
= 0; t
< 0x1000; t
++)
575 if ((bus_space_read_4(es
->st
, es
->sh
, ES1371_REG_SMPRATE
) & 0x00070000) == 0x00010000)
579 printf("one b_s_w: 0x%lx 0x%x 0x%x\n",
580 rman_get_start(es
->reg
), ES1371_REG_CODEC
,
581 ((addr
<< CODEC_POADD_SHIFT
) & CODEC_POADD_MASK
) |
582 ((data
<< CODEC_PODAT_SHIFT
) & CODEC_PODAT_MASK
));
584 bus_space_write_4(es
->st
, es
->sh
,ES1371_REG_CODEC
,
585 ((addr
<< CODEC_POADD_SHIFT
) & CODEC_POADD_MASK
) |
586 ((data
<< CODEC_PODAT_SHIFT
) & CODEC_PODAT_MASK
));
587 /* restore SRC reg */
588 es1371_wait_src_ready(s
);
590 printf("two b_s_w: 0x%lx 0x%x 0x%x\n",
591 rman_get_start(es
->reg
), ES1371_REG_SMPRATE
, x
);
592 bus_space_write_4(es
->st
, es
->sh
, ES1371_REG_SMPRATE
, x
);
599 es1371_rdcd(kobj_t obj
, void *s
, int addr
)
602 struct es_info
*es
= (struct es_info
*)s
;
604 if (debug
> 0) printf("rdcodec addr 0x%x ... ", addr
);
606 for (t
= 0; t
< 0x1000; t
++)
607 if (!(x
= bus_space_read_4(es
->st
, es
->sh
, ES1371_REG_CODEC
) & CODEC_WIP
))
609 if (debug
> 0) printf("loop 1 t 0x%x x 0x%x ", t
, x
);
613 /* save the current state for later */
614 x
= bus_space_read_4(es
->st
, es
->sh
, ES1371_REG_SMPRATE
);
615 /* enable SRC state data in SRC mux */
616 bus_space_write_4(es
->st
, es
->sh
, ES1371_REG_SMPRATE
,
617 (es1371_wait_src_ready(s
) &
618 (ES1371_DIS_SRC
| ES1371_DIS_P1
| ES1371_DIS_P2
| ES1371_DIS_R1
)));
619 /* wait for a SAFE time to write addr/data and then do it, dammit */
620 for (t
= 0; t
< 0x5000; t
++)
621 if ((x
= bus_space_read_4(es
->st
, es
->sh
, ES1371_REG_SMPRATE
) & 0x00070000) == 0x00010000)
623 if (debug
> 0) printf("loop 2 t 0x%x x 0x%x ", t
, x
);
624 bus_space_write_4(es
->st
, es
->sh
, ES1371_REG_CODEC
,
625 ((addr
<< CODEC_POADD_SHIFT
) & CODEC_POADD_MASK
) | CODEC_PORD
);
627 /* restore SRC reg */
628 es1371_wait_src_ready(s
);
629 bus_space_write_4(es
->st
, es
->sh
, ES1371_REG_SMPRATE
, x
);
633 /* now wait for the stinkin' data (RDY) */
634 for (t
= 0; t
< 0x1000; t
++)
635 if ((x
= bus_space_read_4(es
->st
, es
->sh
, ES1371_REG_CODEC
)) & CODEC_RDY
)
637 if (debug
> 0) printf("loop 3 t 0x%x 0x%x ret 0x%x\n", t
, x
, ((x
& CODEC_PIDAT_MASK
) >> CODEC_PIDAT_SHIFT
));
638 return ((x
& CODEC_PIDAT_MASK
) >> CODEC_PIDAT_SHIFT
);
641 static kobj_method_t es1371_ac97_methods
[] = {
642 KOBJMETHOD(ac97_read
, es1371_rdcd
),
643 KOBJMETHOD(ac97_write
, es1371_wrcd
),
646 AC97_DECLARE(es1371_ac97
);
648 /* -------------------------------------------------------------------- */
651 es1371_src_read(struct es_info
*es
, u_short reg
)
655 r
= es1371_wait_src_ready(es
) &
656 (ES1371_DIS_SRC
| ES1371_DIS_P1
| ES1371_DIS_P2
| ES1371_DIS_R1
);
657 r
|= ES1371_SRC_RAM_ADDRO(reg
);
658 bus_space_write_4(es
->st
, es
->sh
, ES1371_REG_SMPRATE
,r
);
659 return ES1371_SRC_RAM_DATAI(es1371_wait_src_ready(es
));
663 es1371_src_write(struct es_info
*es
, u_short reg
, u_short data
){
666 r
= es1371_wait_src_ready(es
) &
667 (ES1371_DIS_SRC
| ES1371_DIS_P1
| ES1371_DIS_P2
| ES1371_DIS_R1
);
668 r
|= ES1371_SRC_RAM_ADDRO(reg
) | ES1371_SRC_RAM_DATAO(data
);
669 /* printf("es1371_src_write 0x%x 0x%x\n",ES1371_REG_SMPRATE,r | ES1371_SRC_RAM_WE); */
670 bus_space_write_4(es
->st
, es
->sh
, ES1371_REG_SMPRATE
, r
| ES1371_SRC_RAM_WE
);
674 es1371_adc_rate(struct es_info
*es
, u_int rate
, int set
)
676 u_int n
, truncm
, freq
, result
;
678 if (rate
> 48000) rate
= 48000;
679 if (rate
< 4000) rate
= 4000;
681 if ((1 << n
) & ((1 << 15) | (1 << 13) | (1 << 11) | (1 << 9)))
683 truncm
= (21 * n
- 1) | 1;
684 freq
= ((48000UL << 15) / rate
) * n
;
685 result
= (48000UL << 15) / (freq
/ n
);
688 if (truncm
> 239) truncm
= 239;
689 es1371_src_write(es
, ES_SMPREG_ADC
+ ES_SMPREG_TRUNC_N
,
690 (((239 - truncm
) >> 1) << 9) | (n
<< 4));
692 if (truncm
> 119) truncm
= 119;
693 es1371_src_write(es
, ES_SMPREG_ADC
+ ES_SMPREG_TRUNC_N
,
694 0x8000 | (((119 - truncm
) >> 1) << 9) | (n
<< 4));
696 es1371_src_write(es
, ES_SMPREG_ADC
+ ES_SMPREG_INT_REGS
,
697 (es1371_src_read(es
, ES_SMPREG_ADC
+ ES_SMPREG_INT_REGS
) &
698 0x00ff) | ((freq
>> 5) & 0xfc00));
699 es1371_src_write(es
, ES_SMPREG_ADC
+ ES_SMPREG_VFREQ_FRAC
, freq
& 0x7fff);
700 es1371_src_write(es
, ES_SMPREG_VOL_ADC
, n
<< 8);
701 es1371_src_write(es
, ES_SMPREG_VOL_ADC
+ 1, n
<< 8);
707 es1371_dac_rate(struct es_info
*es
, u_int rate
, int set
)
709 u_int freq
, r
, result
, dac
, dis
;
711 if (rate
> 48000) rate
= 48000;
712 if (rate
< 4000) rate
= 4000;
713 freq
= (rate
<< 15) / 3000;
714 result
= (freq
* 3000) >> 15;
716 dac
= (set
== 1)? ES_SMPREG_DAC1
: ES_SMPREG_DAC2
;
717 dis
= (set
== 1)? ES1371_DIS_P2
: ES1371_DIS_P1
;
719 r
= (es1371_wait_src_ready(es
) & (ES1371_DIS_SRC
| ES1371_DIS_P1
| ES1371_DIS_P2
| ES1371_DIS_R1
));
720 bus_space_write_4(es
->st
, es
->sh
, ES1371_REG_SMPRATE
, r
);
721 es1371_src_write(es
, dac
+ ES_SMPREG_INT_REGS
,
722 (es1371_src_read(es
, dac
+ ES_SMPREG_INT_REGS
) & 0x00ff) | ((freq
>> 5) & 0xfc00));
723 es1371_src_write(es
, dac
+ ES_SMPREG_VFREQ_FRAC
, freq
& 0x7fff);
724 r
= (es1371_wait_src_ready(es
) & (ES1371_DIS_SRC
| dis
| ES1371_DIS_R1
));
725 bus_space_write_4(es
->st
, es
->sh
, ES1371_REG_SMPRATE
, r
);
731 es1371_wait_src_ready(struct es_info
*es
)
735 for (t
= 0; t
< 500; t
++) {
736 if (!((r
= bus_space_read_4(es
->st
, es
->sh
, ES1371_REG_SMPRATE
)) & ES1371_SRC_RAM_BUSY
))
740 printf("es1371: wait src ready timeout 0x%x [0x%x]\n", ES1371_REG_SMPRATE
, r
);
744 /* -------------------------------------------------------------------- */
747 * Probe and attach the card
751 es_pci_probe(device_t dev
)
753 switch(pci_get_devid(dev
)) {
755 device_set_desc(dev
, "AudioPCI ES1370");
759 switch(pci_get_revid(dev
)) {
760 case ES1371REV_ES1371_A
:
761 device_set_desc(dev
, "AudioPCI ES1371-A");
764 case ES1371REV_ES1371_B
:
765 device_set_desc(dev
, "AudioPCI ES1371-B");
768 case ES1371REV_ES1373_A
:
769 device_set_desc(dev
, "AudioPCI ES1373-A");
772 case ES1371REV_ES1373_B
:
773 device_set_desc(dev
, "AudioPCI ES1373-B");
776 case ES1371REV_ES1373_8
:
777 device_set_desc(dev
, "AudioPCI ES1373-8");
780 case ES1371REV_CT5880_A
:
781 device_set_desc(dev
, "Creative CT5880-A");
785 device_set_desc(dev
, "AudioPCI ES1371-?");
786 device_printf(dev
, "unknown revision %d -- please report to cg@freebsd.org\n", pci_get_revid(dev
));
791 device_set_desc(dev
, "Strange AudioPCI ES1371-? (vid=3274)");
792 device_printf(dev
, "unknown revision %d -- please report to cg@freebsd.org\n", pci_get_revid(dev
));
796 switch(pci_get_revid(dev
)) {
797 case CT5880REV_CT5880_C
:
798 device_set_desc(dev
, "Creative CT5880-C");
801 case CT5880REV_CT5880_D
:
802 device_set_desc(dev
, "Creative CT5880-D");
805 case CT5880REV_CT5880_E
:
806 device_set_desc(dev
, "Creative CT5880-E");
810 device_set_desc(dev
, "Creative CT5880-?");
811 device_printf(dev
, "unknown revision %d -- please report to cg@freebsd.org\n", pci_get_revid(dev
));
821 es_pci_attach(device_t dev
)
824 struct es_info
*es
= 0;
826 char status
[SND_STATUSLEN
];
827 struct ac97_info
*codec
= 0;
828 kobj_class_t ct
= NULL
;
830 if ((es
= kmalloc(sizeof *es
, M_DEVBUF
, M_NOWAIT
| M_ZERO
)) == NULL
) {
831 device_printf(dev
, "cannot allocate softc\n");
837 data
= pci_read_config(dev
, PCIR_COMMAND
, 2);
838 data
|= (PCIM_CMD_PORTEN
|PCIM_CMD_MEMEN
|PCIM_CMD_BUSMASTEREN
);
839 pci_write_config(dev
, PCIR_COMMAND
, data
, 2);
840 data
= pci_read_config(dev
, PCIR_COMMAND
, 2);
841 if (mapped
== 0 && (data
& PCIM_CMD_MEMEN
)) {
842 es
->regid
= MEM_MAP_REG
;
843 es
->regtype
= SYS_RES_MEMORY
;
844 es
->reg
= bus_alloc_resource(dev
, es
->regtype
, &es
->regid
,
845 0, ~0, 1, RF_ACTIVE
);
847 es
->st
= rman_get_bustag(es
->reg
);
848 es
->sh
= rman_get_bushandle(es
->reg
);
852 if (mapped
== 0 && (data
& PCIM_CMD_PORTEN
)) {
853 es
->regid
= PCIR_MAPS
;
854 es
->regtype
= SYS_RES_IOPORT
;
855 es
->reg
= bus_alloc_resource(dev
, es
->regtype
, &es
->regid
,
856 0, ~0, 1, RF_ACTIVE
);
858 es
->st
= rman_get_bustag(es
->reg
);
859 es
->sh
= rman_get_bushandle(es
->reg
);
864 device_printf(dev
, "unable to map register space\n");
868 es
->bufsz
= pcm_getbuffersize(dev
, 4096, ES_DEFAULT_BUFSZ
, 65536);
870 if (pci_get_devid(dev
) == ES1371_PCI_ID
||
871 pci_get_devid(dev
) == ES1371_PCI_ID2
||
872 pci_get_devid(dev
) == CT5880_PCI_ID
) {
873 if(-1 == es1371_init(es
, dev
)) {
874 device_printf(dev
, "unable to initialize the card\n");
877 codec
= AC97_CREATE(dev
, es
, es1371_ac97
);
878 if (codec
== NULL
) goto bad
;
879 /* our init routine does everything for us */
880 /* set to NULL; flag mixer_init not to run the ac97_init */
881 /* ac97_mixer.init = NULL; */
882 if (mixer_init(dev
, ac97_getmixerclass(), codec
)) goto bad
;
883 ct
= &eschan1371_class
;
884 } else if (pci_get_devid(dev
) == ES1370_PCI_ID
) {
885 if (-1 == es1370_init(es
)) {
886 device_printf(dev
, "unable to initialize the card\n");
889 if (mixer_init(dev
, &es1370_mixer_class
, es
)) goto bad
;
890 ct
= &eschan1370_class
;
894 es
->irq
= bus_alloc_resource(dev
, SYS_RES_IRQ
, &es
->irqid
,
895 0, ~0, 1, RF_ACTIVE
| RF_SHAREABLE
);
896 if (!es
->irq
|| snd_setup_intr(dev
, es
->irq
, 0, es_intr
, es
, &es
->ih
, NULL
)) {
897 device_printf(dev
, "unable to map interrupt\n");
901 if (bus_dma_tag_create(/*parent*/NULL
, /*alignment*/2, /*boundary*/0,
902 /*lowaddr*/BUS_SPACE_MAXADDR_32BIT
,
903 /*highaddr*/BUS_SPACE_MAXADDR
,
904 /*filter*/NULL
, /*filterarg*/NULL
,
905 /*maxsize*/es
->bufsz
, /*nsegments*/1, /*maxsegz*/0x3ffff,
906 /*flags*/0, &es
->parent_dmat
) != 0) {
907 device_printf(dev
, "unable to create dma tag\n");
911 ksnprintf(status
, SND_STATUSLEN
, "at %s 0x%lx irq %ld",
912 (es
->regtype
== SYS_RES_IOPORT
)? "io" : "memory",
913 rman_get_start(es
->reg
), rman_get_start(es
->irq
));
915 if (pcm_register(dev
, es
, 1, 1)) goto bad
;
916 pcm_addchan(dev
, PCMDIR_REC
, ct
, es
);
917 pcm_addchan(dev
, PCMDIR_PLAY
, ct
, es
);
918 pcm_setstatus(dev
, status
);
923 if (codec
) ac97_destroy(codec
);
924 if (es
->reg
) bus_release_resource(dev
, es
->regtype
, es
->regid
, es
->reg
);
925 if (es
->ih
) bus_teardown_intr(dev
, es
->irq
, es
->ih
);
926 if (es
->irq
) bus_release_resource(dev
, SYS_RES_IRQ
, es
->irqid
, es
->irq
);
927 if (es
->parent_dmat
) bus_dma_tag_destroy(es
->parent_dmat
);
928 if (es
) kfree(es
, M_DEVBUF
);
933 es_pci_detach(device_t dev
)
938 r
= pcm_unregister(dev
);
942 es
= pcm_getdevinfo(dev
);
943 bus_release_resource(dev
, es
->regtype
, es
->regid
, es
->reg
);
944 bus_teardown_intr(dev
, es
->irq
, es
->ih
);
945 bus_release_resource(dev
, SYS_RES_IRQ
, es
->irqid
, es
->irq
);
946 bus_dma_tag_destroy(es
->parent_dmat
);
952 static device_method_t es_methods
[] = {
953 /* Device interface */
954 DEVMETHOD(device_probe
, es_pci_probe
),
955 DEVMETHOD(device_attach
, es_pci_attach
),
956 DEVMETHOD(device_detach
, es_pci_detach
),
961 static driver_t es_driver
= {
967 DRIVER_MODULE(snd_es137x
, pci
, es_driver
, pcm_devclass
, 0, 0);
968 MODULE_DEPEND(snd_es137x
, snd_pcm
, PCM_MINVER
, PCM_PREFVER
, PCM_MAXVER
);
969 MODULE_VERSION(snd_es137x
, 1);