xref: /openbmc/linux/sound/pci/es1938.c (revision 249592bf)
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*
3  *  Driver for ESS Solo-1 (ES1938, ES1946, ES1969) soundcard
4  *  Copyright (c) by Jaromir Koutek <miri@punknet.cz>,
5  *                   Jaroslav Kysela <perex@perex.cz>,
6  *                   Thomas Sailer <sailer@ife.ee.ethz.ch>,
7  *                   Abramo Bagnara <abramo@alsa-project.org>,
8  *                   Markus Gruber <gruber@eikon.tum.de>
9  *
10  * Rewritten from sonicvibes.c source.
11  *
12  *  TODO:
13  *    Rewrite better spinlocks
14  */
15 
16 /*
17   NOTES:
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
27     acknowledge".
28     I've seen that using small period sizes.
29     Reproducible with:
30     mpg123 test.mp3 &
31     hdparm -t -T /dev/hda
32 */
33 
34 
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>
43 #include <linux/io.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>
51 
52 MODULE_AUTHOR("Jaromir Koutek <miri@punknet.cz>");
53 MODULE_DESCRIPTION("ESS Solo-1");
54 MODULE_LICENSE("GPL");
55 
56 #if IS_REACHABLE(CONFIG_GAMEPORT)
57 #define SUPPORT_JOYSTICK 1
58 #endif
59 
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 */
63 
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.");
70 
71 #define SLIO_REG(chip, x) ((chip)->io_port + ESSIO_REG_##x)
72 
73 #define SLDM_REG(chip, x) ((chip)->ddma_port + ESSDM_REG_##x)
74 
75 #define SLSB_REG(chip, x) ((chip)->sb_port + ESSSB_REG_##x)
76 
77 #define SL_PCI_LEGACYCONTROL		0x40
78 #define SL_PCI_CONFIG			0x50
79 #define SL_PCI_DDMACONTROL		0x60
80 
81 #define ESSIO_REG_AUDIO2DMAADDR		0
82 #define ESSIO_REG_AUDIO2DMACOUNT	4
83 #define ESSIO_REG_AUDIO2MODE		6
84 #define ESSIO_REG_IRQCONTROL		7
85 
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
93 
94 #define ESSSB_REG_FMLOWADDR		0x00
95 #define ESSSB_REG_FMHIGHADDR		0x02
96 #define ESSSB_REG_MIXERADDR		0x04
97 #define ESSSB_REG_MIXERDATA		0x05
98 
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
129 
130 #define ESSSB_REG_RESET			0x06
131 
132 #define ESSSB_REG_READDATA		0x0a
133 #define ESSSB_REG_WRITEDATA		0x0c
134 #define ESSSB_REG_READSTATUS		0x0c
135 
136 #define ESSSB_REG_STATUS		0x0e
137 
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
160 
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
166 
167 #define DAC1 0x01
168 #define ADC1 0x02
169 #define DAC2 0x04
170 
171 /*
172 
173  */
174 
175 #define SAVED_REG_SIZE	32 /* max. number of registers to save */
176 
177 struct es1938 {
178 	int irq;
179 
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;
186 
187 	unsigned char irqmask;
188 	unsigned char revision;
189 
190 	struct snd_kcontrol *hw_volume;
191 	struct snd_kcontrol *hw_switch;
192 	struct snd_kcontrol *master_volume;
193 	struct snd_kcontrol *master_switch;
194 
195 	struct pci_dev *pci;
196 	struct snd_card *card;
197 	struct snd_pcm *pcm;
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;
202 
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;
210 	unsigned int active;
211 
212 	spinlock_t reg_lock;
213 	spinlock_t mixer_lock;
214         struct snd_info_entry *proc_entry;
215 
216 #ifdef SUPPORT_JOYSTICK
217 	struct gameport *gameport;
218 #endif
219 #ifdef CONFIG_PM_SLEEP
220 	unsigned char saved_regs[SAVED_REG_SIZE];
221 #endif
222 };
223 
224 static irqreturn_t snd_es1938_interrupt(int irq, void *dev_id);
225 
226 static const struct pci_device_id snd_es1938_ids[] = {
227 	{ PCI_VDEVICE(ESS, 0x1969), 0, },   /* Solo-1 */
228 	{ 0, }
229 };
230 
231 MODULE_DEVICE_TABLE(pci, snd_es1938_ids);
232 
233 #define RESET_LOOP_TIMEOUT	0x10000
234 #define WRITE_LOOP_TIMEOUT	0x10000
235 #define GET_LOOP_TIMEOUT	0x01000
236 
237 /* -----------------------------------------------------------------
238  * Write to a mixer register
239  * -----------------------------------------------------------------*/
240 static void snd_es1938_mixer_write(struct es1938 *chip, unsigned char reg, unsigned char val)
241 {
242 	unsigned long flags;
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);
248 }
249 
250 /* -----------------------------------------------------------------
251  * Read from a mixer register
252  * -----------------------------------------------------------------*/
253 static int snd_es1938_mixer_read(struct es1938 *chip, unsigned char reg)
254 {
255 	int data;
256 	unsigned long flags;
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);
262 	return data;
263 }
264 
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)
270 {
271 	unsigned long flags;
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));
276 	oval = old & mask;
277 	if (val != oval) {
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",
282 			   reg, old, new);
283 	}
284 	spin_unlock_irqrestore(&chip->mixer_lock, flags);
285 	return oval;
286 }
287 
288 /* -----------------------------------------------------------------
289  * Write command to Controller Registers
290  * -----------------------------------------------------------------*/
291 static void snd_es1938_write_cmd(struct es1938 *chip, unsigned char cmd)
292 {
293 	int i;
294 	unsigned char v;
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));
298 			return;
299 		}
300 	}
301 	dev_err(chip->card->dev,
302 		"snd_es1938_write_cmd timeout (0x02%x/0x02%x)\n", cmd, v);
303 }
304 
305 /* -----------------------------------------------------------------
306  * Read the Read Data Buffer
307  * -----------------------------------------------------------------*/
308 static int snd_es1938_get_byte(struct es1938 *chip)
309 {
310 	int i;
311 	unsigned char v;
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);
316 	return -ENODEV;
317 }
318 
319 /* -----------------------------------------------------------------
320  * Write value cmd register
321  * -----------------------------------------------------------------*/
322 static void snd_es1938_write(struct es1938 *chip, unsigned char reg, unsigned char val)
323 {
324 	unsigned long flags;
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);
330 }
331 
332 /* -----------------------------------------------------------------
333  * Read data from cmd register and return it
334  * -----------------------------------------------------------------*/
335 static unsigned char snd_es1938_read(struct es1938 *chip, unsigned char reg)
336 {
337 	unsigned char val;
338 	unsigned long flags;
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);
345 	return val;
346 }
347 
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,
352 			   unsigned char val)
353 {
354 	unsigned long flags;
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);
360 	oval = old & mask;
361 	if (val != oval) {
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",
366 			   reg, old, new);
367 	}
368 	spin_unlock_irqrestore(&chip->reg_lock, flags);
369 	return oval;
370 }
371 
372 /* --------------------------------------------------------------------
373  * Reset the chip
374  * --------------------------------------------------------------------*/
375 static void snd_es1938_reset(struct es1938 *chip)
376 {
377 	int i;
378 
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)
385 				goto __next;
386 		}
387 	}
388 	dev_err(chip->card->dev, "ESS Solo-1 reset failed\n");
389 
390      __next:
391 	snd_es1938_write_cmd(chip, ESS_CMD_ENABLEEXT);
392 
393 	/* Demand transfer DMA: 4 bytes per DMA request */
394 	snd_es1938_write(chip, ESS_CMD_DMATYPE, 2);
395 
396 	/* Change behaviour of register A1
397 	   4x oversampling
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);
409 }
410 
411 /* --------------------------------------------------------------------
412  * Reset the FIFOs
413  * --------------------------------------------------------------------*/
414 static void snd_es1938_reset_fifo(struct es1938 *chip)
415 {
416 	outb(2, SLSB_REG(chip, RESET));
417 	outb(0, SLSB_REG(chip, RESET));
418 }
419 
420 static const struct snd_ratnum clocks[2] = {
421 	{
422 		.num = 793800,
423 		.den_min = 1,
424 		.den_max = 128,
425 		.den_step = 1,
426 	},
427 	{
428 		.num = 768000,
429 		.den_min = 1,
430 		.den_max = 128,
431 		.den_step = 1,
432 	}
433 };
434 
435 static const struct snd_pcm_hw_constraint_ratnums hw_constraints_clocks = {
436 	.nrats = 2,
437 	.rats = clocks,
438 };
439 
440 
441 static void snd_es1938_rate_set(struct es1938 *chip,
442 				struct snd_pcm_substream *substream,
443 				int mode)
444 {
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;
449 	else
450 		bits = 256 - runtime->rate_den;
451 
452 	/* set filter register */
453 	div0 = 256 - 7160000*20/(8*82*runtime->rate);
454 
455 	if (mode == DAC2) {
456 		snd_es1938_mixer_write(chip, 0x70, bits);
457 		snd_es1938_mixer_write(chip, 0x72, div0);
458 	} else {
459 		snd_es1938_write(chip, 0xA1, bits);
460 		snd_es1938_write(chip, 0xA2, div0);
461 	}
462 }
463 
464 /* --------------------------------------------------------------------
465  * Configure Solo1 builtin DMA Controller
466  * --------------------------------------------------------------------*/
467 
468 static void snd_es1938_playback1_setdma(struct es1938 *chip)
469 {
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));
474 }
475 
476 static void snd_es1938_playback2_setdma(struct es1938 *chip)
477 {
478 	/* Enable DMA controller */
479 	outb(0xc4, SLDM_REG(chip, DMACOMMAND));
480 	/* 1. Master reset */
481 	outb(0, SLDM_REG(chip, DMACLEAR));
482 	/* 2. Mask DMA */
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));
487 	/* 3. Unmask DMA */
488 	outb(0, SLDM_REG(chip, DMAMASK));
489 }
490 
491 static void snd_es1938_capture_setdma(struct es1938 *chip)
492 {
493 	/* Enable DMA controller */
494 	outb(0xc4, SLDM_REG(chip, DMACOMMAND));
495 	/* 1. Master reset */
496 	outb(0, SLDM_REG(chip, DMACLEAR));
497 	/* 2. Mask DMA */
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));
503 	/* 3. Unmask DMA */
504 	outb(0, SLDM_REG(chip, DMAMASK));
505 }
506 
507 /* ----------------------------------------------------------------------
508  *
509  *                           *** PCM part ***
510  */
511 
512 static int snd_es1938_capture_trigger(struct snd_pcm_substream *substream,
513 				      int cmd)
514 {
515 	struct es1938 *chip = snd_pcm_substream_chip(substream);
516 	int val;
517 	switch (cmd) {
518 	case SNDRV_PCM_TRIGGER_START:
519 	case SNDRV_PCM_TRIGGER_RESUME:
520 		val = 0x0f;
521 		chip->active |= ADC1;
522 		break;
523 	case SNDRV_PCM_TRIGGER_STOP:
524 	case SNDRV_PCM_TRIGGER_SUSPEND:
525 		val = 0x00;
526 		chip->active &= ~ADC1;
527 		break;
528 	default:
529 		return -EINVAL;
530 	}
531 	snd_es1938_write(chip, ESS_CMD_DMACONTROL, val);
532 	return 0;
533 }
534 
535 static int snd_es1938_playback1_trigger(struct snd_pcm_substream *substream,
536 					int cmd)
537 {
538 	struct es1938 *chip = snd_pcm_substream_chip(substream);
539 	switch (cmd) {
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);
545                 udelay(10);
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;
552 		break;
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;
558 		break;
559 	default:
560 		return -EINVAL;
561 	}
562 	return 0;
563 }
564 
565 static int snd_es1938_playback2_trigger(struct snd_pcm_substream *substream,
566 					int cmd)
567 {
568 	struct es1938 *chip = snd_pcm_substream_chip(substream);
569 	int val;
570 	switch (cmd) {
571 	case SNDRV_PCM_TRIGGER_START:
572 	case SNDRV_PCM_TRIGGER_RESUME:
573 		val = 5;
574 		chip->active |= DAC1;
575 		break;
576 	case SNDRV_PCM_TRIGGER_STOP:
577 	case SNDRV_PCM_TRIGGER_SUSPEND:
578 		val = 0;
579 		chip->active &= ~DAC1;
580 		break;
581 	default:
582 		return -EINVAL;
583 	}
584 	snd_es1938_write(chip, ESS_CMD_DMACONTROL, val);
585 	return 0;
586 }
587 
588 static int snd_es1938_playback_trigger(struct snd_pcm_substream *substream,
589 				       int cmd)
590 {
591 	switch (substream->number) {
592 	case 0:
593 		return snd_es1938_playback1_trigger(substream, cmd);
594 	case 1:
595 		return snd_es1938_playback2_trigger(substream, cmd);
596 	}
597 	snd_BUG();
598 	return -EINVAL;
599 }
600 
601 /* --------------------------------------------------------------------
602  * First channel for Extended Mode Audio 1 ADC Operation
603  * --------------------------------------------------------------------*/
604 static int snd_es1938_capture_prepare(struct snd_pcm_substream *substream)
605 {
606 	struct es1938 *chip = snd_pcm_substream_chip(substream);
607 	struct snd_pcm_runtime *runtime = substream->runtime;
608 	int u, is8, mono;
609 	unsigned int size = snd_pcm_lib_buffer_bytes(substream);
610 	unsigned int count = snd_pcm_lib_period_bytes(substream);
611 
612 	chip->dma1_size = size;
613 	chip->dma1_start = runtime->dma_addr;
614 
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);
618 
619 	chip->dma1_shift = 2 - mono - is8;
620 
621 	snd_es1938_reset_fifo(chip);
622 
623 	/* program type */
624 	snd_es1938_bits(chip, ESS_CMD_ANALOGCONTROL, 0x03, (mono ? 2 : 1));
625 
626 	/* set clock and counters */
627         snd_es1938_rate_set(chip, substream, ADC1);
628 
629 	count = 0x10000 - count;
630 	snd_es1938_write(chip, ESS_CMD_DMACNTRELOADL, count & 0xff);
631 	snd_es1938_write(chip, ESS_CMD_DMACNTRELOADH, count >> 8);
632 
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 |
636 		       (u ? 0x00 : 0x20) |
637 		       (is8 ? 0x00 : 0x04) |
638 		       (mono ? 0x40 : 0x08));
639 
640 	//	snd_es1938_reset_fifo(chip);
641 
642 	/* 11. configure system interrupt controller and DMA controller */
643 	snd_es1938_capture_setdma(chip);
644 
645 	return 0;
646 }
647 
648 
649 /* ------------------------------------------------------------------------------
650  * Second Audio channel DAC Operation
651  * ------------------------------------------------------------------------------*/
652 static int snd_es1938_playback1_prepare(struct snd_pcm_substream *substream)
653 {
654 	struct es1938 *chip = snd_pcm_substream_chip(substream);
655 	struct snd_pcm_runtime *runtime = substream->runtime;
656 	int u, is8, mono;
657 	unsigned int size = snd_pcm_lib_buffer_bytes(substream);
658 	unsigned int count = snd_pcm_lib_period_bytes(substream);
659 
660 	chip->dma2_size = size;
661 	chip->dma2_start = runtime->dma_addr;
662 
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);
666 
667 	chip->dma2_shift = 2 - mono - is8;
668 
669         snd_es1938_reset_fifo(chip);
670 
671 	/* set clock and counters */
672         snd_es1938_rate_set(chip, substream, DAC2);
673 
674 	count >>= 1;
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);
678 
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));
682 
683 	/* program DMA */
684 	snd_es1938_playback1_setdma(chip);
685 
686 	return 0;
687 }
688 
689 static int snd_es1938_playback2_prepare(struct snd_pcm_substream *substream)
690 {
691 	struct es1938 *chip = snd_pcm_substream_chip(substream);
692 	struct snd_pcm_runtime *runtime = substream->runtime;
693 	int u, is8, mono;
694 	unsigned int size = snd_pcm_lib_buffer_bytes(substream);
695 	unsigned int count = snd_pcm_lib_period_bytes(substream);
696 
697 	chip->dma1_size = size;
698 	chip->dma1_start = runtime->dma_addr;
699 
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);
703 
704 	chip->dma1_shift = 2 - mono - is8;
705 
706 	count = 0x10000 - count;
707 
708 	/* reset */
709 	snd_es1938_reset_fifo(chip);
710 
711 	snd_es1938_bits(chip, ESS_CMD_ANALOGCONTROL, 0x03, (mono ? 2 : 1));
712 
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);
717 
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));
724 
725 	/* program DMA */
726 	snd_es1938_playback2_setdma(chip);
727 
728 	return 0;
729 }
730 
731 static int snd_es1938_playback_prepare(struct snd_pcm_substream *substream)
732 {
733 	switch (substream->number) {
734 	case 0:
735 		return snd_es1938_playback1_prepare(substream);
736 	case 1:
737 		return snd_es1938_playback2_prepare(substream);
738 	}
739 	snd_BUG();
740 	return -EINVAL;
741 }
742 
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.
750 */
751 static snd_pcm_uframes_t snd_es1938_capture_pointer(struct snd_pcm_substream *substream)
752 {
753 	struct es1938 *chip = snd_pcm_substream_chip(substream);
754 	size_t ptr;
755 #if 0
756 	size_t old, new;
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)
760 		old = new;
761 	ptr = chip->dma1_size - 1 - new;
762 #else
763 	size_t count;
764 	unsigned int diff;
765 
766 	ptr = inl(SLDM_REG(chip, DMAADDR));
767 	count = inw(SLDM_REG(chip, DMACOUNT));
768 	diff = chip->dma1_start + chip->dma1_size - ptr - count;
769 
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 */
773 	else
774 	  chip->last_capture_dmaaddr = ptr;            /* good, remember it */
775 
776 	ptr -= chip->dma1_start;
777 #endif
778 	return ptr >> chip->dma1_shift;
779 }
780 
781 static snd_pcm_uframes_t snd_es1938_playback1_pointer(struct snd_pcm_substream *substream)
782 {
783 	struct es1938 *chip = snd_pcm_substream_chip(substream);
784 	size_t ptr;
785 #if 1
786 	ptr = chip->dma2_size - inw(SLIO_REG(chip, AUDIO2DMACOUNT));
787 #else
788 	ptr = inl(SLIO_REG(chip, AUDIO2DMAADDR)) - chip->dma2_start;
789 #endif
790 	return ptr >> chip->dma2_shift;
791 }
792 
793 static snd_pcm_uframes_t snd_es1938_playback2_pointer(struct snd_pcm_substream *substream)
794 {
795 	struct es1938 *chip = snd_pcm_substream_chip(substream);
796 	size_t ptr;
797 	size_t old, new;
798 #if 1
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)
802 		old = new;
803 	ptr = chip->dma1_size - 1 - new;
804 #else
805 	ptr = inl(SLDM_REG(chip, DMAADDR)) - chip->dma1_start;
806 #endif
807 	return ptr >> chip->dma1_shift;
808 }
809 
810 static snd_pcm_uframes_t snd_es1938_playback_pointer(struct snd_pcm_substream *substream)
811 {
812 	switch (substream->number) {
813 	case 0:
814 		return snd_es1938_playback1_pointer(substream);
815 	case 1:
816 		return snd_es1938_playback2_pointer(substream);
817 	}
818 	snd_BUG();
819 	return -EINVAL;
820 }
821 
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)
825 {
826 	struct snd_pcm_runtime *runtime = substream->runtime;
827 	struct es1938 *chip = snd_pcm_substream_chip(substream);
828 
829 	if (snd_BUG_ON(pos + count > chip->dma1_size))
830 		return -EINVAL;
831 	if (pos + count < chip->dma1_size) {
832 		if (copy_to_user(dst, runtime->dma_area + pos + 1, count))
833 			return -EFAULT;
834 	} else {
835 		if (copy_to_user(dst, runtime->dma_area + pos + 1, count - 1))
836 			return -EFAULT;
837 		if (put_user(runtime->dma_area[0],
838 			     ((unsigned char __user *)dst) + count - 1))
839 			return -EFAULT;
840 	}
841 	return 0;
842 }
843 
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)
847 {
848 	struct snd_pcm_runtime *runtime = substream->runtime;
849 	struct es1938 *chip = snd_pcm_substream_chip(substream);
850 
851 	if (snd_BUG_ON(pos + count > chip->dma1_size))
852 		return -EINVAL;
853 	if (pos + count < chip->dma1_size) {
854 		memcpy(dst, runtime->dma_area + pos + 1, count);
855 	} else {
856 		memcpy(dst, runtime->dma_area + pos + 1, count - 1);
857 		runtime->dma_area[0] = *((unsigned char *)dst + count - 1);
858 	}
859 	return 0;
860 }
861 
862 /* ----------------------------------------------------------------------
863  * Audio1 Capture (ADC)
864  * ----------------------------------------------------------------------*/
865 static const struct snd_pcm_hardware snd_es1938_capture =
866 {
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,
872 	.rate_min =		6000,
873 	.rate_max =		48000,
874 	.channels_min =		1,
875 	.channels_max =		2,
876         .buffer_bytes_max =	0x8000,       /* DMA controller screws on higher values */
877 	.period_bytes_min =	64,
878 	.period_bytes_max =	0x8000,
879 	.periods_min =		1,
880 	.periods_max =		1024,
881 	.fifo_size =		256,
882 };
883 
884 /* -----------------------------------------------------------------------
885  * Audio2 Playback (DAC)
886  * -----------------------------------------------------------------------*/
887 static const struct snd_pcm_hardware snd_es1938_playback =
888 {
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,
895 	.rate_min =		6000,
896 	.rate_max =		48000,
897 	.channels_min =		1,
898 	.channels_max =		2,
899         .buffer_bytes_max =	0x8000,       /* DMA controller screws on higher values */
900 	.period_bytes_min =	64,
901 	.period_bytes_max =	0x8000,
902 	.periods_min =		1,
903 	.periods_max =		1024,
904 	.fifo_size =		256,
905 };
906 
907 static int snd_es1938_capture_open(struct snd_pcm_substream *substream)
908 {
909 	struct es1938 *chip = snd_pcm_substream_chip(substream);
910 	struct snd_pcm_runtime *runtime = substream->runtime;
911 
912 	if (chip->playback2_substream)
913 		return -EAGAIN;
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);
919 	return 0;
920 }
921 
922 static int snd_es1938_playback_open(struct snd_pcm_substream *substream)
923 {
924 	struct es1938 *chip = snd_pcm_substream_chip(substream);
925 	struct snd_pcm_runtime *runtime = substream->runtime;
926 
927 	switch (substream->number) {
928 	case 0:
929 		chip->playback1_substream = substream;
930 		break;
931 	case 1:
932 		if (chip->capture_substream)
933 			return -EAGAIN;
934 		chip->playback2_substream = substream;
935 		break;
936 	default:
937 		snd_BUG();
938 		return -EINVAL;
939 	}
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);
944 	return 0;
945 }
946 
947 static int snd_es1938_capture_close(struct snd_pcm_substream *substream)
948 {
949 	struct es1938 *chip = snd_pcm_substream_chip(substream);
950 
951 	chip->capture_substream = NULL;
952 	return 0;
953 }
954 
955 static int snd_es1938_playback_close(struct snd_pcm_substream *substream)
956 {
957 	struct es1938 *chip = snd_pcm_substream_chip(substream);
958 
959 	switch (substream->number) {
960 	case 0:
961 		chip->playback1_substream = NULL;
962 		break;
963 	case 1:
964 		chip->playback2_substream = NULL;
965 		break;
966 	default:
967 		snd_BUG();
968 		return -EINVAL;
969 	}
970 	return 0;
971 }
972 
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,
979 };
980 
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,
989 };
990 
991 static int snd_es1938_new_pcm(struct es1938 *chip, int device)
992 {
993 	struct snd_pcm *pcm;
994 	int err;
995 
996 	if ((err = snd_pcm_new(chip->card, "es-1938-1946", device, 2, 1, &pcm)) < 0)
997 		return err;
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);
1000 
1001 	pcm->private_data = chip;
1002 	pcm->info_flags = 0;
1003 	strcpy(pcm->name, "ESS Solo-1");
1004 
1005 	snd_pcm_set_managed_buffer_all(pcm, SNDRV_DMA_TYPE_DEV,
1006 				       &chip->pci->dev, 64*1024, 64*1024);
1007 
1008 	chip->pcm = pcm;
1009 	return 0;
1010 }
1011 
1012 /* -------------------------------------------------------------------
1013  *
1014  *                       *** Mixer part ***
1015  */
1016 
1017 static int snd_es1938_info_mux(struct snd_kcontrol *kcontrol,
1018 			       struct snd_ctl_elem_info *uinfo)
1019 {
1020 	static const char * const texts[8] = {
1021 		"Mic", "Mic Master", "CD", "AOUT",
1022 		"Mic1", "Mix", "Line", "Master"
1023 	};
1024 
1025 	return snd_ctl_enum_info(uinfo, 1, 8, texts);
1026 }
1027 
1028 static int snd_es1938_get_mux(struct snd_kcontrol *kcontrol,
1029 			      struct snd_ctl_elem_value *ucontrol)
1030 {
1031 	struct es1938 *chip = snd_kcontrol_chip(kcontrol);
1032 	ucontrol->value.enumerated.item[0] = snd_es1938_mixer_read(chip, 0x1c) & 0x07;
1033 	return 0;
1034 }
1035 
1036 static int snd_es1938_put_mux(struct snd_kcontrol *kcontrol,
1037 			      struct snd_ctl_elem_value *ucontrol)
1038 {
1039 	struct es1938 *chip = snd_kcontrol_chip(kcontrol);
1040 	unsigned char val = ucontrol->value.enumerated.item[0];
1041 
1042 	if (val > 7)
1043 		return -EINVAL;
1044 	return snd_es1938_mixer_bits(chip, 0x1c, 0x07, val) != val;
1045 }
1046 
1047 #define snd_es1938_info_spatializer_enable	snd_ctl_boolean_mono_info
1048 
1049 static int snd_es1938_get_spatializer_enable(struct snd_kcontrol *kcontrol,
1050 					     struct snd_ctl_elem_value *ucontrol)
1051 {
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);
1055 	return 0;
1056 }
1057 
1058 static int snd_es1938_put_spatializer_enable(struct snd_kcontrol *kcontrol,
1059 					     struct snd_ctl_elem_value *ucontrol)
1060 {
1061 	struct es1938 *chip = snd_kcontrol_chip(kcontrol);
1062 	unsigned char oval, nval;
1063 	int change;
1064 	nval = ucontrol->value.integer.value[0] ? 0x0c : 0x04;
1065 	oval = snd_es1938_mixer_read(chip, 0x50) & 0x0c;
1066 	change = nval != oval;
1067 	if (change) {
1068 		snd_es1938_mixer_write(chip, 0x50, nval & ~0x04);
1069 		snd_es1938_mixer_write(chip, 0x50, nval);
1070 	}
1071 	return change;
1072 }
1073 
1074 static int snd_es1938_info_hw_volume(struct snd_kcontrol *kcontrol,
1075 				     struct snd_ctl_elem_info *uinfo)
1076 {
1077 	uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
1078 	uinfo->count = 2;
1079 	uinfo->value.integer.min = 0;
1080 	uinfo->value.integer.max = 63;
1081 	return 0;
1082 }
1083 
1084 static int snd_es1938_get_hw_volume(struct snd_kcontrol *kcontrol,
1085 				    struct snd_ctl_elem_value *ucontrol)
1086 {
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;
1090 	return 0;
1091 }
1092 
1093 #define snd_es1938_info_hw_switch		snd_ctl_boolean_stereo_info
1094 
1095 static int snd_es1938_get_hw_switch(struct snd_kcontrol *kcontrol,
1096 				    struct snd_ctl_elem_value *ucontrol)
1097 {
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);
1101 	return 0;
1102 }
1103 
1104 static void snd_es1938_hwv_free(struct snd_kcontrol *kcontrol)
1105 {
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;
1111 }
1112 
1113 static int snd_es1938_reg_bits(struct es1938 *chip, unsigned char reg,
1114 			       unsigned char mask, unsigned char val)
1115 {
1116 	if (reg < 0xa0)
1117 		return snd_es1938_mixer_bits(chip, reg, mask, val);
1118 	else
1119 		return snd_es1938_bits(chip, reg, mask, val);
1120 }
1121 
1122 static int snd_es1938_reg_read(struct es1938 *chip, unsigned char reg)
1123 {
1124 	if (reg < 0xa0)
1125 		return snd_es1938_mixer_read(chip, reg);
1126 	else
1127 		return snd_es1938_read(chip, reg);
1128 }
1129 
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) }
1143 
1144 static int snd_es1938_info_single(struct snd_kcontrol *kcontrol,
1145 				  struct snd_ctl_elem_info *uinfo)
1146 {
1147 	int mask = (kcontrol->private_value >> 16) & 0xff;
1148 
1149 	uinfo->type = mask == 1 ? SNDRV_CTL_ELEM_TYPE_BOOLEAN : SNDRV_CTL_ELEM_TYPE_INTEGER;
1150 	uinfo->count = 1;
1151 	uinfo->value.integer.min = 0;
1152 	uinfo->value.integer.max = mask;
1153 	return 0;
1154 }
1155 
1156 static int snd_es1938_get_single(struct snd_kcontrol *kcontrol,
1157 				 struct snd_ctl_elem_value *ucontrol)
1158 {
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;
1164 	int val;
1165 
1166 	val = snd_es1938_reg_read(chip, reg);
1167 	ucontrol->value.integer.value[0] = (val >> shift) & mask;
1168 	if (invert)
1169 		ucontrol->value.integer.value[0] = mask - ucontrol->value.integer.value[0];
1170 	return 0;
1171 }
1172 
1173 static int snd_es1938_put_single(struct snd_kcontrol *kcontrol,
1174 				 struct snd_ctl_elem_value *ucontrol)
1175 {
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;
1181 	unsigned char val;
1182 
1183 	val = (ucontrol->value.integer.value[0] & mask);
1184 	if (invert)
1185 		val = mask - val;
1186 	mask <<= shift;
1187 	val <<= shift;
1188 	return snd_es1938_reg_bits(chip, reg, mask, val) != val;
1189 }
1190 
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) }
1204 
1205 static int snd_es1938_info_double(struct snd_kcontrol *kcontrol,
1206 				  struct snd_ctl_elem_info *uinfo)
1207 {
1208 	int mask = (kcontrol->private_value >> 24) & 0xff;
1209 
1210 	uinfo->type = mask == 1 ? SNDRV_CTL_ELEM_TYPE_BOOLEAN : SNDRV_CTL_ELEM_TYPE_INTEGER;
1211 	uinfo->count = 2;
1212 	uinfo->value.integer.min = 0;
1213 	uinfo->value.integer.max = mask;
1214 	return 0;
1215 }
1216 
1217 static int snd_es1938_get_double(struct snd_kcontrol *kcontrol,
1218 				 struct snd_ctl_elem_value *ucontrol)
1219 {
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;
1228 
1229 	left = snd_es1938_reg_read(chip, left_reg);
1230 	if (left_reg != right_reg)
1231 		right = snd_es1938_reg_read(chip, right_reg);
1232 	else
1233 		right = left;
1234 	ucontrol->value.integer.value[0] = (left >> shift_left) & mask;
1235 	ucontrol->value.integer.value[1] = (right >> shift_right) & mask;
1236 	if (invert) {
1237 		ucontrol->value.integer.value[0] = mask - ucontrol->value.integer.value[0];
1238 		ucontrol->value.integer.value[1] = mask - ucontrol->value.integer.value[1];
1239 	}
1240 	return 0;
1241 }
1242 
1243 static int snd_es1938_put_double(struct snd_kcontrol *kcontrol,
1244 				 struct snd_ctl_elem_value *ucontrol)
1245 {
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;
1253 	int change;
1254 	unsigned char val1, val2, mask1, mask2;
1255 
1256 	val1 = ucontrol->value.integer.value[0] & mask;
1257 	val2 = ucontrol->value.integer.value[1] & mask;
1258 	if (invert) {
1259 		val1 = mask - val1;
1260 		val2 = mask - val2;
1261 	}
1262 	val1 <<= shift_left;
1263 	val2 <<= shift_right;
1264 	mask1 = mask << shift_left;
1265 	mask2 = mask << shift_right;
1266 	if (left_reg != right_reg) {
1267 		change = 0;
1268 		if (snd_es1938_reg_bits(chip, left_reg, mask1, val1) != val1)
1269 			change = 1;
1270 		if (snd_es1938_reg_bits(chip, right_reg, mask2, val2) != val2)
1271 			change = 1;
1272 	} else {
1273 		change = (snd_es1938_reg_bits(chip, left_reg, mask1 | mask2,
1274 					      val1 | val2) != (val1 | val2));
1275 	}
1276 	return change;
1277 }
1278 
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),
1282 );
1283 
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),
1287 );
1288 
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),
1292 );
1293 
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),
1297 );
1298 
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),
1302 );
1303 
1304 static const DECLARE_TLV_DB_SCALE(db_scale_capture, 0, 150, 0);
1305 
1306 static const struct snd_kcontrol_new snd_es1938_controls[] = {
1307 ES1938_DOUBLE_TLV("Master Playback Volume", 0, 0x60, 0x62, 0, 0, 63, 0,
1308 		  db_scale_master),
1309 ES1938_DOUBLE("Master Playback Switch", 0, 0x60, 0x62, 6, 6, 1, 1),
1310 {
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,
1316 },
1317 {
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 },
1325 },
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,
1328 		  db_scale_line),
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,
1331 		  db_scale_mic),
1332 ES1938_DOUBLE_TLV("Mono Playback Volume", 0, 0x6d, 0x6d, 4, 0, 15, 0,
1333 		  db_scale_line),
1334 ES1938_DOUBLE_TLV("Mic Playback Volume", 0, 0x1a, 0x1a, 4, 0, 15, 0,
1335 		  db_scale_mic),
1336 ES1938_DOUBLE_TLV("Aux Playback Volume", 0, 0x3a, 0x3a, 4, 0, 15, 0,
1337 		  db_scale_line),
1338 ES1938_DOUBLE_TLV("Capture Volume", 0, 0xb4, 0xb4, 4, 0, 15, 0,
1339 		  db_scale_capture),
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),
1343 {
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,
1349 },
1350 ES1938_DOUBLE_TLV("Mono Input Playback Volume", 0, 0x6d, 0x6d, 4, 0, 15, 0,
1351 		  db_scale_line),
1352 ES1938_DOUBLE_TLV("PCM Capture Volume", 0, 0x69, 0x69, 4, 0, 15, 0,
1353 		  db_scale_audio2),
1354 ES1938_DOUBLE_TLV("Mic Capture Volume", 0, 0x68, 0x68, 4, 0, 15, 0,
1355 		  db_scale_mic),
1356 ES1938_DOUBLE_TLV("Line Capture Volume", 0, 0x6e, 0x6e, 4, 0, 15, 0,
1357 		  db_scale_line),
1358 ES1938_DOUBLE_TLV("FM Capture Volume", 0, 0x6b, 0x6b, 4, 0, 15, 0,
1359 		  db_scale_mic),
1360 ES1938_DOUBLE_TLV("Mono Capture Volume", 0, 0x6f, 0x6f, 4, 0, 15, 0,
1361 		  db_scale_line),
1362 ES1938_DOUBLE_TLV("CD Capture Volume", 0, 0x6a, 0x6a, 4, 0, 15, 0,
1363 		  db_scale_line),
1364 ES1938_DOUBLE_TLV("Aux Capture Volume", 0, 0x6c, 0x6c, 4, 0, 15, 0,
1365 		  db_scale_line),
1366 ES1938_DOUBLE_TLV("PCM Playback Volume", 0, 0x7c, 0x7c, 4, 0, 15, 0,
1367 		  db_scale_audio2),
1368 ES1938_DOUBLE_TLV("PCM Playback Volume", 1, 0x14, 0x14, 4, 0, 15, 0,
1369 		  db_scale_audio1),
1370 ES1938_SINGLE("3D Control - Level", 0, 0x52, 0, 63, 0),
1371 {
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,
1377 },
1378 ES1938_SINGLE("Mic Boost (+26dB)", 0, 0x7d, 3, 1, 0)
1379 };
1380 
1381 
1382 /* ---------------------------------------------------------------------------- */
1383 /* ---------------------------------------------------------------------------- */
1384 
1385 /*
1386  * initialize the chip - used by resume callback, too
1387  */
1388 static void snd_es1938_chip_init(struct es1938 *chip)
1389 {
1390 	/* reset chip */
1391 	snd_es1938_reset(chip);
1392 
1393 	/* configure native mode */
1394 
1395 	/* enable bus master */
1396 	pci_set_master(chip->pci);
1397 
1398 	/* disable legacy audio */
1399 	pci_write_config_word(chip->pci, SL_PCI_LEGACYCONTROL, 0x805f);
1400 
1401 	/* set DDMA base */
1402 	pci_write_config_word(chip->pci, SL_PCI_DDMACONTROL, chip->ddma_port | 1);
1403 
1404 	/* set DMA/IRQ policy */
1405 	pci_write_config_dword(chip->pci, SL_PCI_CONFIG, 0);
1406 
1407 	/* enable Audio 1, Audio 2, MPU401 IRQ and HW volume IRQ*/
1408 	outb(0xf0, SLIO_REG(chip, IRQCONTROL));
1409 
1410 	/* reset DMA */
1411 	outb(0, SLDM_REG(chip, DMACLEAR));
1412 }
1413 
1414 #ifdef CONFIG_PM_SLEEP
1415 /*
1416  * PM support
1417  */
1418 
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,
1423 	0xa8, 0xb4,
1424 };
1425 
1426 
1427 static int es1938_suspend(struct device *dev)
1428 {
1429 	struct snd_card *card = dev_get_drvdata(dev);
1430 	struct es1938 *chip = card->private_data;
1431 	const unsigned char *s;
1432 	unsigned char *d;
1433 
1434 	snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
1435 
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);
1439 
1440 	outb(0x00, SLIO_REG(chip, IRQCONTROL)); /* disable irqs */
1441 	if (chip->irq >= 0) {
1442 		free_irq(chip->irq, chip);
1443 		chip->irq = -1;
1444 		card->sync_irq = -1;
1445 	}
1446 	return 0;
1447 }
1448 
1449 static int es1938_resume(struct device *dev)
1450 {
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;
1455 	unsigned char *d;
1456 
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",
1460 			pci->irq);
1461 		snd_card_disconnect(card);
1462 		return -EIO;
1463 	}
1464 	chip->irq = pci->irq;
1465 	card->sync_irq = chip->irq;
1466 	snd_es1938_chip_init(chip);
1467 
1468 	/* restore mixer-related registers */
1469 	for (s = saved_regs, d = chip->saved_regs; *s; s++, d++) {
1470 		if (*s < 0xa0)
1471 			snd_es1938_mixer_write(chip, *s, *d);
1472 		else
1473 			snd_es1938_write(chip, *s, *d);
1474 	}
1475 
1476 	snd_power_change_state(card, SNDRV_CTL_POWER_D0);
1477 	return 0;
1478 }
1479 
1480 static SIMPLE_DEV_PM_OPS(es1938_pm, es1938_suspend, es1938_resume);
1481 #define ES1938_PM_OPS	&es1938_pm
1482 #else
1483 #define ES1938_PM_OPS	NULL
1484 #endif /* CONFIG_PM_SLEEP */
1485 
1486 #ifdef SUPPORT_JOYSTICK
1487 static int snd_es1938_create_gameport(struct es1938 *chip)
1488 {
1489 	struct gameport *gp;
1490 
1491 	chip->gameport = gp = gameport_allocate_port();
1492 	if (!gp) {
1493 		dev_err(chip->card->dev,
1494 			"cannot allocate memory for gameport\n");
1495 		return -ENOMEM;
1496 	}
1497 
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;
1502 
1503 	gameport_register_port(gp);
1504 
1505 	return 0;
1506 }
1507 
1508 static void snd_es1938_free_gameport(struct es1938 *chip)
1509 {
1510 	if (chip->gameport) {
1511 		gameport_unregister_port(chip->gameport);
1512 		chip->gameport = NULL;
1513 	}
1514 }
1515 #else
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 */
1519 
1520 static int snd_es1938_free(struct es1938 *chip)
1521 {
1522 	/* disable irqs */
1523 	outb(0x00, SLIO_REG(chip, IRQCONTROL));
1524 	if (chip->rmidi)
1525 		snd_es1938_mixer_bits(chip, ESSSB_IREG_MPU401CONTROL, 0x40, 0);
1526 
1527 	snd_es1938_free_gameport(chip);
1528 
1529 	if (chip->irq >= 0)
1530 		free_irq(chip->irq, chip);
1531 	pci_release_regions(chip->pci);
1532 	pci_disable_device(chip->pci);
1533 	kfree(chip);
1534 	return 0;
1535 }
1536 
1537 static int snd_es1938_dev_free(struct snd_device *device)
1538 {
1539 	struct es1938 *chip = device->device_data;
1540 	return snd_es1938_free(chip);
1541 }
1542 
1543 static int snd_es1938_create(struct snd_card *card,
1544 			     struct pci_dev *pci,
1545 			     struct es1938 **rchip)
1546 {
1547 	struct es1938 *chip;
1548 	int err;
1549 	static const struct snd_device_ops ops = {
1550 		.dev_free =	snd_es1938_dev_free,
1551 	};
1552 
1553 	*rchip = NULL;
1554 
1555 	/* enable PCI device */
1556 	if ((err = pci_enable_device(pci)) < 0)
1557 		return err;
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))) {
1560 		dev_err(card->dev,
1561 			"architecture does not support 24bit PCI busmaster DMA\n");
1562 		pci_disable_device(pci);
1563                 return -ENXIO;
1564         }
1565 
1566 	chip = kzalloc(sizeof(*chip), GFP_KERNEL);
1567 	if (chip == NULL) {
1568 		pci_disable_device(pci);
1569 		return -ENOMEM;
1570 	}
1571 	spin_lock_init(&chip->reg_lock);
1572 	spin_lock_init(&chip->mixer_lock);
1573 	chip->card = card;
1574 	chip->pci = pci;
1575 	chip->irq = -1;
1576 	if ((err = pci_request_regions(pci, "ESS Solo-1")) < 0) {
1577 		kfree(chip);
1578 		pci_disable_device(pci);
1579 		return err;
1580 	}
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);
1590 		return -EBUSY;
1591 	}
1592 	chip->irq = pci->irq;
1593 	card->sync_irq = chip->irq;
1594 	dev_dbg(card->dev,
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);
1597 
1598 	chip->ddma_port = chip->vc_port + 0x00;		/* fix from Thomas Sailer */
1599 
1600 	snd_es1938_chip_init(chip);
1601 
1602 	if ((err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops)) < 0) {
1603 		snd_es1938_free(chip);
1604 		return err;
1605 	}
1606 
1607 	*rchip = chip;
1608 	return 0;
1609 }
1610 
1611 /* --------------------------------------------------------------------
1612  * Interrupt handler
1613  * -------------------------------------------------------------------- */
1614 static irqreturn_t snd_es1938_interrupt(int irq, void *dev_id)
1615 {
1616 	struct es1938 *chip = dev_id;
1617 	unsigned char status;
1618 	__always_unused unsigned char audiostatus;
1619 	int handled = 0;
1620 
1621 	status = inb(SLIO_REG(chip, IRQCONTROL));
1622 #if 0
1623 	dev_dbg(chip->card->dev,
1624 		"Es1938debug - interrupt status: =0x%x\n", status);
1625 #endif
1626 
1627 	/* AUDIO 1 */
1628 	if (status & 0x10) {
1629 #if 0
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)));
1641 #endif
1642 		/* clear irq */
1643 		handled = 1;
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);
1649 	}
1650 
1651 	/* AUDIO 2 */
1652 	if (status & 0x20) {
1653 #if 0
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)));
1662 
1663 #endif
1664 		/* clear irq */
1665 		handled = 1;
1666 		snd_es1938_mixer_bits(chip, ESSSB_IREG_AUDIO2CONTROL2, 0x80, 0);
1667 		if (chip->active & DAC2)
1668 			snd_pcm_period_elapsed(chip->playback1_substream);
1669 	}
1670 
1671 	/* Hardware volume */
1672 	if (status & 0x40) {
1673 		int split = snd_es1938_mixer_read(chip, 0x64) & 0x80;
1674 		handled = 1;
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);
1677 		if (!split) {
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);
1682 		}
1683 		/* ack interrupt */
1684 		snd_es1938_mixer_write(chip, 0x66, 0x00);
1685 	}
1686 
1687 	/* MPU401 */
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!
1691 		// andreas@flying-snail.de
1692 		// snd_es1938_mixer_bits(chip, ESSSB_IREG_MPU401CONTROL, 0x40, 0); /* ack? */
1693 		if (chip->rmidi) {
1694 			handled = 1;
1695 			snd_mpu401_uart_interrupt(irq, chip->rmidi->private_data);
1696 		}
1697 	}
1698 	return IRQ_RETVAL(handled);
1699 }
1700 
1701 #define ES1938_DMA_SIZE 64
1702 
1703 static int snd_es1938_mixer(struct es1938 *chip)
1704 {
1705 	struct snd_card *card;
1706 	unsigned int idx;
1707 	int err;
1708 
1709 	card = chip->card;
1710 
1711 	strcpy(card->mixername, "ESS Solo-1");
1712 
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);
1716 		switch (idx) {
1717 			case 0:
1718 				chip->master_volume = kctl;
1719 				kctl->private_free = snd_es1938_hwv_free;
1720 				break;
1721 			case 1:
1722 				chip->master_switch = kctl;
1723 				kctl->private_free = snd_es1938_hwv_free;
1724 				break;
1725 			case 2:
1726 				chip->hw_volume = kctl;
1727 				kctl->private_free = snd_es1938_hwv_free;
1728 				break;
1729 			case 3:
1730 				chip->hw_switch = kctl;
1731 				kctl->private_free = snd_es1938_hwv_free;
1732 				break;
1733 			}
1734 		if ((err = snd_ctl_add(card, kctl)) < 0)
1735 			return err;
1736 	}
1737 	return 0;
1738 }
1739 
1740 
1741 static int snd_es1938_probe(struct pci_dev *pci,
1742 			    const struct pci_device_id *pci_id)
1743 {
1744 	static int dev;
1745 	struct snd_card *card;
1746 	struct es1938 *chip;
1747 	struct snd_opl3 *opl3;
1748 	int idx, err;
1749 
1750 	if (dev >= SNDRV_CARDS)
1751 		return -ENODEV;
1752 	if (!enable[dev]) {
1753 		dev++;
1754 		return -ENOENT;
1755 	}
1756 
1757 	err = snd_card_new(&pci->dev, index[dev], id[dev], THIS_MODULE,
1758 			   0, &card);
1759 	if (err < 0)
1760 		return err;
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);
1765 		    	return -ENODEV;
1766 		}
1767 	}
1768 	if ((err = snd_es1938_create(card, pci, &chip)) < 0) {
1769 		snd_card_free(card);
1770 		return err;
1771 	}
1772 	card->private_data = chip;
1773 
1774 	strcpy(card->driver, "ES1938");
1775 	strcpy(card->shortname, "ESS ES1938 (Solo-1)");
1776 	sprintf(card->longname, "%s rev %i, irq %i",
1777 		card->shortname,
1778 		chip->revision,
1779 		chip->irq);
1780 
1781 	if ((err = snd_es1938_new_pcm(chip, 0)) < 0) {
1782 		snd_card_free(card);
1783 		return err;
1784 	}
1785 	if ((err = snd_es1938_mixer(chip)) < 0) {
1786 		snd_card_free(card);
1787 		return err;
1788 	}
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));
1795 	} else {
1796 	        if ((err = snd_opl3_timer_new(opl3, 0, 1)) < 0) {
1797 	                snd_card_free(card);
1798 	                return err;
1799 		}
1800 	        if ((err = snd_opl3_hwdep_new(opl3, 0, 1, NULL)) < 0) {
1801 	                snd_card_free(card);
1802 	                return err;
1803 		}
1804 	}
1805 	if (snd_mpu401_uart_new(card, 0, MPU401_HW_MPU401,
1806 				chip->mpu_port,
1807 				MPU401_INFO_INTEGRATED | MPU401_INFO_IRQ_HOOK,
1808 				-1, &chip->rmidi) < 0) {
1809 		dev_err(card->dev, "unable to initialize MPU-401\n");
1810 	} else {
1811 		// this line is vital for MIDI interrupt handling on ess-solo1
1812 		// andreas@flying-snail.de
1813 		snd_es1938_mixer_bits(chip, ESSSB_IREG_MPU401CONTROL, 0x40, 0x40);
1814 	}
1815 
1816 	snd_es1938_create_gameport(chip);
1817 
1818 	if ((err = snd_card_register(card)) < 0) {
1819 		snd_card_free(card);
1820 		return err;
1821 	}
1822 
1823 	pci_set_drvdata(pci, card);
1824 	dev++;
1825 	return 0;
1826 }
1827 
1828 static void snd_es1938_remove(struct pci_dev *pci)
1829 {
1830 	snd_card_free(pci_get_drvdata(pci));
1831 }
1832 
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,
1838 	.driver = {
1839 		.pm = ES1938_PM_OPS,
1840 	},
1841 };
1842 
1843 module_pci_driver(es1938_driver);
1844