The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/dev/sound/pci/emu10k1.c

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /*-
    2  * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
    3  *
    4  * Copyright (c) 2004 David O'Brien <obrien@FreeBSD.org>
    5  * Copyright (c) 2003 Orlando Bassotto <orlando.bassotto@ieo-research.it>
    6  * Copyright (c) 1999 Cameron Grant <cg@freebsd.org>
    7  * All rights reserved.
    8  *
    9  * Redistribution and use in source and binary forms, with or without
   10  * modification, are permitted provided that the following conditions
   11  * are met:
   12  * 1. Redistributions of source code must retain the above copyright
   13  *    notice, this list of conditions and the following disclaimer.
   14  * 2. Redistributions in binary form must reproduce the above copyright
   15  *    notice, this list of conditions and the following disclaimer in the
   16  *    documentation and/or other materials provided with the distribution.
   17  *
   18  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
   19  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   20  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   21  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
   22  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
   23  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
   24  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   25  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHERIN CONTRACT, STRICT
   26  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
   27  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   28  * SUCH DAMAGE.
   29  */
   30 
   31 #ifdef HAVE_KERNEL_OPTION_HEADERS
   32 #include "opt_snd.h"
   33 #endif
   34 
   35 #include <dev/sound/pcm/sound.h>
   36 #include <dev/sound/pcm/ac97.h>
   37 #include <dev/sound/pci/emuxkireg.h>
   38 
   39 #include <dev/pci/pcireg.h>
   40 #include <dev/pci/pcivar.h>
   41 #include <sys/queue.h>
   42 
   43 #include <dev/sound/midi/mpu401.h>
   44 #include "mpufoi_if.h"
   45 
   46 SND_DECLARE_FILE("$FreeBSD$");
   47 
   48 /* -------------------------------------------------------------------- */
   49 
   50 #define NUM_G           64      /* use all channels */
   51 #define WAVEOUT_MAXBUFSIZE 32768
   52 #define EMUPAGESIZE     4096    /* don't change */
   53 #define EMUMAXPAGES     (WAVEOUT_MAXBUFSIZE * NUM_G / EMUPAGESIZE)
   54 #define EMU10K1_PCI_ID  0x00021102      /* 1102 => Creative Labs Vendor ID */
   55 #define EMU10K2_PCI_ID  0x00041102      
   56 #define EMU10K3_PCI_ID  0x00081102      
   57 #define EMU_DEFAULT_BUFSZ       4096
   58 #define EMU_MAX_CHANS   8
   59 #define EMU_CHANS       4
   60 
   61 #define MAXREQVOICES    8
   62 #define RESERVED        0
   63 #define NUM_MIDI        16
   64 #define NUM_FXSENDS     4
   65 
   66 #define TMEMSIZE        256*1024
   67 #define TMEMSIZEREG     4
   68 
   69 #define ENABLE          0xffffffff
   70 #define DISABLE         0x00000000
   71 #define ENV_ON          EMU_CHAN_DCYSUSV_CHANNELENABLE_MASK
   72 #define ENV_OFF         0x00    /* XXX: should this be 1? */
   73 
   74 #define EMU_A_IOCFG_GPOUT_A     0x40
   75 #define EMU_A_IOCFG_GPOUT_D     0x04
   76 #define EMU_A_IOCFG_GPOUT_AD (EMU_A_IOCFG_GPOUT_A|EMU_A_IOCFG_GPOUT_D)  /* EMU_A_IOCFG_GPOUT0 */
   77 
   78 #define EMU_HCFG_GPOUT1         0x00000800
   79 
   80 /* instruction set */
   81 #define iACC3    0x06
   82 #define iMACINT0 0x04
   83 #define iINTERP  0x0e
   84 
   85 #define C_00000000      0x40
   86 #define C_00000001      0x41
   87 #define C_00000004      0x44
   88 #define C_40000000      0x4d
   89 /* Audigy constants */
   90 #define A_C_00000000    0xc0
   91 #define A_C_40000000    0xcd
   92 
   93 /* GPRs */
   94 #define FXBUS(x)        (0x00 + (x))
   95 #define EXTIN(x)        (0x10 + (x))
   96 #define EXTOUT(x)       (0x20 + (x))
   97 
   98 #define GPR(x)          (EMU_FXGPREGBASE + (x))
   99 #define A_EXTIN(x)      (0x40 + (x))
  100 #define A_FXBUS(x)      (0x00 + (x))
  101 #define A_EXTOUT(x)     (0x60 + (x))
  102 #define A_GPR(x)        (EMU_A_FXGPREGBASE + (x))
  103 
  104 /* FX buses */
  105 #define FXBUS_PCM_LEFT          0x00
  106 #define FXBUS_PCM_RIGHT         0x01
  107 #define FXBUS_MIDI_LEFT         0x04
  108 #define FXBUS_MIDI_RIGHT        0x05
  109 #define FXBUS_MIDI_REVERB       0x0c
  110 #define FXBUS_MIDI_CHORUS       0x0d
  111 
  112 /* Inputs */
  113 #define EXTIN_AC97_L            0x00
  114 #define EXTIN_AC97_R            0x01
  115 #define EXTIN_SPDIF_CD_L        0x02
  116 #define EXTIN_SPDIF_CD_R        0x03
  117 #define EXTIN_TOSLINK_L         0x06
  118 #define EXTIN_TOSLINK_R         0x07
  119 #define EXTIN_COAX_SPDIF_L      0x0a
  120 #define EXTIN_COAX_SPDIF_R      0x0b
  121 /* Audigy Inputs */
  122 #define A_EXTIN_AC97_L          0x00
  123 #define A_EXTIN_AC97_R          0x01
  124 
  125 /* Outputs */
  126 #define EXTOUT_AC97_L      0x00
  127 #define EXTOUT_AC97_R      0x01
  128 #define EXTOUT_TOSLINK_L   0x02
  129 #define EXTOUT_TOSLINK_R   0x03
  130 #define EXTOUT_AC97_CENTER 0x04
  131 #define EXTOUT_AC97_LFE    0x05
  132 #define EXTOUT_HEADPHONE_L 0x06
  133 #define EXTOUT_HEADPHONE_R 0x07
  134 #define EXTOUT_REAR_L      0x08
  135 #define EXTOUT_REAR_R      0x09
  136 #define EXTOUT_ADC_CAP_L   0x0a
  137 #define EXTOUT_ADC_CAP_R   0x0b
  138 #define EXTOUT_ACENTER     0x11
  139 #define EXTOUT_ALFE        0x12
  140 /* Audigy Outputs */
  141 #define A_EXTOUT_FRONT_L        0x00
  142 #define A_EXTOUT_FRONT_R        0x01
  143 #define A_EXTOUT_CENTER         0x02
  144 #define A_EXTOUT_LFE            0x03
  145 #define A_EXTOUT_HEADPHONE_L    0x04
  146 #define A_EXTOUT_HEADPHONE_R    0x05
  147 #define A_EXTOUT_REAR_L         0x06
  148 #define A_EXTOUT_REAR_R         0x07
  149 #define A_EXTOUT_AFRONT_L       0x08
  150 #define A_EXTOUT_AFRONT_R       0x09
  151 #define A_EXTOUT_ACENTER        0x0a
  152 #define A_EXTOUT_ALFE           0x0b
  153 #define A_EXTOUT_AREAR_L        0x0e
  154 #define A_EXTOUT_AREAR_R        0x0f
  155 #define A_EXTOUT_AC97_L         0x10
  156 #define A_EXTOUT_AC97_R         0x11
  157 #define A_EXTOUT_ADC_CAP_L      0x16
  158 #define A_EXTOUT_ADC_CAP_R      0x17
  159 
  160 struct emu_memblk {
  161         SLIST_ENTRY(emu_memblk) link;
  162         void *buf;
  163         bus_addr_t buf_addr;
  164         u_int32_t pte_start, pte_size;
  165         bus_dmamap_t buf_map;
  166 };
  167 
  168 struct emu_mem {
  169         u_int8_t bmap[EMUMAXPAGES / 8];
  170         u_int32_t *ptb_pages;
  171         void *silent_page;
  172         bus_addr_t silent_page_addr;
  173         bus_addr_t ptb_pages_addr;
  174         bus_dmamap_t ptb_map;
  175         bus_dmamap_t silent_map;
  176         SLIST_HEAD(, emu_memblk) blocks;
  177 };
  178 
  179 struct emu_voice {
  180         int vnum;
  181         unsigned int b16:1, stereo:1, busy:1, running:1, ismaster:1;
  182         int speed;
  183         int start, end, vol;
  184         int fxrt1;      /* FX routing */
  185         int fxrt2;      /* FX routing (only for audigy) */
  186         u_int32_t buf;
  187         struct emu_voice *slave;
  188         struct pcm_channel *channel;
  189 };
  190 
  191 struct sc_info;
  192 
  193 /* channel registers */
  194 struct sc_pchinfo {
  195         int spd, fmt, blksz, run;
  196         struct emu_voice *master, *slave;
  197         struct snd_dbuf *buffer;
  198         struct pcm_channel *channel;
  199         struct sc_info *parent;
  200 };
  201 
  202 struct sc_rchinfo {
  203         int spd, fmt, run, blksz, num;
  204         u_int32_t idxreg, basereg, sizereg, setupreg, irqmask;
  205         struct snd_dbuf *buffer;
  206         struct pcm_channel *channel;
  207         struct sc_info *parent;
  208 };
  209 
  210 /* device private data */
  211 struct sc_info {
  212         device_t        dev;
  213         u_int32_t       type, rev;
  214         u_int32_t       tos_link:1, APS:1, audigy:1, audigy2:1;
  215         u_int32_t       addrmask;       /* wider if audigy */
  216 
  217         bus_space_tag_t st;
  218         bus_space_handle_t sh;
  219         bus_dma_tag_t parent_dmat;
  220 
  221         struct resource *reg, *irq;
  222         void            *ih;
  223         struct mtx      *lock;
  224 
  225         unsigned int bufsz;
  226         int timer, timerinterval;
  227         int pnum, rnum;
  228         int nchans;
  229         struct emu_mem mem;
  230         struct emu_voice voice[64];
  231         struct sc_pchinfo pch[EMU_MAX_CHANS];
  232         struct sc_rchinfo rch[3];
  233         struct mpu401   *mpu;
  234         mpu401_intr_t           *mpu_intr;
  235         int mputx;
  236 };
  237 
  238 /* -------------------------------------------------------------------- */
  239 
  240 /*
  241  * prototypes
  242  */
  243 
  244 /* stuff */
  245 static int emu_init(struct sc_info *);
  246 static void emu_intr(void *);
  247 static void *emu_malloc(struct sc_info *sc, u_int32_t sz, bus_addr_t *addr, bus_dmamap_t *map);
  248 static void *emu_memalloc(struct sc_info *sc, u_int32_t sz, bus_addr_t *addr);
  249 static int emu_memfree(struct sc_info *sc, void *buf);
  250 static int emu_memstart(struct sc_info *sc, void *buf);
  251 #ifdef EMUDEBUG
  252 static void emu_vdump(struct sc_info *sc, struct emu_voice *v);
  253 #endif
  254 
  255 /* talk to the card */
  256 static u_int32_t emu_rd(struct sc_info *, int, int);
  257 static void emu_wr(struct sc_info *, int, u_int32_t, int);
  258 
  259 /* -------------------------------------------------------------------- */
  260 
  261 static u_int32_t emu_rfmt_ac97[] = {
  262         SND_FORMAT(AFMT_S16_LE, 1, 0),
  263         SND_FORMAT(AFMT_S16_LE, 2, 0),
  264         0
  265 };
  266 
  267 static u_int32_t emu_rfmt_mic[] = {
  268         SND_FORMAT(AFMT_U8, 1, 0),
  269         0
  270 };
  271 
  272 static u_int32_t emu_rfmt_efx[] = {
  273         SND_FORMAT(AFMT_S16_LE, 2, 0),
  274         0
  275 };
  276 
  277 static struct pcmchan_caps emu_reccaps[3] = {
  278         {8000, 48000, emu_rfmt_ac97, 0},
  279         {8000, 8000, emu_rfmt_mic, 0},
  280         {48000, 48000, emu_rfmt_efx, 0},
  281 };
  282 
  283 static u_int32_t emu_pfmt[] = {
  284         SND_FORMAT(AFMT_U8, 1, 0),
  285         SND_FORMAT(AFMT_U8, 2, 0),
  286         SND_FORMAT(AFMT_S16_LE, 1, 0),
  287         SND_FORMAT(AFMT_S16_LE, 2, 0),
  288         0
  289 };
  290 
  291 static struct pcmchan_caps emu_playcaps = {4000, 48000, emu_pfmt, 0};
  292 
  293 static int adcspeed[8] = {48000, 44100, 32000, 24000, 22050, 16000, 11025, 8000};
  294 /* audigy supports 12kHz. */
  295 static int audigy_adcspeed[9] = {
  296         48000, 44100, 32000, 24000, 22050, 16000, 12000, 11025, 8000
  297 };
  298 
  299 /* -------------------------------------------------------------------- */
  300 /* Hardware */
  301 static u_int32_t
  302 emu_rd(struct sc_info *sc, int regno, int size)
  303 {
  304         switch (size) {
  305         case 1:
  306                 return bus_space_read_1(sc->st, sc->sh, regno);
  307         case 2:
  308                 return bus_space_read_2(sc->st, sc->sh, regno);
  309         case 4:
  310                 return bus_space_read_4(sc->st, sc->sh, regno);
  311         default:
  312                 return 0xffffffff;
  313         }
  314 }
  315 
  316 static void
  317 emu_wr(struct sc_info *sc, int regno, u_int32_t data, int size)
  318 {
  319         switch (size) {
  320         case 1:
  321                 bus_space_write_1(sc->st, sc->sh, regno, data);
  322                 break;
  323         case 2:
  324                 bus_space_write_2(sc->st, sc->sh, regno, data);
  325                 break;
  326         case 4:
  327                 bus_space_write_4(sc->st, sc->sh, regno, data);
  328                 break;
  329         }
  330 }
  331 
  332 static u_int32_t
  333 emu_rdptr(struct sc_info *sc, int chn, int reg)
  334 {
  335         u_int32_t ptr, val, mask, size, offset;
  336 
  337         ptr = ((reg << 16) & sc->addrmask) | (chn & EMU_PTR_CHNO_MASK);
  338         emu_wr(sc, EMU_PTR, ptr, 4);
  339         val = emu_rd(sc, EMU_DATA, 4);
  340         if (reg & 0xff000000) {
  341                 size = (reg >> 24) & 0x3f;
  342                 offset = (reg >> 16) & 0x1f;
  343                 mask = ((1 << size) - 1) << offset;
  344                 val &= mask;
  345                 val >>= offset;
  346         }
  347         return val;
  348 }
  349 
  350 static void
  351 emu_wrptr(struct sc_info *sc, int chn, int reg, u_int32_t data)
  352 {
  353         u_int32_t ptr, mask, size, offset;
  354 
  355         ptr = ((reg << 16) & sc->addrmask) | (chn & EMU_PTR_CHNO_MASK);
  356         emu_wr(sc, EMU_PTR, ptr, 4);
  357         if (reg & 0xff000000) {
  358                 size = (reg >> 24) & 0x3f;
  359                 offset = (reg >> 16) & 0x1f;
  360                 mask = ((1 << size) - 1) << offset;
  361                 data <<= offset;
  362                 data &= mask;
  363                 data |= emu_rd(sc, EMU_DATA, 4) & ~mask;
  364         }
  365         emu_wr(sc, EMU_DATA, data, 4);
  366 }
  367 
  368 static void
  369 emu_wrefx(struct sc_info *sc, unsigned int pc, unsigned int data)
  370 {
  371         pc += sc->audigy ? EMU_A_MICROCODEBASE : EMU_MICROCODEBASE;
  372         emu_wrptr(sc, 0, pc, data);
  373 }
  374 
  375 /* -------------------------------------------------------------------- */
  376 /* ac97 codec */
  377 /* no locking needed */
  378 
  379 static int
  380 emu_rdcd(kobj_t obj, void *devinfo, int regno)
  381 {
  382         struct sc_info *sc = (struct sc_info *)devinfo;
  383 
  384         emu_wr(sc, EMU_AC97ADDR, regno, 1);
  385         return emu_rd(sc, EMU_AC97DATA, 2);
  386 }
  387 
  388 static int
  389 emu_wrcd(kobj_t obj, void *devinfo, int regno, u_int32_t data)
  390 {
  391         struct sc_info *sc = (struct sc_info *)devinfo;
  392 
  393         emu_wr(sc, EMU_AC97ADDR, regno, 1);
  394         emu_wr(sc, EMU_AC97DATA, data, 2);
  395         return 0;
  396 }
  397 
  398 static kobj_method_t emu_ac97_methods[] = {
  399         KOBJMETHOD(ac97_read,           emu_rdcd),
  400         KOBJMETHOD(ac97_write,          emu_wrcd),
  401         KOBJMETHOD_END
  402 };
  403 AC97_DECLARE(emu_ac97);
  404 
  405 /* -------------------------------------------------------------------- */
  406 /* stuff */
  407 static int
  408 emu_settimer(struct sc_info *sc)
  409 {
  410         struct sc_pchinfo *pch;
  411         struct sc_rchinfo *rch;
  412         int i, tmp, rate;
  413 
  414         rate = 0;
  415         for (i = 0; i < sc->nchans; i++) {
  416                 pch = &sc->pch[i];
  417                 if (pch->buffer) {
  418                         tmp = (pch->spd * sndbuf_getalign(pch->buffer))
  419                             / pch->blksz;
  420                         if (tmp > rate)
  421                                 rate = tmp;
  422                 }
  423         }
  424 
  425         for (i = 0; i < 3; i++) {
  426                 rch = &sc->rch[i];
  427                 if (rch->buffer) {
  428                         tmp = (rch->spd * sndbuf_getalign(rch->buffer))
  429                             / rch->blksz;
  430                         if (tmp > rate)
  431                                 rate = tmp;
  432                 }
  433         }
  434         RANGE(rate, 48, 9600);
  435         sc->timerinterval = 48000 / rate;
  436         emu_wr(sc, EMU_TIMER, sc->timerinterval & 0x03ff, 2);
  437 
  438         return sc->timerinterval;
  439 }
  440 
  441 static int
  442 emu_enatimer(struct sc_info *sc, int go)
  443 {
  444         u_int32_t x;
  445         if (go) {
  446                 if (sc->timer++ == 0) {
  447                         x = emu_rd(sc, EMU_INTE, 4);
  448                         x |= EMU_INTE_INTERTIMERENB;
  449                         emu_wr(sc, EMU_INTE, x, 4);
  450                 }
  451         } else {
  452                 sc->timer = 0;
  453                 x = emu_rd(sc, EMU_INTE, 4);
  454                 x &= ~EMU_INTE_INTERTIMERENB;
  455                 emu_wr(sc, EMU_INTE, x, 4);
  456         }
  457         return 0;
  458 }
  459 
  460 static void
  461 emu_enastop(struct sc_info *sc, char channel, int enable)
  462 {
  463         int reg = (channel & 0x20) ? EMU_SOLEH : EMU_SOLEL;
  464         channel &= 0x1f;
  465         reg |= 1 << 24;
  466         reg |= channel << 16;
  467         emu_wrptr(sc, 0, reg, enable);
  468 }
  469 
  470 static int
  471 emu_recval(int speed) {
  472         int val;
  473 
  474         val = 0;
  475         while (val < 7 && speed < adcspeed[val])
  476                 val++;
  477         return val;
  478 }
  479 
  480 static int
  481 audigy_recval(int speed) {
  482         int val;
  483 
  484         val = 0;
  485         while (val < 8 && speed < audigy_adcspeed[val])
  486                 val++;
  487         return val;
  488 }
  489 
  490 static u_int32_t
  491 emu_rate_to_pitch(u_int32_t rate)
  492 {
  493         static u_int32_t logMagTable[128] = {
  494                 0x00000, 0x02dfc, 0x05b9e, 0x088e6, 0x0b5d6, 0x0e26f, 0x10eb3, 0x13aa2,
  495                 0x1663f, 0x1918a, 0x1bc84, 0x1e72e, 0x2118b, 0x23b9a, 0x2655d, 0x28ed5,
  496                 0x2b803, 0x2e0e8, 0x30985, 0x331db, 0x359eb, 0x381b6, 0x3a93d, 0x3d081,
  497                 0x3f782, 0x41e42, 0x444c1, 0x46b01, 0x49101, 0x4b6c4, 0x4dc49, 0x50191,
  498                 0x5269e, 0x54b6f, 0x57006, 0x59463, 0x5b888, 0x5dc74, 0x60029, 0x623a7,
  499                 0x646ee, 0x66a00, 0x68cdd, 0x6af86, 0x6d1fa, 0x6f43c, 0x7164b, 0x73829,
  500                 0x759d4, 0x77b4f, 0x79c9a, 0x7bdb5, 0x7dea1, 0x7ff5e, 0x81fed, 0x8404e,
  501                 0x86082, 0x88089, 0x8a064, 0x8c014, 0x8df98, 0x8fef1, 0x91e20, 0x93d26,
  502                 0x95c01, 0x97ab4, 0x9993e, 0x9b79f, 0x9d5d9, 0x9f3ec, 0xa11d8, 0xa2f9d,
  503                 0xa4d3c, 0xa6ab5, 0xa8808, 0xaa537, 0xac241, 0xadf26, 0xafbe7, 0xb1885,
  504                 0xb3500, 0xb5157, 0xb6d8c, 0xb899f, 0xba58f, 0xbc15e, 0xbdd0c, 0xbf899,
  505                 0xc1404, 0xc2f50, 0xc4a7b, 0xc6587, 0xc8073, 0xc9b3f, 0xcb5ed, 0xcd07c,
  506                 0xceaec, 0xd053f, 0xd1f73, 0xd398a, 0xd5384, 0xd6d60, 0xd8720, 0xda0c3,
  507                 0xdba4a, 0xdd3b4, 0xded03, 0xe0636, 0xe1f4e, 0xe384a, 0xe512c, 0xe69f3,
  508                 0xe829f, 0xe9b31, 0xeb3a9, 0xecc08, 0xee44c, 0xefc78, 0xf148a, 0xf2c83,
  509                 0xf4463, 0xf5c2a, 0xf73da, 0xf8b71, 0xfa2f0, 0xfba57, 0xfd1a7, 0xfe8df
  510         };
  511         static char logSlopeTable[128] = {
  512                 0x5c, 0x5c, 0x5b, 0x5a, 0x5a, 0x59, 0x58, 0x58,
  513                 0x57, 0x56, 0x56, 0x55, 0x55, 0x54, 0x53, 0x53,
  514                 0x52, 0x52, 0x51, 0x51, 0x50, 0x50, 0x4f, 0x4f,
  515                 0x4e, 0x4d, 0x4d, 0x4d, 0x4c, 0x4c, 0x4b, 0x4b,
  516                 0x4a, 0x4a, 0x49, 0x49, 0x48, 0x48, 0x47, 0x47,
  517                 0x47, 0x46, 0x46, 0x45, 0x45, 0x45, 0x44, 0x44,
  518                 0x43, 0x43, 0x43, 0x42, 0x42, 0x42, 0x41, 0x41,
  519                 0x41, 0x40, 0x40, 0x40, 0x3f, 0x3f, 0x3f, 0x3e,
  520                 0x3e, 0x3e, 0x3d, 0x3d, 0x3d, 0x3c, 0x3c, 0x3c,
  521                 0x3b, 0x3b, 0x3b, 0x3b, 0x3a, 0x3a, 0x3a, 0x39,
  522                 0x39, 0x39, 0x39, 0x38, 0x38, 0x38, 0x38, 0x37,
  523                 0x37, 0x37, 0x37, 0x36, 0x36, 0x36, 0x36, 0x35,
  524                 0x35, 0x35, 0x35, 0x34, 0x34, 0x34, 0x34, 0x34,
  525                 0x33, 0x33, 0x33, 0x33, 0x32, 0x32, 0x32, 0x32,
  526                 0x32, 0x31, 0x31, 0x31, 0x31, 0x31, 0x30, 0x30,
  527                 0x30, 0x30, 0x30, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f
  528         };
  529         int i;
  530 
  531         if (rate == 0)
  532                 return 0;       /* Bail out if no leading "1" */
  533         rate *= 11185;  /* Scale 48000 to 0x20002380 */
  534         for (i = 31; i > 0; i--) {
  535                 if (rate & 0x80000000) {        /* Detect leading "1" */
  536                         return (((u_int32_t) (i - 15) << 20) +
  537                             logMagTable[0x7f & (rate >> 24)] +
  538                             (0x7f & (rate >> 17)) *
  539                             logSlopeTable[0x7f & (rate >> 24)]);
  540                 }
  541                 rate <<= 1;
  542         }
  543 
  544         return 0;               /* Should never reach this point */
  545 }
  546 
  547 static u_int32_t
  548 emu_rate_to_linearpitch(u_int32_t rate)
  549 {
  550         rate = (rate << 8) / 375;
  551         return (rate >> 1) + (rate & 1);
  552 }
  553 
  554 static struct emu_voice *
  555 emu_valloc(struct sc_info *sc)
  556 {
  557         struct emu_voice *v;
  558         int i;
  559 
  560         v = NULL;
  561         for (i = 0; i < 64 && sc->voice[i].busy; i++);
  562         if (i < 64) {
  563                 v = &sc->voice[i];
  564                 v->busy = 1;
  565         }
  566         return v;
  567 }
  568 
  569 static int
  570 emu_vinit(struct sc_info *sc, struct emu_voice *m, struct emu_voice *s,
  571           u_int32_t sz, struct snd_dbuf *b)
  572 {
  573         void *buf;
  574         bus_addr_t tmp_addr;
  575 
  576         buf = emu_memalloc(sc, sz, &tmp_addr);
  577         if (buf == NULL)
  578                 return -1;
  579         if (b != NULL)
  580                 sndbuf_setup(b, buf, sz);
  581         m->start = emu_memstart(sc, buf) * EMUPAGESIZE;
  582         m->end = m->start + sz;
  583         m->channel = NULL;
  584         m->speed = 0;
  585         m->b16 = 0;
  586         m->stereo = 0;
  587         m->running = 0;
  588         m->ismaster = 1;
  589         m->vol = 0xff;
  590         m->buf = tmp_addr;
  591         m->slave = s;
  592         if (sc->audigy) {
  593                 m->fxrt1 = FXBUS_MIDI_CHORUS | FXBUS_PCM_RIGHT << 8 |
  594                     FXBUS_PCM_LEFT << 16 | FXBUS_MIDI_REVERB << 24;
  595                 m->fxrt2 = 0x3f3f3f3f;  /* No effects on second route */
  596         } else {
  597                 m->fxrt1 = FXBUS_MIDI_CHORUS | FXBUS_PCM_RIGHT << 4 |
  598                     FXBUS_PCM_LEFT << 8 | FXBUS_MIDI_REVERB << 12;
  599                 m->fxrt2 = 0;
  600         }
  601 
  602         if (s != NULL) {
  603                 s->start = m->start;
  604                 s->end = m->end;
  605                 s->channel = NULL;
  606                 s->speed = 0;
  607                 s->b16 = 0;
  608                 s->stereo = 0;
  609                 s->running = 0;
  610                 s->ismaster = 0;
  611                 s->vol = m->vol;
  612                 s->buf = m->buf;
  613                 s->fxrt1 = m->fxrt1;
  614                 s->fxrt2 = m->fxrt2;
  615                 s->slave = NULL;
  616         }
  617         return 0;
  618 }
  619 
  620 static void
  621 emu_vsetup(struct sc_pchinfo *ch)
  622 {
  623         struct emu_voice *v = ch->master;
  624 
  625         if (ch->fmt) {
  626                 v->b16 = (ch->fmt & AFMT_16BIT) ? 1 : 0;
  627                 v->stereo = (AFMT_CHANNEL(ch->fmt) > 1) ? 1 : 0;
  628                 if (v->slave != NULL) {
  629                         v->slave->b16 = v->b16;
  630                         v->slave->stereo = v->stereo;
  631                 }
  632         }
  633         if (ch->spd) {
  634                 v->speed = ch->spd;
  635                 if (v->slave != NULL)
  636                         v->slave->speed = v->speed;
  637         }
  638 }
  639 
  640 static void
  641 emu_vwrite(struct sc_info *sc, struct emu_voice *v)
  642 {
  643         int s;
  644         int l, r, x, y;
  645         u_int32_t sa, ea, start, val, silent_page;
  646 
  647         s = (v->stereo ? 1 : 0) + (v->b16 ? 1 : 0);
  648 
  649         sa = v->start >> s;
  650         ea = v->end >> s;
  651 
  652         l = r = x = y = v->vol;
  653         if (v->stereo) {
  654                 l = v->ismaster ? l : 0;
  655                 r = v->ismaster ? 0 : r;
  656         }
  657 
  658         emu_wrptr(sc, v->vnum, EMU_CHAN_CPF, v->stereo ? EMU_CHAN_CPF_STEREO_MASK : 0);
  659         val = v->stereo ? 28 : 30;
  660         val *= v->b16 ? 1 : 2;
  661         start = sa + val;
  662 
  663         if (sc->audigy) {
  664                 emu_wrptr(sc, v->vnum, EMU_A_CHAN_FXRT1, v->fxrt1);
  665                 emu_wrptr(sc, v->vnum, EMU_A_CHAN_FXRT2, v->fxrt2);
  666                 emu_wrptr(sc, v->vnum, EMU_A_CHAN_SENDAMOUNTS, 0);
  667         }
  668         else
  669                 emu_wrptr(sc, v->vnum, EMU_CHAN_FXRT, v->fxrt1 << 16);
  670 
  671         emu_wrptr(sc, v->vnum, EMU_CHAN_PTRX, (x << 8) | r);
  672         emu_wrptr(sc, v->vnum, EMU_CHAN_DSL, ea | (y << 24));
  673         emu_wrptr(sc, v->vnum, EMU_CHAN_PSST, sa | (l << 24));
  674         emu_wrptr(sc, v->vnum, EMU_CHAN_CCCA, start | (v->b16 ? 0 : EMU_CHAN_CCCA_8BITSELECT));
  675 
  676         emu_wrptr(sc, v->vnum, EMU_CHAN_Z1, 0);
  677         emu_wrptr(sc, v->vnum, EMU_CHAN_Z2, 0);
  678 
  679         silent_page = ((u_int32_t)(sc->mem.silent_page_addr) << 1)
  680             | EMU_CHAN_MAP_PTI_MASK;
  681         emu_wrptr(sc, v->vnum, EMU_CHAN_MAPA, silent_page);
  682         emu_wrptr(sc, v->vnum, EMU_CHAN_MAPB, silent_page);
  683 
  684         emu_wrptr(sc, v->vnum, EMU_CHAN_CVCF, EMU_CHAN_CVCF_CURRFILTER_MASK);
  685         emu_wrptr(sc, v->vnum, EMU_CHAN_VTFT, EMU_CHAN_VTFT_FILTERTARGET_MASK);
  686         emu_wrptr(sc, v->vnum, EMU_CHAN_ATKHLDM, 0);
  687         emu_wrptr(sc, v->vnum, EMU_CHAN_DCYSUSM, EMU_CHAN_DCYSUSM_DECAYTIME_MASK);
  688         emu_wrptr(sc, v->vnum, EMU_CHAN_LFOVAL1, 0x8000);
  689         emu_wrptr(sc, v->vnum, EMU_CHAN_LFOVAL2, 0x8000);
  690         emu_wrptr(sc, v->vnum, EMU_CHAN_FMMOD, 0);
  691         emu_wrptr(sc, v->vnum, EMU_CHAN_TREMFRQ, 0);
  692         emu_wrptr(sc, v->vnum, EMU_CHAN_FM2FRQ2, 0);
  693         emu_wrptr(sc, v->vnum, EMU_CHAN_ENVVAL, 0x8000);
  694 
  695         emu_wrptr(sc, v->vnum, EMU_CHAN_ATKHLDV,
  696             EMU_CHAN_ATKHLDV_HOLDTIME_MASK | EMU_CHAN_ATKHLDV_ATTACKTIME_MASK);
  697         emu_wrptr(sc, v->vnum, EMU_CHAN_ENVVOL, 0x8000);
  698 
  699         emu_wrptr(sc, v->vnum, EMU_CHAN_PEFE_FILTERAMOUNT, 0x7f);
  700         emu_wrptr(sc, v->vnum, EMU_CHAN_PEFE_PITCHAMOUNT, 0);
  701 
  702         if (v->slave != NULL)
  703                 emu_vwrite(sc, v->slave);
  704 }
  705 
  706 static void
  707 emu_vtrigger(struct sc_info *sc, struct emu_voice *v, int go)
  708 {
  709         u_int32_t pitch_target, initial_pitch;
  710         u_int32_t cra, cs, ccis;
  711         u_int32_t sample, i;
  712 
  713         if (go) {
  714                 cra = 64;
  715                 cs = v->stereo ? 4 : 2;
  716                 ccis = v->stereo ? 28 : 30;
  717                 ccis *= v->b16 ? 1 : 2;
  718                 sample = v->b16 ? 0x00000000 : 0x80808080;
  719 
  720                 for (i = 0; i < cs; i++)
  721                         emu_wrptr(sc, v->vnum, EMU_CHAN_CD0 + i, sample);
  722                 emu_wrptr(sc, v->vnum, EMU_CHAN_CCR_CACHEINVALIDSIZE, 0);
  723                 emu_wrptr(sc, v->vnum, EMU_CHAN_CCR_READADDRESS, cra);
  724                 emu_wrptr(sc, v->vnum, EMU_CHAN_CCR_CACHEINVALIDSIZE, ccis);
  725 
  726                 emu_wrptr(sc, v->vnum, EMU_CHAN_IFATN, 0xff00);
  727                 emu_wrptr(sc, v->vnum, EMU_CHAN_VTFT, 0xffffffff);
  728                 emu_wrptr(sc, v->vnum, EMU_CHAN_CVCF, 0xffffffff);
  729                 emu_wrptr(sc, v->vnum, EMU_CHAN_DCYSUSV, 0x00007f7f);
  730                 emu_enastop(sc, v->vnum, 0);
  731 
  732                 pitch_target = emu_rate_to_linearpitch(v->speed);
  733                 initial_pitch = emu_rate_to_pitch(v->speed) >> 8;
  734                 emu_wrptr(sc, v->vnum, EMU_CHAN_PTRX_PITCHTARGET, pitch_target);
  735                 emu_wrptr(sc, v->vnum, EMU_CHAN_CPF_PITCH, pitch_target);
  736                 emu_wrptr(sc, v->vnum, EMU_CHAN_IP, initial_pitch);
  737         } else {
  738                 emu_wrptr(sc, v->vnum, EMU_CHAN_PTRX_PITCHTARGET, 0);
  739                 emu_wrptr(sc, v->vnum, EMU_CHAN_CPF_PITCH, 0);
  740                 emu_wrptr(sc, v->vnum, EMU_CHAN_IFATN, 0xffff);
  741                 emu_wrptr(sc, v->vnum, EMU_CHAN_VTFT, 0x0000ffff);
  742                 emu_wrptr(sc, v->vnum, EMU_CHAN_CVCF, 0x0000ffff);
  743                 emu_wrptr(sc, v->vnum, EMU_CHAN_IP, 0);
  744                 emu_enastop(sc, v->vnum, 1);
  745         }
  746         if (v->slave != NULL)
  747                 emu_vtrigger(sc, v->slave, go);
  748 }
  749 
  750 static int
  751 emu_vpos(struct sc_info *sc, struct emu_voice *v)
  752 {
  753         int s, ptr;
  754 
  755         s = (v->b16 ? 1 : 0) + (v->stereo ? 1 : 0);
  756         ptr = (emu_rdptr(sc, v->vnum, EMU_CHAN_CCCA_CURRADDR) - (v->start >> s)) << s;
  757         return ptr & ~0x0000001f;
  758 }
  759 
  760 #ifdef EMUDEBUG
  761 static void
  762 emu_vdump(struct sc_info *sc, struct emu_voice *v)
  763 {
  764         char *regname[] = {
  765                 "cpf", "ptrx", "cvcf", "vtft", "z2", "z1", "psst", "dsl",
  766                 "ccca", "ccr", "clp", "fxrt", "mapa", "mapb", NULL, NULL,
  767                 "envvol", "atkhldv", "dcysusv", "lfoval1",
  768                 "envval", "atkhldm", "dcysusm", "lfoval2",
  769                 "ip", "ifatn", "pefe", "fmmod", "tremfrq", "fmfrq2",
  770                 "tempenv"
  771         };
  772         char *regname2[] = {
  773                 "mudata1", "mustat1", "mudata2", "mustat2",
  774                 "fxwc1", "fxwc2", "spdrate", NULL, NULL,
  775                 NULL, NULL, NULL, "fxrt2", "sndamnt", "fxrt1",
  776                 NULL, NULL
  777         };
  778         int i, x;
  779 
  780         printf("voice number %d\n", v->vnum);
  781         for (i = 0, x = 0; i <= 0x1e; i++) {
  782                 if (regname[i] == NULL)
  783                         continue;
  784                 printf("%s\t[%08x]", regname[i], emu_rdptr(sc, v->vnum, i));
  785                 printf("%s", (x == 2) ? "\n" : "\t");
  786                 x++;
  787                 if (x > 2)
  788                         x = 0;
  789         }
  790 
  791         /* Print out audigy extra registers */
  792         if (sc->audigy) {
  793                 for (i = 0; i <= 0xe; i++) {
  794                         if (regname2[i] == NULL)
  795                                 continue;
  796                         printf("%s\t[%08x]", regname2[i],
  797                             emu_rdptr(sc, v->vnum, i + 0x70));
  798                         printf("%s", (x == 2)? "\n" : "\t");
  799                         x++;
  800                         if (x > 2)
  801                                 x = 0;
  802                 }
  803         }
  804         printf("\n\n");
  805 }
  806 #endif
  807 
  808 /* channel interface */
  809 static void *
  810 emupchan_init(kobj_t obj, void *devinfo, struct snd_dbuf *b,
  811     struct pcm_channel *c, int dir)
  812 {
  813         struct sc_info *sc = devinfo;
  814         struct sc_pchinfo *ch;
  815         void *r;
  816 
  817         KASSERT(dir == PCMDIR_PLAY, ("emupchan_init: bad direction"));
  818         ch = &sc->pch[sc->pnum++];
  819         ch->buffer = b;
  820         ch->parent = sc;
  821         ch->channel = c;
  822         ch->blksz = sc->bufsz / 2;
  823         ch->fmt = SND_FORMAT(AFMT_U8, 1, 0);
  824         ch->spd = 8000;
  825         snd_mtxlock(sc->lock);
  826         ch->master = emu_valloc(sc);
  827         ch->slave = emu_valloc(sc);
  828         snd_mtxunlock(sc->lock);
  829         r = (emu_vinit(sc, ch->master, ch->slave, sc->bufsz, ch->buffer))
  830             ? NULL : ch;
  831 
  832         return r;
  833 }
  834 
  835 static int
  836 emupchan_free(kobj_t obj, void *data)
  837 {
  838         struct sc_pchinfo *ch = data;
  839         struct sc_info *sc = ch->parent;
  840         int r;
  841 
  842         snd_mtxlock(sc->lock);
  843         r = emu_memfree(sc, sndbuf_getbuf(ch->buffer));
  844         snd_mtxunlock(sc->lock);
  845 
  846         return r;
  847 }
  848 
  849 static int
  850 emupchan_setformat(kobj_t obj, void *data, u_int32_t format)
  851 {
  852         struct sc_pchinfo *ch = data;
  853 
  854         ch->fmt = format;
  855         return 0;
  856 }
  857 
  858 static u_int32_t
  859 emupchan_setspeed(kobj_t obj, void *data, u_int32_t speed)
  860 {
  861         struct sc_pchinfo *ch = data;
  862 
  863         ch->spd = speed;
  864         return ch->spd;
  865 }
  866 
  867 static u_int32_t
  868 emupchan_setblocksize(kobj_t obj, void *data, u_int32_t blocksize)
  869 {
  870         struct sc_pchinfo *ch = data;
  871         struct sc_info *sc = ch->parent;
  872 
  873         ch->blksz = blocksize;
  874         snd_mtxlock(sc->lock);
  875         emu_settimer(sc);
  876         snd_mtxunlock(sc->lock);
  877         return blocksize;
  878 }
  879 
  880 static int
  881 emupchan_trigger(kobj_t obj, void *data, int go)
  882 {
  883         struct sc_pchinfo *ch = data;
  884         struct sc_info *sc = ch->parent;
  885 
  886         if (!PCMTRIG_COMMON(go))
  887                 return 0;
  888 
  889         snd_mtxlock(sc->lock);
  890         if (go == PCMTRIG_START) {
  891                 emu_vsetup(ch);
  892                 emu_vwrite(sc, ch->master);
  893                 emu_settimer(sc);
  894                 emu_enatimer(sc, 1);
  895 #ifdef EMUDEBUG
  896                 printf("start [%d bit, %s, %d hz]\n",
  897                         ch->master->b16 ? 16 : 8,
  898                         ch->master->stereo ? "stereo" : "mono",
  899                         ch->master->speed);
  900                 emu_vdump(sc, ch->master);
  901                 emu_vdump(sc, ch->slave);
  902 #endif
  903         }
  904         ch->run = (go == PCMTRIG_START) ? 1 : 0;
  905         emu_vtrigger(sc, ch->master, ch->run);
  906         snd_mtxunlock(sc->lock);
  907         return 0;
  908 }
  909 
  910 static u_int32_t
  911 emupchan_getptr(kobj_t obj, void *data)
  912 {
  913         struct sc_pchinfo *ch = data;
  914         struct sc_info *sc = ch->parent;
  915         int r;
  916 
  917         snd_mtxlock(sc->lock);
  918         r = emu_vpos(sc, ch->master);
  919         snd_mtxunlock(sc->lock);
  920 
  921         return r;
  922 }
  923 
  924 static struct pcmchan_caps *
  925 emupchan_getcaps(kobj_t obj, void *data)
  926 {
  927         return &emu_playcaps;
  928 }
  929 
  930 static kobj_method_t emupchan_methods[] = {
  931         KOBJMETHOD(channel_init,                emupchan_init),
  932         KOBJMETHOD(channel_free,                emupchan_free),
  933         KOBJMETHOD(channel_setformat,           emupchan_setformat),
  934         KOBJMETHOD(channel_setspeed,            emupchan_setspeed),
  935         KOBJMETHOD(channel_setblocksize,        emupchan_setblocksize),
  936         KOBJMETHOD(channel_trigger,             emupchan_trigger),
  937         KOBJMETHOD(channel_getptr,              emupchan_getptr),
  938         KOBJMETHOD(channel_getcaps,             emupchan_getcaps),
  939         KOBJMETHOD_END
  940 };
  941 CHANNEL_DECLARE(emupchan);
  942 
  943 /* channel interface */
  944 static void *
  945 emurchan_init(kobj_t obj, void *devinfo, struct snd_dbuf *b,
  946     struct pcm_channel *c, int dir)
  947 {
  948         struct sc_info *sc = devinfo;
  949         struct sc_rchinfo *ch;
  950 
  951         KASSERT(dir == PCMDIR_REC, ("emurchan_init: bad direction"));
  952         ch = &sc->rch[sc->rnum];
  953         ch->buffer = b;
  954         ch->parent = sc;
  955         ch->channel = c;
  956         ch->blksz = sc->bufsz / 2;
  957         ch->fmt = SND_FORMAT(AFMT_U8, 1, 0);
  958         ch->spd = 8000;
  959         ch->num = sc->rnum;
  960         switch(sc->rnum) {
  961         case 0:
  962                 ch->idxreg = sc->audigy ? EMU_A_ADCIDX : EMU_ADCIDX;
  963                 ch->basereg = EMU_ADCBA;
  964                 ch->sizereg = EMU_ADCBS;
  965                 ch->setupreg = EMU_ADCCR;
  966                 ch->irqmask = EMU_INTE_ADCBUFENABLE;
  967                 break;
  968 
  969         case 1:
  970                 ch->idxreg = EMU_FXIDX;
  971                 ch->basereg = EMU_FXBA;
  972                 ch->sizereg = EMU_FXBS;
  973                 ch->setupreg = EMU_FXWC;
  974                 ch->irqmask = EMU_INTE_EFXBUFENABLE;
  975                 break;
  976 
  977         case 2:
  978                 ch->idxreg = EMU_MICIDX;
  979                 ch->basereg = EMU_MICBA;
  980                 ch->sizereg = EMU_MICBS;
  981                 ch->setupreg = 0;
  982                 ch->irqmask = EMU_INTE_MICBUFENABLE;
  983                 break;
  984         }
  985         sc->rnum++;
  986         if (sndbuf_alloc(ch->buffer, sc->parent_dmat, 0, sc->bufsz) != 0)
  987                 return NULL;
  988         else {
  989                 snd_mtxlock(sc->lock);
  990                 emu_wrptr(sc, 0, ch->basereg, sndbuf_getbufaddr(ch->buffer));
  991                 emu_wrptr(sc, 0, ch->sizereg, 0); /* off */
  992                 snd_mtxunlock(sc->lock);
  993                 return ch;
  994         }
  995 }
  996 
  997 static int
  998 emurchan_setformat(kobj_t obj, void *data, u_int32_t format)
  999 {
 1000         struct sc_rchinfo *ch = data;
 1001 
 1002         ch->fmt = format;
 1003         return 0;
 1004 }
 1005 
 1006 static u_int32_t
 1007 emurchan_setspeed(kobj_t obj, void *data, u_int32_t speed)
 1008 {
 1009         struct sc_rchinfo *ch = data;
 1010 
 1011         if (ch->num == 0) {
 1012                 if (ch->parent->audigy)
 1013                         speed = audigy_adcspeed[audigy_recval(speed)];
 1014                 else
 1015                         speed = adcspeed[emu_recval(speed)];
 1016         }
 1017         if (ch->num == 1)
 1018                 speed = 48000;
 1019         if (ch->num == 2)
 1020                 speed = 8000;
 1021         ch->spd = speed;
 1022         return ch->spd;
 1023 }
 1024 
 1025 static u_int32_t
 1026 emurchan_setblocksize(kobj_t obj, void *data, u_int32_t blocksize)
 1027 {
 1028         struct sc_rchinfo *ch = data;
 1029         struct sc_info *sc = ch->parent;
 1030 
 1031         ch->blksz = blocksize;
 1032         snd_mtxlock(sc->lock);
 1033         emu_settimer(sc);
 1034         snd_mtxunlock(sc->lock);
 1035         return blocksize;
 1036 }
 1037 
 1038 /* semantic note: must start at beginning of buffer */
 1039 static int
 1040 emurchan_trigger(kobj_t obj, void *data, int go)
 1041 {
 1042         struct sc_rchinfo *ch = data;
 1043         struct sc_info *sc = ch->parent;
 1044         u_int32_t val, sz;
 1045 
 1046         if (!PCMTRIG_COMMON(go))
 1047                 return 0;
 1048 
 1049         switch(sc->bufsz) {
 1050         case 4096:
 1051                 sz = EMU_RECBS_BUFSIZE_4096;
 1052                 break;
 1053 
 1054         case 8192:
 1055                 sz = EMU_RECBS_BUFSIZE_8192;
 1056                 break;
 1057 
 1058         case 16384:
 1059                 sz = EMU_RECBS_BUFSIZE_16384;
 1060                 break;
 1061 
 1062         case 32768:
 1063                 sz = EMU_RECBS_BUFSIZE_32768;
 1064                 break;
 1065 
 1066         case 65536:
 1067                 sz = EMU_RECBS_BUFSIZE_65536;
 1068                 break;
 1069 
 1070         default:
 1071                 sz = EMU_RECBS_BUFSIZE_4096;
 1072         }
 1073 
 1074         snd_mtxlock(sc->lock);
 1075         switch(go) {
 1076         case PCMTRIG_START:
 1077                 ch->run = 1;
 1078                 emu_wrptr(sc, 0, ch->sizereg, sz);
 1079                 if (ch->num == 0) {
 1080                         if (sc->audigy) {
 1081                                 val = EMU_A_ADCCR_LCHANENABLE;
 1082                                 if (AFMT_CHANNEL(ch->fmt) > 1)
 1083                                         val |= EMU_A_ADCCR_RCHANENABLE;
 1084                                 val |= audigy_recval(ch->spd);
 1085                         } else {
 1086                                 val = EMU_ADCCR_LCHANENABLE;
 1087                                 if (AFMT_CHANNEL(ch->fmt) > 1)
 1088                                         val |= EMU_ADCCR_RCHANENABLE;
 1089                                 val |= emu_recval(ch->spd);
 1090                         }
 1091 
 1092                         emu_wrptr(sc, 0, ch->setupreg, 0);
 1093                         emu_wrptr(sc, 0, ch->setupreg, val);
 1094                 }
 1095                 val = emu_rd(sc, EMU_INTE, 4);
 1096                 val |= ch->irqmask;
 1097                 emu_wr(sc, EMU_INTE, val, 4);
 1098                 break;
 1099 
 1100         case PCMTRIG_STOP:
 1101         case PCMTRIG_ABORT:
 1102                 ch->run = 0;
 1103                 emu_wrptr(sc, 0, ch->sizereg, 0);
 1104                 if (ch->setupreg)
 1105                         emu_wrptr(sc, 0, ch->setupreg, 0);
 1106                 val = emu_rd(sc, EMU_INTE, 4);
 1107                 val &= ~ch->irqmask;
 1108                 emu_wr(sc, EMU_INTE, val, 4);
 1109                 break;
 1110 
 1111         case PCMTRIG_EMLDMAWR:
 1112         case PCMTRIG_EMLDMARD:
 1113         default:
 1114                 break;
 1115         }
 1116         snd_mtxunlock(sc->lock);
 1117 
 1118         return 0;
 1119 }
 1120 
 1121 static u_int32_t
 1122 emurchan_getptr(kobj_t obj, void *data)
 1123 {
 1124         struct sc_rchinfo *ch = data;
 1125         struct sc_info *sc = ch->parent;
 1126         int r;
 1127 
 1128         snd_mtxlock(sc->lock);
 1129         r = emu_rdptr(sc, 0, ch->idxreg) & 0x0000ffff;
 1130         snd_mtxunlock(sc->lock);
 1131 
 1132         return r;
 1133 }
 1134 
 1135 static struct pcmchan_caps *
 1136 emurchan_getcaps(kobj_t obj, void *data)
 1137 {
 1138         struct sc_rchinfo *ch = data;
 1139 
 1140         return &emu_reccaps[ch->num];
 1141 }
 1142 
 1143 static kobj_method_t emurchan_methods[] = {
 1144         KOBJMETHOD(channel_init,                emurchan_init),
 1145         KOBJMETHOD(channel_setformat,           emurchan_setformat),
 1146         KOBJMETHOD(channel_setspeed,            emurchan_setspeed),
 1147         KOBJMETHOD(channel_setblocksize,        emurchan_setblocksize),
 1148         KOBJMETHOD(channel_trigger,             emurchan_trigger),
 1149         KOBJMETHOD(channel_getptr,              emurchan_getptr),
 1150         KOBJMETHOD(channel_getcaps,             emurchan_getcaps),
 1151         KOBJMETHOD_END
 1152 };
 1153 CHANNEL_DECLARE(emurchan);
 1154 
 1155 static unsigned char
 1156 emu_mread(struct mpu401 *arg, void *sc, int reg)
 1157 {       
 1158         unsigned int d;
 1159 
 1160         d = emu_rd((struct sc_info *)sc, 0x18 + reg, 1); 
 1161         return d;
 1162 }
 1163 
 1164 static void
 1165 emu_mwrite(struct mpu401 *arg, void *sc, int reg, unsigned char b)
 1166 {
 1167 
 1168         emu_wr((struct sc_info *)sc, 0x18 + reg, b, 1);
 1169 }
 1170 
 1171 static int
 1172 emu_muninit(struct mpu401 *arg, void *cookie)
 1173 {
 1174         struct sc_info *sc = cookie;
 1175 
 1176         snd_mtxlock(sc->lock);
 1177         sc->mpu_intr = NULL;
 1178         snd_mtxunlock(sc->lock);
 1179 
 1180         return 0;
 1181 }
 1182 
 1183 static kobj_method_t emu_mpu_methods[] = {
 1184         KOBJMETHOD(mpufoi_read,         emu_mread),
 1185         KOBJMETHOD(mpufoi_write,        emu_mwrite),
 1186         KOBJMETHOD(mpufoi_uninit,       emu_muninit),
 1187         KOBJMETHOD_END
 1188 };
 1189 
 1190 static DEFINE_CLASS(emu_mpu, emu_mpu_methods, 0);
 1191 
 1192 static void
 1193 emu_intr2(void *p)
 1194 {
 1195         struct sc_info *sc = (struct sc_info *)p;
 1196 
 1197         if (sc->mpu_intr)
 1198             (sc->mpu_intr)(sc->mpu);
 1199 }
 1200 
 1201 static void
 1202 emu_midiattach(struct sc_info *sc)
 1203 {
 1204         int i;
 1205 
 1206         i = emu_rd(sc, EMU_INTE, 4);
 1207         i |= EMU_INTE_MIDIRXENABLE;
 1208         emu_wr(sc, EMU_INTE, i, 4);
 1209 
 1210         sc->mpu = mpu401_init(&emu_mpu_class, sc, emu_intr2, &sc->mpu_intr);
 1211 }
 1212 /* -------------------------------------------------------------------- */
 1213 /* The interrupt handler */
 1214 
 1215 static void
 1216 emu_intr(void *data)
 1217 {
 1218         struct sc_info *sc = data;
 1219         u_int32_t stat, ack, i, x;
 1220 
 1221         snd_mtxlock(sc->lock);
 1222         while (1) {
 1223                 stat = emu_rd(sc, EMU_IPR, 4);
 1224                 if (stat == 0)
 1225                         break;
 1226                 ack = 0;
 1227 
 1228                 /* process irq */
 1229                 if (stat & EMU_IPR_INTERVALTIMER)
 1230                         ack |= EMU_IPR_INTERVALTIMER;
 1231 
 1232                 if (stat & (EMU_IPR_ADCBUFFULL | EMU_IPR_ADCBUFHALFFULL))
 1233                         ack |= stat & (EMU_IPR_ADCBUFFULL | EMU_IPR_ADCBUFHALFFULL);
 1234 
 1235                 if (stat & (EMU_IPR_EFXBUFFULL | EMU_IPR_EFXBUFHALFFULL))
 1236                         ack |= stat & (EMU_IPR_EFXBUFFULL | EMU_IPR_EFXBUFHALFFULL);
 1237 
 1238                 if (stat & (EMU_IPR_MICBUFFULL | EMU_IPR_MICBUFHALFFULL))
 1239                         ack |= stat & (EMU_IPR_MICBUFFULL | EMU_IPR_MICBUFHALFFULL);
 1240 
 1241                 if (stat & EMU_PCIERROR) {
 1242                         ack |= EMU_PCIERROR;
 1243                         device_printf(sc->dev, "pci error\n");
 1244                         /* we still get an nmi with ecc ram even if we ack this */
 1245                 }
 1246                 if (stat & EMU_IPR_RATETRCHANGE) {
 1247                         ack |= EMU_IPR_RATETRCHANGE;
 1248 #ifdef EMUDEBUG
 1249                         device_printf(sc->dev,
 1250                             "sample rate tracker lock status change\n");
 1251 #endif
 1252                 }
 1253 
 1254                 if (stat & EMU_IPR_MIDIRECVBUFE) {
 1255                         if (sc->mpu_intr) {
 1256                                 (sc->mpu_intr)(sc->mpu);
 1257                                 ack |= EMU_IPR_MIDIRECVBUFE | EMU_IPR_MIDITRANSBUFE;
 1258                         }
 1259                 }
 1260                 if (stat & ~ack)
 1261                         device_printf(sc->dev, "dodgy irq: %x (harmless)\n",
 1262                             stat & ~ack);
 1263 
 1264                 emu_wr(sc, EMU_IPR, stat, 4);
 1265 
 1266                 if (ack) {
 1267                         snd_mtxunlock(sc->lock);
 1268 
 1269                         if (ack & EMU_IPR_INTERVALTIMER) {
 1270                                 x = 0;
 1271                                 for (i = 0; i < sc->nchans; i++) {
 1272                                         if (sc->pch[i].run) {
 1273                                                 x = 1;
 1274                                                 chn_intr(sc->pch[i].channel);
 1275                                         }
 1276                                 }
 1277                                 if (x == 0)
 1278                                         emu_enatimer(sc, 0);
 1279                         }
 1280 
 1281                         if (ack & (EMU_IPR_ADCBUFFULL | EMU_IPR_ADCBUFHALFFULL)) {
 1282                                 if (sc->rch[0].channel)
 1283                                         chn_intr(sc->rch[0].channel);
 1284                         }
 1285                         if (ack & (EMU_IPR_EFXBUFFULL | EMU_IPR_EFXBUFHALFFULL)) {
 1286                                 if (sc->rch[1].channel)
 1287                                         chn_intr(sc->rch[1].channel);
 1288                         }
 1289                         if (ack & (EMU_IPR_MICBUFFULL | EMU_IPR_MICBUFHALFFULL)) {
 1290                                 if (sc->rch[2].channel)
 1291                                         chn_intr(sc->rch[2].channel);
 1292                         }
 1293 
 1294                         snd_mtxlock(sc->lock);
 1295                 }
 1296         }
 1297         snd_mtxunlock(sc->lock);
 1298 }
 1299 
 1300 /* -------------------------------------------------------------------- */
 1301 
 1302 static void
 1303 emu_setmap(void *arg, bus_dma_segment_t *segs, int nseg, int error)
 1304 {
 1305         bus_addr_t *phys = arg;
 1306 
 1307         *phys = error ? 0 : (bus_addr_t)segs->ds_addr;
 1308 
 1309         if (bootverbose) {
 1310                 printf("emu: setmap (%lx, %lx), nseg=%d, error=%d\n",
 1311                     (unsigned long)segs->ds_addr, (unsigned long)segs->ds_len,
 1312                     nseg, error);
 1313         }
 1314 }
 1315 
 1316 static void *
 1317 emu_malloc(struct sc_info *sc, u_int32_t sz, bus_addr_t *addr,
 1318     bus_dmamap_t *map)
 1319 {
 1320         void *buf;
 1321 
 1322         *addr = 0;
 1323         if (bus_dmamem_alloc(sc->parent_dmat, &buf, BUS_DMA_NOWAIT, map))
 1324                 return NULL;
 1325         if (bus_dmamap_load(sc->parent_dmat, *map, buf, sz, emu_setmap, addr,
 1326             BUS_DMA_NOWAIT) || !*addr) {
 1327                 bus_dmamem_free(sc->parent_dmat, buf, *map);
 1328                 return NULL;
 1329         }
 1330         return buf;
 1331 }
 1332 
 1333 static void
 1334 emu_free(struct sc_info *sc, void *buf, bus_dmamap_t map)
 1335 {
 1336         bus_dmamap_unload(sc->parent_dmat, map);
 1337         bus_dmamem_free(sc->parent_dmat, buf, map);
 1338 }
 1339 
 1340 static void *
 1341 emu_memalloc(struct sc_info *sc, u_int32_t sz, bus_addr_t *addr)
 1342 {
 1343         u_int32_t blksz, start, idx, ofs, tmp, found;
 1344         struct emu_mem *mem = &sc->mem;
 1345         struct emu_memblk *blk;
 1346         void *buf;
 1347 
 1348         blksz = sz / EMUPAGESIZE;
 1349         if (sz > (blksz * EMUPAGESIZE))
 1350                 blksz++;
 1351         /* find a free block in the bitmap */
 1352         found = 0;
 1353         start = 1;
 1354         while (!found && start + blksz < EMUMAXPAGES) {
 1355                 found = 1;
 1356                 for (idx = start; idx < start + blksz; idx++)
 1357                         if (mem->bmap[idx >> 3] & (1 << (idx & 7)))
 1358                                 found = 0;
 1359                 if (!found)
 1360                         start++;
 1361         }
 1362         if (!found)
 1363                 return NULL;
 1364         blk = malloc(sizeof(*blk), M_DEVBUF, M_NOWAIT);
 1365         if (blk == NULL)
 1366                 return NULL;
 1367         buf = emu_malloc(sc, sz, &blk->buf_addr, &blk->buf_map);
 1368         *addr = blk->buf_addr;
 1369         if (buf == NULL) {
 1370                 free(blk, M_DEVBUF);
 1371                 return NULL;
 1372         }
 1373         blk->buf = buf;
 1374         blk->pte_start = start;
 1375         blk->pte_size = blksz;
 1376 #ifdef EMUDEBUG
 1377         printf("buf %p, pte_start %d, pte_size %d\n", blk->buf,
 1378             blk->pte_start, blk->pte_size);
 1379 #endif
 1380         ofs = 0;
 1381         for (idx = start; idx < start + blksz; idx++) {
 1382                 mem->bmap[idx >> 3] |= 1 << (idx & 7);
 1383                 tmp = (uint32_t)(blk->buf_addr + ofs);
 1384 #ifdef EMUDEBUG
 1385                 printf("pte[%d] -> %x phys, %x virt\n", idx, tmp,
 1386                     ((u_int32_t)buf) + ofs);
 1387 #endif
 1388                 mem->ptb_pages[idx] = (tmp << 1) | idx;
 1389                 ofs += EMUPAGESIZE;
 1390         }
 1391         SLIST_INSERT_HEAD(&mem->blocks, blk, link);
 1392         return buf;
 1393 }
 1394 
 1395 static int
 1396 emu_memfree(struct sc_info *sc, void *buf)
 1397 {
 1398         u_int32_t idx, tmp;
 1399         struct emu_mem *mem = &sc->mem;
 1400         struct emu_memblk *blk, *i;
 1401 
 1402         blk = NULL;
 1403         SLIST_FOREACH(i, &mem->blocks, link) {
 1404                 if (i->buf == buf)
 1405                         blk = i;
 1406         }
 1407         if (blk == NULL)
 1408                 return EINVAL;
 1409         SLIST_REMOVE(&mem->blocks, blk, emu_memblk, link);
 1410         emu_free(sc, buf, blk->buf_map);
 1411         tmp = (u_int32_t)(sc->mem.silent_page_addr) << 1;
 1412         for (idx = blk->pte_start; idx < blk->pte_start + blk->pte_size; idx++) {
 1413                 mem->bmap[idx >> 3] &= ~(1 << (idx & 7));
 1414                 mem->ptb_pages[idx] = tmp | idx;
 1415         }
 1416         free(blk, M_DEVBUF);
 1417         return 0;
 1418 }
 1419 
 1420 static int
 1421 emu_memstart(struct sc_info *sc, void *buf)
 1422 {
 1423         struct emu_mem *mem = &sc->mem;
 1424         struct emu_memblk *blk, *i;
 1425 
 1426         blk = NULL;
 1427         SLIST_FOREACH(i, &mem->blocks, link) {
 1428                 if (i->buf == buf)
 1429                         blk = i;
 1430         }
 1431         if (blk == NULL)
 1432                 return -EINVAL;
 1433         return blk->pte_start;
 1434 }
 1435 
 1436 static void
 1437 emu_addefxop(struct sc_info *sc, int op, int z, int w, int x, int y,
 1438     u_int32_t *pc)
 1439 {
 1440         emu_wrefx(sc, (*pc) * 2, (x << 10) | y);
 1441         emu_wrefx(sc, (*pc) * 2 + 1, (op << 20) | (z << 10) | w);
 1442         (*pc)++;
 1443 }
 1444 
 1445 static void
 1446 audigy_addefxop(struct sc_info *sc, int op, int z, int w, int x, int y,
 1447     u_int32_t *pc)
 1448 {
 1449         emu_wrefx(sc, (*pc) * 2, (x << 12) | y);
 1450         emu_wrefx(sc, (*pc) * 2 + 1, (op << 24) | (z << 12) | w);
 1451         (*pc)++;
 1452 }
 1453 
 1454 static void
 1455 audigy_initefx(struct sc_info *sc)
 1456 {
 1457         int i;
 1458         u_int32_t pc = 0;
 1459 
 1460         /* skip 0, 0, -1, 0 - NOPs */
 1461         for (i = 0; i < 512; i++)
 1462                 audigy_addefxop(sc, 0x0f, 0x0c0, 0x0c0, 0x0cf, 0x0c0, &pc);
 1463 
 1464         for (i = 0; i < 512; i++)
 1465                 emu_wrptr(sc, 0, EMU_A_FXGPREGBASE + i, 0x0);
 1466 
 1467         pc = 16;
 1468 
 1469         /* stop fx processor */
 1470         emu_wrptr(sc, 0, EMU_A_DBG, EMU_A_DBG_SINGLE_STEP);
 1471 
 1472         /* Audigy 2 (EMU10K2) DSP Registers:
 1473            FX Bus
 1474                 0x000-0x00f : 16 registers (?)
 1475            Input
 1476                 0x040/0x041 : AC97 Codec (l/r)
 1477                 0x042/0x043 : ADC, S/PDIF (l/r)
 1478                 0x044/0x045 : Optical S/PDIF in (l/r)
 1479                 0x046/0x047 : ?
 1480                 0x048/0x049 : Line/Mic 2 (l/r)
 1481                 0x04a/0x04b : RCA S/PDIF (l/r)
 1482                 0x04c/0x04d : Aux 2 (l/r)
 1483            Output
 1484                 0x060/0x061 : Digital Front (l/r)
 1485                 0x062/0x063 : Digital Center/LFE
 1486                 0x064/0x065 : AudigyDrive Heaphone (l/r)
 1487                 0x066/0x067 : Digital Rear (l/r)
 1488                 0x068/0x069 : Analog Front (l/r)
 1489                 0x06a/0x06b : Analog Center/LFE
 1490                 0x06c/0x06d : ?
 1491                 0x06e/0x06f : Analog Rear (l/r)
 1492                 0x070/0x071 : AC97 Output (l/r)
 1493                 0x072/0x073 : ?
 1494                 0x074/0x075 : ?
 1495                 0x076/0x077 : ADC Recording Buffer (l/r)
 1496            Constants
 1497                 0x0c0 - 0x0c4 = 0 - 4
 1498                 0x0c5 = 0x8, 0x0c6 = 0x10, 0x0c7 = 0x20
 1499                 0x0c8 = 0x100, 0x0c9 = 0x10000, 0x0ca = 0x80000
 1500                 0x0cb = 0x10000000, 0x0cc = 0x20000000, 0x0cd = 0x40000000
 1501                 0x0ce = 0x80000000, 0x0cf = 0x7fffffff, 0x0d0 = 0xffffffff
 1502                 0x0d1 = 0xfffffffe, 0x0d2 = 0xc0000000, 0x0d3 = 0x41fbbcdc
 1503                 0x0d4 = 0x5a7ef9db, 0x0d5 = 0x00100000, 0x0dc = 0x00000001 (?)
 1504            Temporary Values
 1505                 0x0d6 : Accumulator (?)
 1506                 0x0d7 : Condition Register
 1507                 0x0d8 : Noise source
 1508                 0x0d9 : Noise source
 1509            Tank Memory Data Registers
 1510                 0x200 - 0x2ff
 1511            Tank Memory Address Registers
 1512                 0x300 - 0x3ff
 1513            General Purpose Registers
 1514                 0x400 - 0x5ff
 1515          */
 1516 
 1517         /* AC97Output[l/r] = FXBus PCM[l/r] */
 1518         audigy_addefxop(sc, iACC3, A_EXTOUT(A_EXTOUT_AC97_L), A_C_00000000,
 1519                         A_C_00000000, A_FXBUS(FXBUS_PCM_LEFT), &pc);
 1520         audigy_addefxop(sc, iACC3, A_EXTOUT(A_EXTOUT_AC97_R), A_C_00000000,
 1521                         A_C_00000000, A_FXBUS(FXBUS_PCM_RIGHT), &pc);
 1522 
 1523         /* GPR[0/1] = RCA S/PDIF[l/r] -- Master volume */
 1524         audigy_addefxop(sc, iACC3, A_GPR(0), A_C_00000000,
 1525                         A_C_00000000, A_EXTIN(EXTIN_COAX_SPDIF_L), &pc);
 1526         audigy_addefxop(sc, iACC3, A_GPR(1), A_C_00000000,
 1527                         A_C_00000000, A_EXTIN(EXTIN_COAX_SPDIF_R), &pc);
 1528 
 1529         /* GPR[2] = GPR[0] (Left) / 2 + GPR[1] (Right) / 2 -- Central volume */
 1530         audigy_addefxop(sc, iINTERP, A_GPR(2), A_GPR(1),
 1531                         A_C_40000000, A_GPR(0), &pc);
 1532 
 1533         /* Headphones[l/r] = GPR[0/1] */
 1534         audigy_addefxop(sc, iACC3, A_EXTOUT(A_EXTOUT_HEADPHONE_L),
 1535                         A_C_00000000, A_C_00000000, A_GPR(0), &pc);
 1536         audigy_addefxop(sc, iACC3, A_EXTOUT(A_EXTOUT_HEADPHONE_R),
 1537                         A_C_00000000, A_C_00000000, A_GPR(1), &pc);
 1538 
 1539         /* Analog Front[l/r] = GPR[0/1] */
 1540         audigy_addefxop(sc, iACC3, A_EXTOUT(A_EXTOUT_AFRONT_L), A_C_00000000,
 1541                         A_C_00000000, A_GPR(0), &pc);
 1542         audigy_addefxop(sc, iACC3, A_EXTOUT(A_EXTOUT_AFRONT_R), A_C_00000000,
 1543                         A_C_00000000, A_GPR(1), &pc);
 1544 
 1545         /* Digital Front[l/r] = GPR[0/1] */
 1546         audigy_addefxop(sc, iACC3, A_EXTOUT(A_EXTOUT_FRONT_L), A_C_00000000,
 1547                         A_C_00000000, A_GPR(0), &pc);
 1548         audigy_addefxop(sc, iACC3, A_EXTOUT(A_EXTOUT_FRONT_R), A_C_00000000,
 1549                         A_C_00000000, A_GPR(1), &pc);
 1550 
 1551         /* Center and Subwoofer configuration */
 1552         /* Analog Center = GPR[0] + GPR[2] */
 1553         audigy_addefxop(sc, iACC3, A_EXTOUT(A_EXTOUT_ACENTER), A_C_00000000,
 1554                         A_GPR(0), A_GPR(2), &pc);
 1555         /* Analog Sub = GPR[1] + GPR[2] */
 1556         audigy_addefxop(sc, iACC3, A_EXTOUT(A_EXTOUT_ALFE), A_C_00000000,
 1557                         A_GPR(1), A_GPR(2), &pc);
 1558 
 1559         /* Digital Center = GPR[0] + GPR[2] */
 1560         audigy_addefxop(sc, iACC3, A_EXTOUT(A_EXTOUT_CENTER), A_C_00000000,
 1561                         A_GPR(0), A_GPR(2), &pc);
 1562         /* Digital Sub = GPR[1] + GPR[2] */
 1563         audigy_addefxop(sc, iACC3, A_EXTOUT(A_EXTOUT_LFE), A_C_00000000,
 1564                         A_GPR(1), A_GPR(2), &pc);
 1565 
 1566 #if 0
 1567         /* Analog Rear[l/r] = (GPR[0/1] * RearVolume[l/r]) >> 31 */
 1568         /*   RearVolume = GPR[0x10/0x11] (Will this ever be implemented?) */
 1569         audigy_addefxop(sc, iMAC0, A_EXTOUT(A_EXTOUT_AREAR_L), A_C_00000000,
 1570                         A_GPR(16), A_GPR(0), &pc);
 1571         audigy_addefxop(sc, iMAC0, A_EXTOUT(A_EXTOUT_AREAR_R), A_C_00000000,
 1572                         A_GPR(17), A_GPR(1), &pc);
 1573 
 1574         /* Digital Rear[l/r] = (GPR[0/1] * RearVolume[l/r]) >> 31 */
 1575         /*   RearVolume = GPR[0x10/0x11] (Will this ever be implemented?) */
 1576         audigy_addefxop(sc, iMAC0, A_EXTOUT(A_EXTOUT_REAR_L), A_C_00000000,
 1577                         A_GPR(16), A_GPR(0), &pc);
 1578         audigy_addefxop(sc, iMAC0, A_EXTOUT(A_EXTOUT_REAR_R), A_C_00000000,
 1579                         A_GPR(17), A_GPR(1), &pc);
 1580 #else
 1581         /* XXX This is just a copy to the channel, since we do not have
 1582          *     a patch manager, it is useful for have another output enabled.
 1583          */
 1584 
 1585         /* Analog Rear[l/r] = GPR[0/1] */
 1586         audigy_addefxop(sc, iACC3, A_EXTOUT(A_EXTOUT_AREAR_L), A_C_00000000,
 1587                         A_C_00000000, A_GPR(0), &pc);
 1588         audigy_addefxop(sc, iACC3, A_EXTOUT(A_EXTOUT_AREAR_R), A_C_00000000,
 1589                         A_C_00000000, A_GPR(1), &pc);
 1590 
 1591         /* Digital Rear[l/r] = GPR[0/1] */
 1592         audigy_addefxop(sc, iACC3, A_EXTOUT(A_EXTOUT_REAR_L), A_C_00000000,
 1593                         A_C_00000000, A_GPR(0), &pc);
 1594         audigy_addefxop(sc, iACC3, A_EXTOUT(A_EXTOUT_REAR_R), A_C_00000000,
 1595                         A_C_00000000, A_GPR(1), &pc);
 1596 #endif
 1597 
 1598         /* ADC Recording buffer[l/r] = AC97Input[l/r] */
 1599         audigy_addefxop(sc, iACC3, A_EXTOUT(A_EXTOUT_ADC_CAP_L), A_C_00000000,
 1600                         A_C_00000000, A_EXTIN(A_EXTIN_AC97_L), &pc);
 1601         audigy_addefxop(sc, iACC3, A_EXTOUT(A_EXTOUT_ADC_CAP_R), A_C_00000000,
 1602                         A_C_00000000, A_EXTIN(A_EXTIN_AC97_R), &pc);
 1603 
 1604         /* resume normal operations */
 1605         emu_wrptr(sc, 0, EMU_A_DBG, 0);
 1606 }
 1607 
 1608 static void
 1609 emu_initefx(struct sc_info *sc)
 1610 {
 1611         int i;
 1612         u_int32_t pc = 16;
 1613 
 1614         /* acc3 0,0,0,0 - NOPs */
 1615         for (i = 0; i < 512; i++) {
 1616                 emu_wrefx(sc, i * 2, 0x10040);
 1617                 emu_wrefx(sc, i * 2 + 1, 0x610040);
 1618         }
 1619 
 1620         for (i = 0; i < 256; i++)
 1621                 emu_wrptr(sc, 0, EMU_FXGPREGBASE + i, 0);
 1622 
 1623         /* FX-8010 DSP Registers:
 1624            FX Bus
 1625              0x000-0x00f : 16 registers
 1626            Input
 1627              0x010/0x011 : AC97 Codec (l/r)
 1628              0x012/0x013 : ADC, S/PDIF (l/r)
 1629              0x014/0x015 : Mic(left), Zoom (l/r)
 1630              0x016/0x017 : TOS link in (l/r)
 1631              0x018/0x019 : Line/Mic 1 (l/r)
 1632              0x01a/0x01b : COAX S/PDIF (l/r)
 1633              0x01c/0x01d : Line/Mic 2 (l/r)
 1634            Output
 1635              0x020/0x021 : AC97 Output (l/r)
 1636              0x022/0x023 : TOS link out (l/r)
 1637              0x024/0x025 : Center/LFE
 1638              0x026/0x027 : LiveDrive Headphone (l/r)
 1639              0x028/0x029 : Rear Channel (l/r)
 1640              0x02a/0x02b : ADC Recording Buffer (l/r)
 1641              0x02c       : Mic Recording Buffer
 1642              0x031/0x032 : Analog Center/LFE
 1643            Constants
 1644              0x040 - 0x044 = 0 - 4
 1645              0x045 = 0x8, 0x046 = 0x10, 0x047 = 0x20
 1646              0x048 = 0x100, 0x049 = 0x10000, 0x04a = 0x80000
 1647              0x04b = 0x10000000, 0x04c = 0x20000000, 0x04d = 0x40000000
 1648              0x04e = 0x80000000, 0x04f = 0x7fffffff, 0x050 = 0xffffffff
 1649              0x051 = 0xfffffffe, 0x052 = 0xc0000000, 0x053 = 0x41fbbcdc
 1650              0x054 = 0x5a7ef9db, 0x055 = 0x00100000
 1651            Temporary Values
 1652              0x056 : Accumulator
 1653              0x057 : Condition Register
 1654              0x058 : Noise source
 1655              0x059 : Noise source
 1656              0x05a : IRQ Register
 1657              0x05b : TRAM Delay Base Address Count
 1658            General Purpose Registers
 1659              0x100 - 0x1ff
 1660            Tank Memory Data Registers
 1661              0x200 - 0x2ff
 1662            Tank Memory Address Registers
 1663              0x300 - 0x3ff
 1664              */
 1665 
 1666         /* Routing - this will be configurable in later version */
 1667 
 1668         /* GPR[0/1] = FX * 4 + SPDIF-in */
 1669         emu_addefxop(sc, iMACINT0, GPR(0), EXTIN(EXTIN_SPDIF_CD_L),
 1670                         FXBUS(FXBUS_PCM_LEFT), C_00000004, &pc);
 1671         emu_addefxop(sc, iMACINT0, GPR(1), EXTIN(EXTIN_SPDIF_CD_R),
 1672                         FXBUS(FXBUS_PCM_RIGHT), C_00000004, &pc);
 1673 
 1674         /* GPR[0/1] += APS-input */
 1675         emu_addefxop(sc, iACC3, GPR(0), GPR(0), C_00000000,
 1676                         sc->APS ? EXTIN(EXTIN_TOSLINK_L) : C_00000000, &pc);
 1677         emu_addefxop(sc, iACC3, GPR(1), GPR(1), C_00000000,
 1678                         sc->APS ? EXTIN(EXTIN_TOSLINK_R) : C_00000000, &pc);
 1679 
 1680         /* FrontOut (AC97) = GPR[0/1] */
 1681         emu_addefxop(sc, iACC3, EXTOUT(EXTOUT_AC97_L), C_00000000,
 1682                         C_00000000, GPR(0), &pc);
 1683         emu_addefxop(sc, iACC3, EXTOUT(EXTOUT_AC97_R), C_00000000,
 1684                         C_00000001, GPR(1), &pc);
 1685 
 1686         /* GPR[2] = GPR[0] (Left) / 2 + GPR[1] (Right) / 2 -- Central volume */
 1687         emu_addefxop(sc, iINTERP, GPR(2), GPR(1), C_40000000, GPR(0), &pc);
 1688 
 1689 #if 0
 1690         /* RearOut = (GPR[0/1] * RearVolume) >> 31 */
 1691         /*   RearVolume = GPR[0x10/0x11] */
 1692         emu_addefxop(sc, iMAC0, EXTOUT(EXTOUT_REAR_L), C_00000000,
 1693                         GPR(16), GPR(0), &pc);
 1694         emu_addefxop(sc, iMAC0, EXTOUT(EXTOUT_REAR_R), C_00000000,
 1695                         GPR(17), GPR(1), &pc);
 1696 #else
 1697         /* XXX This is just a copy to the channel, since we do not have
 1698          *     a patch manager, it is useful for have another output enabled.
 1699          */
 1700 
 1701         /* Rear[l/r] = GPR[0/1] */
 1702         emu_addefxop(sc, iACC3, EXTOUT(EXTOUT_REAR_L), C_00000000,
 1703                         C_00000000, GPR(0), &pc);
 1704         emu_addefxop(sc, iACC3, EXTOUT(EXTOUT_REAR_R), C_00000000,
 1705                         C_00000000, GPR(1), &pc);
 1706 #endif
 1707 
 1708         /* TOS out[l/r] = GPR[0/1] */
 1709         emu_addefxop(sc, iACC3, EXTOUT(EXTOUT_TOSLINK_L), C_00000000,
 1710                         C_00000000, GPR(0), &pc);
 1711         emu_addefxop(sc, iACC3, EXTOUT(EXTOUT_TOSLINK_R), C_00000000,
 1712                         C_00000000, GPR(1), &pc);
 1713 
 1714         /* Center and Subwoofer configuration */
 1715         /* Analog Center = GPR[0] + GPR[2] */
 1716         emu_addefxop(sc, iACC3, EXTOUT(EXTOUT_ACENTER), C_00000000,
 1717                         GPR(0), GPR(2), &pc);
 1718         /* Analog Sub = GPR[1] + GPR[2] */
 1719         emu_addefxop(sc, iACC3, EXTOUT(EXTOUT_ALFE), C_00000000,
 1720                         GPR(1), GPR(2), &pc);
 1721         /* Digital Center = GPR[0] + GPR[2] */
 1722         emu_addefxop(sc, iACC3, EXTOUT(EXTOUT_AC97_CENTER), C_00000000,
 1723                         GPR(0), GPR(2), &pc);
 1724         /* Digital Sub = GPR[1] + GPR[2] */
 1725         emu_addefxop(sc, iACC3, EXTOUT(EXTOUT_AC97_LFE), C_00000000,
 1726                         GPR(1), GPR(2), &pc);
 1727 
 1728         /* Headphones[l/r] = GPR[0/1] */
 1729         emu_addefxop(sc, iACC3, EXTOUT(EXTOUT_HEADPHONE_L), C_00000000,
 1730                         C_00000000, GPR(0), &pc);
 1731         emu_addefxop(sc, iACC3, EXTOUT(EXTOUT_HEADPHONE_R), C_00000000,
 1732                         C_00000000, GPR(1), &pc);
 1733 
 1734         /* ADC Recording buffer[l/r] = AC97Input[l/r] */
 1735         emu_addefxop(sc, iACC3, EXTOUT(EXTOUT_ADC_CAP_L), C_00000000,
 1736                         C_00000000, EXTIN(EXTIN_AC97_L), &pc);
 1737         emu_addefxop(sc, iACC3, EXTOUT(EXTOUT_ADC_CAP_R), C_00000000,
 1738                         C_00000000, EXTIN(EXTIN_AC97_R), &pc);
 1739 
 1740         /* resume normal operations */
 1741         emu_wrptr(sc, 0, EMU_DBG, 0);
 1742 }
 1743 
 1744 /* Probe and attach the card */
 1745 static int
 1746 emu_init(struct sc_info *sc)
 1747 {
 1748         u_int32_t spcs, ch, tmp, i;
 1749 
 1750         if (sc->audigy) {
 1751                 /* enable additional AC97 slots */
 1752                 emu_wrptr(sc, 0, EMU_AC97SLOT, EMU_AC97SLOT_CENTER | EMU_AC97SLOT_LFE);
 1753         }
 1754 
 1755         /* disable audio and lock cache */
 1756         emu_wr(sc, EMU_HCFG,
 1757             EMU_HCFG_LOCKSOUNDCACHE | EMU_HCFG_LOCKTANKCACHE_MASK | EMU_HCFG_MUTEBUTTONENABLE,
 1758             4);
 1759 
 1760         /* reset recording buffers */
 1761         emu_wrptr(sc, 0, EMU_MICBS, EMU_RECBS_BUFSIZE_NONE);
 1762         emu_wrptr(sc, 0, EMU_MICBA, 0);
 1763         emu_wrptr(sc, 0, EMU_FXBS, EMU_RECBS_BUFSIZE_NONE);
 1764         emu_wrptr(sc, 0, EMU_FXBA, 0);
 1765         emu_wrptr(sc, 0, EMU_ADCBS, EMU_RECBS_BUFSIZE_NONE);
 1766         emu_wrptr(sc, 0, EMU_ADCBA, 0);
 1767 
 1768         /* disable channel interrupt */
 1769         emu_wr(sc, EMU_INTE,
 1770             EMU_INTE_INTERTIMERENB | EMU_INTE_SAMPLERATER | EMU_INTE_PCIERRENABLE,
 1771             4);
 1772         emu_wrptr(sc, 0, EMU_CLIEL, 0);
 1773         emu_wrptr(sc, 0, EMU_CLIEH, 0);
 1774         emu_wrptr(sc, 0, EMU_SOLEL, 0);
 1775         emu_wrptr(sc, 0, EMU_SOLEH, 0);
 1776 
 1777         /* wonder what these do... */
 1778         if (sc->audigy) {
 1779                 emu_wrptr(sc, 0, EMU_SPBYPASS, 0xf00);
 1780                 emu_wrptr(sc, 0, EMU_AC97SLOT, 0x3);
 1781         }
 1782 
 1783         /* init envelope engine */
 1784         for (ch = 0; ch < NUM_G; ch++) {
 1785                 emu_wrptr(sc, ch, EMU_CHAN_DCYSUSV, ENV_OFF);
 1786                 emu_wrptr(sc, ch, EMU_CHAN_IP, 0);
 1787                 emu_wrptr(sc, ch, EMU_CHAN_VTFT, 0xffff);
 1788                 emu_wrptr(sc, ch, EMU_CHAN_CVCF, 0xffff);
 1789                 emu_wrptr(sc, ch, EMU_CHAN_PTRX, 0);
 1790                 emu_wrptr(sc, ch, EMU_CHAN_CPF, 0);
 1791                 emu_wrptr(sc, ch, EMU_CHAN_CCR, 0);
 1792 
 1793                 emu_wrptr(sc, ch, EMU_CHAN_PSST, 0);
 1794                 emu_wrptr(sc, ch, EMU_CHAN_DSL, 0x10);
 1795                 emu_wrptr(sc, ch, EMU_CHAN_CCCA, 0);
 1796                 emu_wrptr(sc, ch, EMU_CHAN_Z1, 0);
 1797                 emu_wrptr(sc, ch, EMU_CHAN_Z2, 0);
 1798                 emu_wrptr(sc, ch, EMU_CHAN_FXRT, 0xd01c0000);
 1799 
 1800                 emu_wrptr(sc, ch, EMU_CHAN_ATKHLDM, 0);
 1801                 emu_wrptr(sc, ch, EMU_CHAN_DCYSUSM, 0);
 1802                 emu_wrptr(sc, ch, EMU_CHAN_IFATN, 0xffff);
 1803                 emu_wrptr(sc, ch, EMU_CHAN_PEFE, 0);
 1804                 emu_wrptr(sc, ch, EMU_CHAN_FMMOD, 0);
 1805                 emu_wrptr(sc, ch, EMU_CHAN_TREMFRQ, 24);        /* 1 Hz */
 1806                 emu_wrptr(sc, ch, EMU_CHAN_FM2FRQ2, 24);        /* 1 Hz */
 1807                 emu_wrptr(sc, ch, EMU_CHAN_TEMPENV, 0);
 1808 
 1809                 /*** these are last so OFF prevents writing ***/
 1810                 emu_wrptr(sc, ch, EMU_CHAN_LFOVAL2, 0);
 1811                 emu_wrptr(sc, ch, EMU_CHAN_LFOVAL1, 0);
 1812                 emu_wrptr(sc, ch, EMU_CHAN_ATKHLDV, 0);
 1813                 emu_wrptr(sc, ch, EMU_CHAN_ENVVOL, 0);
 1814                 emu_wrptr(sc, ch, EMU_CHAN_ENVVAL, 0);
 1815 
 1816                 if (sc->audigy) {
 1817                         /* audigy cards need this to initialize correctly */
 1818                         emu_wrptr(sc, ch, 0x4c, 0);
 1819                         emu_wrptr(sc, ch, 0x4d, 0);
 1820                         emu_wrptr(sc, ch, 0x4e, 0);
 1821                         emu_wrptr(sc, ch, 0x4f, 0);
 1822                         /* set default routing */
 1823                         emu_wrptr(sc, ch, EMU_A_CHAN_FXRT1, 0x03020100);
 1824                         emu_wrptr(sc, ch, EMU_A_CHAN_FXRT2, 0x3f3f3f3f);
 1825                         emu_wrptr(sc, ch, EMU_A_CHAN_SENDAMOUNTS, 0);
 1826                 }
 1827 
 1828                 sc->voice[ch].vnum = ch;
 1829                 sc->voice[ch].slave = NULL;
 1830                 sc->voice[ch].busy = 0;
 1831                 sc->voice[ch].ismaster = 0;
 1832                 sc->voice[ch].running = 0;
 1833                 sc->voice[ch].b16 = 0;
 1834                 sc->voice[ch].stereo = 0;
 1835                 sc->voice[ch].speed = 0;
 1836                 sc->voice[ch].start = 0;
 1837                 sc->voice[ch].end = 0;
 1838                 sc->voice[ch].channel = NULL;
 1839         }
 1840         sc->pnum = sc->rnum = 0;
 1841 
 1842         /*
 1843          *  Init to 0x02109204 :
 1844          *  Clock accuracy    = 0     (1000ppm)
 1845          *  Sample Rate       = 2     (48kHz)
 1846          *  Audio Channel     = 1     (Left of 2)
 1847          *  Source Number     = 0     (Unspecified)
 1848          *  Generation Status = 1     (Original for Cat Code 12)
 1849          *  Cat Code          = 12    (Digital Signal Mixer)
 1850          *  Mode              = 0     (Mode 0)
 1851          *  Emphasis          = 0     (None)
 1852          *  CP                = 1     (Copyright unasserted)
 1853          *  AN                = 0     (Audio data)
 1854          *  P                 = 0     (Consumer)
 1855          */
 1856         spcs = EMU_SPCS_CLKACCY_1000PPM | EMU_SPCS_SAMPLERATE_48 |
 1857             EMU_SPCS_CHANNELNUM_LEFT | EMU_SPCS_SOURCENUM_UNSPEC |
 1858             EMU_SPCS_GENERATIONSTATUS | 0x00001200 | 0x00000000 |
 1859             EMU_SPCS_EMPHASIS_NONE | EMU_SPCS_COPYRIGHT;
 1860         emu_wrptr(sc, 0, EMU_SPCS0, spcs);
 1861         emu_wrptr(sc, 0, EMU_SPCS1, spcs);
 1862         emu_wrptr(sc, 0, EMU_SPCS2, spcs);
 1863 
 1864         if (!sc->audigy)
 1865                 emu_initefx(sc);
 1866         else if (sc->audigy2) { /* Audigy 2 */
 1867                 /* from ALSA initialization code: */
 1868 
 1869                 /* Hack for Alice3 to work independent of haP16V driver */
 1870                 u_int32_t tmp;
 1871 
 1872                 /* Setup SRCMulti_I2S SamplingRate */
 1873                 tmp = emu_rdptr(sc, 0, EMU_A_SPDIF_SAMPLERATE) & 0xfffff1ff;
 1874                 emu_wrptr(sc, 0, EMU_A_SPDIF_SAMPLERATE, tmp | 0x400);
 1875 
 1876                 /* Setup SRCSel (Enable SPDIF, I2S SRCMulti) */
 1877                 emu_wr(sc, 0x20, 0x00600000, 4);
 1878                 emu_wr(sc, 0x24, 0x00000014, 4);
 1879 
 1880                 /* Setup SRCMulti Input Audio Enable */
 1881                 emu_wr(sc, 0x20, 0x006e0000, 4);
 1882                 emu_wr(sc, 0x24, 0xff00ff00, 4);
 1883         }
 1884 
 1885         SLIST_INIT(&sc->mem.blocks);
 1886         sc->mem.ptb_pages = emu_malloc(sc, EMUMAXPAGES * sizeof(u_int32_t),
 1887             &sc->mem.ptb_pages_addr, &sc->mem.ptb_map);
 1888         if (sc->mem.ptb_pages == NULL)
 1889                 return -1;
 1890 
 1891         sc->mem.silent_page = emu_malloc(sc, EMUPAGESIZE,
 1892             &sc->mem.silent_page_addr, &sc->mem.silent_map);
 1893         if (sc->mem.silent_page == NULL) {
 1894                 emu_free(sc, sc->mem.ptb_pages, sc->mem.ptb_map);
 1895                 return -1;
 1896         }
 1897         /* Clear page with silence & setup all pointers to this page */
 1898         bzero(sc->mem.silent_page, EMUPAGESIZE);
 1899         tmp = (u_int32_t)(sc->mem.silent_page_addr) << 1;
 1900         for (i = 0; i < EMUMAXPAGES; i++)
 1901                 sc->mem.ptb_pages[i] = tmp | i;
 1902 
 1903         emu_wrptr(sc, 0, EMU_PTB, (sc->mem.ptb_pages_addr));
 1904         emu_wrptr(sc, 0, EMU_TCB, 0);   /* taken from original driver */
 1905         emu_wrptr(sc, 0, EMU_TCBS, 0);  /* taken from original driver */
 1906 
 1907         for (ch = 0; ch < NUM_G; ch++) {
 1908                 emu_wrptr(sc, ch, EMU_CHAN_MAPA, tmp | EMU_CHAN_MAP_PTI_MASK);
 1909                 emu_wrptr(sc, ch, EMU_CHAN_MAPB, tmp | EMU_CHAN_MAP_PTI_MASK);
 1910         }
 1911 
 1912         /* emu_memalloc(sc, EMUPAGESIZE); */
 1913         /*
 1914          *  Hokay, now enable the AUD bit
 1915          *
 1916          *  Audigy
 1917          *   Enable Audio = 0 (enabled after fx processor initialization)
 1918          *   Mute Disable Audio = 0
 1919          *   Joystick = 1
 1920          *
 1921          *  Audigy 2
 1922          *   Enable Audio = 1
 1923          *   Mute Disable Audio = 0
 1924          *   Joystick = 1
 1925          *   GP S/PDIF AC3 Enable = 1
 1926          *   CD S/PDIF AC3 Enable = 1
 1927          *
 1928          *  EMU10K1
 1929          *   Enable Audio = 1
 1930          *   Mute Disable Audio = 0
 1931          *   Lock Tank Memory = 1
 1932          *   Lock Sound Memory = 0
 1933          *   Auto Mute = 1
 1934          */
 1935 
 1936         if (sc->audigy) {
 1937                 tmp = EMU_HCFG_AUTOMUTE | EMU_HCFG_JOYENABLE;
 1938                 if (sc->audigy2)        /* Audigy 2 */
 1939                         tmp = EMU_HCFG_AUDIOENABLE | EMU_HCFG_AC3ENABLE_CDSPDIF |
 1940                             EMU_HCFG_AC3ENABLE_GPSPDIF;
 1941                 emu_wr(sc, EMU_HCFG, tmp, 4);
 1942 
 1943                 audigy_initefx(sc);
 1944 
 1945                 /* from ALSA initialization code: */
 1946 
 1947                 /* enable audio and disable both audio/digital outputs */
 1948                 emu_wr(sc, EMU_HCFG, emu_rd(sc, EMU_HCFG, 4) | EMU_HCFG_AUDIOENABLE, 4);
 1949                 emu_wr(sc, EMU_A_IOCFG, emu_rd(sc, EMU_A_IOCFG, 4) & ~EMU_A_IOCFG_GPOUT_AD,
 1950                     4);
 1951                 if (sc->audigy2) {      /* Audigy 2 */
 1952                         /* Unmute Analog.
 1953                          * Set GPO6 to 1 for Apollo. This has to be done after
 1954                          * init Alice3 I2SOut beyond 48kHz.
 1955                          * So, sequence is important.
 1956                          */
 1957                         emu_wr(sc, EMU_A_IOCFG,
 1958                             emu_rd(sc, EMU_A_IOCFG, 4) | EMU_A_IOCFG_GPOUT_A, 4);
 1959                 }
 1960         } else {
 1961                 /* EMU10K1 initialization code */
 1962                 tmp = EMU_HCFG_AUDIOENABLE | EMU_HCFG_LOCKTANKCACHE_MASK 
 1963                     | EMU_HCFG_AUTOMUTE;
 1964                 if (sc->rev >= 6)
 1965                         tmp |= EMU_HCFG_JOYENABLE;
 1966 
 1967                 emu_wr(sc, EMU_HCFG, tmp, 4);
 1968 
 1969                 /* TOSLink detection */
 1970                 sc->tos_link = 0;
 1971                 tmp = emu_rd(sc, EMU_HCFG, 4);
 1972                 if (tmp & (EMU_HCFG_GPINPUT0 | EMU_HCFG_GPINPUT1)) {
 1973                         emu_wr(sc, EMU_HCFG, tmp | EMU_HCFG_GPOUT1, 4);
 1974                         DELAY(50);
 1975                         if (tmp != (emu_rd(sc, EMU_HCFG, 4) & ~EMU_HCFG_GPOUT1)) {
 1976                                 sc->tos_link = 1;
 1977                                 emu_wr(sc, EMU_HCFG, tmp, 4);
 1978                         }
 1979                 }
 1980         }
 1981 
 1982         return 0;
 1983 }
 1984 
 1985 static int
 1986 emu_uninit(struct sc_info *sc)
 1987 {
 1988         u_int32_t ch;
 1989 
 1990         emu_wr(sc, EMU_INTE, 0, 4);
 1991         for (ch = 0; ch < NUM_G; ch++)
 1992                 emu_wrptr(sc, ch, EMU_CHAN_DCYSUSV, ENV_OFF);
 1993         for (ch = 0; ch < NUM_G; ch++) {
 1994                 emu_wrptr(sc, ch, EMU_CHAN_VTFT, 0);
 1995                 emu_wrptr(sc, ch, EMU_CHAN_CVCF, 0);
 1996                 emu_wrptr(sc, ch, EMU_CHAN_PTRX, 0);
 1997                 emu_wrptr(sc, ch, EMU_CHAN_CPF, 0);
 1998         }
 1999 
 2000         if (sc->audigy) {       /* stop fx processor */
 2001                 emu_wrptr(sc, 0, EMU_A_DBG, EMU_A_DBG_SINGLE_STEP);
 2002         }
 2003 
 2004         /* disable audio and lock cache */
 2005         emu_wr(sc, EMU_HCFG,
 2006             EMU_HCFG_LOCKSOUNDCACHE | EMU_HCFG_LOCKTANKCACHE_MASK | EMU_HCFG_MUTEBUTTONENABLE,
 2007             4);
 2008 
 2009         emu_wrptr(sc, 0, EMU_PTB, 0);
 2010         /* reset recording buffers */
 2011         emu_wrptr(sc, 0, EMU_MICBS, EMU_RECBS_BUFSIZE_NONE);
 2012         emu_wrptr(sc, 0, EMU_MICBA, 0);
 2013         emu_wrptr(sc, 0, EMU_FXBS, EMU_RECBS_BUFSIZE_NONE);
 2014         emu_wrptr(sc, 0, EMU_FXBA, 0);
 2015         emu_wrptr(sc, 0, EMU_FXWC, 0);
 2016         emu_wrptr(sc, 0, EMU_ADCBS, EMU_RECBS_BUFSIZE_NONE);
 2017         emu_wrptr(sc, 0, EMU_ADCBA, 0);
 2018         emu_wrptr(sc, 0, EMU_TCB, 0);
 2019         emu_wrptr(sc, 0, EMU_TCBS, 0);
 2020 
 2021         /* disable channel interrupt */
 2022         emu_wrptr(sc, 0, EMU_CLIEL, 0);
 2023         emu_wrptr(sc, 0, EMU_CLIEH, 0);
 2024         emu_wrptr(sc, 0, EMU_SOLEL, 0);
 2025         emu_wrptr(sc, 0, EMU_SOLEH, 0);
 2026 
 2027         /* init envelope engine */
 2028         if (!SLIST_EMPTY(&sc->mem.blocks))
 2029                 device_printf(sc->dev, "warning: memblock list not empty\n");
 2030         emu_free(sc, sc->mem.ptb_pages, sc->mem.ptb_map);
 2031         emu_free(sc, sc->mem.silent_page, sc->mem.silent_map);
 2032 
 2033         if(sc->mpu)
 2034             mpu401_uninit(sc->mpu);
 2035         return 0;
 2036 }
 2037 
 2038 static int
 2039 emu_pci_probe(device_t dev)
 2040 {
 2041         char *s = NULL;
 2042 
 2043         switch (pci_get_devid(dev)) {
 2044         case EMU10K1_PCI_ID:
 2045                 s = "Creative EMU10K1";
 2046                 break;
 2047 
 2048         case EMU10K2_PCI_ID:
 2049                 if (pci_get_revid(dev) == 0x04)
 2050                         s = "Creative Audigy 2 (EMU10K2)";
 2051                 else
 2052                         s = "Creative Audigy (EMU10K2)";
 2053                 break;
 2054 
 2055         case EMU10K3_PCI_ID:
 2056                 s = "Creative Audigy 2 (EMU10K3)";
 2057                 break;
 2058 
 2059         default:
 2060                 return ENXIO;
 2061         }
 2062 
 2063         device_set_desc(dev, s);
 2064         return BUS_PROBE_LOW_PRIORITY;
 2065 }
 2066 
 2067 static int
 2068 emu_pci_attach(device_t dev)
 2069 {
 2070         struct ac97_info *codec = NULL;
 2071         struct sc_info *sc;
 2072         int i, gotmic;
 2073         char status[SND_STATUSLEN];
 2074 
 2075         sc = malloc(sizeof(*sc), M_DEVBUF, M_WAITOK | M_ZERO);
 2076         sc->lock = snd_mtxcreate(device_get_nameunit(dev), "snd_emu10k1 softc");
 2077         sc->dev = dev;
 2078         sc->type = pci_get_devid(dev);
 2079         sc->rev = pci_get_revid(dev);
 2080         sc->audigy = sc->type == EMU10K2_PCI_ID || sc->type == EMU10K3_PCI_ID;
 2081         sc->audigy2 = (sc->audigy && sc->rev == 0x04);
 2082         sc->nchans = sc->audigy ? 8 : 4;
 2083         sc->addrmask = sc->audigy ? EMU_A_PTR_ADDR_MASK : EMU_PTR_ADDR_MASK;
 2084 
 2085         pci_enable_busmaster(dev);
 2086 
 2087         i = PCIR_BAR(0);
 2088         sc->reg = bus_alloc_resource_any(dev, SYS_RES_IOPORT, &i, RF_ACTIVE);
 2089         if (sc->reg == NULL) {
 2090                 device_printf(dev, "unable to map register space\n");
 2091                 goto bad;
 2092         }
 2093         sc->st = rman_get_bustag(sc->reg);
 2094         sc->sh = rman_get_bushandle(sc->reg);
 2095 
 2096         sc->bufsz = pcm_getbuffersize(dev, 4096, EMU_DEFAULT_BUFSZ, 65536);
 2097 
 2098         if (bus_dma_tag_create(/*parent*/bus_get_dma_tag(dev), /*alignment*/2,
 2099                 /*boundary*/0,
 2100                 /*lowaddr*/(1U << 31) - 1, /* can only access 0-2gb */
 2101                 /*highaddr*/BUS_SPACE_MAXADDR,
 2102                 /*filter*/NULL, /*filterarg*/NULL,
 2103                 /*maxsize*/sc->bufsz, /*nsegments*/1, /*maxsegz*/0x3ffff,
 2104                 /*flags*/0, /*lockfunc*/NULL, /*lockarg*/NULL,
 2105                 &sc->parent_dmat) != 0) {
 2106                 device_printf(dev, "unable to create dma tag\n");
 2107                 goto bad;
 2108         }
 2109 
 2110         if (emu_init(sc) == -1) {
 2111                 device_printf(dev, "unable to initialize the card\n");
 2112                 goto bad;
 2113         }
 2114 
 2115         codec = AC97_CREATE(dev, sc, emu_ac97);
 2116         if (codec == NULL) goto bad;
 2117         gotmic = (ac97_getcaps(codec) & AC97_CAP_MICCHANNEL) ? 1 : 0;
 2118         if (mixer_init(dev, ac97_getmixerclass(), codec) == -1) goto bad;
 2119 
 2120         emu_midiattach(sc);
 2121 
 2122         i = 0;
 2123         sc->irq = bus_alloc_resource_any(dev, SYS_RES_IRQ, &i,
 2124             RF_ACTIVE | RF_SHAREABLE);
 2125         if (!sc->irq ||
 2126             snd_setup_intr(dev, sc->irq, INTR_MPSAFE, emu_intr, sc, &sc->ih)) {
 2127                 device_printf(dev, "unable to map interrupt\n");
 2128                 goto bad;
 2129         }
 2130 
 2131         snprintf(status, SND_STATUSLEN, "at io 0x%jx irq %jd %s",
 2132             rman_get_start(sc->reg), rman_get_start(sc->irq),
 2133             PCM_KLDSTRING(snd_emu10k1));
 2134 
 2135         if (pcm_register(dev, sc, sc->nchans, gotmic ? 3 : 2)) goto bad;
 2136         for (i = 0; i < sc->nchans; i++)
 2137                 pcm_addchan(dev, PCMDIR_PLAY, &emupchan_class, sc);
 2138         for (i = 0; i < (gotmic ? 3 : 2); i++)
 2139                 pcm_addchan(dev, PCMDIR_REC, &emurchan_class, sc);
 2140 
 2141         pcm_setstatus(dev, status);
 2142 
 2143         return 0;
 2144 
 2145 bad:
 2146         if (codec) ac97_destroy(codec);
 2147         if (sc->reg) bus_release_resource(dev, SYS_RES_IOPORT, PCIR_BAR(0), sc->reg);
 2148         if (sc->ih) bus_teardown_intr(dev, sc->irq, sc->ih);
 2149         if (sc->irq) bus_release_resource(dev, SYS_RES_IRQ, 0, sc->irq);
 2150         if (sc->parent_dmat) bus_dma_tag_destroy(sc->parent_dmat);
 2151         if (sc->lock) snd_mtxfree(sc->lock);
 2152         free(sc, M_DEVBUF);
 2153         return ENXIO;
 2154 }
 2155 
 2156 static int
 2157 emu_pci_detach(device_t dev)
 2158 {
 2159         int r;
 2160         struct sc_info *sc;
 2161 
 2162         r = pcm_unregister(dev);
 2163         if (r)
 2164                 return r;
 2165 
 2166         sc = pcm_getdevinfo(dev);
 2167         /* shutdown chip */
 2168         emu_uninit(sc);
 2169 
 2170         bus_release_resource(dev, SYS_RES_IOPORT, PCIR_BAR(0), sc->reg);
 2171         bus_teardown_intr(dev, sc->irq, sc->ih);
 2172         bus_release_resource(dev, SYS_RES_IRQ, 0, sc->irq);
 2173         bus_dma_tag_destroy(sc->parent_dmat);
 2174         snd_mtxfree(sc->lock);
 2175         free(sc, M_DEVBUF);
 2176 
 2177         return 0;
 2178 }
 2179 
 2180 /* add suspend, resume */
 2181 static device_method_t emu_methods[] = {
 2182         /* Device interface */
 2183         DEVMETHOD(device_probe,         emu_pci_probe),
 2184         DEVMETHOD(device_attach,        emu_pci_attach),
 2185         DEVMETHOD(device_detach,        emu_pci_detach),
 2186 
 2187         DEVMETHOD_END
 2188 };
 2189 
 2190 static driver_t emu_driver = {
 2191         "pcm",
 2192         emu_methods,
 2193         PCM_SOFTC_SIZE,
 2194 };
 2195 
 2196 DRIVER_MODULE(snd_emu10k1, pci, emu_driver, NULL, NULL);
 2197 MODULE_DEPEND(snd_emu10k1, sound, SOUND_MINVER, SOUND_PREFVER, SOUND_MAXVER);
 2198 MODULE_VERSION(snd_emu10k1, 1);
 2199 MODULE_DEPEND(snd_emu10k1, midi, 1, 1, 1);
 2200 
 2201 /* dummy driver to silence the joystick device */
 2202 static int
 2203 emujoy_pci_probe(device_t dev)
 2204 {
 2205         char *s = NULL;
 2206 
 2207         switch (pci_get_devid(dev)) {
 2208         case 0x70021102:
 2209                 s = "Creative EMU10K1 Joystick";
 2210                 device_quiet(dev);
 2211                 break;
 2212         case 0x70031102:
 2213                 s = "Creative EMU10K2 Joystick";
 2214                 device_quiet(dev);
 2215                 break;
 2216         }
 2217 
 2218         if (s) device_set_desc(dev, s);
 2219         return s ? -1000 : ENXIO;
 2220 }
 2221 
 2222 static int
 2223 emujoy_pci_attach(device_t dev)
 2224 {
 2225 
 2226         return 0;
 2227 }
 2228 
 2229 static int
 2230 emujoy_pci_detach(device_t dev)
 2231 {
 2232 
 2233         return 0;
 2234 }
 2235 
 2236 static device_method_t emujoy_methods[] = {
 2237         DEVMETHOD(device_probe,         emujoy_pci_probe),
 2238         DEVMETHOD(device_attach,        emujoy_pci_attach),
 2239         DEVMETHOD(device_detach,        emujoy_pci_detach),
 2240 
 2241         DEVMETHOD_END
 2242 };
 2243 
 2244 static driver_t emujoy_driver = {
 2245         "emujoy",
 2246         emujoy_methods,
 2247         1       /* no softc */
 2248 };
 2249 
 2250 DRIVER_MODULE(emujoy, pci, emujoy_driver, NULL, NULL);

Cache object: ade00533ffd2358d8810c356746c5adf


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.