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