xref: /openbmc/linux/sound/pci/es1938.c (revision 1da177e4c3f41524e886b7f1b8a0c1fc7321cac2)
1 /*
2  *  Driver for ESS Solo-1 (ES1938, ES1946, ES1969) soundcard
3  *  Copyright (c) by Jaromir Koutek <miri@punknet.cz>,
4  *                   Jaroslav Kysela <perex@suse.cz>,
5  *                   Thomas Sailer <sailer@ife.ee.ethz.ch>,
6  *                   Abramo Bagnara <abramo@alsa-project.org>,
7  *                   Markus Gruber <gruber@eikon.tum.de>
8  *
9  * Rewritten from sonicvibes.c source.
10  *
11  *  TODO:
12  *    Rewrite better spinlocks
13  *
14  *
15  *   This program is free software; you can redistribute it and/or modify
16  *   it under the terms of the GNU General Public License as published by
17  *   the Free Software Foundation; either version 2 of the License, or
18  *   (at your option) any later version.
19  *
20  *   This program is distributed in the hope that it will be useful,
21  *   but WITHOUT ANY WARRANTY; without even the implied warranty of
22  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
23  *   GNU General Public License for more details.
24  *
25  *   You should have received a copy of the GNU General Public License
26  *   along with this program; if not, write to the Free Software
27  *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
28  *
29  */
30 
31 /*
32   NOTES:
33   - Capture data is written unaligned starting from dma_base + 1 so I need to
34     disable mmap and to add a copy callback.
35   - After several cycle of the following:
36     while : ; do arecord -d1 -f cd -t raw | aplay -f cd ; done
37     a "playback write error (DMA or IRQ trouble?)" may happen.
38     This is due to playback interrupts not generated.
39     I suspect a timing issue.
40   - Sometimes the interrupt handler is invoked wrongly during playback.
41     This generates some harmless "Unexpected hw_pointer: wrong interrupt
42     acknowledge".
43     I've seen that using small period sizes.
44     Reproducible with:
45     mpg123 test.mp3 &
46     hdparm -t -T /dev/hda
47 */
48 
49 
50 #include <sound/driver.h>
51 #include <linux/init.h>
52 #include <linux/interrupt.h>
53 #include <linux/pci.h>
54 #include <linux/slab.h>
55 #include <linux/gameport.h>
56 #include <linux/moduleparam.h>
57 #include <linux/delay.h>
58 #include <sound/core.h>
59 #include <sound/control.h>
60 #include <sound/pcm.h>
61 #include <sound/opl3.h>
62 #include <sound/mpu401.h>
63 #include <sound/initval.h>
64 
65 #include <asm/io.h>
66 
67 MODULE_AUTHOR("Jaromir Koutek <miri@punknet.cz>");
68 MODULE_DESCRIPTION("ESS Solo-1");
69 MODULE_LICENSE("GPL");
70 MODULE_SUPPORTED_DEVICE("{{ESS,ES1938},"
71                 "{ESS,ES1946},"
72                 "{ESS,ES1969},"
73 		"{TerraTec,128i PCI}}");
74 
75 #if defined(CONFIG_GAMEPORT) || (defined(MODULE) && defined(CONFIG_GAMEPORT_MODULE))
76 #define SUPPORT_JOYSTICK 1
77 #endif
78 
79 #ifndef PCI_VENDOR_ID_ESS
80 #define PCI_VENDOR_ID_ESS		0x125d
81 #endif
82 #ifndef PCI_DEVICE_ID_ESS_ES1938
83 #define PCI_DEVICE_ID_ESS_ES1938	0x1969
84 #endif
85 
86 static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX;	/* Index 0-MAX */
87 static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR;	/* ID for this card */
88 static int enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP;	/* Enable this card */
89 
90 module_param_array(index, int, NULL, 0444);
91 MODULE_PARM_DESC(index, "Index value for ESS Solo-1 soundcard.");
92 module_param_array(id, charp, NULL, 0444);
93 MODULE_PARM_DESC(id, "ID string for ESS Solo-1 soundcard.");
94 module_param_array(enable, bool, NULL, 0444);
95 MODULE_PARM_DESC(enable, "Enable ESS Solo-1 soundcard.");
96 
97 #define SLIO_REG(chip, x) ((chip)->io_port + ESSIO_REG_##x)
98 
99 #define SLDM_REG(chip, x) ((chip)->ddma_port + ESSDM_REG_##x)
100 
101 #define SLSB_REG(chip, x) ((chip)->sb_port + ESSSB_REG_##x)
102 
103 #define SL_PCI_LEGACYCONTROL		0x40
104 #define SL_PCI_CONFIG			0x50
105 #define SL_PCI_DDMACONTROL		0x60
106 
107 #define ESSIO_REG_AUDIO2DMAADDR		0
108 #define ESSIO_REG_AUDIO2DMACOUNT	4
109 #define ESSIO_REG_AUDIO2MODE		6
110 #define ESSIO_REG_IRQCONTROL		7
111 
112 #define ESSDM_REG_DMAADDR		0x00
113 #define ESSDM_REG_DMACOUNT		0x04
114 #define ESSDM_REG_DMACOMMAND		0x08
115 #define ESSDM_REG_DMASTATUS		0x08
116 #define ESSDM_REG_DMAMODE		0x0b
117 #define ESSDM_REG_DMACLEAR		0x0d
118 #define ESSDM_REG_DMAMASK		0x0f
119 
120 #define ESSSB_REG_FMLOWADDR		0x00
121 #define ESSSB_REG_FMHIGHADDR		0x02
122 #define ESSSB_REG_MIXERADDR		0x04
123 #define ESSSB_REG_MIXERDATA		0x05
124 
125 #define ESSSB_IREG_AUDIO1		0x14
126 #define ESSSB_IREG_MICMIX		0x1a
127 #define ESSSB_IREG_RECSRC		0x1c
128 #define ESSSB_IREG_MASTER		0x32
129 #define ESSSB_IREG_FM			0x36
130 #define ESSSB_IREG_AUXACD		0x38
131 #define ESSSB_IREG_AUXB			0x3a
132 #define ESSSB_IREG_PCSPEAKER		0x3c
133 #define ESSSB_IREG_LINE			0x3e
134 #define ESSSB_IREG_SPATCONTROL		0x50
135 #define ESSSB_IREG_SPATLEVEL		0x52
136 #define ESSSB_IREG_MASTER_LEFT		0x60
137 #define ESSSB_IREG_MASTER_RIGHT		0x62
138 #define ESSSB_IREG_MPU401CONTROL	0x64
139 #define ESSSB_IREG_MICMIXRECORD		0x68
140 #define ESSSB_IREG_AUDIO2RECORD		0x69
141 #define ESSSB_IREG_AUXACDRECORD		0x6a
142 #define ESSSB_IREG_FMRECORD		0x6b
143 #define ESSSB_IREG_AUXBRECORD		0x6c
144 #define ESSSB_IREG_MONO			0x6d
145 #define ESSSB_IREG_LINERECORD		0x6e
146 #define ESSSB_IREG_MONORECORD		0x6f
147 #define ESSSB_IREG_AUDIO2SAMPLE		0x70
148 #define ESSSB_IREG_AUDIO2MODE		0x71
149 #define ESSSB_IREG_AUDIO2FILTER		0x72
150 #define ESSSB_IREG_AUDIO2TCOUNTL	0x74
151 #define ESSSB_IREG_AUDIO2TCOUNTH	0x76
152 #define ESSSB_IREG_AUDIO2CONTROL1	0x78
153 #define ESSSB_IREG_AUDIO2CONTROL2	0x7a
154 #define ESSSB_IREG_AUDIO2		0x7c
155 
156 #define ESSSB_REG_RESET			0x06
157 
158 #define ESSSB_REG_READDATA		0x0a
159 #define ESSSB_REG_WRITEDATA		0x0c
160 #define ESSSB_REG_READSTATUS		0x0c
161 
162 #define ESSSB_REG_STATUS		0x0e
163 
164 #define ESS_CMD_EXTSAMPLERATE		0xa1
165 #define ESS_CMD_FILTERDIV		0xa2
166 #define ESS_CMD_DMACNTRELOADL		0xa4
167 #define ESS_CMD_DMACNTRELOADH		0xa5
168 #define ESS_CMD_ANALOGCONTROL		0xa8
169 #define ESS_CMD_IRQCONTROL		0xb1
170 #define ESS_CMD_DRQCONTROL		0xb2
171 #define ESS_CMD_RECLEVEL		0xb4
172 #define ESS_CMD_SETFORMAT		0xb6
173 #define ESS_CMD_SETFORMAT2		0xb7
174 #define ESS_CMD_DMACONTROL		0xb8
175 #define ESS_CMD_DMATYPE			0xb9
176 #define ESS_CMD_OFFSETLEFT		0xba
177 #define ESS_CMD_OFFSETRIGHT		0xbb
178 #define ESS_CMD_READREG			0xc0
179 #define ESS_CMD_ENABLEEXT		0xc6
180 #define ESS_CMD_PAUSEDMA		0xd0
181 #define ESS_CMD_ENABLEAUDIO1		0xd1
182 #define ESS_CMD_STOPAUDIO1		0xd3
183 #define ESS_CMD_AUDIO1STATUS		0xd8
184 #define ESS_CMD_CONTDMA			0xd4
185 #define ESS_CMD_TESTIRQ			0xf2
186 
187 #define ESS_RECSRC_MIC		0
188 #define ESS_RECSRC_AUXACD	2
189 #define ESS_RECSRC_AUXB		5
190 #define ESS_RECSRC_LINE		6
191 #define ESS_RECSRC_NONE		7
192 
193 #define DAC1 0x01
194 #define ADC1 0x02
195 #define DAC2 0x04
196 
197 /*
198 
199  */
200 
201 typedef struct _snd_es1938 es1938_t;
202 
203 #define SAVED_REG_SIZE	32 /* max. number of registers to save */
204 
205 struct _snd_es1938 {
206 	int irq;
207 
208 	unsigned long io_port;
209 	unsigned long sb_port;
210 	unsigned long vc_port;
211 	unsigned long mpu_port;
212 	unsigned long game_port;
213 	unsigned long ddma_port;
214 
215 	unsigned char irqmask;
216 	unsigned char revision;
217 
218 	snd_kcontrol_t *hw_volume;
219 	snd_kcontrol_t *hw_switch;
220 	snd_kcontrol_t *master_volume;
221 	snd_kcontrol_t *master_switch;
222 
223 	struct pci_dev *pci;
224 	snd_card_t *card;
225 	snd_pcm_t *pcm;
226 	snd_pcm_substream_t *capture_substream;
227 	snd_pcm_substream_t *playback1_substream;
228 	snd_pcm_substream_t *playback2_substream;
229 	snd_kmixer_t *mixer;
230 	snd_rawmidi_t *rmidi;
231 
232 	unsigned int dma1_size;
233 	unsigned int dma2_size;
234 	unsigned int dma1_start;
235 	unsigned int dma2_start;
236 	unsigned int dma1_shift;
237 	unsigned int dma2_shift;
238 	unsigned int active;
239 
240 	spinlock_t reg_lock;
241 	spinlock_t mixer_lock;
242         snd_info_entry_t *proc_entry;
243 
244 #ifdef SUPPORT_JOYSTICK
245 	struct gameport *gameport;
246 #endif
247 #ifdef CONFIG_PM
248 	unsigned char saved_regs[SAVED_REG_SIZE];
249 #endif
250 };
251 
252 static irqreturn_t snd_es1938_interrupt(int irq, void *dev_id, struct pt_regs *regs);
253 
254 static struct pci_device_id snd_es1938_ids[] = {
255         { 0x125d, 0x1969, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, },   /* Solo-1 */
256 	{ 0, }
257 };
258 
259 MODULE_DEVICE_TABLE(pci, snd_es1938_ids);
260 
261 #define RESET_LOOP_TIMEOUT	0x10000
262 #define WRITE_LOOP_TIMEOUT	0x10000
263 #define GET_LOOP_TIMEOUT	0x01000
264 
265 #undef REG_DEBUG
266 /* -----------------------------------------------------------------
267  * Write to a mixer register
268  * -----------------------------------------------------------------*/
269 static void snd_es1938_mixer_write(es1938_t *chip, unsigned char reg, unsigned char val)
270 {
271 	unsigned long flags;
272 	spin_lock_irqsave(&chip->mixer_lock, flags);
273 	outb(reg, SLSB_REG(chip, MIXERADDR));
274 	outb(val, SLSB_REG(chip, MIXERDATA));
275 	spin_unlock_irqrestore(&chip->mixer_lock, flags);
276 #ifdef REG_DEBUG
277 	snd_printk("Mixer reg %02x set to %02x\n", reg, val);
278 #endif
279 }
280 
281 /* -----------------------------------------------------------------
282  * Read from a mixer register
283  * -----------------------------------------------------------------*/
284 static int snd_es1938_mixer_read(es1938_t *chip, unsigned char reg)
285 {
286 	int data;
287 	unsigned long flags;
288 	spin_lock_irqsave(&chip->mixer_lock, flags);
289 	outb(reg, SLSB_REG(chip, MIXERADDR));
290 	data = inb(SLSB_REG(chip, MIXERDATA));
291 	spin_unlock_irqrestore(&chip->mixer_lock, flags);
292 #ifdef REG_DEBUG
293 	snd_printk("Mixer reg %02x now is %02x\n", reg, data);
294 #endif
295 	return data;
296 }
297 
298 /* -----------------------------------------------------------------
299  * Write to some bits of a mixer register (return old value)
300  * -----------------------------------------------------------------*/
301 static int snd_es1938_mixer_bits(es1938_t *chip, unsigned char reg, unsigned char mask, unsigned char val)
302 {
303 	unsigned long flags;
304 	unsigned char old, new, oval;
305 	spin_lock_irqsave(&chip->mixer_lock, flags);
306 	outb(reg, SLSB_REG(chip, MIXERADDR));
307 	old = inb(SLSB_REG(chip, MIXERDATA));
308 	oval = old & mask;
309 	if (val != oval) {
310 		new = (old & ~mask) | (val & mask);
311 		outb(new, SLSB_REG(chip, MIXERDATA));
312 #ifdef REG_DEBUG
313 		snd_printk("Mixer reg %02x was %02x, set to %02x\n", reg, old, new);
314 #endif
315 	}
316 	spin_unlock_irqrestore(&chip->mixer_lock, flags);
317 	return oval;
318 }
319 
320 /* -----------------------------------------------------------------
321  * Write command to Controller Registers
322  * -----------------------------------------------------------------*/
323 static void snd_es1938_write_cmd(es1938_t *chip, unsigned char cmd)
324 {
325 	int i;
326 	unsigned char v;
327 	for (i = 0; i < WRITE_LOOP_TIMEOUT; i++) {
328 		if (!(v = inb(SLSB_REG(chip, READSTATUS)) & 0x80)) {
329 			outb(cmd, SLSB_REG(chip, WRITEDATA));
330 			return;
331 		}
332 	}
333 	printk("snd_es1938_write_cmd timeout (0x02%x/0x02%x)\n", cmd, v);
334 }
335 
336 /* -----------------------------------------------------------------
337  * Read the Read Data Buffer
338  * -----------------------------------------------------------------*/
339 static int snd_es1938_get_byte(es1938_t *chip)
340 {
341 	int i;
342 	unsigned char v;
343 	for (i = GET_LOOP_TIMEOUT; i; i--)
344 		if ((v = inb(SLSB_REG(chip, STATUS))) & 0x80)
345 			return inb(SLSB_REG(chip, READDATA));
346 	snd_printk("get_byte timeout: status 0x02%x\n", v);
347 	return -ENODEV;
348 }
349 
350 /* -----------------------------------------------------------------
351  * Write value cmd register
352  * -----------------------------------------------------------------*/
353 static void snd_es1938_write(es1938_t *chip, unsigned char reg, unsigned char val)
354 {
355 	unsigned long flags;
356 	spin_lock_irqsave(&chip->reg_lock, flags);
357 	snd_es1938_write_cmd(chip, reg);
358 	snd_es1938_write_cmd(chip, val);
359 	spin_unlock_irqrestore(&chip->reg_lock, flags);
360 #ifdef REG_DEBUG
361 	snd_printk("Reg %02x set to %02x\n", reg, val);
362 #endif
363 }
364 
365 /* -----------------------------------------------------------------
366  * Read data from cmd register and return it
367  * -----------------------------------------------------------------*/
368 static unsigned char snd_es1938_read(es1938_t *chip, unsigned char reg)
369 {
370 	unsigned char val;
371 	unsigned long flags;
372 	spin_lock_irqsave(&chip->reg_lock, flags);
373 	snd_es1938_write_cmd(chip, ESS_CMD_READREG);
374 	snd_es1938_write_cmd(chip, reg);
375 	val = snd_es1938_get_byte(chip);
376 	spin_unlock_irqrestore(&chip->reg_lock, flags);
377 #ifdef REG_DEBUG
378 	snd_printk("Reg %02x now is %02x\n", reg, val);
379 #endif
380 	return val;
381 }
382 
383 /* -----------------------------------------------------------------
384  * Write data to cmd register and return old value
385  * -----------------------------------------------------------------*/
386 static int snd_es1938_bits(es1938_t *chip, unsigned char reg, unsigned char mask, unsigned char val)
387 {
388 	unsigned long flags;
389 	unsigned char old, new, oval;
390 	spin_lock_irqsave(&chip->reg_lock, flags);
391 	snd_es1938_write_cmd(chip, ESS_CMD_READREG);
392 	snd_es1938_write_cmd(chip, reg);
393 	old = snd_es1938_get_byte(chip);
394 	oval = old & mask;
395 	if (val != oval) {
396 		snd_es1938_write_cmd(chip, reg);
397 		new = (old & ~mask) | (val & mask);
398 		snd_es1938_write_cmd(chip, new);
399 #ifdef REG_DEBUG
400 		snd_printk("Reg %02x was %02x, set to %02x\n", reg, old, new);
401 #endif
402 	}
403 	spin_unlock_irqrestore(&chip->reg_lock, flags);
404 	return oval;
405 }
406 
407 /* --------------------------------------------------------------------
408  * Reset the chip
409  * --------------------------------------------------------------------*/
410 static void snd_es1938_reset(es1938_t *chip)
411 {
412 	int i;
413 
414 	outb(3, SLSB_REG(chip, RESET));
415 	inb(SLSB_REG(chip, RESET));
416 	outb(0, SLSB_REG(chip, RESET));
417 	for (i = 0; i < RESET_LOOP_TIMEOUT; i++) {
418 		if (inb(SLSB_REG(chip, STATUS)) & 0x80) {
419 			if (inb(SLSB_REG(chip, READDATA)) == 0xaa)
420 				goto __next;
421 		}
422 	}
423 	snd_printk("ESS Solo-1 reset failed\n");
424 
425      __next:
426 	snd_es1938_write_cmd(chip, ESS_CMD_ENABLEEXT);
427 
428 	/* Demand transfer DMA: 4 bytes per DMA request */
429 	snd_es1938_write(chip, ESS_CMD_DMATYPE, 2);
430 
431 	/* Change behaviour of register A1
432 	   4x oversampling
433 	   2nd channel DAC asynchronous */
434 	snd_es1938_mixer_write(chip, ESSSB_IREG_AUDIO2MODE, 0x32);
435 	/* enable/select DMA channel and IRQ channel */
436 	snd_es1938_bits(chip, ESS_CMD_IRQCONTROL, 0xf0, 0x50);
437 	snd_es1938_bits(chip, ESS_CMD_DRQCONTROL, 0xf0, 0x50);
438 	snd_es1938_write_cmd(chip, ESS_CMD_ENABLEAUDIO1);
439 	/* Set spatializer parameters to recommended values */
440 	snd_es1938_mixer_write(chip, 0x54, 0x8f);
441 	snd_es1938_mixer_write(chip, 0x56, 0x95);
442 	snd_es1938_mixer_write(chip, 0x58, 0x94);
443 	snd_es1938_mixer_write(chip, 0x5a, 0x80);
444 }
445 
446 /* --------------------------------------------------------------------
447  * Reset the FIFOs
448  * --------------------------------------------------------------------*/
449 static void snd_es1938_reset_fifo(es1938_t *chip)
450 {
451 	outb(2, SLSB_REG(chip, RESET));
452 	outb(0, SLSB_REG(chip, RESET));
453 }
454 
455 static ratnum_t clocks[2] = {
456 	{
457 		.num = 793800,
458 		.den_min = 1,
459 		.den_max = 128,
460 		.den_step = 1,
461 	},
462 	{
463 		.num = 768000,
464 		.den_min = 1,
465 		.den_max = 128,
466 		.den_step = 1,
467 	}
468 };
469 
470 static snd_pcm_hw_constraint_ratnums_t hw_constraints_clocks = {
471 	.nrats = 2,
472 	.rats = clocks,
473 };
474 
475 
476 static void snd_es1938_rate_set(es1938_t *chip,
477 				snd_pcm_substream_t *substream,
478 				int mode)
479 {
480 	unsigned int bits, div0;
481 	snd_pcm_runtime_t *runtime = substream->runtime;
482 	if (runtime->rate_num == clocks[0].num)
483 		bits = 128 - runtime->rate_den;
484 	else
485 		bits = 256 - runtime->rate_den;
486 
487 	/* set filter register */
488 	div0 = 256 - 7160000*20/(8*82*runtime->rate);
489 
490 	if (mode == DAC2) {
491 		snd_es1938_mixer_write(chip, 0x70, bits);
492 		snd_es1938_mixer_write(chip, 0x72, div0);
493 	} else {
494 		snd_es1938_write(chip, 0xA1, bits);
495 		snd_es1938_write(chip, 0xA2, div0);
496 	}
497 }
498 
499 /* --------------------------------------------------------------------
500  * Configure Solo1 builtin DMA Controller
501  * --------------------------------------------------------------------*/
502 
503 static void snd_es1938_playback1_setdma(es1938_t *chip)
504 {
505 	outb(0x00, SLIO_REG(chip, AUDIO2MODE));
506 	outl(chip->dma2_start, SLIO_REG(chip, AUDIO2DMAADDR));
507 	outw(0, SLIO_REG(chip, AUDIO2DMACOUNT));
508 	outw(chip->dma2_size, SLIO_REG(chip, AUDIO2DMACOUNT));
509 }
510 
511 static void snd_es1938_playback2_setdma(es1938_t *chip)
512 {
513 	/* Enable DMA controller */
514 	outb(0xc4, SLDM_REG(chip, DMACOMMAND));
515 	/* 1. Master reset */
516 	outb(0, SLDM_REG(chip, DMACLEAR));
517 	/* 2. Mask DMA */
518 	outb(1, SLDM_REG(chip, DMAMASK));
519 	outb(0x18, SLDM_REG(chip, DMAMODE));
520 	outl(chip->dma1_start, SLDM_REG(chip, DMAADDR));
521 	outw(chip->dma1_size - 1, SLDM_REG(chip, DMACOUNT));
522 	/* 3. Unmask DMA */
523 	outb(0, SLDM_REG(chip, DMAMASK));
524 }
525 
526 static void snd_es1938_capture_setdma(es1938_t *chip)
527 {
528 	/* Enable DMA controller */
529 	outb(0xc4, SLDM_REG(chip, DMACOMMAND));
530 	/* 1. Master reset */
531 	outb(0, SLDM_REG(chip, DMACLEAR));
532 	/* 2. Mask DMA */
533 	outb(1, SLDM_REG(chip, DMAMASK));
534 	outb(0x14, SLDM_REG(chip, DMAMODE));
535 	outl(chip->dma1_start, SLDM_REG(chip, DMAADDR));
536 	outw(chip->dma1_size - 1, SLDM_REG(chip, DMACOUNT));
537 	/* 3. Unmask DMA */
538 	outb(0, SLDM_REG(chip, DMAMASK));
539 }
540 
541 /* ----------------------------------------------------------------------
542  *
543  *                           *** PCM part ***
544  */
545 
546 static int snd_es1938_capture_trigger(snd_pcm_substream_t * substream,
547 				      int cmd)
548 {
549 	es1938_t *chip = snd_pcm_substream_chip(substream);
550 	int val;
551 	switch (cmd) {
552 	case SNDRV_PCM_TRIGGER_START:
553 		val = 0x0f;
554 		chip->active |= ADC1;
555 		break;
556 	case SNDRV_PCM_TRIGGER_STOP:
557 		val = 0x00;
558 		chip->active &= ~ADC1;
559 		break;
560 	default:
561 		return -EINVAL;
562 	}
563 	snd_es1938_write(chip, ESS_CMD_DMACONTROL, val);
564 	return 0;
565 }
566 
567 static int snd_es1938_playback1_trigger(snd_pcm_substream_t * substream,
568 					int cmd)
569 {
570 	es1938_t *chip = snd_pcm_substream_chip(substream);
571 	switch (cmd) {
572 	case SNDRV_PCM_TRIGGER_START:
573 		/* According to the documentation this should be:
574 		   0x13 but that value may randomly swap stereo channels */
575                 snd_es1938_mixer_write(chip, ESSSB_IREG_AUDIO2CONTROL1, 0x92);
576                 udelay(10);
577 		snd_es1938_mixer_write(chip, ESSSB_IREG_AUDIO2CONTROL1, 0x93);
578                 /* This two stage init gives the FIFO -> DAC connection time to
579                  * settle before first data from DMA flows in.  This should ensure
580                  * no swapping of stereo channels.  Report a bug if otherwise :-) */
581 		outb(0x0a, SLIO_REG(chip, AUDIO2MODE));
582 		chip->active |= DAC2;
583 		break;
584 	case SNDRV_PCM_TRIGGER_STOP:
585 		outb(0, SLIO_REG(chip, AUDIO2MODE));
586 		snd_es1938_mixer_write(chip, ESSSB_IREG_AUDIO2CONTROL1, 0);
587 		chip->active &= ~DAC2;
588 		break;
589 	default:
590 		return -EINVAL;
591 	}
592 	return 0;
593 }
594 
595 static int snd_es1938_playback2_trigger(snd_pcm_substream_t * substream,
596 					int cmd)
597 {
598 	es1938_t *chip = snd_pcm_substream_chip(substream);
599 	int val;
600 	switch (cmd) {
601 	case SNDRV_PCM_TRIGGER_START:
602 		val = 5;
603 		chip->active |= DAC1;
604 		break;
605 	case SNDRV_PCM_TRIGGER_STOP:
606 		val = 0;
607 		chip->active &= ~DAC1;
608 		break;
609 	default:
610 		return -EINVAL;
611 	}
612 	snd_es1938_write(chip, ESS_CMD_DMACONTROL, val);
613 	return 0;
614 }
615 
616 static int snd_es1938_playback_trigger(snd_pcm_substream_t *substream,
617 				       int cmd)
618 {
619 	switch (substream->number) {
620 	case 0:
621 		return snd_es1938_playback1_trigger(substream, cmd);
622 	case 1:
623 		return snd_es1938_playback2_trigger(substream, cmd);
624 	}
625 	snd_BUG();
626 	return -EINVAL;
627 }
628 
629 /* --------------------------------------------------------------------
630  * First channel for Extended Mode Audio 1 ADC Operation
631  * --------------------------------------------------------------------*/
632 static int snd_es1938_capture_prepare(snd_pcm_substream_t * substream)
633 {
634 	es1938_t *chip = snd_pcm_substream_chip(substream);
635 	snd_pcm_runtime_t *runtime = substream->runtime;
636 	int u, is8, mono;
637 	unsigned int size = snd_pcm_lib_buffer_bytes(substream);
638 	unsigned int count = snd_pcm_lib_period_bytes(substream);
639 
640 	chip->dma1_size = size;
641 	chip->dma1_start = runtime->dma_addr;
642 
643 	mono = (runtime->channels > 1) ? 0 : 1;
644 	is8 = snd_pcm_format_width(runtime->format) == 16 ? 0 : 1;
645 	u = snd_pcm_format_unsigned(runtime->format);
646 
647 	chip->dma1_shift = 2 - mono - is8;
648 
649 	snd_es1938_reset_fifo(chip);
650 
651 	/* program type */
652 	snd_es1938_bits(chip, ESS_CMD_ANALOGCONTROL, 0x03, (mono ? 2 : 1));
653 
654 	/* set clock and counters */
655         snd_es1938_rate_set(chip, substream, ADC1);
656 
657 	count = 0x10000 - count;
658 	snd_es1938_write(chip, ESS_CMD_DMACNTRELOADL, count & 0xff);
659 	snd_es1938_write(chip, ESS_CMD_DMACNTRELOADH, count >> 8);
660 
661 	/* initialize and configure ADC */
662 	snd_es1938_write(chip, ESS_CMD_SETFORMAT2, u ? 0x51 : 0x71);
663 	snd_es1938_write(chip, ESS_CMD_SETFORMAT2, 0x90 |
664 		       (u ? 0x00 : 0x20) |
665 		       (is8 ? 0x00 : 0x04) |
666 		       (mono ? 0x40 : 0x08));
667 
668 	//	snd_es1938_reset_fifo(chip);
669 
670 	/* 11. configure system interrupt controller and DMA controller */
671 	snd_es1938_capture_setdma(chip);
672 
673 	return 0;
674 }
675 
676 
677 /* ------------------------------------------------------------------------------
678  * Second Audio channel DAC Operation
679  * ------------------------------------------------------------------------------*/
680 static int snd_es1938_playback1_prepare(snd_pcm_substream_t * substream)
681 {
682 	es1938_t *chip = snd_pcm_substream_chip(substream);
683 	snd_pcm_runtime_t *runtime = substream->runtime;
684 	int u, is8, mono;
685 	unsigned int size = snd_pcm_lib_buffer_bytes(substream);
686 	unsigned int count = snd_pcm_lib_period_bytes(substream);
687 
688 	chip->dma2_size = size;
689 	chip->dma2_start = runtime->dma_addr;
690 
691 	mono = (runtime->channels > 1) ? 0 : 1;
692 	is8 = snd_pcm_format_width(runtime->format) == 16 ? 0 : 1;
693 	u = snd_pcm_format_unsigned(runtime->format);
694 
695 	chip->dma2_shift = 2 - mono - is8;
696 
697         snd_es1938_reset_fifo(chip);
698 
699 	/* set clock and counters */
700         snd_es1938_rate_set(chip, substream, DAC2);
701 
702 	count >>= 1;
703 	count = 0x10000 - count;
704 	snd_es1938_mixer_write(chip, ESSSB_IREG_AUDIO2TCOUNTL, count & 0xff);
705 	snd_es1938_mixer_write(chip, ESSSB_IREG_AUDIO2TCOUNTH, count >> 8);
706 
707 	/* initialize and configure Audio 2 DAC */
708 	snd_es1938_mixer_write(chip, ESSSB_IREG_AUDIO2CONTROL2, 0x40 | (u ? 0 : 4) | (mono ? 0 : 2) | (is8 ? 0 : 1));
709 
710 	/* program DMA */
711 	snd_es1938_playback1_setdma(chip);
712 
713 	return 0;
714 }
715 
716 static int snd_es1938_playback2_prepare(snd_pcm_substream_t * substream)
717 {
718 	es1938_t *chip = snd_pcm_substream_chip(substream);
719 	snd_pcm_runtime_t *runtime = substream->runtime;
720 	int u, is8, mono;
721 	unsigned int size = snd_pcm_lib_buffer_bytes(substream);
722 	unsigned int count = snd_pcm_lib_period_bytes(substream);
723 
724 	chip->dma1_size = size;
725 	chip->dma1_start = runtime->dma_addr;
726 
727 	mono = (runtime->channels > 1) ? 0 : 1;
728 	is8 = snd_pcm_format_width(runtime->format) == 16 ? 0 : 1;
729 	u = snd_pcm_format_unsigned(runtime->format);
730 
731 	chip->dma1_shift = 2 - mono - is8;
732 
733 	count = 0x10000 - count;
734 
735 	/* reset */
736 	snd_es1938_reset_fifo(chip);
737 
738 	snd_es1938_bits(chip, ESS_CMD_ANALOGCONTROL, 0x03, (mono ? 2 : 1));
739 
740 	/* set clock and counters */
741         snd_es1938_rate_set(chip, substream, DAC1);
742 	snd_es1938_write(chip, ESS_CMD_DMACNTRELOADL, count & 0xff);
743 	snd_es1938_write(chip, ESS_CMD_DMACNTRELOADH, count >> 8);
744 
745 	/* initialized and configure DAC */
746         snd_es1938_write(chip, ESS_CMD_SETFORMAT, u ? 0x80 : 0x00);
747         snd_es1938_write(chip, ESS_CMD_SETFORMAT, u ? 0x51 : 0x71);
748         snd_es1938_write(chip, ESS_CMD_SETFORMAT2,
749 			 0x90 | (mono ? 0x40 : 0x08) |
750 			 (is8 ? 0x00 : 0x04) | (u ? 0x00 : 0x20));
751 
752 	/* program DMA */
753 	snd_es1938_playback2_setdma(chip);
754 
755 	return 0;
756 }
757 
758 static int snd_es1938_playback_prepare(snd_pcm_substream_t *substream)
759 {
760 	switch (substream->number) {
761 	case 0:
762 		return snd_es1938_playback1_prepare(substream);
763 	case 1:
764 		return snd_es1938_playback2_prepare(substream);
765 	}
766 	snd_BUG();
767 	return -EINVAL;
768 }
769 
770 static snd_pcm_uframes_t snd_es1938_capture_pointer(snd_pcm_substream_t * substream)
771 {
772 	es1938_t *chip = snd_pcm_substream_chip(substream);
773 	size_t ptr;
774 	size_t old, new;
775 #if 1
776 	/* This stuff is *needed*, don't ask why - AB */
777 	old = inw(SLDM_REG(chip, DMACOUNT));
778 	while ((new = inw(SLDM_REG(chip, DMACOUNT))) != old)
779 		old = new;
780 	ptr = chip->dma1_size - 1 - new;
781 #else
782 	ptr = inl(SLDM_REG(chip, DMAADDR)) - chip->dma1_start;
783 #endif
784 	return ptr >> chip->dma1_shift;
785 }
786 
787 static snd_pcm_uframes_t snd_es1938_playback1_pointer(snd_pcm_substream_t * substream)
788 {
789 	es1938_t *chip = snd_pcm_substream_chip(substream);
790 	size_t ptr;
791 #if 1
792 	ptr = chip->dma2_size - inw(SLIO_REG(chip, AUDIO2DMACOUNT));
793 #else
794 	ptr = inl(SLIO_REG(chip, AUDIO2DMAADDR)) - chip->dma2_start;
795 #endif
796 	return ptr >> chip->dma2_shift;
797 }
798 
799 static snd_pcm_uframes_t snd_es1938_playback2_pointer(snd_pcm_substream_t * substream)
800 {
801 	es1938_t *chip = snd_pcm_substream_chip(substream);
802 	size_t ptr;
803 	size_t old, new;
804 #if 1
805 	/* This stuff is *needed*, don't ask why - AB */
806 	old = inw(SLDM_REG(chip, DMACOUNT));
807 	while ((new = inw(SLDM_REG(chip, DMACOUNT))) != old)
808 		old = new;
809 	ptr = chip->dma1_size - 1 - new;
810 #else
811 	ptr = inl(SLDM_REG(chip, DMAADDR)) - chip->dma1_start;
812 #endif
813 	return ptr >> chip->dma1_shift;
814 }
815 
816 static snd_pcm_uframes_t snd_es1938_playback_pointer(snd_pcm_substream_t *substream)
817 {
818 	switch (substream->number) {
819 	case 0:
820 		return snd_es1938_playback1_pointer(substream);
821 	case 1:
822 		return snd_es1938_playback2_pointer(substream);
823 	}
824 	snd_BUG();
825 	return -EINVAL;
826 }
827 
828 static int snd_es1938_capture_copy(snd_pcm_substream_t *substream,
829 				   int channel,
830 				   snd_pcm_uframes_t pos,
831 				   void __user *dst,
832 				   snd_pcm_uframes_t count)
833 {
834 	snd_pcm_runtime_t *runtime = substream->runtime;
835 	es1938_t *chip = snd_pcm_substream_chip(substream);
836 	pos <<= chip->dma1_shift;
837 	count <<= chip->dma1_shift;
838 	snd_assert(pos + count <= chip->dma1_size, return -EINVAL);
839 	if (pos + count < chip->dma1_size) {
840 		if (copy_to_user(dst, runtime->dma_area + pos + 1, count))
841 			return -EFAULT;
842 	} else {
843 		if (copy_to_user(dst, runtime->dma_area + pos + 1, count - 1))
844 			return -EFAULT;
845 		if (put_user(runtime->dma_area[0], ((unsigned char __user *)dst) + count - 1))
846 			return -EFAULT;
847 	}
848 	return 0;
849 }
850 
851 /*
852  * buffer management
853  */
854 static int snd_es1938_pcm_hw_params(snd_pcm_substream_t *substream,
855 				    snd_pcm_hw_params_t * hw_params)
856 
857 {
858 	int err;
859 
860 	if ((err = snd_pcm_lib_malloc_pages(substream, params_buffer_bytes(hw_params))) < 0)
861 		return err;
862 	return 0;
863 }
864 
865 static int snd_es1938_pcm_hw_free(snd_pcm_substream_t *substream)
866 {
867 	return snd_pcm_lib_free_pages(substream);
868 }
869 
870 /* ----------------------------------------------------------------------
871  * Audio1 Capture (ADC)
872  * ----------------------------------------------------------------------*/
873 static snd_pcm_hardware_t snd_es1938_capture =
874 {
875 	.info =			(SNDRV_PCM_INFO_INTERLEAVED |
876 				SNDRV_PCM_INFO_BLOCK_TRANSFER),
877 	.formats =		SNDRV_PCM_FMTBIT_U8 | SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S8 | SNDRV_PCM_FMTBIT_U16_LE,
878 	.rates =		SNDRV_PCM_RATE_CONTINUOUS | SNDRV_PCM_RATE_8000_48000,
879 	.rate_min =		6000,
880 	.rate_max =		48000,
881 	.channels_min =		1,
882 	.channels_max =		2,
883         .buffer_bytes_max =	0x8000,       /* DMA controller screws on higher values */
884 	.period_bytes_min =	64,
885 	.period_bytes_max =	0x8000,
886 	.periods_min =		1,
887 	.periods_max =		1024,
888 	.fifo_size =		256,
889 };
890 
891 /* -----------------------------------------------------------------------
892  * Audio2 Playback (DAC)
893  * -----------------------------------------------------------------------*/
894 static snd_pcm_hardware_t snd_es1938_playback =
895 {
896 	.info =			(SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_INTERLEAVED |
897 				 SNDRV_PCM_INFO_BLOCK_TRANSFER |
898 				 SNDRV_PCM_INFO_MMAP_VALID),
899 	.formats =		SNDRV_PCM_FMTBIT_U8 | SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S8 | SNDRV_PCM_FMTBIT_U16_LE,
900 	.rates =		SNDRV_PCM_RATE_CONTINUOUS | SNDRV_PCM_RATE_8000_48000,
901 	.rate_min =		6000,
902 	.rate_max =		48000,
903 	.channels_min =		1,
904 	.channels_max =		2,
905         .buffer_bytes_max =	0x8000,       /* DMA controller screws on higher values */
906 	.period_bytes_min =	64,
907 	.period_bytes_max =	0x8000,
908 	.periods_min =		1,
909 	.periods_max =		1024,
910 	.fifo_size =		256,
911 };
912 
913 static int snd_es1938_capture_open(snd_pcm_substream_t * substream)
914 {
915 	es1938_t *chip = snd_pcm_substream_chip(substream);
916 	snd_pcm_runtime_t *runtime = substream->runtime;
917 
918 	if (chip->playback2_substream)
919 		return -EAGAIN;
920 	chip->capture_substream = substream;
921 	runtime->hw = snd_es1938_capture;
922 	snd_pcm_hw_constraint_ratnums(runtime, 0, SNDRV_PCM_HW_PARAM_RATE,
923 				      &hw_constraints_clocks);
924 	snd_pcm_hw_constraint_minmax(runtime, SNDRV_PCM_HW_PARAM_BUFFER_BYTES, 0, 0xff00);
925 	return 0;
926 }
927 
928 static int snd_es1938_playback_open(snd_pcm_substream_t * substream)
929 {
930 	es1938_t *chip = snd_pcm_substream_chip(substream);
931 	snd_pcm_runtime_t *runtime = substream->runtime;
932 
933 	switch (substream->number) {
934 	case 0:
935 		chip->playback1_substream = substream;
936 		break;
937 	case 1:
938 		if (chip->capture_substream)
939 			return -EAGAIN;
940 		chip->playback2_substream = substream;
941 		break;
942 	default:
943 		snd_BUG();
944 		return -EINVAL;
945 	}
946 	runtime->hw = snd_es1938_playback;
947 	snd_pcm_hw_constraint_ratnums(runtime, 0, SNDRV_PCM_HW_PARAM_RATE,
948 				      &hw_constraints_clocks);
949 	snd_pcm_hw_constraint_minmax(runtime, SNDRV_PCM_HW_PARAM_BUFFER_BYTES, 0, 0xff00);
950 	return 0;
951 }
952 
953 static int snd_es1938_capture_close(snd_pcm_substream_t * substream)
954 {
955 	es1938_t *chip = snd_pcm_substream_chip(substream);
956 
957 	chip->capture_substream = NULL;
958 	return 0;
959 }
960 
961 static int snd_es1938_playback_close(snd_pcm_substream_t * substream)
962 {
963 	es1938_t *chip = snd_pcm_substream_chip(substream);
964 
965 	switch (substream->number) {
966 	case 0:
967 		chip->playback1_substream = NULL;
968 		break;
969 	case 1:
970 		chip->playback2_substream = NULL;
971 		break;
972 	default:
973 		snd_BUG();
974 		return -EINVAL;
975 	}
976 	return 0;
977 }
978 
979 static snd_pcm_ops_t snd_es1938_playback_ops = {
980 	.open =		snd_es1938_playback_open,
981 	.close =	snd_es1938_playback_close,
982 	.ioctl =	snd_pcm_lib_ioctl,
983 	.hw_params =	snd_es1938_pcm_hw_params,
984 	.hw_free =	snd_es1938_pcm_hw_free,
985 	.prepare =	snd_es1938_playback_prepare,
986 	.trigger =	snd_es1938_playback_trigger,
987 	.pointer =	snd_es1938_playback_pointer,
988 };
989 
990 static snd_pcm_ops_t snd_es1938_capture_ops = {
991 	.open =		snd_es1938_capture_open,
992 	.close =	snd_es1938_capture_close,
993 	.ioctl =	snd_pcm_lib_ioctl,
994 	.hw_params =	snd_es1938_pcm_hw_params,
995 	.hw_free =	snd_es1938_pcm_hw_free,
996 	.prepare =	snd_es1938_capture_prepare,
997 	.trigger =	snd_es1938_capture_trigger,
998 	.pointer =	snd_es1938_capture_pointer,
999 	.copy =		snd_es1938_capture_copy,
1000 };
1001 
1002 static void snd_es1938_free_pcm(snd_pcm_t *pcm)
1003 {
1004 	snd_pcm_lib_preallocate_free_for_all(pcm);
1005 }
1006 
1007 static int __devinit snd_es1938_new_pcm(es1938_t *chip, int device)
1008 {
1009 	snd_pcm_t *pcm;
1010 	int err;
1011 
1012 	if ((err = snd_pcm_new(chip->card, "es-1938-1946", device, 2, 1, &pcm)) < 0)
1013 		return err;
1014 	snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &snd_es1938_playback_ops);
1015 	snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &snd_es1938_capture_ops);
1016 
1017 	pcm->private_data = chip;
1018 	pcm->private_free = snd_es1938_free_pcm;
1019 	pcm->info_flags = 0;
1020 	strcpy(pcm->name, "ESS Solo-1");
1021 
1022 	snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_DEV,
1023 					      snd_dma_pci_data(chip->pci), 64*1024, 64*1024);
1024 
1025 	chip->pcm = pcm;
1026 	return 0;
1027 }
1028 
1029 /* -------------------------------------------------------------------
1030  *
1031  *                       *** Mixer part ***
1032  */
1033 
1034 static int snd_es1938_info_mux(snd_kcontrol_t *kcontrol, snd_ctl_elem_info_t * uinfo)
1035 {
1036 	static char *texts[8] = {
1037 		"Mic", "Mic Master", "CD", "AOUT",
1038 		"Mic1", "Mix", "Line", "Master"
1039 	};
1040 
1041 	uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
1042 	uinfo->count = 1;
1043 	uinfo->value.enumerated.items = 8;
1044 	if (uinfo->value.enumerated.item > 7)
1045 		uinfo->value.enumerated.item = 7;
1046 	strcpy(uinfo->value.enumerated.name, texts[uinfo->value.enumerated.item]);
1047 	return 0;
1048 }
1049 
1050 static int snd_es1938_get_mux(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_t * ucontrol)
1051 {
1052 	es1938_t *chip = snd_kcontrol_chip(kcontrol);
1053 	ucontrol->value.enumerated.item[0] = snd_es1938_mixer_read(chip, 0x1c) & 0x07;
1054 	return 0;
1055 }
1056 
1057 static int snd_es1938_put_mux(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_t * ucontrol)
1058 {
1059 	es1938_t *chip = snd_kcontrol_chip(kcontrol);
1060 	unsigned char val = ucontrol->value.enumerated.item[0];
1061 
1062 	if (val > 7)
1063 		return -EINVAL;
1064 	return snd_es1938_mixer_bits(chip, 0x1c, 0x07, val) != val;
1065 }
1066 
1067 static int snd_es1938_info_spatializer_enable(snd_kcontrol_t *kcontrol, snd_ctl_elem_info_t * uinfo)
1068 {
1069 	uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN;
1070 	uinfo->count = 1;
1071 	uinfo->value.integer.min = 0;
1072 	uinfo->value.integer.max = 1;
1073 	return 0;
1074 }
1075 
1076 static int snd_es1938_get_spatializer_enable(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_t * ucontrol)
1077 {
1078 	es1938_t *chip = snd_kcontrol_chip(kcontrol);
1079 	unsigned char val = snd_es1938_mixer_read(chip, 0x50);
1080 	ucontrol->value.integer.value[0] = !!(val & 8);
1081 	return 0;
1082 }
1083 
1084 static int snd_es1938_put_spatializer_enable(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_t * ucontrol)
1085 {
1086 	es1938_t *chip = snd_kcontrol_chip(kcontrol);
1087 	unsigned char oval, nval;
1088 	int change;
1089 	nval = ucontrol->value.integer.value[0] ? 0x0c : 0x04;
1090 	oval = snd_es1938_mixer_read(chip, 0x50) & 0x0c;
1091 	change = nval != oval;
1092 	if (change) {
1093 		snd_es1938_mixer_write(chip, 0x50, nval & ~0x04);
1094 		snd_es1938_mixer_write(chip, 0x50, nval);
1095 	}
1096 	return change;
1097 }
1098 
1099 static int snd_es1938_info_hw_volume(snd_kcontrol_t *kcontrol, snd_ctl_elem_info_t * uinfo)
1100 {
1101 	uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
1102 	uinfo->count = 2;
1103 	uinfo->value.integer.min = 0;
1104 	uinfo->value.integer.max = 63;
1105 	return 0;
1106 }
1107 
1108 static int snd_es1938_get_hw_volume(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_t * ucontrol)
1109 {
1110 	es1938_t *chip = snd_kcontrol_chip(kcontrol);
1111 	ucontrol->value.integer.value[0] = snd_es1938_mixer_read(chip, 0x61) & 0x3f;
1112 	ucontrol->value.integer.value[1] = snd_es1938_mixer_read(chip, 0x63) & 0x3f;
1113 	return 0;
1114 }
1115 
1116 static int snd_es1938_info_hw_switch(snd_kcontrol_t *kcontrol, snd_ctl_elem_info_t * uinfo)
1117 {
1118 	uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN;
1119 	uinfo->count = 2;
1120 	uinfo->value.integer.min = 0;
1121 	uinfo->value.integer.max = 1;
1122 	return 0;
1123 }
1124 
1125 static int snd_es1938_get_hw_switch(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_t * ucontrol)
1126 {
1127 	es1938_t *chip = snd_kcontrol_chip(kcontrol);
1128 	ucontrol->value.integer.value[0] = !(snd_es1938_mixer_read(chip, 0x61) & 0x40);
1129 	ucontrol->value.integer.value[1] = !(snd_es1938_mixer_read(chip, 0x63) & 0x40);
1130 	return 0;
1131 }
1132 
1133 static void snd_es1938_hwv_free(snd_kcontrol_t *kcontrol)
1134 {
1135 	es1938_t *chip = snd_kcontrol_chip(kcontrol);
1136 	chip->master_volume = NULL;
1137 	chip->master_switch = NULL;
1138 	chip->hw_volume = NULL;
1139 	chip->hw_switch = NULL;
1140 }
1141 
1142 static int snd_es1938_reg_bits(es1938_t *chip, unsigned char reg,
1143 			       unsigned char mask, unsigned char val)
1144 {
1145 	if (reg < 0xa0)
1146 		return snd_es1938_mixer_bits(chip, reg, mask, val);
1147 	else
1148 		return snd_es1938_bits(chip, reg, mask, val);
1149 }
1150 
1151 static int snd_es1938_reg_read(es1938_t *chip, unsigned char reg)
1152 {
1153 	if (reg < 0xa0)
1154 		return snd_es1938_mixer_read(chip, reg);
1155 	else
1156 		return snd_es1938_read(chip, reg);
1157 }
1158 
1159 #define ES1938_SINGLE(xname, xindex, reg, shift, mask, invert) \
1160 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = xindex, \
1161   .info = snd_es1938_info_single, \
1162   .get = snd_es1938_get_single, .put = snd_es1938_put_single, \
1163   .private_value = reg | (shift << 8) | (mask << 16) | (invert << 24) }
1164 
1165 static int snd_es1938_info_single(snd_kcontrol_t *kcontrol, snd_ctl_elem_info_t * uinfo)
1166 {
1167 	int mask = (kcontrol->private_value >> 16) & 0xff;
1168 
1169 	uinfo->type = mask == 1 ? SNDRV_CTL_ELEM_TYPE_BOOLEAN : SNDRV_CTL_ELEM_TYPE_INTEGER;
1170 	uinfo->count = 1;
1171 	uinfo->value.integer.min = 0;
1172 	uinfo->value.integer.max = mask;
1173 	return 0;
1174 }
1175 
1176 static int snd_es1938_get_single(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_t * ucontrol)
1177 {
1178 	es1938_t *chip = snd_kcontrol_chip(kcontrol);
1179 	int reg = kcontrol->private_value & 0xff;
1180 	int shift = (kcontrol->private_value >> 8) & 0xff;
1181 	int mask = (kcontrol->private_value >> 16) & 0xff;
1182 	int invert = (kcontrol->private_value >> 24) & 0xff;
1183 	int val;
1184 
1185 	val = snd_es1938_reg_read(chip, reg);
1186 	ucontrol->value.integer.value[0] = (val >> shift) & mask;
1187 	if (invert)
1188 		ucontrol->value.integer.value[0] = mask - ucontrol->value.integer.value[0];
1189 	return 0;
1190 }
1191 
1192 static int snd_es1938_put_single(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_t * ucontrol)
1193 {
1194 	es1938_t *chip = snd_kcontrol_chip(kcontrol);
1195 	int reg = kcontrol->private_value & 0xff;
1196 	int shift = (kcontrol->private_value >> 8) & 0xff;
1197 	int mask = (kcontrol->private_value >> 16) & 0xff;
1198 	int invert = (kcontrol->private_value >> 24) & 0xff;
1199 	unsigned char val;
1200 
1201 	val = (ucontrol->value.integer.value[0] & mask);
1202 	if (invert)
1203 		val = mask - val;
1204 	mask <<= shift;
1205 	val <<= shift;
1206 	return snd_es1938_reg_bits(chip, reg, mask, val) != val;
1207 }
1208 
1209 #define ES1938_DOUBLE(xname, xindex, left_reg, right_reg, shift_left, shift_right, mask, invert) \
1210 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = xindex, \
1211   .info = snd_es1938_info_double, \
1212   .get = snd_es1938_get_double, .put = snd_es1938_put_double, \
1213   .private_value = left_reg | (right_reg << 8) | (shift_left << 16) | (shift_right << 19) | (mask << 24) | (invert << 22) }
1214 
1215 static int snd_es1938_info_double(snd_kcontrol_t *kcontrol, snd_ctl_elem_info_t * uinfo)
1216 {
1217 	int mask = (kcontrol->private_value >> 24) & 0xff;
1218 
1219 	uinfo->type = mask == 1 ? SNDRV_CTL_ELEM_TYPE_BOOLEAN : SNDRV_CTL_ELEM_TYPE_INTEGER;
1220 	uinfo->count = 2;
1221 	uinfo->value.integer.min = 0;
1222 	uinfo->value.integer.max = mask;
1223 	return 0;
1224 }
1225 
1226 static int snd_es1938_get_double(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_t * ucontrol)
1227 {
1228 	es1938_t *chip = snd_kcontrol_chip(kcontrol);
1229 	int left_reg = kcontrol->private_value & 0xff;
1230 	int right_reg = (kcontrol->private_value >> 8) & 0xff;
1231 	int shift_left = (kcontrol->private_value >> 16) & 0x07;
1232 	int shift_right = (kcontrol->private_value >> 19) & 0x07;
1233 	int mask = (kcontrol->private_value >> 24) & 0xff;
1234 	int invert = (kcontrol->private_value >> 22) & 1;
1235 	unsigned char left, right;
1236 
1237 	left = snd_es1938_reg_read(chip, left_reg);
1238 	if (left_reg != right_reg)
1239 		right = snd_es1938_reg_read(chip, right_reg);
1240 	else
1241 		right = left;
1242 	ucontrol->value.integer.value[0] = (left >> shift_left) & mask;
1243 	ucontrol->value.integer.value[1] = (right >> shift_right) & mask;
1244 	if (invert) {
1245 		ucontrol->value.integer.value[0] = mask - ucontrol->value.integer.value[0];
1246 		ucontrol->value.integer.value[1] = mask - ucontrol->value.integer.value[1];
1247 	}
1248 	return 0;
1249 }
1250 
1251 static int snd_es1938_put_double(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_t * ucontrol)
1252 {
1253 	es1938_t *chip = snd_kcontrol_chip(kcontrol);
1254 	int left_reg = kcontrol->private_value & 0xff;
1255 	int right_reg = (kcontrol->private_value >> 8) & 0xff;
1256 	int shift_left = (kcontrol->private_value >> 16) & 0x07;
1257 	int shift_right = (kcontrol->private_value >> 19) & 0x07;
1258 	int mask = (kcontrol->private_value >> 24) & 0xff;
1259 	int invert = (kcontrol->private_value >> 22) & 1;
1260 	int change;
1261 	unsigned char val1, val2, mask1, mask2;
1262 
1263 	val1 = ucontrol->value.integer.value[0] & mask;
1264 	val2 = ucontrol->value.integer.value[1] & mask;
1265 	if (invert) {
1266 		val1 = mask - val1;
1267 		val2 = mask - val2;
1268 	}
1269 	val1 <<= shift_left;
1270 	val2 <<= shift_right;
1271 	mask1 = mask << shift_left;
1272 	mask2 = mask << shift_right;
1273 	if (left_reg != right_reg) {
1274 		change = 0;
1275 		if (snd_es1938_reg_bits(chip, left_reg, mask1, val1) != val1)
1276 			change = 1;
1277 		if (snd_es1938_reg_bits(chip, right_reg, mask2, val2) != val2)
1278 			change = 1;
1279 	} else {
1280 		change = (snd_es1938_reg_bits(chip, left_reg, mask1 | mask2,
1281 					      val1 | val2) != (val1 | val2));
1282 	}
1283 	return change;
1284 }
1285 
1286 static snd_kcontrol_new_t snd_es1938_controls[] = {
1287 ES1938_DOUBLE("Master Playback Volume", 0, 0x60, 0x62, 0, 0, 63, 0),
1288 ES1938_DOUBLE("Master Playback Switch", 0, 0x60, 0x62, 6, 6, 1, 1),
1289 {
1290 	.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
1291 	.name = "Hardware Master Playback Volume",
1292 	.access = SNDRV_CTL_ELEM_ACCESS_READ,
1293 	.info = snd_es1938_info_hw_volume,
1294 	.get = snd_es1938_get_hw_volume,
1295 },
1296 {
1297 	.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
1298 	.name = "Hardware Master Playback Switch",
1299 	.access = SNDRV_CTL_ELEM_ACCESS_READ,
1300 	.info = snd_es1938_info_hw_switch,
1301 	.get = snd_es1938_get_hw_switch,
1302 },
1303 ES1938_SINGLE("Hardware Volume Split", 0, 0x64, 7, 1, 0),
1304 ES1938_DOUBLE("Line Playback Volume", 0, 0x3e, 0x3e, 4, 0, 15, 0),
1305 ES1938_DOUBLE("CD Playback Volume", 0, 0x38, 0x38, 4, 0, 15, 0),
1306 ES1938_DOUBLE("FM Playback Volume", 0, 0x36, 0x36, 4, 0, 15, 0),
1307 ES1938_DOUBLE("Mono Playback Volume", 0, 0x6d, 0x6d, 4, 0, 15, 0),
1308 ES1938_DOUBLE("Mic Playback Volume", 0, 0x1a, 0x1a, 4, 0, 15, 0),
1309 ES1938_DOUBLE("Aux Playback Volume", 0, 0x3a, 0x3a, 4, 0, 15, 0),
1310 ES1938_DOUBLE("Capture Volume", 0, 0xb4, 0xb4, 4, 0, 15, 0),
1311 ES1938_SINGLE("PC Speaker Volume", 0, 0x3c, 0, 7, 0),
1312 ES1938_SINGLE("Record Monitor", 0, 0xa8, 3, 1, 0),
1313 ES1938_SINGLE("Capture Switch", 0, 0x1c, 4, 1, 1),
1314 {
1315 	.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
1316 	.name = "Capture Source",
1317 	.info = snd_es1938_info_mux,
1318 	.get = snd_es1938_get_mux,
1319 	.put = snd_es1938_put_mux,
1320 },
1321 ES1938_DOUBLE("Mono Input Playback Volume", 0, 0x6d, 0x6d, 4, 0, 15, 0),
1322 ES1938_DOUBLE("PCM Capture Volume", 0, 0x69, 0x69, 4, 0, 15, 0),
1323 ES1938_DOUBLE("Mic Capture Volume", 0, 0x68, 0x68, 4, 0, 15, 0),
1324 ES1938_DOUBLE("Line Capture Volume", 0, 0x6e, 0x6e, 4, 0, 15, 0),
1325 ES1938_DOUBLE("FM Capture Volume", 0, 0x6b, 0x6b, 4, 0, 15, 0),
1326 ES1938_DOUBLE("Mono Capture Volume", 0, 0x6f, 0x6f, 4, 0, 15, 0),
1327 ES1938_DOUBLE("CD Capture Volume", 0, 0x6a, 0x6a, 4, 0, 15, 0),
1328 ES1938_DOUBLE("Aux Capture Volume", 0, 0x6c, 0x6c, 4, 0, 15, 0),
1329 ES1938_DOUBLE("PCM Playback Volume", 0, 0x7c, 0x7c, 4, 0, 15, 0),
1330 ES1938_DOUBLE("PCM Playback Volume", 1, 0x14, 0x14, 4, 0, 15, 0),
1331 ES1938_SINGLE("3D Control - Level", 0, 0x52, 0, 63, 0),
1332 {
1333 	.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
1334 	.name = "3D Control - Switch",
1335 	.info = snd_es1938_info_spatializer_enable,
1336 	.get = snd_es1938_get_spatializer_enable,
1337 	.put = snd_es1938_put_spatializer_enable,
1338 },
1339 ES1938_SINGLE("Mic Boost (+26dB)", 0, 0x7d, 3, 1, 0)
1340 };
1341 
1342 
1343 /* ---------------------------------------------------------------------------- */
1344 /* ---------------------------------------------------------------------------- */
1345 
1346 /*
1347  * initialize the chip - used by resume callback, too
1348  */
1349 static void snd_es1938_chip_init(es1938_t *chip)
1350 {
1351 	/* reset chip */
1352 	snd_es1938_reset(chip);
1353 
1354 	/* configure native mode */
1355 
1356 	/* enable bus master */
1357 	pci_set_master(chip->pci);
1358 
1359 	/* disable legacy audio */
1360 	pci_write_config_word(chip->pci, SL_PCI_LEGACYCONTROL, 0x805f);
1361 
1362 	/* set DDMA base */
1363 	pci_write_config_word(chip->pci, SL_PCI_DDMACONTROL, chip->ddma_port | 1);
1364 
1365 	/* set DMA/IRQ policy */
1366 	pci_write_config_dword(chip->pci, SL_PCI_CONFIG, 0);
1367 
1368 	/* enable Audio 1, Audio 2, MPU401 IRQ and HW volume IRQ*/
1369 	outb(0xf0, SLIO_REG(chip, IRQCONTROL));
1370 
1371 	/* reset DMA */
1372 	outb(0, SLDM_REG(chip, DMACLEAR));
1373 }
1374 
1375 #ifdef CONFIG_PM
1376 /*
1377  * PM support
1378  */
1379 
1380 static unsigned char saved_regs[SAVED_REG_SIZE+1] = {
1381 	0x14, 0x1a, 0x1c, 0x3a, 0x3c, 0x3e, 0x36, 0x38,
1382 	0x50, 0x52, 0x60, 0x61, 0x62, 0x63, 0x64, 0x68,
1383 	0x69, 0x6a, 0x6b, 0x6d, 0x6e, 0x6f, 0x7c, 0x7d,
1384 	0xa8, 0xb4,
1385 };
1386 
1387 
1388 static int es1938_suspend(snd_card_t *card, pm_message_t state)
1389 {
1390 	es1938_t *chip = card->pm_private_data;
1391 	unsigned char *s, *d;
1392 
1393 	snd_pcm_suspend_all(chip->pcm);
1394 
1395 	/* save mixer-related registers */
1396 	for (s = saved_regs, d = chip->saved_regs; *s; s++, d++)
1397 		*d = snd_es1938_reg_read(chip, *s);
1398 
1399 	outb(0x00, SLIO_REG(chip, IRQCONTROL)); /* disable irqs */
1400 
1401 	pci_disable_device(chip->pci);
1402 	return 0;
1403 }
1404 
1405 static int es1938_resume(snd_card_t *card)
1406 {
1407 	es1938_t *chip = card->pm_private_data;
1408 	unsigned char *s, *d;
1409 
1410 	pci_enable_device(chip->pci);
1411 	snd_es1938_chip_init(chip);
1412 
1413 	/* restore mixer-related registers */
1414 	for (s = saved_regs, d = chip->saved_regs; *s; s++, d++) {
1415 		if (*s < 0xa0)
1416 			snd_es1938_mixer_write(chip, *s, *d);
1417 		else
1418 			snd_es1938_write(chip, *s, *d);
1419 	}
1420 
1421 	return 0;
1422 }
1423 #endif /* CONFIG_PM */
1424 
1425 #ifdef SUPPORT_JOYSTICK
1426 static int __devinit snd_es1938_create_gameport(es1938_t *chip)
1427 {
1428 	struct gameport *gp;
1429 
1430 	chip->gameport = gp = gameport_allocate_port();
1431 	if (!gp) {
1432 		printk(KERN_ERR "es1938: cannot allocate memory for gameport\n");
1433 		return -ENOMEM;
1434 	}
1435 
1436 	gameport_set_name(gp, "ES1938");
1437 	gameport_set_phys(gp, "pci%s/gameport0", pci_name(chip->pci));
1438 	gameport_set_dev_parent(gp, &chip->pci->dev);
1439 	gp->io = chip->game_port;
1440 
1441 	gameport_register_port(gp);
1442 
1443 	return 0;
1444 }
1445 
1446 static void snd_es1938_free_gameport(es1938_t *chip)
1447 {
1448 	if (chip->gameport) {
1449 		gameport_unregister_port(chip->gameport);
1450 		chip->gameport = NULL;
1451 	}
1452 }
1453 #else
1454 static inline int snd_es1938_create_gameport(es1938_t *chip) { return -ENOSYS; }
1455 static inline void snd_es1938_free_gameport(es1938_t *chip) { }
1456 #endif /* SUPPORT_JOYSTICK */
1457 
1458 static int snd_es1938_free(es1938_t *chip)
1459 {
1460 	/* disable irqs */
1461 	outb(0x00, SLIO_REG(chip, IRQCONTROL));
1462 	if (chip->rmidi)
1463 		snd_es1938_mixer_bits(chip, ESSSB_IREG_MPU401CONTROL, 0x40, 0);
1464 
1465 	snd_es1938_free_gameport(chip);
1466 
1467 	if (chip->irq >= 0)
1468 		free_irq(chip->irq, (void *)chip);
1469 	pci_release_regions(chip->pci);
1470 	pci_disable_device(chip->pci);
1471 	kfree(chip);
1472 	return 0;
1473 }
1474 
1475 static int snd_es1938_dev_free(snd_device_t *device)
1476 {
1477 	es1938_t *chip = device->device_data;
1478 	return snd_es1938_free(chip);
1479 }
1480 
1481 static int __devinit snd_es1938_create(snd_card_t * card,
1482 				    struct pci_dev * pci,
1483 				    es1938_t ** rchip)
1484 {
1485 	es1938_t *chip;
1486 	int err;
1487 	static snd_device_ops_t ops = {
1488 		.dev_free =	snd_es1938_dev_free,
1489 	};
1490 
1491 	*rchip = NULL;
1492 
1493 	/* enable PCI device */
1494 	if ((err = pci_enable_device(pci)) < 0)
1495 		return err;
1496         /* check, if we can restrict PCI DMA transfers to 24 bits */
1497 	if (pci_set_dma_mask(pci, 0x00ffffff) < 0 ||
1498 	    pci_set_consistent_dma_mask(pci, 0x00ffffff) < 0) {
1499                 snd_printk("architecture does not support 24bit PCI busmaster DMA\n");
1500 		pci_disable_device(pci);
1501                 return -ENXIO;
1502         }
1503 
1504 	chip = kcalloc(1, sizeof(*chip), GFP_KERNEL);
1505 	if (chip == NULL) {
1506 		pci_disable_device(pci);
1507 		return -ENOMEM;
1508 	}
1509 	spin_lock_init(&chip->reg_lock);
1510 	spin_lock_init(&chip->mixer_lock);
1511 	chip->card = card;
1512 	chip->pci = pci;
1513 	if ((err = pci_request_regions(pci, "ESS Solo-1")) < 0) {
1514 		kfree(chip);
1515 		pci_disable_device(pci);
1516 		return err;
1517 	}
1518 	chip->io_port = pci_resource_start(pci, 0);
1519 	chip->sb_port = pci_resource_start(pci, 1);
1520 	chip->vc_port = pci_resource_start(pci, 2);
1521 	chip->mpu_port = pci_resource_start(pci, 3);
1522 	chip->game_port = pci_resource_start(pci, 4);
1523 	if (request_irq(pci->irq, snd_es1938_interrupt, SA_INTERRUPT|SA_SHIRQ, "ES1938", (void *)chip)) {
1524 		snd_printk("unable to grab IRQ %d\n", pci->irq);
1525 		snd_es1938_free(chip);
1526 		return -EBUSY;
1527 	}
1528 	chip->irq = pci->irq;
1529 #ifdef ES1938_DDEBUG
1530 	snd_printk("create: io: 0x%lx, sb: 0x%lx, vc: 0x%lx, mpu: 0x%lx, game: 0x%lx\n",
1531 		   chip->io_port, chip->sb_port, chip->vc_port, chip->mpu_port, chip->game_port);
1532 #endif
1533 
1534 	chip->ddma_port = chip->vc_port + 0x00;		/* fix from Thomas Sailer */
1535 
1536 	snd_es1938_chip_init(chip);
1537 
1538 	snd_card_set_pm_callback(card, es1938_suspend, es1938_resume, chip);
1539 
1540 	if ((err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops)) < 0) {
1541 		snd_es1938_free(chip);
1542 		return err;
1543 	}
1544 
1545 	snd_card_set_dev(card, &pci->dev);
1546 
1547 	*rchip = chip;
1548 	return 0;
1549 }
1550 
1551 /* --------------------------------------------------------------------
1552  * Interrupt handler
1553  * -------------------------------------------------------------------- */
1554 static irqreturn_t snd_es1938_interrupt(int irq, void *dev_id, struct pt_regs *regs)
1555 {
1556 	es1938_t *chip = dev_id;
1557 	unsigned char status, audiostatus;
1558 	int handled = 0;
1559 
1560 	status = inb(SLIO_REG(chip, IRQCONTROL));
1561 #if 0
1562 	printk("Es1938debug - interrupt status: =0x%x\n", status);
1563 #endif
1564 
1565 	/* AUDIO 1 */
1566 	if (status & 0x10) {
1567 #if 0
1568                 printk("Es1938debug - AUDIO channel 1 interrupt\n");
1569 		printk("Es1938debug - AUDIO channel 1 DMAC DMA count: %u\n", inw(SLDM_REG(chip, DMACOUNT)));
1570 		printk("Es1938debug - AUDIO channel 1 DMAC DMA base: %u\n", inl(SLDM_REG(chip, DMAADDR)));
1571 		printk("Es1938debug - AUDIO channel 1 DMAC DMA status: 0x%x\n", inl(SLDM_REG(chip, DMASTATUS)));
1572 #endif
1573 		/* clear irq */
1574 		handled = 1;
1575 		audiostatus = inb(SLSB_REG(chip, STATUS));
1576 		if (chip->active & ADC1)
1577 			snd_pcm_period_elapsed(chip->capture_substream);
1578 		else if (chip->active & DAC1)
1579 			snd_pcm_period_elapsed(chip->playback2_substream);
1580 	}
1581 
1582 	/* AUDIO 2 */
1583 	if (status & 0x20) {
1584 #if 0
1585                 printk("Es1938debug - AUDIO channel 2 interrupt\n");
1586 		printk("Es1938debug - AUDIO channel 2 DMAC DMA count: %u\n", inw(SLIO_REG(chip, AUDIO2DMACOUNT)));
1587 		printk("Es1938debug - AUDIO channel 2 DMAC DMA base: %u\n", inl(SLIO_REG(chip, AUDIO2DMAADDR)));
1588 
1589 #endif
1590 		/* clear irq */
1591 		handled = 1;
1592 		snd_es1938_mixer_bits(chip, ESSSB_IREG_AUDIO2CONTROL2, 0x80, 0);
1593 		if (chip->active & DAC2)
1594 			snd_pcm_period_elapsed(chip->playback1_substream);
1595 	}
1596 
1597 	/* Hardware volume */
1598 	if (status & 0x40) {
1599 		int split = snd_es1938_mixer_read(chip, 0x64) & 0x80;
1600 		handled = 1;
1601 		snd_ctl_notify(chip->card, SNDRV_CTL_EVENT_MASK_VALUE, &chip->hw_switch->id);
1602 		snd_ctl_notify(chip->card, SNDRV_CTL_EVENT_MASK_VALUE, &chip->hw_volume->id);
1603 		if (!split) {
1604 			snd_ctl_notify(chip->card, SNDRV_CTL_EVENT_MASK_VALUE, &chip->master_switch->id);
1605 			snd_ctl_notify(chip->card, SNDRV_CTL_EVENT_MASK_VALUE, &chip->master_volume->id);
1606 		}
1607 		/* ack interrupt */
1608 		snd_es1938_mixer_write(chip, 0x66, 0x00);
1609 	}
1610 
1611 	/* MPU401 */
1612 	if (status & 0x80) {
1613 		// the following line is evil! It switches off MIDI interrupt handling after the first interrupt received.
1614 		// replacing the last 0 by 0x40 works for ESS-Solo1, but just doing nothing works as well!
1615 		// andreas@flying-snail.de
1616 		// snd_es1938_mixer_bits(chip, ESSSB_IREG_MPU401CONTROL, 0x40, 0); /* ack? */
1617 		if (chip->rmidi) {
1618 			handled = 1;
1619 			snd_mpu401_uart_interrupt(irq, chip->rmidi->private_data, regs);
1620 		}
1621 	}
1622 	return IRQ_RETVAL(handled);
1623 }
1624 
1625 #define ES1938_DMA_SIZE 64
1626 
1627 static int __devinit snd_es1938_mixer(es1938_t *chip)
1628 {
1629 	snd_card_t *card;
1630 	unsigned int idx;
1631 	int err;
1632 
1633 	card = chip->card;
1634 
1635 	strcpy(card->mixername, "ESS Solo-1");
1636 
1637 	for (idx = 0; idx < ARRAY_SIZE(snd_es1938_controls); idx++) {
1638 		snd_kcontrol_t *kctl;
1639 		kctl = snd_ctl_new1(&snd_es1938_controls[idx], chip);
1640 		switch (idx) {
1641 			case 0:
1642 				chip->master_volume = kctl;
1643 				kctl->private_free = snd_es1938_hwv_free;
1644 				break;
1645 			case 1:
1646 				chip->master_switch = kctl;
1647 				kctl->private_free = snd_es1938_hwv_free;
1648 				break;
1649 			case 2:
1650 				chip->hw_volume = kctl;
1651 				kctl->private_free = snd_es1938_hwv_free;
1652 				break;
1653 			case 3:
1654 				chip->hw_switch = kctl;
1655 				kctl->private_free = snd_es1938_hwv_free;
1656 				break;
1657 			}
1658 		if ((err = snd_ctl_add(card, kctl)) < 0)
1659 			return err;
1660 	}
1661 	return 0;
1662 }
1663 
1664 
1665 static int __devinit snd_es1938_probe(struct pci_dev *pci,
1666 				      const struct pci_device_id *pci_id)
1667 {
1668 	static int dev;
1669 	snd_card_t *card;
1670 	es1938_t *chip;
1671 	opl3_t *opl3;
1672 	int idx, err;
1673 
1674 	if (dev >= SNDRV_CARDS)
1675 		return -ENODEV;
1676 	if (!enable[dev]) {
1677 		dev++;
1678 		return -ENOENT;
1679 	}
1680 
1681 	card = snd_card_new(index[dev], id[dev], THIS_MODULE, 0);
1682 	if (card == NULL)
1683 		return -ENOMEM;
1684 	for (idx = 0; idx < 5; idx++) {
1685 		if (pci_resource_start(pci, idx) == 0 ||
1686 		    !(pci_resource_flags(pci, idx) & IORESOURCE_IO)) {
1687 		    	snd_card_free(card);
1688 		    	return -ENODEV;
1689 		}
1690 	}
1691 	if ((err = snd_es1938_create(card, pci, &chip)) < 0) {
1692 		snd_card_free(card);
1693 		return err;
1694 	}
1695 
1696 	strcpy(card->driver, "ES1938");
1697 	strcpy(card->shortname, "ESS ES1938 (Solo-1)");
1698 	sprintf(card->longname, "%s rev %i, irq %i",
1699 		card->shortname,
1700 		chip->revision,
1701 		chip->irq);
1702 
1703 	if ((err = snd_es1938_new_pcm(chip, 0)) < 0) {
1704 		snd_card_free(card);
1705 		return err;
1706 	}
1707 	if ((err = snd_es1938_mixer(chip)) < 0) {
1708 		snd_card_free(card);
1709 		return err;
1710 	}
1711 	if (snd_opl3_create(card,
1712 			    SLSB_REG(chip, FMLOWADDR),
1713 			    SLSB_REG(chip, FMHIGHADDR),
1714 			    OPL3_HW_OPL3, 1, &opl3) < 0) {
1715 		printk(KERN_ERR "es1938: OPL3 not detected at 0x%lx\n",
1716 			   SLSB_REG(chip, FMLOWADDR));
1717 	} else {
1718 	        if ((err = snd_opl3_timer_new(opl3, 0, 1)) < 0) {
1719 	                snd_card_free(card);
1720 	                return err;
1721 		}
1722 	        if ((err = snd_opl3_hwdep_new(opl3, 0, 1, NULL)) < 0) {
1723 	                snd_card_free(card);
1724 	                return err;
1725 		}
1726 	}
1727 	if (snd_mpu401_uart_new(card, 0, MPU401_HW_MPU401,
1728 				chip->mpu_port, 1, chip->irq, 0, &chip->rmidi) < 0) {
1729 		printk(KERN_ERR "es1938: unable to initialize MPU-401\n");
1730 	} else {
1731 		// this line is vital for MIDI interrupt handling on ess-solo1
1732 		// andreas@flying-snail.de
1733 		snd_es1938_mixer_bits(chip, ESSSB_IREG_MPU401CONTROL, 0x40, 0x40);
1734 	}
1735 
1736 	snd_es1938_create_gameport(chip);
1737 
1738 	if ((err = snd_card_register(card)) < 0) {
1739 		snd_card_free(card);
1740 		return err;
1741 	}
1742 
1743 	pci_set_drvdata(pci, card);
1744 	dev++;
1745 	return 0;
1746 }
1747 
1748 static void __devexit snd_es1938_remove(struct pci_dev *pci)
1749 {
1750 	snd_card_free(pci_get_drvdata(pci));
1751 	pci_set_drvdata(pci, NULL);
1752 }
1753 
1754 static struct pci_driver driver = {
1755 	.name = "ESS ES1938 (Solo-1)",
1756 	.id_table = snd_es1938_ids,
1757 	.probe = snd_es1938_probe,
1758 	.remove = __devexit_p(snd_es1938_remove),
1759 	SND_PCI_PM_CALLBACKS
1760 };
1761 
1762 static int __init alsa_card_es1938_init(void)
1763 {
1764 	return pci_module_init(&driver);
1765 }
1766 
1767 static void __exit alsa_card_es1938_exit(void)
1768 {
1769 	pci_unregister_driver(&driver);
1770 }
1771 
1772 module_init(alsa_card_es1938_init)
1773 module_exit(alsa_card_es1938_exit)
1774