xref: /linux/sound/pci/emu10k1/emu10k1_main.c (revision 3271b7b2da1db2e5f882d8b2a5f668157a76992f)
1 /*
2  *  Copyright (c) by Jaroslav Kysela <perex@suse.cz>
3  *                   Creative Labs, Inc.
4  *  Routines for control of EMU10K1 chips
5  *
6  *  Copyright (c) by James Courtier-Dutton <James@superbug.demon.co.uk>
7  *      Added support for Audigy 2 Value.
8  *
9  *
10  *  BUGS:
11  *    --
12  *
13  *  TODO:
14  *    --
15  *
16  *   This program is free software; you can redistribute it and/or modify
17  *   it under the terms of the GNU General Public License as published by
18  *   the Free Software Foundation; either version 2 of the License, or
19  *   (at your option) any later version.
20  *
21  *   This program is distributed in the hope that it will be useful,
22  *   but WITHOUT ANY WARRANTY; without even the implied warranty of
23  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
24  *   GNU General Public License for more details.
25  *
26  *   You should have received a copy of the GNU General Public License
27  *   along with this program; if not, write to the Free Software
28  *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
29  *
30  */
31 
32 #include <sound/driver.h>
33 #include <linux/delay.h>
34 #include <linux/init.h>
35 #include <linux/interrupt.h>
36 #include <linux/pci.h>
37 #include <linux/slab.h>
38 #include <linux/vmalloc.h>
39 #include <linux/mutex.h>
40 
41 
42 #include <sound/core.h>
43 #include <sound/emu10k1.h>
44 #include "p16v.h"
45 #include "tina2.h"
46 
47 
48 /*************************************************************************
49  * EMU10K1 init / done
50  *************************************************************************/
51 
52 void snd_emu10k1_voice_init(struct snd_emu10k1 * emu, int ch)
53 {
54 	snd_emu10k1_ptr_write(emu, DCYSUSV, ch, 0);
55 	snd_emu10k1_ptr_write(emu, IP, ch, 0);
56 	snd_emu10k1_ptr_write(emu, VTFT, ch, 0xffff);
57 	snd_emu10k1_ptr_write(emu, CVCF, ch, 0xffff);
58 	snd_emu10k1_ptr_write(emu, PTRX, ch, 0);
59 	snd_emu10k1_ptr_write(emu, CPF, ch, 0);
60 	snd_emu10k1_ptr_write(emu, CCR, ch, 0);
61 
62 	snd_emu10k1_ptr_write(emu, PSST, ch, 0);
63 	snd_emu10k1_ptr_write(emu, DSL, ch, 0x10);
64 	snd_emu10k1_ptr_write(emu, CCCA, ch, 0);
65 	snd_emu10k1_ptr_write(emu, Z1, ch, 0);
66 	snd_emu10k1_ptr_write(emu, Z2, ch, 0);
67 	snd_emu10k1_ptr_write(emu, FXRT, ch, 0x32100000);
68 
69 	snd_emu10k1_ptr_write(emu, ATKHLDM, ch, 0);
70 	snd_emu10k1_ptr_write(emu, DCYSUSM, ch, 0);
71 	snd_emu10k1_ptr_write(emu, IFATN, ch, 0xffff);
72 	snd_emu10k1_ptr_write(emu, PEFE, ch, 0);
73 	snd_emu10k1_ptr_write(emu, FMMOD, ch, 0);
74 	snd_emu10k1_ptr_write(emu, TREMFRQ, ch, 24);	/* 1 Hz */
75 	snd_emu10k1_ptr_write(emu, FM2FRQ2, ch, 24);	/* 1 Hz */
76 	snd_emu10k1_ptr_write(emu, TEMPENV, ch, 0);
77 
78 	/*** these are last so OFF prevents writing ***/
79 	snd_emu10k1_ptr_write(emu, LFOVAL2, ch, 0);
80 	snd_emu10k1_ptr_write(emu, LFOVAL1, ch, 0);
81 	snd_emu10k1_ptr_write(emu, ATKHLDV, ch, 0);
82 	snd_emu10k1_ptr_write(emu, ENVVOL, ch, 0);
83 	snd_emu10k1_ptr_write(emu, ENVVAL, ch, 0);
84 
85 	/* Audigy extra stuffs */
86 	if (emu->audigy) {
87 		snd_emu10k1_ptr_write(emu, 0x4c, ch, 0); /* ?? */
88 		snd_emu10k1_ptr_write(emu, 0x4d, ch, 0); /* ?? */
89 		snd_emu10k1_ptr_write(emu, 0x4e, ch, 0); /* ?? */
90 		snd_emu10k1_ptr_write(emu, 0x4f, ch, 0); /* ?? */
91 		snd_emu10k1_ptr_write(emu, A_FXRT1, ch, 0x03020100);
92 		snd_emu10k1_ptr_write(emu, A_FXRT2, ch, 0x3f3f3f3f);
93 		snd_emu10k1_ptr_write(emu, A_SENDAMOUNTS, ch, 0);
94 	}
95 }
96 
97 static unsigned int spi_dac_init[] = {
98 		0x00ff,
99 		0x02ff,
100 		0x0400,
101 		0x0520,
102 		0x0600,
103 		0x08ff,
104 		0x0aff,
105 		0x0cff,
106 		0x0eff,
107 		0x10ff,
108 		0x1200,
109 		0x1400,
110 		0x1480,
111 		0x1800,
112 		0x1aff,
113 		0x1cff,
114 		0x1e00,
115 		0x0530,
116 		0x0602,
117 		0x0622,
118 		0x1400,
119 };
120 
121 static int snd_emu10k1_init(struct snd_emu10k1 *emu, int enable_ir, int resume)
122 {
123 	unsigned int silent_page;
124 	int ch;
125 
126 	/* disable audio and lock cache */
127 	outl(HCFG_LOCKSOUNDCACHE | HCFG_LOCKTANKCACHE_MASK | HCFG_MUTEBUTTONENABLE,
128 	     emu->port + HCFG);
129 
130 	/* reset recording buffers */
131 	snd_emu10k1_ptr_write(emu, MICBS, 0, ADCBS_BUFSIZE_NONE);
132 	snd_emu10k1_ptr_write(emu, MICBA, 0, 0);
133 	snd_emu10k1_ptr_write(emu, FXBS, 0, ADCBS_BUFSIZE_NONE);
134 	snd_emu10k1_ptr_write(emu, FXBA, 0, 0);
135 	snd_emu10k1_ptr_write(emu, ADCBS, 0, ADCBS_BUFSIZE_NONE);
136 	snd_emu10k1_ptr_write(emu, ADCBA, 0, 0);
137 
138 	/* disable channel interrupt */
139 	outl(0, emu->port + INTE);
140 	snd_emu10k1_ptr_write(emu, CLIEL, 0, 0);
141 	snd_emu10k1_ptr_write(emu, CLIEH, 0, 0);
142 	snd_emu10k1_ptr_write(emu, SOLEL, 0, 0);
143 	snd_emu10k1_ptr_write(emu, SOLEH, 0, 0);
144 
145 	if (emu->audigy){
146 		/* set SPDIF bypass mode */
147 		snd_emu10k1_ptr_write(emu, SPBYPASS, 0, SPBYPASS_FORMAT);
148 		/* enable rear left + rear right AC97 slots */
149 		snd_emu10k1_ptr_write(emu, AC97SLOT, 0, AC97SLOT_REAR_RIGHT |
150 				      AC97SLOT_REAR_LEFT);
151 	}
152 
153 	/* init envelope engine */
154 	for (ch = 0; ch < NUM_G; ch++)
155 		snd_emu10k1_voice_init(emu, ch);
156 
157 	snd_emu10k1_ptr_write(emu, SPCS0, 0, emu->spdif_bits[0]);
158 	snd_emu10k1_ptr_write(emu, SPCS1, 0, emu->spdif_bits[1]);
159 	snd_emu10k1_ptr_write(emu, SPCS2, 0, emu->spdif_bits[2]);
160 
161 	if (emu->card_capabilities->ca0151_chip) { /* audigy2 */
162 		/* Hacks for Alice3 to work independent of haP16V driver */
163 		u32 tmp;
164 
165 		//Setup SRCMulti_I2S SamplingRate
166 		tmp = snd_emu10k1_ptr_read(emu, A_SPDIF_SAMPLERATE, 0);
167 		tmp &= 0xfffff1ff;
168 		tmp |= (0x2<<9);
169 		snd_emu10k1_ptr_write(emu, A_SPDIF_SAMPLERATE, 0, tmp);
170 
171 		/* Setup SRCSel (Enable Spdif,I2S SRCMulti) */
172 		snd_emu10k1_ptr20_write(emu, SRCSel, 0, 0x14);
173 		/* Setup SRCMulti Input Audio Enable */
174 		/* Use 0xFFFFFFFF to enable P16V sounds. */
175 		snd_emu10k1_ptr20_write(emu, SRCMULTI_ENABLE, 0, 0xFFFFFFFF);
176 
177 		/* Enabled Phased (8-channel) P16V playback */
178 		outl(0x0201, emu->port + HCFG2);
179 		/* Set playback routing. */
180 		snd_emu10k1_ptr20_write(emu, CAPTURE_P16V_SOURCE, 0, 0x78e4);
181 	}
182 	if (emu->card_capabilities->ca0108_chip) { /* audigy2 Value */
183 		/* Hacks for Alice3 to work independent of haP16V driver */
184 		u32 tmp;
185 
186 		snd_printk(KERN_INFO "Audigy2 value: Special config.\n");
187 		//Setup SRCMulti_I2S SamplingRate
188 		tmp = snd_emu10k1_ptr_read(emu, A_SPDIF_SAMPLERATE, 0);
189 		tmp &= 0xfffff1ff;
190 		tmp |= (0x2<<9);
191 		snd_emu10k1_ptr_write(emu, A_SPDIF_SAMPLERATE, 0, tmp);
192 
193 		/* Setup SRCSel (Enable Spdif,I2S SRCMulti) */
194 		outl(0x600000, emu->port + 0x20);
195 		outl(0x14, emu->port + 0x24);
196 
197 		/* Setup SRCMulti Input Audio Enable */
198 		outl(0x7b0000, emu->port + 0x20);
199 		outl(0xFF000000, emu->port + 0x24);
200 
201 		/* Setup SPDIF Out Audio Enable */
202 		/* The Audigy 2 Value has a separate SPDIF out,
203 		 * so no need for a mixer switch
204 		 */
205 		outl(0x7a0000, emu->port + 0x20);
206 		outl(0xFF000000, emu->port + 0x24);
207 		tmp = inl(emu->port + A_IOCFG) & ~0x8; /* Clear bit 3 */
208 		outl(tmp, emu->port + A_IOCFG);
209 	}
210 	if (emu->card_capabilities->spi_dac) { /* Audigy 2 ZS Notebook with DAC Wolfson WM8768/WM8568 */
211 		int size, n;
212 
213 		size = ARRAY_SIZE(spi_dac_init);
214 		for (n=0; n < size; n++)
215 			snd_emu10k1_spi_write(emu, spi_dac_init[n]);
216 
217 		snd_emu10k1_ptr20_write(emu, 0x60, 0, 0x10);
218 		/* Enable GPIOs
219 		 * GPIO0: Unknown
220 		 * GPIO1: Speakers-enabled.
221 		 * GPIO2: Unknown
222 		 * GPIO3: Unknown
223 		 * GPIO4: IEC958 Output on.
224 		 * GPIO5: Unknown
225 		 * GPIO6: Unknown
226 		 * GPIO7: Unknown
227 		 */
228 		outl(0x76, emu->port + A_IOCFG); /* Windows uses 0x3f76 */
229 
230 	}
231 
232 	snd_emu10k1_ptr_write(emu, PTB, 0, emu->ptb_pages.addr);
233 	snd_emu10k1_ptr_write(emu, TCB, 0, 0);	/* taken from original driver */
234 	snd_emu10k1_ptr_write(emu, TCBS, 0, 4);	/* taken from original driver */
235 
236 	silent_page = (emu->silent_page.addr << 1) | MAP_PTI_MASK;
237 	for (ch = 0; ch < NUM_G; ch++) {
238 		snd_emu10k1_ptr_write(emu, MAPA, ch, silent_page);
239 		snd_emu10k1_ptr_write(emu, MAPB, ch, silent_page);
240 	}
241 
242 	/*
243 	 *  Hokay, setup HCFG
244 	 *   Mute Disable Audio = 0
245 	 *   Lock Tank Memory = 1
246 	 *   Lock Sound Memory = 0
247 	 *   Auto Mute = 1
248 	 */
249 	if (emu->audigy) {
250 		if (emu->revision == 4) /* audigy2 */
251 			outl(HCFG_AUDIOENABLE |
252 			     HCFG_AC3ENABLE_CDSPDIF |
253 			     HCFG_AC3ENABLE_GPSPDIF |
254 			     HCFG_AUTOMUTE | HCFG_JOYENABLE, emu->port + HCFG);
255 		else
256 			outl(HCFG_AUTOMUTE | HCFG_JOYENABLE, emu->port + HCFG);
257 	/* FIXME: Remove all these emu->model and replace it with a card recognition parameter,
258 	 * e.g. card_capabilities->joystick */
259 	} else if (emu->model == 0x20 ||
260 	    emu->model == 0xc400 ||
261 	    (emu->model == 0x21 && emu->revision < 6))
262 		outl(HCFG_LOCKTANKCACHE_MASK | HCFG_AUTOMUTE, emu->port + HCFG);
263 	else
264 		// With on-chip joystick
265 		outl(HCFG_LOCKTANKCACHE_MASK | HCFG_AUTOMUTE | HCFG_JOYENABLE, emu->port + HCFG);
266 
267 	if (enable_ir) {	/* enable IR for SB Live */
268 		if ( emu->card_capabilities->emu1212m) {
269 			;  /* Disable all access to A_IOCFG for the emu1212m */
270 		} else if (emu->audigy) {
271 			unsigned int reg = inl(emu->port + A_IOCFG);
272 			outl(reg | A_IOCFG_GPOUT2, emu->port + A_IOCFG);
273 			udelay(500);
274 			outl(reg | A_IOCFG_GPOUT1 | A_IOCFG_GPOUT2, emu->port + A_IOCFG);
275 			udelay(100);
276 			outl(reg, emu->port + A_IOCFG);
277 		} else {
278 			unsigned int reg = inl(emu->port + HCFG);
279 			outl(reg | HCFG_GPOUT2, emu->port + HCFG);
280 			udelay(500);
281 			outl(reg | HCFG_GPOUT1 | HCFG_GPOUT2, emu->port + HCFG);
282 			udelay(100);
283 			outl(reg, emu->port + HCFG);
284  		}
285 	}
286 
287 	if ( emu->card_capabilities->emu1212m) {
288 		;  /* Disable all access to A_IOCFG for the emu1212m */
289 	} else if (emu->audigy) {	/* enable analog output */
290 		unsigned int reg = inl(emu->port + A_IOCFG);
291 		outl(reg | A_IOCFG_GPOUT0, emu->port + A_IOCFG);
292 	}
293 
294 	return 0;
295 }
296 
297 static void snd_emu10k1_audio_enable(struct snd_emu10k1 *emu)
298 {
299 	/*
300 	 *  Enable the audio bit
301 	 */
302 	outl(inl(emu->port + HCFG) | HCFG_AUDIOENABLE, emu->port + HCFG);
303 
304 	/* Enable analog/digital outs on audigy */
305 	if ( emu->card_capabilities->emu1212m) {
306 		;  /* Disable all access to A_IOCFG for the emu1212m */
307 	} else if (emu->audigy) {
308 		outl(inl(emu->port + A_IOCFG) & ~0x44, emu->port + A_IOCFG);
309 
310 		if (emu->card_capabilities->ca0151_chip) { /* audigy2 */
311 			/* Unmute Analog now.  Set GPO6 to 1 for Apollo.
312 			 * This has to be done after init ALice3 I2SOut beyond 48KHz.
313 			 * So, sequence is important. */
314 			outl(inl(emu->port + A_IOCFG) | 0x0040, emu->port + A_IOCFG);
315 		} else if (emu->card_capabilities->ca0108_chip) { /* audigy2 value */
316 			/* Unmute Analog now. */
317 			outl(inl(emu->port + A_IOCFG) | 0x0060, emu->port + A_IOCFG);
318 		} else {
319 			/* Disable routing from AC97 line out to Front speakers */
320 			outl(inl(emu->port + A_IOCFG) | 0x0080, emu->port + A_IOCFG);
321 		}
322 	}
323 
324 #if 0
325 	{
326 	unsigned int tmp;
327 	/* FIXME: the following routine disables LiveDrive-II !! */
328 	// TOSLink detection
329 	emu->tos_link = 0;
330 	tmp = inl(emu->port + HCFG);
331 	if (tmp & (HCFG_GPINPUT0 | HCFG_GPINPUT1)) {
332 		outl(tmp|0x800, emu->port + HCFG);
333 		udelay(50);
334 		if (tmp != (inl(emu->port + HCFG) & ~0x800)) {
335 			emu->tos_link = 1;
336 			outl(tmp, emu->port + HCFG);
337 		}
338 	}
339 	}
340 #endif
341 
342 	snd_emu10k1_intr_enable(emu, INTE_PCIERRORENABLE);
343 }
344 
345 int snd_emu10k1_done(struct snd_emu10k1 * emu)
346 {
347 	int ch;
348 
349 	outl(0, emu->port + INTE);
350 
351 	/*
352 	 *  Shutdown the chip
353 	 */
354 	for (ch = 0; ch < NUM_G; ch++)
355 		snd_emu10k1_ptr_write(emu, DCYSUSV, ch, 0);
356 	for (ch = 0; ch < NUM_G; ch++) {
357 		snd_emu10k1_ptr_write(emu, VTFT, ch, 0);
358 		snd_emu10k1_ptr_write(emu, CVCF, ch, 0);
359 		snd_emu10k1_ptr_write(emu, PTRX, ch, 0);
360 		snd_emu10k1_ptr_write(emu, CPF, ch, 0);
361 	}
362 
363 	/* reset recording buffers */
364 	snd_emu10k1_ptr_write(emu, MICBS, 0, 0);
365 	snd_emu10k1_ptr_write(emu, MICBA, 0, 0);
366 	snd_emu10k1_ptr_write(emu, FXBS, 0, 0);
367 	snd_emu10k1_ptr_write(emu, FXBA, 0, 0);
368 	snd_emu10k1_ptr_write(emu, FXWC, 0, 0);
369 	snd_emu10k1_ptr_write(emu, ADCBS, 0, ADCBS_BUFSIZE_NONE);
370 	snd_emu10k1_ptr_write(emu, ADCBA, 0, 0);
371 	snd_emu10k1_ptr_write(emu, TCBS, 0, TCBS_BUFFSIZE_16K);
372 	snd_emu10k1_ptr_write(emu, TCB, 0, 0);
373 	if (emu->audigy)
374 		snd_emu10k1_ptr_write(emu, A_DBG, 0, A_DBG_SINGLE_STEP);
375 	else
376 		snd_emu10k1_ptr_write(emu, DBG, 0, EMU10K1_DBG_SINGLE_STEP);
377 
378 	/* disable channel interrupt */
379 	snd_emu10k1_ptr_write(emu, CLIEL, 0, 0);
380 	snd_emu10k1_ptr_write(emu, CLIEH, 0, 0);
381 	snd_emu10k1_ptr_write(emu, SOLEL, 0, 0);
382 	snd_emu10k1_ptr_write(emu, SOLEH, 0, 0);
383 
384 	/* disable audio and lock cache */
385 	outl(HCFG_LOCKSOUNDCACHE | HCFG_LOCKTANKCACHE_MASK | HCFG_MUTEBUTTONENABLE, emu->port + HCFG);
386 	snd_emu10k1_ptr_write(emu, PTB, 0, 0);
387 
388 	return 0;
389 }
390 
391 /*************************************************************************
392  * ECARD functional implementation
393  *************************************************************************/
394 
395 /* In A1 Silicon, these bits are in the HC register */
396 #define HOOKN_BIT		(1L << 12)
397 #define HANDN_BIT		(1L << 11)
398 #define PULSEN_BIT		(1L << 10)
399 
400 #define EC_GDI1			(1 << 13)
401 #define EC_GDI0			(1 << 14)
402 
403 #define EC_NUM_CONTROL_BITS	20
404 
405 #define EC_AC3_DATA_SELN	0x0001L
406 #define EC_EE_DATA_SEL		0x0002L
407 #define EC_EE_CNTRL_SELN	0x0004L
408 #define EC_EECLK		0x0008L
409 #define EC_EECS			0x0010L
410 #define EC_EESDO		0x0020L
411 #define EC_TRIM_CSN		0x0040L
412 #define EC_TRIM_SCLK		0x0080L
413 #define EC_TRIM_SDATA		0x0100L
414 #define EC_TRIM_MUTEN		0x0200L
415 #define EC_ADCCAL		0x0400L
416 #define EC_ADCRSTN		0x0800L
417 #define EC_DACCAL		0x1000L
418 #define EC_DACMUTEN		0x2000L
419 #define EC_LEDN			0x4000L
420 
421 #define EC_SPDIF0_SEL_SHIFT	15
422 #define EC_SPDIF1_SEL_SHIFT	17
423 #define EC_SPDIF0_SEL_MASK	(0x3L << EC_SPDIF0_SEL_SHIFT)
424 #define EC_SPDIF1_SEL_MASK	(0x7L << EC_SPDIF1_SEL_SHIFT)
425 #define EC_SPDIF0_SELECT(_x)	(((_x) << EC_SPDIF0_SEL_SHIFT) & EC_SPDIF0_SEL_MASK)
426 #define EC_SPDIF1_SELECT(_x)	(((_x) << EC_SPDIF1_SEL_SHIFT) & EC_SPDIF1_SEL_MASK)
427 #define EC_CURRENT_PROM_VERSION 0x01	/* Self-explanatory.  This should
428 					 * be incremented any time the EEPROM's
429 					 * format is changed.  */
430 
431 #define EC_EEPROM_SIZE		0x40	/* ECARD EEPROM has 64 16-bit words */
432 
433 /* Addresses for special values stored in to EEPROM */
434 #define EC_PROM_VERSION_ADDR	0x20	/* Address of the current prom version */
435 #define EC_BOARDREV0_ADDR	0x21	/* LSW of board rev */
436 #define EC_BOARDREV1_ADDR	0x22	/* MSW of board rev */
437 
438 #define EC_LAST_PROMFILE_ADDR	0x2f
439 
440 #define EC_SERIALNUM_ADDR	0x30	/* First word of serial number.  The
441 					 * can be up to 30 characters in length
442 					 * and is stored as a NULL-terminated
443 					 * ASCII string.  Any unused bytes must be
444 					 * filled with zeros */
445 #define EC_CHECKSUM_ADDR	0x3f	/* Location at which checksum is stored */
446 
447 
448 /* Most of this stuff is pretty self-evident.  According to the hardware
449  * dudes, we need to leave the ADCCAL bit low in order to avoid a DC
450  * offset problem.  Weird.
451  */
452 #define EC_RAW_RUN_MODE		(EC_DACMUTEN | EC_ADCRSTN | EC_TRIM_MUTEN | \
453 				 EC_TRIM_CSN)
454 
455 
456 #define EC_DEFAULT_ADC_GAIN	0xC4C4
457 #define EC_DEFAULT_SPDIF0_SEL	0x0
458 #define EC_DEFAULT_SPDIF1_SEL	0x4
459 
460 /**************************************************************************
461  * @func Clock bits into the Ecard's control latch.  The Ecard uses a
462  *  control latch will is loaded bit-serially by toggling the Modem control
463  *  lines from function 2 on the E8010.  This function hides these details
464  *  and presents the illusion that we are actually writing to a distinct
465  *  register.
466  */
467 
468 static void snd_emu10k1_ecard_write(struct snd_emu10k1 * emu, unsigned int value)
469 {
470 	unsigned short count;
471 	unsigned int data;
472 	unsigned long hc_port;
473 	unsigned int hc_value;
474 
475 	hc_port = emu->port + HCFG;
476 	hc_value = inl(hc_port) & ~(HOOKN_BIT | HANDN_BIT | PULSEN_BIT);
477 	outl(hc_value, hc_port);
478 
479 	for (count = 0; count < EC_NUM_CONTROL_BITS; count++) {
480 
481 		/* Set up the value */
482 		data = ((value & 0x1) ? PULSEN_BIT : 0);
483 		value >>= 1;
484 
485 		outl(hc_value | data, hc_port);
486 
487 		/* Clock the shift register */
488 		outl(hc_value | data | HANDN_BIT, hc_port);
489 		outl(hc_value | data, hc_port);
490 	}
491 
492 	/* Latch the bits */
493 	outl(hc_value | HOOKN_BIT, hc_port);
494 	outl(hc_value, hc_port);
495 }
496 
497 /**************************************************************************
498  * @func Set the gain of the ECARD's CS3310 Trim/gain controller.  The
499  * trim value consists of a 16bit value which is composed of two
500  * 8 bit gain/trim values, one for the left channel and one for the
501  * right channel.  The following table maps from the Gain/Attenuation
502  * value in decibels into the corresponding bit pattern for a single
503  * channel.
504  */
505 
506 static void snd_emu10k1_ecard_setadcgain(struct snd_emu10k1 * emu,
507 					 unsigned short gain)
508 {
509 	unsigned int bit;
510 
511 	/* Enable writing to the TRIM registers */
512 	snd_emu10k1_ecard_write(emu, emu->ecard_ctrl & ~EC_TRIM_CSN);
513 
514 	/* Do it again to insure that we meet hold time requirements */
515 	snd_emu10k1_ecard_write(emu, emu->ecard_ctrl & ~EC_TRIM_CSN);
516 
517 	for (bit = (1 << 15); bit; bit >>= 1) {
518 		unsigned int value;
519 
520 		value = emu->ecard_ctrl & ~(EC_TRIM_CSN | EC_TRIM_SDATA);
521 
522 		if (gain & bit)
523 			value |= EC_TRIM_SDATA;
524 
525 		/* Clock the bit */
526 		snd_emu10k1_ecard_write(emu, value);
527 		snd_emu10k1_ecard_write(emu, value | EC_TRIM_SCLK);
528 		snd_emu10k1_ecard_write(emu, value);
529 	}
530 
531 	snd_emu10k1_ecard_write(emu, emu->ecard_ctrl);
532 }
533 
534 static int snd_emu10k1_ecard_init(struct snd_emu10k1 * emu)
535 {
536 	unsigned int hc_value;
537 
538 	/* Set up the initial settings */
539 	emu->ecard_ctrl = EC_RAW_RUN_MODE |
540 			  EC_SPDIF0_SELECT(EC_DEFAULT_SPDIF0_SEL) |
541 			  EC_SPDIF1_SELECT(EC_DEFAULT_SPDIF1_SEL);
542 
543 	/* Step 0: Set the codec type in the hardware control register
544 	 * and enable audio output */
545 	hc_value = inl(emu->port + HCFG);
546 	outl(hc_value | HCFG_AUDIOENABLE | HCFG_CODECFORMAT_I2S, emu->port + HCFG);
547 	inl(emu->port + HCFG);
548 
549 	/* Step 1: Turn off the led and deassert TRIM_CS */
550 	snd_emu10k1_ecard_write(emu, EC_ADCCAL | EC_LEDN | EC_TRIM_CSN);
551 
552 	/* Step 2: Calibrate the ADC and DAC */
553 	snd_emu10k1_ecard_write(emu, EC_DACCAL | EC_LEDN | EC_TRIM_CSN);
554 
555 	/* Step 3: Wait for awhile;   XXX We can't get away with this
556 	 * under a real operating system; we'll need to block and wait that
557 	 * way. */
558 	snd_emu10k1_wait(emu, 48000);
559 
560 	/* Step 4: Switch off the DAC and ADC calibration.  Note
561 	 * That ADC_CAL is actually an inverted signal, so we assert
562 	 * it here to stop calibration.  */
563 	snd_emu10k1_ecard_write(emu, EC_ADCCAL | EC_LEDN | EC_TRIM_CSN);
564 
565 	/* Step 4: Switch into run mode */
566 	snd_emu10k1_ecard_write(emu, emu->ecard_ctrl);
567 
568 	/* Step 5: Set the analog input gain */
569 	snd_emu10k1_ecard_setadcgain(emu, EC_DEFAULT_ADC_GAIN);
570 
571 	return 0;
572 }
573 
574 static int snd_emu10k1_cardbus_init(struct snd_emu10k1 * emu)
575 {
576 	unsigned long special_port;
577 	unsigned int value;
578 
579 	/* Special initialisation routine
580 	 * before the rest of the IO-Ports become active.
581 	 */
582 	special_port = emu->port + 0x38;
583 	value = inl(special_port);
584 	outl(0x00d00000, special_port);
585 	value = inl(special_port);
586 	outl(0x00d00001, special_port);
587 	value = inl(special_port);
588 	outl(0x00d0005f, special_port);
589 	value = inl(special_port);
590 	outl(0x00d0007f, special_port);
591 	value = inl(special_port);
592 	outl(0x0090007f, special_port);
593 	value = inl(special_port);
594 
595 	snd_emu10k1_ptr20_write(emu, TINA2_VOLUME, 0, 0xfefefefe); /* Defaults to 0x30303030 */
596 	return 0;
597 }
598 
599 static int snd_emu1212m_fpga_write(struct snd_emu10k1 * emu, int reg, int value)
600 {
601 	if (reg<0 || reg>0x3f)
602 		return 1;
603 	reg+=0x40; /* 0x40 upwards are registers. */
604 	if (value<0 || value>0x3f) /* 0 to 0x3f are values */
605 		return 1;
606 	outl(reg, emu->port + A_IOCFG);
607 	outl(reg | 0x80, emu->port + A_IOCFG);  /* High bit clocks the value into the fpga. */
608 	outl(value, emu->port + A_IOCFG);
609 	outl(value | 0x80 , emu->port + A_IOCFG);  /* High bit clocks the value into the fpga. */
610 
611 	return 0;
612 }
613 
614 static int snd_emu1212m_fpga_read(struct snd_emu10k1 * emu, int reg, int *value)
615 {
616 	if (reg<0 || reg>0x3f)
617 		return 1;
618 	reg+=0x40; /* 0x40 upwards are registers. */
619 	outl(reg, emu->port + A_IOCFG);
620 	outl(reg | 0x80, emu->port + A_IOCFG);  /* High bit clocks the value into the fpga. */
621 	*value = inl(emu->port + A_IOCFG);
622 
623 	return 0;
624 }
625 
626 static int snd_emu1212m_fpga_netlist_write(struct snd_emu10k1 * emu, int reg, int value)
627 {
628 	snd_emu1212m_fpga_write(emu, 0x00, ((reg >> 8) & 0x3f) );
629 	snd_emu1212m_fpga_write(emu, 0x01, (reg & 0x3f) );
630 	snd_emu1212m_fpga_write(emu, 0x02, ((value >> 8) & 0x3f) );
631 	snd_emu1212m_fpga_write(emu, 0x03, (value & 0x3f) );
632 
633 	return 0;
634 }
635 
636 static int snd_emu10k1_emu1212m_init(struct snd_emu10k1 * emu)
637 {
638 	unsigned int i;
639 	int tmp;
640 
641 	snd_printk(KERN_ERR "emu1212m: Special config.\n");
642 	outl(0x0005a00c, emu->port + HCFG);
643 	outl(0x0005a004, emu->port + HCFG);
644 	outl(0x0005a000, emu->port + HCFG);
645 	outl(0x0005a000, emu->port + HCFG);
646 
647 	snd_emu1212m_fpga_read(emu, 0x22, &tmp );
648 	snd_emu1212m_fpga_read(emu, 0x23, &tmp );
649 	snd_emu1212m_fpga_read(emu, 0x24, &tmp );
650 	snd_emu1212m_fpga_write(emu, 0x04, 0x01 );
651 	snd_emu1212m_fpga_read(emu, 0x0b, &tmp );
652 	snd_emu1212m_fpga_write(emu, 0x0b, 0x01 );
653 	snd_emu1212m_fpga_read(emu, 0x10, &tmp );
654 	snd_emu1212m_fpga_write(emu, 0x10, 0x00 );
655 	snd_emu1212m_fpga_read(emu, 0x11, &tmp );
656 	snd_emu1212m_fpga_write(emu, 0x11, 0x30 );
657 	snd_emu1212m_fpga_read(emu, 0x13, &tmp );
658 	snd_emu1212m_fpga_write(emu, 0x13, 0x0f );
659 	snd_emu1212m_fpga_read(emu, 0x11, &tmp );
660 	snd_emu1212m_fpga_write(emu, 0x11, 0x30 );
661 	snd_emu1212m_fpga_read(emu, 0x0a, &tmp );
662 	snd_emu1212m_fpga_write(emu, 0x0a, 0x10 );
663 	snd_emu1212m_fpga_write(emu, 0x0c, 0x19 );
664 	snd_emu1212m_fpga_write(emu, 0x12, 0x0c );
665 	snd_emu1212m_fpga_write(emu, 0x09, 0x0f );
666 	snd_emu1212m_fpga_write(emu, 0x06, 0x00 );
667 	snd_emu1212m_fpga_write(emu, 0x05, 0x00 );
668 	snd_emu1212m_fpga_write(emu, 0x0e, 0x12 );
669 	snd_emu1212m_fpga_netlist_write(emu, 0x0000, 0x0200);
670 	snd_emu1212m_fpga_netlist_write(emu, 0x0001, 0x0201);
671 	snd_emu1212m_fpga_netlist_write(emu, 0x0002, 0x0500);
672 	snd_emu1212m_fpga_netlist_write(emu, 0x0003, 0x0501);
673 	snd_emu1212m_fpga_netlist_write(emu, 0x0004, 0x0400);
674 	snd_emu1212m_fpga_netlist_write(emu, 0x0005, 0x0401);
675 	snd_emu1212m_fpga_netlist_write(emu, 0x0006, 0x0402);
676 	snd_emu1212m_fpga_netlist_write(emu, 0x0007, 0x0403);
677 	snd_emu1212m_fpga_netlist_write(emu, 0x0008, 0x0404);
678 	snd_emu1212m_fpga_netlist_write(emu, 0x0009, 0x0405);
679 	snd_emu1212m_fpga_netlist_write(emu, 0x000a, 0x0406);
680 	snd_emu1212m_fpga_netlist_write(emu, 0x000b, 0x0407);
681 	snd_emu1212m_fpga_netlist_write(emu, 0x000c, 0x0100);
682 	snd_emu1212m_fpga_netlist_write(emu, 0x000d, 0x0104);
683 	snd_emu1212m_fpga_netlist_write(emu, 0x000e, 0x0200);
684 	snd_emu1212m_fpga_netlist_write(emu, 0x000f, 0x0201);
685 	for (i=0;i < 0x20;i++) {
686 		snd_emu1212m_fpga_netlist_write(emu, 0x0100+i, 0x0000);
687 	}
688 	for (i=0;i < 4;i++) {
689 		snd_emu1212m_fpga_netlist_write(emu, 0x0200+i, 0x0000);
690 	}
691 	for (i=0;i < 7;i++) {
692 		snd_emu1212m_fpga_netlist_write(emu, 0x0300+i, 0x0000);
693 	}
694 	for (i=0;i < 7;i++) {
695 		snd_emu1212m_fpga_netlist_write(emu, 0x0400+i, 0x0000);
696 	}
697 	snd_emu1212m_fpga_netlist_write(emu, 0x0500, 0x0108);
698 	snd_emu1212m_fpga_netlist_write(emu, 0x0501, 0x010c);
699 	snd_emu1212m_fpga_netlist_write(emu, 0x0600, 0x0110);
700 	snd_emu1212m_fpga_netlist_write(emu, 0x0601, 0x0114);
701 	snd_emu1212m_fpga_netlist_write(emu, 0x0700, 0x0118);
702 	snd_emu1212m_fpga_netlist_write(emu, 0x0701, 0x011c);
703 	snd_emu1212m_fpga_write(emu, 0x07, 0x01 );
704 
705 	snd_emu1212m_fpga_read(emu, 0x21, &tmp );
706 
707 	outl(0x0000a000, emu->port + HCFG);
708 	outl(0x0000a001, emu->port + HCFG);
709 	/* Initial boot complete. Now patches */
710 
711 	snd_emu1212m_fpga_read(emu, 0x21, &tmp );
712 	snd_emu1212m_fpga_write(emu, 0x0c, 0x19 );
713 	snd_emu1212m_fpga_write(emu, 0x12, 0x0c );
714 	snd_emu1212m_fpga_write(emu, 0x0c, 0x19 );
715 	snd_emu1212m_fpga_write(emu, 0x12, 0x0c );
716 	snd_emu1212m_fpga_read(emu, 0x0a, &tmp );
717 	snd_emu1212m_fpga_write(emu, 0x0a, 0x10 );
718 
719 	snd_emu1212m_fpga_read(emu, 0x20, &tmp );
720 	snd_emu1212m_fpga_read(emu, 0x21, &tmp );
721 
722 	snd_emu1212m_fpga_netlist_write(emu, 0x0300, 0x0312);
723 	snd_emu1212m_fpga_netlist_write(emu, 0x0301, 0x0313);
724 	snd_emu1212m_fpga_netlist_write(emu, 0x0200, 0x0302);
725 	snd_emu1212m_fpga_netlist_write(emu, 0x0201, 0x0303);
726 
727 	return 0;
728 }
729 /*
730  *  Create the EMU10K1 instance
731  */
732 
733 #ifdef CONFIG_PM
734 static int alloc_pm_buffer(struct snd_emu10k1 *emu);
735 static void free_pm_buffer(struct snd_emu10k1 *emu);
736 #endif
737 
738 static int snd_emu10k1_free(struct snd_emu10k1 *emu)
739 {
740 	if (emu->port) {	/* avoid access to already used hardware */
741 	       	snd_emu10k1_fx8010_tram_setup(emu, 0);
742 		snd_emu10k1_done(emu);
743 		/* remove reserved page */
744 		if (emu->reserved_page) {
745 			snd_emu10k1_synth_free(emu, (struct snd_util_memblk *)emu->reserved_page);
746 			emu->reserved_page = NULL;
747 		}
748 		snd_emu10k1_free_efx(emu);
749        	}
750 	if (emu->memhdr)
751 		snd_util_memhdr_free(emu->memhdr);
752 	if (emu->silent_page.area)
753 		snd_dma_free_pages(&emu->silent_page);
754 	if (emu->ptb_pages.area)
755 		snd_dma_free_pages(&emu->ptb_pages);
756 	vfree(emu->page_ptr_table);
757 	vfree(emu->page_addr_table);
758 #ifdef CONFIG_PM
759 	free_pm_buffer(emu);
760 #endif
761 	if (emu->irq >= 0)
762 		free_irq(emu->irq, (void *)emu);
763 	if (emu->port)
764 		pci_release_regions(emu->pci);
765 	if (emu->card_capabilities->ca0151_chip) /* P16V */
766 		snd_p16v_free(emu);
767 	pci_disable_device(emu->pci);
768 	kfree(emu);
769 	return 0;
770 }
771 
772 static int snd_emu10k1_dev_free(struct snd_device *device)
773 {
774 	struct snd_emu10k1 *emu = device->device_data;
775 	return snd_emu10k1_free(emu);
776 }
777 
778 static struct snd_emu_chip_details emu_chip_details[] = {
779 	/* Audigy 2 Value AC3 out does not work yet. Need to find out how to turn off interpolators.*/
780 	/* Tested by James@superbug.co.uk 3rd July 2005 */
781 	/* DSP: CA0108-IAT
782 	 * DAC: CS4382-KQ
783 	 * ADC: Philips 1361T
784 	 * AC97: STAC9750
785 	 * CA0151: None
786 	 */
787 	{.vendor = 0x1102, .device = 0x0008, .subsystem = 0x10011102,
788 	 .driver = "Audigy2", .name = "Audigy 2 Value [SB0400]",
789 	 .id = "Audigy2",
790 	 .emu10k2_chip = 1,
791 	 .ca0108_chip = 1,
792 	 .spk71 = 1,
793 	 .ac97_chip = 1} ,
794 	/* Audigy4 (Not PRO) SB0610 */
795 	/* Tested by James@superbug.co.uk 4th April 2006 */
796 	/* A_IOCFG bits
797 	 * Output
798 	 * 0: ?
799 	 * 1: ?
800 	 * 2: ?
801 	 * 3: 0 - Digital Out, 1 - Line in
802 	 * 4: ?
803 	 * 5: ?
804 	 * 6: ?
805 	 * 7: ?
806 	 * Input
807 	 * 8: ?
808 	 * 9: ?
809 	 * A: Green jack sense (Front)
810 	 * B: ?
811 	 * C: Black jack sense (Rear/Side Right)
812 	 * D: Yellow jack sense (Center/LFE/Side Left)
813 	 * E: ?
814 	 * F: ?
815 	 *
816 	 * Digital Out/Line in switch using A_IOCFG bit 3 (0x08)
817 	 * 0 - Digital Out
818 	 * 1 - Line in
819 	 */
820 	/* Mic input not tested.
821 	 * Analog CD input not tested
822 	 * Digital Out not tested.
823 	 * Line in working.
824 	 * Audio output 5.1 working. Side outputs not working.
825 	 */
826 	/* DSP: CA10300-IAT LF
827 	 * DAC: Cirrus Logic CS4382-KQZ
828 	 * ADC: Philips 1361T
829 	 * AC97: Sigmatel STAC9750
830 	 * CA0151: None
831 	 */
832 	{.vendor = 0x1102, .device = 0x0008, .subsystem = 0x10211102,
833 	 .driver = "Audigy2", .name = "Audigy 4 [SB0610]",
834 	 .id = "Audigy2",
835 	 .emu10k2_chip = 1,
836 	 .ca0108_chip = 1,
837 	 .spk71 = 1,
838 	 .adc_1361t = 1,  /* 24 bit capture instead of 16bit */
839 	 .ac97_chip = 1} ,
840 	/* Audigy 2 ZS Notebook Cardbus card.*/
841 	/* Tested by James@superbug.co.uk 22th December 2005 */
842 	/* Audio output 7.1/Headphones working.
843 	 * Digital output working. (AC3 not checked, only PCM)
844 	 * Audio inputs not tested.
845 	 */
846 	/* DSP: Tina2
847 	 * DAC: Wolfson WM8768/WM8568
848 	 * ADC: Wolfson WM8775
849 	 * AC97: None
850 	 * CA0151: None
851 	 */
852 	{.vendor = 0x1102, .device = 0x0008, .subsystem = 0x20011102,
853 	 .driver = "Audigy2", .name = "Audigy 2 ZS Notebook [SB0530]",
854 	 .id = "Audigy2",
855 	 .emu10k2_chip = 1,
856 	 .ca0108_chip = 1,
857 	 .ca_cardbus_chip = 1,
858 	 .spi_dac = 1,
859 	 .spk71 = 1} ,
860 	{.vendor = 0x1102, .device = 0x0008,
861 	 .driver = "Audigy2", .name = "Audigy 2 Value [Unknown]",
862 	 .id = "Audigy2",
863 	 .emu10k2_chip = 1,
864 	 .ca0108_chip = 1,
865 	 .ac97_chip = 1} ,
866 	/* Tested by James@superbug.co.uk 8th July 2005. No sound available yet. */
867 	{.vendor = 0x1102, .device = 0x0004, .subsystem = 0x40011102,
868 	 .driver = "Audigy2", .name = "E-mu 1212m [4001]",
869 	 .id = "EMU1212m",
870 	 .emu10k2_chip = 1,
871 	 .ca0102_chip = 1,
872 	 .emu1212m = 1} ,
873 	/* Tested by James@superbug.co.uk 3rd July 2005 */
874 	{.vendor = 0x1102, .device = 0x0004, .subsystem = 0x20071102,
875 	 .driver = "Audigy2", .name = "Audigy 4 PRO [SB0380]",
876 	 .id = "Audigy2",
877 	 .emu10k2_chip = 1,
878 	 .ca0102_chip = 1,
879 	 .ca0151_chip = 1,
880 	 .spk71 = 1,
881 	 .spdif_bug = 1,
882 	 .ac97_chip = 1} ,
883 	/* Tested by shane-alsa@cm.nu 5th Nov 2005 */
884 	/* The 0x20061102 does have SB0350 written on it
885 	 * Just like 0x20021102
886 	 */
887 	{.vendor = 0x1102, .device = 0x0004, .subsystem = 0x20061102,
888 	 .driver = "Audigy2", .name = "Audigy 2 [SB0350b]",
889 	 .id = "Audigy2",
890 	 .emu10k2_chip = 1,
891 	 .ca0102_chip = 1,
892 	 .ca0151_chip = 1,
893 	 .spk71 = 1,
894 	 .spdif_bug = 1,
895 	 .ac97_chip = 1} ,
896 	{.vendor = 0x1102, .device = 0x0004, .subsystem = 0x20021102,
897 	 .driver = "Audigy2", .name = "Audigy 2 ZS [SB0350]",
898 	 .id = "Audigy2",
899 	 .emu10k2_chip = 1,
900 	 .ca0102_chip = 1,
901 	 .ca0151_chip = 1,
902 	 .spk71 = 1,
903 	 .spdif_bug = 1,
904 	 .ac97_chip = 1} ,
905 	{.vendor = 0x1102, .device = 0x0004, .subsystem = 0x20011102,
906 	 .driver = "Audigy2", .name = "Audigy 2 ZS [2001]",
907 	 .id = "Audigy2",
908 	 .emu10k2_chip = 1,
909 	 .ca0102_chip = 1,
910 	 .ca0151_chip = 1,
911 	 .spk71 = 1,
912 	 .spdif_bug = 1,
913 	 .ac97_chip = 1} ,
914 	/* Audigy 2 */
915 	/* Tested by James@superbug.co.uk 3rd July 2005 */
916 	/* DSP: CA0102-IAT
917 	 * DAC: CS4382-KQ
918 	 * ADC: Philips 1361T
919 	 * AC97: STAC9721
920 	 * CA0151: Yes
921 	 */
922 	{.vendor = 0x1102, .device = 0x0004, .subsystem = 0x10071102,
923 	 .driver = "Audigy2", .name = "Audigy 2 [SB0240]",
924 	 .id = "Audigy2",
925 	 .emu10k2_chip = 1,
926 	 .ca0102_chip = 1,
927 	 .ca0151_chip = 1,
928 	 .spk71 = 1,
929 	 .spdif_bug = 1,
930 	 .adc_1361t = 1,  /* 24 bit capture instead of 16bit */
931 	 .ac97_chip = 1} ,
932 	{.vendor = 0x1102, .device = 0x0004, .subsystem = 0x10051102,
933 	 .driver = "Audigy2", .name = "Audigy 2 EX [1005]",
934 	 .id = "Audigy2",
935 	 .emu10k2_chip = 1,
936 	 .ca0102_chip = 1,
937 	 .ca0151_chip = 1,
938 	 .spk71 = 1,
939 	 .spdif_bug = 1} ,
940 	/* Dell OEM/Creative Labs Audigy 2 ZS */
941 	/* See ALSA bug#1365 */
942 	{.vendor = 0x1102, .device = 0x0004, .subsystem = 0x10031102,
943 	 .driver = "Audigy2", .name = "Audigy 2 ZS [SB0353]",
944 	 .id = "Audigy2",
945 	 .emu10k2_chip = 1,
946 	 .ca0102_chip = 1,
947 	 .ca0151_chip = 1,
948 	 .spk71 = 1,
949 	 .spdif_bug = 1,
950 	 .ac97_chip = 1} ,
951 	{.vendor = 0x1102, .device = 0x0004, .subsystem = 0x10021102,
952 	 .driver = "Audigy2", .name = "Audigy 2 Platinum [SB0240P]",
953 	 .id = "Audigy2",
954 	 .emu10k2_chip = 1,
955 	 .ca0102_chip = 1,
956 	 .ca0151_chip = 1,
957 	 .spk71 = 1,
958 	 .spdif_bug = 1,
959 	 .adc_1361t = 1,  /* 24 bit capture instead of 16bit. Fixes ALSA bug#324 */
960 	 .ac97_chip = 1} ,
961 	{.vendor = 0x1102, .device = 0x0004, .revision = 0x04,
962 	 .driver = "Audigy2", .name = "Audigy 2 [Unknown]",
963 	 .id = "Audigy2",
964 	 .emu10k2_chip = 1,
965 	 .ca0102_chip = 1,
966 	 .ca0151_chip = 1,
967 	 .spdif_bug = 1,
968 	 .ac97_chip = 1} ,
969 	{.vendor = 0x1102, .device = 0x0004, .subsystem = 0x00531102,
970 	 .driver = "Audigy", .name = "Audigy 1 [SB0090]",
971 	 .id = "Audigy",
972 	 .emu10k2_chip = 1,
973 	 .ca0102_chip = 1,
974 	 .ac97_chip = 1} ,
975 	{.vendor = 0x1102, .device = 0x0004, .subsystem = 0x00521102,
976 	 .driver = "Audigy", .name = "Audigy 1 ES [SB0160]",
977 	 .id = "Audigy",
978 	 .emu10k2_chip = 1,
979 	 .ca0102_chip = 1,
980 	 .spdif_bug = 1,
981 	 .ac97_chip = 1} ,
982 	{.vendor = 0x1102, .device = 0x0004, .subsystem = 0x00511102,
983 	 .driver = "Audigy", .name = "Audigy 1 [SB0090]",
984 	 .id = "Audigy",
985 	 .emu10k2_chip = 1,
986 	 .ca0102_chip = 1,
987 	 .ac97_chip = 1} ,
988 	{.vendor = 0x1102, .device = 0x0004,
989 	 .driver = "Audigy", .name = "Audigy 1 [Unknown]",
990 	 .id = "Audigy",
991 	 .emu10k2_chip = 1,
992 	 .ca0102_chip = 1,
993 	 .ac97_chip = 1} ,
994 	{.vendor = 0x1102, .device = 0x0002, .subsystem = 0x806B1102,
995 	 .driver = "EMU10K1", .name = "SBLive! [SB0105]",
996 	 .id = "Live",
997 	 .emu10k1_chip = 1,
998 	 .ac97_chip = 1,
999 	 .sblive51 = 1} ,
1000 	{.vendor = 0x1102, .device = 0x0002, .subsystem = 0x806A1102,
1001 	 .driver = "EMU10K1", .name = "SBLive! Value [SB0103]",
1002 	 .id = "Live",
1003 	 .emu10k1_chip = 1,
1004 	 .ac97_chip = 1,
1005 	 .sblive51 = 1} ,
1006 	{.vendor = 0x1102, .device = 0x0002, .subsystem = 0x80691102,
1007 	 .driver = "EMU10K1", .name = "SBLive! Value [SB0101]",
1008 	 .id = "Live",
1009 	 .emu10k1_chip = 1,
1010 	 .ac97_chip = 1,
1011 	 .sblive51 = 1} ,
1012 	/* Tested by ALSA bug#1680 26th December 2005 */
1013 	/* note: It really has SB0220 written on the card. */
1014 	{.vendor = 0x1102, .device = 0x0002, .subsystem = 0x80661102,
1015 	 .driver = "EMU10K1", .name = "SB Live 5.1 Dell OEM [SB0220]",
1016 	 .id = "Live",
1017 	 .emu10k1_chip = 1,
1018 	 .ac97_chip = 1,
1019 	 .sblive51 = 1} ,
1020 	/* Tested by Thomas Zehetbauer 27th Aug 2005 */
1021 	{.vendor = 0x1102, .device = 0x0002, .subsystem = 0x80651102,
1022 	 .driver = "EMU10K1", .name = "SB Live 5.1 [SB0220]",
1023 	 .id = "Live",
1024 	 .emu10k1_chip = 1,
1025 	 .ac97_chip = 1,
1026 	 .sblive51 = 1} ,
1027 	{.vendor = 0x1102, .device = 0x0002, .subsystem = 0x100a1102,
1028 	 .driver = "EMU10K1", .name = "SB Live 5.1 [SB0220]",
1029 	 .id = "Live",
1030 	 .emu10k1_chip = 1,
1031 	 .ac97_chip = 1,
1032 	 .sblive51 = 1} ,
1033 	{.vendor = 0x1102, .device = 0x0002, .subsystem = 0x80641102,
1034 	 .driver = "EMU10K1", .name = "SB Live 5.1",
1035 	 .id = "Live",
1036 	 .emu10k1_chip = 1,
1037 	 .ac97_chip = 1,
1038 	 .sblive51 = 1} ,
1039 	/* Tested by alsa bugtrack user "hus" bug #1297 12th Aug 2005 */
1040 	{.vendor = 0x1102, .device = 0x0002, .subsystem = 0x80611102,
1041 	 .driver = "EMU10K1", .name = "SBLive 5.1 [SB0060]",
1042 	 .id = "Live",
1043 	 .emu10k1_chip = 1,
1044 	 .ac97_chip = 2, /* ac97 is optional; both SBLive 5.1 and platinum
1045 			  * share the same IDs!
1046 			  */
1047 	 .sblive51 = 1} ,
1048 	{.vendor = 0x1102, .device = 0x0002, .subsystem = 0x80511102,
1049 	 .driver = "EMU10K1", .name = "SBLive! Value [CT4850]",
1050 	 .id = "Live",
1051 	 .emu10k1_chip = 1,
1052 	 .ac97_chip = 1,
1053 	 .sblive51 = 1} ,
1054 	{.vendor = 0x1102, .device = 0x0002, .subsystem = 0x80401102,
1055 	 .driver = "EMU10K1", .name = "SBLive! Platinum [CT4760P]",
1056 	 .id = "Live",
1057 	 .emu10k1_chip = 1,
1058 	 .ac97_chip = 1} ,
1059 	{.vendor = 0x1102, .device = 0x0002, .subsystem = 0x80321102,
1060 	 .driver = "EMU10K1", .name = "SBLive! Value [CT4871]",
1061 	 .id = "Live",
1062 	 .emu10k1_chip = 1,
1063 	 .ac97_chip = 1,
1064 	 .sblive51 = 1} ,
1065 	{.vendor = 0x1102, .device = 0x0002, .subsystem = 0x80311102,
1066 	 .driver = "EMU10K1", .name = "SBLive! Value [CT4831]",
1067 	 .id = "Live",
1068 	 .emu10k1_chip = 1,
1069 	 .ac97_chip = 1,
1070 	 .sblive51 = 1} ,
1071 	{.vendor = 0x1102, .device = 0x0002, .subsystem = 0x80281102,
1072 	 .driver = "EMU10K1", .name = "SBLive! Value [CT4870]",
1073 	 .id = "Live",
1074 	 .emu10k1_chip = 1,
1075 	 .ac97_chip = 1,
1076 	 .sblive51 = 1} ,
1077 	/* Tested by James@superbug.co.uk 3rd July 2005 */
1078 	{.vendor = 0x1102, .device = 0x0002, .subsystem = 0x80271102,
1079 	 .driver = "EMU10K1", .name = "SBLive! Value [CT4832]",
1080 	 .id = "Live",
1081 	 .emu10k1_chip = 1,
1082 	 .ac97_chip = 1,
1083 	 .sblive51 = 1} ,
1084 	{.vendor = 0x1102, .device = 0x0002, .subsystem = 0x80261102,
1085 	 .driver = "EMU10K1", .name = "SBLive! Value [CT4830]",
1086 	 .id = "Live",
1087 	 .emu10k1_chip = 1,
1088 	 .ac97_chip = 1,
1089 	 .sblive51 = 1} ,
1090 	{.vendor = 0x1102, .device = 0x0002, .subsystem = 0x80231102,
1091 	 .driver = "EMU10K1", .name = "SB PCI512 [CT4790]",
1092 	 .id = "Live",
1093 	 .emu10k1_chip = 1,
1094 	 .ac97_chip = 1,
1095 	 .sblive51 = 1} ,
1096 	{.vendor = 0x1102, .device = 0x0002, .subsystem = 0x80221102,
1097 	 .driver = "EMU10K1", .name = "SBLive! Value [CT4780]",
1098 	 .id = "Live",
1099 	 .emu10k1_chip = 1,
1100 	 .ac97_chip = 1,
1101 	 .sblive51 = 1} ,
1102 	{.vendor = 0x1102, .device = 0x0002, .subsystem = 0x40011102,
1103 	 .driver = "EMU10K1", .name = "E-mu APS [4001]",
1104 	 .id = "APS",
1105 	 .emu10k1_chip = 1,
1106 	 .ecard = 1} ,
1107 	{.vendor = 0x1102, .device = 0x0002, .subsystem = 0x00211102,
1108 	 .driver = "EMU10K1", .name = "SBLive! [CT4620]",
1109 	 .id = "Live",
1110 	 .emu10k1_chip = 1,
1111 	 .ac97_chip = 1,
1112 	 .sblive51 = 1} ,
1113 	{.vendor = 0x1102, .device = 0x0002, .subsystem = 0x00201102,
1114 	 .driver = "EMU10K1", .name = "SBLive! Value [CT4670]",
1115 	 .id = "Live",
1116 	 .emu10k1_chip = 1,
1117 	 .ac97_chip = 1,
1118 	 .sblive51 = 1} ,
1119 	{.vendor = 0x1102, .device = 0x0002,
1120 	 .driver = "EMU10K1", .name = "SB Live [Unknown]",
1121 	 .id = "Live",
1122 	 .emu10k1_chip = 1,
1123 	 .ac97_chip = 1,
1124 	 .sblive51 = 1} ,
1125 	{ } /* terminator */
1126 };
1127 
1128 int __devinit snd_emu10k1_create(struct snd_card *card,
1129 		       struct pci_dev * pci,
1130 		       unsigned short extin_mask,
1131 		       unsigned short extout_mask,
1132 		       long max_cache_bytes,
1133 		       int enable_ir,
1134 		       uint subsystem,
1135 		       struct snd_emu10k1 ** remu)
1136 {
1137 	struct snd_emu10k1 *emu;
1138 	int idx, err;
1139 	int is_audigy;
1140 	unsigned char revision;
1141 	unsigned int silent_page;
1142 	const struct snd_emu_chip_details *c;
1143 	static struct snd_device_ops ops = {
1144 		.dev_free =	snd_emu10k1_dev_free,
1145 	};
1146 
1147 	*remu = NULL;
1148 
1149 	/* enable PCI device */
1150 	if ((err = pci_enable_device(pci)) < 0)
1151 		return err;
1152 
1153 	emu = kzalloc(sizeof(*emu), GFP_KERNEL);
1154 	if (emu == NULL) {
1155 		pci_disable_device(pci);
1156 		return -ENOMEM;
1157 	}
1158 	emu->card = card;
1159 	spin_lock_init(&emu->reg_lock);
1160 	spin_lock_init(&emu->emu_lock);
1161 	spin_lock_init(&emu->voice_lock);
1162 	spin_lock_init(&emu->synth_lock);
1163 	spin_lock_init(&emu->memblk_lock);
1164 	mutex_init(&emu->fx8010.lock);
1165 	INIT_LIST_HEAD(&emu->mapped_link_head);
1166 	INIT_LIST_HEAD(&emu->mapped_order_link_head);
1167 	emu->pci = pci;
1168 	emu->irq = -1;
1169 	emu->synth = NULL;
1170 	emu->get_synth_voice = NULL;
1171 	/* read revision & serial */
1172 	pci_read_config_byte(pci, PCI_REVISION_ID, &revision);
1173 	emu->revision = revision;
1174 	pci_read_config_dword(pci, PCI_SUBSYSTEM_VENDOR_ID, &emu->serial);
1175 	pci_read_config_word(pci, PCI_SUBSYSTEM_ID, &emu->model);
1176 	snd_printdd("vendor=0x%x, device=0x%x, subsystem_vendor_id=0x%x, subsystem_id=0x%x\n",pci->vendor, pci->device, emu->serial, emu->model);
1177 
1178 	for (c = emu_chip_details; c->vendor; c++) {
1179 		if (c->vendor == pci->vendor && c->device == pci->device) {
1180 			if (subsystem) {
1181 				if (c->subsystem && (c->subsystem == subsystem) ) {
1182 					break;
1183 				} else continue;
1184 			} else {
1185 				if (c->subsystem && (c->subsystem != emu->serial) )
1186 					continue;
1187 				if (c->revision && c->revision != emu->revision)
1188 					continue;
1189 			}
1190 			break;
1191 		}
1192 	}
1193 	if (c->vendor == 0) {
1194 		snd_printk(KERN_ERR "emu10k1: Card not recognised\n");
1195 		kfree(emu);
1196 		pci_disable_device(pci);
1197 		return -ENOENT;
1198 	}
1199 	emu->card_capabilities = c;
1200 	if (c->subsystem && !subsystem)
1201 		snd_printdd("Sound card name=%s\n", c->name);
1202 	else if (subsystem)
1203 		snd_printdd("Sound card name=%s, vendor=0x%x, device=0x%x, subsystem=0x%x. Forced to subsytem=0x%x\n",
1204 		       	c->name, pci->vendor, pci->device, emu->serial, c->subsystem);
1205 	else
1206 		snd_printdd("Sound card name=%s, vendor=0x%x, device=0x%x, subsystem=0x%x.\n",
1207 		      	c->name, pci->vendor, pci->device, emu->serial);
1208 
1209 	if (!*card->id && c->id) {
1210 		int i, n = 0;
1211 		strlcpy(card->id, c->id, sizeof(card->id));
1212 		for (;;) {
1213 			for (i = 0; i < snd_ecards_limit; i++) {
1214 				if (snd_cards[i] && !strcmp(snd_cards[i]->id, card->id))
1215 					break;
1216 			}
1217 			if (i >= snd_ecards_limit)
1218 				break;
1219 			n++;
1220 			if (n >= SNDRV_CARDS)
1221 				break;
1222 			snprintf(card->id, sizeof(card->id), "%s_%d", c->id, n);
1223 		}
1224 	}
1225 
1226 	is_audigy = emu->audigy = c->emu10k2_chip;
1227 
1228 	/* set the DMA transfer mask */
1229 	emu->dma_mask = is_audigy ? AUDIGY_DMA_MASK : EMU10K1_DMA_MASK;
1230 	if (pci_set_dma_mask(pci, emu->dma_mask) < 0 ||
1231 	    pci_set_consistent_dma_mask(pci, emu->dma_mask) < 0) {
1232 		snd_printk(KERN_ERR "architecture does not support PCI busmaster DMA with mask 0x%lx\n", emu->dma_mask);
1233 		kfree(emu);
1234 		pci_disable_device(pci);
1235 		return -ENXIO;
1236 	}
1237 	if (is_audigy)
1238 		emu->gpr_base = A_FXGPREGBASE;
1239 	else
1240 		emu->gpr_base = FXGPREGBASE;
1241 
1242 	if ((err = pci_request_regions(pci, "EMU10K1")) < 0) {
1243 		kfree(emu);
1244 		pci_disable_device(pci);
1245 		return err;
1246 	}
1247 	emu->port = pci_resource_start(pci, 0);
1248 
1249 	if (request_irq(pci->irq, snd_emu10k1_interrupt, IRQF_DISABLED|IRQF_SHARED, "EMU10K1", (void *)emu)) {
1250 		err = -EBUSY;
1251 		goto error;
1252 	}
1253 	emu->irq = pci->irq;
1254 
1255 	emu->max_cache_pages = max_cache_bytes >> PAGE_SHIFT;
1256 	if (snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV, snd_dma_pci_data(pci),
1257 				32 * 1024, &emu->ptb_pages) < 0) {
1258 		err = -ENOMEM;
1259 		goto error;
1260 	}
1261 
1262 	emu->page_ptr_table = (void **)vmalloc(emu->max_cache_pages * sizeof(void*));
1263 	emu->page_addr_table = (unsigned long*)vmalloc(emu->max_cache_pages * sizeof(unsigned long));
1264 	if (emu->page_ptr_table == NULL || emu->page_addr_table == NULL) {
1265 		err = -ENOMEM;
1266 		goto error;
1267 	}
1268 
1269 	if (snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV, snd_dma_pci_data(pci),
1270 				EMUPAGESIZE, &emu->silent_page) < 0) {
1271 		err = -ENOMEM;
1272 		goto error;
1273 	}
1274 	emu->memhdr = snd_util_memhdr_new(emu->max_cache_pages * PAGE_SIZE);
1275 	if (emu->memhdr == NULL) {
1276 		err = -ENOMEM;
1277 		goto error;
1278 	}
1279 	emu->memhdr->block_extra_size = sizeof(struct snd_emu10k1_memblk) -
1280 		sizeof(struct snd_util_memblk);
1281 
1282 	pci_set_master(pci);
1283 
1284 	emu->fx8010.fxbus_mask = 0x303f;
1285 	if (extin_mask == 0)
1286 		extin_mask = 0x3fcf;
1287 	if (extout_mask == 0)
1288 		extout_mask = 0x7fff;
1289 	emu->fx8010.extin_mask = extin_mask;
1290 	emu->fx8010.extout_mask = extout_mask;
1291 	emu->enable_ir = enable_ir;
1292 
1293 	if (emu->card_capabilities->ecard) {
1294 		if ((err = snd_emu10k1_ecard_init(emu)) < 0)
1295 			goto error;
1296 	} else if (emu->card_capabilities->ca_cardbus_chip) {
1297 		if ((err = snd_emu10k1_cardbus_init(emu)) < 0)
1298 			goto error;
1299  	} else if (emu->card_capabilities->emu1212m) {
1300  		if ((err = snd_emu10k1_emu1212m_init(emu)) < 0) {
1301  			snd_emu10k1_free(emu);
1302  			return err;
1303  		}
1304 	} else {
1305 		/* 5.1: Enable the additional AC97 Slots. If the emu10k1 version
1306 			does not support this, it shouldn't do any harm */
1307 		snd_emu10k1_ptr_write(emu, AC97SLOT, 0, AC97SLOT_CNTR|AC97SLOT_LFE);
1308 	}
1309 
1310 	/* initialize TRAM setup */
1311 	emu->fx8010.itram_size = (16 * 1024)/2;
1312 	emu->fx8010.etram_pages.area = NULL;
1313 	emu->fx8010.etram_pages.bytes = 0;
1314 
1315 	/*
1316 	 *  Init to 0x02109204 :
1317 	 *  Clock accuracy    = 0     (1000ppm)
1318 	 *  Sample Rate       = 2     (48kHz)
1319 	 *  Audio Channel     = 1     (Left of 2)
1320 	 *  Source Number     = 0     (Unspecified)
1321 	 *  Generation Status = 1     (Original for Cat Code 12)
1322 	 *  Cat Code          = 12    (Digital Signal Mixer)
1323 	 *  Mode              = 0     (Mode 0)
1324 	 *  Emphasis          = 0     (None)
1325 	 *  CP                = 1     (Copyright unasserted)
1326 	 *  AN                = 0     (Audio data)
1327 	 *  P                 = 0     (Consumer)
1328 	 */
1329 	emu->spdif_bits[0] = emu->spdif_bits[1] =
1330 		emu->spdif_bits[2] = SPCS_CLKACCY_1000PPM | SPCS_SAMPLERATE_48 |
1331 		SPCS_CHANNELNUM_LEFT | SPCS_SOURCENUM_UNSPEC |
1332 		SPCS_GENERATIONSTATUS | 0x00001200 |
1333 		0x00000000 | SPCS_EMPHASIS_NONE | SPCS_COPYRIGHT;
1334 
1335 	emu->reserved_page = (struct snd_emu10k1_memblk *)
1336 		snd_emu10k1_synth_alloc(emu, 4096);
1337 	if (emu->reserved_page)
1338 		emu->reserved_page->map_locked = 1;
1339 
1340 	/* Clear silent pages and set up pointers */
1341 	memset(emu->silent_page.area, 0, PAGE_SIZE);
1342 	silent_page = emu->silent_page.addr << 1;
1343 	for (idx = 0; idx < MAXPAGES; idx++)
1344 		((u32 *)emu->ptb_pages.area)[idx] = cpu_to_le32(silent_page | idx);
1345 
1346 	/* set up voice indices */
1347 	for (idx = 0; idx < NUM_G; idx++) {
1348 		emu->voices[idx].emu = emu;
1349 		emu->voices[idx].number = idx;
1350 	}
1351 
1352 	if ((err = snd_emu10k1_init(emu, enable_ir, 0)) < 0)
1353 		goto error;
1354 #ifdef CONFIG_PM
1355 	if ((err = alloc_pm_buffer(emu)) < 0)
1356 		goto error;
1357 #endif
1358 
1359 	/*  Initialize the effect engine */
1360 	if ((err = snd_emu10k1_init_efx(emu)) < 0)
1361 		goto error;
1362 	snd_emu10k1_audio_enable(emu);
1363 
1364 	if ((err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, emu, &ops)) < 0)
1365 		goto error;
1366 
1367 #ifdef CONFIG_PROC_FS
1368 	snd_emu10k1_proc_init(emu);
1369 #endif
1370 
1371 	snd_card_set_dev(card, &pci->dev);
1372 	*remu = emu;
1373 	return 0;
1374 
1375  error:
1376 	snd_emu10k1_free(emu);
1377 	return err;
1378 }
1379 
1380 #ifdef CONFIG_PM
1381 static unsigned char saved_regs[] = {
1382 	CPF, PTRX, CVCF, VTFT, Z1, Z2, PSST, DSL, CCCA, CCR, CLP,
1383 	FXRT, MAPA, MAPB, ENVVOL, ATKHLDV, DCYSUSV, LFOVAL1, ENVVAL,
1384 	ATKHLDM, DCYSUSM, LFOVAL2, IP, IFATN, PEFE, FMMOD, TREMFRQ, FM2FRQ2,
1385 	TEMPENV, ADCCR, FXWC, MICBA, ADCBA, FXBA,
1386 	MICBS, ADCBS, FXBS, CDCS, GPSCS, SPCS0, SPCS1, SPCS2,
1387 	SPBYPASS, AC97SLOT, CDSRCS, GPSRCS, ZVSRCS, MICIDX, ADCIDX, FXIDX,
1388 	0xff /* end */
1389 };
1390 static unsigned char saved_regs_audigy[] = {
1391 	A_ADCIDX, A_MICIDX, A_FXWC1, A_FXWC2, A_SAMPLE_RATE,
1392 	A_FXRT2, A_SENDAMOUNTS, A_FXRT1,
1393 	0xff /* end */
1394 };
1395 
1396 static int __devinit alloc_pm_buffer(struct snd_emu10k1 *emu)
1397 {
1398 	int size;
1399 
1400 	size = ARRAY_SIZE(saved_regs);
1401 	if (emu->audigy)
1402 		size += ARRAY_SIZE(saved_regs_audigy);
1403 	emu->saved_ptr = vmalloc(4 * NUM_G * size);
1404 	if (! emu->saved_ptr)
1405 		return -ENOMEM;
1406 	if (snd_emu10k1_efx_alloc_pm_buffer(emu) < 0)
1407 		return -ENOMEM;
1408 	if (emu->card_capabilities->ca0151_chip &&
1409 	    snd_p16v_alloc_pm_buffer(emu) < 0)
1410 		return -ENOMEM;
1411 	return 0;
1412 }
1413 
1414 static void free_pm_buffer(struct snd_emu10k1 *emu)
1415 {
1416 	vfree(emu->saved_ptr);
1417 	snd_emu10k1_efx_free_pm_buffer(emu);
1418 	if (emu->card_capabilities->ca0151_chip)
1419 		snd_p16v_free_pm_buffer(emu);
1420 }
1421 
1422 void snd_emu10k1_suspend_regs(struct snd_emu10k1 *emu)
1423 {
1424 	int i;
1425 	unsigned char *reg;
1426 	unsigned int *val;
1427 
1428 	val = emu->saved_ptr;
1429 	for (reg = saved_regs; *reg != 0xff; reg++)
1430 		for (i = 0; i < NUM_G; i++, val++)
1431 			*val = snd_emu10k1_ptr_read(emu, *reg, i);
1432 	if (emu->audigy) {
1433 		for (reg = saved_regs_audigy; *reg != 0xff; reg++)
1434 			for (i = 0; i < NUM_G; i++, val++)
1435 				*val = snd_emu10k1_ptr_read(emu, *reg, i);
1436 	}
1437 	if (emu->audigy)
1438 		emu->saved_a_iocfg = inl(emu->port + A_IOCFG);
1439 	emu->saved_hcfg = inl(emu->port + HCFG);
1440 }
1441 
1442 void snd_emu10k1_resume_init(struct snd_emu10k1 *emu)
1443 {
1444 	if (emu->card_capabilities->ecard)
1445 		snd_emu10k1_ecard_init(emu);
1446 	else if (emu->card_capabilities->ca_cardbus_chip)
1447 		snd_emu10k1_cardbus_init(emu);
1448 	else if (emu->card_capabilities->emu1212m)
1449  		snd_emu10k1_emu1212m_init(emu);
1450 	else
1451 		snd_emu10k1_ptr_write(emu, AC97SLOT, 0, AC97SLOT_CNTR|AC97SLOT_LFE);
1452 	snd_emu10k1_init(emu, emu->enable_ir, 1);
1453 }
1454 
1455 void snd_emu10k1_resume_regs(struct snd_emu10k1 *emu)
1456 {
1457 	int i;
1458 	unsigned char *reg;
1459 	unsigned int *val;
1460 
1461 	snd_emu10k1_audio_enable(emu);
1462 
1463 	/* resore for spdif */
1464 	if (emu->audigy)
1465 		outl(emu->saved_a_iocfg, emu->port + A_IOCFG);
1466 	outl(emu->saved_hcfg, emu->port + HCFG);
1467 
1468 	val = emu->saved_ptr;
1469 	for (reg = saved_regs; *reg != 0xff; reg++)
1470 		for (i = 0; i < NUM_G; i++, val++)
1471 			snd_emu10k1_ptr_write(emu, *reg, i, *val);
1472 	if (emu->audigy) {
1473 		for (reg = saved_regs_audigy; *reg != 0xff; reg++)
1474 			for (i = 0; i < NUM_G; i++, val++)
1475 				snd_emu10k1_ptr_write(emu, *reg, i, *val);
1476 	}
1477 }
1478 #endif
1479