1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * Driver for ESS Solo-1 (ES1938, ES1946, ES1969) soundcard
10 * Rewritten from sonicvibes.c source.
13 * Rewrite better spinlocks
18 - Capture data is written unaligned starting from dma_base + 1 so I need to
19 disable mmap and to add a copy callback.
20 - After several cycle of the following:
21 while : ; do arecord -d1 -f cd -t raw | aplay -f cd ; done
22 a "playback write error (DMA or IRQ trouble?)" may happen.
23 This is due to playback interrupts not generated.
24 I suspect a timing issue.
25 - Sometimes the interrupt handler is invoked wrongly during playback.
26 This generates some harmless "Unexpected hw_pointer: wrong interrupt
28 I've seen that using small period sizes.
35 #include <linux/init.h>
36 #include <linux/interrupt.h>
37 #include <linux/pci.h>
38 #include <linux/slab.h>
39 #include <linux/gameport.h>
40 #include <linux/module.h>
41 #include <linux/delay.h>
42 #include <linux/dma-mapping.h>
44 #include <sound/core.h>
45 #include <sound/control.h>
46 #include <sound/pcm.h>
47 #include <sound/opl3.h>
48 #include <sound/mpu401.h>
49 #include <sound/initval.h>
50 #include <sound/tlv.h>
53 MODULE_DESCRIPTION("ESS Solo-1");
54 MODULE_LICENSE("GPL");
56 #if IS_REACHABLE(CONFIG_GAMEPORT)
57 #define SUPPORT_JOYSTICK 1
60 static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX; /* Index 0-MAX */
61 static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR; /* ID for this card */
62 static bool enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP; /* Enable this card */
64 module_param_array(index, int, NULL, 0444);
65 MODULE_PARM_DESC(index, "Index value for ESS Solo-1 soundcard.");
66 module_param_array(id, charp, NULL, 0444);
67 MODULE_PARM_DESC(id, "ID string for ESS Solo-1 soundcard.");
68 module_param_array(enable, bool, NULL, 0444);
69 MODULE_PARM_DESC(enable, "Enable ESS Solo-1 soundcard.");
71 #define SLIO_REG(chip, x) ((chip)->io_port + ESSIO_REG_##x)
73 #define SLDM_REG(chip, x) ((chip)->ddma_port + ESSDM_REG_##x)
75 #define SLSB_REG(chip, x) ((chip)->sb_port + ESSSB_REG_##x)
77 #define SL_PCI_LEGACYCONTROL 0x40
78 #define SL_PCI_CONFIG 0x50
79 #define SL_PCI_DDMACONTROL 0x60
81 #define ESSIO_REG_AUDIO2DMAADDR 0
82 #define ESSIO_REG_AUDIO2DMACOUNT 4
83 #define ESSIO_REG_AUDIO2MODE 6
84 #define ESSIO_REG_IRQCONTROL 7
86 #define ESSDM_REG_DMAADDR 0x00
87 #define ESSDM_REG_DMACOUNT 0x04
88 #define ESSDM_REG_DMACOMMAND 0x08
89 #define ESSDM_REG_DMASTATUS 0x08
90 #define ESSDM_REG_DMAMODE 0x0b
91 #define ESSDM_REG_DMACLEAR 0x0d
92 #define ESSDM_REG_DMAMASK 0x0f
94 #define ESSSB_REG_FMLOWADDR 0x00
95 #define ESSSB_REG_FMHIGHADDR 0x02
96 #define ESSSB_REG_MIXERADDR 0x04
97 #define ESSSB_REG_MIXERDATA 0x05
99 #define ESSSB_IREG_AUDIO1 0x14
100 #define ESSSB_IREG_MICMIX 0x1a
101 #define ESSSB_IREG_RECSRC 0x1c
102 #define ESSSB_IREG_MASTER 0x32
103 #define ESSSB_IREG_FM 0x36
104 #define ESSSB_IREG_AUXACD 0x38
105 #define ESSSB_IREG_AUXB 0x3a
106 #define ESSSB_IREG_PCSPEAKER 0x3c
107 #define ESSSB_IREG_LINE 0x3e
108 #define ESSSB_IREG_SPATCONTROL 0x50
109 #define ESSSB_IREG_SPATLEVEL 0x52
110 #define ESSSB_IREG_MASTER_LEFT 0x60
111 #define ESSSB_IREG_MASTER_RIGHT 0x62
112 #define ESSSB_IREG_MPU401CONTROL 0x64
113 #define ESSSB_IREG_MICMIXRECORD 0x68
114 #define ESSSB_IREG_AUDIO2RECORD 0x69
115 #define ESSSB_IREG_AUXACDRECORD 0x6a
116 #define ESSSB_IREG_FMRECORD 0x6b
117 #define ESSSB_IREG_AUXBRECORD 0x6c
118 #define ESSSB_IREG_MONO 0x6d
119 #define ESSSB_IREG_LINERECORD 0x6e
120 #define ESSSB_IREG_MONORECORD 0x6f
121 #define ESSSB_IREG_AUDIO2SAMPLE 0x70
122 #define ESSSB_IREG_AUDIO2MODE 0x71
123 #define ESSSB_IREG_AUDIO2FILTER 0x72
124 #define ESSSB_IREG_AUDIO2TCOUNTL 0x74
125 #define ESSSB_IREG_AUDIO2TCOUNTH 0x76
126 #define ESSSB_IREG_AUDIO2CONTROL1 0x78
127 #define ESSSB_IREG_AUDIO2CONTROL2 0x7a
128 #define ESSSB_IREG_AUDIO2 0x7c
130 #define ESSSB_REG_RESET 0x06
132 #define ESSSB_REG_READDATA 0x0a
133 #define ESSSB_REG_WRITEDATA 0x0c
134 #define ESSSB_REG_READSTATUS 0x0c
136 #define ESSSB_REG_STATUS 0x0e
138 #define ESS_CMD_EXTSAMPLERATE 0xa1
139 #define ESS_CMD_FILTERDIV 0xa2
140 #define ESS_CMD_DMACNTRELOADL 0xa4
141 #define ESS_CMD_DMACNTRELOADH 0xa5
142 #define ESS_CMD_ANALOGCONTROL 0xa8
143 #define ESS_CMD_IRQCONTROL 0xb1
144 #define ESS_CMD_DRQCONTROL 0xb2
145 #define ESS_CMD_RECLEVEL 0xb4
146 #define ESS_CMD_SETFORMAT 0xb6
147 #define ESS_CMD_SETFORMAT2 0xb7
148 #define ESS_CMD_DMACONTROL 0xb8
149 #define ESS_CMD_DMATYPE 0xb9
150 #define ESS_CMD_OFFSETLEFT 0xba
151 #define ESS_CMD_OFFSETRIGHT 0xbb
152 #define ESS_CMD_READREG 0xc0
153 #define ESS_CMD_ENABLEEXT 0xc6
154 #define ESS_CMD_PAUSEDMA 0xd0
155 #define ESS_CMD_ENABLEAUDIO1 0xd1
156 #define ESS_CMD_STOPAUDIO1 0xd3
157 #define ESS_CMD_AUDIO1STATUS 0xd8
158 #define ESS_CMD_CONTDMA 0xd4
159 #define ESS_CMD_TESTIRQ 0xf2
161 #define ESS_RECSRC_MIC 0
162 #define ESS_RECSRC_AUXACD 2
163 #define ESS_RECSRC_AUXB 5
164 #define ESS_RECSRC_LINE 6
165 #define ESS_RECSRC_NONE 7
175 #define SAVED_REG_SIZE 32 /* max. number of registers to save */
180 unsigned long io_port;
181 unsigned long sb_port;
182 unsigned long vc_port;
183 unsigned long mpu_port;
184 unsigned long game_port;
185 unsigned long ddma_port;
187 unsigned char irqmask;
188 unsigned char revision;
190 struct snd_kcontrol *hw_volume;
191 struct snd_kcontrol *hw_switch;
192 struct snd_kcontrol *master_volume;
193 struct snd_kcontrol *master_switch;
196 struct snd_card *card;
198 struct snd_pcm_substream *capture_substream;
199 struct snd_pcm_substream *playback1_substream;
200 struct snd_pcm_substream *playback2_substream;
201 struct snd_rawmidi *rmidi;
203 unsigned int dma1_size;
204 unsigned int dma2_size;
205 unsigned int dma1_start;
206 unsigned int dma2_start;
207 unsigned int dma1_shift;
208 unsigned int dma2_shift;
209 unsigned int last_capture_dmaaddr;
213 spinlock_t mixer_lock;
214 struct snd_info_entry *proc_entry;
216 #ifdef SUPPORT_JOYSTICK
217 struct gameport *gameport;
219 #ifdef CONFIG_PM_SLEEP
220 unsigned char saved_regs[SAVED_REG_SIZE];
224 static irqreturn_t snd_es1938_interrupt(int irq, void *dev_id);
226 static const struct pci_device_id snd_es1938_ids[] = {
227 { PCI_VDEVICE(ESS, 0x1969), 0, }, /* Solo-1 */
231 MODULE_DEVICE_TABLE(pci, snd_es1938_ids);
233 #define RESET_LOOP_TIMEOUT 0x10000
234 #define WRITE_LOOP_TIMEOUT 0x10000
235 #define GET_LOOP_TIMEOUT 0x01000
237 /* -----------------------------------------------------------------
238 * Write to a mixer register
239 * -----------------------------------------------------------------*/
240 static void snd_es1938_mixer_write(struct es1938 *chip, unsigned char reg, unsigned char val)
243 spin_lock_irqsave(&chip->mixer_lock, flags);
244 outb(reg, SLSB_REG(chip, MIXERADDR));
245 outb(val, SLSB_REG(chip, MIXERDATA));
246 spin_unlock_irqrestore(&chip->mixer_lock, flags);
247 dev_dbg(chip->card->dev, "Mixer reg %02x set to %02x\n", reg, val);
250 /* -----------------------------------------------------------------
251 * Read from a mixer register
252 * -----------------------------------------------------------------*/
253 static int snd_es1938_mixer_read(struct es1938 *chip, unsigned char reg)
257 spin_lock_irqsave(&chip->mixer_lock, flags);
258 outb(reg, SLSB_REG(chip, MIXERADDR));
259 data = inb(SLSB_REG(chip, MIXERDATA));
260 spin_unlock_irqrestore(&chip->mixer_lock, flags);
261 dev_dbg(chip->card->dev, "Mixer reg %02x now is %02x\n", reg, data);
265 /* -----------------------------------------------------------------
266 * Write to some bits of a mixer register (return old value)
267 * -----------------------------------------------------------------*/
268 static int snd_es1938_mixer_bits(struct es1938 *chip, unsigned char reg,
269 unsigned char mask, unsigned char val)
272 unsigned char old, new, oval;
273 spin_lock_irqsave(&chip->mixer_lock, flags);
274 outb(reg, SLSB_REG(chip, MIXERADDR));
275 old = inb(SLSB_REG(chip, MIXERDATA));
278 new = (old & ~mask) | (val & mask);
279 outb(new, SLSB_REG(chip, MIXERDATA));
280 dev_dbg(chip->card->dev,
281 "Mixer reg %02x was %02x, set to %02x\n",
284 spin_unlock_irqrestore(&chip->mixer_lock, flags);
288 /* -----------------------------------------------------------------
289 * Write command to Controller Registers
290 * -----------------------------------------------------------------*/
291 static void snd_es1938_write_cmd(struct es1938 *chip, unsigned char cmd)
295 for (i = 0; i < WRITE_LOOP_TIMEOUT; i++) {
296 if (!(v = inb(SLSB_REG(chip, READSTATUS)) & 0x80)) {
297 outb(cmd, SLSB_REG(chip, WRITEDATA));
301 dev_err(chip->card->dev,
302 "snd_es1938_write_cmd timeout (0x02%x/0x02%x)\n", cmd, v);
305 /* -----------------------------------------------------------------
306 * Read the Read Data Buffer
307 * -----------------------------------------------------------------*/
308 static int snd_es1938_get_byte(struct es1938 *chip)
312 for (i = GET_LOOP_TIMEOUT; i; i--)
313 if ((v = inb(SLSB_REG(chip, STATUS))) & 0x80)
314 return inb(SLSB_REG(chip, READDATA));
315 dev_err(chip->card->dev, "get_byte timeout: status 0x02%x\n", v);
319 /* -----------------------------------------------------------------
320 * Write value cmd register
321 * -----------------------------------------------------------------*/
322 static void snd_es1938_write(struct es1938 *chip, unsigned char reg, unsigned char val)
325 spin_lock_irqsave(&chip->reg_lock, flags);
326 snd_es1938_write_cmd(chip, reg);
327 snd_es1938_write_cmd(chip, val);
328 spin_unlock_irqrestore(&chip->reg_lock, flags);
329 dev_dbg(chip->card->dev, "Reg %02x set to %02x\n", reg, val);
332 /* -----------------------------------------------------------------
333 * Read data from cmd register and return it
334 * -----------------------------------------------------------------*/
335 static unsigned char snd_es1938_read(struct es1938 *chip, unsigned char reg)
339 spin_lock_irqsave(&chip->reg_lock, flags);
340 snd_es1938_write_cmd(chip, ESS_CMD_READREG);
341 snd_es1938_write_cmd(chip, reg);
342 val = snd_es1938_get_byte(chip);
343 spin_unlock_irqrestore(&chip->reg_lock, flags);
344 dev_dbg(chip->card->dev, "Reg %02x now is %02x\n", reg, val);
348 /* -----------------------------------------------------------------
349 * Write data to cmd register and return old value
350 * -----------------------------------------------------------------*/
351 static int snd_es1938_bits(struct es1938 *chip, unsigned char reg, unsigned char mask,
355 unsigned char old, new, oval;
356 spin_lock_irqsave(&chip->reg_lock, flags);
357 snd_es1938_write_cmd(chip, ESS_CMD_READREG);
358 snd_es1938_write_cmd(chip, reg);
359 old = snd_es1938_get_byte(chip);
362 snd_es1938_write_cmd(chip, reg);
363 new = (old & ~mask) | (val & mask);
364 snd_es1938_write_cmd(chip, new);
365 dev_dbg(chip->card->dev, "Reg %02x was %02x, set to %02x\n",
368 spin_unlock_irqrestore(&chip->reg_lock, flags);
372 /* --------------------------------------------------------------------
374 * --------------------------------------------------------------------*/
375 static void snd_es1938_reset(struct es1938 *chip)
379 outb(3, SLSB_REG(chip, RESET));
380 inb(SLSB_REG(chip, RESET));
381 outb(0, SLSB_REG(chip, RESET));
382 for (i = 0; i < RESET_LOOP_TIMEOUT; i++) {
383 if (inb(SLSB_REG(chip, STATUS)) & 0x80) {
384 if (inb(SLSB_REG(chip, READDATA)) == 0xaa)
388 dev_err(chip->card->dev, "ESS Solo-1 reset failed\n");
391 snd_es1938_write_cmd(chip, ESS_CMD_ENABLEEXT);
393 /* Demand transfer DMA: 4 bytes per DMA request */
394 snd_es1938_write(chip, ESS_CMD_DMATYPE, 2);
396 /* Change behaviour of register A1
398 2nd channel DAC asynchronous */
399 snd_es1938_mixer_write(chip, ESSSB_IREG_AUDIO2MODE, 0x32);
400 /* enable/select DMA channel and IRQ channel */
401 snd_es1938_bits(chip, ESS_CMD_IRQCONTROL, 0xf0, 0x50);
402 snd_es1938_bits(chip, ESS_CMD_DRQCONTROL, 0xf0, 0x50);
403 snd_es1938_write_cmd(chip, ESS_CMD_ENABLEAUDIO1);
404 /* Set spatializer parameters to recommended values */
405 snd_es1938_mixer_write(chip, 0x54, 0x8f);
406 snd_es1938_mixer_write(chip, 0x56, 0x95);
407 snd_es1938_mixer_write(chip, 0x58, 0x94);
408 snd_es1938_mixer_write(chip, 0x5a, 0x80);
411 /* --------------------------------------------------------------------
413 * --------------------------------------------------------------------*/
414 static void snd_es1938_reset_fifo(struct es1938 *chip)
416 outb(2, SLSB_REG(chip, RESET));
417 outb(0, SLSB_REG(chip, RESET));
420 static const struct snd_ratnum clocks[2] = {
435 static const struct snd_pcm_hw_constraint_ratnums hw_constraints_clocks = {
441 static void snd_es1938_rate_set(struct es1938 *chip,
442 struct snd_pcm_substream *substream,
445 unsigned int bits, div0;
446 struct snd_pcm_runtime *runtime = substream->runtime;
447 if (runtime->rate_num == clocks[0].num)
448 bits = 128 - runtime->rate_den;
450 bits = 256 - runtime->rate_den;
452 /* set filter register */
453 div0 = 256 - 7160000*20/(8*82*runtime->rate);
456 snd_es1938_mixer_write(chip, 0x70, bits);
457 snd_es1938_mixer_write(chip, 0x72, div0);
459 snd_es1938_write(chip, 0xA1, bits);
460 snd_es1938_write(chip, 0xA2, div0);
464 /* --------------------------------------------------------------------
465 * Configure Solo1 builtin DMA Controller
466 * --------------------------------------------------------------------*/
468 static void snd_es1938_playback1_setdma(struct es1938 *chip)
470 outb(0x00, SLIO_REG(chip, AUDIO2MODE));
471 outl(chip->dma2_start, SLIO_REG(chip, AUDIO2DMAADDR));
472 outw(0, SLIO_REG(chip, AUDIO2DMACOUNT));
473 outw(chip->dma2_size, SLIO_REG(chip, AUDIO2DMACOUNT));
476 static void snd_es1938_playback2_setdma(struct es1938 *chip)
478 /* Enable DMA controller */
479 outb(0xc4, SLDM_REG(chip, DMACOMMAND));
480 /* 1. Master reset */
481 outb(0, SLDM_REG(chip, DMACLEAR));
483 outb(1, SLDM_REG(chip, DMAMASK));
484 outb(0x18, SLDM_REG(chip, DMAMODE));
485 outl(chip->dma1_start, SLDM_REG(chip, DMAADDR));
486 outw(chip->dma1_size - 1, SLDM_REG(chip, DMACOUNT));
488 outb(0, SLDM_REG(chip, DMAMASK));
491 static void snd_es1938_capture_setdma(struct es1938 *chip)
493 /* Enable DMA controller */
494 outb(0xc4, SLDM_REG(chip, DMACOMMAND));
495 /* 1. Master reset */
496 outb(0, SLDM_REG(chip, DMACLEAR));
498 outb(1, SLDM_REG(chip, DMAMASK));
499 outb(0x14, SLDM_REG(chip, DMAMODE));
500 outl(chip->dma1_start, SLDM_REG(chip, DMAADDR));
501 chip->last_capture_dmaaddr = chip->dma1_start;
502 outw(chip->dma1_size - 1, SLDM_REG(chip, DMACOUNT));
504 outb(0, SLDM_REG(chip, DMAMASK));
507 /* ----------------------------------------------------------------------
512 static int snd_es1938_capture_trigger(struct snd_pcm_substream *substream,
515 struct es1938 *chip = snd_pcm_substream_chip(substream);
518 case SNDRV_PCM_TRIGGER_START:
519 case SNDRV_PCM_TRIGGER_RESUME:
521 chip->active |= ADC1;
523 case SNDRV_PCM_TRIGGER_STOP:
524 case SNDRV_PCM_TRIGGER_SUSPEND:
526 chip->active &= ~ADC1;
531 snd_es1938_write(chip, ESS_CMD_DMACONTROL, val);
535 static int snd_es1938_playback1_trigger(struct snd_pcm_substream *substream,
538 struct es1938 *chip = snd_pcm_substream_chip(substream);
540 case SNDRV_PCM_TRIGGER_START:
541 case SNDRV_PCM_TRIGGER_RESUME:
542 /* According to the documentation this should be:
543 0x13 but that value may randomly swap stereo channels */
544 snd_es1938_mixer_write(chip, ESSSB_IREG_AUDIO2CONTROL1, 0x92);
546 snd_es1938_mixer_write(chip, ESSSB_IREG_AUDIO2CONTROL1, 0x93);
547 /* This two stage init gives the FIFO -> DAC connection time to
548 * settle before first data from DMA flows in. This should ensure
549 * no swapping of stereo channels. Report a bug if otherwise :-) */
550 outb(0x0a, SLIO_REG(chip, AUDIO2MODE));
551 chip->active |= DAC2;
553 case SNDRV_PCM_TRIGGER_STOP:
554 case SNDRV_PCM_TRIGGER_SUSPEND:
555 outb(0, SLIO_REG(chip, AUDIO2MODE));
556 snd_es1938_mixer_write(chip, ESSSB_IREG_AUDIO2CONTROL1, 0);
557 chip->active &= ~DAC2;
565 static int snd_es1938_playback2_trigger(struct snd_pcm_substream *substream,
568 struct es1938 *chip = snd_pcm_substream_chip(substream);
571 case SNDRV_PCM_TRIGGER_START:
572 case SNDRV_PCM_TRIGGER_RESUME:
574 chip->active |= DAC1;
576 case SNDRV_PCM_TRIGGER_STOP:
577 case SNDRV_PCM_TRIGGER_SUSPEND:
579 chip->active &= ~DAC1;
584 snd_es1938_write(chip, ESS_CMD_DMACONTROL, val);
588 static int snd_es1938_playback_trigger(struct snd_pcm_substream *substream,
591 switch (substream->number) {
593 return snd_es1938_playback1_trigger(substream, cmd);
595 return snd_es1938_playback2_trigger(substream, cmd);
601 /* --------------------------------------------------------------------
602 * First channel for Extended Mode Audio 1 ADC Operation
603 * --------------------------------------------------------------------*/
604 static int snd_es1938_capture_prepare(struct snd_pcm_substream *substream)
606 struct es1938 *chip = snd_pcm_substream_chip(substream);
607 struct snd_pcm_runtime *runtime = substream->runtime;
609 unsigned int size = snd_pcm_lib_buffer_bytes(substream);
610 unsigned int count = snd_pcm_lib_period_bytes(substream);
612 chip->dma1_size = size;
613 chip->dma1_start = runtime->dma_addr;
615 mono = (runtime->channels > 1) ? 0 : 1;
616 is8 = snd_pcm_format_width(runtime->format) == 16 ? 0 : 1;
617 u = snd_pcm_format_unsigned(runtime->format);
619 chip->dma1_shift = 2 - mono - is8;
621 snd_es1938_reset_fifo(chip);
624 snd_es1938_bits(chip, ESS_CMD_ANALOGCONTROL, 0x03, (mono ? 2 : 1));
626 /* set clock and counters */
627 snd_es1938_rate_set(chip, substream, ADC1);
629 count = 0x10000 - count;
630 snd_es1938_write(chip, ESS_CMD_DMACNTRELOADL, count & 0xff);
631 snd_es1938_write(chip, ESS_CMD_DMACNTRELOADH, count >> 8);
633 /* initialize and configure ADC */
634 snd_es1938_write(chip, ESS_CMD_SETFORMAT2, u ? 0x51 : 0x71);
635 snd_es1938_write(chip, ESS_CMD_SETFORMAT2, 0x90 |
637 (is8 ? 0x00 : 0x04) |
638 (mono ? 0x40 : 0x08));
640 // snd_es1938_reset_fifo(chip);
642 /* 11. configure system interrupt controller and DMA controller */
643 snd_es1938_capture_setdma(chip);
649 /* ------------------------------------------------------------------------------
650 * Second Audio channel DAC Operation
651 * ------------------------------------------------------------------------------*/
652 static int snd_es1938_playback1_prepare(struct snd_pcm_substream *substream)
654 struct es1938 *chip = snd_pcm_substream_chip(substream);
655 struct snd_pcm_runtime *runtime = substream->runtime;
657 unsigned int size = snd_pcm_lib_buffer_bytes(substream);
658 unsigned int count = snd_pcm_lib_period_bytes(substream);
660 chip->dma2_size = size;
661 chip->dma2_start = runtime->dma_addr;
663 mono = (runtime->channels > 1) ? 0 : 1;
664 is8 = snd_pcm_format_width(runtime->format) == 16 ? 0 : 1;
665 u = snd_pcm_format_unsigned(runtime->format);
667 chip->dma2_shift = 2 - mono - is8;
669 snd_es1938_reset_fifo(chip);
671 /* set clock and counters */
672 snd_es1938_rate_set(chip, substream, DAC2);
675 count = 0x10000 - count;
676 snd_es1938_mixer_write(chip, ESSSB_IREG_AUDIO2TCOUNTL, count & 0xff);
677 snd_es1938_mixer_write(chip, ESSSB_IREG_AUDIO2TCOUNTH, count >> 8);
679 /* initialize and configure Audio 2 DAC */
680 snd_es1938_mixer_write(chip, ESSSB_IREG_AUDIO2CONTROL2, 0x40 | (u ? 0 : 4) |
681 (mono ? 0 : 2) | (is8 ? 0 : 1));
684 snd_es1938_playback1_setdma(chip);
689 static int snd_es1938_playback2_prepare(struct snd_pcm_substream *substream)
691 struct es1938 *chip = snd_pcm_substream_chip(substream);
692 struct snd_pcm_runtime *runtime = substream->runtime;
694 unsigned int size = snd_pcm_lib_buffer_bytes(substream);
695 unsigned int count = snd_pcm_lib_period_bytes(substream);
697 chip->dma1_size = size;
698 chip->dma1_start = runtime->dma_addr;
700 mono = (runtime->channels > 1) ? 0 : 1;
701 is8 = snd_pcm_format_width(runtime->format) == 16 ? 0 : 1;
702 u = snd_pcm_format_unsigned(runtime->format);
704 chip->dma1_shift = 2 - mono - is8;
706 count = 0x10000 - count;
709 snd_es1938_reset_fifo(chip);
711 snd_es1938_bits(chip, ESS_CMD_ANALOGCONTROL, 0x03, (mono ? 2 : 1));
713 /* set clock and counters */
714 snd_es1938_rate_set(chip, substream, DAC1);
715 snd_es1938_write(chip, ESS_CMD_DMACNTRELOADL, count & 0xff);
716 snd_es1938_write(chip, ESS_CMD_DMACNTRELOADH, count >> 8);
718 /* initialized and configure DAC */
719 snd_es1938_write(chip, ESS_CMD_SETFORMAT, u ? 0x80 : 0x00);
720 snd_es1938_write(chip, ESS_CMD_SETFORMAT, u ? 0x51 : 0x71);
721 snd_es1938_write(chip, ESS_CMD_SETFORMAT2,
722 0x90 | (mono ? 0x40 : 0x08) |
723 (is8 ? 0x00 : 0x04) | (u ? 0x00 : 0x20));
726 snd_es1938_playback2_setdma(chip);
731 static int snd_es1938_playback_prepare(struct snd_pcm_substream *substream)
733 switch (substream->number) {
735 return snd_es1938_playback1_prepare(substream);
737 return snd_es1938_playback2_prepare(substream);
743 /* during the incrementing of dma counters the DMA register reads sometimes
744 returns garbage. To ensure a valid hw pointer, the following checks which
745 should be very unlikely to fail are used:
746 - is the current DMA address in the valid DMA range ?
747 - is the sum of DMA address and DMA counter pointing to the last DMA byte ?
748 One can argue this could differ by one byte depending on which register is
749 updated first, so the implementation below allows for that.
751 static snd_pcm_uframes_t snd_es1938_capture_pointer(struct snd_pcm_substream *substream)
753 struct es1938 *chip = snd_pcm_substream_chip(substream);
757 /* This stuff is *needed*, don't ask why - AB */
758 old = inw(SLDM_REG(chip, DMACOUNT));
759 while ((new = inw(SLDM_REG(chip, DMACOUNT))) != old)
761 ptr = chip->dma1_size - 1 - new;
766 ptr = inl(SLDM_REG(chip, DMAADDR));
767 count = inw(SLDM_REG(chip, DMACOUNT));
768 diff = chip->dma1_start + chip->dma1_size - ptr - count;
770 if (diff > 3 || ptr < chip->dma1_start
771 || ptr >= chip->dma1_start+chip->dma1_size)
772 ptr = chip->last_capture_dmaaddr; /* bad, use last saved */
774 chip->last_capture_dmaaddr = ptr; /* good, remember it */
776 ptr -= chip->dma1_start;
778 return ptr >> chip->dma1_shift;
781 static snd_pcm_uframes_t snd_es1938_playback1_pointer(struct snd_pcm_substream *substream)
783 struct es1938 *chip = snd_pcm_substream_chip(substream);
786 ptr = chip->dma2_size - inw(SLIO_REG(chip, AUDIO2DMACOUNT));
788 ptr = inl(SLIO_REG(chip, AUDIO2DMAADDR)) - chip->dma2_start;
790 return ptr >> chip->dma2_shift;
793 static snd_pcm_uframes_t snd_es1938_playback2_pointer(struct snd_pcm_substream *substream)
795 struct es1938 *chip = snd_pcm_substream_chip(substream);
799 /* This stuff is *needed*, don't ask why - AB */
800 old = inw(SLDM_REG(chip, DMACOUNT));
801 while ((new = inw(SLDM_REG(chip, DMACOUNT))) != old)
803 ptr = chip->dma1_size - 1 - new;
805 ptr = inl(SLDM_REG(chip, DMAADDR)) - chip->dma1_start;
807 return ptr >> chip->dma1_shift;
810 static snd_pcm_uframes_t snd_es1938_playback_pointer(struct snd_pcm_substream *substream)
812 switch (substream->number) {
814 return snd_es1938_playback1_pointer(substream);
816 return snd_es1938_playback2_pointer(substream);
822 static int snd_es1938_capture_copy(struct snd_pcm_substream *substream,
823 int channel, unsigned long pos,
824 void __user *dst, unsigned long count)
826 struct snd_pcm_runtime *runtime = substream->runtime;
827 struct es1938 *chip = snd_pcm_substream_chip(substream);
829 if (snd_BUG_ON(pos + count > chip->dma1_size))
831 if (pos + count < chip->dma1_size) {
832 if (copy_to_user(dst, runtime->dma_area + pos + 1, count))
835 if (copy_to_user(dst, runtime->dma_area + pos + 1, count - 1))
837 if (put_user(runtime->dma_area[0],
838 ((unsigned char __user *)dst) + count - 1))
844 static int snd_es1938_capture_copy_kernel(struct snd_pcm_substream *substream,
845 int channel, unsigned long pos,
846 void *dst, unsigned long count)
848 struct snd_pcm_runtime *runtime = substream->runtime;
849 struct es1938 *chip = snd_pcm_substream_chip(substream);
851 if (snd_BUG_ON(pos + count > chip->dma1_size))
853 if (pos + count < chip->dma1_size) {
854 memcpy(dst, runtime->dma_area + pos + 1, count);
856 memcpy(dst, runtime->dma_area + pos + 1, count - 1);
857 runtime->dma_area[0] = *((unsigned char *)dst + count - 1);
862 /* ----------------------------------------------------------------------
863 * Audio1 Capture (ADC)
864 * ----------------------------------------------------------------------*/
865 static const struct snd_pcm_hardware snd_es1938_capture =
867 .info = (SNDRV_PCM_INFO_INTERLEAVED |
868 SNDRV_PCM_INFO_BLOCK_TRANSFER),
869 .formats = (SNDRV_PCM_FMTBIT_U8 | SNDRV_PCM_FMTBIT_S16_LE |
870 SNDRV_PCM_FMTBIT_S8 | SNDRV_PCM_FMTBIT_U16_LE),
871 .rates = SNDRV_PCM_RATE_CONTINUOUS | SNDRV_PCM_RATE_8000_48000,
876 .buffer_bytes_max = 0x8000, /* DMA controller screws on higher values */
877 .period_bytes_min = 64,
878 .period_bytes_max = 0x8000,
884 /* -----------------------------------------------------------------------
885 * Audio2 Playback (DAC)
886 * -----------------------------------------------------------------------*/
887 static const struct snd_pcm_hardware snd_es1938_playback =
889 .info = (SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_INTERLEAVED |
890 SNDRV_PCM_INFO_BLOCK_TRANSFER |
891 SNDRV_PCM_INFO_MMAP_VALID),
892 .formats = (SNDRV_PCM_FMTBIT_U8 | SNDRV_PCM_FMTBIT_S16_LE |
893 SNDRV_PCM_FMTBIT_S8 | SNDRV_PCM_FMTBIT_U16_LE),
894 .rates = SNDRV_PCM_RATE_CONTINUOUS | SNDRV_PCM_RATE_8000_48000,
899 .buffer_bytes_max = 0x8000, /* DMA controller screws on higher values */
900 .period_bytes_min = 64,
901 .period_bytes_max = 0x8000,
907 static int snd_es1938_capture_open(struct snd_pcm_substream *substream)
909 struct es1938 *chip = snd_pcm_substream_chip(substream);
910 struct snd_pcm_runtime *runtime = substream->runtime;
912 if (chip->playback2_substream)
914 chip->capture_substream = substream;
915 runtime->hw = snd_es1938_capture;
916 snd_pcm_hw_constraint_ratnums(runtime, 0, SNDRV_PCM_HW_PARAM_RATE,
917 &hw_constraints_clocks);
918 snd_pcm_hw_constraint_minmax(runtime, SNDRV_PCM_HW_PARAM_BUFFER_BYTES, 0, 0xff00);
922 static int snd_es1938_playback_open(struct snd_pcm_substream *substream)
924 struct es1938 *chip = snd_pcm_substream_chip(substream);
925 struct snd_pcm_runtime *runtime = substream->runtime;
927 switch (substream->number) {
929 chip->playback1_substream = substream;
932 if (chip->capture_substream)
934 chip->playback2_substream = substream;
940 runtime->hw = snd_es1938_playback;
941 snd_pcm_hw_constraint_ratnums(runtime, 0, SNDRV_PCM_HW_PARAM_RATE,
942 &hw_constraints_clocks);
943 snd_pcm_hw_constraint_minmax(runtime, SNDRV_PCM_HW_PARAM_BUFFER_BYTES, 0, 0xff00);
947 static int snd_es1938_capture_close(struct snd_pcm_substream *substream)
949 struct es1938 *chip = snd_pcm_substream_chip(substream);
951 chip->capture_substream = NULL;
955 static int snd_es1938_playback_close(struct snd_pcm_substream *substream)
957 struct es1938 *chip = snd_pcm_substream_chip(substream);
959 switch (substream->number) {
961 chip->playback1_substream = NULL;
964 chip->playback2_substream = NULL;
973 static const struct snd_pcm_ops snd_es1938_playback_ops = {
974 .open = snd_es1938_playback_open,
975 .close = snd_es1938_playback_close,
976 .prepare = snd_es1938_playback_prepare,
977 .trigger = snd_es1938_playback_trigger,
978 .pointer = snd_es1938_playback_pointer,
981 static const struct snd_pcm_ops snd_es1938_capture_ops = {
982 .open = snd_es1938_capture_open,
983 .close = snd_es1938_capture_close,
984 .prepare = snd_es1938_capture_prepare,
985 .trigger = snd_es1938_capture_trigger,
986 .pointer = snd_es1938_capture_pointer,
987 .copy_user = snd_es1938_capture_copy,
988 .copy_kernel = snd_es1938_capture_copy_kernel,
991 static int snd_es1938_new_pcm(struct es1938 *chip, int device)
996 if ((err = snd_pcm_new(chip->card, "es-1938-1946", device, 2, 1, &pcm)) < 0)
998 snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &snd_es1938_playback_ops);
999 snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &snd_es1938_capture_ops);
1001 pcm->private_data = chip;
1002 pcm->info_flags = 0;
1003 strcpy(pcm->name, "ESS Solo-1");
1005 snd_pcm_set_managed_buffer_all(pcm, SNDRV_DMA_TYPE_DEV,
1006 &chip->pci->dev, 64*1024, 64*1024);
1012 /* -------------------------------------------------------------------
1014 * *** Mixer part ***
1017 static int snd_es1938_info_mux(struct snd_kcontrol *kcontrol,
1018 struct snd_ctl_elem_info *uinfo)
1020 static const char * const texts[8] = {
1021 "Mic", "Mic Master", "CD", "AOUT",
1022 "Mic1", "Mix", "Line", "Master"
1025 return snd_ctl_enum_info(uinfo, 1, 8, texts);
1028 static int snd_es1938_get_mux(struct snd_kcontrol *kcontrol,
1029 struct snd_ctl_elem_value *ucontrol)
1031 struct es1938 *chip = snd_kcontrol_chip(kcontrol);
1032 ucontrol->value.enumerated.item[0] = snd_es1938_mixer_read(chip, 0x1c) & 0x07;
1036 static int snd_es1938_put_mux(struct snd_kcontrol *kcontrol,
1037 struct snd_ctl_elem_value *ucontrol)
1039 struct es1938 *chip = snd_kcontrol_chip(kcontrol);
1040 unsigned char val = ucontrol->value.enumerated.item[0];
1044 return snd_es1938_mixer_bits(chip, 0x1c, 0x07, val) != val;
1047 #define snd_es1938_info_spatializer_enable snd_ctl_boolean_mono_info
1049 static int snd_es1938_get_spatializer_enable(struct snd_kcontrol *kcontrol,
1050 struct snd_ctl_elem_value *ucontrol)
1052 struct es1938 *chip = snd_kcontrol_chip(kcontrol);
1053 unsigned char val = snd_es1938_mixer_read(chip, 0x50);
1054 ucontrol->value.integer.value[0] = !!(val & 8);
1058 static int snd_es1938_put_spatializer_enable(struct snd_kcontrol *kcontrol,
1059 struct snd_ctl_elem_value *ucontrol)
1061 struct es1938 *chip = snd_kcontrol_chip(kcontrol);
1062 unsigned char oval, nval;
1064 nval = ucontrol->value.integer.value[0] ? 0x0c : 0x04;
1065 oval = snd_es1938_mixer_read(chip, 0x50) & 0x0c;
1066 change = nval != oval;
1068 snd_es1938_mixer_write(chip, 0x50, nval & ~0x04);
1069 snd_es1938_mixer_write(chip, 0x50, nval);
1074 static int snd_es1938_info_hw_volume(struct snd_kcontrol *kcontrol,
1075 struct snd_ctl_elem_info *uinfo)
1077 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
1079 uinfo->value.integer.min = 0;
1080 uinfo->value.integer.max = 63;
1084 static int snd_es1938_get_hw_volume(struct snd_kcontrol *kcontrol,
1085 struct snd_ctl_elem_value *ucontrol)
1087 struct es1938 *chip = snd_kcontrol_chip(kcontrol);
1088 ucontrol->value.integer.value[0] = snd_es1938_mixer_read(chip, 0x61) & 0x3f;
1089 ucontrol->value.integer.value[1] = snd_es1938_mixer_read(chip, 0x63) & 0x3f;
1093 #define snd_es1938_info_hw_switch snd_ctl_boolean_stereo_info
1095 static int snd_es1938_get_hw_switch(struct snd_kcontrol *kcontrol,
1096 struct snd_ctl_elem_value *ucontrol)
1098 struct es1938 *chip = snd_kcontrol_chip(kcontrol);
1099 ucontrol->value.integer.value[0] = !(snd_es1938_mixer_read(chip, 0x61) & 0x40);
1100 ucontrol->value.integer.value[1] = !(snd_es1938_mixer_read(chip, 0x63) & 0x40);
1104 static void snd_es1938_hwv_free(struct snd_kcontrol *kcontrol)
1106 struct es1938 *chip = snd_kcontrol_chip(kcontrol);
1107 chip->master_volume = NULL;
1108 chip->master_switch = NULL;
1109 chip->hw_volume = NULL;
1110 chip->hw_switch = NULL;
1113 static int snd_es1938_reg_bits(struct es1938 *chip, unsigned char reg,
1114 unsigned char mask, unsigned char val)
1117 return snd_es1938_mixer_bits(chip, reg, mask, val);
1119 return snd_es1938_bits(chip, reg, mask, val);
1122 static int snd_es1938_reg_read(struct es1938 *chip, unsigned char reg)
1125 return snd_es1938_mixer_read(chip, reg);
1127 return snd_es1938_read(chip, reg);
1130 #define ES1938_SINGLE_TLV(xname, xindex, reg, shift, mask, invert, xtlv) \
1131 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
1132 .access = SNDRV_CTL_ELEM_ACCESS_READWRITE | SNDRV_CTL_ELEM_ACCESS_TLV_READ,\
1133 .name = xname, .index = xindex, \
1134 .info = snd_es1938_info_single, \
1135 .get = snd_es1938_get_single, .put = snd_es1938_put_single, \
1136 .private_value = reg | (shift << 8) | (mask << 16) | (invert << 24), \
1137 .tlv = { .p = xtlv } }
1138 #define ES1938_SINGLE(xname, xindex, reg, shift, mask, invert) \
1139 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = xindex, \
1140 .info = snd_es1938_info_single, \
1141 .get = snd_es1938_get_single, .put = snd_es1938_put_single, \
1142 .private_value = reg | (shift << 8) | (mask << 16) | (invert << 24) }
1144 static int snd_es1938_info_single(struct snd_kcontrol *kcontrol,
1145 struct snd_ctl_elem_info *uinfo)
1147 int mask = (kcontrol->private_value >> 16) & 0xff;
1149 uinfo->type = mask == 1 ? SNDRV_CTL_ELEM_TYPE_BOOLEAN : SNDRV_CTL_ELEM_TYPE_INTEGER;
1151 uinfo->value.integer.min = 0;
1152 uinfo->value.integer.max = mask;
1156 static int snd_es1938_get_single(struct snd_kcontrol *kcontrol,
1157 struct snd_ctl_elem_value *ucontrol)
1159 struct es1938 *chip = snd_kcontrol_chip(kcontrol);
1160 int reg = kcontrol->private_value & 0xff;
1161 int shift = (kcontrol->private_value >> 8) & 0xff;
1162 int mask = (kcontrol->private_value >> 16) & 0xff;
1163 int invert = (kcontrol->private_value >> 24) & 0xff;
1166 val = snd_es1938_reg_read(chip, reg);
1167 ucontrol->value.integer.value[0] = (val >> shift) & mask;
1169 ucontrol->value.integer.value[0] = mask - ucontrol->value.integer.value[0];
1173 static int snd_es1938_put_single(struct snd_kcontrol *kcontrol,
1174 struct snd_ctl_elem_value *ucontrol)
1176 struct es1938 *chip = snd_kcontrol_chip(kcontrol);
1177 int reg = kcontrol->private_value & 0xff;
1178 int shift = (kcontrol->private_value >> 8) & 0xff;
1179 int mask = (kcontrol->private_value >> 16) & 0xff;
1180 int invert = (kcontrol->private_value >> 24) & 0xff;
1183 val = (ucontrol->value.integer.value[0] & mask);
1188 return snd_es1938_reg_bits(chip, reg, mask, val) != val;
1191 #define ES1938_DOUBLE_TLV(xname, xindex, left_reg, right_reg, shift_left, shift_right, mask, invert, xtlv) \
1192 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
1193 .access = SNDRV_CTL_ELEM_ACCESS_READWRITE | SNDRV_CTL_ELEM_ACCESS_TLV_READ,\
1194 .name = xname, .index = xindex, \
1195 .info = snd_es1938_info_double, \
1196 .get = snd_es1938_get_double, .put = snd_es1938_put_double, \
1197 .private_value = left_reg | (right_reg << 8) | (shift_left << 16) | (shift_right << 19) | (mask << 24) | (invert << 22), \
1198 .tlv = { .p = xtlv } }
1199 #define ES1938_DOUBLE(xname, xindex, left_reg, right_reg, shift_left, shift_right, mask, invert) \
1200 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = xindex, \
1201 .info = snd_es1938_info_double, \
1202 .get = snd_es1938_get_double, .put = snd_es1938_put_double, \
1203 .private_value = left_reg | (right_reg << 8) | (shift_left << 16) | (shift_right << 19) | (mask << 24) | (invert << 22) }
1205 static int snd_es1938_info_double(struct snd_kcontrol *kcontrol,
1206 struct snd_ctl_elem_info *uinfo)
1208 int mask = (kcontrol->private_value >> 24) & 0xff;
1210 uinfo->type = mask == 1 ? SNDRV_CTL_ELEM_TYPE_BOOLEAN : SNDRV_CTL_ELEM_TYPE_INTEGER;
1212 uinfo->value.integer.min = 0;
1213 uinfo->value.integer.max = mask;
1217 static int snd_es1938_get_double(struct snd_kcontrol *kcontrol,
1218 struct snd_ctl_elem_value *ucontrol)
1220 struct es1938 *chip = snd_kcontrol_chip(kcontrol);
1221 int left_reg = kcontrol->private_value & 0xff;
1222 int right_reg = (kcontrol->private_value >> 8) & 0xff;
1223 int shift_left = (kcontrol->private_value >> 16) & 0x07;
1224 int shift_right = (kcontrol->private_value >> 19) & 0x07;
1225 int mask = (kcontrol->private_value >> 24) & 0xff;
1226 int invert = (kcontrol->private_value >> 22) & 1;
1227 unsigned char left, right;
1229 left = snd_es1938_reg_read(chip, left_reg);
1230 if (left_reg != right_reg)
1231 right = snd_es1938_reg_read(chip, right_reg);
1234 ucontrol->value.integer.value[0] = (left >> shift_left) & mask;
1235 ucontrol->value.integer.value[1] = (right >> shift_right) & mask;
1237 ucontrol->value.integer.value[0] = mask - ucontrol->value.integer.value[0];
1238 ucontrol->value.integer.value[1] = mask - ucontrol->value.integer.value[1];
1243 static int snd_es1938_put_double(struct snd_kcontrol *kcontrol,
1244 struct snd_ctl_elem_value *ucontrol)
1246 struct es1938 *chip = snd_kcontrol_chip(kcontrol);
1247 int left_reg = kcontrol->private_value & 0xff;
1248 int right_reg = (kcontrol->private_value >> 8) & 0xff;
1249 int shift_left = (kcontrol->private_value >> 16) & 0x07;
1250 int shift_right = (kcontrol->private_value >> 19) & 0x07;
1251 int mask = (kcontrol->private_value >> 24) & 0xff;
1252 int invert = (kcontrol->private_value >> 22) & 1;
1254 unsigned char val1, val2, mask1, mask2;
1256 val1 = ucontrol->value.integer.value[0] & mask;
1257 val2 = ucontrol->value.integer.value[1] & mask;
1262 val1 <<= shift_left;
1263 val2 <<= shift_right;
1264 mask1 = mask << shift_left;
1265 mask2 = mask << shift_right;
1266 if (left_reg != right_reg) {
1268 if (snd_es1938_reg_bits(chip, left_reg, mask1, val1) != val1)
1270 if (snd_es1938_reg_bits(chip, right_reg, mask2, val2) != val2)
1273 change = (snd_es1938_reg_bits(chip, left_reg, mask1 | mask2,
1274 val1 | val2) != (val1 | val2));
1279 static const DECLARE_TLV_DB_RANGE(db_scale_master,
1280 0, 54, TLV_DB_SCALE_ITEM(-3600, 50, 1),
1281 54, 63, TLV_DB_SCALE_ITEM(-900, 100, 0),
1284 static const DECLARE_TLV_DB_RANGE(db_scale_audio1,
1285 0, 8, TLV_DB_SCALE_ITEM(-3300, 300, 1),
1286 8, 15, TLV_DB_SCALE_ITEM(-900, 150, 0),
1289 static const DECLARE_TLV_DB_RANGE(db_scale_audio2,
1290 0, 8, TLV_DB_SCALE_ITEM(-3450, 300, 1),
1291 8, 15, TLV_DB_SCALE_ITEM(-1050, 150, 0),
1294 static const DECLARE_TLV_DB_RANGE(db_scale_mic,
1295 0, 8, TLV_DB_SCALE_ITEM(-2400, 300, 1),
1296 8, 15, TLV_DB_SCALE_ITEM(0, 150, 0),
1299 static const DECLARE_TLV_DB_RANGE(db_scale_line,
1300 0, 8, TLV_DB_SCALE_ITEM(-3150, 300, 1),
1301 8, 15, TLV_DB_SCALE_ITEM(-750, 150, 0),
1304 static const DECLARE_TLV_DB_SCALE(db_scale_capture, 0, 150, 0);
1306 static const struct snd_kcontrol_new snd_es1938_controls[] = {
1307 ES1938_DOUBLE_TLV("Master Playback Volume", 0, 0x60, 0x62, 0, 0, 63, 0,
1309 ES1938_DOUBLE("Master Playback Switch", 0, 0x60, 0x62, 6, 6, 1, 1),
1311 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
1312 .name = "Hardware Master Playback Volume",
1313 .access = SNDRV_CTL_ELEM_ACCESS_READ,
1314 .info = snd_es1938_info_hw_volume,
1315 .get = snd_es1938_get_hw_volume,
1318 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
1319 .access = (SNDRV_CTL_ELEM_ACCESS_READ |
1320 SNDRV_CTL_ELEM_ACCESS_TLV_READ),
1321 .name = "Hardware Master Playback Switch",
1322 .info = snd_es1938_info_hw_switch,
1323 .get = snd_es1938_get_hw_switch,
1324 .tlv = { .p = db_scale_master },
1326 ES1938_SINGLE("Hardware Volume Split", 0, 0x64, 7, 1, 0),
1327 ES1938_DOUBLE_TLV("Line Playback Volume", 0, 0x3e, 0x3e, 4, 0, 15, 0,
1329 ES1938_DOUBLE("CD Playback Volume", 0, 0x38, 0x38, 4, 0, 15, 0),
1330 ES1938_DOUBLE_TLV("FM Playback Volume", 0, 0x36, 0x36, 4, 0, 15, 0,
1332 ES1938_DOUBLE_TLV("Mono Playback Volume", 0, 0x6d, 0x6d, 4, 0, 15, 0,
1334 ES1938_DOUBLE_TLV("Mic Playback Volume", 0, 0x1a, 0x1a, 4, 0, 15, 0,
1336 ES1938_DOUBLE_TLV("Aux Playback Volume", 0, 0x3a, 0x3a, 4, 0, 15, 0,
1338 ES1938_DOUBLE_TLV("Capture Volume", 0, 0xb4, 0xb4, 4, 0, 15, 0,
1340 ES1938_SINGLE("Beep Volume", 0, 0x3c, 0, 7, 0),
1341 ES1938_SINGLE("Record Monitor", 0, 0xa8, 3, 1, 0),
1342 ES1938_SINGLE("Capture Switch", 0, 0x1c, 4, 1, 1),
1344 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
1345 .name = "Capture Source",
1346 .info = snd_es1938_info_mux,
1347 .get = snd_es1938_get_mux,
1348 .put = snd_es1938_put_mux,
1350 ES1938_DOUBLE_TLV("Mono Input Playback Volume", 0, 0x6d, 0x6d, 4, 0, 15, 0,
1352 ES1938_DOUBLE_TLV("PCM Capture Volume", 0, 0x69, 0x69, 4, 0, 15, 0,
1354 ES1938_DOUBLE_TLV("Mic Capture Volume", 0, 0x68, 0x68, 4, 0, 15, 0,
1356 ES1938_DOUBLE_TLV("Line Capture Volume", 0, 0x6e, 0x6e, 4, 0, 15, 0,
1358 ES1938_DOUBLE_TLV("FM Capture Volume", 0, 0x6b, 0x6b, 4, 0, 15, 0,
1360 ES1938_DOUBLE_TLV("Mono Capture Volume", 0, 0x6f, 0x6f, 4, 0, 15, 0,
1362 ES1938_DOUBLE_TLV("CD Capture Volume", 0, 0x6a, 0x6a, 4, 0, 15, 0,
1364 ES1938_DOUBLE_TLV("Aux Capture Volume", 0, 0x6c, 0x6c, 4, 0, 15, 0,
1366 ES1938_DOUBLE_TLV("PCM Playback Volume", 0, 0x7c, 0x7c, 4, 0, 15, 0,
1368 ES1938_DOUBLE_TLV("PCM Playback Volume", 1, 0x14, 0x14, 4, 0, 15, 0,
1370 ES1938_SINGLE("3D Control - Level", 0, 0x52, 0, 63, 0),
1372 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
1373 .name = "3D Control - Switch",
1374 .info = snd_es1938_info_spatializer_enable,
1375 .get = snd_es1938_get_spatializer_enable,
1376 .put = snd_es1938_put_spatializer_enable,
1378 ES1938_SINGLE("Mic Boost (+26dB)", 0, 0x7d, 3, 1, 0)
1382 /* ---------------------------------------------------------------------------- */
1383 /* ---------------------------------------------------------------------------- */
1386 * initialize the chip - used by resume callback, too
1388 static void snd_es1938_chip_init(struct es1938 *chip)
1391 snd_es1938_reset(chip);
1393 /* configure native mode */
1395 /* enable bus master */
1396 pci_set_master(chip->pci);
1398 /* disable legacy audio */
1399 pci_write_config_word(chip->pci, SL_PCI_LEGACYCONTROL, 0x805f);
1402 pci_write_config_word(chip->pci, SL_PCI_DDMACONTROL, chip->ddma_port | 1);
1404 /* set DMA/IRQ policy */
1405 pci_write_config_dword(chip->pci, SL_PCI_CONFIG, 0);
1407 /* enable Audio 1, Audio 2, MPU401 IRQ and HW volume IRQ*/
1408 outb(0xf0, SLIO_REG(chip, IRQCONTROL));
1411 outb(0, SLDM_REG(chip, DMACLEAR));
1414 #ifdef CONFIG_PM_SLEEP
1419 static const unsigned char saved_regs[SAVED_REG_SIZE+1] = {
1420 0x14, 0x1a, 0x1c, 0x3a, 0x3c, 0x3e, 0x36, 0x38,
1421 0x50, 0x52, 0x60, 0x61, 0x62, 0x63, 0x64, 0x68,
1422 0x69, 0x6a, 0x6b, 0x6d, 0x6e, 0x6f, 0x7c, 0x7d,
1427 static int es1938_suspend(struct device *dev)
1429 struct snd_card *card = dev_get_drvdata(dev);
1430 struct es1938 *chip = card->private_data;
1431 const unsigned char *s;
1434 snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
1436 /* save mixer-related registers */
1437 for (s = saved_regs, d = chip->saved_regs; *s; s++, d++)
1438 *d = snd_es1938_reg_read(chip, *s);
1440 outb(0x00, SLIO_REG(chip, IRQCONTROL)); /* disable irqs */
1441 if (chip->irq >= 0) {
1442 free_irq(chip->irq, chip);
1444 card->sync_irq = -1;
1449 static int es1938_resume(struct device *dev)
1451 struct pci_dev *pci = to_pci_dev(dev);
1452 struct snd_card *card = dev_get_drvdata(dev);
1453 struct es1938 *chip = card->private_data;
1454 const unsigned char *s;
1457 if (request_irq(pci->irq, snd_es1938_interrupt,
1458 IRQF_SHARED, KBUILD_MODNAME, chip)) {
1459 dev_err(dev, "unable to grab IRQ %d, disabling device\n",
1461 snd_card_disconnect(card);
1464 chip->irq = pci->irq;
1465 card->sync_irq = chip->irq;
1466 snd_es1938_chip_init(chip);
1468 /* restore mixer-related registers */
1469 for (s = saved_regs, d = chip->saved_regs; *s; s++, d++) {
1471 snd_es1938_mixer_write(chip, *s, *d);
1473 snd_es1938_write(chip, *s, *d);
1476 snd_power_change_state(card, SNDRV_CTL_POWER_D0);
1480 static SIMPLE_DEV_PM_OPS(es1938_pm, es1938_suspend, es1938_resume);
1481 #define ES1938_PM_OPS &es1938_pm
1483 #define ES1938_PM_OPS NULL
1484 #endif /* CONFIG_PM_SLEEP */
1486 #ifdef SUPPORT_JOYSTICK
1487 static int snd_es1938_create_gameport(struct es1938 *chip)
1489 struct gameport *gp;
1491 chip->gameport = gp = gameport_allocate_port();
1493 dev_err(chip->card->dev,
1494 "cannot allocate memory for gameport\n");
1498 gameport_set_name(gp, "ES1938");
1499 gameport_set_phys(gp, "pci%s/gameport0", pci_name(chip->pci));
1500 gameport_set_dev_parent(gp, &chip->pci->dev);
1501 gp->io = chip->game_port;
1503 gameport_register_port(gp);
1508 static void snd_es1938_free_gameport(struct es1938 *chip)
1510 if (chip->gameport) {
1511 gameport_unregister_port(chip->gameport);
1512 chip->gameport = NULL;
1516 static inline int snd_es1938_create_gameport(struct es1938 *chip) { return -ENOSYS; }
1517 static inline void snd_es1938_free_gameport(struct es1938 *chip) { }
1518 #endif /* SUPPORT_JOYSTICK */
1520 static int snd_es1938_free(struct es1938 *chip)
1523 outb(0x00, SLIO_REG(chip, IRQCONTROL));
1525 snd_es1938_mixer_bits(chip, ESSSB_IREG_MPU401CONTROL, 0x40, 0);
1527 snd_es1938_free_gameport(chip);
1530 free_irq(chip->irq, chip);
1531 pci_release_regions(chip->pci);
1532 pci_disable_device(chip->pci);
1537 static int snd_es1938_dev_free(struct snd_device *device)
1539 struct es1938 *chip = device->device_data;
1540 return snd_es1938_free(chip);
1543 static int snd_es1938_create(struct snd_card *card,
1544 struct pci_dev *pci,
1545 struct es1938 **rchip)
1547 struct es1938 *chip;
1549 static const struct snd_device_ops ops = {
1550 .dev_free = snd_es1938_dev_free,
1555 /* enable PCI device */
1556 if ((err = pci_enable_device(pci)) < 0)
1558 /* check, if we can restrict PCI DMA transfers to 24 bits */
1559 if (dma_set_mask_and_coherent(&pci->dev, DMA_BIT_MASK(24))) {
1561 "architecture does not support 24bit PCI busmaster DMA\n");
1562 pci_disable_device(pci);
1566 chip = kzalloc(sizeof(*chip), GFP_KERNEL);
1568 pci_disable_device(pci);
1571 spin_lock_init(&chip->reg_lock);
1572 spin_lock_init(&chip->mixer_lock);
1576 if ((err = pci_request_regions(pci, "ESS Solo-1")) < 0) {
1578 pci_disable_device(pci);
1581 chip->io_port = pci_resource_start(pci, 0);
1582 chip->sb_port = pci_resource_start(pci, 1);
1583 chip->vc_port = pci_resource_start(pci, 2);
1584 chip->mpu_port = pci_resource_start(pci, 3);
1585 chip->game_port = pci_resource_start(pci, 4);
1586 if (request_irq(pci->irq, snd_es1938_interrupt, IRQF_SHARED,
1587 KBUILD_MODNAME, chip)) {
1588 dev_err(card->dev, "unable to grab IRQ %d\n", pci->irq);
1589 snd_es1938_free(chip);
1592 chip->irq = pci->irq;
1593 card->sync_irq = chip->irq;
1595 "create: io: 0x%lx, sb: 0x%lx, vc: 0x%lx, mpu: 0x%lx, game: 0x%lx\n",
1596 chip->io_port, chip->sb_port, chip->vc_port, chip->mpu_port, chip->game_port);
1598 chip->ddma_port = chip->vc_port + 0x00; /* fix from Thomas Sailer */
1600 snd_es1938_chip_init(chip);
1602 if ((err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops)) < 0) {
1603 snd_es1938_free(chip);
1611 /* --------------------------------------------------------------------
1613 * -------------------------------------------------------------------- */
1614 static irqreturn_t snd_es1938_interrupt(int irq, void *dev_id)
1616 struct es1938 *chip = dev_id;
1617 unsigned char status;
1618 __always_unused unsigned char audiostatus;
1621 status = inb(SLIO_REG(chip, IRQCONTROL));
1623 dev_dbg(chip->card->dev,
1624 "Es1938debug - interrupt status: =0x%x\n", status);
1628 if (status & 0x10) {
1630 dev_dbg(chip->card->dev,
1631 "Es1938debug - AUDIO channel 1 interrupt\n");
1632 dev_dbg(chip->card->dev,
1633 "Es1938debug - AUDIO channel 1 DMAC DMA count: %u\n",
1634 inw(SLDM_REG(chip, DMACOUNT)));
1635 dev_dbg(chip->card->dev,
1636 "Es1938debug - AUDIO channel 1 DMAC DMA base: %u\n",
1637 inl(SLDM_REG(chip, DMAADDR)));
1638 dev_dbg(chip->card->dev,
1639 "Es1938debug - AUDIO channel 1 DMAC DMA status: 0x%x\n",
1640 inl(SLDM_REG(chip, DMASTATUS)));
1644 audiostatus = inb(SLSB_REG(chip, STATUS));
1645 if (chip->active & ADC1)
1646 snd_pcm_period_elapsed(chip->capture_substream);
1647 else if (chip->active & DAC1)
1648 snd_pcm_period_elapsed(chip->playback2_substream);
1652 if (status & 0x20) {
1654 dev_dbg(chip->card->dev,
1655 "Es1938debug - AUDIO channel 2 interrupt\n");
1656 dev_dbg(chip->card->dev,
1657 "Es1938debug - AUDIO channel 2 DMAC DMA count: %u\n",
1658 inw(SLIO_REG(chip, AUDIO2DMACOUNT)));
1659 dev_dbg(chip->card->dev,
1660 "Es1938debug - AUDIO channel 2 DMAC DMA base: %u\n",
1661 inl(SLIO_REG(chip, AUDIO2DMAADDR)));
1666 snd_es1938_mixer_bits(chip, ESSSB_IREG_AUDIO2CONTROL2, 0x80, 0);
1667 if (chip->active & DAC2)
1668 snd_pcm_period_elapsed(chip->playback1_substream);
1671 /* Hardware volume */
1672 if (status & 0x40) {
1673 int split = snd_es1938_mixer_read(chip, 0x64) & 0x80;
1675 snd_ctl_notify(chip->card, SNDRV_CTL_EVENT_MASK_VALUE, &chip->hw_switch->id);
1676 snd_ctl_notify(chip->card, SNDRV_CTL_EVENT_MASK_VALUE, &chip->hw_volume->id);
1678 snd_ctl_notify(chip->card, SNDRV_CTL_EVENT_MASK_VALUE,
1679 &chip->master_switch->id);
1680 snd_ctl_notify(chip->card, SNDRV_CTL_EVENT_MASK_VALUE,
1681 &chip->master_volume->id);
1684 snd_es1938_mixer_write(chip, 0x66, 0x00);
1688 if (status & 0x80) {
1689 // the following line is evil! It switches off MIDI interrupt handling after the first interrupt received.
1690 // replacing the last 0 by 0x40 works for ESS-Solo1, but just doing nothing works as well!
1692 // snd_es1938_mixer_bits(chip, ESSSB_IREG_MPU401CONTROL, 0x40, 0); /* ack? */
1695 snd_mpu401_uart_interrupt(irq, chip->rmidi->private_data);
1698 return IRQ_RETVAL(handled);
1701 #define ES1938_DMA_SIZE 64
1703 static int snd_es1938_mixer(struct es1938 *chip)
1705 struct snd_card *card;
1711 strcpy(card->mixername, "ESS Solo-1");
1713 for (idx = 0; idx < ARRAY_SIZE(snd_es1938_controls); idx++) {
1714 struct snd_kcontrol *kctl;
1715 kctl = snd_ctl_new1(&snd_es1938_controls[idx], chip);
1718 chip->master_volume = kctl;
1719 kctl->private_free = snd_es1938_hwv_free;
1722 chip->master_switch = kctl;
1723 kctl->private_free = snd_es1938_hwv_free;
1726 chip->hw_volume = kctl;
1727 kctl->private_free = snd_es1938_hwv_free;
1730 chip->hw_switch = kctl;
1731 kctl->private_free = snd_es1938_hwv_free;
1734 if ((err = snd_ctl_add(card, kctl)) < 0)
1741 static int snd_es1938_probe(struct pci_dev *pci,
1742 const struct pci_device_id *pci_id)
1745 struct snd_card *card;
1746 struct es1938 *chip;
1747 struct snd_opl3 *opl3;
1750 if (dev >= SNDRV_CARDS)
1757 err = snd_card_new(&pci->dev, index[dev], id[dev], THIS_MODULE,
1761 for (idx = 0; idx < 5; idx++) {
1762 if (pci_resource_start(pci, idx) == 0 ||
1763 !(pci_resource_flags(pci, idx) & IORESOURCE_IO)) {
1764 snd_card_free(card);
1768 if ((err = snd_es1938_create(card, pci, &chip)) < 0) {
1769 snd_card_free(card);
1772 card->private_data = chip;
1774 strcpy(card->driver, "ES1938");
1775 strcpy(card->shortname, "ESS ES1938 (Solo-1)");
1776 sprintf(card->longname, "%s rev %i, irq %i",
1781 if ((err = snd_es1938_new_pcm(chip, 0)) < 0) {
1782 snd_card_free(card);
1785 if ((err = snd_es1938_mixer(chip)) < 0) {
1786 snd_card_free(card);
1789 if (snd_opl3_create(card,
1790 SLSB_REG(chip, FMLOWADDR),
1791 SLSB_REG(chip, FMHIGHADDR),
1792 OPL3_HW_OPL3, 1, &opl3) < 0) {
1793 dev_err(card->dev, "OPL3 not detected at 0x%lx\n",
1794 SLSB_REG(chip, FMLOWADDR));
1796 if ((err = snd_opl3_timer_new(opl3, 0, 1)) < 0) {
1797 snd_card_free(card);
1800 if ((err = snd_opl3_hwdep_new(opl3, 0, 1, NULL)) < 0) {
1801 snd_card_free(card);
1805 if (snd_mpu401_uart_new(card, 0, MPU401_HW_MPU401,
1807 MPU401_INFO_INTEGRATED | MPU401_INFO_IRQ_HOOK,
1808 -1, &chip->rmidi) < 0) {
1809 dev_err(card->dev, "unable to initialize MPU-401\n");
1811 // this line is vital for MIDI interrupt handling on ess-solo1
1813 snd_es1938_mixer_bits(chip, ESSSB_IREG_MPU401CONTROL, 0x40, 0x40);
1816 snd_es1938_create_gameport(chip);
1818 if ((err = snd_card_register(card)) < 0) {
1819 snd_card_free(card);
1823 pci_set_drvdata(pci, card);
1828 static void snd_es1938_remove(struct pci_dev *pci)
1830 snd_card_free(pci_get_drvdata(pci));
1833 static struct pci_driver es1938_driver = {
1834 .name = KBUILD_MODNAME,
1835 .id_table = snd_es1938_ids,
1836 .probe = snd_es1938_probe,
1837 .remove = snd_es1938_remove,
1839 .pm = ES1938_PM_OPS,
1843 module_pci_driver(es1938_driver);