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