28 #include <linux/time.h>
32 #include <linux/export.h>
41 mask = emu->audigy ? A_PTR_ADDRESS_MASK : PTR_ADDRESS_MASK;
42 regptr = ((reg << 16) & mask) | (chn & PTR_CHANNELNUM_MASK);
44 if (reg & 0xff000000) {
47 size = (reg >> 24) & 0x3f;
48 offset = (reg >> 16) & 0x1f;
54 spin_unlock_irqrestore(&emu->emu_lock, flags);
56 return (val & mask) >>
offset;
61 spin_unlock_irqrestore(&emu->emu_lock, flags);
79 mask = emu->audigy ? A_PTR_ADDRESS_MASK : PTR_ADDRESS_MASK;
80 regptr = ((reg << 16) & mask) | (chn & PTR_CHANNELNUM_MASK);
82 if (reg & 0xff000000) {
85 size = (reg >> 24) & 0x3f;
86 offset = (reg >> 16) & 0x1f;
88 data = (data <<
offset) & mask;
92 data |=
inl(emu->port +
DATA) & ~mask;
94 spin_unlock_irqrestore(&emu->emu_lock, flags);
99 spin_unlock_irqrestore(&emu->emu_lock, flags);
112 regptr = (reg << 16) | chn;
115 outl(regptr, emu->port + 0x20 +
PTR);
116 val =
inl(emu->port + 0x20 +
DATA);
117 spin_unlock_irqrestore(&emu->emu_lock, flags);
129 regptr = (reg << 16) | chn;
132 outl(regptr, emu->port + 0x20 +
PTR);
133 outl(data, emu->port + 0x20 +
DATA);
134 spin_unlock_irqrestore(&emu->emu_lock, flags);
140 unsigned int reset,
set;
146 spin_lock(&emu->spi_lock);
147 if (emu->card_capabilities->ca0108_chip)
162 reset = (tmp & ~0x3ffff) | 0x20000;
163 set = reset | 0x10000;
169 for (n = 0; n < 100; n++) {
172 if (!(tmp & 0x10000)) {
186 spin_unlock(&emu->spi_lock);
201 if ((reg > 0x7f) || (value > 0x1ff)) {
207 spin_lock(&emu->i2c_lock);
209 tmp = reg << 25 | value << 16;
215 for (retry = 0; retry < 10; retry++) {
229 if (timeout > 1000) {
231 "emu10k1:I2C:timeout status=0x%x\n",
249 spin_unlock(&emu->i2c_lock);
263 outl(reg, emu->port + A_IOCFG);
265 outl(reg | 0x80, emu->port + A_IOCFG);
267 outl(value, emu->port + A_IOCFG);
269 outl(value | 0x80 , emu->port + A_IOCFG);
270 spin_unlock_irqrestore(&emu->emu_lock, flags);
282 outl(reg, emu->port + A_IOCFG);
284 outl(reg | 0x80, emu->port + A_IOCFG);
286 *value = ((
inl(emu->port + A_IOCFG) >> 8) & 0x7f);
287 spin_unlock_irqrestore(&emu->emu_lock, flags);
311 enable =
inl(emu->port +
INTE) | intrenb;
313 spin_unlock_irqrestore(&emu->emu_lock, flags);
322 enable =
inl(emu->port +
INTE) & ~intrenb;
324 spin_unlock_irqrestore(&emu->emu_lock, flags);
334 if (voicenum >= 32) {
335 outl(CLIEH << 16, emu->port +
PTR);
337 val |= 1 << (voicenum - 32);
339 outl(CLIEL << 16, emu->port +
PTR);
341 val |= 1 << voicenum;
344 spin_unlock_irqrestore(&emu->emu_lock, flags);
354 if (voicenum >= 32) {
355 outl(CLIEH << 16, emu->port +
PTR);
357 val &= ~(1 << (voicenum - 32));
359 outl(CLIEL << 16, emu->port +
PTR);
361 val &= ~(1 << voicenum);
364 spin_unlock_irqrestore(&emu->emu_lock, flags);
373 if (voicenum >= 32) {
374 outl(CLIPH << 16, emu->port +
PTR);
375 voicenum = 1 << (voicenum - 32);
377 outl(CLIPL << 16, emu->port +
PTR);
378 voicenum = 1 << voicenum;
381 spin_unlock_irqrestore(&emu->emu_lock, flags);
391 if (voicenum >= 32) {
392 outl(HLIEH << 16, emu->port +
PTR);
394 val |= 1 << (voicenum - 32);
396 outl(HLIEL << 16, emu->port +
PTR);
398 val |= 1 << voicenum;
401 spin_unlock_irqrestore(&emu->emu_lock, flags);
411 if (voicenum >= 32) {
412 outl(HLIEH << 16, emu->port +
PTR);
414 val &= ~(1 << (voicenum - 32));
416 outl(HLIEL << 16, emu->port +
PTR);
418 val &= ~(1 << voicenum);
421 spin_unlock_irqrestore(&emu->emu_lock, flags);
430 if (voicenum >= 32) {
431 outl(HLIPH << 16, emu->port +
PTR);
432 voicenum = 1 << (voicenum - 32);
434 outl(HLIPL << 16, emu->port +
PTR);
435 voicenum = 1 << voicenum;
438 spin_unlock_irqrestore(&emu->emu_lock, flags);
448 if (voicenum >= 32) {
449 outl(SOLEH << 16, emu->port +
PTR);
451 sol |= 1 << (voicenum - 32);
453 outl(SOLEL << 16, emu->port +
PTR);
455 sol |= 1 << voicenum;
458 spin_unlock_irqrestore(&emu->emu_lock, flags);
468 if (voicenum >= 32) {
469 outl(SOLEH << 16, emu->port +
PTR);
471 sol &= ~(1 << (voicenum - 32));
473 outl(SOLEL << 16, emu->port +
PTR);
475 sol &= ~(1 << voicenum);
478 spin_unlock_irqrestore(&emu->emu_lock, flags);
483 volatile unsigned count;
484 unsigned int newtime = 0, curtime;
486 curtime =
inl(emu->port +
WC) >> 6;
489 while (count++ < 16384) {
490 newtime =
inl(emu->port +
WC) >> 6;
491 if (newtime != curtime)
509 spin_unlock_irqrestore(&emu->emu_lock, flags);
521 spin_unlock_irqrestore(&emu->emu_lock, flags);
530 static u32 logMagTable[128] = {
531 0x00000, 0x02dfc, 0x05b9e, 0x088e6, 0x0b5d6, 0x0e26f, 0x10eb3, 0x13aa2,
532 0x1663f, 0x1918a, 0x1bc84, 0x1e72e, 0x2118b, 0x23b9a, 0x2655d, 0x28ed5,
533 0x2b803, 0x2e0e8, 0x30985, 0x331db, 0x359eb, 0x381b6, 0x3a93d, 0x3d081,
534 0x3f782, 0x41e42, 0x444c1, 0x46b01, 0x49101, 0x4b6c4, 0x4dc49, 0x50191,
535 0x5269e, 0x54b6f, 0x57006, 0x59463, 0x5b888, 0x5dc74, 0x60029, 0x623a7,
536 0x646ee, 0x66a00, 0x68cdd, 0x6af86, 0x6d1fa, 0x6f43c, 0x7164b, 0x73829,
537 0x759d4, 0x77b4f, 0x79c9a, 0x7bdb5, 0x7dea1, 0x7ff5e, 0x81fed, 0x8404e,
538 0x86082, 0x88089, 0x8a064, 0x8c014, 0x8df98, 0x8fef1, 0x91e20, 0x93d26,
539 0x95c01, 0x97ab4, 0x9993e, 0x9b79f, 0x9d5d9, 0x9f3ec, 0xa11d8, 0xa2f9d,
540 0xa4d3c, 0xa6ab5, 0xa8808, 0xaa537, 0xac241, 0xadf26, 0xafbe7, 0xb1885,
541 0xb3500, 0xb5157, 0xb6d8c, 0xb899f, 0xba58f, 0xbc15e, 0xbdd0c, 0xbf899,
542 0xc1404, 0xc2f50, 0xc4a7b, 0xc6587, 0xc8073, 0xc9b3f, 0xcb5ed, 0xcd07c,
543 0xceaec, 0xd053f, 0xd1f73, 0xd398a, 0xd5384, 0xd6d60, 0xd8720, 0xda0c3,
544 0xdba4a, 0xdd3b4, 0xded03, 0xe0636, 0xe1f4e, 0xe384a, 0xe512c, 0xe69f3,
545 0xe829f, 0xe9b31, 0xeb3a9, 0xecc08, 0xee44c, 0xefc78, 0xf148a, 0xf2c83,
546 0xf4463, 0xf5c2a, 0xf73da, 0xf8b71, 0xfa2f0, 0xfba57, 0xfd1a7, 0xfe8df
548 static char logSlopeTable[128] = {
549 0x5c, 0x5c, 0x5b, 0x5a, 0x5a, 0x59, 0x58, 0x58,
550 0x57, 0x56, 0x56, 0x55, 0x55, 0x54, 0x53, 0x53,
551 0x52, 0x52, 0x51, 0x51, 0x50, 0x50, 0x4f, 0x4f,
552 0x4e, 0x4d, 0x4d, 0x4d, 0x4c, 0x4c, 0x4b, 0x4b,
553 0x4a, 0x4a, 0x49, 0x49, 0x48, 0x48, 0x47, 0x47,
554 0x47, 0x46, 0x46, 0x45, 0x45, 0x45, 0x44, 0x44,
555 0x43, 0x43, 0x43, 0x42, 0x42, 0x42, 0x41, 0x41,
556 0x41, 0x40, 0x40, 0x40, 0x3f, 0x3f, 0x3f, 0x3e,
557 0x3e, 0x3e, 0x3d, 0x3d, 0x3d, 0x3c, 0x3c, 0x3c,
558 0x3b, 0x3b, 0x3b, 0x3b, 0x3a, 0x3a, 0x3a, 0x39,
559 0x39, 0x39, 0x39, 0x38, 0x38, 0x38, 0x38, 0x37,
560 0x37, 0x37, 0x37, 0x36, 0x36, 0x36, 0x36, 0x35,
561 0x35, 0x35, 0x35, 0x34, 0x34, 0x34, 0x34, 0x34,
562 0x33, 0x33, 0x33, 0x33, 0x32, 0x32, 0x32, 0x32,
563 0x32, 0x31, 0x31, 0x31, 0x31, 0x31, 0x30, 0x30,
564 0x30, 0x30, 0x30, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f
571 for (i = 31; i > 0; i--) {
572 if (rate & 0x80000000) {
573 return (((
unsigned int) (i - 15) << 20) +
574 logMagTable[0x7f & (rate >> 24)] +
575 (0x7f & (rate >> 17)) *
576 logSlopeTable[0x7f & (rate >> 24)]);