es137x.c (150832) | es137x.c (152419) |
---|---|
1/*- 2 * Support the ENSONIQ AudioPCI board and Creative Labs SoundBlaster PCI 3 * boards based on the ES1370, ES1371 and ES1373 chips. 4 * 5 * Copyright (c) 1999 Russell Cattelan <cattelan@thebarn.com> 6 * Copyright (c) 1999 Cameron Grant <cg@freebsd.org> 7 * Copyright (c) 1998 by Joachim Kuebart. All rights reserved. 8 * --- 45 unchanged lines hidden (view full) --- 54 55#include <dev/pci/pcireg.h> 56#include <dev/pci/pcivar.h> 57 58#include <sys/sysctl.h> 59 60#include "mixer_if.h" 61 | 1/*- 2 * Support the ENSONIQ AudioPCI board and Creative Labs SoundBlaster PCI 3 * boards based on the ES1370, ES1371 and ES1373 chips. 4 * 5 * Copyright (c) 1999 Russell Cattelan <cattelan@thebarn.com> 6 * Copyright (c) 1999 Cameron Grant <cg@freebsd.org> 7 * Copyright (c) 1998 by Joachim Kuebart. All rights reserved. 8 * --- 45 unchanged lines hidden (view full) --- 54 55#include <dev/pci/pcireg.h> 56#include <dev/pci/pcivar.h> 57 58#include <sys/sysctl.h> 59 60#include "mixer_if.h" 61 |
62SND_DECLARE_FILE("$FreeBSD: head/sys/dev/sound/pci/es137x.c 150832 2005-10-02 15:56:36Z netchild $"); | 62SND_DECLARE_FILE("$FreeBSD: head/sys/dev/sound/pci/es137x.c 152419 2005-11-14 18:17:31Z ariff $"); |
63 64#define MEM_MAP_REG 0x14 65 66/* PCI IDs of supported chips */ 67#define ES1370_PCI_ID 0x50001274 68#define ES1371_PCI_ID 0x13711274 69#define ES1371_PCI_ID2 0x13713274 70#define CT5880_PCI_ID 0x58801274 --- 11 unchanged lines hidden (view full) --- 82#define CT5880REV_CT5880_C 0x02 83#define CT5880REV_CT5880_D 0x03 84#define CT5880REV_CT5880_E 0x04 85 86#define CT4730REV_CT4730_A 0x00 87 88#define ES_DEFAULT_BUFSZ 4096 89 | 63 64#define MEM_MAP_REG 0x14 65 66/* PCI IDs of supported chips */ 67#define ES1370_PCI_ID 0x50001274 68#define ES1371_PCI_ID 0x13711274 69#define ES1371_PCI_ID2 0x13713274 70#define CT5880_PCI_ID 0x58801274 --- 11 unchanged lines hidden (view full) --- 82#define CT5880REV_CT5880_C 0x02 83#define CT5880REV_CT5880_D 0x03 84#define CT5880REV_CT5880_E 0x04 85 86#define CT4730REV_CT4730_A 0x00 87 88#define ES_DEFAULT_BUFSZ 4096 89 |
90/* 2 DAC for playback, 1 ADC for record */ 91#define ES_DAC1 0 92#define ES_DAC2 1 93#define ES_ADC 2 94#define ES_NCHANS 3 95 96#define ES1370_DAC1_MINSPEED 5512 97#define ES1370_DAC1_MAXSPEED 44100 98 |
|
90/* device private data */ 91struct es_info; 92 93struct es_chinfo { 94 struct es_info *parent; 95 struct pcm_channel *channel; 96 struct snd_dbuf *buffer; | 99/* device private data */ 100struct es_info; 101 102struct es_chinfo { 103 struct es_info *parent; 104 struct pcm_channel *channel; 105 struct snd_dbuf *buffer; |
97 int dir, num; | 106 struct pcmchan_caps caps; 107 int dir, num, index; |
98 u_int32_t fmt, blksz, bufsz; 99}; 100 | 108 u_int32_t fmt, blksz, bufsz; 109}; 110 |
111/* 112 * 32bit Ensoniq Configuration (es->escfg). 113 * ---------------------------------------- 114 * 115 * +-------+--------+------+------+---------+--------+---------+---------+ 116 * len | 16 | 1 | 1 | 1 | 2 | 2 | 1 | 8 | 117 * +-------+--------+------+------+---------+--------+---------+---------+ 118 * | fixed | single | | | | | is | general | 119 * | rate | pcm | DACx | DACy | numplay | numrec | es1370? | purpose | 120 * | | mixer | | | | | | | 121 * +-------+--------+------+------+---------+--------+---------+---------+ 122 */ 123#define ES_FIXED_RATE(cfgv) \ 124 (((cfgv) & 0xffff0000) >> 16) 125#define ES_SET_FIXED_RATE(cfgv, nv) \ 126 (((cfgv) & ~0xffff0000) | (((nv) & 0xffff) << 16)) 127#define ES_SINGLE_PCM_MIX(cfgv) \ 128 (((cfgv) & 0x8000) >> 15) 129#define ES_SET_SINGLE_PCM_MIX(cfgv, nv) \ 130 (((cfgv) & ~0x8000) | (((nv) ? 1 : 0) << 15)) 131#define ES_DAC_FIRST(cfgv) \ 132 (((cfgv) & 0x4000) >> 14) 133#define ES_SET_DAC_FIRST(cfgv, nv) \ 134 (((cfgv) & ~0x4000) | (((nv) & 0x1) << 14)) 135#define ES_DAC_SECOND(cfgv) \ 136 (((cfgv) & 0x2000) >> 13) 137#define ES_SET_DAC_SECOND(cfgv, nv) \ 138 (((cfgv) & ~0x2000) | (((nv) & 0x1) << 13)) 139#define ES_NUMPLAY(cfgv) \ 140 (((cfgv) & 0x1800) >> 11) 141#define ES_SET_NUMPLAY(cfgv, nv) \ 142 (((cfgv) & ~0x1800) | (((nv) & 0x3) << 11)) 143#define ES_NUMREC(cfgv) \ 144 (((cfgv) & 0x600) >> 9) 145#define ES_SET_NUMREC(cfgv, nv) \ 146 (((cfgv) & ~0x600) | (((nv) & 0x3) << 9)) 147#define ES_IS_ES1370(cfgv) \ 148 (((cfgv) & 0x100) >> 8) 149#define ES_SET_IS_ES1370(cfgv, nv) \ 150 (((cfgv) & ~0x100) | (((nv) ? 1 : 0) << 8)) 151#define ES_GP(cfgv) \ 152 ((cfgv) & 0xff) 153#define ES_SET_GP(cfgv, nv) \ 154 (((cfgv) & ~0xff) | ((nv) & 0xff)) 155 156#define ES_DAC1_ENABLED(cfgv) \ 157 (ES_NUMPLAY(cfgv) > 1 || \ 158 (ES_NUMPLAY(cfgv) == 1 && ES_DAC_FIRST(cfgv) == ES_DAC1)) 159#define ES_DAC2_ENABLED(cfgv) \ 160 (ES_NUMPLAY(cfgv) > 1 || \ 161 (ES_NUMPLAY(cfgv) == 1 && ES_DAC_FIRST(cfgv) == ES_DAC2)) 162 163/* 164 * DAC 1/2 configuration through kernel hint - hint.pcm.<unit>.dac="val" 165 * 166 * 0 = Enable both DACs - Default 167 * 1 = Enable single DAC (DAC1) 168 * 2 = Enable single DAC (DAC2) 169 * 3 = Enable both DACs, swap position (DAC2 comes first instead of DAC1) 170 */ 171#define ES_DEFAULT_DAC_CFG 0 172 |
|
101struct es_info { 102 bus_space_tag_t st; 103 bus_space_handle_t sh; 104 bus_dma_tag_t parent_dmat; 105 106 struct resource *reg, *irq; 107 int regtype, regid, irqid; 108 void *ih; 109 110 device_t dev; 111 int num; 112 unsigned int bufsz; | 173struct es_info { 174 bus_space_tag_t st; 175 bus_space_handle_t sh; 176 bus_dma_tag_t parent_dmat; 177 178 struct resource *reg, *irq; 179 int regtype, regid, irqid; 180 void *ih; 181 182 device_t dev; 183 int num; 184 unsigned int bufsz; |
113 struct pcmchan_caps caps; | |
114 115 /* Contents of board's registers */ 116 uint32_t ctrl; 117 uint32_t sctrl; | 185 186 /* Contents of board's registers */ 187 uint32_t ctrl; 188 uint32_t sctrl; |
118 struct es_chinfo pch, rch; | 189 uint32_t escfg; 190 struct es_chinfo ch[ES_NCHANS]; |
119 struct mtx *lock; 120}; 121 122#define ES_LOCK(sc) snd_mtxlock((sc)->lock) 123#define ES_UNLOCK(sc) snd_mtxunlock((sc)->lock) 124#define ES_LOCK_ASSERT(sc) snd_mtxassert((sc)->lock) 125 126/* prototypes */ --- 18 unchanged lines hidden (view full) --- 145static const struct { 146 unsigned volidx:4; 147 unsigned left:4; 148 unsigned right:4; 149 unsigned stereo:1; 150 unsigned recmask:13; 151 unsigned avail:1; 152} mixtable[SOUND_MIXER_NRDEVICES] = { | 191 struct mtx *lock; 192}; 193 194#define ES_LOCK(sc) snd_mtxlock((sc)->lock) 195#define ES_UNLOCK(sc) snd_mtxunlock((sc)->lock) 196#define ES_LOCK_ASSERT(sc) snd_mtxassert((sc)->lock) 197 198/* prototypes */ --- 18 unchanged lines hidden (view full) --- 217static const struct { 218 unsigned volidx:4; 219 unsigned left:4; 220 unsigned right:4; 221 unsigned stereo:1; 222 unsigned recmask:13; 223 unsigned avail:1; 224} mixtable[SOUND_MIXER_NRDEVICES] = { |
153 [SOUND_MIXER_VOLUME] = { 0, 0x0, 0x1, 1, 0x0000, 1 }, | 225 [SOUND_MIXER_VOLUME] = { 0, 0x0, 0x1, 1, 0x1f7f, 1 }, |
154 [SOUND_MIXER_PCM] = { 1, 0x2, 0x3, 1, 0x0400, 1 }, 155 [SOUND_MIXER_SYNTH] = { 2, 0x4, 0x5, 1, 0x0060, 1 }, 156 [SOUND_MIXER_CD] = { 3, 0x6, 0x7, 1, 0x0006, 1 }, 157 [SOUND_MIXER_LINE] = { 4, 0x8, 0x9, 1, 0x0018, 1 }, 158 [SOUND_MIXER_LINE1] = { 5, 0xa, 0xb, 1, 0x1800, 1 }, 159 [SOUND_MIXER_LINE2] = { 6, 0xc, 0x0, 0, 0x0100, 1 }, 160 [SOUND_MIXER_LINE3] = { 7, 0xd, 0x0, 0, 0x0200, 1 }, 161 [SOUND_MIXER_MIC] = { 8, 0xe, 0x0, 0, 0x0001, 1 }, --- 33 unchanged lines hidden (view full) --- 195} 196 197/* -------------------------------------------------------------------- */ 198/* The es1370 mixer interface */ 199 200static int 201es1370_mixinit(struct snd_mixer *m) 202{ | 226 [SOUND_MIXER_PCM] = { 1, 0x2, 0x3, 1, 0x0400, 1 }, 227 [SOUND_MIXER_SYNTH] = { 2, 0x4, 0x5, 1, 0x0060, 1 }, 228 [SOUND_MIXER_CD] = { 3, 0x6, 0x7, 1, 0x0006, 1 }, 229 [SOUND_MIXER_LINE] = { 4, 0x8, 0x9, 1, 0x0018, 1 }, 230 [SOUND_MIXER_LINE1] = { 5, 0xa, 0xb, 1, 0x1800, 1 }, 231 [SOUND_MIXER_LINE2] = { 6, 0xc, 0x0, 0, 0x0100, 1 }, 232 [SOUND_MIXER_LINE3] = { 7, 0xd, 0x0, 0, 0x0200, 1 }, 233 [SOUND_MIXER_MIC] = { 8, 0xe, 0x0, 0, 0x0001, 1 }, --- 33 unchanged lines hidden (view full) --- 267} 268 269/* -------------------------------------------------------------------- */ 270/* The es1370 mixer interface */ 271 272static int 273es1370_mixinit(struct snd_mixer *m) 274{ |
275 struct es_info *es; |
|
203 int i; 204 u_int32_t v; 205 | 276 int i; 277 u_int32_t v; 278 |
279 es = mix_getdevinfo(m); |
|
206 v = 0; 207 for (i = 0; i < SOUND_MIXER_NRDEVICES; i++) 208 if (mixtable[i].avail) v |= (1 << i); | 280 v = 0; 281 for (i = 0; i < SOUND_MIXER_NRDEVICES; i++) 282 if (mixtable[i].avail) v |= (1 << i); |
283 /* 284 * Each DAC1/2 for ES1370 can be controlled independently 285 * DAC1 = controlled by synth 286 * DAC2 = controlled by pcm 287 * This is indeed can confuse user if DAC1 become primary playback 288 * channel. Try to be smart and combine both if necessary. 289 */ 290 if (ES_SINGLE_PCM_MIX(es->escfg)) 291 v &= ~(1 << SOUND_MIXER_SYNTH); |
|
209 mix_setdevs(m, v); 210 v = 0; 211 for (i = 0; i < SOUND_MIXER_NRDEVICES; i++) 212 if (mixtable[i].recmask) v |= (1 << i); | 292 mix_setdevs(m, v); 293 v = 0; 294 for (i = 0; i < SOUND_MIXER_NRDEVICES; i++) 295 if (mixtable[i].recmask) v |= (1 << i); |
296 if (ES_SINGLE_PCM_MIX(es->escfg)) /* ditto */ 297 v &= ~(1 << SOUND_MIXER_SYNTH); |
|
213 mix_setrecdevs(m, v); 214 return 0; 215} 216 217static int 218es1370_mixset(struct snd_mixer *m, unsigned dev, unsigned left, unsigned right) 219{ 220 struct es_info *es; | 298 mix_setrecdevs(m, v); 299 return 0; 300} 301 302static int 303es1370_mixset(struct snd_mixer *m, unsigned dev, unsigned left, unsigned right) 304{ 305 struct es_info *es; |
221 int l, r, rl, rr; | 306 int l, r, rl, rr, set_dac1; |
222 223 if (!mixtable[dev].avail) return -1; 224 l = left; 225 r = mixtable[dev].stereo? right : l; 226 if (mixtable[dev].left == 0xf) { 227 rl = (l < 2)? 0x80 : 7 - (l - 2) / 14; 228 } else { 229 rl = (l < 10)? 0x80 : 15 - (l - 10) / 6; 230 } 231 es = mix_getdevinfo(m); 232 ES_LOCK(es); | 307 308 if (!mixtable[dev].avail) return -1; 309 l = left; 310 r = mixtable[dev].stereo? right : l; 311 if (mixtable[dev].left == 0xf) { 312 rl = (l < 2)? 0x80 : 7 - (l - 2) / 14; 313 } else { 314 rl = (l < 10)? 0x80 : 15 - (l - 10) / 6; 315 } 316 es = mix_getdevinfo(m); 317 ES_LOCK(es); |
318 if (dev == SOUND_MIXER_PCM && (ES_SINGLE_PCM_MIX(es->escfg)) && 319 ES_DAC1_ENABLED(es->escfg)) { 320 set_dac1 = 1; 321 } else { 322 set_dac1 = 0; 323 } |
|
233 if (mixtable[dev].stereo) { 234 rr = (r < 10)? 0x80 : 15 - (r - 10) / 6; 235 es1370_wrcodec(es, mixtable[dev].right, rr); | 324 if (mixtable[dev].stereo) { 325 rr = (r < 10)? 0x80 : 15 - (r - 10) / 6; 326 es1370_wrcodec(es, mixtable[dev].right, rr); |
327 if (set_dac1 && mixtable[SOUND_MIXER_SYNTH].stereo) 328 es1370_wrcodec(es, mixtable[SOUND_MIXER_SYNTH].right, rr); |
|
236 } 237 es1370_wrcodec(es, mixtable[dev].left, rl); | 329 } 330 es1370_wrcodec(es, mixtable[dev].left, rl); |
331 if (set_dac1) 332 es1370_wrcodec(es, mixtable[SOUND_MIXER_SYNTH].left, rl); |
|
238 ES_UNLOCK(es); 239 240 return l | (r << 8); 241} 242 243static int 244es1370_mixsetrecsrc(struct snd_mixer *m, u_int32_t src) 245{ 246 struct es_info *es; 247 int i, j = 0; 248 249 es = mix_getdevinfo(m); 250 if (src == 0) src = 1 << SOUND_MIXER_MIC; 251 src &= mix_getrecdevs(m); 252 for (i = 0; i < SOUND_MIXER_NRDEVICES; i++) 253 if ((src & (1 << i)) != 0) j |= mixtable[i].recmask; 254 255 ES_LOCK(es); | 333 ES_UNLOCK(es); 334 335 return l | (r << 8); 336} 337 338static int 339es1370_mixsetrecsrc(struct snd_mixer *m, u_int32_t src) 340{ 341 struct es_info *es; 342 int i, j = 0; 343 344 es = mix_getdevinfo(m); 345 if (src == 0) src = 1 << SOUND_MIXER_MIC; 346 src &= mix_getrecdevs(m); 347 for (i = 0; i < SOUND_MIXER_NRDEVICES; i++) 348 if ((src & (1 << i)) != 0) j |= mixtable[i].recmask; 349 350 ES_LOCK(es); |
351 if ((src & (1 << SOUND_MIXER_PCM)) && ES_SINGLE_PCM_MIX(es->escfg) && 352 ES_DAC1_ENABLED(es->escfg)) { 353 j |= mixtable[SOUND_MIXER_SYNTH].recmask; 354 } |
|
256 es1370_wrcodec(es, CODEC_LIMIX1, j & 0x55); 257 es1370_wrcodec(es, CODEC_RIMIX1, j & 0xaa); 258 es1370_wrcodec(es, CODEC_LIMIX2, (j >> 8) & 0x17); 259 es1370_wrcodec(es, CODEC_RIMIX2, (j >> 8) & 0x0f); 260 es1370_wrcodec(es, CODEC_OMIX1, 0x7f); 261 es1370_wrcodec(es, CODEC_OMIX2, 0x3f); 262 ES_UNLOCK(es); 263 --- 32 unchanged lines hidden (view full) --- 296 297/* -------------------------------------------------------------------- */ 298 299/* channel interface */ 300static void * 301eschan_init(kobj_t obj, void *devinfo, struct snd_dbuf *b, struct pcm_channel *c, int dir) 302{ 303 struct es_info *es = devinfo; | 355 es1370_wrcodec(es, CODEC_LIMIX1, j & 0x55); 356 es1370_wrcodec(es, CODEC_RIMIX1, j & 0xaa); 357 es1370_wrcodec(es, CODEC_LIMIX2, (j >> 8) & 0x17); 358 es1370_wrcodec(es, CODEC_RIMIX2, (j >> 8) & 0x0f); 359 es1370_wrcodec(es, CODEC_OMIX1, 0x7f); 360 es1370_wrcodec(es, CODEC_OMIX2, 0x3f); 361 ES_UNLOCK(es); 362 --- 32 unchanged lines hidden (view full) --- 395 396/* -------------------------------------------------------------------- */ 397 398/* channel interface */ 399static void * 400eschan_init(kobj_t obj, void *devinfo, struct snd_dbuf *b, struct pcm_channel *c, int dir) 401{ 402 struct es_info *es = devinfo; |
304 struct es_chinfo *ch = (dir == PCMDIR_PLAY)? &es->pch : &es->rch; | 403 struct es_chinfo *ch; 404 uint32_t index; |
305 | 405 |
406 ES_LOCK(es); 407 408 if (dir == PCMDIR_PLAY) { 409 index = ES_GP(es->escfg); 410 es->escfg = ES_SET_GP(es->escfg, index + 1); 411 if (index == 0) { 412 index = ES_DAC_FIRST(es->escfg); 413 } else if (index == 1) { 414 index = ES_DAC_SECOND(es->escfg); 415 } else { 416 device_printf(es->dev, "Invalid ES_GP index: %d\n", index); 417 ES_UNLOCK(es); 418 return NULL; 419 } 420 if (!(index == ES_DAC1 || index == ES_DAC2)) { 421 device_printf(es->dev, "Unknown DAC: %d\n", 422 index + 1); 423 ES_UNLOCK(es); 424 return NULL; 425 } 426 if (es->ch[index].channel != NULL) { 427 device_printf(es->dev, "DAC%d already initialized!\n", 428 index + 1); 429 ES_UNLOCK(es); 430 return NULL; 431 } 432 } else 433 index = ES_ADC; 434 435 ch = &es->ch[index]; 436 ch->index = index; 437 ch->num = es->num++; 438 ch->caps = es_caps; 439 if (ES_IS_ES1370(es->escfg)) { 440 if (ch->index == ES_DAC1) { 441 ch->caps.maxspeed = ES1370_DAC1_MAXSPEED; 442 ch->caps.minspeed = ES1370_DAC1_MINSPEED; 443 } else { 444 uint32_t fixed_rate = ES_FIXED_RATE(es->escfg); 445 if (!(fixed_rate < es_caps.minspeed || 446 fixed_rate > es_caps.maxspeed)) { 447 ch->caps.maxspeed = fixed_rate; 448 ch->caps.minspeed = fixed_rate; 449 } 450 } 451 } |
|
306 ch->parent = es; 307 ch->channel = c; 308 ch->buffer = b; 309 ch->bufsz = es->bufsz; 310 ch->blksz = ch->bufsz / 2; | 452 ch->parent = es; 453 ch->channel = c; 454 ch->buffer = b; 455 ch->bufsz = es->bufsz; 456 ch->blksz = ch->bufsz / 2; |
311 ch->num = ch->parent->num++; | |
312 ch->dir = dir; | 457 ch->dir = dir; |
458 ES_UNLOCK(es); |
|
313 if (sndbuf_alloc(ch->buffer, es->parent_dmat, ch->bufsz) != 0) 314 return NULL; 315 ES_LOCK(es); 316 if (dir == PCMDIR_PLAY) { | 459 if (sndbuf_alloc(ch->buffer, es->parent_dmat, ch->bufsz) != 0) 460 return NULL; 461 ES_LOCK(es); 462 if (dir == PCMDIR_PLAY) { |
317 es_wr(es, ES1370_REG_MEMPAGE, ES1370_REG_DAC2_FRAMEADR >> 8, 1); 318 es_wr(es, ES1370_REG_DAC2_FRAMEADR & 0xff, sndbuf_getbufaddr(ch->buffer), 4); 319 es_wr(es, ES1370_REG_DAC2_FRAMECNT & 0xff, (ch->bufsz >> 2) - 1, 4); | 463 if (ch->index == ES_DAC1) { 464 es_wr(es, ES1370_REG_MEMPAGE, ES1370_REG_DAC1_FRAMEADR >> 8, 1); 465 es_wr(es, ES1370_REG_DAC1_FRAMEADR & 0xff, sndbuf_getbufaddr(ch->buffer), 4); 466 es_wr(es, ES1370_REG_DAC1_FRAMECNT & 0xff, (ch->bufsz >> 2) - 1, 4); 467 } else { 468 es_wr(es, ES1370_REG_MEMPAGE, ES1370_REG_DAC2_FRAMEADR >> 8, 1); 469 es_wr(es, ES1370_REG_DAC2_FRAMEADR & 0xff, sndbuf_getbufaddr(ch->buffer), 4); 470 es_wr(es, ES1370_REG_DAC2_FRAMECNT & 0xff, (ch->bufsz >> 2) - 1, 4); 471 } |
320 } else { 321 es_wr(es, ES1370_REG_MEMPAGE, ES1370_REG_ADC_FRAMEADR >> 8, 1); 322 es_wr(es, ES1370_REG_ADC_FRAMEADR & 0xff, sndbuf_getbufaddr(ch->buffer), 4); 323 es_wr(es, ES1370_REG_ADC_FRAMECNT & 0xff, (ch->bufsz >> 2) - 1, 4); 324 } 325 ES_UNLOCK(es); 326 return ch; 327} 328 329static int 330eschan_setformat(kobj_t obj, void *data, u_int32_t format) 331{ 332 struct es_chinfo *ch = data; 333 struct es_info *es = ch->parent; 334 335 ES_LOCK(es); 336 if (ch->dir == PCMDIR_PLAY) { | 472 } else { 473 es_wr(es, ES1370_REG_MEMPAGE, ES1370_REG_ADC_FRAMEADR >> 8, 1); 474 es_wr(es, ES1370_REG_ADC_FRAMEADR & 0xff, sndbuf_getbufaddr(ch->buffer), 4); 475 es_wr(es, ES1370_REG_ADC_FRAMECNT & 0xff, (ch->bufsz >> 2) - 1, 4); 476 } 477 ES_UNLOCK(es); 478 return ch; 479} 480 481static int 482eschan_setformat(kobj_t obj, void *data, u_int32_t format) 483{ 484 struct es_chinfo *ch = data; 485 struct es_info *es = ch->parent; 486 487 ES_LOCK(es); 488 if (ch->dir == PCMDIR_PLAY) { |
337 es->sctrl &= ~SCTRL_P2FMT; 338 if (format & AFMT_S16_LE) es->sctrl |= SCTRL_P2SEB; 339 if (format & AFMT_STEREO) es->sctrl |= SCTRL_P2SMB; | 489 if (ch->index == ES_DAC1) { 490 es->sctrl &= ~SCTRL_P1FMT; 491 if (format & AFMT_S16_LE) es->sctrl |= SCTRL_P1SEB; 492 if (format & AFMT_STEREO) es->sctrl |= SCTRL_P1SMB; 493 } else { 494 es->sctrl &= ~SCTRL_P2FMT; 495 if (format & AFMT_S16_LE) es->sctrl |= SCTRL_P2SEB; 496 if (format & AFMT_STEREO) es->sctrl |= SCTRL_P2SMB; 497 } |
340 } else { 341 es->sctrl &= ~SCTRL_R1FMT; 342 if (format & AFMT_S16_LE) es->sctrl |= SCTRL_R1SEB; 343 if (format & AFMT_STEREO) es->sctrl |= SCTRL_R1SMB; 344 } 345 es_wr(es, ES1370_REG_SERIAL_CONTROL, es->sctrl, 4); 346 ES_UNLOCK(es); 347 ch->fmt = format; 348 return 0; 349} 350 351static int 352eschan1370_setspeed(kobj_t obj, void *data, u_int32_t speed) 353{ 354 struct es_chinfo *ch = data; 355 struct es_info *es = ch->parent; 356 | 498 } else { 499 es->sctrl &= ~SCTRL_R1FMT; 500 if (format & AFMT_S16_LE) es->sctrl |= SCTRL_R1SEB; 501 if (format & AFMT_STEREO) es->sctrl |= SCTRL_R1SMB; 502 } 503 es_wr(es, ES1370_REG_SERIAL_CONTROL, es->sctrl, 4); 504 ES_UNLOCK(es); 505 ch->fmt = format; 506 return 0; 507} 508 509static int 510eschan1370_setspeed(kobj_t obj, void *data, u_int32_t speed) 511{ 512 struct es_chinfo *ch = data; 513 struct es_info *es = ch->parent; 514 |
357 /* XXX Fixed rate , do nothing. */ | 515 /* Fixed rate , do nothing. */ 516 if (ch->caps.minspeed == ch->caps.maxspeed) 517 return ch->caps.maxspeed; 518 if (speed < ch->caps.minspeed) 519 speed = ch->caps.minspeed; 520 if (speed > ch->caps.maxspeed) 521 speed = ch->caps.maxspeed; |
358 ES_LOCK(es); | 522 ES_LOCK(es); |
359 if (es->caps.minspeed == es->caps.maxspeed) { 360 speed = es->caps.maxspeed; 361 ES_UNLOCK(es); 362 return speed; | 523 if (ch->index == ES_DAC1) { 524 /* 525 * DAC1 does not support continuous rate settings. 526 * Pick the nearest and use it since FEEDER_RATE will 527 * do the the proper conversion for us. 528 */ 529 es->ctrl &= ~CTRL_WTSRSEL; 530 if (speed < 8268) { 531 speed = 5512; 532 es->ctrl |= 0 << CTRL_SH_WTSRSEL; 533 } else if (speed < 16537) { 534 speed = 11025; 535 es->ctrl |= 1 << CTRL_SH_WTSRSEL; 536 } else if (speed < 33075) { 537 speed = 22050; 538 es->ctrl |= 2 << CTRL_SH_WTSRSEL; 539 } else { 540 speed = 44100; 541 es->ctrl |= 3 << CTRL_SH_WTSRSEL; 542 } 543 } else { 544 es->ctrl &= ~CTRL_PCLKDIV; 545 es->ctrl |= DAC2_SRTODIV(speed) << CTRL_SH_PCLKDIV; |
363 } | 546 } |
364 if (speed < es->caps.minspeed) 365 speed = es->caps.minspeed; 366 if (speed > es->caps.maxspeed) 367 speed = es->caps.maxspeed; 368 es->ctrl &= ~CTRL_PCLKDIV; 369 es->ctrl |= DAC2_SRTODIV(speed) << CTRL_SH_PCLKDIV; | |
370 es_wr(es, ES1370_REG_CONTROL, es->ctrl, 4); 371 ES_UNLOCK(es); | 547 es_wr(es, ES1370_REG_CONTROL, es->ctrl, 4); 548 ES_UNLOCK(es); |
372 /* rec/play speeds locked together - should indicate in flags */ 373 return speed; /* XXX calc real speed */ | 549 return speed; |
374} 375 376static int 377eschan1371_setspeed(kobj_t obj, void *data, u_int32_t speed) 378{ 379 struct es_chinfo *ch = data; 380 struct es_info *es = ch->parent; | 550} 551 552static int 553eschan1371_setspeed(kobj_t obj, void *data, u_int32_t speed) 554{ 555 struct es_chinfo *ch = data; 556 struct es_info *es = ch->parent; |
381 int i, delta; | 557 uint32_t i; 558 int delta; |
382 383 ES_LOCK(es); 384 if (ch->dir == PCMDIR_PLAY) | 559 560 ES_LOCK(es); 561 if (ch->dir == PCMDIR_PLAY) |
385 i = es1371_dac_rate(es, speed, 3 - ch->num); /* play */ | 562 i = es1371_dac_rate(es, speed, ch->index); /* play */ |
386 else | 563 else |
387 i = es1371_adc_rate(es, speed, 1); /* record */ | 564 i = es1371_adc_rate(es, speed, ch->index); /* record */ |
388 ES_UNLOCK(es); 389 delta = (speed > i) ? speed - i : i - speed; 390 if (delta < 2) 391 return speed; 392 return i; 393} 394 395static int --- 19 unchanged lines hidden (view full) --- 415 return ch->blksz; 416} 417 418static int 419eschan_trigger(kobj_t obj, void *data, int go) 420{ 421 struct es_chinfo *ch = data; 422 struct es_info *es = ch->parent; | 565 ES_UNLOCK(es); 566 delta = (speed > i) ? speed - i : i - speed; 567 if (delta < 2) 568 return speed; 569 return i; 570} 571 572static int --- 19 unchanged lines hidden (view full) --- 592 return ch->blksz; 593} 594 595static int 596eschan_trigger(kobj_t obj, void *data, int go) 597{ 598 struct es_chinfo *ch = data; 599 struct es_info *es = ch->parent; |
423 unsigned cnt; | 600 uint32_t cnt, b = 0; |
424 425 if (go == PCMTRIG_EMLDMAWR || go == PCMTRIG_EMLDMARD) 426 return 0; 427 428 cnt = (ch->blksz / sndbuf_getbps(ch->buffer)) - 1; | 601 602 if (go == PCMTRIG_EMLDMAWR || go == PCMTRIG_EMLDMARD) 603 return 0; 604 605 cnt = (ch->blksz / sndbuf_getbps(ch->buffer)) - 1; |
429 | 606 if (ch->fmt & AFMT_16BIT) 607 b |= 0x02; 608 if (ch->fmt & AFMT_STEREO) 609 b |= 0x01; |
430 ES_LOCK(es); 431 if (ch->dir == PCMDIR_PLAY) { 432 if (go == PCMTRIG_START) { | 610 ES_LOCK(es); 611 if (ch->dir == PCMDIR_PLAY) { 612 if (go == PCMTRIG_START) { |
433 int b = (ch->fmt & AFMT_S16_LE)? 2 : 1; 434 es->ctrl |= CTRL_DAC2_EN; 435 es->sctrl &= ~(SCTRL_P2ENDINC | SCTRL_P2STINC | SCTRL_P2LOOPSEL | SCTRL_P2PAUSE | SCTRL_P2DACSEN); 436 es->sctrl |= SCTRL_P2INTEN | (b << SCTRL_SH_P2ENDINC); 437 es_wr(es, ES1370_REG_DAC2_SCOUNT, cnt, 4); 438 /* start at beginning of buffer */ 439 es_wr(es, ES1370_REG_MEMPAGE, ES1370_REG_DAC2_FRAMECNT >> 8, 4); 440 es_wr(es, ES1370_REG_DAC2_FRAMECNT & 0xff, (ch->bufsz >> 2) - 1, 4); 441 } else es->ctrl &= ~CTRL_DAC2_EN; | 613 if (ch->index == ES_DAC1) { 614 es->ctrl |= CTRL_DAC1_EN; 615 es->sctrl &= ~(SCTRL_P1LOOPSEL | SCTRL_P1PAUSE | SCTRL_P1SCTRLD); 616 es->sctrl |= SCTRL_P1INTEN | b; 617 es_wr(es, ES1370_REG_DAC1_SCOUNT, cnt, 4); 618 /* start at beginning of buffer */ 619 es_wr(es, ES1370_REG_MEMPAGE, ES1370_REG_DAC1_FRAMECNT >> 8, 4); 620 es_wr(es, ES1370_REG_DAC1_FRAMECNT & 0xff, (ch->bufsz >> 2) - 1, 4); 621 } else { 622 es->ctrl |= CTRL_DAC2_EN; 623 es->sctrl &= ~(SCTRL_P2ENDINC | SCTRL_P2STINC | SCTRL_P2LOOPSEL | SCTRL_P2PAUSE | SCTRL_P2DACSEN); 624 es->sctrl |= SCTRL_P2INTEN | (b << 2) | 625 (((b & 2) ? : 1) << SCTRL_SH_P2ENDINC); 626 es_wr(es, ES1370_REG_DAC2_SCOUNT, cnt, 4); 627 /* start at beginning of buffer */ 628 es_wr(es, ES1370_REG_MEMPAGE, ES1370_REG_DAC2_FRAMECNT >> 8, 4); 629 es_wr(es, ES1370_REG_DAC2_FRAMECNT & 0xff, (ch->bufsz >> 2) - 1, 4); 630 } 631 } else es->ctrl &= ~(ch->index == ES_DAC1 ? CTRL_DAC1_EN : CTRL_DAC2_EN); |
442 } else { 443 if (go == PCMTRIG_START) { 444 es->ctrl |= CTRL_ADC_EN; 445 es->sctrl &= ~SCTRL_R1LOOPSEL; | 632 } else { 633 if (go == PCMTRIG_START) { 634 es->ctrl |= CTRL_ADC_EN; 635 es->sctrl &= ~SCTRL_R1LOOPSEL; |
446 es->sctrl |= SCTRL_R1INTEN; | 636 es->sctrl |= SCTRL_R1INTEN | (b << 4); |
447 es_wr(es, ES1370_REG_ADC_SCOUNT, cnt, 4); 448 /* start at beginning of buffer */ 449 es_wr(es, ES1370_REG_MEMPAGE, ES1370_REG_ADC_FRAMECNT >> 8, 4); 450 es_wr(es, ES1370_REG_ADC_FRAMECNT & 0xff, (ch->bufsz >> 2) - 1, 4); 451 } else es->ctrl &= ~CTRL_ADC_EN; 452 } 453 es_wr(es, ES1370_REG_SERIAL_CONTROL, es->sctrl, 4); 454 es_wr(es, ES1370_REG_CONTROL, es->ctrl, 4); 455 ES_UNLOCK(es); 456 return 0; 457} 458 459static int 460eschan_getptr(kobj_t obj, void *data) 461{ 462 struct es_chinfo *ch = data; 463 struct es_info *es = ch->parent; 464 u_int32_t reg, cnt; 465 | 637 es_wr(es, ES1370_REG_ADC_SCOUNT, cnt, 4); 638 /* start at beginning of buffer */ 639 es_wr(es, ES1370_REG_MEMPAGE, ES1370_REG_ADC_FRAMECNT >> 8, 4); 640 es_wr(es, ES1370_REG_ADC_FRAMECNT & 0xff, (ch->bufsz >> 2) - 1, 4); 641 } else es->ctrl &= ~CTRL_ADC_EN; 642 } 643 es_wr(es, ES1370_REG_SERIAL_CONTROL, es->sctrl, 4); 644 es_wr(es, ES1370_REG_CONTROL, es->ctrl, 4); 645 ES_UNLOCK(es); 646 return 0; 647} 648 649static int 650eschan_getptr(kobj_t obj, void *data) 651{ 652 struct es_chinfo *ch = data; 653 struct es_info *es = ch->parent; 654 u_int32_t reg, cnt; 655 |
466 if (ch->dir == PCMDIR_PLAY) 467 reg = ES1370_REG_DAC2_FRAMECNT; 468 else | 656 if (ch->dir == PCMDIR_PLAY) { 657 if (ch->index == ES_DAC1) 658 reg = ES1370_REG_DAC1_FRAMECNT; 659 else 660 reg = ES1370_REG_DAC2_FRAMECNT; 661 } else |
469 reg = ES1370_REG_ADC_FRAMECNT; 470 ES_LOCK(es); 471 es_wr(es, ES1370_REG_MEMPAGE, reg >> 8, 4); 472 cnt = es_rd(es, reg & 0x000000ff, 4) >> 16; 473 ES_UNLOCK(es); 474 /* cnt is longwords */ 475 return cnt << 2; 476} 477 478static struct pcmchan_caps * 479eschan_getcaps(kobj_t obj, void *data) 480{ 481 struct es_chinfo *ch = data; | 662 reg = ES1370_REG_ADC_FRAMECNT; 663 ES_LOCK(es); 664 es_wr(es, ES1370_REG_MEMPAGE, reg >> 8, 4); 665 cnt = es_rd(es, reg & 0x000000ff, 4) >> 16; 666 ES_UNLOCK(es); 667 /* cnt is longwords */ 668 return cnt << 2; 669} 670 671static struct pcmchan_caps * 672eschan_getcaps(kobj_t obj, void *data) 673{ 674 struct es_chinfo *ch = data; |
482 struct es_info *es = ch->parent; | |
483 | 675 |
484 return &es->caps; | 676 return &ch->caps; |
485} 486 487static kobj_method_t eschan1370_methods[] = { 488 KOBJMETHOD(channel_init, eschan_init), 489 KOBJMETHOD(channel_setformat, eschan_setformat), 490 KOBJMETHOD(channel_setspeed, eschan1370_setspeed), 491 KOBJMETHOD(channel_setblocksize, eschan_setblocksize), 492 KOBJMETHOD(channel_trigger, eschan_trigger), --- 34 unchanged lines hidden (view full) --- 527 if (intsrc & STAT_ADC) sctrl &= ~SCTRL_R1INTEN; 528 if (intsrc & STAT_DAC1) sctrl &= ~SCTRL_P1INTEN; 529 if (intsrc & STAT_DAC2) sctrl &= ~SCTRL_P2INTEN; 530 531 es_wr(es, ES1370_REG_SERIAL_CONTROL, sctrl, 4); 532 es_wr(es, ES1370_REG_SERIAL_CONTROL, es->sctrl, 4); 533 ES_UNLOCK(es); 534 | 677} 678 679static kobj_method_t eschan1370_methods[] = { 680 KOBJMETHOD(channel_init, eschan_init), 681 KOBJMETHOD(channel_setformat, eschan_setformat), 682 KOBJMETHOD(channel_setspeed, eschan1370_setspeed), 683 KOBJMETHOD(channel_setblocksize, eschan_setblocksize), 684 KOBJMETHOD(channel_trigger, eschan_trigger), --- 34 unchanged lines hidden (view full) --- 719 if (intsrc & STAT_ADC) sctrl &= ~SCTRL_R1INTEN; 720 if (intsrc & STAT_DAC1) sctrl &= ~SCTRL_P1INTEN; 721 if (intsrc & STAT_DAC2) sctrl &= ~SCTRL_P2INTEN; 722 723 es_wr(es, ES1370_REG_SERIAL_CONTROL, sctrl, 4); 724 es_wr(es, ES1370_REG_SERIAL_CONTROL, es->sctrl, 4); 725 ES_UNLOCK(es); 726 |
535 if (intsrc & STAT_ADC) chn_intr(es->rch.channel); 536 if (intsrc & STAT_DAC1) 537 ; /* nothing */ 538 if (intsrc & STAT_DAC2) chn_intr(es->pch.channel); | 727 if (intsrc & STAT_ADC) chn_intr(es->ch[ES_ADC].channel); 728 if (intsrc & STAT_DAC1) chn_intr(es->ch[ES_DAC1].channel); 729 if (intsrc & STAT_DAC2) chn_intr(es->ch[ES_DAC2].channel); |
539} 540 541/* ES1370 specific */ 542static int 543es1370_init(struct es_info *es) 544{ | 730} 731 732/* ES1370 specific */ 733static int 734es1370_init(struct es_info *es) 735{ |
545 int r; | 736 uint32_t fixed_rate; 737 int r, single_pcm; |
546 | 738 |
547 /* XXX ES1370 default to fixed rate operation */ | 739 /* ES1370 default to fixed rate operation */ |
548 if (resource_int_value(device_get_name(es->dev), 549 device_get_unit(es->dev), "fixed_rate", &r) == 0) { | 740 if (resource_int_value(device_get_name(es->dev), 741 device_get_unit(es->dev), "fixed_rate", &r) == 0) { |
550 if (r != 0) { 551 if (r < es_caps.minspeed) 552 r = es_caps.minspeed; 553 if (r > es_caps.maxspeed) 554 r = es_caps.maxspeed; | 742 fixed_rate = r; 743 if (fixed_rate) { 744 if (fixed_rate < es_caps.minspeed) 745 fixed_rate = es_caps.minspeed; 746 if (fixed_rate > es_caps.maxspeed) 747 fixed_rate = es_caps.maxspeed; |
555 } 556 } else | 748 } 749 } else |
557 r = es_caps.maxspeed; | 750 fixed_rate = es_caps.maxspeed; 751 752 if (resource_int_value(device_get_name(es->dev), 753 device_get_unit(es->dev), "single_pcm_mixer", &r) == 0) 754 single_pcm = (r) ? 1 : 0; 755 else 756 single_pcm = 1; 757 |
558 ES_LOCK(es); | 758 ES_LOCK(es); |
559 es->caps = es_caps; 560 if (r != 0) { 561 es->caps.minspeed = r; 562 es->caps.maxspeed = r; | 759 if (ES_NUMPLAY(es->escfg) == 1) 760 single_pcm = 1; 761 /* This is ES1370 */ 762 es->escfg = ES_SET_IS_ES1370(es->escfg, 1); 763 if (fixed_rate) { 764 es->escfg = ES_SET_FIXED_RATE(es->escfg, fixed_rate); 765 } else { 766 es->escfg = ES_SET_FIXED_RATE(es->escfg, 0); 767 fixed_rate = DSP_DEFAULT_SPEED; |
563 } | 768 } |
564 es->ctrl = CTRL_CDC_EN | CTRL_SERR_DIS | 565 (DAC2_SRTODIV(es->caps.maxspeed) << CTRL_SH_PCLKDIV); | 769 if (single_pcm) { 770 es->escfg = ES_SET_SINGLE_PCM_MIX(es->escfg, 1); 771 } else { 772 es->escfg = ES_SET_SINGLE_PCM_MIX(es->escfg, 0); 773 } 774 es->ctrl = CTRL_CDC_EN | CTRL_JYSTK_EN | CTRL_SERR_DIS | 775 (DAC2_SRTODIV(fixed_rate) << CTRL_SH_PCLKDIV); 776 es->ctrl |= 3 << CTRL_SH_WTSRSEL; |
566 es_wr(es, ES1370_REG_CONTROL, es->ctrl, 4); 567 568 es->sctrl = 0; 569 es_wr(es, ES1370_REG_SERIAL_CONTROL, es->sctrl, 4); 570 571 es1370_wrcodec(es, CODEC_RES_PD, 3);/* No RST, PD */ 572 es1370_wrcodec(es, CODEC_CSEL, 0); /* CODEC ADC and CODEC DAC use 573 * {LR,B}CLK2 and run off the LRCLK2 --- 8 unchanged lines hidden (view full) --- 582/* ES1371 specific */ 583int 584es1371_init(struct es_info *es) 585{ 586 uint32_t cssr, devid, revid; 587 int idx; 588 589 ES_LOCK(es); | 777 es_wr(es, ES1370_REG_CONTROL, es->ctrl, 4); 778 779 es->sctrl = 0; 780 es_wr(es, ES1370_REG_SERIAL_CONTROL, es->sctrl, 4); 781 782 es1370_wrcodec(es, CODEC_RES_PD, 3);/* No RST, PD */ 783 es1370_wrcodec(es, CODEC_CSEL, 0); /* CODEC ADC and CODEC DAC use 784 * {LR,B}CLK2 and run off the LRCLK2 --- 8 unchanged lines hidden (view full) --- 793/* ES1371 specific */ 794int 795es1371_init(struct es_info *es) 796{ 797 uint32_t cssr, devid, revid; 798 int idx; 799 800 ES_LOCK(es); |
801 /* This is NOT ES1370 */ 802 es->escfg = ES_SET_IS_ES1370(es->escfg, 0); |
|
590 es->num = 0; | 803 es->num = 0; |
591 es->ctrl = 0; | 804 es->ctrl = CTRL_JYSTK_EN; |
592 es->sctrl = 0; | 805 es->sctrl = 0; |
593 es->caps = es_caps; | |
594 cssr = 0; 595 devid = pci_get_devid(es->dev); 596 revid = pci_get_revid(es->dev); 597 if (devid == CT4730_PCI_ID) { 598 /* XXX amplifier hack? */ 599 es->ctrl |= (1 << 16); 600 } 601 /* initialize the chips */ --- 5 unchanged lines hidden (view full) --- 607 (devid == CT5880_PCI_ID && revid == CT5880REV_CT5880_C) || 608 (devid == CT5880_PCI_ID && revid == CT5880REV_CT5880_D) || 609 (devid == CT5880_PCI_ID && revid == CT5880REV_CT5880_E)) { 610 cssr = 1 << 29; 611 es_wr(es, ES1370_REG_STATUS, cssr, 4); 612 DELAY(20000); 613 } 614 /* AC'97 warm reset to start the bitclk */ | 806 cssr = 0; 807 devid = pci_get_devid(es->dev); 808 revid = pci_get_revid(es->dev); 809 if (devid == CT4730_PCI_ID) { 810 /* XXX amplifier hack? */ 811 es->ctrl |= (1 << 16); 812 } 813 /* initialize the chips */ --- 5 unchanged lines hidden (view full) --- 819 (devid == CT5880_PCI_ID && revid == CT5880REV_CT5880_C) || 820 (devid == CT5880_PCI_ID && revid == CT5880REV_CT5880_D) || 821 (devid == CT5880_PCI_ID && revid == CT5880REV_CT5880_E)) { 822 cssr = 1 << 29; 823 es_wr(es, ES1370_REG_STATUS, cssr, 4); 824 DELAY(20000); 825 } 826 /* AC'97 warm reset to start the bitclk */ |
615 es_wr(es, ES1370_REG_CONTROL, es->ctrl | ES1371_SYNC_RES, 4); 616 DELAY(2000); | |
617 es_wr(es, ES1370_REG_CONTROL, es->ctrl, 4); | 827 es_wr(es, ES1370_REG_CONTROL, es->ctrl, 4); |
828 es_wr(es, ES1371_REG_LEGACY, ES1371_SYNC_RES, 4); 829 DELAY(2000); 830 es_wr(es, ES1370_REG_CONTROL, es->sctrl, 4); |
|
618 es1371_wait_src_ready(es); 619 /* Init the sample rate converter */ 620 es_wr(es, ES1371_REG_SMPRATE, ES1371_DIS_SRC, 4); 621 for (idx = 0; idx < 0x80; idx++) 622 es1371_src_write(es, idx, 0); 623 es1371_src_write(es, ES_SMPREG_DAC1 + ES_SMPREG_TRUNC_N, 16 << 4); 624 es1371_src_write(es, ES_SMPREG_DAC1 + ES_SMPREG_INT_REGS, 16 << 10); 625 es1371_src_write(es, ES_SMPREG_DAC2 + ES_SMPREG_TRUNC_N, 16 << 4); 626 es1371_src_write(es, ES_SMPREG_DAC2 + ES_SMPREG_INT_REGS, 16 << 10); 627 es1371_src_write(es, ES_SMPREG_VOL_ADC, 1 << 12); 628 es1371_src_write(es, ES_SMPREG_VOL_ADC + 1, 1 << 12); 629 es1371_src_write(es, ES_SMPREG_VOL_DAC1, 1 << 12); 630 es1371_src_write(es, ES_SMPREG_VOL_DAC1 + 1, 1 << 12); 631 es1371_src_write(es, ES_SMPREG_VOL_DAC2, 1 << 12); 632 es1371_src_write(es, ES_SMPREG_VOL_DAC2 + 1, 1 << 12); | 831 es1371_wait_src_ready(es); 832 /* Init the sample rate converter */ 833 es_wr(es, ES1371_REG_SMPRATE, ES1371_DIS_SRC, 4); 834 for (idx = 0; idx < 0x80; idx++) 835 es1371_src_write(es, idx, 0); 836 es1371_src_write(es, ES_SMPREG_DAC1 + ES_SMPREG_TRUNC_N, 16 << 4); 837 es1371_src_write(es, ES_SMPREG_DAC1 + ES_SMPREG_INT_REGS, 16 << 10); 838 es1371_src_write(es, ES_SMPREG_DAC2 + ES_SMPREG_TRUNC_N, 16 << 4); 839 es1371_src_write(es, ES_SMPREG_DAC2 + ES_SMPREG_INT_REGS, 16 << 10); 840 es1371_src_write(es, ES_SMPREG_VOL_ADC, 1 << 12); 841 es1371_src_write(es, ES_SMPREG_VOL_ADC + 1, 1 << 12); 842 es1371_src_write(es, ES_SMPREG_VOL_DAC1, 1 << 12); 843 es1371_src_write(es, ES_SMPREG_VOL_DAC1 + 1, 1 << 12); 844 es1371_src_write(es, ES_SMPREG_VOL_DAC2, 1 << 12); 845 es1371_src_write(es, ES_SMPREG_VOL_DAC2 + 1, 1 << 12); |
633 es1371_adc_rate (es, 22050, 1); 634 es1371_dac_rate (es, 22050, 1); 635 es1371_dac_rate (es, 22050, 2); | 846 es1371_adc_rate(es, 22050, ES_ADC); 847 es1371_dac_rate(es, 22050, ES_DAC1); 848 es1371_dac_rate(es, 22050, ES_DAC2); |
636 /* WARNING: 637 * enabling the sample rate converter without properly programming 638 * its parameters causes the chip to lock up (the SRC busy bit will 639 * be stuck high, and I've found no way to rectify this other than 640 * power cycle) 641 */ 642 es1371_wait_src_ready(es); 643 es_wr(es, ES1371_REG_SMPRATE, 0, 4); --- 155 unchanged lines hidden (view full) --- 799es1371_dac_rate(struct es_info *es, u_int rate, int set) 800{ 801 u_int freq, r, result, dac, dis; 802 803 ES_LOCK_ASSERT(es); 804 805 if (rate > 48000) rate = 48000; 806 if (rate < 4000) rate = 4000; | 849 /* WARNING: 850 * enabling the sample rate converter without properly programming 851 * its parameters causes the chip to lock up (the SRC busy bit will 852 * be stuck high, and I've found no way to rectify this other than 853 * power cycle) 854 */ 855 es1371_wait_src_ready(es); 856 es_wr(es, ES1371_REG_SMPRATE, 0, 4); --- 155 unchanged lines hidden (view full) --- 1012es1371_dac_rate(struct es_info *es, u_int rate, int set) 1013{ 1014 u_int freq, r, result, dac, dis; 1015 1016 ES_LOCK_ASSERT(es); 1017 1018 if (rate > 48000) rate = 48000; 1019 if (rate < 4000) rate = 4000; |
807 freq = (rate << 15) / 3000; | 1020 freq = ((rate << 15) + 1500) / 3000; |
808 result = (freq * 3000) >> 15; | 1021 result = (freq * 3000) >> 15; |
809 if (set) { 810 dac = (set == 1)? ES_SMPREG_DAC1 : ES_SMPREG_DAC2; 811 dis = (set == 1)? ES1371_DIS_P2 : ES1371_DIS_P1; 812 813 r = (es1371_wait_src_ready(es) & (ES1371_DIS_SRC | ES1371_DIS_P1 | ES1371_DIS_P2 | ES1371_DIS_R1)); 814 es_wr(es, ES1371_REG_SMPRATE, r, 4); 815 es1371_src_write(es, dac + ES_SMPREG_INT_REGS, 816 (es1371_src_read(es, dac + ES_SMPREG_INT_REGS) & 0x00ff) | ((freq >> 5) & 0xfc00)); 817 es1371_src_write(es, dac + ES_SMPREG_VFREQ_FRAC, freq & 0x7fff); 818 r = (es1371_wait_src_ready(es) & (ES1371_DIS_SRC | dis | ES1371_DIS_R1)); 819 es_wr(es, ES1371_REG_SMPRATE, r, 4); 820 } | 1022 1023 dac = (set == ES_DAC1) ? ES_SMPREG_DAC1 : ES_SMPREG_DAC2; 1024 dis = (set == ES_DAC1) ? ES1371_DIS_P2 : ES1371_DIS_P1; 1025 r = (es1371_wait_src_ready(es) & (ES1371_DIS_SRC | ES1371_DIS_P1 | ES1371_DIS_P2 | ES1371_DIS_R1)); 1026 es_wr(es, ES1371_REG_SMPRATE, r, 4); 1027 es1371_src_write(es, dac + ES_SMPREG_INT_REGS, 1028 (es1371_src_read(es, dac + ES_SMPREG_INT_REGS) & 0x00ff) | ((freq >> 5) & 0xfc00)); 1029 es1371_src_write(es, dac + ES_SMPREG_VFREQ_FRAC, freq & 0x7fff); 1030 r = (es1371_wait_src_ready(es) & (ES1371_DIS_SRC | dis | ES1371_DIS_R1)); 1031 es_wr(es, ES1371_REG_SMPRATE, r, 4); |
821 return result; 822} 823 824static uint32_t 825es1371_wait_src_ready(struct es_info *es) 826{ 827 uint32_t t, r; 828 --- 56 unchanged lines hidden (view full) --- 885 case ES1371_PCI_ID2: 886 device_set_desc(dev, "Strange AudioPCI ES1371-? (vid=3274)"); 887 device_printf(dev, "unknown revision %d -- please report to cg@freebsd.org\n", pci_get_revid(dev)); 888 return BUS_PROBE_DEFAULT; 889 890 case CT4730_PCI_ID: 891 switch(pci_get_revid(dev)) { 892 case CT4730REV_CT4730_A: | 1032 return result; 1033} 1034 1035static uint32_t 1036es1371_wait_src_ready(struct es_info *es) 1037{ 1038 uint32_t t, r; 1039 --- 56 unchanged lines hidden (view full) --- 1096 case ES1371_PCI_ID2: 1097 device_set_desc(dev, "Strange AudioPCI ES1371-? (vid=3274)"); 1098 device_printf(dev, "unknown revision %d -- please report to cg@freebsd.org\n", pci_get_revid(dev)); 1099 return BUS_PROBE_DEFAULT; 1100 1101 case CT4730_PCI_ID: 1102 switch(pci_get_revid(dev)) { 1103 case CT4730REV_CT4730_A: |
893 device_set_desc(dev, "Creative SB AudioPCI CT4730"); | 1104 device_set_desc(dev, "Creative SB AudioPCI CT4730/EV1938"); |
894 return BUS_PROBE_DEFAULT; 895 default: 896 device_set_desc(dev, "Creative SB AudioPCI CT4730-?"); 897 device_printf(dev, "unknown revision %d -- please report to cg@freebsd.org\n", pci_get_revid(dev)); 898 return BUS_PROBE_DEFAULT; 899 } 900 901 case CT5880_PCI_ID: --- 93 unchanged lines hidden (view full) --- 995 struct es_info *es; 996 device_t dev; 997 uint32_t val; 998 int err; 999 1000 dev = oidp->oid_arg1; 1001 es = pcm_getdevinfo(dev); 1002 ES_LOCK(es); | 1105 return BUS_PROBE_DEFAULT; 1106 default: 1107 device_set_desc(dev, "Creative SB AudioPCI CT4730-?"); 1108 device_printf(dev, "unknown revision %d -- please report to cg@freebsd.org\n", pci_get_revid(dev)); 1109 return BUS_PROBE_DEFAULT; 1110 } 1111 1112 case CT5880_PCI_ID: --- 93 unchanged lines hidden (view full) --- 1206 struct es_info *es; 1207 device_t dev; 1208 uint32_t val; 1209 int err; 1210 1211 dev = oidp->oid_arg1; 1212 es = pcm_getdevinfo(dev); 1213 ES_LOCK(es); |
1003 if (es->caps.minspeed == es->caps.maxspeed) 1004 val = es->caps.maxspeed; 1005 else | 1214 val = ES_FIXED_RATE(es->escfg); 1215 if (val < es_caps.minspeed) |
1006 val = 0; 1007 ES_UNLOCK(es); 1008 err = sysctl_handle_int(oidp, &val, sizeof(val), req); 1009 1010 if (err || req->newptr == NULL) 1011 return (err); 1012 if (val != 0 && (val < es_caps.minspeed || val > es_caps.maxspeed)) 1013 return (EINVAL); 1014 1015 ES_LOCK(es); | 1216 val = 0; 1217 ES_UNLOCK(es); 1218 err = sysctl_handle_int(oidp, &val, sizeof(val), req); 1219 1220 if (err || req->newptr == NULL) 1221 return (err); 1222 if (val != 0 && (val < es_caps.minspeed || val > es_caps.maxspeed)) 1223 return (EINVAL); 1224 1225 ES_LOCK(es); |
1226 if (es->ctrl & (CTRL_DAC2_EN|CTRL_ADC_EN)) { 1227 ES_UNLOCK(es); 1228 return (EBUSY); 1229 } |
|
1016 if (val) { | 1230 if (val) { |
1017 es->caps.minspeed = val; 1018 es->caps.maxspeed = val; 1019 es->ctrl &= ~CTRL_PCLKDIV; 1020 es->ctrl |= DAC2_SRTODIV(val) << CTRL_SH_PCLKDIV; 1021 es_wr(es, ES1370_REG_CONTROL, es->ctrl, 4); | 1231 if (val != ES_FIXED_RATE(es->escfg)) { 1232 es->escfg = ES_SET_FIXED_RATE(es->escfg, val); 1233 es->ch[ES_DAC2].caps.maxspeed = val; 1234 es->ch[ES_DAC2].caps.minspeed = val; 1235 es->ch[ES_ADC].caps.maxspeed = val; 1236 es->ch[ES_ADC].caps.minspeed = val; 1237 es->ctrl &= ~CTRL_PCLKDIV; 1238 es->ctrl |= DAC2_SRTODIV(val) << CTRL_SH_PCLKDIV; 1239 es_wr(es, ES1370_REG_CONTROL, es->ctrl, 4); 1240 } |
1022 } else { | 1241 } else { |
1023 es->caps.minspeed = es_caps.minspeed; 1024 es->caps.maxspeed = es_caps.maxspeed; | 1242 es->escfg = ES_SET_FIXED_RATE(es->escfg, 0); 1243 es->ch[ES_DAC2].caps = es_caps; 1244 es->ch[ES_ADC].caps = es_caps; |
1025 } 1026 ES_UNLOCK(es); 1027 1028 return (0); 1029} | 1245 } 1246 ES_UNLOCK(es); 1247 1248 return (0); 1249} |
1250 1251static int 1252sysctl_es137x_single_pcm_mixer(SYSCTL_HANDLER_ARGS) 1253{ 1254 struct es_info *es; 1255 struct snddev_info *d; 1256 struct snd_mixer *m; 1257 struct cdev *i_dev; 1258 device_t dev; 1259 uint32_t val, set; 1260 int recsrc, level, err; 1261 1262 dev = oidp->oid_arg1; 1263 d = device_get_softc(dev); 1264 if (d == NULL || d->mixer_dev == NULL || d->mixer_dev->si_drv1 == NULL) 1265 return (EINVAL); 1266 es = d->devinfo; 1267 if (es == NULL) 1268 return (EINVAL); 1269 ES_LOCK(es); 1270 set = ES_SINGLE_PCM_MIX(es->escfg); 1271 val = set; 1272 ES_UNLOCK(es); 1273 err = sysctl_handle_int(oidp, &val, sizeof(val), req); 1274 1275 if (err || req->newptr == NULL) 1276 return (err); 1277 if (!(val == 0 || val == 1)) 1278 return (EINVAL); 1279 if (val == set) 1280 return (0); 1281 i_dev = d->mixer_dev; 1282 if (mixer_ioctl(i_dev, 0, (caddr_t)&recsrc, 0, NULL) != EBADF) 1283 return (EBUSY); 1284 err = mixer_ioctl(i_dev, MIXER_READ(SOUND_MIXER_PCM), 1285 (caddr_t)&level, -1, NULL); 1286 if (!err) 1287 err = mixer_ioctl(i_dev, MIXER_READ(SOUND_MIXER_RECSRC), 1288 (caddr_t)&recsrc, -1, NULL); 1289 if (err) 1290 return (err); 1291 if (level < 0) 1292 return (EINVAL); 1293 1294 ES_LOCK(es); 1295 if (es->ctrl & (CTRL_ADC_EN | CTRL_DAC1_EN | CTRL_DAC2_EN)) { 1296 ES_UNLOCK(es); 1297 return (EBUSY); 1298 } 1299 if (val) { 1300 es->escfg = ES_SET_SINGLE_PCM_MIX(es->escfg, 1); 1301 } else { 1302 es->escfg = ES_SET_SINGLE_PCM_MIX(es->escfg, 0); 1303 } 1304 ES_UNLOCK(es); 1305 m = i_dev->si_drv1; 1306 if (!val) { 1307 mix_setdevs(m, mix_getdevs(d->mixer_dev->si_drv1) | 1308 (1 << SOUND_MIXER_SYNTH)); 1309 mix_setrecdevs(m, mix_getrecdevs(d->mixer_dev->si_drv1) | 1310 (1 << SOUND_MIXER_SYNTH)); 1311 err = mixer_ioctl(i_dev, MIXER_WRITE(SOUND_MIXER_SYNTH), 1312 (caddr_t)&level, -1, NULL); 1313 } else { 1314 err = mixer_ioctl(i_dev, MIXER_WRITE(SOUND_MIXER_SYNTH), 1315 (caddr_t)&level, -1, NULL); 1316 mix_setdevs(m, mix_getdevs(d->mixer_dev->si_drv1) & 1317 ~(1 << SOUND_MIXER_SYNTH)); 1318 mix_setrecdevs(m, mix_getrecdevs(d->mixer_dev->si_drv1) & 1319 ~(1 << SOUND_MIXER_SYNTH)); 1320 } 1321 if (!err) { 1322 level = recsrc; 1323 if (recsrc & (1 << SOUND_MIXER_PCM)) 1324 recsrc |= 1 << SOUND_MIXER_SYNTH; 1325 else if (recsrc & (1 << SOUND_MIXER_SYNTH)) 1326 recsrc |= 1 << SOUND_MIXER_PCM; 1327 if (level != recsrc) 1328 err = mixer_ioctl(i_dev, MIXER_WRITE(SOUND_MIXER_RECSRC), 1329 (caddr_t)&recsrc, -1, NULL); 1330 } 1331 return (err); 1332} |
|
1030#endif /* SND_DYNSYSCTL */ 1031 1032static void 1033es_init_sysctls(device_t dev) 1034{ 1035#ifdef SND_DYNSYSCTL 1036 struct es_info *es; 1037 int r, devid, revid; --- 8 unchanged lines hidden (view full) --- 1046 (devid == CT5880_PCI_ID && revid == CT5880REV_CT5880_E)) { 1047 SYSCTL_ADD_PROC(snd_sysctl_tree(dev), 1048 SYSCTL_CHILDREN(snd_sysctl_tree_top(dev)), 1049 OID_AUTO, "spdif_enabled", 1050 CTLTYPE_INT | CTLFLAG_RW, dev, sizeof(dev), 1051 sysctl_es137x_spdif_enable, "I", 1052 "Enable S/PDIF output on primary playback channel"); 1053 } else if (devid == ES1370_PCI_ID) { | 1333#endif /* SND_DYNSYSCTL */ 1334 1335static void 1336es_init_sysctls(device_t dev) 1337{ 1338#ifdef SND_DYNSYSCTL 1339 struct es_info *es; 1340 int r, devid, revid; --- 8 unchanged lines hidden (view full) --- 1349 (devid == CT5880_PCI_ID && revid == CT5880REV_CT5880_E)) { 1350 SYSCTL_ADD_PROC(snd_sysctl_tree(dev), 1351 SYSCTL_CHILDREN(snd_sysctl_tree_top(dev)), 1352 OID_AUTO, "spdif_enabled", 1353 CTLTYPE_INT | CTLFLAG_RW, dev, sizeof(dev), 1354 sysctl_es137x_spdif_enable, "I", 1355 "Enable S/PDIF output on primary playback channel"); 1356 } else if (devid == ES1370_PCI_ID) { |
1054 SYSCTL_ADD_PROC(snd_sysctl_tree(dev), 1055 SYSCTL_CHILDREN(snd_sysctl_tree_top(dev)), 1056 OID_AUTO, "fixed_rate", 1057 CTLTYPE_INT | CTLFLAG_RW, dev, sizeof(dev), 1058 sysctl_es137x_fixed_rate, "I", 1059 "Enable fixed rate playback/recording"); | 1357 /* 1358 * Enable fixed rate sysctl if both DAC2 / ADC enabled. 1359 */ 1360 if (es->ch[ES_DAC2].channel != NULL && es->ch[ES_ADC].channel != NULL) { 1361 SYSCTL_ADD_PROC(snd_sysctl_tree(dev), 1362 SYSCTL_CHILDREN(snd_sysctl_tree_top(dev)), 1363 OID_AUTO, "fixed_rate", 1364 CTLTYPE_INT | CTLFLAG_RW, dev, sizeof(dev), 1365 sysctl_es137x_fixed_rate, "I", 1366 "Enable fixed rate playback/recording"); 1367 } 1368 /* 1369 * Enable single pcm mixer sysctl if both DAC1/2 enabled. 1370 */ 1371 if (es->ch[ES_DAC1].channel != NULL && es->ch[ES_DAC2].channel != NULL) { 1372 SYSCTL_ADD_PROC(snd_sysctl_tree(dev), 1373 SYSCTL_CHILDREN(snd_sysctl_tree_top(dev)), 1374 OID_AUTO, "single_pcm_mixer", 1375 CTLTYPE_INT | CTLFLAG_RW, dev, sizeof(dev), 1376 sysctl_es137x_single_pcm_mixer, "I", 1377 "Single PCM mixer controller for both DAC1/DAC2"); 1378 } |
1060 } 1061 if (resource_int_value(device_get_name(dev), 1062 device_get_unit(dev), "latency_timer", &r) == 0 && 1063 !(r < 0 || r > 255)) 1064 pci_write_config(dev, PCIR_LATTIMER, r, 1); 1065 SYSCTL_ADD_PROC(snd_sysctl_tree(dev), 1066 SYSCTL_CHILDREN(snd_sysctl_tree_top(dev)), 1067 OID_AUTO, "latency_timer", 1068 CTLTYPE_INT | CTLFLAG_RW, dev, sizeof(dev), 1069 sysctl_es137x_latency_timer, "I", 1070 "PCI Latency Timer configuration"); 1071#endif /* SND_DYNSYSCTL */ 1072} 1073 1074static int 1075es_pci_attach(device_t dev) 1076{ 1077 u_int32_t data; 1078 struct es_info *es = NULL; | 1379 } 1380 if (resource_int_value(device_get_name(dev), 1381 device_get_unit(dev), "latency_timer", &r) == 0 && 1382 !(r < 0 || r > 255)) 1383 pci_write_config(dev, PCIR_LATTIMER, r, 1); 1384 SYSCTL_ADD_PROC(snd_sysctl_tree(dev), 1385 SYSCTL_CHILDREN(snd_sysctl_tree_top(dev)), 1386 OID_AUTO, "latency_timer", 1387 CTLTYPE_INT | CTLFLAG_RW, dev, sizeof(dev), 1388 sysctl_es137x_latency_timer, "I", 1389 "PCI Latency Timer configuration"); 1390#endif /* SND_DYNSYSCTL */ 1391} 1392 1393static int 1394es_pci_attach(device_t dev) 1395{ 1396 u_int32_t data; 1397 struct es_info *es = NULL; |
1079 int mapped; | 1398 int mapped, i, numplay, dac_cfg; |
1080 char status[SND_STATUSLEN]; 1081 struct ac97_info *codec = NULL; 1082 kobj_class_t ct = NULL; 1083 uint32_t devid; 1084 1085 if ((es = malloc(sizeof *es, M_DEVBUF, M_NOWAIT | M_ZERO)) == NULL) { 1086 device_printf(dev, "cannot allocate softc\n"); 1087 return ENXIO; 1088 } 1089 es->lock = snd_mtxcreate(device_get_nameunit(dev), "sound softc"); 1090 es->dev = dev; | 1399 char status[SND_STATUSLEN]; 1400 struct ac97_info *codec = NULL; 1401 kobj_class_t ct = NULL; 1402 uint32_t devid; 1403 1404 if ((es = malloc(sizeof *es, M_DEVBUF, M_NOWAIT | M_ZERO)) == NULL) { 1405 device_printf(dev, "cannot allocate softc\n"); 1406 return ENXIO; 1407 } 1408 es->lock = snd_mtxcreate(device_get_nameunit(dev), "sound softc"); 1409 es->dev = dev; |
1410 es->escfg = 0; |
|
1091 mapped = 0; 1092 1093 pci_enable_busmaster(dev); 1094 data = pci_read_config(dev, PCIR_COMMAND, 2); 1095 data |= (PCIM_CMD_PORTEN|PCIM_CMD_MEMEN); 1096 pci_write_config(dev, PCIR_COMMAND, data, 2); 1097 data = pci_read_config(dev, PCIR_COMMAND, 2); 1098 if (mapped == 0 && (data & PCIM_CMD_MEMEN)) { --- 16 unchanged lines hidden (view full) --- 1115 device_printf(dev, "unable to map register space\n"); 1116 goto bad; 1117 } 1118 1119 es->st = rman_get_bustag(es->reg); 1120 es->sh = rman_get_bushandle(es->reg); 1121 es->bufsz = pcm_getbuffersize(dev, 4096, ES_DEFAULT_BUFSZ, 65536); 1122 | 1411 mapped = 0; 1412 1413 pci_enable_busmaster(dev); 1414 data = pci_read_config(dev, PCIR_COMMAND, 2); 1415 data |= (PCIM_CMD_PORTEN|PCIM_CMD_MEMEN); 1416 pci_write_config(dev, PCIR_COMMAND, data, 2); 1417 data = pci_read_config(dev, PCIR_COMMAND, 2); 1418 if (mapped == 0 && (data & PCIM_CMD_MEMEN)) { --- 16 unchanged lines hidden (view full) --- 1435 device_printf(dev, "unable to map register space\n"); 1436 goto bad; 1437 } 1438 1439 es->st = rman_get_bustag(es->reg); 1440 es->sh = rman_get_bushandle(es->reg); 1441 es->bufsz = pcm_getbuffersize(dev, 4096, ES_DEFAULT_BUFSZ, 65536); 1442 |
1443 if (resource_int_value(device_get_name(dev), 1444 device_get_unit(dev), "dac", &dac_cfg) == 0) { 1445 if (dac_cfg < 0 || dac_cfg > 3) 1446 dac_cfg = ES_DEFAULT_DAC_CFG; 1447 } else 1448 dac_cfg = ES_DEFAULT_DAC_CFG; 1449 1450 switch (dac_cfg) { 1451 case 0: /* Enable all DAC: DAC1, DAC2 */ 1452 numplay = 2; 1453 es->escfg = ES_SET_DAC_FIRST(es->escfg, ES_DAC1); 1454 es->escfg = ES_SET_DAC_SECOND(es->escfg, ES_DAC2); 1455 break; 1456 case 1: /* Only DAC1 */ 1457 numplay = 1; 1458 es->escfg = ES_SET_DAC_FIRST(es->escfg, ES_DAC1); 1459 break; 1460 case 3: /* Enable all DAC / swap position: DAC2, DAC1 */ 1461 numplay = 2; 1462 es->escfg = ES_SET_DAC_FIRST(es->escfg, ES_DAC2); 1463 es->escfg = ES_SET_DAC_SECOND(es->escfg, ES_DAC1); 1464 break; 1465 case 2: /* Only DAC2 */ 1466 default: 1467 numplay = 1; 1468 es->escfg = ES_SET_DAC_FIRST(es->escfg, ES_DAC2); 1469 break; 1470 } 1471 es->escfg = ES_SET_NUMPLAY(es->escfg, numplay); 1472 es->escfg = ES_SET_NUMREC(es->escfg, 1); 1473 |
|
1123 devid = pci_get_devid(dev); 1124 switch (devid) { 1125 case ES1371_PCI_ID: 1126 case ES1371_PCI_ID2: 1127 case CT5880_PCI_ID: 1128 case CT4730_PCI_ID: 1129 es1371_init(es); 1130 codec = AC97_CREATE(dev, es, es1371_ac97); 1131 if (codec == NULL) 1132 goto bad; 1133 /* our init routine does everything for us */ 1134 /* set to NULL; flag mixer_init not to run the ac97_init */ 1135 /* ac97_mixer.init = NULL; */ 1136 if (mixer_init(dev, ac97_getmixerclass(), codec)) 1137 goto bad; 1138 ct = &eschan1371_class; 1139 break; 1140 case ES1370_PCI_ID: 1141 es1370_init(es); | 1474 devid = pci_get_devid(dev); 1475 switch (devid) { 1476 case ES1371_PCI_ID: 1477 case ES1371_PCI_ID2: 1478 case CT5880_PCI_ID: 1479 case CT4730_PCI_ID: 1480 es1371_init(es); 1481 codec = AC97_CREATE(dev, es, es1371_ac97); 1482 if (codec == NULL) 1483 goto bad; 1484 /* our init routine does everything for us */ 1485 /* set to NULL; flag mixer_init not to run the ac97_init */ 1486 /* ac97_mixer.init = NULL; */ 1487 if (mixer_init(dev, ac97_getmixerclass(), codec)) 1488 goto bad; 1489 ct = &eschan1371_class; 1490 break; 1491 case ES1370_PCI_ID: 1492 es1370_init(es); |
1493 /* 1494 * Disable fixed rate operation if DAC2 disabled. 1495 * This is a special case for es1370 only, where the 1496 * speed of both ADC and DAC2 locked together. 1497 */ 1498 if (!ES_DAC2_ENABLED(es->escfg)) { 1499 es->escfg = ES_SET_FIXED_RATE(es->escfg, 0); 1500 } |
|
1142 if (mixer_init(dev, &es1370_mixer_class, es)) 1143 goto bad; 1144 ct = &eschan1370_class; 1145 break; 1146 default: 1147 goto bad; 1148 /* NOTREACHED */ 1149 } --- 16 unchanged lines hidden (view full) --- 1166 device_printf(dev, "unable to create dma tag\n"); 1167 goto bad; 1168 } 1169 1170 snprintf(status, SND_STATUSLEN, "at %s 0x%lx irq %ld %s", 1171 (es->regtype == SYS_RES_IOPORT)? "io" : "memory", 1172 rman_get_start(es->reg), rman_get_start(es->irq),PCM_KLDSTRING(snd_es137x)); 1173 | 1501 if (mixer_init(dev, &es1370_mixer_class, es)) 1502 goto bad; 1503 ct = &eschan1370_class; 1504 break; 1505 default: 1506 goto bad; 1507 /* NOTREACHED */ 1508 } --- 16 unchanged lines hidden (view full) --- 1525 device_printf(dev, "unable to create dma tag\n"); 1526 goto bad; 1527 } 1528 1529 snprintf(status, SND_STATUSLEN, "at %s 0x%lx irq %ld %s", 1530 (es->regtype == SYS_RES_IOPORT)? "io" : "memory", 1531 rman_get_start(es->reg), rman_get_start(es->irq),PCM_KLDSTRING(snd_es137x)); 1532 |
1174 if (pcm_register(dev, es, 1, 1)) | 1533 if (pcm_register(dev, es, numplay, 1)) |
1175 goto bad; | 1534 goto bad; |
1535 for (i = 0; i < numplay; i++) 1536 pcm_addchan(dev, PCMDIR_PLAY, ct, es); |
|
1176 pcm_addchan(dev, PCMDIR_REC, ct, es); | 1537 pcm_addchan(dev, PCMDIR_REC, ct, es); |
1177 pcm_addchan(dev, PCMDIR_PLAY, ct, es); | |
1178 es_init_sysctls(dev); 1179 pcm_setstatus(dev, status); | 1538 es_init_sysctls(dev); 1539 pcm_setstatus(dev, status); |
1180 | 1540 es->escfg = ES_SET_GP(es->escfg, 0); 1541 if (numplay == 1) { 1542 device_printf(dev, "<Playback: DAC%d / Record: ADC>\n", 1543 ES_DAC_FIRST(es->escfg) + 1); 1544 } else if (numplay == 2) { 1545 device_printf(dev, "<Playback: DAC%d,DAC%d / Record: ADC>\n", 1546 ES_DAC_FIRST(es->escfg) + 1, 1547 ES_DAC_SECOND(es->escfg) + 1); 1548 } |
1181 return 0; 1182 1183 bad: 1184 if (es->parent_dmat) bus_dma_tag_destroy(es->parent_dmat); 1185 if (es->ih) bus_teardown_intr(dev, es->irq, es->ih); 1186 if (es->irq) bus_release_resource(dev, SYS_RES_IRQ, es->irqid, es->irq); 1187 if (codec) ac97_destroy(codec); 1188 if (es->reg) bus_release_resource(dev, es->regtype, es->regid, es->reg); --- 43 unchanged lines hidden --- | 1549 return 0; 1550 1551 bad: 1552 if (es->parent_dmat) bus_dma_tag_destroy(es->parent_dmat); 1553 if (es->ih) bus_teardown_intr(dev, es->irq, es->ih); 1554 if (es->irq) bus_release_resource(dev, SYS_RES_IRQ, es->irqid, es->irq); 1555 if (codec) ac97_destroy(codec); 1556 if (es->reg) bus_release_resource(dev, es->regtype, es->regid, es->reg); --- 43 unchanged lines hidden --- |