42#ifdef HAVE_KERNEL_OPTION_HEADERS
64#define ENVY24HT_PLAY_CHNUM 8
65#define ENVY24HT_REC_CHNUM 2
66#define ENVY24HT_PLAY_BUFUNIT (4 * 8 )
67#define ENVY24HT_REC_BUFUNIT (4 * 2 )
68#define ENVY24HT_SAMPLE_NUM 4096
70#define ENVY24HT_TIMEOUT 1000
72#define ENVY24HT_DEFAULT_FORMAT SND_FORMAT(AFMT_S16_LE, 2, 0)
74#define ENVY24HT_NAMELEN 32
108 void *(*create)(device_t
dev,
void *
devinfo,
int dir,
int num);
110 void (*
init)(
void *codec);
111 void (*
reinit)(
void *codec);
136 bus_space_handle_t
csh;
141 bus_space_handle_t
mth;
145 struct resource *
irq;
268 192000, 176400, 96000, 88200, 64000, 48000, 44100, 32000, 24000, 22050, 16000,
269 12000, 11025, 9600, 8000, 0
284 "Envy24HT audio (Terratec Aureon 7.1 Space)",
286 0x0b, 0x80, 0xfc, 0xc3,
287 0x21efff, 0x7fffff, 0x5e1000,
288 0x40000, 0x80000, 0x1000, 0x00, 0x02,
293 "Envy24HT audio (Terratec Aureon 5.1 Sky)",
295 0x0a, 0x80, 0xfc, 0xc3,
296 0x21efff, 0x7fffff, 0x5e1000,
297 0x40000, 0x80000, 0x1000, 0x00, 0x02,
302 "Envy24HT audio (Terratec Aureon 7.1 Universe)",
304 0x0b, 0x80, 0xfc, 0xc3,
305 0x21efff, 0x7fffff, 0x5e1000,
306 0x40000, 0x80000, 0x1000, 0x00, 0x02,
311 "Envy24HT audio (AudioTrak Prodigy 7.1)",
313 0x0b, 0x80, 0xfc, 0xc3,
314 0x21efff, 0x7fffff, 0x5e1000,
315 0x40000, 0x80000, 0x1000, 0x00, 0x02,
320 "Envy24HT audio (Terratec PHASE 28)",
322 0x0b, 0x80, 0xfc, 0xc3,
323 0x21efff, 0x7fffff, 0x5e1000,
324 0x40000, 0x80000, 0x1000, 0x00, 0x02,
329 "Envy24HT-S audio (Terratec PHASE 22)",
331 0x10, 0x80, 0xf0, 0xc3,
332 0x7ffbc7, 0x7fffff, 0x438,
333 0x10, 0x20, 0x400, 0x01, 0x00,
338 "Envy24HT audio (AudioTrak Prodigy 7.1 LT)",
340 0x4b, 0x80, 0xfc, 0xc3,
341 0x7ff8ff, 0x7fffff, 0x700,
342 0x400, 0x200, 0x100, 0x00, 0x02,
347 "Envy24HT audio (AudioTrak Prodigy 7.1 XT)",
349 0x4b, 0x80, 0xfc, 0xc3,
350 0x7ff8ff, 0x7fffff, 0x700,
351 0x400, 0x200, 0x100, 0x00, 0x02,
356 "Envy24HT audio (M-Audio Revolution 7.1)",
358 0x43, 0x80, 0xf8, 0xc1,
359 0x3fff85, 0x400072, 0x4000fa,
360 0x08, 0x02, 0x20, 0x00, 0x04,
365 "Envy24GT audio (M-Audio Revolution 5.1)",
367 0x42, 0x80, 0xf8, 0xc1,
368 0x3fff05, 0x4000f0, 0x4000fa,
369 0x08, 0x02, 0x10, 0x00, 0x03,
374 "Envy24HT audio (M-Audio Audiophile 192)",
376 0x68, 0x80, 0xf8, 0xc3,
377 0x45, 0x4000b5, 0x7fffba,
378 0x08, 0x02, 0x10, 0x00, 0x03,
383 "Envy24HT audio (AudioTrak Prodigy HD2)",
385 0x68, 0x80, 0x78, 0xc3,
386 0xfff8ff, 0x200700, 0xdfffff,
387 0x400, 0x200, 0x100, 0x00, 0x05,
392 "Envy24HT audio (ESI Juli@)",
394 0x20, 0x80, 0xf8, 0xc3,
395 0x7fff9f, 0x8016, 0x7fff9f,
396 0x08, 0x02, 0x10, 0x00, 0x03,
401 "Envy24HT-S audio (Terrasoniq TS22PCI)",
403 0x10, 0x80, 0xf0, 0xc3,
404 0x7ffbc7, 0x7fffff, 0x438,
405 0x10, 0x20, 0x400, 0x01, 0x00,
410 "Envy24HT audio (Generic)",
412 0x0b, 0x80, 0xfc, 0xc3,
413 0x21efff, 0x7fffff, 0x5e1000,
414 0x40000, 0x80000, 0x1000, 0x00, 0x02,
531 device_printf(sc->
dev,
"envy24ht_rdi2c(sc, 0x%02x, 0x%02x)\n",
dev,
addr);
557 device_printf(sc->
dev,
"envy24ht_rdi2c(): return 0x%x\n",
data);
569 device_printf(sc->
dev,
"envy24ht_rdi2c(sc, 0x%02x, 0x%02x)\n",
dev,
addr);
603 device_printf(sc->
dev,
"envy24ht_rdrom(sc, 0x%02x)\n",
addr);
608 device_printf(sc->
dev,
"envy24ht_rdrom(): E2PROM not presented\n");
624 device_printf(sc->
dev,
"envy24ht_rom2cfg(sc)\n");
629 device_printf(sc->
dev,
"envy24ht_rom2cfg(): ENVY24HT_E2PROM_SIZE-->%d\n",
size);
631 buff = malloc(
sizeof(*buff), M_ENVY24HT, M_NOWAIT);
634 device_printf(sc->
dev,
"envy24ht_rom2cfg(): malloc()\n");
652 buff->
cdti = 0x40000;
653 buff->
cclk = 0x80000;
671 buff = malloc(
sizeof(*buff), M_ENVY24HT, M_NOWAIT);
674 device_printf(sc->
dev,
"envy24ht_rom2cfg(): malloc()\n");
713 free(cfg, M_ENVY24HT);
723envy24ht_coldcd(
struct sc_info *sc)
729 device_printf(sc->
dev,
"envy24ht_coldcd()\n");
731 envy24ht_wrmt(sc, ENVY24HT_MT_AC97CMD, ENVY24HT_MT_AC97CMD_CLD, 1);
737 if (
data & ENVY24HT_MT_AC97CMD_RDY) {
746envy24ht_slavecd(
struct sc_info *sc)
752 device_printf(sc->
dev,
"envy24ht_slavecd()\n");
755 ENVY24HT_MT_AC97CMD_CLD | ENVY24HT_MT_AC97CMD_WRM, 1);
761 if (
data & ENVY24HT_MT_AC97CMD_RDY) {
777 device_printf(sc->
dev,
"envy24ht_rdcd(obj, sc, 0x%02x)\n",
regno);
780 envy24ht_wrmt(sc, ENVY24HT_MT_AC97CMD, ENVY24HT_MT_AC97CMD_RD, 1);
783 if ((
data & ENVY24HT_MT_AC97CMD_RD) == 0)
789 device_printf(sc->
dev,
"envy24ht_rdcd(): return 0x%x\n",
data);
802 device_printf(sc->
dev,
"envy24ht_wrcd(obj, sc, 0x%02x, 0x%04x)\n",
regno,
data);
806 envy24ht_wrmt(sc, ENVY24HT_MT_AC97CMD, ENVY24HT_MT_AC97CMD_WR, 1);
809 if ((cmd & ENVY24HT_MT_AC97CMD_WR) == 0)
816static kobj_method_t envy24ht_ac97_methods[] = {
817 KOBJMETHOD(ac97_read, envy24ht_rdcd),
818 KOBJMETHOD(ac97_write, envy24ht_wrcd),
841 device_printf(sc->
dev,
"envy24ht_gpiowr(sc, 0x%02x)\n",
data & 0x7FFFFF);
852envy24ht_gpiogetmask(
struct sc_info *sc)
869envy24ht_gpiogetdir(
struct sc_info *sc)
922 device_printf(sc->
dev,
"envy24ht_spi_create(dev, sc, %d, %d)\n",
dir,
num);
925 buff = malloc(
sizeof(*buff), M_ENVY24HT, M_NOWAIT);
935 if (buff->
info == NULL) {
936 free(buff, M_ENVY24HT);
954 device_printf(ptr->
parent->
dev,
"envy24ht_spi_destroy()\n");
966 free(codec, M_ENVY24HT);
976 device_printf(ptr->
parent->
dev,
"envy24ht_spicds_init()\n");
1002 device_printf(ptr->
parent->
dev,
"envy24ht_spi_reinit()\n");
1015 device_printf(ptr->
parent->
dev,
"envy24ht_spi_set()\n");
1049 u_int32_t
code, i2sfmt;
1053 device_printf(sc->
dev,
"envy24ht_setspeed(sc, %d)\n",
speed);
1056 envy24ht_slavecd(sc);
1079 i2sfmt &= ~ENVY24HT_MT_I2S_MLR128;
1094 device_printf(sc->
dev,
"envy24ht_setspeed(): return %d\n",
speed);
1103 device_printf(sc->
dev,
"envy24ht_setvolume(sc, %d)\n", ch);
1117 device_printf(sc->
dev,
"envy24ht_mutevolume(sc, %d)\n", ch);
1133 device_printf(sc->
dev,
"envy24ht_gethwptr(sc, %d)\n",
dir);
1136 rtn = sc->
psize / 4;
1141 rtn = sc->
rsize / 4;
1151 device_printf(sc->
dev,
"envy24ht_gethwptr(): return %d\n", rtn);
1159 int regptr, regintr;
1161 u_int32_t ptr,
size, cnt;
1165 device_printf(sc->
dev,
"envy24ht_updintr(sc, %d)\n",
dir);
1172 mask = ~ENVY24HT_MT_INT_PMASK;
1179 mask = ~ENVY24HT_MT_INT_RMASK;
1190 device_printf(sc->
dev,
"envy24ht_updintr():ptr = %d, blk = %d, cnt = %d\n", ptr, blk, cnt);
1195 device_printf(sc->
dev,
"envy24ht_updintr():intr = 0x%02x, mask = 0x%02x\n",
intr,
mask);
1199 device_printf(sc->
dev,
"envy24ht_updintr():INT-->0x%02x\n",
1208envy24ht_maskintr(
struct sc_info *sc,
int dir)
1213 device_printf(sc->
dev,
"envy24ht_maskintr(sc, %d)\n",
dir);
1232 device_printf(sc->
dev,
"envy24ht_checkintr(sc, %d)\n",
dir);
1237 mask = ~ENVY24HT_MT_INT_RSTAT;
1246 mask = ~ENVY24HT_MT_INT_PSTAT;
1265 device_printf(sc->
dev,
"envy24ht_start(sc, %d)\n",
dir);
1289 device_printf(sc->
dev,
"envy24ht_stop(sc, %d)\n",
dir);
1292 sw = ~ENVY24HT_MT_PCTL_PSTART;
1294 sw = ~ENVY24HT_MT_PCTL_RSTART;
1304envy24ht_route(
struct sc_info *sc,
int dac,
int class,
int adc,
int rev)
1319 int src, dst, ssize, dsize,
slot;
1327 ssize = ch->
size / 4;
1328 dsize = ch->
size / 8;
1331 for (i = 0; i < length; i++) {
1349 int src, dst, ssize, dsize,
slot;
1353 device_printf(ch->
parent->
dev,
"envy24ht_p16sl()\n");
1360 ssize = ch->
size / 2;
1361 dsize = ch->
size / 4;
1364 device_printf(ch->
parent->
dev,
"envy24ht_p16sl():%lu-->%lu(%lu)\n",
src, dst, length);
1367 for (i = 0; i < length; i++) {
1394 int src, dst, ssize, dsize,
slot;
1403 dsize = ch->
size / 4;
1406 for (i = 0; i < length; i++) {
1424 int src, dst, ssize, dsize,
slot;
1432 dsize = ch->
size / 4;
1433 ssize = ch->
size / 8;
1436 for (i = 0; i < length; i++) {
1454 int src, dst, ssize, dsize,
slot;
1462 dsize = ch->
size / 2;
1463 ssize = ch->
size / 8;
1466 for (i = 0; i < length; i++) {
1489 device_printf(sc->
dev,
"envy24htchan_init(obj, devinfo, b, c, %d)\n",
dir);
1503 ch->
data = malloc(ch->
size, M_ENVY24HT, M_NOWAIT);
1504 if (ch->
data == NULL) {
1534 device_printf(sc->
dev,
"envy24htchan_free()\n");
1556 device_printf(sc->
dev,
"envy24htchan_setformat(obj, data, 0x%08x)\n",
format);
1564 if (emltab == NULL) {
1568 for (i = 0; emltab[i].
format != 0; i++)
1571 if (emltab[i].
format == 0) {
1593 bcnt = ch->
size / bsize;
1599 device_printf(sc->
dev,
"envy24htchan_setformat(): return 0x%08x\n", 0);
1620 device_printf(ch->
parent->
dev,
"envy24htchan_setspeed(obj, data, %d)\n",
speed);
1632 device_printf(ch->
parent->
dev,
"envy24htchan_setspeed(): return %d\n", ch->
speed);
1643 unsigned int bcnt, bsize;
1646 device_printf(sc->
dev,
"envy24htchan_setblocksize(obj, data, %d)\n",
blocksize);
1669 bcnt = ch->
size / bsize;
1674 device_printf(sc->
dev,
"envy24htchan_setblocksize(): return %d\n",
prev);
1691 device_printf(sc->
dev,
"envy24htchan_trigger(obj, data, %d)\n",
go);
1701 device_printf(sc->
dev,
"envy24htchan_trigger(): start\n");
1704 if (sc->
run[0] == 0 && sc->
run[1] == 0) {
1740 device_printf(sc->
dev,
"envy24htchan_trigger(): emldmawr\n");
1750 device_printf(sc->
dev,
"envy24htchan_trigger(): emldmard\n");
1761 device_printf(sc->
dev,
"envy24htchan_trigger(): abort\n");
1798 device_printf(sc->
dev,
"envy24htchan_getptr()\n");
1806 device_printf(sc->
dev,
"envy24htchan_getptr(): return %d\n",
1820 device_printf(sc->
dev,
"envy24htchan_getcaps()\n");
1824 if (sc->
run[0] == 0)
1830 if (sc->
run[1] == 0)
1863 device_printf(sc->
dev,
"envy24htmixer_init()\n");
1892 device_printf(sc->
dev,
"envy24htmixer_reinit()\n");
1906 device_printf(sc->
dev,
"envy24htmixer_uninit()\n");
1924 if (
dev != 0 &&
ch == -1)
1928 device_printf(sc->
dev,
"envy24htmixer_set(m, %d, %d, %d)\n",
1934 for (i = 0; i < sc->
dacn; i++) {
1960 device_printf(sc->
dev,
"envy24htmixer_setrecsrc(m, %d)\n",
src);
1986 u_int32_t ptr, dsize,
feed;
1990 device_printf(sc->
dev,
"envy24ht_intr()\n");
1995 device_printf(sc->
dev,
"envy24ht_intr(): play\n");
1997 dsize = sc->
psize / 4;
2000 device_printf(sc->
dev,
"envy24ht_intr(): ptr = %d-->", ptr);
2002 ptr -= ptr % sc->
blk[0];
2003 feed = (ptr + dsize - sc->
intr[0]) % dsize;
2005 printf(
"%d intr = %d feed = %d\n", ptr, sc->
intr[0],
feed);
2011 device_printf(sc->
dev,
"envy24ht_intr(): chan[%d].blk = %d\n", i, ch->
blk);
2024 device_printf(sc->
dev,
"envy24ht_intr(): rec\n");
2026 dsize = sc->
rsize / 4;
2028 ptr -= ptr % sc->
blk[1];
2029 feed = (ptr + dsize - sc->
intr[1]) % dsize;
2057 printf(
"envy24ht_pci_probe()\n");
2061 sv = pci_get_subvendor(
dev);
2062 sd = pci_get_subdevice(
dev);
2071 printf(
"envy24ht_pci_probe(): return 0\n");
2077 printf(
"envy24ht_pci_probe(): return ENXIO\n");
2088 sc->
paddr = segs->ds_addr;
2090 device_printf(sc->
dev,
"envy24ht_dmapsetmap()\n");
2092 printf(
"envy24ht(play): setmap %lx, %lx; ",
2093 (
unsigned long)segs->ds_addr,
2094 (
unsigned long)segs->ds_len);
2106 sc->
raddr = segs->ds_addr;
2108 device_printf(sc->
dev,
"envy24ht_dmarsetmap()\n");
2110 printf(
"envy24ht(record): setmap %lx, %lx; ",
2111 (
unsigned long)segs->ds_addr,
2112 (
unsigned long)segs->ds_len);
2123 device_printf(sc->
dev,
"envy24ht_dmafree():");
2124 printf(
" sc->raddr(0x%08x)", (u_int32_t)sc->
raddr);
2125 printf(
" sc->paddr(0x%08x)", (u_int32_t)sc->
paddr);
2126 if (sc->
rbuf) printf(
" sc->rbuf(0x%08x)", (u_int32_t)sc->
rbuf);
2127 else printf(
" sc->rbuf(null)");
2128 if (sc->
pbuf) printf(
" sc->pbuf(0x%08x)\n", (u_int32_t)sc->
pbuf);
2129 else printf(
" sc->pbuf(null)\n");
2133 bus_dmamap_unload(sc->
dmat, sc->
rmap);
2135 bus_dmamap_unload(sc->
dmat, sc->
pmap);
2141 bus_dmamap_unload(sc->
dmat, sc->
rmap);
2142 bus_dmamap_unload(sc->
dmat, sc->
pmap);
2159 device_printf(sc->
dev,
"envy24ht_dmainit()\n");
2167 sc->
blk[0] = sc->
blk[1] = 0;
2171 device_printf(sc->
dev,
"envy24ht_dmainit(): bus_dmamem_alloc(): sc->pbuf\n");
2173 if (bus_dmamem_alloc(sc->
dmat, (
void **)&sc->
pbuf, BUS_DMA_NOWAIT, &sc->
pmap))
2176 device_printf(sc->
dev,
"envy24ht_dmainit(): bus_dmamem_alloc(): sc->rbuf\n");
2178 if (bus_dmamem_alloc(sc->
dmat, (
void **)&sc->
rbuf, BUS_DMA_NOWAIT, &sc->
rmap))
2181 device_printf(sc->
dev,
"envy24ht_dmainit(): bus_dmamem_load(): sc->pmap\n");
2186 device_printf(sc->
dev,
"envy24ht_dmainit(): bus_dmamem_load(): sc->rmap\n");
2202 device_printf(sc->
dev,
"system configuration\n");
2203 printf(
" SubVendorID: 0x%04x, SubDeviceID: 0x%04x\n",
2205 printf(
" XIN2 Clock Source: ");
2208 printf(
"24.576MHz(96kHz*256)\n");
2211 printf(
"49.152MHz(192kHz*256)\n");
2214 printf(
"reserved\n");
2217 printf(
"illegal system setting\n");
2219 printf(
" MPU-401 UART(s) #: ");
2223 printf(
"not implemented\n");
2228 printf(
"%d\n", sc->
adcn);
2233 printf(
" and SPDIF receiver connected\n");
2236 printf(
" no physical inputs\n");
2239 printf(
"%d\n", sc->
dacn);
2240 printf(
" Multi-track converter type: ");
2242 printf(
"AC'97(SDATA_OUT:");
2252 printf(
"with volume, ");
2254 printf(
"192KHz support, ");
2257 printf(
"192KHz support, ");
2259 printf(
"48KHz support, ");
2262 printf(
"16bit resolution, ");
2265 printf(
"18bit resolution, ");
2268 printf(
"20bit resolution, ");
2271 printf(
"24bit resolution, ");
2276 printf(
" S/PDIF(IN/OUT): ");
2287 printf(
" GPIO(mask/dir/state): 0x%02x/0x%02x/0x%02x\n",
2302 device_printf(sc->
dev,
"envy24ht_init()\n");
2322 sv = pci_get_subvendor(sc->
dev);
2323 sd = pci_get_subdevice(sc->
dev);
2326 device_printf(sc->
dev,
"Set configuration from table\n");
2332 if (sc->
cfg == NULL) {
2358 for (i = 0; i < sc->
adcn; i++) {
2362 for (i = 0; i < sc->
dacn; i++) {
2369 device_printf(sc->
dev,
"envy24ht_init(): initialize DMA buffer\n");
2375 sc->
run[0] = sc->
run[1] = 0;
2383 envy24ht_route(sc, ENVY24HT_ROUTE_DAC_1, ENVY24HT_ROUTE_CLASS_MIX, 0, 0);
2384 envy24ht_route(sc, ENVY24HT_ROUTE_DAC_SPDIF, ENVY24HT_ROUTE_CLASS_DMA, 0, 0);
2385 envy24ht_route(sc, ENVY24HT_ROUTE_DAC_SPDIF, ENVY24HT_ROUTE_CLASS_MIX, 0, 0);
2393 device_printf(sc->
dev,
"envy24ht_init(): CCS_IMASK-->0x%02x\n",
data);
2404 sc->
cs = bus_alloc_resource_any(sc->
dev, SYS_RES_IOPORT,
2405 &sc->
csid, RF_ACTIVE);
2407 sc->
mt = bus_alloc_resource_any(sc->
dev, SYS_RES_IOPORT,
2408 &sc->
mtid, RF_ACTIVE);
2409 if (!sc->
cs || !sc->
mt) {
2410 device_printf(sc->
dev,
"unable to map IO port space\n");
2413 sc->
cst = rman_get_bustag(sc->
cs);
2414 sc->
csh = rman_get_bushandle(sc->
cs);
2415 sc->
mtt = rman_get_bustag(sc->
mt);
2416 sc->
mth = rman_get_bushandle(sc->
mt);
2418 device_printf(sc->
dev,
2419 "IO port register values\nCCS: 0x%lx\nMT: 0x%lx\n",
2426 sc->
irq = bus_alloc_resource_any(sc->
dev, SYS_RES_IRQ, &sc->
irqid,
2427 RF_ACTIVE | RF_SHAREABLE);
2430 device_printf(sc->
dev,
"unable to map interrupt\n");
2435 if (bus_dma_tag_create(bus_get_dma_tag(sc->
dev),
2438 BUS_SPACE_MAXADDR_32BIT,
2444 NULL, &sc->
dmat) != 0) {
2445 device_printf(sc->
dev,
"unable to create dma tag\n");
2461 device_printf(
dev,
"envy24ht_pci_attach()\n");
2464 if ((sc = malloc(
sizeof(*sc), M_ENVY24HT, M_NOWAIT)) == NULL) {
2465 device_printf(
dev,
"cannot allocate softc\n");
2469 bzero(sc,
sizeof(*sc));
2471 "snd_envy24ht softc");
2475 pci_enable_busmaster(
dev);
2480 device_printf(
dev,
"unable to allocate system resources\n");
2487 device_printf(
dev,
"unable to initialize the card\n");
2504 for (i = 0; i < 2 + sc->
adcn; i++) {
2511 "at io 0x%jx:%jd,0x%jx:%jd irq %jd",
2512 rman_get_start(sc->
cs),
2513 rman_get_end(sc->
cs) - rman_get_start(sc->
cs) + 1,
2514 rman_get_start(sc->
mt),
2515 rman_get_end(sc->
mt) - rman_get_start(sc->
mt) + 1,
2516 rman_get_start(sc->
irq));
2523 bus_teardown_intr(
dev, sc->
irq, sc->
ih);
2525 bus_release_resource(
dev, SYS_RES_IRQ, sc->
irqid, sc->
irq);
2528 bus_dma_tag_destroy(sc->
dmat);
2530 for (i = 0; i < sc->
adcn; i++)
2532 for (i = 0; i < sc->
dacn; i++)
2537 bus_release_resource(
dev, SYS_RES_IOPORT, sc->
csid, sc->
cs);
2539 bus_release_resource(
dev, SYS_RES_IOPORT, sc->
mtid, sc->
mt);
2542 free(sc, M_ENVY24HT);
2554 device_printf(
dev,
"envy24ht_pci_detach()\n");
2565 for (i = 0; i < sc->
adcn; i++)
2567 for (i = 0; i < sc->
dacn; i++)
2571 bus_dma_tag_destroy(sc->
dmat);
2572 bus_teardown_intr(
dev, sc->
irq, sc->
ih);
2573 bus_release_resource(
dev, SYS_RES_IRQ, sc->
irqid, sc->
irq);
2574 bus_release_resource(
dev, SYS_RES_IOPORT, sc->
csid, sc->
cs);
2575 bus_release_resource(
dev, SYS_RES_IOPORT, sc->
mtid, sc->
mt);
2577 free(sc, M_ENVY24HT);
#define AC97_DECLARE(name)
int sndbuf_setup(struct snd_dbuf *b, void *buf, unsigned int size)
unsigned int sndbuf_getfreeptr(struct snd_dbuf *b)
unsigned int sndbuf_getfree(struct snd_dbuf *b)
unsigned int sndbuf_getready(struct snd_dbuf *b)
int sndbuf_resize(struct snd_dbuf *b, unsigned int blkcnt, unsigned int blksz)
unsigned int sndbuf_getreadyptr(struct snd_dbuf *b)
void chn_intr(struct pcm_channel *c)
struct pcmchan_matrix * m
#define BUS_SPACE_MAXSIZE_ENVY24
static u_int32_t envy24htchan_setblocksize(kobj_t, void *, u_int32_t)
static int envy24htmixer_uninit(struct snd_mixer *)
static kobj_method_t envy24htchan_methods[]
static void * envy24htchan_init(kobj_t, void *, struct snd_dbuf *, struct pcm_channel *, int)
static int envy24htchan_setformat(kobj_t, void *, u_int32_t)
static void envy24ht_spi_reinit(void *)
static void envy24ht_r16sl(struct sc_chinfo *)
static void envy24ht_start(struct sc_info *sc, int dir)
DRIVER_MODULE(snd_envy24ht, pci, envy24ht_driver, pcm_devclass, 0, 0)
static void envy24ht_p32sl(struct sc_chinfo *)
static void envy24ht_gpiosetmask(struct sc_info *sc, u_int32_t mask)
static int envy24ht_init(struct sc_info *sc)
static u_int32_t envy24htchan_getptr(kobj_t, void *)
static u_int32_t envy24ht_rdcs(struct sc_info *sc, int regno, int size)
static int envy24ht_pci_probe(device_t dev)
static struct envy24ht_emldma envy24ht_pemltab[]
static struct pcmchan_caps envy24ht_reccaps
static int envy24ht_pci_attach(device_t dev)
#define ENVY24HT_PLAY_CHNUM
static void * envy24ht_spi_create(device_t, void *, int, int)
static void envy24ht_p8u(struct sc_chinfo *)
static struct pcmchan_caps * envy24htchan_getcaps(kobj_t, void *)
static void envy24ht_stop(struct sc_info *sc, int dir)
static int envy24ht_pci_detach(device_t dev)
static void envy24ht_dmarsetmap(void *arg, bus_dma_segment_t *segs, int nseg, int error)
static void envy24ht_gpiosetdir(struct sc_info *sc, u_int32_t dir)
static int envy24ht_mixmap[]
#define ENVY24HT_REC_CHNUM
static int envy24ht_rdi2c(struct sc_info *sc, u_int32_t dev, u_int32_t addr)
static u_int32_t envy24ht_setspeed(struct sc_info *sc, u_int32_t speed)
static int envy24htmixer_init(struct snd_mixer *)
static int envy24htchan_free(kobj_t obj, void *data)
static struct codec_entry spi_codec
static struct @6 envy24ht_speedtab[]
static void envy24ht_p16sl(struct sc_chinfo *)
static struct cfg_info cfg_table[]
static void envy24ht_intr(void *p)
static void envy24ht_spi_setvolume(void *, int, unsigned int, unsigned int)
static int envy24htmixer_reinit(struct snd_mixer *)
static u_int32_t envy24htchan_setspeed(kobj_t, void *, u_int32_t)
static kobj_method_t envy24htmixer_methods[]
SND_DECLARE_FILE("$FreeBSD$")
static device_method_t envy24ht_methods[]
static void envy24ht_wrcs(struct sc_info *sc, int regno, u_int32_t data, int size)
static void envy24ht_spi_init(void *)
static MALLOC_DEFINE(M_ENVY24HT, "envy24ht", "envy24ht audio")
static void envy24ht_mutevolume(struct sc_info *sc, unsigned ch)
static int envy24ht_checkintr(struct sc_info *sc, int dir)
static struct pcmchan_caps envy24ht_playcaps
static int envy24ht_rdrom(struct sc_info *sc, u_int32_t addr)
static void envy24ht_gpiowr(struct sc_info *sc, u_int32_t data)
static int envy24ht_wri2c(struct sc_info *sc, u_int32_t dev, u_int32_t addr, u_int32_t data)
static int envy24ht_dmainit(struct sc_info *sc)
static u_int32_t envy24ht_gethwptr(struct sc_info *sc, int dir)
MODULE_VERSION(snd_envy24ht, 1)
static int envy24htmixer_set(struct snd_mixer *, unsigned, unsigned, unsigned)
static void envy24ht_dmapsetmap(void *arg, bus_dma_segment_t *segs, int nseg, int error)
static driver_t envy24ht_driver
MIXER_DECLARE(envy24htmixer)
static u_int32_t envy24ht_recfmt[]
static void envy24ht_spi_ctl(void *codec, unsigned int cs, unsigned int cclk, unsigned int cdti)
static int envy24htchan_trigger(kobj_t, void *, int)
static u_int32_t envy24ht_gpiord(struct sc_info *sc)
static u_int32_t envy24ht_speed[]
#define ENVY24HT_SAMPLE_NUM
static void envy24ht_cfgfree(struct cfg_info *cfg)
#define ENVY24HT_PLAY_BUFUNIT
static struct cfg_info * envy24ht_rom2cfg(struct sc_info *sc)
#define ENVY24HT_REC_BUFUNIT
static u_int32_t envy24ht_playfmt[]
static u_int32_t envy24htmixer_setrecsrc(struct snd_mixer *, u_int32_t)
static struct envy24ht_emldma envy24ht_remltab[]
static void envy24ht_setvolume(struct sc_info *sc, unsigned ch)
MODULE_DEPEND(snd_envy24ht, sound, SOUND_MINVER, SOUND_PREFVER, SOUND_MAXVER)
static unsigned envy24ht_chanmap[ENVY24HT_CHAN_NUM]
static void envy24ht_spi_destroy(void *)
static void envy24ht_updintr(struct sc_info *sc, int dir)
static void envy24ht_dmafree(struct sc_info *sc)
static u_int32_t envy24ht_rdmt(struct sc_info *sc, int regno, int size)
static int envy24ht_alloc_resource(struct sc_info *sc)
static void envy24ht_wrmt(struct sc_info *sc, int regno, u_int32_t data, int size)
CHANNEL_DECLARE(envy24htchan)
static void envy24ht_putcfg(struct sc_info *sc)
static void envy24ht_r32sl(struct sc_chinfo *)
#define ENVY24HT_CCS_I2CDATA
#define ENVY24HT_CCS_I2CDEV_RD
#define ENVY24HT_MT_INT_PSTAT
#define ENVY24HT_CHAN_REC_MIX
#define ENVY24HT_CCS_SPDIF
#define ENVY24HT_CCS_GPIO_HMASK
#define ENVY24HT_MT_PCTL_RSTART
#define ENVY24HT_CCS_I2CDEV
#define ENVY24HT_E2PROM_SCFG
#define ENVY24HT_E2PROM_SUBVENDOR
#define ENVY24HT_MT_RATE_96000
#define ENVY24HT_VOL_MUTE
#define ENVY24HT_CHAN_REC_ADC3
#define ENVY24HT_MT_RATE_48000
#define ENVY24HT_CHAN_REC_ADC1
#define ENVY24HT_CCSM_SPDIF_ID
#define ENVY24HT_MT_INT_RSTAT
#define ENVY24HT_CCSM_I2S_18BIT
#define ENVY24HT_CCSM_I2S_RES
#define ENVY24HT_CCSM_I2S_96KHZ
#define ENVY24HT_CCS_I2CDEV_ADDR
#define ENVY24HT_E2PROM_SUBDEVICE
#define ENVY24HT_CCS_SCFG
#define ENVY24HT_MT_RATE_24000
#define ENVY24HT_MT_RATE_64000
#define ENVY24HT_CHAN_PLAY_SPDIF
#define ENVY24HT_CCS_I2CSTAT
#define ENVY24HT_MT_RATE_12000
#define ENVY24HT_CCSM_SPDIF_IN
#define ENVY24HT_MT_RATE_SPDIF
#define ENVY24HT_CCS_IMASK
#define ENVY24HT_CHAN_PLAY_DAC4
#define ENVY24HT_MT_INT_MASK
#define ENVY24HT_CCSM_SPDIF_OUT
#define ENVY24HT_CCS_CTL_RESET
#define ENVY24HT_MIX_MASK
#define ENVY24HT_CCS_IMASK_PMT
#define ENVY24HT_CCSM_ACL_OMODE
#define ENVY24HT_CCS_I2CDEV_WR
#define ENVY24HT_MT_RATE_9600
#define ENVY24HT_CHAN_REC_SPDIF
#define ENVY24HT_MT_RATE_11025
#define ENVY24HT_CCSM_I2S_16BIT
#define ENVY24HT_CCS_GPIO_CTLDIR
#define ENVY24HT_CCSM_SCFG_MPU
#define ENVY24HT_MT_I2S_MLR128
#define ENVY24HT_MT_RATE_176400
#define ENVY24HT_MT_RATE_16000
#define ENVY24HT_MT_RATE_8000
#define ENVY24HT_E2PROM_I2S
#define ENVY24HT_CCS_I2CSTAT_ROM
#define ENVY24HT_E2PROM_SPDIF
#define ENVY24HT_E2PROM_GPIOSTATE
#define ENVY24HT_CCSM_SCFG_ADC
#define ENVY24HT_CCS_I2CSTAT_BSY
#define ENVY24HT_MT_PADDR
#define ENVY24HT_CHAN_PLAY_DAC1
#define ENVY24HT_CHAN_PLAY_DAC3
#define ENVY24HT_MT_RATE_32000
#define ENVY24HT_CCSM_I2S_24BIT
#define ENVY24HT_MT_PCTL_PSTART
#define ENVY24HT_CHAN_REC_ADC2
#define ENVY24HT_CCS_I2CADDR
#define ENVY24HT_CHAN_PLAY_DAC2
#define ENVY24HT_E2PROM_ACL
#define ENVY24HT_CCSM_ACL_MTC
#define ENVY24HT_MT_INT_PMASK
#define ENVY24HT_CHAN_NUM
#define ENVY24HT_CCS_I2CDEV_ROM
#define ENVY24HT_MT_RATE_192000
#define ENVY24HT_CCSM_I2S_192KHZ
#define ENVY24HT_E2PROM_GPIODIR
#define ENVY24HT_MT_RATE_88200
#define ENVY24HT_MT_PTERM
#define ENVY24HT_CCSM_SCFG_XIN2
#define ENVY24HT_CCSM_SCFG_DAC
#define ENVY24HT_CCS_GPIO_LMASK
#define ENVY24HT_CCSM_I2S_VOL
#define ENVY24HT_MT_RATE_22050
#define ENVY24HT_MT_RADDR
#define ENVY24HT_MT_RATE_MASK
#define ENVY24HT_CCSM_I2S_ID
#define ENVY24HT_MT_INT_RMASK
#define ENVY24HT_MT_INT_STAT
#define ENVY24HT_CCS_GPIO_LDATA
#define ENVY24HT_MIX_REC_MASK
#define ENVY24HT_E2PROM_GPIOMASK
#define ENVY24HT_MT_RTERM
#define ENVY24HT_CCSM_I2S_20BIT
#define ENVY24HT_MT_RATE_44100
#define ENVY24HT_CHAN_REC_ADC4
#define ENVY24HT_CCS_GPIO_HDATA
#define ENVY24HT_E2PROM_SIZE
static int mixer_setrecsrc(struct snd_mixer *mixer, u_int32_t src)
int mixer_init(device_t dev, kobj_class_t cls, void *devinfo)
static int mixer_set(struct snd_mixer *m, u_int dev, u_int32_t muted, u_int lev)
int mixer_uninit(device_t dev)
void mix_setdevs(struct snd_mixer *m, u_int32_t v)
int mixer_reinit(device_t dev)
void * mix_getdevinfo(struct snd_mixer *m)
void mix_setrecdevs(struct snd_mixer *m, u_int32_t v)
Record mask of available recording devices.
void * snd_mtxcreate(const char *desc, const char *type)
void pcm_setflags(device_t dev, uint32_t val)
void * pcm_getdevinfo(device_t dev)
uint32_t pcm_getflags(device_t dev)
int pcm_setstatus(device_t dev, char *str)
void snd_mtxfree(void *m)
int pcm_addchan(device_t dev, int dir, kobj_class_t cls, void *devinfo)
int pcm_unregister(device_t dev)
int pcm_register(device_t dev, void *devinfo, int numplay, int numrec)
int snd_setup_intr(device_t dev, struct resource *res, int flags, driver_intr_t hand, void *param, void **cookiep)
#define SND_FORMAT(f, c, e)
void spicds_set(struct spicds_info *codec, int dir, unsigned int left, unsigned int right)
void spicds_setdvc(struct spicds_info *codec, unsigned int dvc)
void spicds_settype(struct spicds_info *codec, unsigned int type)
void spicds_setformat(struct spicds_info *codec, unsigned int format)
void spicds_reinit(struct spicds_info *codec)
struct spicds_info * spicds_create(device_t dev, void *devinfo, int num, spicds_ctrl ctrl)
void spicds_init(struct spicds_info *codec)
void spicds_setcif(struct spicds_info *codec, unsigned int cif)
void spicds_destroy(struct spicds_info *codec)
#define AK452X_FORMAT_256FSN
#define SPICDS_TYPE_AK4528
#define AK452X_DVC_DEMOFF
#define SPICDS_TYPE_AK4524
#define AK452X_FORMAT_I2S
struct codec_entry * codec
void(* setrate)(void *codec, int which, int rate)
void(* reinit)(void *codec)
void(* destroy)(void *codec)
void(* setvolume)(void *codec, int dir, unsigned int left, unsigned int right)
void(* init)(void *codec)
void *(* create)(device_t dev, void *devinfo, int dir, int num)
volatile u_int32_t buffer
void(* emldma)(struct sc_chinfo *)
volatile u_int32_t buffer
struct spicds_info * info
struct pcm_channel * channel
void(* emldma)(struct sc_chinfo *)
u_int8_t right[ENVY24_CHAN_NUM]
u_int8_t left[ENVY24_CHAN_NUM]
struct sc_chinfo chan[11]
struct pcmchan_caps caps[2]