198 #define ESSTYPE_LIKE20 -1
199 #define ESSTYPE_DETECT 0
201 #define SUBMDL_ES1788 0x10
202 #define SUBMDL_ES1868 0x11
203 #define SUBMDL_ES1869 0x12
204 #define SUBMDL_ES1878 0x13
205 #define SUBMDL_ES1879 0x16
206 #define SUBMDL_ES1887 0x14
207 #define SUBMDL_ES1888 0x15
209 #define SB_CAP_ES18XX_RATE 0x100
211 #define ES1688_CLOCK1 795444
212 #define ES1688_CLOCK2 397722
213 #define ES18XX_CLOCK1 793800
214 #define ES18XX_CLOCK2 768000
217 static void ess_show_mixerregs (
sb_devc *devc);
219 static int ess_read (
sb_devc * devc,
unsigned char reg);
220 static int ess_write (
sb_devc * devc,
unsigned char reg,
unsigned char data);
221 static void ess_chgmixer
236 { {0xb7, 0x51}, {0xb7, 0xd0}, {-1, 0} };
238 { {0xb7, 0x71}, {0xb7, 0xf4}, {-1, 0} };
240 { {0xb7, 0x51}, {0xb7, 0x98}, {-1, 0} };
242 { {0xb7, 0x71}, {0xb7, 0xbc}, {-1, 0} };
245 { ess_i08m, ess_i16m, ess_i08s, ess_i16s };
252 { {0xb6, 0x80}, {0xb7, 0x51}, {0xb7, 0xd0}, {-1, 0} };
254 { {0xb6, 0x00}, {0xb7, 0x71}, {0xb7, 0xf4}, {-1, 0} };
256 { {0xb6, 0x80}, {0xb7, 0x51}, {0xb7, 0x98}, {-1, 0} };
258 { {0xb6, 0x00}, {0xb7, 0x71}, {0xb7, 0xbc}, {-1, 0} };
261 { ess_o08m, ess_o16m, ess_o08s, ess_o16s };
263 static void ess_exec_commands
268 cmd = cmdtab [ ((devc->
channels != 1) << 1) + (devc->bits !=
AFMT_U8) ];
270 while (
cmd->cmd != -1) {
271 ess_write (devc,
cmd->cmd,
cmd->data);
276 static void ess_change
281 value = ess_read (devc, reg);
282 value = (value & ~mask) | (val & mask);
283 ess_write (devc, reg, value);
286 static void ess_set_output_parms
287 (
int dev,
unsigned long buf,
int nr_bytes,
int intrflag)
304 static void ess_set_input_parms
305 (
int dev,
unsigned long buf,
int count,
int intrflag)
315 static int ess_calc_div (
int clock,
int revert,
int *speedp,
int *diffp)
322 divider = (clock + speed / 2) / speed;
323 retval = revert - divider;
324 if (retval > revert - 1) {
326 divider = revert -
retval;
332 *speedp = clock / divider;
333 diff = speed - *speedp;
334 if (diff < 0) diff =-diff;
340 static int ess_calc_best_speed
341 (
int clock1,
int rev1,
int clock2,
int rev2,
int *divp,
int *speedp)
343 int speed1 = *speedp, speed2 = *speedp;
348 div1 = ess_calc_div (clock1, rev1, &speed1, &diff1);
349 div2 = ess_calc_div (clock2, rev2, &speed2, &diff2);
373 static void ess_common_speed (
sb_devc *devc,
int *speedp,
int *divp)
382 div = 0x80 | ess_calc_div (795500, 256, speedp, &diff);
384 div = 0x80 | ess_calc_div (795500, 128, speedp, &diff);
388 ess_calc_best_speed(397700, 128, 795500, 256,
395 if (*speedp > 22000) {
404 static void ess_speed (
sb_devc *devc,
int audionum)
409 ess_common_speed (devc, &(devc->
speed), &div);
411 #ifdef FKS_REG_LOGGING
416 speed = (devc->
speed * 9) / 20;
418 div2 = 256 - 7160000 / (speed * 82);
420 if (!devc->
duplex) audionum = 1;
426 ess_write (devc, 0xa1, div);
427 ess_write (devc, 0xa2, div2);
433 ess_write (devc, 0xa2, div2);
438 static int ess_audio_prepare_for_input(
int dev,
int bsize,
int bcount)
446 ess_write (devc, 0xb8, 0x0e);
447 ess_change (devc, 0xa8, 0x03, 3 - devc->
channels);
448 ess_write (devc, 0xb9, 2);
450 ess_exec_commands (devc, ess_inp_cmds);
452 ess_change (devc, 0xb1, 0xf0, 0x50);
453 ess_change (devc, 0xb2, 0xf0, 0x50);
459 static int ess_audio_prepare_for_output_audio1 (
int dev,
int bsize,
int bcount)
465 ess_write (devc, 0xb8, 4);
466 ess_change (devc, 0xa8, 0x03, 3 - devc->
channels);
467 ess_write (devc, 0xb9, 2);
469 ess_exec_commands (devc, ess_out_cmds);
471 ess_change (devc, 0xb1, 0xf0, 0x50);
472 ess_change (devc, 0xb2, 0xf0, 0x50);
480 static int ess_audio_prepare_for_output_audio2 (
int dev,
int bsize,
int bcount)
494 ess_chgmixer (devc, 0x78, 0xd0, 0xd0);
502 if (devc->
channels != 1) bits |= 0x02;
518 static int ess_audio_prepare_for_output(
int dev,
int bsize,
int bcount)
522 #ifdef FKS_REG_LOGGING
523 printk(
KERN_INFO "ess_audio_prepare_for_output: dma_out=%d,dma_in=%d\n"
528 return ess_audio_prepare_for_output_audio2 (dev, bsize, bcount);
530 return ess_audio_prepare_for_output_audio1 (dev, bsize, bcount);
534 static void ess_audio_halt_xfer(
int dev)
541 spin_unlock_irqrestore(&devc->
lock, flags);
546 if (devc->
duplex) ess_chgmixer(devc, 0x78, 0x03, 0x00);
549 static void ess_audio_start_input
550 (
int dev,
unsigned long buf,
int nr_bytes,
int intrflag)
552 int count = nr_bytes;
560 if (
audio_devs[dev]->dmap_in->dma > 3) count >>= 1;
565 ess_write (devc, 0xa4, (
unsigned char) ((
unsigned short) c & 0xff));
566 ess_write (devc, 0xa5, (
unsigned char) (((
unsigned short) c >> 8) & 0xff));
568 ess_change (devc, 0xb8, 0x0f, 0x0f);
572 static void ess_audio_output_block_audio1
573 (
int dev,
unsigned long buf,
int nr_bytes,
int intrflag)
575 int count = nr_bytes;
585 ess_write (devc, 0xa4, (
unsigned char) ((
unsigned short) c & 0xff));
586 ess_write (devc, 0xa5, (
unsigned char) (((
unsigned short) c >> 8) & 0xff));
588 ess_change (devc, 0xb8, 0x05, 0x05);
592 static void ess_audio_output_block_audio2
593 (
int dev,
unsigned long buf,
int nr_bytes,
int intrflag)
595 int count = nr_bytes;
599 if (
audio_devs[dev]->dmap_out->dma > 3) count >>= 1;
602 ess_setmixer (devc, 0x74, (
unsigned char) ((
unsigned short) c & 0xff));
603 ess_setmixer (devc, 0x76, (
unsigned char) (((
unsigned short) c >> 8) & 0xff));
604 ess_chgmixer (devc, 0x78, 0x03, 0x03);
610 static void ess_audio_output_block
611 (
int dev,
unsigned long buf,
int nr_bytes,
int intrflag)
616 ess_audio_output_block_audio2 (dev, buf, nr_bytes, intrflag);
618 ess_audio_output_block_audio1 (dev, buf, nr_bytes, intrflag);
626 static void ess_audio_trigger(
int dev,
int bits)
633 if (!bits && !bits_16) {
670 static int ess_audio_set_speed(
int dev,
int speed)
673 int minspeed, maxspeed, dummydiv;
676 minspeed = (devc->
duplex ? 6215 : 5000 );
677 maxspeed = (devc->
duplex ? 44100 : 48000);
678 if (speed < minspeed) speed = minspeed;
679 if (speed > maxspeed) speed = maxspeed;
681 ess_common_speed (devc, &speed, &dummydiv);
691 static unsigned int ess_audio_set_bits(
int dev,
unsigned int bits)
710 static short ess_audio_set_channels(
int dev,
short channels)
724 .output_block = ess_set_output_parms,
725 .start_input = ess_set_input_parms,
726 .prepare_for_input = ess_audio_prepare_for_input,
727 .prepare_for_output = ess_audio_prepare_for_output,
728 .halt_io = ess_audio_halt_xfer,
729 .trigger = ess_audio_trigger,
730 .set_speed = ess_audio_set_speed,
731 .set_bits = ess_audio_set_bits,
732 .set_channels = ess_audio_set_channels
739 (
sb_devc *devc,
int *audio_flags,
int *format_mask)
750 tmp_dma = devc->
dma16;
752 devc->
dma8 = tmp_dma;
757 return &ess_audio_driver;
765 static void ess_handle_channel
766 (
char *
channel,
int dev,
int intr_active,
unsigned char flag,
int irq_mode)
768 if (!intr_active || !flag)
return;
769 #ifdef FKS_REG_LOGGING
770 printk(
KERN_INFO "FKS: ess_handle_channel %s irq_mode=%d\n", channel, irq_mode);
806 #ifdef FKS_REG_LOGGING
819 ess_chgmixer (devc, 0x7a, 0x80, 0x00);
827 static void ess_extended (
sb_devc * devc)
834 static int ess_write (
sb_devc * devc,
unsigned char reg,
unsigned char data)
836 #ifdef FKS_REG_LOGGING
847 static int ess_read (
sb_devc * devc,
unsigned char reg)
863 #ifdef FKS_REG_LOGGING
865 ess_show_mixerregs (devc);
868 DEB(
printk(
"Entered ess_dsp_reset()\n"));
879 DDB(
printk(
"sb: No response to RESET\n"));
888 ess_show_mixerregs (devc);
894 static int ess_irq_bits (
int irq)
919 static int ess_common_set_irq_hw (
sb_devc * devc)
923 if ((irq_bits = ess_irq_bits (devc->
irq)) == -1)
return 0;
925 if (!ess_write (devc, 0xb1, 0x50 | (irq_bits << 2))) {
926 printk(
KERN_ERR "ES1688: Failed to write to IRQ config register\n");
939 static void ess_es1887_set_irq_hw (
sb_devc * devc)
943 if ((irq_bits = ess_irq_bits (devc->
irq)) == -1)
return;
945 ess_chgmixer (devc, 0x7f, 0x0f, 0x01 | ((irq_bits + 1) << 1));
948 static int ess_set_irq_hw (
sb_devc * devc)
952 return ess_common_set_irq_hw (devc);
966 static void FKS_test (
sb_devc * devc)
974 printk (
KERN_INFO "FKS: FKS_test %02x, %02x\n", (val1 & 0x0ff), (val2 & 0x0ff));
978 static unsigned int ess_identify (
sb_devc * devc)
991 spin_unlock_irqrestore(&devc->
lock, flags);
1004 static int ess_probe (
sb_devc * devc,
int reg,
int xorval)
1006 int val1, val2, val3;
1009 val2 = val1 ^ xorval;
1014 return (val2 == val3);
1020 int ess_major = 0, ess_minor = 0;
1022 static char name[100], modelname[10];
1030 for (i = 1000;
i; i--) {
1032 if (ess_major == 0) {
1041 if (ess_major == 0)
return 0;
1043 if (ess_major == 0x48 && (ess_minor & 0xf0) == 0x80) {
1044 sprintf(name,
"ESS ES488 AudioDrive (rev %d)",
1069 if (ess_major == 0x68 && (ess_minor & 0xf0) == 0x80) {
1073 switch (devc->
sbmo.esstype) {
1108 if (submodel != -1) {
1113 if (chip ==
NULL && (ess_minor & 0x0f) < 8) {
1130 type = ess_identify (devc);
1150 if ((type & 0x00ff) != ((type >> 8) & 0x00ff)) {
1151 printk (
"ess_init: Unrecognized %04x\n", type);
1164 if (chip ==
NULL && !ess_probe(devc, 0x64, (1 << 4))) {
1172 if (chip ==
NULL && ess_probe(devc, 0x64, (1 << 2))) {
1173 if (ess_probe (devc, 0x70, 0x7f)) {
1174 if (ess_probe (devc, 0x64, (1 << 5))) {
1197 ?
" (kernel 2.0 compatible)"
1202 sprintf(name,
"ESS %s AudioDrive (rev %d)", chip, ess_minor & 0x0f);
1236 return ess_set_irq_hw (devc);
1239 static int ess_set_dma_hw(
sb_devc * devc)
1241 unsigned char cfg, dma_bits = 0, dma16_bits;
1254 if (dma > 3 || dma < 0 || dma == 2) {
1269 if (!ess_write (devc, 0xb2, cfg | (dma_bits << 2))) {
1270 printk(
KERN_ERR "ESS1688: Failed to write to DMA config register\n");
1297 ess_chgmixer (devc, 0x78, 0x20, dma16_bits);
1298 ess_chgmixer (devc, 0x7d, 0x07, dma_bits);
1330 if (hw_config->
dma2 != -1) {
1341 if (!ess_set_dma_hw (devc)) {
1354 #define ES688_RECORDING_DEVICES \
1355 ( SOUND_MASK_LINE | SOUND_MASK_MIC | SOUND_MASK_CD )
1356 #define ES688_MIXER_DEVICES \
1357 ( SOUND_MASK_SYNTH | SOUND_MASK_PCM | SOUND_MASK_LINE \
1358 | SOUND_MASK_MIC | SOUND_MASK_CD | SOUND_MASK_VOLUME \
1359 | SOUND_MASK_LINE2 | SOUND_MASK_SPEAKER )
1361 #define ES1688_RECORDING_DEVICES \
1362 ( ES688_RECORDING_DEVICES )
1363 #define ES1688_MIXER_DEVICES \
1364 ( ES688_MIXER_DEVICES | SOUND_MASK_RECLEV )
1366 #define ES1887_RECORDING_DEVICES \
1367 ( ES1688_RECORDING_DEVICES | SOUND_MASK_LINE2 | SOUND_MASK_SYNTH)
1368 #define ES1887_MIXER_DEVICES \
1369 ( ES1688_MIXER_DEVICES )
1378 #define ES_REC_MIXER_RECBASE (SOUND_MIXER_LINE3 + 1)
1379 #define ES_REC_MIXER_RECDIFF (ES_REC_MIXER_RECBASE - SOUND_MIXER_SYNTH)
1381 #define ES_REC_MIXER_RECSYNTH (SOUND_MIXER_SYNTH + ES_REC_MIXER_RECDIFF)
1382 #define ES_REC_MIXER_RECPCM (SOUND_MIXER_PCM + ES_REC_MIXER_RECDIFF)
1383 #define ES_REC_MIXER_RECSPEAKER (SOUND_MIXER_SPEAKER + ES_REC_MIXER_RECDIFF)
1384 #define ES_REC_MIXER_RECLINE (SOUND_MIXER_LINE + ES_REC_MIXER_RECDIFF)
1385 #define ES_REC_MIXER_RECMIC (SOUND_MIXER_MIC + ES_REC_MIXER_RECDIFF)
1386 #define ES_REC_MIXER_RECCD (SOUND_MIXER_CD + ES_REC_MIXER_RECDIFF)
1387 #define ES_REC_MIXER_RECIMIX (SOUND_MIXER_IMIX + ES_REC_MIXER_RECDIFF)
1388 #define ES_REC_MIXER_RECALTPCM (SOUND_MIXER_ALTPCM + ES_REC_MIXER_RECDIFF)
1389 #define ES_REC_MIXER_RECRECLEV (SOUND_MIXER_RECLEV + ES_REC_MIXER_RECDIFF)
1390 #define ES_REC_MIXER_RECIGAIN (SOUND_MIXER_IGAIN + ES_REC_MIXER_RECDIFF)
1391 #define ES_REC_MIXER_RECOGAIN (SOUND_MIXER_OGAIN + ES_REC_MIXER_RECDIFF)
1392 #define ES_REC_MIXER_RECLINE1 (SOUND_MIXER_LINE1 + ES_REC_MIXER_RECDIFF)
1393 #define ES_REC_MIXER_RECLINE2 (SOUND_MIXER_LINE2 + ES_REC_MIXER_RECDIFF)
1394 #define ES_REC_MIXER_RECLINE3 (SOUND_MIXER_LINE3 + ES_REC_MIXER_RECDIFF)
1540 static int ess_has_rec_mixer (
int submodel)
1551 static int ess_mixer_mon_regs[]
1552 = { 0x70, 0x71, 0x72, 0x74, 0x76, 0x78, 0x7a, 0x7c, 0x7d, 0x7f
1553 , 0xa1, 0xa2, 0xa4, 0xa5, 0xa8, 0xa9
1554 , 0xb1, 0xb2, 0xb4, 0xb5, 0xb6, 0xb7, 0xb9
1557 static void ess_show_mixerregs (
sb_devc *devc)
1559 int *
mp = ess_mixer_mon_regs;
1572 unsigned long flags;
1580 ess_write (devc, port, value);
1588 spin_unlock_irqrestore(&devc->
lock, flags);
1594 unsigned long flags;
1599 val = ess_read (devc, port);
1607 spin_unlock_irqrestore(&devc->
lock, flags);
1612 static void ess_chgmixer
1613 (
sb_devc * devc,
unsigned int reg,
unsigned int mask,
unsigned int val)
1618 value = (value & ~mask) | (val & mask);
1640 devc->
iomap = &es1887_mix;
1643 devc->
iomap = &es_rec_mix;
1651 devc->
iomap = &es688_mix;
1661 devc->
iomap = &es1688_mix;
1664 devc->
iomap = &es1688later_mix;
1677 if (ess_has_rec_mixer (devc->
submodel) && (devc->
recmask & (1 << dev))) {
1693 left = value & 0x000000ff;
1694 right = (value & 0x0000ff00) >> 8;
1699 static int es_rec_set_recmask(
sb_devc * devc,
int mask)
1701 int i, i_mask, cur_mask, diff_mask;
1714 diff_mask = (cur_mask ^
mask);
1716 for (i = 0; i < 32; i++) {
1718 if (diff_mask & i_mask) {
1719 if (mask & i_mask) {
1721 left = value & 0x000000ff;
1722 right = (value & 0x0000ff00) >> 8;
1737 if (ess_has_rec_mixer (devc->
submodel)) {
1738 *mask = es_rec_set_recmask (devc, *mask);
1753 if (ess_has_rec_mixer (devc->
submodel)) {
1761 ess_chgmixer(devc, 0x7a, 0x18, 0x08);
1762 ess_chgmixer(devc, 0x1c, 0x07, 0x07);
1769 es_rec_set_recmask(devc, 0);
1797 tmp = (hw_config->
io_base & 0x0f0) >> 4;
1809 switch (
abs(hw_config->
irq)) {