0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051
0052
0053
0054
0055
0056
0057
0058
0059
0060
0061
0062
0063
0064
0065 #include <linux/init.h>
0066 #include <linux/err.h>
0067 #include <linux/isa.h>
0068 #include <linux/pnp.h>
0069 #include <linux/isapnp.h>
0070 #include <linux/module.h>
0071 #include <linux/delay.h>
0072 #include <linux/io.h>
0073
0074 #include <asm/dma.h>
0075 #include <sound/core.h>
0076 #include <sound/control.h>
0077 #include <sound/pcm.h>
0078 #include <sound/pcm_params.h>
0079 #include <sound/mpu401.h>
0080 #include <sound/opl3.h>
0081 #define SNDRV_LEGACY_FIND_FREE_IRQ
0082 #define SNDRV_LEGACY_FIND_FREE_DMA
0083 #include <sound/initval.h>
0084
0085 #define PFX "es18xx: "
0086
0087 struct snd_es18xx {
0088 unsigned long port;
0089 unsigned long ctrl_port;
0090 int irq;
0091 int dma1;
0092 int dma2;
0093 unsigned short version;
0094 int caps;
0095 unsigned short audio2_vol;
0096
0097 unsigned short active;
0098 unsigned int dma1_shift;
0099 unsigned int dma2_shift;
0100
0101 struct snd_pcm *pcm;
0102 struct snd_pcm_substream *playback_a_substream;
0103 struct snd_pcm_substream *capture_a_substream;
0104 struct snd_pcm_substream *playback_b_substream;
0105
0106 struct snd_rawmidi *rmidi;
0107
0108 struct snd_kcontrol *hw_volume;
0109 struct snd_kcontrol *hw_switch;
0110 struct snd_kcontrol *master_volume;
0111 struct snd_kcontrol *master_switch;
0112
0113 spinlock_t reg_lock;
0114 spinlock_t mixer_lock;
0115 #ifdef CONFIG_PM
0116 unsigned char pm_reg;
0117 #endif
0118 #ifdef CONFIG_PNP
0119 struct pnp_dev *dev;
0120 struct pnp_dev *devc;
0121 #endif
0122 };
0123
0124 #define AUDIO1_IRQ 0x01
0125 #define AUDIO2_IRQ 0x02
0126 #define HWV_IRQ 0x04
0127 #define MPU_IRQ 0x08
0128
0129 #define ES18XX_PCM2 0x0001
0130 #define ES18XX_SPATIALIZER 0x0002
0131 #define ES18XX_RECMIX 0x0004
0132 #define ES18XX_DUPLEX_MONO 0x0008
0133 #define ES18XX_DUPLEX_SAME 0x0010
0134 #define ES18XX_NEW_RATE 0x0020
0135 #define ES18XX_AUXB 0x0040
0136 #define ES18XX_HWV 0x0080
0137 #define ES18XX_MONO 0x0100
0138 #define ES18XX_I2S 0x0200
0139 #define ES18XX_MUTEREC 0x0400
0140 #define ES18XX_CONTROL 0x0800
0141 #define ES18XX_GPO_2BIT 0x1000
0142
0143
0144 #define ES18XX_PM 0x07
0145 #define ES18XX_PM_GPO0 0x01
0146 #define ES18XX_PM_GPO1 0x02
0147 #define ES18XX_PM_PDR 0x04
0148 #define ES18XX_PM_ANA 0x08
0149 #define ES18XX_PM_FM 0x020
0150 #define ES18XX_PM_SUS 0x080
0151
0152
0153
0154 #define DAC1 0x01
0155 #define ADC1 0x02
0156 #define DAC2 0x04
0157 #define MILLISECOND 10000
0158
0159 static int snd_es18xx_dsp_command(struct snd_es18xx *chip, unsigned char val)
0160 {
0161 int i;
0162
0163 for(i = MILLISECOND; i; i--)
0164 if ((inb(chip->port + 0x0C) & 0x80) == 0) {
0165 outb(val, chip->port + 0x0C);
0166 return 0;
0167 }
0168 snd_printk(KERN_ERR "dsp_command: timeout (0x%x)\n", val);
0169 return -EINVAL;
0170 }
0171
0172 static int snd_es18xx_dsp_get_byte(struct snd_es18xx *chip)
0173 {
0174 int i;
0175
0176 for(i = MILLISECOND/10; i; i--)
0177 if (inb(chip->port + 0x0C) & 0x40)
0178 return inb(chip->port + 0x0A);
0179 snd_printk(KERN_ERR "dsp_get_byte failed: 0x%lx = 0x%x!!!\n",
0180 chip->port + 0x0A, inb(chip->port + 0x0A));
0181 return -ENODEV;
0182 }
0183
0184 #undef REG_DEBUG
0185
0186 static int snd_es18xx_write(struct snd_es18xx *chip,
0187 unsigned char reg, unsigned char data)
0188 {
0189 unsigned long flags;
0190 int ret;
0191
0192 spin_lock_irqsave(&chip->reg_lock, flags);
0193 ret = snd_es18xx_dsp_command(chip, reg);
0194 if (ret < 0)
0195 goto end;
0196 ret = snd_es18xx_dsp_command(chip, data);
0197 end:
0198 spin_unlock_irqrestore(&chip->reg_lock, flags);
0199 #ifdef REG_DEBUG
0200 snd_printk(KERN_DEBUG "Reg %02x set to %02x\n", reg, data);
0201 #endif
0202 return ret;
0203 }
0204
0205 static int snd_es18xx_read(struct snd_es18xx *chip, unsigned char reg)
0206 {
0207 unsigned long flags;
0208 int ret, data;
0209 spin_lock_irqsave(&chip->reg_lock, flags);
0210 ret = snd_es18xx_dsp_command(chip, 0xC0);
0211 if (ret < 0)
0212 goto end;
0213 ret = snd_es18xx_dsp_command(chip, reg);
0214 if (ret < 0)
0215 goto end;
0216 data = snd_es18xx_dsp_get_byte(chip);
0217 ret = data;
0218 #ifdef REG_DEBUG
0219 snd_printk(KERN_DEBUG "Reg %02x now is %02x (%d)\n", reg, data, ret);
0220 #endif
0221 end:
0222 spin_unlock_irqrestore(&chip->reg_lock, flags);
0223 return ret;
0224 }
0225
0226
0227 static int snd_es18xx_bits(struct snd_es18xx *chip, unsigned char reg,
0228 unsigned char mask, unsigned char val)
0229 {
0230 int ret;
0231 unsigned char old, new, oval;
0232 unsigned long flags;
0233 spin_lock_irqsave(&chip->reg_lock, flags);
0234 ret = snd_es18xx_dsp_command(chip, 0xC0);
0235 if (ret < 0)
0236 goto end;
0237 ret = snd_es18xx_dsp_command(chip, reg);
0238 if (ret < 0)
0239 goto end;
0240 ret = snd_es18xx_dsp_get_byte(chip);
0241 if (ret < 0) {
0242 goto end;
0243 }
0244 old = ret;
0245 oval = old & mask;
0246 if (val != oval) {
0247 ret = snd_es18xx_dsp_command(chip, reg);
0248 if (ret < 0)
0249 goto end;
0250 new = (old & ~mask) | (val & mask);
0251 ret = snd_es18xx_dsp_command(chip, new);
0252 if (ret < 0)
0253 goto end;
0254 #ifdef REG_DEBUG
0255 snd_printk(KERN_DEBUG "Reg %02x was %02x, set to %02x (%d)\n",
0256 reg, old, new, ret);
0257 #endif
0258 }
0259 ret = oval;
0260 end:
0261 spin_unlock_irqrestore(&chip->reg_lock, flags);
0262 return ret;
0263 }
0264
0265 static inline void snd_es18xx_mixer_write(struct snd_es18xx *chip,
0266 unsigned char reg, unsigned char data)
0267 {
0268 unsigned long flags;
0269 spin_lock_irqsave(&chip->mixer_lock, flags);
0270 outb(reg, chip->port + 0x04);
0271 outb(data, chip->port + 0x05);
0272 spin_unlock_irqrestore(&chip->mixer_lock, flags);
0273 #ifdef REG_DEBUG
0274 snd_printk(KERN_DEBUG "Mixer reg %02x set to %02x\n", reg, data);
0275 #endif
0276 }
0277
0278 static inline int snd_es18xx_mixer_read(struct snd_es18xx *chip, unsigned char reg)
0279 {
0280 unsigned long flags;
0281 int data;
0282 spin_lock_irqsave(&chip->mixer_lock, flags);
0283 outb(reg, chip->port + 0x04);
0284 data = inb(chip->port + 0x05);
0285 spin_unlock_irqrestore(&chip->mixer_lock, flags);
0286 #ifdef REG_DEBUG
0287 snd_printk(KERN_DEBUG "Mixer reg %02x now is %02x\n", reg, data);
0288 #endif
0289 return data;
0290 }
0291
0292
0293 static inline int snd_es18xx_mixer_bits(struct snd_es18xx *chip, unsigned char reg,
0294 unsigned char mask, unsigned char val)
0295 {
0296 unsigned char old, new, oval;
0297 unsigned long flags;
0298 spin_lock_irqsave(&chip->mixer_lock, flags);
0299 outb(reg, chip->port + 0x04);
0300 old = inb(chip->port + 0x05);
0301 oval = old & mask;
0302 if (val != oval) {
0303 new = (old & ~mask) | (val & mask);
0304 outb(new, chip->port + 0x05);
0305 #ifdef REG_DEBUG
0306 snd_printk(KERN_DEBUG "Mixer reg %02x was %02x, set to %02x\n",
0307 reg, old, new);
0308 #endif
0309 }
0310 spin_unlock_irqrestore(&chip->mixer_lock, flags);
0311 return oval;
0312 }
0313
0314 static inline int snd_es18xx_mixer_writable(struct snd_es18xx *chip, unsigned char reg,
0315 unsigned char mask)
0316 {
0317 int old, expected, new;
0318 unsigned long flags;
0319 spin_lock_irqsave(&chip->mixer_lock, flags);
0320 outb(reg, chip->port + 0x04);
0321 old = inb(chip->port + 0x05);
0322 expected = old ^ mask;
0323 outb(expected, chip->port + 0x05);
0324 new = inb(chip->port + 0x05);
0325 spin_unlock_irqrestore(&chip->mixer_lock, flags);
0326 #ifdef REG_DEBUG
0327 snd_printk(KERN_DEBUG "Mixer reg %02x was %02x, set to %02x, now is %02x\n",
0328 reg, old, expected, new);
0329 #endif
0330 return expected == new;
0331 }
0332
0333
0334 static int snd_es18xx_reset(struct snd_es18xx *chip)
0335 {
0336 int i;
0337 outb(0x03, chip->port + 0x06);
0338 inb(chip->port + 0x06);
0339 outb(0x00, chip->port + 0x06);
0340 for(i = 0; i < MILLISECOND && !(inb(chip->port + 0x0E) & 0x80); i++);
0341 if (inb(chip->port + 0x0A) != 0xAA)
0342 return -1;
0343 return 0;
0344 }
0345
0346 static int snd_es18xx_reset_fifo(struct snd_es18xx *chip)
0347 {
0348 outb(0x02, chip->port + 0x06);
0349 inb(chip->port + 0x06);
0350 outb(0x00, chip->port + 0x06);
0351 return 0;
0352 }
0353
0354 static const struct snd_ratnum new_clocks[2] = {
0355 {
0356 .num = 793800,
0357 .den_min = 1,
0358 .den_max = 128,
0359 .den_step = 1,
0360 },
0361 {
0362 .num = 768000,
0363 .den_min = 1,
0364 .den_max = 128,
0365 .den_step = 1,
0366 }
0367 };
0368
0369 static const struct snd_pcm_hw_constraint_ratnums new_hw_constraints_clocks = {
0370 .nrats = 2,
0371 .rats = new_clocks,
0372 };
0373
0374 static const struct snd_ratnum old_clocks[2] = {
0375 {
0376 .num = 795444,
0377 .den_min = 1,
0378 .den_max = 128,
0379 .den_step = 1,
0380 },
0381 {
0382 .num = 397722,
0383 .den_min = 1,
0384 .den_max = 128,
0385 .den_step = 1,
0386 }
0387 };
0388
0389 static const struct snd_pcm_hw_constraint_ratnums old_hw_constraints_clocks = {
0390 .nrats = 2,
0391 .rats = old_clocks,
0392 };
0393
0394
0395 static void snd_es18xx_rate_set(struct snd_es18xx *chip,
0396 struct snd_pcm_substream *substream,
0397 int mode)
0398 {
0399 unsigned int bits, div0;
0400 struct snd_pcm_runtime *runtime = substream->runtime;
0401 if (chip->caps & ES18XX_NEW_RATE) {
0402 if (runtime->rate_num == new_clocks[0].num)
0403 bits = 128 - runtime->rate_den;
0404 else
0405 bits = 256 - runtime->rate_den;
0406 } else {
0407 if (runtime->rate_num == old_clocks[0].num)
0408 bits = 256 - runtime->rate_den;
0409 else
0410 bits = 128 - runtime->rate_den;
0411 }
0412
0413
0414 div0 = 256 - 7160000*20/(8*82*runtime->rate);
0415
0416 if ((chip->caps & ES18XX_PCM2) && mode == DAC2) {
0417 snd_es18xx_mixer_write(chip, 0x70, bits);
0418
0419
0420
0421
0422 snd_es18xx_write(chip, 0xA2, div0);
0423 snd_es18xx_mixer_write(chip, 0x72, div0);
0424 } else {
0425 snd_es18xx_write(chip, 0xA1, bits);
0426 snd_es18xx_write(chip, 0xA2, div0);
0427 }
0428 }
0429
0430 static int snd_es18xx_playback_hw_params(struct snd_pcm_substream *substream,
0431 struct snd_pcm_hw_params *hw_params)
0432 {
0433 struct snd_es18xx *chip = snd_pcm_substream_chip(substream);
0434 int shift;
0435
0436 shift = 0;
0437 if (params_channels(hw_params) == 2)
0438 shift++;
0439 if (snd_pcm_format_width(params_format(hw_params)) == 16)
0440 shift++;
0441
0442 if (substream->number == 0 && (chip->caps & ES18XX_PCM2)) {
0443 if ((chip->caps & ES18XX_DUPLEX_MONO) &&
0444 (chip->capture_a_substream) &&
0445 params_channels(hw_params) != 1) {
0446 _snd_pcm_hw_param_setempty(hw_params, SNDRV_PCM_HW_PARAM_CHANNELS);
0447 return -EBUSY;
0448 }
0449 chip->dma2_shift = shift;
0450 } else {
0451 chip->dma1_shift = shift;
0452 }
0453 return 0;
0454 }
0455
0456 static int snd_es18xx_playback1_prepare(struct snd_es18xx *chip,
0457 struct snd_pcm_substream *substream)
0458 {
0459 struct snd_pcm_runtime *runtime = substream->runtime;
0460 unsigned int size = snd_pcm_lib_buffer_bytes(substream);
0461 unsigned int count = snd_pcm_lib_period_bytes(substream);
0462
0463 snd_es18xx_rate_set(chip, substream, DAC2);
0464
0465
0466 count = 0x10000 - count;
0467 snd_es18xx_mixer_write(chip, 0x74, count & 0xff);
0468 snd_es18xx_mixer_write(chip, 0x76, count >> 8);
0469
0470
0471 snd_es18xx_mixer_bits(chip, 0x7A, 0x07,
0472 ((runtime->channels == 1) ? 0x00 : 0x02) |
0473 (snd_pcm_format_width(runtime->format) == 16 ? 0x01 : 0x00) |
0474 (snd_pcm_format_unsigned(runtime->format) ? 0x00 : 0x04));
0475
0476
0477 snd_dma_program(chip->dma2, runtime->dma_addr, size, DMA_MODE_WRITE | DMA_AUTOINIT);
0478
0479 return 0;
0480 }
0481
0482 static int snd_es18xx_playback1_trigger(struct snd_es18xx *chip,
0483 struct snd_pcm_substream *substream,
0484 int cmd)
0485 {
0486 switch (cmd) {
0487 case SNDRV_PCM_TRIGGER_START:
0488 case SNDRV_PCM_TRIGGER_RESUME:
0489 if (chip->active & DAC2)
0490 return 0;
0491 chip->active |= DAC2;
0492
0493 if (chip->dma2 >= 4)
0494 snd_es18xx_mixer_write(chip, 0x78, 0xb3);
0495 else
0496 snd_es18xx_mixer_write(chip, 0x78, 0x93);
0497 #ifdef AVOID_POPS
0498
0499 mdelay(100);
0500 if (chip->caps & ES18XX_PCM2)
0501
0502 snd_es18xx_mixer_write(chip, 0x7C, chip->audio2_vol);
0503 else
0504
0505 snd_es18xx_dsp_command(chip, 0xD1);
0506 #endif
0507 break;
0508 case SNDRV_PCM_TRIGGER_STOP:
0509 case SNDRV_PCM_TRIGGER_SUSPEND:
0510 if (!(chip->active & DAC2))
0511 return 0;
0512 chip->active &= ~DAC2;
0513
0514 snd_es18xx_mixer_write(chip, 0x78, 0x00);
0515 #ifdef AVOID_POPS
0516 mdelay(25);
0517 if (chip->caps & ES18XX_PCM2)
0518
0519 snd_es18xx_mixer_write(chip, 0x7C, 0);
0520 else
0521
0522 snd_es18xx_dsp_command(chip, 0xD3);
0523 #endif
0524 break;
0525 default:
0526 return -EINVAL;
0527 }
0528
0529 return 0;
0530 }
0531
0532 static int snd_es18xx_capture_hw_params(struct snd_pcm_substream *substream,
0533 struct snd_pcm_hw_params *hw_params)
0534 {
0535 struct snd_es18xx *chip = snd_pcm_substream_chip(substream);
0536 int shift;
0537
0538 shift = 0;
0539 if ((chip->caps & ES18XX_DUPLEX_MONO) &&
0540 chip->playback_a_substream &&
0541 params_channels(hw_params) != 1) {
0542 _snd_pcm_hw_param_setempty(hw_params, SNDRV_PCM_HW_PARAM_CHANNELS);
0543 return -EBUSY;
0544 }
0545 if (params_channels(hw_params) == 2)
0546 shift++;
0547 if (snd_pcm_format_width(params_format(hw_params)) == 16)
0548 shift++;
0549 chip->dma1_shift = shift;
0550 return 0;
0551 }
0552
0553 static int snd_es18xx_capture_prepare(struct snd_pcm_substream *substream)
0554 {
0555 struct snd_es18xx *chip = snd_pcm_substream_chip(substream);
0556 struct snd_pcm_runtime *runtime = substream->runtime;
0557 unsigned int size = snd_pcm_lib_buffer_bytes(substream);
0558 unsigned int count = snd_pcm_lib_period_bytes(substream);
0559
0560 snd_es18xx_reset_fifo(chip);
0561
0562
0563 snd_es18xx_bits(chip, 0xA8, 0x03, runtime->channels == 1 ? 0x02 : 0x01);
0564
0565 snd_es18xx_rate_set(chip, substream, ADC1);
0566
0567
0568 count = 0x10000 - count;
0569 snd_es18xx_write(chip, 0xA4, count & 0xff);
0570 snd_es18xx_write(chip, 0xA5, count >> 8);
0571
0572 #ifdef AVOID_POPS
0573 mdelay(100);
0574 #endif
0575
0576
0577 snd_es18xx_write(chip, 0xB7,
0578 snd_pcm_format_unsigned(runtime->format) ? 0x51 : 0x71);
0579 snd_es18xx_write(chip, 0xB7, 0x90 |
0580 ((runtime->channels == 1) ? 0x40 : 0x08) |
0581 (snd_pcm_format_width(runtime->format) == 16 ? 0x04 : 0x00) |
0582 (snd_pcm_format_unsigned(runtime->format) ? 0x00 : 0x20));
0583
0584
0585 snd_dma_program(chip->dma1, runtime->dma_addr, size, DMA_MODE_READ | DMA_AUTOINIT);
0586
0587 return 0;
0588 }
0589
0590 static int snd_es18xx_capture_trigger(struct snd_pcm_substream *substream,
0591 int cmd)
0592 {
0593 struct snd_es18xx *chip = snd_pcm_substream_chip(substream);
0594
0595 switch (cmd) {
0596 case SNDRV_PCM_TRIGGER_START:
0597 case SNDRV_PCM_TRIGGER_RESUME:
0598 if (chip->active & ADC1)
0599 return 0;
0600 chip->active |= ADC1;
0601
0602 snd_es18xx_write(chip, 0xB8, 0x0f);
0603 break;
0604 case SNDRV_PCM_TRIGGER_STOP:
0605 case SNDRV_PCM_TRIGGER_SUSPEND:
0606 if (!(chip->active & ADC1))
0607 return 0;
0608 chip->active &= ~ADC1;
0609
0610 snd_es18xx_write(chip, 0xB8, 0x00);
0611 break;
0612 default:
0613 return -EINVAL;
0614 }
0615
0616 return 0;
0617 }
0618
0619 static int snd_es18xx_playback2_prepare(struct snd_es18xx *chip,
0620 struct snd_pcm_substream *substream)
0621 {
0622 struct snd_pcm_runtime *runtime = substream->runtime;
0623 unsigned int size = snd_pcm_lib_buffer_bytes(substream);
0624 unsigned int count = snd_pcm_lib_period_bytes(substream);
0625
0626 snd_es18xx_reset_fifo(chip);
0627
0628
0629 snd_es18xx_bits(chip, 0xA8, 0x03, runtime->channels == 1 ? 0x02 : 0x01);
0630
0631 snd_es18xx_rate_set(chip, substream, DAC1);
0632
0633
0634 count = 0x10000 - count;
0635 snd_es18xx_write(chip, 0xA4, count & 0xff);
0636 snd_es18xx_write(chip, 0xA5, count >> 8);
0637
0638
0639 snd_es18xx_write(chip, 0xB6,
0640 snd_pcm_format_unsigned(runtime->format) ? 0x80 : 0x00);
0641 snd_es18xx_write(chip, 0xB7,
0642 snd_pcm_format_unsigned(runtime->format) ? 0x51 : 0x71);
0643 snd_es18xx_write(chip, 0xB7, 0x90 |
0644 (runtime->channels == 1 ? 0x40 : 0x08) |
0645 (snd_pcm_format_width(runtime->format) == 16 ? 0x04 : 0x00) |
0646 (snd_pcm_format_unsigned(runtime->format) ? 0x00 : 0x20));
0647
0648
0649 snd_dma_program(chip->dma1, runtime->dma_addr, size, DMA_MODE_WRITE | DMA_AUTOINIT);
0650
0651 return 0;
0652 }
0653
0654 static int snd_es18xx_playback2_trigger(struct snd_es18xx *chip,
0655 struct snd_pcm_substream *substream,
0656 int cmd)
0657 {
0658 switch (cmd) {
0659 case SNDRV_PCM_TRIGGER_START:
0660 case SNDRV_PCM_TRIGGER_RESUME:
0661 if (chip->active & DAC1)
0662 return 0;
0663 chip->active |= DAC1;
0664
0665 snd_es18xx_write(chip, 0xB8, 0x05);
0666 #ifdef AVOID_POPS
0667
0668 mdelay(100);
0669
0670 snd_es18xx_dsp_command(chip, 0xD1);
0671 #endif
0672 break;
0673 case SNDRV_PCM_TRIGGER_STOP:
0674 case SNDRV_PCM_TRIGGER_SUSPEND:
0675 if (!(chip->active & DAC1))
0676 return 0;
0677 chip->active &= ~DAC1;
0678
0679 snd_es18xx_write(chip, 0xB8, 0x00);
0680 #ifdef AVOID_POPS
0681
0682 mdelay(25);
0683
0684 snd_es18xx_dsp_command(chip, 0xD3);
0685 #endif
0686 break;
0687 default:
0688 return -EINVAL;
0689 }
0690
0691 return 0;
0692 }
0693
0694 static int snd_es18xx_playback_prepare(struct snd_pcm_substream *substream)
0695 {
0696 struct snd_es18xx *chip = snd_pcm_substream_chip(substream);
0697 if (substream->number == 0 && (chip->caps & ES18XX_PCM2))
0698 return snd_es18xx_playback1_prepare(chip, substream);
0699 else
0700 return snd_es18xx_playback2_prepare(chip, substream);
0701 }
0702
0703 static int snd_es18xx_playback_trigger(struct snd_pcm_substream *substream,
0704 int cmd)
0705 {
0706 struct snd_es18xx *chip = snd_pcm_substream_chip(substream);
0707 if (substream->number == 0 && (chip->caps & ES18XX_PCM2))
0708 return snd_es18xx_playback1_trigger(chip, substream, cmd);
0709 else
0710 return snd_es18xx_playback2_trigger(chip, substream, cmd);
0711 }
0712
0713 static irqreturn_t snd_es18xx_interrupt(int irq, void *dev_id)
0714 {
0715 struct snd_card *card = dev_id;
0716 struct snd_es18xx *chip = card->private_data;
0717 unsigned char status;
0718
0719 if (chip->caps & ES18XX_CONTROL) {
0720
0721 status = inb(chip->ctrl_port + 6);
0722 } else {
0723
0724 status = snd_es18xx_mixer_read(chip, 0x7f) >> 4;
0725 }
0726 #if 0
0727 else {
0728 status = 0;
0729 if (inb(chip->port + 0x0C) & 0x01)
0730 status |= AUDIO1_IRQ;
0731 if (snd_es18xx_mixer_read(chip, 0x7A) & 0x80)
0732 status |= AUDIO2_IRQ;
0733 if ((chip->caps & ES18XX_HWV) &&
0734 snd_es18xx_mixer_read(chip, 0x64) & 0x10)
0735 status |= HWV_IRQ;
0736 }
0737 #endif
0738
0739
0740 if (status & AUDIO2_IRQ) {
0741 if (chip->active & DAC2)
0742 snd_pcm_period_elapsed(chip->playback_a_substream);
0743
0744 snd_es18xx_mixer_bits(chip, 0x7A, 0x80, 0x00);
0745 }
0746 if (status & AUDIO1_IRQ) {
0747
0748 if (chip->active & ADC1)
0749 snd_pcm_period_elapsed(chip->capture_a_substream);
0750
0751 else if (chip->active & DAC1)
0752 snd_pcm_period_elapsed(chip->playback_b_substream);
0753
0754 inb(chip->port + 0x0E);
0755 }
0756
0757
0758 if ((status & MPU_IRQ) && chip->rmidi)
0759 snd_mpu401_uart_interrupt(irq, chip->rmidi->private_data);
0760
0761
0762 if (status & HWV_IRQ) {
0763 int split = 0;
0764 if (chip->caps & ES18XX_HWV) {
0765 split = snd_es18xx_mixer_read(chip, 0x64) & 0x80;
0766 snd_ctl_notify(card, SNDRV_CTL_EVENT_MASK_VALUE,
0767 &chip->hw_switch->id);
0768 snd_ctl_notify(card, SNDRV_CTL_EVENT_MASK_VALUE,
0769 &chip->hw_volume->id);
0770 }
0771 if (!split) {
0772 snd_ctl_notify(card, SNDRV_CTL_EVENT_MASK_VALUE,
0773 &chip->master_switch->id);
0774 snd_ctl_notify(card, SNDRV_CTL_EVENT_MASK_VALUE,
0775 &chip->master_volume->id);
0776 }
0777
0778 snd_es18xx_mixer_write(chip, 0x66, 0x00);
0779 }
0780 return IRQ_HANDLED;
0781 }
0782
0783 static snd_pcm_uframes_t snd_es18xx_playback_pointer(struct snd_pcm_substream *substream)
0784 {
0785 struct snd_es18xx *chip = snd_pcm_substream_chip(substream);
0786 unsigned int size = snd_pcm_lib_buffer_bytes(substream);
0787 int pos;
0788
0789 if (substream->number == 0 && (chip->caps & ES18XX_PCM2)) {
0790 if (!(chip->active & DAC2))
0791 return 0;
0792 pos = snd_dma_pointer(chip->dma2, size);
0793 return pos >> chip->dma2_shift;
0794 } else {
0795 if (!(chip->active & DAC1))
0796 return 0;
0797 pos = snd_dma_pointer(chip->dma1, size);
0798 return pos >> chip->dma1_shift;
0799 }
0800 }
0801
0802 static snd_pcm_uframes_t snd_es18xx_capture_pointer(struct snd_pcm_substream *substream)
0803 {
0804 struct snd_es18xx *chip = snd_pcm_substream_chip(substream);
0805 unsigned int size = snd_pcm_lib_buffer_bytes(substream);
0806 int pos;
0807
0808 if (!(chip->active & ADC1))
0809 return 0;
0810 pos = snd_dma_pointer(chip->dma1, size);
0811 return pos >> chip->dma1_shift;
0812 }
0813
0814 static const struct snd_pcm_hardware snd_es18xx_playback =
0815 {
0816 .info = (SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_INTERLEAVED |
0817 SNDRV_PCM_INFO_RESUME |
0818 SNDRV_PCM_INFO_MMAP_VALID),
0819 .formats = (SNDRV_PCM_FMTBIT_U8 | SNDRV_PCM_FMTBIT_S8 |
0820 SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_U16_LE),
0821 .rates = SNDRV_PCM_RATE_CONTINUOUS | SNDRV_PCM_RATE_8000_48000,
0822 .rate_min = 4000,
0823 .rate_max = 48000,
0824 .channels_min = 1,
0825 .channels_max = 2,
0826 .buffer_bytes_max = 65536,
0827 .period_bytes_min = 64,
0828 .period_bytes_max = 65536,
0829 .periods_min = 1,
0830 .periods_max = 1024,
0831 .fifo_size = 0,
0832 };
0833
0834 static const struct snd_pcm_hardware snd_es18xx_capture =
0835 {
0836 .info = (SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_INTERLEAVED |
0837 SNDRV_PCM_INFO_RESUME |
0838 SNDRV_PCM_INFO_MMAP_VALID),
0839 .formats = (SNDRV_PCM_FMTBIT_U8 | SNDRV_PCM_FMTBIT_S8 |
0840 SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_U16_LE),
0841 .rates = SNDRV_PCM_RATE_CONTINUOUS | SNDRV_PCM_RATE_8000_48000,
0842 .rate_min = 4000,
0843 .rate_max = 48000,
0844 .channels_min = 1,
0845 .channels_max = 2,
0846 .buffer_bytes_max = 65536,
0847 .period_bytes_min = 64,
0848 .period_bytes_max = 65536,
0849 .periods_min = 1,
0850 .periods_max = 1024,
0851 .fifo_size = 0,
0852 };
0853
0854 static int snd_es18xx_playback_open(struct snd_pcm_substream *substream)
0855 {
0856 struct snd_pcm_runtime *runtime = substream->runtime;
0857 struct snd_es18xx *chip = snd_pcm_substream_chip(substream);
0858
0859 if (substream->number == 0 && (chip->caps & ES18XX_PCM2)) {
0860 if ((chip->caps & ES18XX_DUPLEX_MONO) &&
0861 chip->capture_a_substream &&
0862 chip->capture_a_substream->runtime->channels != 1)
0863 return -EAGAIN;
0864 chip->playback_a_substream = substream;
0865 } else if (substream->number <= 1) {
0866 if (chip->capture_a_substream)
0867 return -EAGAIN;
0868 chip->playback_b_substream = substream;
0869 } else {
0870 snd_BUG();
0871 return -EINVAL;
0872 }
0873 substream->runtime->hw = snd_es18xx_playback;
0874 snd_pcm_hw_constraint_ratnums(runtime, 0, SNDRV_PCM_HW_PARAM_RATE,
0875 (chip->caps & ES18XX_NEW_RATE) ? &new_hw_constraints_clocks : &old_hw_constraints_clocks);
0876 return 0;
0877 }
0878
0879 static int snd_es18xx_capture_open(struct snd_pcm_substream *substream)
0880 {
0881 struct snd_pcm_runtime *runtime = substream->runtime;
0882 struct snd_es18xx *chip = snd_pcm_substream_chip(substream);
0883
0884 if (chip->playback_b_substream)
0885 return -EAGAIN;
0886 if ((chip->caps & ES18XX_DUPLEX_MONO) &&
0887 chip->playback_a_substream &&
0888 chip->playback_a_substream->runtime->channels != 1)
0889 return -EAGAIN;
0890 chip->capture_a_substream = substream;
0891 substream->runtime->hw = snd_es18xx_capture;
0892 snd_pcm_hw_constraint_ratnums(runtime, 0, SNDRV_PCM_HW_PARAM_RATE,
0893 (chip->caps & ES18XX_NEW_RATE) ? &new_hw_constraints_clocks : &old_hw_constraints_clocks);
0894 return 0;
0895 }
0896
0897 static int snd_es18xx_playback_close(struct snd_pcm_substream *substream)
0898 {
0899 struct snd_es18xx *chip = snd_pcm_substream_chip(substream);
0900
0901 if (substream->number == 0 && (chip->caps & ES18XX_PCM2))
0902 chip->playback_a_substream = NULL;
0903 else
0904 chip->playback_b_substream = NULL;
0905
0906 return 0;
0907 }
0908
0909 static int snd_es18xx_capture_close(struct snd_pcm_substream *substream)
0910 {
0911 struct snd_es18xx *chip = snd_pcm_substream_chip(substream);
0912
0913 chip->capture_a_substream = NULL;
0914 return 0;
0915 }
0916
0917
0918
0919
0920
0921
0922
0923
0924
0925
0926
0927
0928
0929
0930
0931
0932
0933
0934
0935
0936
0937 static int snd_es18xx_info_mux(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
0938 {
0939 static const char * const texts5Source[5] = {
0940 "Mic", "CD", "Line", "Master", "Mix"
0941 };
0942 static const char * const texts8Source[8] = {
0943 "Mic", "Mic Master", "CD", "AOUT",
0944 "Mic1", "Mix", "Line", "Master"
0945 };
0946 struct snd_es18xx *chip = snd_kcontrol_chip(kcontrol);
0947
0948 switch (chip->version) {
0949 case 0x1868:
0950 case 0x1878:
0951 return snd_ctl_enum_info(uinfo, 1, 4, texts5Source);
0952 case 0x1887:
0953 case 0x1888:
0954 return snd_ctl_enum_info(uinfo, 1, 5, texts5Source);
0955 case 0x1869:
0956 case 0x1879:
0957 return snd_ctl_enum_info(uinfo, 1, 8, texts8Source);
0958 default:
0959 return -EINVAL;
0960 }
0961 }
0962
0963 static int snd_es18xx_get_mux(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
0964 {
0965 static const unsigned char invMap4Source[8] = {0, 0, 1, 1, 0, 0, 2, 3};
0966 struct snd_es18xx *chip = snd_kcontrol_chip(kcontrol);
0967 int muxSource = snd_es18xx_mixer_read(chip, 0x1c) & 0x07;
0968 if (!(chip->version == 0x1869 || chip->version == 0x1879)) {
0969 muxSource = invMap4Source[muxSource];
0970 if (muxSource==3 &&
0971 (chip->version == 0x1887 || chip->version == 0x1888) &&
0972 (snd_es18xx_mixer_read(chip, 0x7a) & 0x08)
0973 )
0974 muxSource = 4;
0975 }
0976 ucontrol->value.enumerated.item[0] = muxSource;
0977 return 0;
0978 }
0979
0980 static int snd_es18xx_put_mux(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
0981 {
0982 static const unsigned char map4Source[4] = {0, 2, 6, 7};
0983 struct snd_es18xx *chip = snd_kcontrol_chip(kcontrol);
0984 unsigned char val = ucontrol->value.enumerated.item[0];
0985 unsigned char retVal = 0;
0986
0987 switch (chip->version) {
0988
0989 case 0x1887:
0990 case 0x1888:
0991 if (val > 4)
0992 return -EINVAL;
0993 if (val == 4) {
0994 retVal = snd_es18xx_mixer_bits(chip, 0x7a, 0x08, 0x08) != 0x08;
0995 val = 3;
0996 } else
0997 retVal = snd_es18xx_mixer_bits(chip, 0x7a, 0x08, 0x00) != 0x00;
0998 fallthrough;
0999
1000 case 0x1868:
1001 case 0x1878:
1002 if (val > 3)
1003 return -EINVAL;
1004 val = map4Source[val];
1005 break;
1006
1007 case 0x1869:
1008 case 0x1879:
1009 if (val > 7)
1010 return -EINVAL;
1011 break;
1012 default:
1013 return -EINVAL;
1014 }
1015 return (snd_es18xx_mixer_bits(chip, 0x1c, 0x07, val) != val) || retVal;
1016 }
1017
1018 #define snd_es18xx_info_spatializer_enable snd_ctl_boolean_mono_info
1019
1020 static int snd_es18xx_get_spatializer_enable(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
1021 {
1022 struct snd_es18xx *chip = snd_kcontrol_chip(kcontrol);
1023 unsigned char val = snd_es18xx_mixer_read(chip, 0x50);
1024 ucontrol->value.integer.value[0] = !!(val & 8);
1025 return 0;
1026 }
1027
1028 static int snd_es18xx_put_spatializer_enable(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
1029 {
1030 struct snd_es18xx *chip = snd_kcontrol_chip(kcontrol);
1031 unsigned char oval, nval;
1032 int change;
1033 nval = ucontrol->value.integer.value[0] ? 0x0c : 0x04;
1034 oval = snd_es18xx_mixer_read(chip, 0x50) & 0x0c;
1035 change = nval != oval;
1036 if (change) {
1037 snd_es18xx_mixer_write(chip, 0x50, nval & ~0x04);
1038 snd_es18xx_mixer_write(chip, 0x50, nval);
1039 }
1040 return change;
1041 }
1042
1043 static int snd_es18xx_info_hw_volume(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
1044 {
1045 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
1046 uinfo->count = 2;
1047 uinfo->value.integer.min = 0;
1048 uinfo->value.integer.max = 63;
1049 return 0;
1050 }
1051
1052 static int snd_es18xx_get_hw_volume(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
1053 {
1054 struct snd_es18xx *chip = snd_kcontrol_chip(kcontrol);
1055 ucontrol->value.integer.value[0] = snd_es18xx_mixer_read(chip, 0x61) & 0x3f;
1056 ucontrol->value.integer.value[1] = snd_es18xx_mixer_read(chip, 0x63) & 0x3f;
1057 return 0;
1058 }
1059
1060 #define snd_es18xx_info_hw_switch snd_ctl_boolean_stereo_info
1061
1062 static int snd_es18xx_get_hw_switch(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
1063 {
1064 struct snd_es18xx *chip = snd_kcontrol_chip(kcontrol);
1065 ucontrol->value.integer.value[0] = !(snd_es18xx_mixer_read(chip, 0x61) & 0x40);
1066 ucontrol->value.integer.value[1] = !(snd_es18xx_mixer_read(chip, 0x63) & 0x40);
1067 return 0;
1068 }
1069
1070 static void snd_es18xx_hwv_free(struct snd_kcontrol *kcontrol)
1071 {
1072 struct snd_es18xx *chip = snd_kcontrol_chip(kcontrol);
1073 chip->master_volume = NULL;
1074 chip->master_switch = NULL;
1075 chip->hw_volume = NULL;
1076 chip->hw_switch = NULL;
1077 }
1078
1079 static int snd_es18xx_reg_bits(struct snd_es18xx *chip, unsigned char reg,
1080 unsigned char mask, unsigned char val)
1081 {
1082 if (reg < 0xa0)
1083 return snd_es18xx_mixer_bits(chip, reg, mask, val);
1084 else
1085 return snd_es18xx_bits(chip, reg, mask, val);
1086 }
1087
1088 static int snd_es18xx_reg_read(struct snd_es18xx *chip, unsigned char reg)
1089 {
1090 if (reg < 0xa0)
1091 return snd_es18xx_mixer_read(chip, reg);
1092 else
1093 return snd_es18xx_read(chip, reg);
1094 }
1095
1096 #define ES18XX_SINGLE(xname, xindex, reg, shift, mask, flags) \
1097 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = xindex, \
1098 .info = snd_es18xx_info_single, \
1099 .get = snd_es18xx_get_single, .put = snd_es18xx_put_single, \
1100 .private_value = reg | (shift << 8) | (mask << 16) | (flags << 24) }
1101
1102 #define ES18XX_FL_INVERT (1 << 0)
1103 #define ES18XX_FL_PMPORT (1 << 1)
1104
1105 static int snd_es18xx_info_single(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
1106 {
1107 int mask = (kcontrol->private_value >> 16) & 0xff;
1108
1109 uinfo->type = mask == 1 ? SNDRV_CTL_ELEM_TYPE_BOOLEAN : SNDRV_CTL_ELEM_TYPE_INTEGER;
1110 uinfo->count = 1;
1111 uinfo->value.integer.min = 0;
1112 uinfo->value.integer.max = mask;
1113 return 0;
1114 }
1115
1116 static int snd_es18xx_get_single(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
1117 {
1118 struct snd_es18xx *chip = snd_kcontrol_chip(kcontrol);
1119 int reg = kcontrol->private_value & 0xff;
1120 int shift = (kcontrol->private_value >> 8) & 0xff;
1121 int mask = (kcontrol->private_value >> 16) & 0xff;
1122 int invert = (kcontrol->private_value >> 24) & ES18XX_FL_INVERT;
1123 int pm_port = (kcontrol->private_value >> 24) & ES18XX_FL_PMPORT;
1124 int val;
1125
1126 if (pm_port)
1127 val = inb(chip->port + ES18XX_PM);
1128 else
1129 val = snd_es18xx_reg_read(chip, reg);
1130 ucontrol->value.integer.value[0] = (val >> shift) & mask;
1131 if (invert)
1132 ucontrol->value.integer.value[0] = mask - ucontrol->value.integer.value[0];
1133 return 0;
1134 }
1135
1136 static int snd_es18xx_put_single(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
1137 {
1138 struct snd_es18xx *chip = snd_kcontrol_chip(kcontrol);
1139 int reg = kcontrol->private_value & 0xff;
1140 int shift = (kcontrol->private_value >> 8) & 0xff;
1141 int mask = (kcontrol->private_value >> 16) & 0xff;
1142 int invert = (kcontrol->private_value >> 24) & ES18XX_FL_INVERT;
1143 int pm_port = (kcontrol->private_value >> 24) & ES18XX_FL_PMPORT;
1144 unsigned char val;
1145
1146 val = (ucontrol->value.integer.value[0] & mask);
1147 if (invert)
1148 val = mask - val;
1149 mask <<= shift;
1150 val <<= shift;
1151 if (pm_port) {
1152 unsigned char cur = inb(chip->port + ES18XX_PM);
1153
1154 if ((cur & mask) == val)
1155 return 0;
1156 outb((cur & ~mask) | val, chip->port + ES18XX_PM);
1157 return 1;
1158 }
1159
1160 return snd_es18xx_reg_bits(chip, reg, mask, val) != val;
1161 }
1162
1163 #define ES18XX_DOUBLE(xname, xindex, left_reg, right_reg, shift_left, shift_right, mask, invert) \
1164 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = xindex, \
1165 .info = snd_es18xx_info_double, \
1166 .get = snd_es18xx_get_double, .put = snd_es18xx_put_double, \
1167 .private_value = left_reg | (right_reg << 8) | (shift_left << 16) | (shift_right << 19) | (mask << 24) | (invert << 22) }
1168
1169 static int snd_es18xx_info_double(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
1170 {
1171 int mask = (kcontrol->private_value >> 24) & 0xff;
1172
1173 uinfo->type = mask == 1 ? SNDRV_CTL_ELEM_TYPE_BOOLEAN : SNDRV_CTL_ELEM_TYPE_INTEGER;
1174 uinfo->count = 2;
1175 uinfo->value.integer.min = 0;
1176 uinfo->value.integer.max = mask;
1177 return 0;
1178 }
1179
1180 static int snd_es18xx_get_double(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
1181 {
1182 struct snd_es18xx *chip = snd_kcontrol_chip(kcontrol);
1183 int left_reg = kcontrol->private_value & 0xff;
1184 int right_reg = (kcontrol->private_value >> 8) & 0xff;
1185 int shift_left = (kcontrol->private_value >> 16) & 0x07;
1186 int shift_right = (kcontrol->private_value >> 19) & 0x07;
1187 int mask = (kcontrol->private_value >> 24) & 0xff;
1188 int invert = (kcontrol->private_value >> 22) & 1;
1189 unsigned char left, right;
1190
1191 left = snd_es18xx_reg_read(chip, left_reg);
1192 if (left_reg != right_reg)
1193 right = snd_es18xx_reg_read(chip, right_reg);
1194 else
1195 right = left;
1196 ucontrol->value.integer.value[0] = (left >> shift_left) & mask;
1197 ucontrol->value.integer.value[1] = (right >> shift_right) & mask;
1198 if (invert) {
1199 ucontrol->value.integer.value[0] = mask - ucontrol->value.integer.value[0];
1200 ucontrol->value.integer.value[1] = mask - ucontrol->value.integer.value[1];
1201 }
1202 return 0;
1203 }
1204
1205 static int snd_es18xx_put_double(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
1206 {
1207 struct snd_es18xx *chip = snd_kcontrol_chip(kcontrol);
1208 int left_reg = kcontrol->private_value & 0xff;
1209 int right_reg = (kcontrol->private_value >> 8) & 0xff;
1210 int shift_left = (kcontrol->private_value >> 16) & 0x07;
1211 int shift_right = (kcontrol->private_value >> 19) & 0x07;
1212 int mask = (kcontrol->private_value >> 24) & 0xff;
1213 int invert = (kcontrol->private_value >> 22) & 1;
1214 int change;
1215 unsigned char val1, val2, mask1, mask2;
1216
1217 val1 = ucontrol->value.integer.value[0] & mask;
1218 val2 = ucontrol->value.integer.value[1] & mask;
1219 if (invert) {
1220 val1 = mask - val1;
1221 val2 = mask - val2;
1222 }
1223 val1 <<= shift_left;
1224 val2 <<= shift_right;
1225 mask1 = mask << shift_left;
1226 mask2 = mask << shift_right;
1227 if (left_reg != right_reg) {
1228 change = 0;
1229 if (snd_es18xx_reg_bits(chip, left_reg, mask1, val1) != val1)
1230 change = 1;
1231 if (snd_es18xx_reg_bits(chip, right_reg, mask2, val2) != val2)
1232 change = 1;
1233 } else {
1234 change = (snd_es18xx_reg_bits(chip, left_reg, mask1 | mask2,
1235 val1 | val2) != (val1 | val2));
1236 }
1237 return change;
1238 }
1239
1240
1241
1242
1243
1244
1245
1246 static const struct snd_kcontrol_new snd_es18xx_base_controls[] = {
1247 ES18XX_DOUBLE("Master Playback Volume", 0, 0x60, 0x62, 0, 0, 63, 0),
1248 ES18XX_DOUBLE("Master Playback Switch", 0, 0x60, 0x62, 6, 6, 1, 1),
1249 ES18XX_DOUBLE("Line Playback Volume", 0, 0x3e, 0x3e, 4, 0, 15, 0),
1250 ES18XX_DOUBLE("CD Playback Volume", 0, 0x38, 0x38, 4, 0, 15, 0),
1251 ES18XX_DOUBLE("FM Playback Volume", 0, 0x36, 0x36, 4, 0, 15, 0),
1252 ES18XX_DOUBLE("Mic Playback Volume", 0, 0x1a, 0x1a, 4, 0, 15, 0),
1253 ES18XX_DOUBLE("Aux Playback Volume", 0, 0x3a, 0x3a, 4, 0, 15, 0),
1254 ES18XX_SINGLE("Record Monitor", 0, 0xa8, 3, 1, 0),
1255 ES18XX_DOUBLE("Capture Volume", 0, 0xb4, 0xb4, 4, 0, 15, 0),
1256 {
1257 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
1258 .name = "Capture Source",
1259 .info = snd_es18xx_info_mux,
1260 .get = snd_es18xx_get_mux,
1261 .put = snd_es18xx_put_mux,
1262 }
1263 };
1264
1265 static const struct snd_kcontrol_new snd_es18xx_recmix_controls[] = {
1266 ES18XX_DOUBLE("PCM Capture Volume", 0, 0x69, 0x69, 4, 0, 15, 0),
1267 ES18XX_DOUBLE("Mic Capture Volume", 0, 0x68, 0x68, 4, 0, 15, 0),
1268 ES18XX_DOUBLE("Line Capture Volume", 0, 0x6e, 0x6e, 4, 0, 15, 0),
1269 ES18XX_DOUBLE("FM Capture Volume", 0, 0x6b, 0x6b, 4, 0, 15, 0),
1270 ES18XX_DOUBLE("CD Capture Volume", 0, 0x6a, 0x6a, 4, 0, 15, 0),
1271 ES18XX_DOUBLE("Aux Capture Volume", 0, 0x6c, 0x6c, 4, 0, 15, 0)
1272 };
1273
1274
1275
1276
1277 static const struct snd_kcontrol_new snd_es18xx_opt_speaker =
1278 ES18XX_SINGLE("Beep Playback Volume", 0, 0x3c, 0, 7, 0);
1279
1280 static const struct snd_kcontrol_new snd_es18xx_opt_1869[] = {
1281 ES18XX_SINGLE("Capture Switch", 0, 0x1c, 4, 1, ES18XX_FL_INVERT),
1282 ES18XX_SINGLE("Video Playback Switch", 0, 0x7f, 0, 1, 0),
1283 ES18XX_DOUBLE("Mono Playback Volume", 0, 0x6d, 0x6d, 4, 0, 15, 0),
1284 ES18XX_DOUBLE("Mono Capture Volume", 0, 0x6f, 0x6f, 4, 0, 15, 0)
1285 };
1286
1287 static const struct snd_kcontrol_new snd_es18xx_opt_1878 =
1288 ES18XX_DOUBLE("Video Playback Volume", 0, 0x68, 0x68, 4, 0, 15, 0);
1289
1290 static const struct snd_kcontrol_new snd_es18xx_opt_1879[] = {
1291 ES18XX_SINGLE("Video Playback Switch", 0, 0x71, 6, 1, 0),
1292 ES18XX_DOUBLE("Video Playback Volume", 0, 0x6d, 0x6d, 4, 0, 15, 0),
1293 ES18XX_DOUBLE("Video Capture Volume", 0, 0x6f, 0x6f, 4, 0, 15, 0)
1294 };
1295
1296 static const struct snd_kcontrol_new snd_es18xx_pcm1_controls[] = {
1297 ES18XX_DOUBLE("PCM Playback Volume", 0, 0x14, 0x14, 4, 0, 15, 0),
1298 };
1299
1300 static const struct snd_kcontrol_new snd_es18xx_pcm2_controls[] = {
1301 ES18XX_DOUBLE("PCM Playback Volume", 0, 0x7c, 0x7c, 4, 0, 15, 0),
1302 ES18XX_DOUBLE("PCM Playback Volume", 1, 0x14, 0x14, 4, 0, 15, 0)
1303 };
1304
1305 static const struct snd_kcontrol_new snd_es18xx_spatializer_controls[] = {
1306 ES18XX_SINGLE("3D Control - Level", 0, 0x52, 0, 63, 0),
1307 {
1308 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
1309 .name = "3D Control - Switch",
1310 .info = snd_es18xx_info_spatializer_enable,
1311 .get = snd_es18xx_get_spatializer_enable,
1312 .put = snd_es18xx_put_spatializer_enable,
1313 }
1314 };
1315
1316 static const struct snd_kcontrol_new snd_es18xx_micpre1_control =
1317 ES18XX_SINGLE("Mic Boost (+26dB)", 0, 0xa9, 2, 1, 0);
1318
1319 static const struct snd_kcontrol_new snd_es18xx_micpre2_control =
1320 ES18XX_SINGLE("Mic Boost (+26dB)", 0, 0x7d, 3, 1, 0);
1321
1322 static const struct snd_kcontrol_new snd_es18xx_hw_volume_controls[] = {
1323 {
1324 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
1325 .name = "Hardware Master Playback Volume",
1326 .access = SNDRV_CTL_ELEM_ACCESS_READ,
1327 .info = snd_es18xx_info_hw_volume,
1328 .get = snd_es18xx_get_hw_volume,
1329 },
1330 {
1331 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
1332 .name = "Hardware Master Playback Switch",
1333 .access = SNDRV_CTL_ELEM_ACCESS_READ,
1334 .info = snd_es18xx_info_hw_switch,
1335 .get = snd_es18xx_get_hw_switch,
1336 },
1337 ES18XX_SINGLE("Hardware Master Volume Split", 0, 0x64, 7, 1, 0),
1338 };
1339
1340 static const struct snd_kcontrol_new snd_es18xx_opt_gpo_2bit[] = {
1341 ES18XX_SINGLE("GPO0 Switch", 0, ES18XX_PM, 0, 1, ES18XX_FL_PMPORT),
1342 ES18XX_SINGLE("GPO1 Switch", 0, ES18XX_PM, 1, 1, ES18XX_FL_PMPORT),
1343 };
1344
1345 static int snd_es18xx_config_read(struct snd_es18xx *chip, unsigned char reg)
1346 {
1347 int data;
1348
1349 outb(reg, chip->ctrl_port);
1350 data = inb(chip->ctrl_port + 1);
1351 return data;
1352 }
1353
1354 static void snd_es18xx_config_write(struct snd_es18xx *chip,
1355 unsigned char reg, unsigned char data)
1356 {
1357
1358
1359 outb(reg, chip->ctrl_port);
1360 outb(data, chip->ctrl_port + 1);
1361 #ifdef REG_DEBUG
1362 snd_printk(KERN_DEBUG "Config reg %02x set to %02x\n", reg, data);
1363 #endif
1364 }
1365
1366 static int snd_es18xx_initialize(struct snd_es18xx *chip,
1367 unsigned long mpu_port,
1368 unsigned long fm_port)
1369 {
1370 int mask = 0;
1371
1372
1373 snd_es18xx_dsp_command(chip, 0xC6);
1374
1375 snd_es18xx_mixer_write(chip, 0x00, 0x00);
1376
1377
1378 snd_es18xx_write(chip, 0xB9, 2);
1379 if (chip->caps & ES18XX_CONTROL) {
1380
1381 snd_es18xx_config_write(chip, 0x27, chip->irq);
1382 if (fm_port > 0 && fm_port != SNDRV_AUTO_PORT) {
1383
1384 snd_es18xx_config_write(chip, 0x62, fm_port >> 8);
1385 snd_es18xx_config_write(chip, 0x63, fm_port & 0xff);
1386 }
1387 if (mpu_port > 0 && mpu_port != SNDRV_AUTO_PORT) {
1388
1389 snd_es18xx_config_write(chip, 0x64, mpu_port >> 8);
1390 snd_es18xx_config_write(chip, 0x65, mpu_port & 0xff);
1391
1392 snd_es18xx_config_write(chip, 0x28, chip->irq);
1393 }
1394
1395 snd_es18xx_config_write(chip, 0x70, chip->irq);
1396
1397 snd_es18xx_config_write(chip, 0x72, chip->irq);
1398
1399 snd_es18xx_config_write(chip, 0x74, chip->dma1);
1400
1401 snd_es18xx_config_write(chip, 0x75, chip->dma2);
1402
1403
1404 snd_es18xx_write(chip, 0xB1, 0x50);
1405
1406 snd_es18xx_mixer_write(chip, 0x7A, 0x40);
1407
1408 snd_es18xx_write(chip, 0xB2, 0x50);
1409
1410 snd_es18xx_mixer_write(chip, 0x64, 0x42);
1411
1412 snd_es18xx_mixer_bits(chip, 0x48, 0x10, 0x10);
1413 }
1414 else {
1415 int irqmask, dma1mask, dma2mask;
1416 switch (chip->irq) {
1417 case 2:
1418 case 9:
1419 irqmask = 0;
1420 break;
1421 case 5:
1422 irqmask = 1;
1423 break;
1424 case 7:
1425 irqmask = 2;
1426 break;
1427 case 10:
1428 irqmask = 3;
1429 break;
1430 default:
1431 snd_printk(KERN_ERR "invalid irq %d\n", chip->irq);
1432 return -ENODEV;
1433 }
1434 switch (chip->dma1) {
1435 case 0:
1436 dma1mask = 1;
1437 break;
1438 case 1:
1439 dma1mask = 2;
1440 break;
1441 case 3:
1442 dma1mask = 3;
1443 break;
1444 default:
1445 snd_printk(KERN_ERR "invalid dma1 %d\n", chip->dma1);
1446 return -ENODEV;
1447 }
1448 switch (chip->dma2) {
1449 case 0:
1450 dma2mask = 0;
1451 break;
1452 case 1:
1453 dma2mask = 1;
1454 break;
1455 case 3:
1456 dma2mask = 2;
1457 break;
1458 case 5:
1459 dma2mask = 3;
1460 break;
1461 default:
1462 snd_printk(KERN_ERR "invalid dma2 %d\n", chip->dma2);
1463 return -ENODEV;
1464 }
1465
1466
1467 snd_es18xx_write(chip, 0xB1, 0x50 | (irqmask << 2));
1468
1469 snd_es18xx_write(chip, 0xB2, 0x50 | (dma1mask << 2));
1470
1471 snd_es18xx_mixer_bits(chip, 0x7d, 0x07, 0x04 | dma2mask);
1472
1473
1474 snd_es18xx_mixer_write(chip, 0x7A, 0x68);
1475
1476 snd_es18xx_mixer_write(chip, 0x64, 0x06);
1477 if (mpu_port > 0 && mpu_port != SNDRV_AUTO_PORT) {
1478
1479
1480
1481 snd_es18xx_mixer_write(chip, 0x40,
1482 0x43 | (mpu_port & 0xf0) >> 1);
1483 }
1484 snd_es18xx_mixer_write(chip, 0x7f, ((irqmask + 1) << 1) | 0x01);
1485 }
1486 if (chip->caps & ES18XX_NEW_RATE) {
1487
1488
1489
1490 snd_es18xx_mixer_write(chip, 0x71, 0x32);
1491 }
1492 if (!(chip->caps & ES18XX_PCM2)) {
1493
1494 snd_es18xx_write(chip, 0xB7, 0x80);
1495 }
1496 if (chip->caps & ES18XX_SPATIALIZER) {
1497
1498 snd_es18xx_mixer_write(chip, 0x54, 0x8f);
1499 snd_es18xx_mixer_write(chip, 0x56, 0x95);
1500 snd_es18xx_mixer_write(chip, 0x58, 0x94);
1501 snd_es18xx_mixer_write(chip, 0x5a, 0x80);
1502 }
1503
1504 switch (chip->version) {
1505 case 0x1879:
1506
1507
1508
1509
1510 case 0x1878:
1511 snd_es18xx_config_write(chip, 0x29, snd_es18xx_config_read(chip, 0x29) | 0x40);
1512 break;
1513 }
1514
1515 if (chip->caps & ES18XX_MUTEREC)
1516 mask = 0x10;
1517 if (chip->caps & ES18XX_RECMIX)
1518 snd_es18xx_mixer_write(chip, 0x1c, 0x05 | mask);
1519 else {
1520 snd_es18xx_mixer_write(chip, 0x1c, 0x00 | mask);
1521 snd_es18xx_write(chip, 0xb4, 0x00);
1522 }
1523 #ifndef AVOID_POPS
1524
1525 snd_es18xx_dsp_command(chip, 0xD1);
1526 #endif
1527
1528 return 0;
1529 }
1530
1531 static int snd_es18xx_identify(struct snd_card *card, struct snd_es18xx *chip)
1532 {
1533 int hi,lo;
1534
1535
1536 if (snd_es18xx_reset(chip) < 0) {
1537 snd_printk(KERN_ERR "reset at 0x%lx failed!!!\n", chip->port);
1538 return -ENODEV;
1539 }
1540
1541 snd_es18xx_dsp_command(chip, 0xe7);
1542 hi = snd_es18xx_dsp_get_byte(chip);
1543 if (hi < 0) {
1544 return hi;
1545 }
1546 lo = snd_es18xx_dsp_get_byte(chip);
1547 if ((lo & 0xf0) != 0x80) {
1548 return -ENODEV;
1549 }
1550 if (hi == 0x48) {
1551 chip->version = 0x488;
1552 return 0;
1553 }
1554 if (hi != 0x68) {
1555 return -ENODEV;
1556 }
1557 if ((lo & 0x0f) < 8) {
1558 chip->version = 0x688;
1559 return 0;
1560 }
1561
1562 outb(0x40, chip->port + 0x04);
1563 udelay(10);
1564 hi = inb(chip->port + 0x05);
1565 udelay(10);
1566 lo = inb(chip->port + 0x05);
1567 if (hi != lo) {
1568 chip->version = hi << 8 | lo;
1569 chip->ctrl_port = inb(chip->port + 0x05) << 8;
1570 udelay(10);
1571 chip->ctrl_port += inb(chip->port + 0x05);
1572
1573 if (!devm_request_region(card->dev, chip->ctrl_port, 8,
1574 "ES18xx - CTRL")) {
1575 snd_printk(KERN_ERR PFX "unable go grab port 0x%lx\n", chip->ctrl_port);
1576 return -EBUSY;
1577 }
1578
1579 return 0;
1580 }
1581
1582
1583 if (snd_es18xx_mixer_writable(chip, 0x64, 0x04)) {
1584
1585 if (snd_es18xx_mixer_writable(chip, 0x70, 0x7f)) {
1586
1587 if (snd_es18xx_mixer_writable(chip, 0x64, 0x20)) {
1588 chip->version = 0x1887;
1589 } else {
1590 chip->version = 0x1888;
1591 }
1592 } else {
1593 chip->version = 0x1788;
1594 }
1595 }
1596 else
1597 chip->version = 0x1688;
1598 return 0;
1599 }
1600
1601 static int snd_es18xx_probe(struct snd_card *card,
1602 struct snd_es18xx *chip,
1603 unsigned long mpu_port,
1604 unsigned long fm_port)
1605 {
1606 if (snd_es18xx_identify(card, chip) < 0) {
1607 snd_printk(KERN_ERR PFX "[0x%lx] ESS chip not found\n", chip->port);
1608 return -ENODEV;
1609 }
1610
1611 switch (chip->version) {
1612 case 0x1868:
1613 chip->caps = ES18XX_DUPLEX_MONO | ES18XX_DUPLEX_SAME | ES18XX_CONTROL | ES18XX_GPO_2BIT;
1614 break;
1615 case 0x1869:
1616 chip->caps = ES18XX_PCM2 | ES18XX_SPATIALIZER | ES18XX_RECMIX | ES18XX_NEW_RATE | ES18XX_AUXB | ES18XX_MONO | ES18XX_MUTEREC | ES18XX_CONTROL | ES18XX_HWV | ES18XX_GPO_2BIT;
1617 break;
1618 case 0x1878:
1619 chip->caps = ES18XX_DUPLEX_MONO | ES18XX_DUPLEX_SAME | ES18XX_I2S | ES18XX_CONTROL;
1620 break;
1621 case 0x1879:
1622 chip->caps = ES18XX_PCM2 | ES18XX_SPATIALIZER | ES18XX_RECMIX | ES18XX_NEW_RATE | ES18XX_AUXB | ES18XX_I2S | ES18XX_CONTROL | ES18XX_HWV;
1623 break;
1624 case 0x1887:
1625 case 0x1888:
1626 chip->caps = ES18XX_PCM2 | ES18XX_RECMIX | ES18XX_AUXB | ES18XX_DUPLEX_SAME | ES18XX_GPO_2BIT;
1627 break;
1628 default:
1629 snd_printk(KERN_ERR "[0x%lx] unsupported chip ES%x\n",
1630 chip->port, chip->version);
1631 return -ENODEV;
1632 }
1633
1634 snd_printd("[0x%lx] ESS%x chip found\n", chip->port, chip->version);
1635
1636 if (chip->dma1 == chip->dma2)
1637 chip->caps &= ~(ES18XX_PCM2 | ES18XX_DUPLEX_SAME);
1638
1639 return snd_es18xx_initialize(chip, mpu_port, fm_port);
1640 }
1641
1642 static const struct snd_pcm_ops snd_es18xx_playback_ops = {
1643 .open = snd_es18xx_playback_open,
1644 .close = snd_es18xx_playback_close,
1645 .hw_params = snd_es18xx_playback_hw_params,
1646 .prepare = snd_es18xx_playback_prepare,
1647 .trigger = snd_es18xx_playback_trigger,
1648 .pointer = snd_es18xx_playback_pointer,
1649 };
1650
1651 static const struct snd_pcm_ops snd_es18xx_capture_ops = {
1652 .open = snd_es18xx_capture_open,
1653 .close = snd_es18xx_capture_close,
1654 .hw_params = snd_es18xx_capture_hw_params,
1655 .prepare = snd_es18xx_capture_prepare,
1656 .trigger = snd_es18xx_capture_trigger,
1657 .pointer = snd_es18xx_capture_pointer,
1658 };
1659
1660 static int snd_es18xx_pcm(struct snd_card *card, int device)
1661 {
1662 struct snd_es18xx *chip = card->private_data;
1663 struct snd_pcm *pcm;
1664 char str[16];
1665 int err;
1666
1667 sprintf(str, "ES%x", chip->version);
1668 if (chip->caps & ES18XX_PCM2)
1669 err = snd_pcm_new(card, str, device, 2, 1, &pcm);
1670 else
1671 err = snd_pcm_new(card, str, device, 1, 1, &pcm);
1672 if (err < 0)
1673 return err;
1674
1675 snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &snd_es18xx_playback_ops);
1676 snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &snd_es18xx_capture_ops);
1677
1678
1679 pcm->private_data = chip;
1680 pcm->info_flags = 0;
1681 if (chip->caps & ES18XX_DUPLEX_SAME)
1682 pcm->info_flags |= SNDRV_PCM_INFO_JOINT_DUPLEX;
1683 if (! (chip->caps & ES18XX_PCM2))
1684 pcm->info_flags |= SNDRV_PCM_INFO_HALF_DUPLEX;
1685 sprintf(pcm->name, "ESS AudioDrive ES%x", chip->version);
1686 chip->pcm = pcm;
1687
1688 snd_pcm_set_managed_buffer_all(pcm, SNDRV_DMA_TYPE_DEV, card->dev,
1689 64*1024,
1690 chip->dma1 > 3 || chip->dma2 > 3 ? 128*1024 : 64*1024);
1691 return 0;
1692 }
1693
1694
1695 #ifdef CONFIG_PM
1696 static int snd_es18xx_suspend(struct snd_card *card, pm_message_t state)
1697 {
1698 struct snd_es18xx *chip = card->private_data;
1699
1700 snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
1701
1702
1703 chip->pm_reg = (unsigned char)snd_es18xx_read(chip, ES18XX_PM);
1704 chip->pm_reg |= (ES18XX_PM_FM | ES18XX_PM_SUS);
1705 snd_es18xx_write(chip, ES18XX_PM, chip->pm_reg);
1706 snd_es18xx_write(chip, ES18XX_PM, chip->pm_reg ^= ES18XX_PM_SUS);
1707
1708 return 0;
1709 }
1710
1711 static int snd_es18xx_resume(struct snd_card *card)
1712 {
1713 struct snd_es18xx *chip = card->private_data;
1714
1715
1716 snd_es18xx_write(chip, ES18XX_PM, chip->pm_reg ^= ES18XX_PM_FM);
1717
1718 snd_power_change_state(card, SNDRV_CTL_POWER_D0);
1719 return 0;
1720 }
1721 #endif
1722
1723 static int snd_es18xx_new_device(struct snd_card *card,
1724 unsigned long port,
1725 unsigned long mpu_port,
1726 unsigned long fm_port,
1727 int irq, int dma1, int dma2)
1728 {
1729 struct snd_es18xx *chip = card->private_data;
1730
1731 spin_lock_init(&chip->reg_lock);
1732 spin_lock_init(&chip->mixer_lock);
1733 chip->port = port;
1734 chip->irq = -1;
1735 chip->dma1 = -1;
1736 chip->dma2 = -1;
1737 chip->audio2_vol = 0x00;
1738 chip->active = 0;
1739
1740 if (!devm_request_region(card->dev, port, 16, "ES18xx")) {
1741 snd_printk(KERN_ERR PFX "unable to grap ports 0x%lx-0x%lx\n", port, port + 16 - 1);
1742 return -EBUSY;
1743 }
1744
1745 if (devm_request_irq(card->dev, irq, snd_es18xx_interrupt, 0, "ES18xx",
1746 (void *) card)) {
1747 snd_printk(KERN_ERR PFX "unable to grap IRQ %d\n", irq);
1748 return -EBUSY;
1749 }
1750 chip->irq = irq;
1751 card->sync_irq = chip->irq;
1752
1753 if (snd_devm_request_dma(card->dev, dma1, "ES18xx DMA 1")) {
1754 snd_printk(KERN_ERR PFX "unable to grap DMA1 %d\n", dma1);
1755 return -EBUSY;
1756 }
1757 chip->dma1 = dma1;
1758
1759 if (dma2 != dma1 &&
1760 snd_devm_request_dma(card->dev, dma2, "ES18xx DMA 2")) {
1761 snd_printk(KERN_ERR PFX "unable to grap DMA2 %d\n", dma2);
1762 return -EBUSY;
1763 }
1764 chip->dma2 = dma2;
1765
1766 if (snd_es18xx_probe(card, chip, mpu_port, fm_port) < 0)
1767 return -ENODEV;
1768 return 0;
1769 }
1770
1771 static int snd_es18xx_mixer(struct snd_card *card)
1772 {
1773 struct snd_es18xx *chip = card->private_data;
1774 int err;
1775 unsigned int idx;
1776
1777 strcpy(card->mixername, chip->pcm->name);
1778
1779 for (idx = 0; idx < ARRAY_SIZE(snd_es18xx_base_controls); idx++) {
1780 struct snd_kcontrol *kctl;
1781 kctl = snd_ctl_new1(&snd_es18xx_base_controls[idx], chip);
1782 if (chip->caps & ES18XX_HWV) {
1783 switch (idx) {
1784 case 0:
1785 chip->master_volume = kctl;
1786 kctl->private_free = snd_es18xx_hwv_free;
1787 break;
1788 case 1:
1789 chip->master_switch = kctl;
1790 kctl->private_free = snd_es18xx_hwv_free;
1791 break;
1792 }
1793 }
1794 err = snd_ctl_add(card, kctl);
1795 if (err < 0)
1796 return err;
1797 }
1798 if (chip->caps & ES18XX_PCM2) {
1799 for (idx = 0; idx < ARRAY_SIZE(snd_es18xx_pcm2_controls); idx++) {
1800 err = snd_ctl_add(card, snd_ctl_new1(&snd_es18xx_pcm2_controls[idx], chip));
1801 if (err < 0)
1802 return err;
1803 }
1804 } else {
1805 for (idx = 0; idx < ARRAY_SIZE(snd_es18xx_pcm1_controls); idx++) {
1806 err = snd_ctl_add(card, snd_ctl_new1(&snd_es18xx_pcm1_controls[idx], chip));
1807 if (err < 0)
1808 return err;
1809 }
1810 }
1811
1812 if (chip->caps & ES18XX_RECMIX) {
1813 for (idx = 0; idx < ARRAY_SIZE(snd_es18xx_recmix_controls); idx++) {
1814 err = snd_ctl_add(card, snd_ctl_new1(&snd_es18xx_recmix_controls[idx], chip));
1815 if (err < 0)
1816 return err;
1817 }
1818 }
1819 switch (chip->version) {
1820 default:
1821 err = snd_ctl_add(card, snd_ctl_new1(&snd_es18xx_micpre1_control, chip));
1822 if (err < 0)
1823 return err;
1824 break;
1825 case 0x1869:
1826 case 0x1879:
1827 err = snd_ctl_add(card, snd_ctl_new1(&snd_es18xx_micpre2_control, chip));
1828 if (err < 0)
1829 return err;
1830 break;
1831 }
1832 if (chip->caps & ES18XX_SPATIALIZER) {
1833 for (idx = 0; idx < ARRAY_SIZE(snd_es18xx_spatializer_controls); idx++) {
1834 err = snd_ctl_add(card, snd_ctl_new1(&snd_es18xx_spatializer_controls[idx], chip));
1835 if (err < 0)
1836 return err;
1837 }
1838 }
1839 if (chip->caps & ES18XX_HWV) {
1840 for (idx = 0; idx < ARRAY_SIZE(snd_es18xx_hw_volume_controls); idx++) {
1841 struct snd_kcontrol *kctl;
1842 kctl = snd_ctl_new1(&snd_es18xx_hw_volume_controls[idx], chip);
1843 if (idx == 0)
1844 chip->hw_volume = kctl;
1845 else
1846 chip->hw_switch = kctl;
1847 kctl->private_free = snd_es18xx_hwv_free;
1848 err = snd_ctl_add(card, kctl);
1849 if (err < 0)
1850 return err;
1851
1852 }
1853 }
1854
1855
1856 if (chip->version != 0x1868) {
1857 err = snd_ctl_add(card, snd_ctl_new1(&snd_es18xx_opt_speaker,
1858 chip));
1859 if (err < 0)
1860 return err;
1861 }
1862 if (chip->version == 0x1869) {
1863 for (idx = 0; idx < ARRAY_SIZE(snd_es18xx_opt_1869); idx++) {
1864 err = snd_ctl_add(card,
1865 snd_ctl_new1(&snd_es18xx_opt_1869[idx],
1866 chip));
1867 if (err < 0)
1868 return err;
1869 }
1870 } else if (chip->version == 0x1878) {
1871 err = snd_ctl_add(card, snd_ctl_new1(&snd_es18xx_opt_1878,
1872 chip));
1873 if (err < 0)
1874 return err;
1875 } else if (chip->version == 0x1879) {
1876 for (idx = 0; idx < ARRAY_SIZE(snd_es18xx_opt_1879); idx++) {
1877 err = snd_ctl_add(card,
1878 snd_ctl_new1(&snd_es18xx_opt_1879[idx],
1879 chip));
1880 if (err < 0)
1881 return err;
1882 }
1883 }
1884 if (chip->caps & ES18XX_GPO_2BIT) {
1885 for (idx = 0; idx < ARRAY_SIZE(snd_es18xx_opt_gpo_2bit); idx++) {
1886 err = snd_ctl_add(card,
1887 snd_ctl_new1(&snd_es18xx_opt_gpo_2bit[idx],
1888 chip));
1889 if (err < 0)
1890 return err;
1891 }
1892 }
1893 return 0;
1894 }
1895
1896
1897
1898
1899 MODULE_AUTHOR("Christian Fischbach <fishbach@pool.informatik.rwth-aachen.de>, Abramo Bagnara <abramo@alsa-project.org>");
1900 MODULE_DESCRIPTION("ESS ES18xx AudioDrive");
1901 MODULE_LICENSE("GPL");
1902
1903 static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX;
1904 static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR;
1905 static bool enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_ISAPNP;
1906 #ifdef CONFIG_PNP
1907 static bool isapnp[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_ISAPNP;
1908 #endif
1909 static long port[SNDRV_CARDS] = SNDRV_DEFAULT_PORT;
1910 #ifndef CONFIG_PNP
1911 static long mpu_port[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = -1};
1912 #else
1913 static long mpu_port[SNDRV_CARDS] = SNDRV_DEFAULT_PORT;
1914 #endif
1915 static long fm_port[SNDRV_CARDS] = SNDRV_DEFAULT_PORT;
1916 static int irq[SNDRV_CARDS] = SNDRV_DEFAULT_IRQ;
1917 static int dma1[SNDRV_CARDS] = SNDRV_DEFAULT_DMA;
1918 static int dma2[SNDRV_CARDS] = SNDRV_DEFAULT_DMA;
1919
1920 module_param_array(index, int, NULL, 0444);
1921 MODULE_PARM_DESC(index, "Index value for ES18xx soundcard.");
1922 module_param_array(id, charp, NULL, 0444);
1923 MODULE_PARM_DESC(id, "ID string for ES18xx soundcard.");
1924 module_param_array(enable, bool, NULL, 0444);
1925 MODULE_PARM_DESC(enable, "Enable ES18xx soundcard.");
1926 #ifdef CONFIG_PNP
1927 module_param_array(isapnp, bool, NULL, 0444);
1928 MODULE_PARM_DESC(isapnp, "PnP detection for specified soundcard.");
1929 #endif
1930 module_param_hw_array(port, long, ioport, NULL, 0444);
1931 MODULE_PARM_DESC(port, "Port # for ES18xx driver.");
1932 module_param_hw_array(mpu_port, long, ioport, NULL, 0444);
1933 MODULE_PARM_DESC(mpu_port, "MPU-401 port # for ES18xx driver.");
1934 module_param_hw_array(fm_port, long, ioport, NULL, 0444);
1935 MODULE_PARM_DESC(fm_port, "FM port # for ES18xx driver.");
1936 module_param_hw_array(irq, int, irq, NULL, 0444);
1937 MODULE_PARM_DESC(irq, "IRQ # for ES18xx driver.");
1938 module_param_hw_array(dma1, int, dma, NULL, 0444);
1939 MODULE_PARM_DESC(dma1, "DMA 1 # for ES18xx driver.");
1940 module_param_hw_array(dma2, int, dma, NULL, 0444);
1941 MODULE_PARM_DESC(dma2, "DMA 2 # for ES18xx driver.");
1942
1943 #ifdef CONFIG_PNP
1944 static int isa_registered;
1945 static int pnp_registered;
1946 static int pnpc_registered;
1947
1948 static const struct pnp_device_id snd_audiodrive_pnpbiosids[] = {
1949 { .id = "ESS1869" },
1950 { .id = "ESS1879" },
1951 { .id = "" }
1952 };
1953
1954 MODULE_DEVICE_TABLE(pnp, snd_audiodrive_pnpbiosids);
1955
1956
1957 static int snd_audiodrive_pnp_init_main(int dev, struct pnp_dev *pdev)
1958 {
1959 if (pnp_activate_dev(pdev) < 0) {
1960 snd_printk(KERN_ERR PFX "PnP configure failure (out of resources?)\n");
1961 return -EBUSY;
1962 }
1963
1964
1965 if (pnp_device_is_isapnp(pdev)) {
1966 isapnp_cfg_begin(isapnp_card_number(pdev), isapnp_csn_number(pdev));
1967 isapnp_write_byte(0x27, pnp_irq(pdev, 0));
1968 if (mpu_port[dev] != SNDRV_AUTO_PORT)
1969 isapnp_write_byte(0x28, pnp_irq(pdev, 0));
1970 isapnp_write_byte(0x72, pnp_irq(pdev, 0));
1971 isapnp_cfg_end();
1972 }
1973 port[dev] = pnp_port_start(pdev, 0);
1974 fm_port[dev] = pnp_port_start(pdev, 1);
1975 mpu_port[dev] = pnp_port_start(pdev, 2);
1976 dma1[dev] = pnp_dma(pdev, 0);
1977 dma2[dev] = pnp_dma(pdev, 1);
1978 irq[dev] = pnp_irq(pdev, 0);
1979 snd_printdd("PnP ES18xx: port=0x%lx, fm port=0x%lx, mpu port=0x%lx\n", port[dev], fm_port[dev], mpu_port[dev]);
1980 snd_printdd("PnP ES18xx: dma1=%i, dma2=%i, irq=%i\n", dma1[dev], dma2[dev], irq[dev]);
1981 return 0;
1982 }
1983
1984 static int snd_audiodrive_pnp(int dev, struct snd_es18xx *chip,
1985 struct pnp_dev *pdev)
1986 {
1987 chip->dev = pdev;
1988 if (snd_audiodrive_pnp_init_main(dev, chip->dev) < 0)
1989 return -EBUSY;
1990 return 0;
1991 }
1992
1993 static const struct pnp_card_device_id snd_audiodrive_pnpids[] = {
1994
1995 { .id = "ESS1868", .devs = { { "ESS1868" }, { "ESS0000" } } },
1996
1997 { .id = "ESS1868", .devs = { { "ESS8601" }, { "ESS8600" } } },
1998
1999 { .id = "ESS1868", .devs = { { "ESS8611" }, { "ESS8610" } } },
2000
2001 { .id = "ESS0003", .devs = { { "ESS1869" }, { "ESS0006" } } },
2002
2003 { .id = "ESS1869", .devs = { { "ESS1869" }, { "ESS0006" } } },
2004
2005 { .id = "ESS1878", .devs = { { "ESS1878" }, { "ESS0004" } } },
2006
2007 { .id = "ESS1879", .devs = { { "ESS1879" }, { "ESS0009" } } },
2008
2009 { .id = "" }
2010 };
2011
2012 MODULE_DEVICE_TABLE(pnp_card, snd_audiodrive_pnpids);
2013
2014 static int snd_audiodrive_pnpc(int dev, struct snd_es18xx *chip,
2015 struct pnp_card_link *card,
2016 const struct pnp_card_device_id *id)
2017 {
2018 chip->dev = pnp_request_card_device(card, id->devs[0].id, NULL);
2019 if (chip->dev == NULL)
2020 return -EBUSY;
2021
2022 chip->devc = pnp_request_card_device(card, id->devs[1].id, NULL);
2023 if (chip->devc == NULL)
2024 return -EBUSY;
2025
2026
2027 if (pnp_activate_dev(chip->devc) < 0) {
2028 snd_printk(KERN_ERR PFX "PnP control configure failure (out of resources?)\n");
2029 return -EAGAIN;
2030 }
2031 snd_printdd("pnp: port=0x%llx\n",
2032 (unsigned long long)pnp_port_start(chip->devc, 0));
2033 if (snd_audiodrive_pnp_init_main(dev, chip->dev) < 0)
2034 return -EBUSY;
2035
2036 return 0;
2037 }
2038 #endif
2039
2040 #ifdef CONFIG_PNP
2041 #define is_isapnp_selected(dev) isapnp[dev]
2042 #else
2043 #define is_isapnp_selected(dev) 0
2044 #endif
2045
2046 static int snd_es18xx_card_new(struct device *pdev, int dev,
2047 struct snd_card **cardp)
2048 {
2049 return snd_devm_card_new(pdev, index[dev], id[dev], THIS_MODULE,
2050 sizeof(struct snd_es18xx), cardp);
2051 }
2052
2053 static int snd_audiodrive_probe(struct snd_card *card, int dev)
2054 {
2055 struct snd_es18xx *chip = card->private_data;
2056 struct snd_opl3 *opl3;
2057 int err;
2058
2059 err = snd_es18xx_new_device(card,
2060 port[dev], mpu_port[dev], fm_port[dev],
2061 irq[dev], dma1[dev], dma2[dev]);
2062 if (err < 0)
2063 return err;
2064
2065 sprintf(card->driver, "ES%x", chip->version);
2066
2067 sprintf(card->shortname, "ESS AudioDrive ES%x", chip->version);
2068 if (dma1[dev] != dma2[dev])
2069 sprintf(card->longname, "%s at 0x%lx, irq %d, dma1 %d, dma2 %d",
2070 card->shortname,
2071 chip->port,
2072 irq[dev], dma1[dev], dma2[dev]);
2073 else
2074 sprintf(card->longname, "%s at 0x%lx, irq %d, dma %d",
2075 card->shortname,
2076 chip->port,
2077 irq[dev], dma1[dev]);
2078
2079 err = snd_es18xx_pcm(card, 0);
2080 if (err < 0)
2081 return err;
2082
2083 err = snd_es18xx_mixer(card);
2084 if (err < 0)
2085 return err;
2086
2087 if (fm_port[dev] > 0 && fm_port[dev] != SNDRV_AUTO_PORT) {
2088 if (snd_opl3_create(card, fm_port[dev], fm_port[dev] + 2,
2089 OPL3_HW_OPL3, 0, &opl3) < 0) {
2090 snd_printk(KERN_WARNING PFX
2091 "opl3 not detected at 0x%lx\n",
2092 fm_port[dev]);
2093 } else {
2094 err = snd_opl3_hwdep_new(opl3, 0, 1, NULL);
2095 if (err < 0)
2096 return err;
2097 }
2098 }
2099
2100 if (mpu_port[dev] > 0 && mpu_port[dev] != SNDRV_AUTO_PORT) {
2101 err = snd_mpu401_uart_new(card, 0, MPU401_HW_ES18XX,
2102 mpu_port[dev], MPU401_INFO_IRQ_HOOK,
2103 -1, &chip->rmidi);
2104 if (err < 0)
2105 return err;
2106 }
2107
2108 return snd_card_register(card);
2109 }
2110
2111 static int snd_es18xx_isa_match(struct device *pdev, unsigned int dev)
2112 {
2113 return enable[dev] && !is_isapnp_selected(dev);
2114 }
2115
2116 static int snd_es18xx_isa_probe1(int dev, struct device *devptr)
2117 {
2118 struct snd_card *card;
2119 int err;
2120
2121 err = snd_es18xx_card_new(devptr, dev, &card);
2122 if (err < 0)
2123 return err;
2124 err = snd_audiodrive_probe(card, dev);
2125 if (err < 0)
2126 return err;
2127 dev_set_drvdata(devptr, card);
2128 return 0;
2129 }
2130
2131 static int snd_es18xx_isa_probe(struct device *pdev, unsigned int dev)
2132 {
2133 int err;
2134 static const int possible_irqs[] = {5, 9, 10, 7, 11, 12, -1};
2135 static const int possible_dmas[] = {1, 0, 3, 5, -1};
2136
2137 if (irq[dev] == SNDRV_AUTO_IRQ) {
2138 irq[dev] = snd_legacy_find_free_irq(possible_irqs);
2139 if (irq[dev] < 0) {
2140 snd_printk(KERN_ERR PFX "unable to find a free IRQ\n");
2141 return -EBUSY;
2142 }
2143 }
2144 if (dma1[dev] == SNDRV_AUTO_DMA) {
2145 dma1[dev] = snd_legacy_find_free_dma(possible_dmas);
2146 if (dma1[dev] < 0) {
2147 snd_printk(KERN_ERR PFX "unable to find a free DMA1\n");
2148 return -EBUSY;
2149 }
2150 }
2151 if (dma2[dev] == SNDRV_AUTO_DMA) {
2152 dma2[dev] = snd_legacy_find_free_dma(possible_dmas);
2153 if (dma2[dev] < 0) {
2154 snd_printk(KERN_ERR PFX "unable to find a free DMA2\n");
2155 return -EBUSY;
2156 }
2157 }
2158
2159 if (port[dev] != SNDRV_AUTO_PORT) {
2160 return snd_es18xx_isa_probe1(dev, pdev);
2161 } else {
2162 static const unsigned long possible_ports[] = {0x220, 0x240, 0x260, 0x280};
2163 int i;
2164 for (i = 0; i < ARRAY_SIZE(possible_ports); i++) {
2165 port[dev] = possible_ports[i];
2166 err = snd_es18xx_isa_probe1(dev, pdev);
2167 if (! err)
2168 return 0;
2169 }
2170 return err;
2171 }
2172 }
2173
2174 #ifdef CONFIG_PM
2175 static int snd_es18xx_isa_suspend(struct device *dev, unsigned int n,
2176 pm_message_t state)
2177 {
2178 return snd_es18xx_suspend(dev_get_drvdata(dev), state);
2179 }
2180
2181 static int snd_es18xx_isa_resume(struct device *dev, unsigned int n)
2182 {
2183 return snd_es18xx_resume(dev_get_drvdata(dev));
2184 }
2185 #endif
2186
2187 #define DEV_NAME "es18xx"
2188
2189 static struct isa_driver snd_es18xx_isa_driver = {
2190 .match = snd_es18xx_isa_match,
2191 .probe = snd_es18xx_isa_probe,
2192 #ifdef CONFIG_PM
2193 .suspend = snd_es18xx_isa_suspend,
2194 .resume = snd_es18xx_isa_resume,
2195 #endif
2196 .driver = {
2197 .name = DEV_NAME
2198 },
2199 };
2200
2201
2202 #ifdef CONFIG_PNP
2203 static int snd_audiodrive_pnp_detect(struct pnp_dev *pdev,
2204 const struct pnp_device_id *id)
2205 {
2206 static int dev;
2207 int err;
2208 struct snd_card *card;
2209
2210 if (pnp_device_is_isapnp(pdev))
2211 return -ENOENT;
2212 for (; dev < SNDRV_CARDS; dev++) {
2213 if (enable[dev] && isapnp[dev])
2214 break;
2215 }
2216 if (dev >= SNDRV_CARDS)
2217 return -ENODEV;
2218
2219 err = snd_es18xx_card_new(&pdev->dev, dev, &card);
2220 if (err < 0)
2221 return err;
2222 err = snd_audiodrive_pnp(dev, card->private_data, pdev);
2223 if (err < 0)
2224 return err;
2225 err = snd_audiodrive_probe(card, dev);
2226 if (err < 0)
2227 return err;
2228 pnp_set_drvdata(pdev, card);
2229 dev++;
2230 return 0;
2231 }
2232
2233 #ifdef CONFIG_PM
2234 static int snd_audiodrive_pnp_suspend(struct pnp_dev *pdev, pm_message_t state)
2235 {
2236 return snd_es18xx_suspend(pnp_get_drvdata(pdev), state);
2237 }
2238 static int snd_audiodrive_pnp_resume(struct pnp_dev *pdev)
2239 {
2240 return snd_es18xx_resume(pnp_get_drvdata(pdev));
2241 }
2242 #endif
2243
2244 static struct pnp_driver es18xx_pnp_driver = {
2245 .name = "es18xx-pnpbios",
2246 .id_table = snd_audiodrive_pnpbiosids,
2247 .probe = snd_audiodrive_pnp_detect,
2248 #ifdef CONFIG_PM
2249 .suspend = snd_audiodrive_pnp_suspend,
2250 .resume = snd_audiodrive_pnp_resume,
2251 #endif
2252 };
2253
2254 static int snd_audiodrive_pnpc_detect(struct pnp_card_link *pcard,
2255 const struct pnp_card_device_id *pid)
2256 {
2257 static int dev;
2258 struct snd_card *card;
2259 int res;
2260
2261 for ( ; dev < SNDRV_CARDS; dev++) {
2262 if (enable[dev] && isapnp[dev])
2263 break;
2264 }
2265 if (dev >= SNDRV_CARDS)
2266 return -ENODEV;
2267
2268 res = snd_es18xx_card_new(&pcard->card->dev, dev, &card);
2269 if (res < 0)
2270 return res;
2271
2272 res = snd_audiodrive_pnpc(dev, card->private_data, pcard, pid);
2273 if (res < 0)
2274 return res;
2275 res = snd_audiodrive_probe(card, dev);
2276 if (res < 0)
2277 return res;
2278
2279 pnp_set_card_drvdata(pcard, card);
2280 dev++;
2281 return 0;
2282 }
2283
2284 #ifdef CONFIG_PM
2285 static int snd_audiodrive_pnpc_suspend(struct pnp_card_link *pcard, pm_message_t state)
2286 {
2287 return snd_es18xx_suspend(pnp_get_card_drvdata(pcard), state);
2288 }
2289
2290 static int snd_audiodrive_pnpc_resume(struct pnp_card_link *pcard)
2291 {
2292 return snd_es18xx_resume(pnp_get_card_drvdata(pcard));
2293 }
2294
2295 #endif
2296
2297 static struct pnp_card_driver es18xx_pnpc_driver = {
2298 .flags = PNP_DRIVER_RES_DISABLE,
2299 .name = "es18xx",
2300 .id_table = snd_audiodrive_pnpids,
2301 .probe = snd_audiodrive_pnpc_detect,
2302 #ifdef CONFIG_PM
2303 .suspend = snd_audiodrive_pnpc_suspend,
2304 .resume = snd_audiodrive_pnpc_resume,
2305 #endif
2306 };
2307 #endif
2308
2309 static int __init alsa_card_es18xx_init(void)
2310 {
2311 int err;
2312
2313 err = isa_register_driver(&snd_es18xx_isa_driver, SNDRV_CARDS);
2314 #ifdef CONFIG_PNP
2315 if (!err)
2316 isa_registered = 1;
2317
2318 err = pnp_register_driver(&es18xx_pnp_driver);
2319 if (!err)
2320 pnp_registered = 1;
2321
2322 err = pnp_register_card_driver(&es18xx_pnpc_driver);
2323 if (!err)
2324 pnpc_registered = 1;
2325
2326 if (isa_registered || pnp_registered)
2327 err = 0;
2328 #endif
2329 return err;
2330 }
2331
2332 static void __exit alsa_card_es18xx_exit(void)
2333 {
2334 #ifdef CONFIG_PNP
2335 if (pnpc_registered)
2336 pnp_unregister_card_driver(&es18xx_pnpc_driver);
2337 if (pnp_registered)
2338 pnp_unregister_driver(&es18xx_pnp_driver);
2339 if (isa_registered)
2340 #endif
2341 isa_unregister_driver(&snd_es18xx_isa_driver);
2342 }
2343
2344 module_init(alsa_card_es18xx_init)
2345 module_exit(alsa_card_es18xx_exit)