2 * Copyright (c) 1999 Cameron Grant <gandalf@vilnya.demon.co.uk>
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
14 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHERIN CONTRACT, STRICT
22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27 #include <dev/sound/pcm/sound.h>
28 #include <dev/sound/pcm/ac97.h>
29 #include <gnu/dev/sound/pci/emu10k1.h>
31 #include <pci/pcireg.h>
32 #include <pci/pcivar.h>
33 #include <sys/queue.h>
35 SND_DECLARE_FILE("$FreeBSD: src/sys/dev/sound/pci/emu10k1.c,v 1.6.2.9 2002/04/22 15:49:32 cg Exp $");
37 /* -------------------------------------------------------------------- */
39 #define EMU10K1_PCI_ID 0x00021102
40 #define EMU10K2_PCI_ID 0x00041102
41 #define EMU_DEFAULT_BUFSZ 4096
46 SLIST_ENTRY(emu_memblk) link;
48 u_int32_t pte_start, pte_size;
52 u_int8_t bmap[MAXPAGES / 8];
55 SLIST_HEAD(, emu_memblk) blocks;
60 int b16:1, stereo:1, busy:1, running:1, ismaster:1;
64 struct emu_voice *slave;
65 struct pcm_channel *channel;
70 /* channel registers */
72 int spd, fmt, blksz, run;
73 struct emu_voice *master, *slave;
74 struct snd_dbuf *buffer;
75 struct pcm_channel *channel;
76 struct sc_info *parent;
80 int spd, fmt, run, blksz, num;
81 u_int32_t idxreg, basereg, sizereg, setupreg, irqmask;
82 struct snd_dbuf *buffer;
83 struct pcm_channel *channel;
84 struct sc_info *parent;
87 /* device private data */
91 u_int32_t tos_link:1, APS:1;
94 bus_space_handle_t sh;
95 bus_dma_tag_t parent_dmat;
97 struct resource *reg, *irq;
102 int timer, timerinterval;
105 struct emu_voice voice[64];
106 struct sc_pchinfo pch[EMU_CHANS];
107 struct sc_rchinfo rch[3];
110 /* -------------------------------------------------------------------- */
117 static int emu_init(struct sc_info *);
118 static void emu_intr(void *);
119 static void *emu_malloc(struct sc_info *sc, u_int32_t sz);
120 static void *emu_memalloc(struct sc_info *sc, u_int32_t sz);
121 static int emu_memfree(struct sc_info *sc, void *buf);
122 static int emu_memstart(struct sc_info *sc, void *buf);
124 static void emu_vdump(struct sc_info *sc, struct emu_voice *v);
127 /* talk to the card */
128 static u_int32_t emu_rd(struct sc_info *, int, int);
129 static void emu_wr(struct sc_info *, int, u_int32_t, int);
131 /* -------------------------------------------------------------------- */
133 static u_int32_t emu_rfmt_ac97[] = {
135 AFMT_STEREO | AFMT_S16_LE,
139 static u_int32_t emu_rfmt_mic[] = {
144 static u_int32_t emu_rfmt_efx[] = {
145 AFMT_STEREO | AFMT_S16_LE,
149 static struct pcmchan_caps emu_reccaps[3] = {
150 {8000, 48000, emu_rfmt_ac97, 0},
151 {8000, 8000, emu_rfmt_mic, 0},
152 {48000, 48000, emu_rfmt_efx, 0},
155 static u_int32_t emu_pfmt[] = {
157 AFMT_STEREO | AFMT_U8,
159 AFMT_STEREO | AFMT_S16_LE,
163 static struct pcmchan_caps emu_playcaps = {4000, 48000, emu_pfmt, 0};
165 static int adcspeed[8] = {48000, 44100, 32000, 24000, 22050, 16000, 11025, 8000};
167 /* -------------------------------------------------------------------- */
170 emu_rd(struct sc_info *sc, int regno, int size)
174 return bus_space_read_1(sc->st, sc->sh, regno);
176 return bus_space_read_2(sc->st, sc->sh, regno);
178 return bus_space_read_4(sc->st, sc->sh, regno);
185 emu_wr(struct sc_info *sc, int regno, u_int32_t data, int size)
189 bus_space_write_1(sc->st, sc->sh, regno, data);
192 bus_space_write_2(sc->st, sc->sh, regno, data);
195 bus_space_write_4(sc->st, sc->sh, regno, data);
201 emu_rdptr(struct sc_info *sc, int chn, int reg)
203 u_int32_t ptr, val, mask, size, offset;
205 ptr = ((reg << 16) & PTR_ADDRESS_MASK) | (chn & PTR_CHANNELNUM_MASK);
206 emu_wr(sc, PTR, ptr, 4);
207 val = emu_rd(sc, DATA, 4);
208 if (reg & 0xff000000) {
209 size = (reg >> 24) & 0x3f;
210 offset = (reg >> 16) & 0x1f;
211 mask = ((1 << size) - 1) << offset;
219 emu_wrptr(struct sc_info *sc, int chn, int reg, u_int32_t data)
221 u_int32_t ptr, mask, size, offset;
223 ptr = ((reg << 16) & PTR_ADDRESS_MASK) | (chn & PTR_CHANNELNUM_MASK);
224 emu_wr(sc, PTR, ptr, 4);
225 if (reg & 0xff000000) {
226 size = (reg >> 24) & 0x3f;
227 offset = (reg >> 16) & 0x1f;
228 mask = ((1 << size) - 1) << offset;
231 data |= emu_rd(sc, DATA, 4) & ~mask;
233 emu_wr(sc, DATA, data, 4);
237 emu_wrefx(struct sc_info *sc, unsigned int pc, unsigned int data)
239 emu_wrptr(sc, 0, MICROCODEBASE + pc, data);
242 /* -------------------------------------------------------------------- */
244 /* no locking needed */
247 emu_rdcd(kobj_t obj, void *devinfo, int regno)
249 struct sc_info *sc = (struct sc_info *)devinfo;
251 emu_wr(sc, AC97ADDRESS, regno, 1);
252 return emu_rd(sc, AC97DATA, 2);
256 emu_wrcd(kobj_t obj, void *devinfo, int regno, u_int32_t data)
258 struct sc_info *sc = (struct sc_info *)devinfo;
260 emu_wr(sc, AC97ADDRESS, regno, 1);
261 emu_wr(sc, AC97DATA, data, 2);
265 static kobj_method_t emu_ac97_methods[] = {
266 KOBJMETHOD(ac97_read, emu_rdcd),
267 KOBJMETHOD(ac97_write, emu_wrcd),
270 AC97_DECLARE(emu_ac97);
272 /* -------------------------------------------------------------------- */
275 emu_settimer(struct sc_info *sc)
277 struct sc_pchinfo *pch;
278 struct sc_rchinfo *rch;
282 for (i = 0; i < EMU_CHANS; i++) {
285 tmp = (pch->spd * sndbuf_getbps(pch->buffer)) / pch->blksz;
291 for (i = 0; i < 3; i++) {
294 tmp = (rch->spd * sndbuf_getbps(rch->buffer)) / rch->blksz;
299 RANGE(rate, 48, 9600);
300 sc->timerinterval = 48000 / rate;
301 emu_wr(sc, TIMER, sc->timerinterval & 0x03ff, 2);
303 return sc->timerinterval;
307 emu_enatimer(struct sc_info *sc, int go)
311 if (sc->timer++ == 0) {
312 x = emu_rd(sc, INTE, 4);
313 x |= INTE_INTERVALTIMERENB;
314 emu_wr(sc, INTE, x, 4);
318 x = emu_rd(sc, INTE, 4);
319 x &= ~INTE_INTERVALTIMERENB;
320 emu_wr(sc, INTE, x, 4);
326 emu_enastop(struct sc_info *sc, char channel, int enable)
328 int reg = (channel & 0x20)? SOLEH : SOLEL;
331 reg |= channel << 16;
332 emu_wrptr(sc, 0, reg, enable);
336 emu_recval(int speed) {
340 while (val < 7 && speed < adcspeed[val])
346 emu_rate_to_pitch(u_int32_t rate)
348 static u_int32_t logMagTable[128] = {
349 0x00000, 0x02dfc, 0x05b9e, 0x088e6, 0x0b5d6, 0x0e26f, 0x10eb3, 0x13aa2,
350 0x1663f, 0x1918a, 0x1bc84, 0x1e72e, 0x2118b, 0x23b9a, 0x2655d, 0x28ed5,
351 0x2b803, 0x2e0e8, 0x30985, 0x331db, 0x359eb, 0x381b6, 0x3a93d, 0x3d081,
352 0x3f782, 0x41e42, 0x444c1, 0x46b01, 0x49101, 0x4b6c4, 0x4dc49, 0x50191,
353 0x5269e, 0x54b6f, 0x57006, 0x59463, 0x5b888, 0x5dc74, 0x60029, 0x623a7,
354 0x646ee, 0x66a00, 0x68cdd, 0x6af86, 0x6d1fa, 0x6f43c, 0x7164b, 0x73829,
355 0x759d4, 0x77b4f, 0x79c9a, 0x7bdb5, 0x7dea1, 0x7ff5e, 0x81fed, 0x8404e,
356 0x86082, 0x88089, 0x8a064, 0x8c014, 0x8df98, 0x8fef1, 0x91e20, 0x93d26,
357 0x95c01, 0x97ab4, 0x9993e, 0x9b79f, 0x9d5d9, 0x9f3ec, 0xa11d8, 0xa2f9d,
358 0xa4d3c, 0xa6ab5, 0xa8808, 0xaa537, 0xac241, 0xadf26, 0xafbe7, 0xb1885,
359 0xb3500, 0xb5157, 0xb6d8c, 0xb899f, 0xba58f, 0xbc15e, 0xbdd0c, 0xbf899,
360 0xc1404, 0xc2f50, 0xc4a7b, 0xc6587, 0xc8073, 0xc9b3f, 0xcb5ed, 0xcd07c,
361 0xceaec, 0xd053f, 0xd1f73, 0xd398a, 0xd5384, 0xd6d60, 0xd8720, 0xda0c3,
362 0xdba4a, 0xdd3b4, 0xded03, 0xe0636, 0xe1f4e, 0xe384a, 0xe512c, 0xe69f3,
363 0xe829f, 0xe9b31, 0xeb3a9, 0xecc08, 0xee44c, 0xefc78, 0xf148a, 0xf2c83,
364 0xf4463, 0xf5c2a, 0xf73da, 0xf8b71, 0xfa2f0, 0xfba57, 0xfd1a7, 0xfe8df
366 static char logSlopeTable[128] = {
367 0x5c, 0x5c, 0x5b, 0x5a, 0x5a, 0x59, 0x58, 0x58,
368 0x57, 0x56, 0x56, 0x55, 0x55, 0x54, 0x53, 0x53,
369 0x52, 0x52, 0x51, 0x51, 0x50, 0x50, 0x4f, 0x4f,
370 0x4e, 0x4d, 0x4d, 0x4d, 0x4c, 0x4c, 0x4b, 0x4b,
371 0x4a, 0x4a, 0x49, 0x49, 0x48, 0x48, 0x47, 0x47,
372 0x47, 0x46, 0x46, 0x45, 0x45, 0x45, 0x44, 0x44,
373 0x43, 0x43, 0x43, 0x42, 0x42, 0x42, 0x41, 0x41,
374 0x41, 0x40, 0x40, 0x40, 0x3f, 0x3f, 0x3f, 0x3e,
375 0x3e, 0x3e, 0x3d, 0x3d, 0x3d, 0x3c, 0x3c, 0x3c,
376 0x3b, 0x3b, 0x3b, 0x3b, 0x3a, 0x3a, 0x3a, 0x39,
377 0x39, 0x39, 0x39, 0x38, 0x38, 0x38, 0x38, 0x37,
378 0x37, 0x37, 0x37, 0x36, 0x36, 0x36, 0x36, 0x35,
379 0x35, 0x35, 0x35, 0x34, 0x34, 0x34, 0x34, 0x34,
380 0x33, 0x33, 0x33, 0x33, 0x32, 0x32, 0x32, 0x32,
381 0x32, 0x31, 0x31, 0x31, 0x31, 0x31, 0x30, 0x30,
382 0x30, 0x30, 0x30, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f
387 return 0; /* Bail out if no leading "1" */
388 rate *= 11185; /* Scale 48000 to 0x20002380 */
389 for (i = 31; i > 0; i--) {
390 if (rate & 0x80000000) { /* Detect leading "1" */
391 return (((u_int32_t) (i - 15) << 20) +
392 logMagTable[0x7f & (rate >> 24)] +
393 (0x7f & (rate >> 17)) *
394 logSlopeTable[0x7f & (rate >> 24)]);
399 return 0; /* Should never reach this point */
403 emu_rate_to_linearpitch(u_int32_t rate)
405 rate = (rate << 8) / 375;
406 return (rate >> 1) + (rate & 1);
409 static struct emu_voice *
410 emu_valloc(struct sc_info *sc)
416 for (i = 0; i < 64 && sc->voice[i].busy; i++);
425 emu_vinit(struct sc_info *sc, struct emu_voice *m, struct emu_voice *s,
426 u_int32_t sz, struct snd_dbuf *b)
430 buf = emu_memalloc(sc, sz);
434 sndbuf_setup(b, buf, sz);
435 m->start = emu_memstart(sc, buf) * EMUPAGESIZE;
436 m->end = m->start + sz;
444 m->buf = vtophys(buf);
463 emu_vsetup(struct sc_pchinfo *ch)
465 struct emu_voice *v = ch->master;
468 v->b16 = (ch->fmt & AFMT_16BIT)? 1 : 0;
469 v->stereo = (ch->fmt & AFMT_STEREO)? 1 : 0;
470 if (v->slave != NULL) {
471 v->slave->b16 = v->b16;
472 v->slave->stereo = v->stereo;
477 if (v->slave != NULL)
478 v->slave->speed = v->speed;
483 emu_vwrite(struct sc_info *sc, struct emu_voice *v)
487 u_int32_t sa, ea, start, val, silent_page;
489 s = (v->stereo? 1 : 0) + (v->b16? 1 : 0);
494 l = r = x = y = v->vol;
496 l = v->ismaster? l : 0;
497 r = v->ismaster? 0 : r;
500 emu_wrptr(sc, v->vnum, CPF, v->stereo? CPF_STEREO_MASK : 0);
501 val = v->stereo? 28 : 30;
502 val *= v->b16? 1 : 2;
505 emu_wrptr(sc, v->vnum, FXRT, 0xd01c0000);
507 emu_wrptr(sc, v->vnum, PTRX, (x << 8) | r);
508 emu_wrptr(sc, v->vnum, DSL, ea | (y << 24));
509 emu_wrptr(sc, v->vnum, PSST, sa | (l << 24));
510 emu_wrptr(sc, v->vnum, CCCA, start | (v->b16? 0 : CCCA_8BITSELECT));
512 emu_wrptr(sc, v->vnum, Z1, 0);
513 emu_wrptr(sc, v->vnum, Z2, 0);
515 silent_page = ((u_int32_t)vtophys(sc->mem.silent_page) << 1) | MAP_PTI_MASK;
516 emu_wrptr(sc, v->vnum, MAPA, silent_page);
517 emu_wrptr(sc, v->vnum, MAPB, silent_page);
519 emu_wrptr(sc, v->vnum, CVCF, CVCF_CURRENTFILTER_MASK);
520 emu_wrptr(sc, v->vnum, VTFT, VTFT_FILTERTARGET_MASK);
521 emu_wrptr(sc, v->vnum, ATKHLDM, 0);
522 emu_wrptr(sc, v->vnum, DCYSUSM, DCYSUSM_DECAYTIME_MASK);
523 emu_wrptr(sc, v->vnum, LFOVAL1, 0x8000);
524 emu_wrptr(sc, v->vnum, LFOVAL2, 0x8000);
525 emu_wrptr(sc, v->vnum, FMMOD, 0);
526 emu_wrptr(sc, v->vnum, TREMFRQ, 0);
527 emu_wrptr(sc, v->vnum, FM2FRQ2, 0);
528 emu_wrptr(sc, v->vnum, ENVVAL, 0x8000);
530 emu_wrptr(sc, v->vnum, ATKHLDV, ATKHLDV_HOLDTIME_MASK | ATKHLDV_ATTACKTIME_MASK);
531 emu_wrptr(sc, v->vnum, ENVVOL, 0x8000);
533 emu_wrptr(sc, v->vnum, PEFE_FILTERAMOUNT, 0x7f);
534 emu_wrptr(sc, v->vnum, PEFE_PITCHAMOUNT, 0);
536 if (v->slave != NULL)
537 emu_vwrite(sc, v->slave);
541 emu_vtrigger(struct sc_info *sc, struct emu_voice *v, int go)
543 u_int32_t pitch_target, initial_pitch;
544 u_int32_t cra, cs, ccis;
549 cs = v->stereo? 4 : 2;
550 ccis = v->stereo? 28 : 30;
551 ccis *= v->b16? 1 : 2;
552 sample = v->b16? 0x00000000 : 0x80808080;
554 for (i = 0; i < cs; i++)
555 emu_wrptr(sc, v->vnum, CD0 + i, sample);
556 emu_wrptr(sc, v->vnum, CCR_CACHEINVALIDSIZE, 0);
557 emu_wrptr(sc, v->vnum, CCR_READADDRESS, cra);
558 emu_wrptr(sc, v->vnum, CCR_CACHEINVALIDSIZE, ccis);
560 emu_wrptr(sc, v->vnum, IFATN, 0xff00);
561 emu_wrptr(sc, v->vnum, VTFT, 0xffffffff);
562 emu_wrptr(sc, v->vnum, CVCF, 0xffffffff);
563 emu_wrptr(sc, v->vnum, DCYSUSV, 0x00007f7f);
564 emu_enastop(sc, v->vnum, 0);
566 pitch_target = emu_rate_to_linearpitch(v->speed);
567 initial_pitch = emu_rate_to_pitch(v->speed) >> 8;
568 emu_wrptr(sc, v->vnum, PTRX_PITCHTARGET, pitch_target);
569 emu_wrptr(sc, v->vnum, CPF_CURRENTPITCH, pitch_target);
570 emu_wrptr(sc, v->vnum, IP, initial_pitch);
572 emu_wrptr(sc, v->vnum, PTRX_PITCHTARGET, 0);
573 emu_wrptr(sc, v->vnum, CPF_CURRENTPITCH, 0);
574 emu_wrptr(sc, v->vnum, IFATN, 0xffff);
575 emu_wrptr(sc, v->vnum, VTFT, 0x0000ffff);
576 emu_wrptr(sc, v->vnum, CVCF, 0x0000ffff);
577 emu_wrptr(sc, v->vnum, IP, 0);
578 emu_enastop(sc, v->vnum, 1);
580 if (v->slave != NULL)
581 emu_vtrigger(sc, v->slave, go);
585 emu_vpos(struct sc_info *sc, struct emu_voice *v)
589 s = (v->b16? 1 : 0) + (v->stereo? 1 : 0);
590 ptr = (emu_rdptr(sc, v->vnum, CCCA_CURRADDR) - (v->start >> s)) << s;
591 return ptr & ~0x0000001f;
596 emu_vdump(struct sc_info *sc, struct emu_voice *v)
598 char *regname[] = { "cpf", "ptrx", "cvcf", "vtft", "z2", "z1", "psst", "dsl",
599 "ccca", "ccr", "clp", "fxrt", "mapa", "mapb", NULL, NULL,
600 "envvol", "atkhldv", "dcysusv", "lfoval1",
601 "envval", "atkhldm", "dcysusm", "lfoval2",
602 "ip", "ifatn", "pefe", "fmmod", "tremfrq", "fmfrq2",
606 printf("voice number %d\n", v->vnum);
607 for (i = 0, x = 0; i <= 0x1e; i++) {
608 if (regname[i] == NULL)
610 printf("%s\t[%08x]", regname[i], emu_rdptr(sc, v->vnum, i));
611 printf("%s", (x == 2)? "\n" : "\t");
620 /* channel interface */
622 emupchan_init(kobj_t obj, void *devinfo, struct snd_dbuf *b, struct pcm_channel *c, int dir)
624 struct sc_info *sc = devinfo;
625 struct sc_pchinfo *ch;
628 KASSERT(dir == PCMDIR_PLAY, ("emupchan_init: bad direction"));
629 ch = &sc->pch[sc->pnum++];
633 ch->blksz = sc->bufsz / 2;
636 snd_mtxlock(sc->lock);
637 ch->master = emu_valloc(sc);
638 ch->slave = emu_valloc(sc);
639 r = (emu_vinit(sc, ch->master, ch->slave, sc->bufsz, ch->buffer))? NULL : ch;
640 snd_mtxunlock(sc->lock);
646 emupchan_free(kobj_t obj, void *data)
648 struct sc_pchinfo *ch = data;
649 struct sc_info *sc = ch->parent;
652 snd_mtxlock(sc->lock);
653 r = emu_memfree(sc, sndbuf_getbuf(ch->buffer));
654 snd_mtxunlock(sc->lock);
660 emupchan_setformat(kobj_t obj, void *data, u_int32_t format)
662 struct sc_pchinfo *ch = data;
669 emupchan_setspeed(kobj_t obj, void *data, u_int32_t speed)
671 struct sc_pchinfo *ch = data;
678 emupchan_setblocksize(kobj_t obj, void *data, u_int32_t blocksize)
680 struct sc_pchinfo *ch = data;
681 struct sc_info *sc = ch->parent;
684 ch->blksz = blocksize;
685 snd_mtxlock(sc->lock);
687 irqrate = 48000 / sc->timerinterval;
688 snd_mtxunlock(sc->lock);
689 blksz = (ch->spd * sndbuf_getbps(ch->buffer)) / irqrate;
694 emupchan_trigger(kobj_t obj, void *data, int go)
696 struct sc_pchinfo *ch = data;
697 struct sc_info *sc = ch->parent;
699 if (go == PCMTRIG_EMLDMAWR || go == PCMTRIG_EMLDMARD)
702 snd_mtxlock(sc->lock);
703 if (go == PCMTRIG_START) {
705 emu_vwrite(sc, ch->master);
709 printf("start [%d bit, %s, %d hz]\n",
710 ch->master->b16? 16 : 8,
711 ch->master->stereo? "stereo" : "mono",
713 emu_vdump(sc, ch->master);
714 emu_vdump(sc, ch->slave);
717 ch->run = (go == PCMTRIG_START)? 1 : 0;
718 emu_vtrigger(sc, ch->master, ch->run);
719 snd_mtxunlock(sc->lock);
724 emupchan_getptr(kobj_t obj, void *data)
726 struct sc_pchinfo *ch = data;
727 struct sc_info *sc = ch->parent;
730 snd_mtxlock(sc->lock);
731 r = emu_vpos(sc, ch->master);
732 snd_mtxunlock(sc->lock);
737 static struct pcmchan_caps *
738 emupchan_getcaps(kobj_t obj, void *data)
740 return &emu_playcaps;
743 static kobj_method_t emupchan_methods[] = {
744 KOBJMETHOD(channel_init, emupchan_init),
745 KOBJMETHOD(channel_free, emupchan_free),
746 KOBJMETHOD(channel_setformat, emupchan_setformat),
747 KOBJMETHOD(channel_setspeed, emupchan_setspeed),
748 KOBJMETHOD(channel_setblocksize, emupchan_setblocksize),
749 KOBJMETHOD(channel_trigger, emupchan_trigger),
750 KOBJMETHOD(channel_getptr, emupchan_getptr),
751 KOBJMETHOD(channel_getcaps, emupchan_getcaps),
754 CHANNEL_DECLARE(emupchan);
756 /* channel interface */
758 emurchan_init(kobj_t obj, void *devinfo, struct snd_dbuf *b, struct pcm_channel *c, int dir)
760 struct sc_info *sc = devinfo;
761 struct sc_rchinfo *ch;
763 KASSERT(dir == PCMDIR_REC, ("emurchan_init: bad direction"));
764 ch = &sc->rch[sc->rnum];
768 ch->blksz = sc->bufsz / 2;
777 ch->setupreg = ADCCR;
778 ch->irqmask = INTE_ADCBUFENABLE;
786 ch->irqmask = INTE_EFXBUFENABLE;
794 ch->irqmask = INTE_MICBUFENABLE;
798 if (sndbuf_alloc(ch->buffer, sc->parent_dmat, sc->bufsz) == -1)
801 snd_mtxlock(sc->lock);
802 emu_wrptr(sc, 0, ch->basereg, vtophys(sndbuf_getbuf(ch->buffer)));
803 emu_wrptr(sc, 0, ch->sizereg, 0); /* off */
804 snd_mtxunlock(sc->lock);
810 emurchan_setformat(kobj_t obj, void *data, u_int32_t format)
812 struct sc_rchinfo *ch = data;
819 emurchan_setspeed(kobj_t obj, void *data, u_int32_t speed)
821 struct sc_rchinfo *ch = data;
824 speed = adcspeed[emu_recval(speed)];
834 emurchan_setblocksize(kobj_t obj, void *data, u_int32_t blocksize)
836 struct sc_rchinfo *ch = data;
837 struct sc_info *sc = ch->parent;
840 ch->blksz = blocksize;
841 snd_mtxlock(sc->lock);
843 irqrate = 48000 / sc->timerinterval;
844 snd_mtxunlock(sc->lock);
845 blksz = (ch->spd * sndbuf_getbps(ch->buffer)) / irqrate;
849 /* semantic note: must start at beginning of buffer */
851 emurchan_trigger(kobj_t obj, void *data, int go)
853 struct sc_rchinfo *ch = data;
854 struct sc_info *sc = ch->parent;
859 sz = ADCBS_BUFSIZE_4096;
863 sz = ADCBS_BUFSIZE_8192;
867 sz = ADCBS_BUFSIZE_16384;
871 sz = ADCBS_BUFSIZE_32768;
875 sz = ADCBS_BUFSIZE_65536;
879 sz = ADCBS_BUFSIZE_4096;
882 snd_mtxlock(sc->lock);
886 emu_wrptr(sc, 0, ch->sizereg, sz);
888 val = ADCCR_LCHANENABLE;
889 if (ch->fmt & AFMT_STEREO)
890 val |= ADCCR_RCHANENABLE;
891 val |= emu_recval(ch->spd);
892 emu_wrptr(sc, 0, ch->setupreg, 0);
893 emu_wrptr(sc, 0, ch->setupreg, val);
895 val = emu_rd(sc, INTE, 4);
897 emu_wr(sc, INTE, val, 4);
903 emu_wrptr(sc, 0, ch->sizereg, 0);
905 emu_wrptr(sc, 0, ch->setupreg, 0);
906 val = emu_rd(sc, INTE, 4);
908 emu_wr(sc, INTE, val, 4);
911 case PCMTRIG_EMLDMAWR:
912 case PCMTRIG_EMLDMARD:
916 snd_mtxunlock(sc->lock);
922 emurchan_getptr(kobj_t obj, void *data)
924 struct sc_rchinfo *ch = data;
925 struct sc_info *sc = ch->parent;
928 snd_mtxlock(sc->lock);
929 r = emu_rdptr(sc, 0, ch->idxreg) & 0x0000ffff;
930 snd_mtxunlock(sc->lock);
935 static struct pcmchan_caps *
936 emurchan_getcaps(kobj_t obj, void *data)
938 struct sc_rchinfo *ch = data;
940 return &emu_reccaps[ch->num];
943 static kobj_method_t emurchan_methods[] = {
944 KOBJMETHOD(channel_init, emurchan_init),
945 KOBJMETHOD(channel_setformat, emurchan_setformat),
946 KOBJMETHOD(channel_setspeed, emurchan_setspeed),
947 KOBJMETHOD(channel_setblocksize, emurchan_setblocksize),
948 KOBJMETHOD(channel_trigger, emurchan_trigger),
949 KOBJMETHOD(channel_getptr, emurchan_getptr),
950 KOBJMETHOD(channel_getcaps, emurchan_getcaps),
953 CHANNEL_DECLARE(emurchan);
955 /* -------------------------------------------------------------------- */
956 /* The interrupt handler */
960 struct sc_info *sc = (struct sc_info *)p;
961 u_int32_t stat, ack, i, x;
964 stat = emu_rd(sc, IPR, 4);
970 if (stat & IPR_INTERVALTIMER) {
971 ack |= IPR_INTERVALTIMER;
973 for (i = 0; i < EMU_CHANS; i++) {
974 if (sc->pch[i].run) {
976 chn_intr(sc->pch[i].channel);
984 if (stat & (IPR_ADCBUFFULL | IPR_ADCBUFHALFFULL)) {
985 ack |= stat & (IPR_ADCBUFFULL | IPR_ADCBUFHALFFULL);
986 if (sc->rch[0].channel)
987 chn_intr(sc->rch[0].channel);
989 if (stat & (IPR_EFXBUFFULL | IPR_EFXBUFHALFFULL)) {
990 ack |= stat & (IPR_EFXBUFFULL | IPR_EFXBUFHALFFULL);
991 if (sc->rch[1].channel)
992 chn_intr(sc->rch[1].channel);
994 if (stat & (IPR_MICBUFFULL | IPR_MICBUFHALFFULL)) {
995 ack |= stat & (IPR_MICBUFFULL | IPR_MICBUFHALFFULL);
996 if (sc->rch[2].channel)
997 chn_intr(sc->rch[2].channel);
999 if (stat & IPR_PCIERROR) {
1000 ack |= IPR_PCIERROR;
1001 device_printf(sc->dev, "pci error\n");
1002 /* we still get an nmi with ecc ram even if we ack this */
1004 if (stat & IPR_SAMPLERATETRACKER) {
1005 ack |= IPR_SAMPLERATETRACKER;
1006 /* device_printf(sc->dev, "sample rate tracker lock status change\n"); */
1010 device_printf(sc->dev, "dodgy irq: %x (harmless)\n", stat & ~ack);
1012 emu_wr(sc, IPR, stat, 4);
1016 /* -------------------------------------------------------------------- */
1019 emu_setmap(void *arg, bus_dma_segment_t *segs, int nseg, int error)
1023 *phys = error? 0 : (void *)segs->ds_addr;
1026 printf("emu: setmap (%lx, %lx), nseg=%d, error=%d\n",
1027 (unsigned long)segs->ds_addr, (unsigned long)segs->ds_len,
1033 emu_malloc(struct sc_info *sc, u_int32_t sz)
1035 void *buf, *phys = 0;
1038 if (bus_dmamem_alloc(sc->parent_dmat, &buf, BUS_DMA_NOWAIT, &map))
1040 if (bus_dmamap_load(sc->parent_dmat, map, buf, sz, emu_setmap, &phys, 0)
1047 emu_free(struct sc_info *sc, void *buf)
1049 bus_dmamem_free(sc->parent_dmat, buf, NULL);
1053 emu_memalloc(struct sc_info *sc, u_int32_t sz)
1055 u_int32_t blksz, start, idx, ofs, tmp, found;
1056 struct emu_mem *mem = &sc->mem;
1057 struct emu_memblk *blk;
1060 blksz = sz / EMUPAGESIZE;
1061 if (sz > (blksz * EMUPAGESIZE))
1063 /* find a free block in the bitmap */
1066 while (!found && start + blksz < MAXPAGES) {
1068 for (idx = start; idx < start + blksz; idx++)
1069 if (mem->bmap[idx >> 3] & (1 << (idx & 7)))
1076 blk = malloc(sizeof(*blk), M_DEVBUF, M_NOWAIT);
1079 buf = emu_malloc(sc, sz);
1081 free(blk, M_DEVBUF);
1085 blk->pte_start = start;
1086 blk->pte_size = blksz;
1087 /* printf("buf %p, pte_start %d, pte_size %d\n", blk->buf, blk->pte_start, blk->pte_size); */
1089 for (idx = start; idx < start + blksz; idx++) {
1090 mem->bmap[idx >> 3] |= 1 << (idx & 7);
1091 tmp = (u_int32_t)vtophys((u_int8_t *)buf + ofs);
1092 /* printf("pte[%d] -> %x phys, %x virt\n", idx, tmp, ((u_int32_t)buf) + ofs); */
1093 mem->ptb_pages[idx] = (tmp << 1) | idx;
1096 SLIST_INSERT_HEAD(&mem->blocks, blk, link);
1101 emu_memfree(struct sc_info *sc, void *buf)
1104 struct emu_mem *mem = &sc->mem;
1105 struct emu_memblk *blk, *i;
1108 SLIST_FOREACH(i, &mem->blocks, link) {
1114 SLIST_REMOVE(&mem->blocks, blk, emu_memblk, link);
1116 tmp = (u_int32_t)vtophys(sc->mem.silent_page) << 1;
1117 for (idx = blk->pte_start; idx < blk->pte_start + blk->pte_size; idx++) {
1118 mem->bmap[idx >> 3] &= ~(1 << (idx & 7));
1119 mem->ptb_pages[idx] = tmp | idx;
1121 free(blk, M_DEVBUF);
1126 emu_memstart(struct sc_info *sc, void *buf)
1128 struct emu_mem *mem = &sc->mem;
1129 struct emu_memblk *blk, *i;
1132 SLIST_FOREACH(i, &mem->blocks, link) {
1138 return blk->pte_start;
1142 emu_addefxop(struct sc_info *sc, int op, int z, int w, int x, int y, u_int32_t *pc)
1144 emu_wrefx(sc, (*pc) * 2, (x << 10) | y);
1145 emu_wrefx(sc, (*pc) * 2 + 1, (op << 20) | (z << 10) | w);
1150 emu_initefx(struct sc_info *sc)
1155 for (i = 0; i < 512; i++) {
1156 emu_wrefx(sc, i * 2, 0x10040);
1157 emu_wrefx(sc, i * 2 + 1, 0x610040);
1160 for (i = 0; i < 256; i++)
1161 emu_wrptr(sc, 0, FXGPREGBASE + i, 0);
1163 /* FX-8010 DSP Registers:
1165 0x000-0x00f : 16 registers
1167 0x010/0x011 : AC97 Codec (l/r)
1168 0x012/0x013 : ADC, S/PDIF (l/r)
1169 0x014/0x015 : Mic(left), Zoom (l/r)
1170 0x016/0x017 : APS S/PDIF?? (l/r)
1172 0x020/0x021 : AC97 Output (l/r)
1173 0x022/0x023 : TOS link out (l/r)
1174 0x024/0x025 : ??? (l/r)
1175 0x026/0x027 : LiveDrive Headphone (l/r)
1176 0x028/0x029 : Rear Channel (l/r)
1177 0x02a/0x02b : ADC Recording Buffer (l/r)
1179 0x040 - 0x044 = 0 - 4
1180 0x045 = 0x8, 0x046 = 0x10, 0x047 = 0x20
1181 0x048 = 0x100, 0x049 = 0x10000, 0x04a = 0x80000
1182 0x04b = 0x10000000, 0x04c = 0x20000000, 0x04d = 0x40000000
1183 0x04e = 0x80000000, 0x04f = 0x7fffffff
1186 0x058 : Noise source?
1187 0x059 : Noise source?
1188 General Purpose Registers
1190 Tank Memory Data Registers
1192 Tank Memory Address Registers
1197 0 : z := w + (x * y >> 31)
1202 /* Routing - this will be configurable in later version */
1204 /* GPR[0/1] = FX * 4 + SPDIF-in */
1205 emu_addefxop(sc, 4, 0x100, 0x12, 0, 0x44, &pc);
1206 emu_addefxop(sc, 4, 0x101, 0x13, 1, 0x44, &pc);
1207 /* GPR[0/1] += APS-input */
1208 emu_addefxop(sc, 6, 0x100, 0x100, 0x40, sc->APS ? 0x16 : 0x40, &pc);
1209 emu_addefxop(sc, 6, 0x101, 0x101, 0x40, sc->APS ? 0x17 : 0x40, &pc);
1210 /* FrontOut (AC97) = GPR[0/1] */
1211 emu_addefxop(sc, 6, 0x20, 0x40, 0x40, 0x100, &pc);
1212 emu_addefxop(sc, 6, 0x21, 0x40, 0x41, 0x101, &pc);
1213 /* RearOut = (GPR[0/1] * RearVolume) >> 31 */
1214 /* RearVolume = GRP[0x10/0x11] */
1215 emu_addefxop(sc, 0, 0x28, 0x40, 0x110, 0x100, &pc);
1216 emu_addefxop(sc, 0, 0x29, 0x40, 0x111, 0x101, &pc);
1217 /* TOS out = GPR[0/1] */
1218 emu_addefxop(sc, 6, 0x22, 0x40, 0x40, 0x100, &pc);
1219 emu_addefxop(sc, 6, 0x23, 0x40, 0x40, 0x101, &pc);
1221 emu_addefxop(sc, 6, 0x24, 0x40, 0x40, 0x40, &pc);
1222 emu_addefxop(sc, 6, 0x25, 0x40, 0x40, 0x40, &pc);
1224 emu_addefxop(sc, 6, 0x26, 0x40, 0x40, 0x40, &pc);
1225 emu_addefxop(sc, 6, 0x27, 0x40, 0x40, 0x40, &pc);
1226 /* Input0 (AC97) -> Record */
1227 emu_addefxop(sc, 6, 0x2a, 0x40, 0x40, 0x10, &pc);
1228 emu_addefxop(sc, 6, 0x2b, 0x40, 0x40, 0x11, &pc);
1230 emu_wrptr(sc, 0, DBG, 0);
1233 /* Probe and attach the card */
1235 emu_init(struct sc_info *sc)
1237 u_int32_t spcs, ch, tmp, i;
1239 /* disable audio and lock cache */
1240 emu_wr(sc, HCFG, HCFG_LOCKSOUNDCACHE | HCFG_LOCKTANKCACHE | HCFG_MUTEBUTTONENABLE, 4);
1242 /* reset recording buffers */
1243 emu_wrptr(sc, 0, MICBS, ADCBS_BUFSIZE_NONE);
1244 emu_wrptr(sc, 0, MICBA, 0);
1245 emu_wrptr(sc, 0, FXBS, ADCBS_BUFSIZE_NONE);
1246 emu_wrptr(sc, 0, FXBA, 0);
1247 emu_wrptr(sc, 0, ADCBS, ADCBS_BUFSIZE_NONE);
1248 emu_wrptr(sc, 0, ADCBA, 0);
1250 /* disable channel interrupt */
1251 emu_wr(sc, INTE, INTE_INTERVALTIMERENB | INTE_SAMPLERATETRACKER | INTE_PCIERRORENABLE, 4);
1252 emu_wrptr(sc, 0, CLIEL, 0);
1253 emu_wrptr(sc, 0, CLIEH, 0);
1254 emu_wrptr(sc, 0, SOLEL, 0);
1255 emu_wrptr(sc, 0, SOLEH, 0);
1257 /* init envelope engine */
1258 for (ch = 0; ch < NUM_G; ch++) {
1259 emu_wrptr(sc, ch, DCYSUSV, ENV_OFF);
1260 emu_wrptr(sc, ch, IP, 0);
1261 emu_wrptr(sc, ch, VTFT, 0xffff);
1262 emu_wrptr(sc, ch, CVCF, 0xffff);
1263 emu_wrptr(sc, ch, PTRX, 0);
1264 emu_wrptr(sc, ch, CPF, 0);
1265 emu_wrptr(sc, ch, CCR, 0);
1267 emu_wrptr(sc, ch, PSST, 0);
1268 emu_wrptr(sc, ch, DSL, 0x10);
1269 emu_wrptr(sc, ch, CCCA, 0);
1270 emu_wrptr(sc, ch, Z1, 0);
1271 emu_wrptr(sc, ch, Z2, 0);
1272 emu_wrptr(sc, ch, FXRT, 0xd01c0000);
1274 emu_wrptr(sc, ch, ATKHLDM, 0);
1275 emu_wrptr(sc, ch, DCYSUSM, 0);
1276 emu_wrptr(sc, ch, IFATN, 0xffff);
1277 emu_wrptr(sc, ch, PEFE, 0);
1278 emu_wrptr(sc, ch, FMMOD, 0);
1279 emu_wrptr(sc, ch, TREMFRQ, 24); /* 1 Hz */
1280 emu_wrptr(sc, ch, FM2FRQ2, 24); /* 1 Hz */
1281 emu_wrptr(sc, ch, TEMPENV, 0);
1283 /*** these are last so OFF prevents writing ***/
1284 emu_wrptr(sc, ch, LFOVAL2, 0);
1285 emu_wrptr(sc, ch, LFOVAL1, 0);
1286 emu_wrptr(sc, ch, ATKHLDV, 0);
1287 emu_wrptr(sc, ch, ENVVOL, 0);
1288 emu_wrptr(sc, ch, ENVVAL, 0);
1290 sc->voice[ch].vnum = ch;
1291 sc->voice[ch].slave = NULL;
1292 sc->voice[ch].busy = 0;
1293 sc->voice[ch].ismaster = 0;
1294 sc->voice[ch].running = 0;
1295 sc->voice[ch].b16 = 0;
1296 sc->voice[ch].stereo = 0;
1297 sc->voice[ch].speed = 0;
1298 sc->voice[ch].start = 0;
1299 sc->voice[ch].end = 0;
1300 sc->voice[ch].channel = NULL;
1302 sc->pnum = sc->rnum = 0;
1305 * Init to 0x02109204 :
1306 * Clock accuracy = 0 (1000ppm)
1307 * Sample Rate = 2 (48kHz)
1308 * Audio Channel = 1 (Left of 2)
1309 * Source Number = 0 (Unspecified)
1310 * Generation Status = 1 (Original for Cat Code 12)
1311 * Cat Code = 12 (Digital Signal Mixer)
1313 * Emphasis = 0 (None)
1314 * CP = 1 (Copyright unasserted)
1315 * AN = 0 (Audio data)
1318 spcs = SPCS_CLKACCY_1000PPM | SPCS_SAMPLERATE_48 |
1319 SPCS_CHANNELNUM_LEFT | SPCS_SOURCENUM_UNSPEC |
1320 SPCS_GENERATIONSTATUS | 0x00001200 | 0x00000000 |
1321 SPCS_EMPHASIS_NONE | SPCS_COPYRIGHT;
1322 emu_wrptr(sc, 0, SPCS0, spcs);
1323 emu_wrptr(sc, 0, SPCS1, spcs);
1324 emu_wrptr(sc, 0, SPCS2, spcs);
1328 SLIST_INIT(&sc->mem.blocks);
1329 sc->mem.ptb_pages = emu_malloc(sc, MAXPAGES * sizeof(u_int32_t));
1330 if (sc->mem.ptb_pages == NULL)
1333 sc->mem.silent_page = emu_malloc(sc, EMUPAGESIZE);
1334 if (sc->mem.silent_page == NULL) {
1335 emu_free(sc, sc->mem.ptb_pages);
1338 /* Clear page with silence & setup all pointers to this page */
1339 bzero(sc->mem.silent_page, EMUPAGESIZE);
1340 tmp = (u_int32_t)vtophys(sc->mem.silent_page) << 1;
1341 for (i = 0; i < MAXPAGES; i++)
1342 sc->mem.ptb_pages[i] = tmp | i;
1344 emu_wrptr(sc, 0, PTB, vtophys(sc->mem.ptb_pages));
1345 emu_wrptr(sc, 0, TCB, 0); /* taken from original driver */
1346 emu_wrptr(sc, 0, TCBS, 0); /* taken from original driver */
1348 for (ch = 0; ch < NUM_G; ch++) {
1349 emu_wrptr(sc, ch, MAPA, tmp | MAP_PTI_MASK);
1350 emu_wrptr(sc, ch, MAPB, tmp | MAP_PTI_MASK);
1353 /* emu_memalloc(sc, EMUPAGESIZE); */
1355 * Hokay, now enable the AUD bit
1357 * Mute Disable Audio = 0
1358 * Lock Tank Memory = 1
1359 * Lock Sound Memory = 0
1362 tmp = HCFG_AUDIOENABLE | HCFG_LOCKTANKCACHE | HCFG_AUTOMUTE;
1364 tmp |= HCFG_JOYENABLE;
1365 emu_wr(sc, HCFG, tmp, 4);
1367 /* TOSLink detection */
1369 tmp = emu_rd(sc, HCFG, 4);
1370 if (tmp & (HCFG_GPINPUT0 | HCFG_GPINPUT1)) {
1371 emu_wr(sc, HCFG, tmp | 0x800, 4);
1373 if (tmp != (emu_rd(sc, HCFG, 4) & ~0x800)) {
1375 emu_wr(sc, HCFG, tmp, 4);
1383 emu_uninit(struct sc_info *sc)
1387 emu_wr(sc, INTE, 0, 4);
1388 for (ch = 0; ch < NUM_G; ch++)
1389 emu_wrptr(sc, ch, DCYSUSV, ENV_OFF);
1390 for (ch = 0; ch < NUM_G; ch++) {
1391 emu_wrptr(sc, ch, VTFT, 0);
1392 emu_wrptr(sc, ch, CVCF, 0);
1393 emu_wrptr(sc, ch, PTRX, 0);
1394 emu_wrptr(sc, ch, CPF, 0);
1397 /* disable audio and lock cache */
1398 emu_wr(sc, HCFG, HCFG_LOCKSOUNDCACHE | HCFG_LOCKTANKCACHE | HCFG_MUTEBUTTONENABLE, 4);
1400 emu_wrptr(sc, 0, PTB, 0);
1401 /* reset recording buffers */
1402 emu_wrptr(sc, 0, MICBS, ADCBS_BUFSIZE_NONE);
1403 emu_wrptr(sc, 0, MICBA, 0);
1404 emu_wrptr(sc, 0, FXBS, ADCBS_BUFSIZE_NONE);
1405 emu_wrptr(sc, 0, FXBA, 0);
1406 emu_wrptr(sc, 0, FXWC, 0);
1407 emu_wrptr(sc, 0, ADCBS, ADCBS_BUFSIZE_NONE);
1408 emu_wrptr(sc, 0, ADCBA, 0);
1409 emu_wrptr(sc, 0, TCB, 0);
1410 emu_wrptr(sc, 0, TCBS, 0);
1412 /* disable channel interrupt */
1413 emu_wrptr(sc, 0, CLIEL, 0);
1414 emu_wrptr(sc, 0, CLIEH, 0);
1415 emu_wrptr(sc, 0, SOLEL, 0);
1416 emu_wrptr(sc, 0, SOLEH, 0);
1418 /* init envelope engine */
1419 if (!SLIST_EMPTY(&sc->mem.blocks))
1420 device_printf(sc->dev, "warning: memblock list not empty\n");
1421 emu_free(sc, sc->mem.ptb_pages);
1422 emu_free(sc, sc->mem.silent_page);
1428 emu_pci_probe(device_t dev)
1432 switch (pci_get_devid(dev)) {
1433 case EMU10K1_PCI_ID:
1434 s = "Creative EMU10K1";
1437 case EMU10K2_PCI_ID:
1438 s = "Creative EMU10K2";
1445 device_set_desc(dev, s);
1450 emu_pci_attach(device_t dev)
1452 struct ac97_info *codec = NULL;
1456 char status[SND_STATUSLEN];
1458 if ((sc = malloc(sizeof(*sc), M_DEVBUF, M_WAITOK | M_ZERO)) == NULL) {
1459 device_printf(dev, "cannot allocate softc\n");
1463 sc->lock = snd_mtxcreate(device_get_nameunit(dev), "sound softc");
1465 sc->type = pci_get_devid(dev);
1466 sc->rev = pci_get_revid(dev);
1468 data = pci_read_config(dev, PCIR_COMMAND, 2);
1469 data |= (PCIM_CMD_PORTEN | PCIM_CMD_BUSMASTEREN);
1470 pci_write_config(dev, PCIR_COMMAND, data, 2);
1471 data = pci_read_config(dev, PCIR_COMMAND, 2);
1474 sc->reg = bus_alloc_resource(dev, SYS_RES_IOPORT, &i, 0, ~0, 1, RF_ACTIVE);
1475 if (sc->reg == NULL) {
1476 device_printf(dev, "unable to map register space\n");
1479 sc->st = rman_get_bustag(sc->reg);
1480 sc->sh = rman_get_bushandle(sc->reg);
1482 sc->bufsz = pcm_getbuffersize(dev, 4096, EMU_DEFAULT_BUFSZ, 65536);
1484 if (bus_dma_tag_create(/*parent*/NULL, /*alignment*/2, /*boundary*/0,
1485 /*lowaddr*/1 << 31, /* can only access 0-2gb */
1486 /*highaddr*/BUS_SPACE_MAXADDR,
1487 /*filter*/NULL, /*filterarg*/NULL,
1488 /*maxsize*/sc->bufsz, /*nsegments*/1, /*maxsegz*/0x3ffff,
1489 /*flags*/0, &sc->parent_dmat) != 0) {
1490 device_printf(dev, "unable to create dma tag\n");
1494 if (emu_init(sc) == -1) {
1495 device_printf(dev, "unable to initialize the card\n");
1499 codec = AC97_CREATE(dev, sc, emu_ac97);
1500 if (codec == NULL) goto bad;
1501 gotmic = (ac97_getcaps(codec) & AC97_CAP_MICCHANNEL)? 1 : 0;
1502 if (mixer_init(dev, ac97_getmixerclass(), codec) == -1) goto bad;
1505 sc->irq = bus_alloc_resource(dev, SYS_RES_IRQ, &i, 0, ~0, 1, RF_ACTIVE | RF_SHAREABLE);
1506 if (!sc->irq || snd_setup_intr(dev, sc->irq, INTR_MPSAFE, emu_intr, sc, &sc->ih)) {
1507 device_printf(dev, "unable to map interrupt\n");
1511 snprintf(status, SND_STATUSLEN, "at io 0x%lx irq %ld", rman_get_start(sc->reg), rman_get_start(sc->irq));
1513 if (pcm_register(dev, sc, EMU_CHANS, gotmic? 3 : 2)) goto bad;
1514 for (i = 0; i < EMU_CHANS; i++)
1515 pcm_addchan(dev, PCMDIR_PLAY, &emupchan_class, sc);
1516 for (i = 0; i < (gotmic? 3 : 2); i++)
1517 pcm_addchan(dev, PCMDIR_REC, &emurchan_class, sc);
1519 pcm_setstatus(dev, status);
1524 if (codec) ac97_destroy(codec);
1525 if (sc->reg) bus_release_resource(dev, SYS_RES_IOPORT, PCIR_MAPS, sc->reg);
1526 if (sc->ih) bus_teardown_intr(dev, sc->irq, sc->ih);
1527 if (sc->irq) bus_release_resource(dev, SYS_RES_IRQ, 0, sc->irq);
1528 if (sc->parent_dmat) bus_dma_tag_destroy(sc->parent_dmat);
1529 if (sc->lock) snd_mtxfree(sc->lock);
1535 emu_pci_detach(device_t dev)
1540 r = pcm_unregister(dev);
1544 sc = pcm_getdevinfo(dev);
1548 bus_release_resource(dev, SYS_RES_IOPORT, PCIR_MAPS, sc->reg);
1549 bus_teardown_intr(dev, sc->irq, sc->ih);
1550 bus_release_resource(dev, SYS_RES_IRQ, 0, sc->irq);
1551 bus_dma_tag_destroy(sc->parent_dmat);
1552 snd_mtxfree(sc->lock);
1558 /* add suspend, resume */
1559 static device_method_t emu_methods[] = {
1560 /* Device interface */
1561 DEVMETHOD(device_probe, emu_pci_probe),
1562 DEVMETHOD(device_attach, emu_pci_attach),
1563 DEVMETHOD(device_detach, emu_pci_detach),
1568 static driver_t emu_driver = {
1574 DRIVER_MODULE(snd_emu10k1, pci, emu_driver, pcm_devclass, 0, 0);
1575 MODULE_DEPEND(snd_emu10k1, snd_pcm, PCM_MINVER, PCM_PREFVER, PCM_MAXVER);
1576 MODULE_VERSION(snd_emu10k1, 1);
1578 /* dummy driver to silence the joystick device */
1580 emujoy_pci_probe(device_t dev)
1584 switch (pci_get_devid(dev)) {
1586 s = "Creative EMU10K1 Joystick";
1590 s = "Creative EMU10K2 Joystick";
1595 if (s) device_set_desc(dev, s);
1596 return s? -1000 : ENXIO;
1600 emujoy_pci_attach(device_t dev)
1606 emujoy_pci_detach(device_t dev)
1611 static device_method_t emujoy_methods[] = {
1612 DEVMETHOD(device_probe, emujoy_pci_probe),
1613 DEVMETHOD(device_attach, emujoy_pci_attach),
1614 DEVMETHOD(device_detach, emujoy_pci_detach),
1619 static driver_t emujoy_driver = {
1625 static devclass_t emujoy_devclass;
1627 DRIVER_MODULE(emujoy, pci, emujoy_driver, emujoy_devclass, 0, 0);