1/*
2    card-opti92x-ad1848.c - driver for OPTi 82c92x based soundcards.
3    Copyright (C) 1998-2000 by Massimo Piccioni <dafastidio@libero.it>
4
5    Part of this code was developed at the Italian Ministry of Air Defence,
6    Sixth Division (oh, che pace ...), Rome.
7
8    Thanks to Maria Grazia Pollarini, Salvatore Vassallo.
9
10    This program is free software; you can redistribute it and/or modify
11    it under the terms of the GNU General Public License as published by
12    the Free Software Foundation; either version 2 of the License, or
13    (at your option) any later version.
14
15    This program is distributed in the hope that it will be useful,
16    but WITHOUT ANY WARRANTY; without even the implied warranty of
17    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18    GNU General Public License for more details.
19
20    You should have received a copy of the GNU General Public License
21    along with this program; if not, write to the Free Software
22    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
23*/
24
25
26#include <sound/driver.h>
27#include <linux/init.h>
28#include <linux/err.h>
29#include <linux/isa.h>
30#include <linux/delay.h>
31#include <linux/slab.h>
32#include <linux/pnp.h>
33#include <linux/moduleparam.h>
34#include <asm/io.h>
35#include <asm/dma.h>
36#include <sound/core.h>
37#ifdef CS4231
38#include <sound/cs4231.h>
39#else
40#ifndef OPTi93X
41#include <sound/ad1848.h>
42#else
43#include <sound/control.h>
44#include <sound/pcm.h>
45#endif	/* OPTi93X */
46#endif	/* CS4231 */
47#include <sound/mpu401.h>
48#include <sound/opl3.h>
49#ifndef OPTi93X
50#include <sound/opl4.h>
51#endif
52#define SNDRV_LEGACY_FIND_FREE_IRQ
53#define SNDRV_LEGACY_FIND_FREE_DMA
54#include <sound/initval.h>
55
56MODULE_AUTHOR("Massimo Piccioni <dafastidio@libero.it>");
57MODULE_LICENSE("GPL");
58#ifdef OPTi93X
59MODULE_DESCRIPTION("OPTi93X");
60MODULE_SUPPORTED_DEVICE("{{OPTi,82C931/3}}");
61#else	/* OPTi93X */
62#ifdef CS4231
63MODULE_DESCRIPTION("OPTi92X - CS4231");
64MODULE_SUPPORTED_DEVICE("{{OPTi,82C924 (CS4231)},"
65		"{OPTi,82C925 (CS4231)}}");
66#else	/* CS4231 */
67MODULE_DESCRIPTION("OPTi92X - AD1848");
68MODULE_SUPPORTED_DEVICE("{{OPTi,82C924 (AD1848)},"
69		"{OPTi,82C925 (AD1848)},"
70	        "{OAK,Mozart}}");
71#endif	/* CS4231 */
72#endif	/* OPTi93X */
73
74static int index = SNDRV_DEFAULT_IDX1;	/* Index 0-MAX */
75static char *id = SNDRV_DEFAULT_STR1;		/* ID for this card */
76//static int enable = SNDRV_DEFAULT_ENABLE1;	/* Enable this card */
77static int isapnp = 1;			/* Enable ISA PnP detection */
78static long port = SNDRV_DEFAULT_PORT1; 	/* 0x530,0xe80,0xf40,0x604 */
79static long mpu_port = SNDRV_DEFAULT_PORT1;	/* 0x300,0x310,0x320,0x330 */
80static long fm_port = SNDRV_DEFAULT_PORT1;	/* 0x388 */
81static int irq = SNDRV_DEFAULT_IRQ1;		/* 5,7,9,10,11 */
82static int mpu_irq = SNDRV_DEFAULT_IRQ1;	/* 5,7,9,10 */
83static int dma1 = SNDRV_DEFAULT_DMA1;		/* 0,1,3 */
84#if defined(CS4231) || defined(OPTi93X)
85static int dma2 = SNDRV_DEFAULT_DMA1;		/* 0,1,3 */
86#endif	/* CS4231 || OPTi93X */
87
88module_param(index, int, 0444);
89MODULE_PARM_DESC(index, "Index value for opti9xx based soundcard.");
90module_param(id, charp, 0444);
91MODULE_PARM_DESC(id, "ID string for opti9xx based soundcard.");
92//module_param(enable, bool, 0444);
93//MODULE_PARM_DESC(enable, "Enable opti9xx soundcard.");
94module_param(isapnp, bool, 0444);
95MODULE_PARM_DESC(isapnp, "Enable ISA PnP detection for specified soundcard.");
96module_param(port, long, 0444);
97MODULE_PARM_DESC(port, "WSS port # for opti9xx driver.");
98module_param(mpu_port, long, 0444);
99MODULE_PARM_DESC(mpu_port, "MPU-401 port # for opti9xx driver.");
100module_param(fm_port, long, 0444);
101MODULE_PARM_DESC(fm_port, "FM port # for opti9xx driver.");
102module_param(irq, int, 0444);
103MODULE_PARM_DESC(irq, "WSS irq # for opti9xx driver.");
104module_param(mpu_irq, int, 0444);
105MODULE_PARM_DESC(mpu_irq, "MPU-401 irq # for opti9xx driver.");
106module_param(dma1, int, 0444);
107MODULE_PARM_DESC(dma1, "1st dma # for opti9xx driver.");
108#if defined(CS4231) || defined(OPTi93X)
109module_param(dma2, int, 0444);
110MODULE_PARM_DESC(dma2, "2nd dma # for opti9xx driver.");
111#endif	/* CS4231 || OPTi93X */
112
113#define OPTi9XX_HW_DETECT	0
114#define OPTi9XX_HW_82C928	1
115#define OPTi9XX_HW_82C929	2
116#define OPTi9XX_HW_82C924	3
117#define OPTi9XX_HW_82C925	4
118#define OPTi9XX_HW_82C930	5
119#define OPTi9XX_HW_82C931	6
120#define OPTi9XX_HW_82C933	7
121#define OPTi9XX_HW_LAST		OPTi9XX_HW_82C933
122
123#define OPTi9XX_MC_REG(n)	n
124
125#ifdef OPTi93X
126
127#define OPTi93X_INDEX			0x00
128#define OPTi93X_DATA			0x01
129#define OPTi93X_STATUS			0x02
130#define OPTi93X_DDATA			0x03
131#define OPTi93X_PORT(chip, r)		((chip)->port + OPTi93X_##r)
132
133#define OPTi93X_MIXOUT_LEFT		0x00
134#define OPTi93X_MIXOUT_RIGHT		0x01
135#define OPTi93X_CD_LEFT_INPUT		0x02
136#define OPTi93X_CD_RIGHT_INPUT		0x03
137#define OPTi930_AUX_LEFT_INPUT		0x04
138#define OPTi930_AUX_RIGHT_INPUT		0x05
139#define OPTi931_FM_LEFT_INPUT		0x04
140#define OPTi931_FM_RIGHT_INPUT		0x05
141#define OPTi93X_DAC_LEFT		0x06
142#define OPTi93X_DAC_RIGHT		0x07
143#define OPTi93X_PLAY_FORMAT		0x08
144#define OPTi93X_IFACE_CONF		0x09
145#define OPTi93X_PIN_CTRL		0x0a
146#define OPTi93X_ERR_INIT		0x0b
147#define OPTi93X_ID			0x0c
148#define OPTi93X_PLAY_UPR_CNT		0x0e
149#define OPTi93X_PLAY_LWR_CNT		0x0f
150#define OPTi931_AUX_LEFT_INPUT		0x10
151#define OPTi931_AUX_RIGHT_INPUT		0x11
152#define OPTi93X_LINE_LEFT_INPUT		0x12
153#define OPTi93X_LINE_RIGHT_INPUT	0x13
154#define OPTi93X_MIC_LEFT_INPUT		0x14
155#define OPTi93X_MIC_RIGHT_INPUT		0x15
156#define OPTi93X_OUT_LEFT		0x16
157#define OPTi93X_OUT_RIGHT		0x17
158#define OPTi93X_CAPT_FORMAT		0x1c
159#define OPTi93X_CAPT_UPR_CNT		0x1e
160#define OPTi93X_CAPT_LWR_CNT		0x1f
161
162#define OPTi93X_TRD			0x20
163#define OPTi93X_MCE			0x40
164#define OPTi93X_INIT			0x80
165
166#define OPTi93X_MIXOUT_MIC_GAIN		0x20
167#define OPTi93X_MIXOUT_LINE		0x00
168#define OPTi93X_MIXOUT_CD		0x40
169#define OPTi93X_MIXOUT_MIC		0x80
170#define OPTi93X_MIXOUT_MIXER		0xc0
171
172#define OPTi93X_STEREO			0x10
173#define OPTi93X_LINEAR_8		0x00
174#define OPTi93X_ULAW_8			0x20
175#define OPTi93X_LINEAR_16_LIT		0x40
176#define OPTi93X_ALAW_8			0x60
177#define OPTi93X_ADPCM_16		0xa0
178#define OPTi93X_LINEAR_16_BIG		0xc0
179
180#define OPTi93X_CAPTURE_PIO		0x80
181#define OPTi93X_PLAYBACK_PIO		0x40
182#define OPTi93X_AUTOCALIB		0x08
183#define OPTi93X_SINGLE_DMA		0x04
184#define OPTi93X_CAPTURE_ENABLE		0x02
185#define OPTi93X_PLAYBACK_ENABLE		0x01
186
187#define OPTi93X_IRQ_ENABLE		0x02
188
189#define OPTi93X_DMA_REQUEST		0x10
190#define OPTi93X_CALIB_IN_PROGRESS	0x20
191
192#define OPTi93X_IRQ_PLAYBACK		0x04
193#define OPTi93X_IRQ_CAPTURE		0x08
194
195
196struct snd_opti93x {
197	unsigned long port;
198	struct resource *res_port;
199	int irq;
200	int dma1;
201	int dma2;
202
203	struct snd_opti9xx *chip;
204	unsigned short hardware;
205	unsigned char image[32];
206
207	unsigned char mce_bit;
208	unsigned short mode;
209	int mute;
210
211	spinlock_t lock;
212
213	struct snd_card *card;
214	struct snd_pcm *pcm;
215	struct snd_pcm_substream *playback_substream;
216	struct snd_pcm_substream *capture_substream;
217	unsigned int p_dma_size;
218	unsigned int c_dma_size;
219};
220
221#define OPTi93X_MODE_NONE	0x00
222#define OPTi93X_MODE_PLAY	0x01
223#define OPTi93X_MODE_CAPTURE	0x02
224#define OPTi93X_MODE_OPEN	(OPTi93X_MODE_PLAY | OPTi93X_MODE_CAPTURE)
225
226#endif /* OPTi93X */
227
228struct snd_opti9xx {
229	unsigned short hardware;
230	unsigned char password;
231	char name[7];
232
233	unsigned long mc_base;
234	struct resource *res_mc_base;
235	unsigned long mc_base_size;
236#ifdef OPTi93X
237	unsigned long mc_indir_index;
238#endif	/* OPTi93X */
239	unsigned long pwd_reg;
240
241	spinlock_t lock;
242
243	long wss_base;
244	int irq;
245	int dma1;
246#if defined(CS4231) || defined(OPTi93X)
247	int dma2;
248#endif	/* CS4231 || OPTi93X */
249
250	long fm_port;
251
252	long mpu_port;
253	int mpu_irq;
254
255#ifdef CONFIG_PNP
256	struct pnp_dev *dev;
257	struct pnp_dev *devmpu;
258#endif	/* CONFIG_PNP */
259};
260
261static int snd_opti9xx_pnp_is_probed;
262
263#ifdef CONFIG_PNP
264
265static struct pnp_card_device_id snd_opti9xx_pnpids[] = {
266#ifndef OPTi93X
267	/* OPTi 82C924 */
268	{ .id = "OPT0924", .devs = { { "OPT0000" }, { "OPT0002" } }, .driver_data = 0x0924 },
269	/* OPTi 82C925 */
270	{ .id = "OPT0925", .devs = { { "OPT9250" }, { "OPT0002" } }, .driver_data = 0x0925 },
271#else
272	/* OPTi 82C931/3 */
273	{ .id = "OPT0931", .devs = { { "OPT9310" }, { "OPT0002" } }, .driver_data = 0x0931 },
274#endif	/* OPTi93X */
275	{ .id = "" }
276};
277
278MODULE_DEVICE_TABLE(pnp_card, snd_opti9xx_pnpids);
279
280#endif	/* CONFIG_PNP */
281
282#ifdef OPTi93X
283#define DEV_NAME "opti93x"
284#else
285#define DEV_NAME "opti92x"
286#endif
287
288static char * snd_opti9xx_names[] = {
289	"unkown",
290	"82C928",	"82C929",
291	"82C924",	"82C925",
292	"82C930",	"82C931",	"82C933"
293};
294
295
296static long __devinit snd_legacy_find_free_ioport(long *port_table, long size)
297{
298	while (*port_table != -1) {
299		if (request_region(*port_table, size, "ALSA test")) {
300			release_region(*port_table, size);
301			return *port_table;
302		}
303		port_table++;
304	}
305	return -1;
306}
307
308static int __devinit snd_opti9xx_init(struct snd_opti9xx *chip,
309				      unsigned short hardware)
310{
311	static int opti9xx_mc_size[] = {7, 7, 10, 10, 2, 2, 2};
312
313	chip->hardware = hardware;
314	strcpy(chip->name, snd_opti9xx_names[hardware]);
315
316	chip->mc_base_size = opti9xx_mc_size[hardware];
317
318	spin_lock_init(&chip->lock);
319
320	chip->wss_base = -1;
321	chip->irq = -1;
322	chip->dma1 = -1;
323#if defined(CS4231) || defined(OPTi93X)
324	chip->dma2 = -1;
325#endif 	/* CS4231 || OPTi93X */
326	chip->fm_port = -1;
327	chip->mpu_port = -1;
328	chip->mpu_irq = -1;
329
330	switch (hardware) {
331#ifndef OPTi93X
332	case OPTi9XX_HW_82C928:
333	case OPTi9XX_HW_82C929:
334		chip->mc_base = 0xf8c;
335		chip->password = (hardware == OPTi9XX_HW_82C928) ? 0xe2 : 0xe3;
336		chip->pwd_reg = 3;
337		break;
338
339	case OPTi9XX_HW_82C924:
340	case OPTi9XX_HW_82C925:
341		chip->mc_base = 0xf8c;
342		chip->password = 0xe5;
343		chip->pwd_reg = 3;
344		break;
345#else	/* OPTi93X */
346
347	case OPTi9XX_HW_82C930:
348	case OPTi9XX_HW_82C931:
349	case OPTi9XX_HW_82C933:
350		chip->mc_base = (hardware == OPTi9XX_HW_82C930) ? 0xf8f : 0xf8d;
351		chip->mc_indir_index = 0xe0e;
352		chip->password = 0xe4;
353		chip->pwd_reg = 0;
354		break;
355#endif	/* OPTi93X */
356
357	default:
358		snd_printk("chip %d not supported\n", hardware);
359		return -ENODEV;
360	}
361	return 0;
362}
363
364static unsigned char snd_opti9xx_read(struct snd_opti9xx *chip,
365				      unsigned char reg)
366{
367	unsigned long flags;
368	unsigned char retval = 0xff;
369
370	spin_lock_irqsave(&chip->lock, flags);
371	outb(chip->password, chip->mc_base + chip->pwd_reg);
372
373	switch (chip->hardware) {
374#ifndef OPTi93X
375	case OPTi9XX_HW_82C924:
376	case OPTi9XX_HW_82C925:
377		if (reg > 7) {
378			outb(reg, chip->mc_base + 8);
379			outb(chip->password, chip->mc_base + chip->pwd_reg);
380			retval = inb(chip->mc_base + 9);
381			break;
382		}
383
384	case OPTi9XX_HW_82C928:
385	case OPTi9XX_HW_82C929:
386		retval = inb(chip->mc_base + reg);
387		break;
388#else	/* OPTi93X */
389
390	case OPTi9XX_HW_82C930:
391	case OPTi9XX_HW_82C931:
392	case OPTi9XX_HW_82C933:
393		outb(reg, chip->mc_indir_index);
394		outb(chip->password, chip->mc_base + chip->pwd_reg);
395		retval = inb(chip->mc_indir_index + 1);
396		break;
397#endif	/* OPTi93X */
398
399	default:
400		snd_printk("chip %d not supported\n", chip->hardware);
401	}
402
403	spin_unlock_irqrestore(&chip->lock, flags);
404	return retval;
405}
406
407static void snd_opti9xx_write(struct snd_opti9xx *chip, unsigned char reg,
408			      unsigned char value)
409{
410	unsigned long flags;
411
412	spin_lock_irqsave(&chip->lock, flags);
413	outb(chip->password, chip->mc_base + chip->pwd_reg);
414
415	switch (chip->hardware) {
416#ifndef OPTi93X
417	case OPTi9XX_HW_82C924:
418	case OPTi9XX_HW_82C925:
419		if (reg > 7) {
420			outb(reg, chip->mc_base + 8);
421			outb(chip->password, chip->mc_base + chip->pwd_reg);
422			outb(value, chip->mc_base + 9);
423			break;
424		}
425
426	case OPTi9XX_HW_82C928:
427	case OPTi9XX_HW_82C929:
428		outb(value, chip->mc_base + reg);
429		break;
430#else	/* OPTi93X */
431
432	case OPTi9XX_HW_82C930:
433	case OPTi9XX_HW_82C931:
434	case OPTi9XX_HW_82C933:
435		outb(reg, chip->mc_indir_index);
436		outb(chip->password, chip->mc_base + chip->pwd_reg);
437		outb(value, chip->mc_indir_index + 1);
438		break;
439#endif	/* OPTi93X */
440
441	default:
442		snd_printk("chip %d not supported\n", chip->hardware);
443	}
444
445	spin_unlock_irqrestore(&chip->lock, flags);
446}
447
448
449#define snd_opti9xx_write_mask(chip, reg, value, mask)	\
450	snd_opti9xx_write(chip, reg,			\
451		(snd_opti9xx_read(chip, reg) & ~(mask)) | ((value) & (mask)))
452
453
454static int __devinit snd_opti9xx_configure(struct snd_opti9xx *chip)
455{
456	unsigned char wss_base_bits;
457	unsigned char irq_bits;
458	unsigned char dma_bits;
459	unsigned char mpu_port_bits = 0;
460	unsigned char mpu_irq_bits;
461
462	switch (chip->hardware) {
463#ifndef OPTi93X
464	case OPTi9XX_HW_82C924:
465		snd_opti9xx_write_mask(chip, OPTi9XX_MC_REG(4), 0xf0, 0xfc);
466		snd_opti9xx_write_mask(chip, OPTi9XX_MC_REG(6), 0x02, 0x02);
467
468	case OPTi9XX_HW_82C925:
469		snd_opti9xx_write_mask(chip, OPTi9XX_MC_REG(1), 0x80, 0x80);
470		snd_opti9xx_write_mask(chip, OPTi9XX_MC_REG(2), 0x00, 0x20);
471		snd_opti9xx_write_mask(chip, OPTi9XX_MC_REG(3), 0xf0, 0xff);
472#ifdef CS4231
473		snd_opti9xx_write_mask(chip, OPTi9XX_MC_REG(5), 0x02, 0x02);
474#else
475		snd_opti9xx_write_mask(chip, OPTi9XX_MC_REG(5), 0x00, 0x02);
476#endif	/* CS4231 */
477		break;
478
479	case OPTi9XX_HW_82C928:
480	case OPTi9XX_HW_82C929:
481		snd_opti9xx_write_mask(chip, OPTi9XX_MC_REG(1), 0x80, 0x80);
482		snd_opti9xx_write_mask(chip, OPTi9XX_MC_REG(2), 0x00, 0x20);
483		/*
484		snd_opti9xx_write_mask(chip, OPTi9XX_MC_REG(3), 0xa2, 0xae);
485		*/
486		snd_opti9xx_write_mask(chip, OPTi9XX_MC_REG(4), 0x00, 0x0c);
487#ifdef CS4231
488		snd_opti9xx_write_mask(chip, OPTi9XX_MC_REG(5), 0x02, 0x02);
489#else
490		snd_opti9xx_write_mask(chip, OPTi9XX_MC_REG(5), 0x00, 0x02);
491#endif	/* CS4231 */
492		break;
493
494#else	/* OPTi93X */
495	case OPTi9XX_HW_82C930:
496	case OPTi9XX_HW_82C931:
497	case OPTi9XX_HW_82C933:
498		snd_opti9xx_write_mask(chip, OPTi9XX_MC_REG(6), 0x02, 0x03);
499		snd_opti9xx_write_mask(chip, OPTi9XX_MC_REG(3), 0x00, 0xff);
500		snd_opti9xx_write_mask(chip, OPTi9XX_MC_REG(4), 0x10 |
501			(chip->hardware == OPTi9XX_HW_82C930 ? 0x00 : 0x04),
502			0x34);
503		snd_opti9xx_write_mask(chip, OPTi9XX_MC_REG(5), 0x20, 0xbf);
504		break;
505#endif	/* OPTi93X */
506
507	default:
508		snd_printk("chip %d not supported\n", chip->hardware);
509		return -EINVAL;
510	}
511
512	switch (chip->wss_base) {
513	case 0x530:
514		wss_base_bits = 0x00;
515		break;
516	case 0x604:
517		wss_base_bits = 0x03;
518		break;
519	case 0xe80:
520		wss_base_bits = 0x01;
521		break;
522	case 0xf40:
523		wss_base_bits = 0x02;
524		break;
525	default:
526		snd_printk("WSS port 0x%lx not valid\n", chip->wss_base);
527		goto __skip_base;
528	}
529	snd_opti9xx_write_mask(chip, OPTi9XX_MC_REG(1), wss_base_bits << 4, 0x30);
530
531__skip_base:
532	switch (chip->irq) {
533//#ifdef OPTi93X
534	case 5:
535		irq_bits = 0x05;
536		break;
537//#endif	/* OPTi93X */
538	case 7:
539		irq_bits = 0x01;
540		break;
541	case 9:
542		irq_bits = 0x02;
543		break;
544	case 10:
545		irq_bits = 0x03;
546		break;
547	case 11:
548		irq_bits = 0x04;
549		break;
550	default:
551		snd_printk("WSS irq # %d not valid\n", chip->irq);
552		goto __skip_resources;
553	}
554
555	switch (chip->dma1) {
556	case 0:
557		dma_bits = 0x01;
558		break;
559	case 1:
560		dma_bits = 0x02;
561		break;
562	case 3:
563		dma_bits = 0x03;
564		break;
565	default:
566		snd_printk("WSS dma1 # %d not valid\n", chip->dma1);
567		goto __skip_resources;
568	}
569
570#if defined(CS4231) || defined(OPTi93X)
571	if (chip->dma1 == chip->dma2) {
572		snd_printk("don't want to share dmas\n");
573		return -EBUSY;
574	}
575
576	switch (chip->dma2) {
577	case 0:
578	case 1:
579		break;
580	default:
581		snd_printk("WSS dma2 # %d not valid\n", chip->dma2);
582		goto __skip_resources;
583	}
584	dma_bits |= 0x04;
585#endif	/* CS4231 || OPTi93X */
586
587#ifndef OPTi93X
588	 outb(irq_bits << 3 | dma_bits, chip->wss_base);
589#else /* OPTi93X */
590	snd_opti9xx_write(chip, OPTi9XX_MC_REG(3), (irq_bits << 3 | dma_bits));
591#endif /* OPTi93X */
592
593__skip_resources:
594	if (chip->hardware > OPTi9XX_HW_82C928) {
595		switch (chip->mpu_port) {
596		case 0:
597		case -1:
598			break;
599		case 0x300:
600			mpu_port_bits = 0x03;
601			break;
602		case 0x310:
603			mpu_port_bits = 0x02;
604			break;
605		case 0x320:
606			mpu_port_bits = 0x01;
607			break;
608		case 0x330:
609			mpu_port_bits = 0x00;
610			break;
611		default:
612			snd_printk("MPU-401 port 0x%lx not valid\n",
613				chip->mpu_port);
614			goto __skip_mpu;
615		}
616
617		switch (chip->mpu_irq) {
618		case 5:
619			mpu_irq_bits = 0x02;
620			break;
621		case 7:
622			mpu_irq_bits = 0x03;
623			break;
624		case 9:
625			mpu_irq_bits = 0x00;
626			break;
627		case 10:
628			mpu_irq_bits = 0x01;
629			break;
630		default:
631			snd_printk("MPU-401 irq # %d not valid\n",
632				chip->mpu_irq);
633			goto __skip_mpu;
634		}
635
636		snd_opti9xx_write_mask(chip, OPTi9XX_MC_REG(6),
637			(chip->mpu_port <= 0) ? 0x00 :
638				0x80 | mpu_port_bits << 5 | mpu_irq_bits << 3,
639			0xf8);
640	}
641__skip_mpu:
642
643	return 0;
644}
645
646#ifdef OPTi93X
647
648static unsigned char snd_opti93x_default_image[32] =
649{
650	0x00,		/* 00/00 - l_mixout_outctrl */
651	0x00,		/* 01/01 - r_mixout_outctrl */
652	0x88,		/* 02/02 - l_cd_inctrl */
653	0x88,		/* 03/03 - r_cd_inctrl */
654	0x88,		/* 04/04 - l_a1/fm_inctrl */
655	0x88,		/* 05/05 - r_a1/fm_inctrl */
656	0x80,		/* 06/06 - l_dac_inctrl */
657	0x80,		/* 07/07 - r_dac_inctrl */
658	0x00,		/* 08/08 - ply_dataform_reg */
659	0x00,		/* 09/09 - if_conf */
660	0x00,		/* 0a/10 - pin_ctrl */
661	0x00,		/* 0b/11 - err_init_reg */
662	0x0a,		/* 0c/12 - id_reg */
663	0x00,		/* 0d/13 - reserved */
664	0x00,		/* 0e/14 - ply_upcount_reg */
665	0x00,		/* 0f/15 - ply_lowcount_reg */
666	0x88,		/* 10/16 - reserved/l_a1_inctrl */
667	0x88,		/* 11/17 - reserved/r_a1_inctrl */
668	0x88,		/* 12/18 - l_line_inctrl */
669	0x88,		/* 13/19 - r_line_inctrl */
670	0x88,		/* 14/20 - l_mic_inctrl */
671	0x88,		/* 15/21 - r_mic_inctrl */
672	0x80,		/* 16/22 - l_out_outctrl */
673	0x80,		/* 17/23 - r_out_outctrl */
674	0x00,		/* 18/24 - reserved */
675	0x00,		/* 19/25 - reserved */
676	0x00,		/* 1a/26 - reserved */
677	0x00,		/* 1b/27 - reserved */
678	0x00,		/* 1c/28 - cap_dataform_reg */
679	0x00,		/* 1d/29 - reserved */
680	0x00,		/* 1e/30 - cap_upcount_reg */
681	0x00		/* 1f/31 - cap_lowcount_reg */
682};
683
684
685static int snd_opti93x_busy_wait(struct snd_opti93x *chip)
686{
687	int timeout;
688
689	for (timeout = 250; timeout-- > 0; udelay(10))
690		if (!(inb(OPTi93X_PORT(chip, INDEX)) & OPTi93X_INIT))
691			return 0;
692
693	snd_printk("chip still busy.\n");
694	return -EBUSY;
695}
696
697static unsigned char snd_opti93x_in(struct snd_opti93x *chip, unsigned char reg)
698{
699	snd_opti93x_busy_wait(chip);
700	outb(chip->mce_bit | (reg & 0x1f), OPTi93X_PORT(chip, INDEX));
701	return inb(OPTi93X_PORT(chip, DATA));
702}
703
704static void snd_opti93x_out(struct snd_opti93x *chip, unsigned char reg,
705			    unsigned char value)
706{
707	snd_opti93x_busy_wait(chip);
708	outb(chip->mce_bit | (reg & 0x1f), OPTi93X_PORT(chip, INDEX));
709	outb(value, OPTi93X_PORT(chip, DATA));
710}
711
712static void snd_opti93x_out_image(struct snd_opti93x *chip, unsigned char reg,
713				  unsigned char value)
714{
715	snd_opti93x_out(chip, reg, chip->image[reg] = value);
716}
717
718static void snd_opti93x_out_mask(struct snd_opti93x *chip, unsigned char reg,
719				 unsigned char mask, unsigned char value)
720{
721	snd_opti93x_out_image(chip, reg,
722		(chip->image[reg] & ~mask) | (value & mask));
723}
724
725
726static void snd_opti93x_mce_up(struct snd_opti93x *chip)
727{
728	snd_opti93x_busy_wait(chip);
729
730	chip->mce_bit = OPTi93X_MCE;
731	if (!(inb(OPTi93X_PORT(chip, INDEX)) & OPTi93X_MCE))
732		outb(chip->mce_bit, OPTi93X_PORT(chip, INDEX));
733}
734
735static void snd_opti93x_mce_down(struct snd_opti93x *chip)
736{
737	snd_opti93x_busy_wait(chip);
738
739	chip->mce_bit = 0;
740	if (inb(OPTi93X_PORT(chip, INDEX)) & OPTi93X_MCE)
741		outb(chip->mce_bit, OPTi93X_PORT(chip, INDEX));
742}
743
744#define snd_opti93x_mute_reg(chip, reg, mute)	\
745	snd_opti93x_out(chip, reg, mute ? 0x80 : chip->image[reg]);
746
747static void snd_opti93x_mute(struct snd_opti93x *chip, int mute)
748{
749	mute = mute ? 1 : 0;
750	if (chip->mute == mute)
751		return;
752
753	chip->mute = mute;
754
755	snd_opti93x_mute_reg(chip, OPTi93X_CD_LEFT_INPUT, mute);
756	snd_opti93x_mute_reg(chip, OPTi93X_CD_RIGHT_INPUT, mute);
757	switch (chip->hardware) {
758	case OPTi9XX_HW_82C930:
759		snd_opti93x_mute_reg(chip, OPTi930_AUX_LEFT_INPUT, mute);
760		snd_opti93x_mute_reg(chip, OPTi930_AUX_RIGHT_INPUT, mute);
761		break;
762	case OPTi9XX_HW_82C931:
763	case OPTi9XX_HW_82C933:
764		snd_opti93x_mute_reg(chip, OPTi931_FM_LEFT_INPUT, mute);
765		snd_opti93x_mute_reg(chip, OPTi931_FM_RIGHT_INPUT, mute);
766		snd_opti93x_mute_reg(chip, OPTi931_AUX_LEFT_INPUT, mute);
767		snd_opti93x_mute_reg(chip, OPTi931_AUX_RIGHT_INPUT, mute);
768	}
769	snd_opti93x_mute_reg(chip, OPTi93X_DAC_LEFT, mute);
770	snd_opti93x_mute_reg(chip, OPTi93X_DAC_RIGHT, mute);
771	snd_opti93x_mute_reg(chip, OPTi93X_LINE_LEFT_INPUT, mute);
772	snd_opti93x_mute_reg(chip, OPTi93X_LINE_RIGHT_INPUT, mute);
773	snd_opti93x_mute_reg(chip, OPTi93X_MIC_LEFT_INPUT, mute);
774	snd_opti93x_mute_reg(chip, OPTi93X_MIC_RIGHT_INPUT, mute);
775	snd_opti93x_mute_reg(chip, OPTi93X_OUT_LEFT, mute);
776	snd_opti93x_mute_reg(chip, OPTi93X_OUT_RIGHT, mute);
777}
778
779
780static unsigned int snd_opti93x_get_count(unsigned char format,
781					  unsigned int size)
782{
783	switch (format & 0xe0) {
784	case OPTi93X_LINEAR_16_LIT:
785	case OPTi93X_LINEAR_16_BIG:
786		size >>= 1;
787		break;
788	case OPTi93X_ADPCM_16:
789		return size >> 2;
790	}
791	return (format & OPTi93X_STEREO) ? (size >> 1) : size;
792}
793
794static unsigned int rates[] = {  5512,  6615,  8000,  9600, 11025, 16000,
795				18900, 22050, 27428, 32000, 33075, 37800,
796				44100, 48000 };
797#define RATES ARRAY_SIZE(rates)
798
799static struct snd_pcm_hw_constraint_list hw_constraints_rates = {
800	.count = RATES,
801	.list = rates,
802	.mask = 0,
803};
804
805static unsigned char bits[] = {  0x01,  0x0f,  0x00,  0x0e,  0x03,  0x02,
806				 0x05,  0x07,  0x04,  0x06,  0x0d,  0x09,
807				 0x0b,  0x0c};
808
809static unsigned char snd_opti93x_get_freq(unsigned int rate)
810{
811	unsigned int i;
812
813	for (i = 0; i < RATES; i++) {
814		if (rate == rates[i])
815			return bits[i];
816	}
817	snd_BUG();
818	return bits[RATES-1];
819}
820
821static unsigned char snd_opti93x_get_format(struct snd_opti93x *chip,
822					    unsigned int format, int channels)
823{
824	unsigned char retval = OPTi93X_LINEAR_8;
825
826	switch (format) {
827	case SNDRV_PCM_FORMAT_MU_LAW:
828		retval = OPTi93X_ULAW_8;
829		break;
830	case SNDRV_PCM_FORMAT_A_LAW:
831		retval = OPTi93X_ALAW_8;
832		break;
833	case SNDRV_PCM_FORMAT_S16_LE:
834		retval = OPTi93X_LINEAR_16_LIT;
835		break;
836	case SNDRV_PCM_FORMAT_S16_BE:
837		retval = OPTi93X_LINEAR_16_BIG;
838		break;
839	case SNDRV_PCM_FORMAT_IMA_ADPCM:
840		retval = OPTi93X_ADPCM_16;
841	}
842	return (channels > 1) ? (retval | OPTi93X_STEREO) : retval;
843}
844
845
846static void snd_opti93x_playback_format(struct snd_opti93x *chip, unsigned char fmt)
847{
848	unsigned char mask;
849
850	snd_opti93x_mute(chip, 1);
851
852	snd_opti93x_mce_up(chip);
853	mask = (chip->mode & OPTi93X_MODE_CAPTURE) ? 0xf0 : 0xff;
854	snd_opti93x_out_mask(chip, OPTi93X_PLAY_FORMAT, mask, fmt);
855	snd_opti93x_mce_down(chip);
856
857	snd_opti93x_mute(chip, 0);
858}
859
860static void snd_opti93x_capture_format(struct snd_opti93x *chip, unsigned char fmt)
861{
862	snd_opti93x_mute(chip, 1);
863
864	snd_opti93x_mce_up(chip);
865	if (!(chip->mode & OPTi93X_MODE_PLAY))
866		snd_opti93x_out_mask(chip, OPTi93X_PLAY_FORMAT, 0x0f, fmt);
867	else
868		fmt = chip->image[OPTi93X_PLAY_FORMAT] & 0xf0;
869	snd_opti93x_out_image(chip, OPTi93X_CAPT_FORMAT, fmt);
870	snd_opti93x_mce_down(chip);
871
872	snd_opti93x_mute(chip, 0);
873}
874
875
876static int snd_opti93x_open(struct snd_opti93x *chip, unsigned int mode)
877{
878	unsigned long flags;
879
880	spin_lock_irqsave(&chip->lock, flags);
881
882	if (chip->mode & mode) {
883		spin_unlock_irqrestore(&chip->lock, flags);
884		return -EAGAIN;
885	}
886
887	if (!(chip->mode & OPTi93X_MODE_OPEN)) {
888		outb(0x00, OPTi93X_PORT(chip, STATUS));
889		snd_opti93x_out_mask(chip, OPTi93X_PIN_CTRL,
890			OPTi93X_IRQ_ENABLE, OPTi93X_IRQ_ENABLE);
891		chip->mode = mode;
892	}
893	else
894		chip->mode |= mode;
895
896	spin_unlock_irqrestore(&chip->lock, flags);
897	return 0;
898}
899
900static void snd_opti93x_close(struct snd_opti93x *chip, unsigned int mode)
901{
902	unsigned long flags;
903
904	spin_lock_irqsave(&chip->lock, flags);
905
906	chip->mode &= ~mode;
907	if (chip->mode & OPTi93X_MODE_OPEN) {
908		spin_unlock_irqrestore(&chip->lock, flags);
909		return;
910	}
911
912	snd_opti93x_mute(chip, 1);
913
914	outb(0, OPTi93X_PORT(chip, STATUS));
915	snd_opti93x_out_mask(chip, OPTi93X_PIN_CTRL, OPTi93X_IRQ_ENABLE,
916		~OPTi93X_IRQ_ENABLE);
917
918	snd_opti93x_mce_up(chip);
919	snd_opti93x_out_image(chip, OPTi93X_IFACE_CONF, 0x00);
920	snd_opti93x_mce_down(chip);
921	chip->mode = 0;
922
923	snd_opti93x_mute(chip, 0);
924	spin_unlock_irqrestore(&chip->lock, flags);
925}
926
927static int snd_opti93x_trigger(struct snd_pcm_substream *substream,
928			       unsigned char what, int cmd)
929{
930	struct snd_opti93x *chip = snd_pcm_substream_chip(substream);
931
932	switch (cmd) {
933	case SNDRV_PCM_TRIGGER_START:
934	case SNDRV_PCM_TRIGGER_STOP:
935	{
936		unsigned int what = 0;
937		struct snd_pcm_substream *s;
938		snd_pcm_group_for_each_entry(s, substream) {
939			if (s == chip->playback_substream) {
940				what |= OPTi93X_PLAYBACK_ENABLE;
941				snd_pcm_trigger_done(s, substream);
942			} else if (s == chip->capture_substream) {
943				what |= OPTi93X_CAPTURE_ENABLE;
944				snd_pcm_trigger_done(s, substream);
945			}
946		}
947		spin_lock(&chip->lock);
948		if (cmd == SNDRV_PCM_TRIGGER_START) {
949			snd_opti93x_out_mask(chip, OPTi93X_IFACE_CONF, what, what);
950			if (what & OPTi93X_CAPTURE_ENABLE)
951				udelay(50);
952		} else
953			snd_opti93x_out_mask(chip, OPTi93X_IFACE_CONF, what, 0x00);
954		spin_unlock(&chip->lock);
955		break;
956	}
957	default:
958		return -EINVAL;
959	}
960	return 0;
961}
962
963static int snd_opti93x_playback_trigger(struct snd_pcm_substream *substream, int cmd)
964{
965	return snd_opti93x_trigger(substream,
966				   OPTi93X_PLAYBACK_ENABLE, cmd);
967}
968
969static int snd_opti93x_capture_trigger(struct snd_pcm_substream *substream, int cmd)
970{
971	return snd_opti93x_trigger(substream,
972				   OPTi93X_CAPTURE_ENABLE, cmd);
973}
974
975static int snd_opti93x_hw_params(struct snd_pcm_substream *substream,
976				 struct snd_pcm_hw_params *hw_params)
977{
978	return snd_pcm_lib_malloc_pages(substream, params_buffer_bytes(hw_params));
979}
980
981
982static int snd_opti93x_hw_free(struct snd_pcm_substream *substream)
983{
984	snd_pcm_lib_free_pages(substream);
985	return 0;
986}
987
988
989static int snd_opti93x_playback_prepare(struct snd_pcm_substream *substream)
990{
991	struct snd_opti93x *chip = snd_pcm_substream_chip(substream);
992	struct snd_pcm_runtime *runtime = substream->runtime;
993	unsigned long flags;
994	unsigned char format;
995	unsigned int count = snd_pcm_lib_period_bytes(substream);
996	unsigned int size = snd_pcm_lib_buffer_bytes(substream);
997
998	spin_lock_irqsave(&chip->lock, flags);
999
1000	chip->p_dma_size = size;
1001	snd_opti93x_out_mask(chip, OPTi93X_IFACE_CONF,
1002		OPTi93X_PLAYBACK_ENABLE | OPTi93X_PLAYBACK_PIO,
1003		~(OPTi93X_PLAYBACK_ENABLE | OPTi93X_PLAYBACK_PIO));
1004
1005	snd_dma_program(chip->dma1, runtime->dma_addr, size,
1006		DMA_MODE_WRITE | DMA_AUTOINIT);
1007
1008	format = snd_opti93x_get_freq(runtime->rate);
1009	format |= snd_opti93x_get_format(chip, runtime->format,
1010		runtime->channels);
1011	snd_opti93x_playback_format(chip, format);
1012	format = chip->image[OPTi93X_PLAY_FORMAT];
1013
1014	count = snd_opti93x_get_count(format, count) - 1;
1015	snd_opti93x_out_image(chip, OPTi93X_PLAY_LWR_CNT, count);
1016	snd_opti93x_out_image(chip, OPTi93X_PLAY_UPR_CNT, count >> 8);
1017
1018	spin_unlock_irqrestore(&chip->lock, flags);
1019	return 0;
1020}
1021
1022static int snd_opti93x_capture_prepare(struct snd_pcm_substream *substream)
1023{
1024	struct snd_opti93x *chip = snd_pcm_substream_chip(substream);
1025	struct snd_pcm_runtime *runtime = substream->runtime;
1026	unsigned long flags;
1027	unsigned char format;
1028	unsigned int count = snd_pcm_lib_period_bytes(substream);
1029	unsigned int size = snd_pcm_lib_buffer_bytes(substream);
1030
1031	spin_lock_irqsave(&chip->lock, flags);
1032
1033	chip->c_dma_size = size;
1034	snd_opti93x_out_mask(chip, OPTi93X_IFACE_CONF,
1035		OPTi93X_CAPTURE_ENABLE | OPTi93X_CAPTURE_PIO, 0);
1036
1037	snd_dma_program(chip->dma2, runtime->dma_addr, size,
1038		DMA_MODE_READ | DMA_AUTOINIT);
1039
1040	format = snd_opti93x_get_freq(runtime->rate);
1041	format |= snd_opti93x_get_format(chip, runtime->format,
1042		runtime->channels);
1043	snd_opti93x_capture_format(chip, format);
1044	format = chip->image[OPTi93X_CAPT_FORMAT];
1045
1046	count = snd_opti93x_get_count(format, count) - 1;
1047	snd_opti93x_out_image(chip, OPTi93X_CAPT_LWR_CNT, count);
1048	snd_opti93x_out_image(chip, OPTi93X_CAPT_UPR_CNT, count >> 8);
1049
1050	spin_unlock_irqrestore(&chip->lock, flags);
1051	return 0;
1052}
1053
1054static snd_pcm_uframes_t snd_opti93x_playback_pointer(struct snd_pcm_substream *substream)
1055{
1056	struct snd_opti93x *chip = snd_pcm_substream_chip(substream);
1057	size_t ptr;
1058
1059	if (!(chip->image[OPTi93X_IFACE_CONF] & OPTi93X_PLAYBACK_ENABLE))
1060		return 0;
1061
1062	ptr = snd_dma_pointer(chip->dma1, chip->p_dma_size);
1063	return bytes_to_frames(substream->runtime, ptr);
1064}
1065
1066static snd_pcm_uframes_t snd_opti93x_capture_pointer(struct snd_pcm_substream *substream)
1067{
1068	struct snd_opti93x *chip = snd_pcm_substream_chip(substream);
1069	size_t ptr;
1070
1071	if (!(chip->image[OPTi93X_IFACE_CONF] & OPTi93X_CAPTURE_ENABLE))
1072		return 0;
1073
1074	ptr = snd_dma_pointer(chip->dma2, chip->c_dma_size);
1075	return bytes_to_frames(substream->runtime, ptr);
1076}
1077
1078
1079static void snd_opti93x_overrange(struct snd_opti93x *chip)
1080{
1081	unsigned long flags;
1082
1083	spin_lock_irqsave(&chip->lock, flags);
1084
1085	if (snd_opti93x_in(chip, OPTi93X_ERR_INIT) & (0x08 | 0x02))
1086		chip->capture_substream->runtime->overrange++;
1087
1088	spin_unlock_irqrestore(&chip->lock, flags);
1089}
1090
1091static irqreturn_t snd_opti93x_interrupt(int irq, void *dev_id)
1092{
1093	struct snd_opti93x *codec = dev_id;
1094	unsigned char status;
1095
1096	status = snd_opti9xx_read(codec->chip, OPTi9XX_MC_REG(11));
1097	if ((status & OPTi93X_IRQ_PLAYBACK) && codec->playback_substream)
1098		snd_pcm_period_elapsed(codec->playback_substream);
1099	if ((status & OPTi93X_IRQ_CAPTURE) && codec->capture_substream) {
1100		snd_opti93x_overrange(codec);
1101		snd_pcm_period_elapsed(codec->capture_substream);
1102	}
1103	outb(0x00, OPTi93X_PORT(codec, STATUS));
1104	return IRQ_HANDLED;
1105}
1106
1107
1108static struct snd_pcm_hardware snd_opti93x_playback = {
1109	.info =			(SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_INTERLEAVED |
1110				 SNDRV_PCM_INFO_MMAP_VALID | SNDRV_PCM_INFO_SYNC_START),
1111	.formats =		(SNDRV_PCM_FMTBIT_MU_LAW | SNDRV_PCM_FMTBIT_A_LAW | SNDRV_PCM_FMTBIT_IMA_ADPCM |
1112				 SNDRV_PCM_FMTBIT_U8 | SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S16_BE),
1113	.rates =		SNDRV_PCM_RATE_KNOT | SNDRV_PCM_RATE_8000_48000,
1114	.rate_min =		5512,
1115	.rate_max =		48000,
1116	.channels_min =		1,
1117	.channels_max =		2,
1118	.buffer_bytes_max =	(128*1024),
1119	.period_bytes_min =	64,
1120	.period_bytes_max =	(128*1024),
1121	.periods_min =		1,
1122	.periods_max =		1024,
1123	.fifo_size =		0,
1124};
1125
1126static struct snd_pcm_hardware snd_opti93x_capture = {
1127	.info =			(SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_INTERLEAVED |
1128				 SNDRV_PCM_INFO_MMAP_VALID | SNDRV_PCM_INFO_SYNC_START),
1129	.formats =		(SNDRV_PCM_FMTBIT_MU_LAW | SNDRV_PCM_FMTBIT_A_LAW | SNDRV_PCM_FMTBIT_IMA_ADPCM |
1130				 SNDRV_PCM_FMTBIT_U8 | SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S16_BE),
1131	.rates =		SNDRV_PCM_RATE_8000_48000,
1132	.rate_min =		5512,
1133	.rate_max =		48000,
1134	.channels_min =		1,
1135	.channels_max =		2,
1136	.buffer_bytes_max =	(128*1024),
1137	.period_bytes_min =	64,
1138	.period_bytes_max =	(128*1024),
1139	.periods_min =		1,
1140	.periods_max =		1024,
1141	.fifo_size =		0,
1142};
1143
1144static int snd_opti93x_playback_open(struct snd_pcm_substream *substream)
1145{
1146	int error;
1147	struct snd_opti93x *chip = snd_pcm_substream_chip(substream);
1148	struct snd_pcm_runtime *runtime = substream->runtime;
1149
1150	if ((error = snd_opti93x_open(chip, OPTi93X_MODE_PLAY)) < 0)
1151		return error;
1152	snd_pcm_set_sync(substream);
1153	chip->playback_substream = substream;
1154	runtime->hw = snd_opti93x_playback;
1155	snd_pcm_limit_isa_dma_size(chip->dma1, &runtime->hw.buffer_bytes_max);
1156	snd_pcm_hw_constraint_list(runtime, 0, SNDRV_PCM_HW_PARAM_RATE, &hw_constraints_rates);
1157	return error;
1158}
1159
1160static int snd_opti93x_capture_open(struct snd_pcm_substream *substream)
1161{
1162	int error;
1163	struct snd_opti93x *chip = snd_pcm_substream_chip(substream);
1164	struct snd_pcm_runtime *runtime = substream->runtime;
1165
1166	if ((error = snd_opti93x_open(chip, OPTi93X_MODE_CAPTURE)) < 0)
1167		return error;
1168	runtime->hw = snd_opti93x_capture;
1169	snd_pcm_set_sync(substream);
1170	chip->capture_substream = substream;
1171	snd_pcm_limit_isa_dma_size(chip->dma2, &runtime->hw.buffer_bytes_max);
1172	snd_pcm_hw_constraint_list(runtime, 0, SNDRV_PCM_HW_PARAM_RATE, &hw_constraints_rates);
1173	return error;
1174}
1175
1176static int snd_opti93x_playback_close(struct snd_pcm_substream *substream)
1177{
1178	struct snd_opti93x *chip = snd_pcm_substream_chip(substream);
1179
1180	chip->playback_substream = NULL;
1181	snd_opti93x_close(chip, OPTi93X_MODE_PLAY);
1182	return 0;
1183}
1184
1185static int snd_opti93x_capture_close(struct snd_pcm_substream *substream)
1186{
1187	struct snd_opti93x *chip = snd_pcm_substream_chip(substream);
1188
1189	chip->capture_substream = NULL;
1190	snd_opti93x_close(chip, OPTi93X_MODE_CAPTURE);
1191	return 0;
1192}
1193
1194
1195static void snd_opti93x_init(struct snd_opti93x *chip)
1196{
1197	unsigned long flags;
1198	int i;
1199
1200	spin_lock_irqsave(&chip->lock, flags);
1201	snd_opti93x_mce_up(chip);
1202
1203	for (i = 0; i < 32; i++)
1204		snd_opti93x_out_image(chip, i, snd_opti93x_default_image[i]);
1205
1206	snd_opti93x_mce_down(chip);
1207	spin_unlock_irqrestore(&chip->lock, flags);
1208}
1209
1210static int snd_opti93x_probe(struct snd_opti93x *chip)
1211{
1212	unsigned long flags;
1213	unsigned char val;
1214
1215	spin_lock_irqsave(&chip->lock, flags);
1216	val = snd_opti93x_in(chip, OPTi93X_ID) & 0x0f;
1217	spin_unlock_irqrestore(&chip->lock, flags);
1218
1219	return (val == 0x0a) ? 0 : -ENODEV;
1220}
1221
1222static int snd_opti93x_free(struct snd_opti93x *chip)
1223{
1224	release_and_free_resource(chip->res_port);
1225	if (chip->dma1 >= 0) {
1226		disable_dma(chip->dma1);
1227		free_dma(chip->dma1);
1228	}
1229	if (chip->dma2 >= 0) {
1230		disable_dma(chip->dma2);
1231		free_dma(chip->dma2);
1232	}
1233	if (chip->irq >= 0) {
1234	  free_irq(chip->irq, chip);
1235	}
1236	kfree(chip);
1237	return 0;
1238}
1239
1240static int snd_opti93x_dev_free(struct snd_device *device)
1241{
1242	struct snd_opti93x *chip = device->device_data;
1243	return snd_opti93x_free(chip);
1244}
1245
1246static const char *snd_opti93x_chip_id(struct snd_opti93x *codec)
1247{
1248	switch (codec->hardware) {
1249	case OPTi9XX_HW_82C930: return "82C930";
1250	case OPTi9XX_HW_82C931: return "82C931";
1251	case OPTi9XX_HW_82C933: return "82C933";
1252	default:		return "???";
1253	}
1254}
1255
1256static int snd_opti93x_create(struct snd_card *card, struct snd_opti9xx *chip,
1257			      int dma1, int dma2,
1258			      struct snd_opti93x **rcodec)
1259{
1260	static struct snd_device_ops ops = {
1261		.dev_free =	snd_opti93x_dev_free,
1262	};
1263	int error;
1264	struct snd_opti93x *codec;
1265
1266	*rcodec = NULL;
1267	codec = kzalloc(sizeof(*codec), GFP_KERNEL);
1268	if (codec == NULL)
1269		return -ENOMEM;
1270	codec->irq = -1;
1271	codec->dma1 = -1;
1272	codec->dma2 = -1;
1273
1274	if ((codec->res_port = request_region(chip->wss_base + 4, 4, "OPTI93x CODEC")) == NULL) {
1275		snd_printk(KERN_ERR "opti9xx: can't grab port 0x%lx\n", chip->wss_base + 4);
1276		snd_opti93x_free(codec);
1277		return -EBUSY;
1278	}
1279	if (request_dma(dma1, "OPTI93x - 1")) {
1280		snd_printk(KERN_ERR "opti9xx: can't grab DMA1 %d\n", dma1);
1281		snd_opti93x_free(codec);
1282		return -EBUSY;
1283	}
1284	codec->dma1 = chip->dma1;
1285	if (request_dma(dma2, "OPTI93x - 2")) {
1286		snd_printk(KERN_ERR "opti9xx: can't grab DMA2 %d\n", dma2);
1287		snd_opti93x_free(codec);
1288		return -EBUSY;
1289	}
1290	codec->dma2 = chip->dma2;
1291
1292	if (request_irq(chip->irq, snd_opti93x_interrupt, IRQF_DISABLED, DEV_NAME" - WSS", codec)) {
1293		snd_printk(KERN_ERR "opti9xx: can't grab IRQ %d\n", chip->irq);
1294		snd_opti93x_free(codec);
1295		return -EBUSY;
1296	}
1297
1298	codec->card = card;
1299	codec->port = chip->wss_base + 4;
1300	codec->irq = chip->irq;
1301
1302	spin_lock_init(&codec->lock);
1303	codec->hardware = chip->hardware;
1304	codec->chip = chip;
1305
1306	if ((error = snd_opti93x_probe(codec))) {
1307		snd_opti93x_free(codec);
1308		return error;
1309	}
1310
1311	snd_opti93x_init(codec);
1312
1313	/* Register device */
1314	if ((error = snd_device_new(card, SNDRV_DEV_LOWLEVEL, codec, &ops)) < 0) {
1315		snd_opti93x_free(codec);
1316		return error;
1317	}
1318
1319	*rcodec = codec;
1320	return 0;
1321}
1322
1323static struct snd_pcm_ops snd_opti93x_playback_ops = {
1324	.open =		snd_opti93x_playback_open,
1325	.close =	snd_opti93x_playback_close,
1326	.ioctl =	snd_pcm_lib_ioctl,
1327	.hw_params =	snd_opti93x_hw_params,
1328	.hw_free =	snd_opti93x_hw_free,
1329	.prepare =	snd_opti93x_playback_prepare,
1330	.trigger =	snd_opti93x_playback_trigger,
1331	.pointer =	snd_opti93x_playback_pointer,
1332};
1333
1334static struct snd_pcm_ops snd_opti93x_capture_ops = {
1335	.open =		snd_opti93x_capture_open,
1336	.close =	snd_opti93x_capture_close,
1337	.ioctl =	snd_pcm_lib_ioctl,
1338	.hw_params =	snd_opti93x_hw_params,
1339	.hw_free =	snd_opti93x_hw_free,
1340	.prepare =	snd_opti93x_capture_prepare,
1341	.trigger =	snd_opti93x_capture_trigger,
1342	.pointer =	snd_opti93x_capture_pointer,
1343};
1344
1345static int snd_opti93x_pcm(struct snd_opti93x *codec, int device, struct snd_pcm **rpcm)
1346{
1347	int error;
1348	struct snd_pcm *pcm;
1349
1350	if ((error = snd_pcm_new(codec->card, "OPTi 82C93X", device, 1, 1, &pcm)) < 0)
1351		return error;
1352
1353	snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &snd_opti93x_playback_ops);
1354	snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &snd_opti93x_capture_ops);
1355
1356	pcm->private_data = codec;
1357	pcm->info_flags = SNDRV_PCM_INFO_JOINT_DUPLEX;
1358
1359	strcpy(pcm->name, snd_opti93x_chip_id(codec));
1360
1361	snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_DEV,
1362					      snd_dma_isa_data(),
1363					      64*1024, codec->dma1 > 3 || codec->dma2 > 3 ? 128*1024 : 64*1024);
1364
1365	codec->pcm = pcm;
1366	if (rpcm)
1367		*rpcm = pcm;
1368	return 0;
1369}
1370
1371/*
1372 *  MIXER part
1373 */
1374
1375static int snd_opti93x_info_mux(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
1376{
1377	static char *texts[4] = {
1378		"Line1", "Aux", "Mic", "Mix"
1379	};
1380
1381	uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
1382	uinfo->count = 2;
1383	uinfo->value.enumerated.items = 4;
1384	if (uinfo->value.enumerated.item > 3)
1385		uinfo->value.enumerated.item = 3;
1386	strcpy(uinfo->value.enumerated.name, texts[uinfo->value.enumerated.item]);
1387	return 0;
1388}
1389
1390static int snd_opti93x_get_mux(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
1391{
1392	struct snd_opti93x *chip = snd_kcontrol_chip(kcontrol);
1393	unsigned long flags;
1394
1395	spin_lock_irqsave(&chip->lock, flags);
1396	ucontrol->value.enumerated.item[0] = (chip->image[OPTi93X_MIXOUT_LEFT] & OPTi93X_MIXOUT_MIXER) >> 6;
1397	ucontrol->value.enumerated.item[1] = (chip->image[OPTi93X_MIXOUT_RIGHT] & OPTi93X_MIXOUT_MIXER) >> 6;
1398	spin_unlock_irqrestore(&chip->lock, flags);
1399	return 0;
1400}
1401
1402static int snd_opti93x_put_mux(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
1403{
1404	struct snd_opti93x *chip = snd_kcontrol_chip(kcontrol);
1405	unsigned long flags;
1406	unsigned short left, right;
1407	int change;
1408
1409	if (ucontrol->value.enumerated.item[0] > 3 ||
1410	    ucontrol->value.enumerated.item[1] > 3)
1411		return -EINVAL;
1412	left = ucontrol->value.enumerated.item[0] << 6;
1413	right = ucontrol->value.enumerated.item[1] << 6;
1414	spin_lock_irqsave(&chip->lock, flags);
1415	left = (chip->image[OPTi93X_MIXOUT_LEFT] & ~OPTi93X_MIXOUT_MIXER) | left;
1416	right = (chip->image[OPTi93X_MIXOUT_RIGHT] & ~OPTi93X_MIXOUT_MIXER) | right;
1417	change = left != chip->image[OPTi93X_MIXOUT_LEFT] ||
1418	         right != chip->image[OPTi93X_MIXOUT_RIGHT];
1419	snd_opti93x_out_image(chip, OPTi93X_MIXOUT_LEFT, left);
1420	snd_opti93x_out_image(chip, OPTi93X_MIXOUT_RIGHT, right);
1421	spin_unlock_irqrestore(&chip->lock, flags);
1422	return change;
1423}
1424
1425
1426#define OPTi93X_DOUBLE(xname, xindex, left_reg, right_reg, shift_left, shift_right, mask, invert) \
1427{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = xindex, \
1428  .info = snd_opti93x_info_double, \
1429  .get = snd_opti93x_get_double, .put = snd_opti93x_put_double, \
1430  .private_value = left_reg | (right_reg << 8) | (shift_left << 16) | (shift_right << 19) | (mask << 24) | (invert << 22) }
1431
1432#define OPTi93X_DOUBLE_INVERT_INVERT(xctl) \
1433	do { xctl.private_value ^= 22; } while (0)
1434#define OPTi93X_DOUBLE_CHANGE_REGS(xctl, left_reg, right_reg) \
1435	do { xctl.private_value &= ~0x0000ffff; \
1436	     xctl.private_value |= left_reg | (right_reg << 8); } while (0)
1437
1438static int snd_opti93x_info_double(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
1439{
1440	int mask = (kcontrol->private_value >> 24) & 0xff;
1441
1442	uinfo->type = mask == 1 ? SNDRV_CTL_ELEM_TYPE_BOOLEAN : SNDRV_CTL_ELEM_TYPE_INTEGER;
1443	uinfo->count = 2;
1444	uinfo->value.integer.min = 0;
1445	uinfo->value.integer.max = mask;
1446	return 0;
1447}
1448
1449static int snd_opti93x_get_double(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
1450{
1451	struct snd_opti93x *chip = snd_kcontrol_chip(kcontrol);
1452	unsigned long flags;
1453	int left_reg = kcontrol->private_value & 0xff;
1454	int right_reg = (kcontrol->private_value >> 8) & 0xff;
1455	int shift_left = (kcontrol->private_value >> 16) & 0x07;
1456	int shift_right = (kcontrol->private_value >> 19) & 0x07;
1457	int mask = (kcontrol->private_value >> 24) & 0xff;
1458	int invert = (kcontrol->private_value >> 22) & 1;
1459
1460	spin_lock_irqsave(&chip->lock, flags);
1461	ucontrol->value.integer.value[0] = (chip->image[left_reg] >> shift_left) & mask;
1462	ucontrol->value.integer.value[1] = (chip->image[right_reg] >> shift_right) & mask;
1463	spin_unlock_irqrestore(&chip->lock, flags);
1464	if (invert) {
1465		ucontrol->value.integer.value[0] = mask - ucontrol->value.integer.value[0];
1466		ucontrol->value.integer.value[1] = mask - ucontrol->value.integer.value[1];
1467	}
1468	return 0;
1469}
1470
1471static int snd_opti93x_put_double(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
1472{
1473	struct snd_opti93x *chip = snd_kcontrol_chip(kcontrol);
1474	unsigned long flags;
1475	int left_reg = kcontrol->private_value & 0xff;
1476	int right_reg = (kcontrol->private_value >> 8) & 0xff;
1477	int shift_left = (kcontrol->private_value >> 16) & 0x07;
1478	int shift_right = (kcontrol->private_value >> 19) & 0x07;
1479	int mask = (kcontrol->private_value >> 24) & 0xff;
1480	int invert = (kcontrol->private_value >> 22) & 1;
1481	int change;
1482	unsigned short val1, val2;
1483
1484	val1 = ucontrol->value.integer.value[0] & mask;
1485	val2 = ucontrol->value.integer.value[1] & mask;
1486	if (invert) {
1487		val1 = mask - val1;
1488		val2 = mask - val2;
1489	}
1490	val1 <<= shift_left;
1491	val2 <<= shift_right;
1492	spin_lock_irqsave(&chip->lock, flags);
1493	val1 = (chip->image[left_reg] & ~(mask << shift_left)) | val1;
1494	val2 = (chip->image[right_reg] & ~(mask << shift_right)) | val2;
1495	change = val1 != chip->image[left_reg] || val2 != chip->image[right_reg];
1496	snd_opti93x_out_image(chip, left_reg, val1);
1497	snd_opti93x_out_image(chip, right_reg, val2);
1498	spin_unlock_irqrestore(&chip->lock, flags);
1499	return change;
1500}
1501
1502static struct snd_kcontrol_new snd_opti93x_controls[] __devinitdata = {
1503OPTi93X_DOUBLE("Master Playback Switch", 0, OPTi93X_OUT_LEFT, OPTi93X_OUT_RIGHT, 7, 7, 1, 1),
1504OPTi93X_DOUBLE("Master Playback Volume", 0, OPTi93X_OUT_LEFT, OPTi93X_OUT_RIGHT, 1, 1, 31, 1),
1505OPTi93X_DOUBLE("PCM Playback Switch", 0, OPTi93X_DAC_LEFT, OPTi93X_DAC_RIGHT, 7, 7, 1, 1),
1506OPTi93X_DOUBLE("PCM Playback Volume", 0, OPTi93X_DAC_LEFT, OPTi93X_DAC_RIGHT, 0, 0, 31, 1),
1507OPTi93X_DOUBLE("FM Playback Switch", 0, OPTi931_FM_LEFT_INPUT, OPTi931_FM_RIGHT_INPUT, 7, 7, 1, 1),
1508OPTi93X_DOUBLE("FM Playback Volume", 0, OPTi931_FM_LEFT_INPUT, OPTi931_FM_RIGHT_INPUT, 1, 1, 15, 1),
1509OPTi93X_DOUBLE("Line Playback Switch", 0, OPTi93X_LINE_LEFT_INPUT, OPTi93X_LINE_RIGHT_INPUT, 7, 7, 1, 1),
1510OPTi93X_DOUBLE("Line Playback Volume", 0, OPTi93X_LINE_LEFT_INPUT, OPTi93X_LINE_RIGHT_INPUT, 1, 1, 15, 1),
1511OPTi93X_DOUBLE("Mic Playback Switch", 0, OPTi93X_MIC_LEFT_INPUT, OPTi93X_MIC_RIGHT_INPUT, 7, 7, 1, 1),
1512OPTi93X_DOUBLE("Mic Playback Volume", 0, OPTi93X_MIC_LEFT_INPUT, OPTi93X_MIC_RIGHT_INPUT, 1, 1, 15, 1),
1513OPTi93X_DOUBLE("Mic Boost", 0, OPTi93X_MIXOUT_LEFT, OPTi93X_MIXOUT_RIGHT, 5, 5, 1, 1),
1514OPTi93X_DOUBLE("CD Playback Switch", 0, OPTi93X_CD_LEFT_INPUT, OPTi93X_CD_RIGHT_INPUT, 7, 7, 1, 1),
1515OPTi93X_DOUBLE("CD Playback Volume", 0, OPTi93X_CD_LEFT_INPUT, OPTi93X_CD_RIGHT_INPUT, 1, 1, 15, 1),
1516OPTi93X_DOUBLE("Aux Playback Switch", 0, OPTi931_AUX_LEFT_INPUT, OPTi931_AUX_RIGHT_INPUT, 7, 7, 1, 1),
1517OPTi93X_DOUBLE("Aux Playback Volume", 0, OPTi931_AUX_LEFT_INPUT, OPTi931_AUX_RIGHT_INPUT, 1, 1, 15, 1),
1518OPTi93X_DOUBLE("Capture Volume", 0, OPTi93X_MIXOUT_LEFT, OPTi93X_MIXOUT_RIGHT, 0, 0, 15, 0),
1519{
1520	.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
1521	.name = "Capture Source",
1522	.info = snd_opti93x_info_mux,
1523	.get = snd_opti93x_get_mux,
1524	.put = snd_opti93x_put_mux,
1525}
1526};
1527
1528static int snd_opti93x_mixer(struct snd_opti93x *chip)
1529{
1530	struct snd_card *card;
1531	struct snd_kcontrol_new knew;
1532	int err;
1533	unsigned int idx;
1534
1535	snd_assert(chip != NULL && chip->card != NULL, return -EINVAL);
1536
1537	card = chip->card;
1538
1539	strcpy(card->mixername, snd_opti93x_chip_id(chip));
1540
1541	for (idx = 0; idx < ARRAY_SIZE(snd_opti93x_controls); idx++) {
1542		knew = snd_opti93x_controls[idx];
1543		if (chip->hardware == OPTi9XX_HW_82C930) {
1544			if (strstr(knew.name, "FM"))	/* skip FM controls */
1545				continue;
1546			else if (strcmp(knew.name, "Mic Playback Volume"))
1547				OPTi93X_DOUBLE_INVERT_INVERT(knew);
1548			else if (strstr(knew.name, "Aux"))
1549				OPTi93X_DOUBLE_CHANGE_REGS(knew, OPTi930_AUX_LEFT_INPUT, OPTi930_AUX_RIGHT_INPUT);
1550			else if (strcmp(knew.name, "PCM Playback Volume"))
1551				OPTi93X_DOUBLE_INVERT_INVERT(knew);
1552			else if (strcmp(knew.name, "Master Playback Volume"))
1553				OPTi93X_DOUBLE_INVERT_INVERT(knew);
1554		}
1555		if ((err = snd_ctl_add(card, snd_ctl_new1(&snd_opti93x_controls[idx], chip))) < 0)
1556			return err;
1557	}
1558	return 0;
1559}
1560
1561#endif /* OPTi93X */
1562
1563static int __devinit snd_card_opti9xx_detect(struct snd_card *card,
1564					     struct snd_opti9xx *chip)
1565{
1566	int i, err;
1567
1568#ifndef OPTi93X
1569	for (i = OPTi9XX_HW_82C928; i < OPTi9XX_HW_82C930; i++) {
1570		unsigned char value;
1571
1572		if ((err = snd_opti9xx_init(chip, i)) < 0)
1573			return err;
1574
1575		if ((chip->res_mc_base = request_region(chip->mc_base, chip->mc_base_size, "OPTi9xx MC")) == NULL)
1576			continue;
1577
1578		value = snd_opti9xx_read(chip, OPTi9XX_MC_REG(1));
1579		if ((value != 0xff) && (value != inb(chip->mc_base + 1)))
1580			if (value == snd_opti9xx_read(chip, OPTi9XX_MC_REG(1)))
1581				return 1;
1582
1583		release_and_free_resource(chip->res_mc_base);
1584		chip->res_mc_base = NULL;
1585
1586	}
1587#else	/* OPTi93X */
1588	for (i = OPTi9XX_HW_82C931; i >= OPTi9XX_HW_82C930; i--) {
1589		unsigned long flags;
1590		unsigned char value;
1591
1592		if ((err = snd_opti9xx_init(chip, i)) < 0)
1593			return err;
1594
1595		if ((chip->res_mc_base = request_region(chip->mc_base, chip->mc_base_size, "OPTi9xx MC")) == NULL)
1596			continue;
1597
1598		spin_lock_irqsave(&chip->lock, flags);
1599		outb(chip->password, chip->mc_base + chip->pwd_reg);
1600		outb(((chip->mc_indir_index & (1 << 8)) >> 4) |
1601			((chip->mc_indir_index & 0xf0) >> 4), chip->mc_base);
1602		spin_unlock_irqrestore(&chip->lock, flags);
1603
1604		value = snd_opti9xx_read(chip, OPTi9XX_MC_REG(7));
1605		snd_opti9xx_write(chip, OPTi9XX_MC_REG(7), 0xff - value);
1606		if (snd_opti9xx_read(chip, OPTi9XX_MC_REG(7)) == 0xff - value)
1607			return 1;
1608
1609		release_and_free_resource(chip->res_mc_base);
1610		chip->res_mc_base = NULL;
1611	}
1612#endif	/* OPTi93X */
1613
1614	return -ENODEV;
1615}
1616
1617#ifdef CONFIG_PNP
1618static int __devinit snd_card_opti9xx_pnp(struct snd_opti9xx *chip,
1619					  struct pnp_card_link *card,
1620					  const struct pnp_card_device_id *pid)
1621{
1622	struct pnp_dev *pdev;
1623	struct pnp_resource_table *cfg = kmalloc(sizeof(*cfg), GFP_KERNEL);
1624	int err;
1625
1626	if (!cfg)
1627		return -ENOMEM;
1628	chip->dev = pnp_request_card_device(card, pid->devs[0].id, NULL);
1629	if (chip->dev == NULL) {
1630		kfree(cfg);
1631		return -EBUSY;
1632	}
1633	chip->devmpu = pnp_request_card_device(card, pid->devs[1].id, NULL);
1634
1635	pdev = chip->dev;
1636	pnp_init_resource_table(cfg);
1637
1638#ifdef OPTi93X
1639	if (port != SNDRV_AUTO_PORT)
1640		pnp_resource_change(&cfg->port_resource[0], port + 4, 4);
1641#else
1642	if (pid->driver_data != 0x0924 && port != SNDRV_AUTO_PORT)
1643		pnp_resource_change(&cfg->port_resource[1], port, 4);
1644#endif	/* OPTi93X */
1645	if (irq != SNDRV_AUTO_IRQ)
1646		pnp_resource_change(&cfg->irq_resource[0], irq, 1);
1647	if (dma1 != SNDRV_AUTO_DMA)
1648		pnp_resource_change(&cfg->dma_resource[0], dma1, 1);
1649#if defined(CS4231) || defined(OPTi93X)
1650	if (dma2 != SNDRV_AUTO_DMA)
1651		pnp_resource_change(&cfg->dma_resource[1], dma2, 1);
1652#else
1653#ifdef snd_opti9xx_fixup_dma2
1654	snd_opti9xx_fixup_dma2(pdev);
1655#endif
1656#endif	/* CS4231 || OPTi93X */
1657#ifdef OPTi93X
1658	if (fm_port > 0 && fm_port != SNDRV_AUTO_PORT)
1659		pnp_resource_change(&cfg->port_resource[1], fm_port, 4);
1660#else
1661	if (fm_port > 0 && fm_port != SNDRV_AUTO_PORT)
1662		pnp_resource_change(&cfg->port_resource[2], fm_port, 4);
1663#endif
1664	if (pnp_manual_config_dev(pdev, cfg, 0) < 0)
1665		snd_printk(KERN_ERR "AUDIO the requested resources are invalid, using auto config\n");
1666	err = pnp_activate_dev(pdev);
1667	if (err < 0) {
1668		snd_printk(KERN_ERR "AUDIO pnp configure failure: %d\n", err);
1669		kfree(cfg);
1670		return err;
1671	}
1672
1673#ifdef OPTi93X
1674	port = pnp_port_start(pdev, 0) - 4;
1675	fm_port = pnp_port_start(pdev, 1);
1676#else
1677	if (pid->driver_data != 0x0924)
1678		port = pnp_port_start(pdev, 1);
1679	fm_port = pnp_port_start(pdev, 2);
1680#endif	/* OPTi93X */
1681	irq = pnp_irq(pdev, 0);
1682	dma1 = pnp_dma(pdev, 0);
1683#if defined(CS4231) || defined(OPTi93X)
1684	dma2 = pnp_dma(pdev, 1);
1685#endif	/* CS4231 || OPTi93X */
1686
1687	pdev = chip->devmpu;
1688	if (pdev && mpu_port > 0) {
1689		pnp_init_resource_table(cfg);
1690
1691		if (mpu_port != SNDRV_AUTO_PORT)
1692			pnp_resource_change(&cfg->port_resource[0], mpu_port, 2);
1693		if (mpu_irq != SNDRV_AUTO_IRQ)
1694			pnp_resource_change(&cfg->irq_resource[0], mpu_irq, 1);
1695
1696		if (pnp_manual_config_dev(pdev, cfg, 0) < 0)
1697			snd_printk(KERN_ERR "AUDIO the requested resources are invalid, using auto config\n");
1698		err = pnp_activate_dev(pdev);
1699		if (err < 0) {
1700			snd_printk(KERN_ERR "AUDIO pnp configure failure\n");
1701			mpu_port = -1;
1702			chip->devmpu = NULL;
1703		} else {
1704			mpu_port = pnp_port_start(pdev, 0);
1705			mpu_irq = pnp_irq(pdev, 0);
1706		}
1707	}
1708	kfree(cfg);
1709	return pid->driver_data;
1710}
1711#endif	/* CONFIG_PNP */
1712
1713static void snd_card_opti9xx_free(struct snd_card *card)
1714{
1715	struct snd_opti9xx *chip = card->private_data;
1716
1717	if (chip)
1718		release_and_free_resource(chip->res_mc_base);
1719}
1720
1721static int __devinit snd_opti9xx_probe(struct snd_card *card)
1722{
1723	static long possible_ports[] = {0x530, 0xe80, 0xf40, 0x604, -1};
1724	int error;
1725	struct snd_opti9xx *chip = card->private_data;
1726#if defined(OPTi93X)
1727	struct snd_opti93x *codec;
1728#elif defined(CS4231)
1729	struct snd_cs4231 *codec;
1730	struct snd_timer *timer;
1731#else
1732	struct snd_ad1848 *codec;
1733#endif
1734	struct snd_pcm *pcm;
1735	struct snd_rawmidi *rmidi;
1736	struct snd_hwdep *synth;
1737
1738	if (! chip->res_mc_base &&
1739	    (chip->res_mc_base = request_region(chip->mc_base, chip->mc_base_size,
1740						"OPTi9xx MC")) == NULL)
1741		return -ENOMEM;
1742
1743	chip->wss_base = port;
1744	chip->fm_port = fm_port;
1745	chip->mpu_port = mpu_port;
1746	chip->irq = irq;
1747	chip->mpu_irq = mpu_irq;
1748	chip->dma1 = dma1;
1749#if defined(CS4231) || defined(OPTi93X)
1750	chip->dma2 = dma2;
1751#endif
1752
1753	if (chip->wss_base == SNDRV_AUTO_PORT) {
1754		if ((chip->wss_base = snd_legacy_find_free_ioport(possible_ports, 4)) < 0) {
1755			snd_printk("unable to find a free WSS port\n");
1756			return -EBUSY;
1757		}
1758	}
1759	if ((error = snd_opti9xx_configure(chip)))
1760		return error;
1761
1762#if defined(OPTi93X)
1763	if ((error = snd_opti93x_create(card, chip, chip->dma1, chip->dma2, &codec)))
1764		return error;
1765	if ((error = snd_opti93x_pcm(codec, 0, &pcm)) < 0)
1766		return error;
1767	if ((error = snd_opti93x_mixer(codec)) < 0)
1768		return error;
1769#elif defined(CS4231)
1770	if ((error = snd_cs4231_create(card, chip->wss_base + 4, -1,
1771				       chip->irq, chip->dma1, chip->dma2,
1772				       CS4231_HW_DETECT,
1773				       0,
1774				       &codec)) < 0)
1775		return error;
1776	if ((error = snd_cs4231_pcm(codec, 0, &pcm)) < 0)
1777		return error;
1778	if ((error = snd_cs4231_mixer(codec)) < 0)
1779		return error;
1780	if ((error = snd_cs4231_timer(codec, 0, &timer)) < 0)
1781		return error;
1782#else
1783	if ((error = snd_ad1848_create(card, chip->wss_base + 4,
1784				       chip->irq, chip->dma1,
1785				       AD1848_HW_DETECT, &codec)) < 0)
1786		return error;
1787	if ((error = snd_ad1848_pcm(codec, 0, &pcm)) < 0)
1788		return error;
1789	if ((error = snd_ad1848_mixer(codec)) < 0)
1790		return error;
1791#endif
1792	strcpy(card->driver, chip->name);
1793	sprintf(card->shortname, "OPTi %s", card->driver);
1794#if defined(CS4231) || defined(OPTi93X)
1795	sprintf(card->longname, "%s, %s at 0x%lx, irq %d, dma %d&%d",
1796		card->shortname, pcm->name, chip->wss_base + 4,
1797		chip->irq, chip->dma1, chip->dma2);
1798#else
1799	sprintf(card->longname, "%s, %s at 0x%lx, irq %d, dma %d",
1800		card->shortname, pcm->name, chip->wss_base + 4,
1801		chip->irq, chip->dma1);
1802#endif	/* CS4231 || OPTi93X */
1803
1804	if (chip->mpu_port <= 0 || chip->mpu_port == SNDRV_AUTO_PORT)
1805		rmidi = NULL;
1806	else
1807		if ((error = snd_mpu401_uart_new(card, 0, MPU401_HW_MPU401,
1808				chip->mpu_port, 0, chip->mpu_irq, IRQF_DISABLED,
1809				&rmidi)))
1810			snd_printk(KERN_WARNING "no MPU-401 device at 0x%lx?\n",
1811				   chip->mpu_port);
1812
1813	if (chip->fm_port > 0 && chip->fm_port != SNDRV_AUTO_PORT) {
1814		struct snd_opl3 *opl3 = NULL;
1815#ifndef OPTi93X
1816		if (chip->hardware == OPTi9XX_HW_82C928 ||
1817		    chip->hardware == OPTi9XX_HW_82C929 ||
1818		    chip->hardware == OPTi9XX_HW_82C924) {
1819			struct snd_opl4 *opl4;
1820			/* assume we have an OPL4 */
1821			snd_opti9xx_write_mask(chip, OPTi9XX_MC_REG(2),
1822					       0x20, 0x20);
1823			if (snd_opl4_create(card,
1824					    chip->fm_port,
1825					    chip->fm_port - 8,
1826					    2, &opl3, &opl4) < 0) {
1827				/* no luck, use OPL3 instead */
1828				snd_opti9xx_write_mask(chip, OPTi9XX_MC_REG(2),
1829						       0x00, 0x20);
1830			}
1831		}
1832#endif	/* !OPTi93X */
1833		if (!opl3 && snd_opl3_create(card,
1834					     chip->fm_port,
1835					     chip->fm_port + 2,
1836					     OPL3_HW_AUTO, 0, &opl3) < 0) {
1837			snd_printk(KERN_WARNING "no OPL device at 0x%lx-0x%lx\n",
1838				   chip->fm_port, chip->fm_port + 4 - 1);
1839		}
1840		if (opl3) {
1841#ifdef CS4231
1842			const int t1dev = 1;
1843#else
1844			const int t1dev = 0;
1845#endif
1846			if ((error = snd_opl3_timer_new(opl3, t1dev, t1dev+1)) < 0)
1847				return error;
1848			if ((error = snd_opl3_hwdep_new(opl3, 0, 1, &synth)) < 0)
1849				return error;
1850		}
1851	}
1852
1853	return snd_card_register(card);
1854}
1855
1856static struct snd_card *snd_opti9xx_card_new(void)
1857{
1858	struct snd_card *card;
1859
1860	card = snd_card_new(index, id, THIS_MODULE, sizeof(struct snd_opti9xx));
1861	if (! card)
1862		return NULL;
1863	card->private_free = snd_card_opti9xx_free;
1864	return card;
1865}
1866
1867static int __devinit snd_opti9xx_isa_match(struct device *devptr,
1868					   unsigned int dev)
1869{
1870	if (snd_opti9xx_pnp_is_probed)
1871		return 0;
1872	if (isapnp)
1873		return 0;
1874	return 1;
1875}
1876
1877static int __devinit snd_opti9xx_isa_probe(struct device *devptr,
1878					   unsigned int dev)
1879{
1880	struct snd_card *card;
1881	int error;
1882	static long possible_mpu_ports[] = {0x300, 0x310, 0x320, 0x330, -1};
1883#ifdef OPTi93X
1884	static int possible_irqs[] = {5, 9, 10, 11, 7, -1};
1885#else
1886	static int possible_irqs[] = {9, 10, 11, 7, -1};
1887#endif	/* OPTi93X */
1888	static int possible_mpu_irqs[] = {5, 9, 10, 7, -1};
1889	static int possible_dma1s[] = {3, 1, 0, -1};
1890#if defined(CS4231) || defined(OPTi93X)
1891	static int possible_dma2s[][2] = {{1,-1}, {0,-1}, {-1,-1}, {0,-1}};
1892#endif	/* CS4231 || OPTi93X */
1893
1894	if (mpu_port == SNDRV_AUTO_PORT) {
1895		if ((mpu_port = snd_legacy_find_free_ioport(possible_mpu_ports, 2)) < 0) {
1896			snd_printk(KERN_ERR "unable to find a free MPU401 port\n");
1897			return -EBUSY;
1898		}
1899	}
1900	if (irq == SNDRV_AUTO_IRQ) {
1901		if ((irq = snd_legacy_find_free_irq(possible_irqs)) < 0) {
1902			snd_printk(KERN_ERR "unable to find a free IRQ\n");
1903			return -EBUSY;
1904		}
1905	}
1906	if (mpu_irq == SNDRV_AUTO_IRQ) {
1907		if ((mpu_irq = snd_legacy_find_free_irq(possible_mpu_irqs)) < 0) {
1908			snd_printk(KERN_ERR "unable to find a free MPU401 IRQ\n");
1909			return -EBUSY;
1910		}
1911	}
1912	if (dma1 == SNDRV_AUTO_DMA) {
1913		if ((dma1 = snd_legacy_find_free_dma(possible_dma1s)) < 0) {
1914			snd_printk(KERN_ERR "unable to find a free DMA1\n");
1915			return -EBUSY;
1916		}
1917	}
1918#if defined(CS4231) || defined(OPTi93X)
1919	if (dma2 == SNDRV_AUTO_DMA) {
1920		if ((dma2 = snd_legacy_find_free_dma(possible_dma2s[dma1 % 4])) < 0) {
1921			snd_printk("unable to find a free DMA2\n");
1922			return -EBUSY;
1923		}
1924	}
1925#endif
1926
1927	card = snd_opti9xx_card_new();
1928	if (! card)
1929		return -ENOMEM;
1930
1931	if ((error = snd_card_opti9xx_detect(card, card->private_data)) < 0) {
1932		snd_card_free(card);
1933		return error;
1934	}
1935	snd_card_set_dev(card, devptr);
1936	if ((error = snd_opti9xx_probe(card)) < 0) {
1937		snd_card_free(card);
1938		return error;
1939	}
1940	dev_set_drvdata(devptr, card);
1941	return 0;
1942}
1943
1944static int __devexit snd_opti9xx_isa_remove(struct device *devptr,
1945					    unsigned int dev)
1946{
1947	snd_card_free(dev_get_drvdata(devptr));
1948	dev_set_drvdata(devptr, NULL);
1949	return 0;
1950}
1951
1952static struct isa_driver snd_opti9xx_driver = {
1953	.match		= snd_opti9xx_isa_match,
1954	.probe		= snd_opti9xx_isa_probe,
1955	.remove		= __devexit_p(snd_opti9xx_isa_remove),
1956	.driver		= {
1957		.name	= DEV_NAME
1958	},
1959};
1960
1961#ifdef CONFIG_PNP
1962static int __devinit snd_opti9xx_pnp_probe(struct pnp_card_link *pcard,
1963					   const struct pnp_card_device_id *pid)
1964{
1965	struct snd_card *card;
1966	int error, hw;
1967	struct snd_opti9xx *chip;
1968
1969	if (snd_opti9xx_pnp_is_probed)
1970		return -EBUSY;
1971	if (! isapnp)
1972		return -ENODEV;
1973	card = snd_opti9xx_card_new();
1974	if (! card)
1975		return -ENOMEM;
1976	chip = card->private_data;
1977
1978	hw = snd_card_opti9xx_pnp(chip, pcard, pid);
1979	switch (hw) {
1980	case 0x0924:
1981		hw = OPTi9XX_HW_82C924;
1982		break;
1983	case 0x0925:
1984		hw = OPTi9XX_HW_82C925;
1985		break;
1986	case 0x0931:
1987		hw = OPTi9XX_HW_82C931;
1988		break;
1989	default:
1990		snd_card_free(card);
1991		return -ENODEV;
1992	}
1993
1994	if ((error = snd_opti9xx_init(chip, hw))) {
1995		snd_card_free(card);
1996		return error;
1997	}
1998	if (hw <= OPTi9XX_HW_82C930)
1999		chip->mc_base -= 0x80;
2000	snd_card_set_dev(card, &pcard->card->dev);
2001	if ((error = snd_opti9xx_probe(card)) < 0) {
2002		snd_card_free(card);
2003		return error;
2004	}
2005	pnp_set_card_drvdata(pcard, card);
2006	snd_opti9xx_pnp_is_probed = 1;
2007	return 0;
2008}
2009
2010static void __devexit snd_opti9xx_pnp_remove(struct pnp_card_link * pcard)
2011{
2012	snd_card_free(pnp_get_card_drvdata(pcard));
2013	pnp_set_card_drvdata(pcard, NULL);
2014	snd_opti9xx_pnp_is_probed = 0;
2015}
2016
2017static struct pnp_card_driver opti9xx_pnpc_driver = {
2018	.flags		= PNP_DRIVER_RES_DISABLE,
2019	.name		= "opti9xx",
2020	.id_table	= snd_opti9xx_pnpids,
2021	.probe		= snd_opti9xx_pnp_probe,
2022	.remove		= __devexit_p(snd_opti9xx_pnp_remove),
2023};
2024#endif
2025
2026#ifdef OPTi93X
2027#define CHIP_NAME	"82C93x"
2028#else
2029#define CHIP_NAME	"82C92x"
2030#endif
2031
2032static int __init alsa_card_opti9xx_init(void)
2033{
2034#ifdef CONFIG_PNP
2035	pnp_register_card_driver(&opti9xx_pnpc_driver);
2036	if (snd_opti9xx_pnp_is_probed)
2037		return 0;
2038#endif
2039	return isa_register_driver(&snd_opti9xx_driver, 1);
2040}
2041
2042static void __exit alsa_card_opti9xx_exit(void)
2043{
2044	if (!snd_opti9xx_pnp_is_probed) {
2045		isa_unregister_driver(&snd_opti9xx_driver);
2046		return;
2047	}
2048#ifdef CONFIG_PNP
2049	pnp_unregister_card_driver(&opti9xx_pnpc_driver);
2050#endif
2051}
2052
2053module_init(alsa_card_opti9xx_init)
2054module_exit(alsa_card_opti9xx_exit)
2055