1 /*
2  * sound/pss.c
3  *
4  * The low level driver for the Personal Sound System (ECHO ESC614).
5  *
6  *
7  * Copyright (C) by Hannu Savolainen 1993-1997
8  *
9  * OSS/Free for Linux is distributed under the GNU GENERAL PUBLIC LICENSE (GPL)
10  * Version 2 (June 1991). See the "COPYING" file distributed with this software
11  * for more info.
12  *
13  *
14  * Thomas Sailer	ioctl code reworked (vmalloc/vfree removed)
15  * Alan Cox		modularisation, clean up.
16  *
17  * 98-02-21: Vladimir Michl <vladimir.michl@upol.cz>
18  *          Added mixer device for Beethoven ADSP-16 (master volume,
19  *	    bass, treble, synth), only for speakers.
20  *          Fixed bug in pss_write (exchange parameters)
21  *          Fixed config port of SB
22  *          Requested two regions for PSS (PSS mixer, PSS config)
23  *          Modified pss_download_boot
24  *          To probe_pss_mss added test for initialize AD1848
25  * 98-05-28: Vladimir Michl <vladimir.michl@upol.cz>
26  *          Fixed computation of mixer volumes
27  * 04-05-1999: Anthony Barbachan <barbcode@xmen.cis.fordham.edu>
28  *          Added code that allows the user to enable his cdrom and/or
29  *          joystick through the module parameters pss_cdrom_port and
30  *          pss_enable_joystick.  pss_cdrom_port takes a port address as its
31  *          argument.  pss_enable_joystick takes either a 0 or a non-0 as its
32  *          argument.
33  * 04-06-1999: Anthony Barbachan <barbcode@xmen.cis.fordham.edu>
34  *          Separated some code into new functions for easier reuse.
35  *          Cleaned up and streamlined new code.  Added code to allow a user
36  *          to only use this driver for enabling non-sound components
37  *          through the new module parameter pss_no_sound (flag).  Added
38  *          code that would allow a user to decide whether the driver should
39  *          reset the configured hardware settings for the PSS board through
40  *          the module parameter pss_keep_settings (flag).   This flag will
41  *          allow a user to free up resources in use by this card if needbe,
42  *          furthermore it allows him to use this driver to just enable the
43  *          emulations and then be unloaded as it is no longer needed.  Both
44  *          new settings are only available to this driver if compiled as a
45  *          module.  The default settings of all new parameters are set to
46  *          load the driver as it did in previous versions.
47  * 04-07-1999: Anthony Barbachan <barbcode@xmen.cis.fordham.edu>
48  *          Added module parameter pss_firmware to allow the user to tell
49  *          the driver where the fireware file is located.  The default
50  *          setting is the previous hardcoded setting "/etc/sound/pss_synth".
51  * 00-03-03: Christoph Hellwig <chhellwig@infradead.org>
52  *	    Adapted to module_init/module_exit
53  * 11-10-2000: Bartlomiej Zolnierkiewicz <bkz@linux-ide.org>
54  *	    Added __init to probe_pss(), attach_pss() and probe_pss_mpu()
55  * 02-Jan-2001: Chris Rankin
56  *          Specify that this module owns the coprocessor
57  */
58 
59 
60 #include <linux/config.h>
61 #include <linux/init.h>
62 #include <linux/module.h>
63 
64 #include "sound_config.h"
65 #include "sound_firmware.h"
66 
67 #include "ad1848.h"
68 #include "mpu401.h"
69 
70 /*
71  * PSS registers.
72  */
73 #define REG(x)	(devc->base+x)
74 #define	PSS_DATA	0
75 #define	PSS_STATUS	2
76 #define PSS_CONTROL	2
77 #define	PSS_ID		4
78 #define	PSS_IRQACK	4
79 #define	PSS_PIO		0x1a
80 
81 /*
82  * Config registers
83  */
84 #define CONF_PSS	0x10
85 #define CONF_WSS	0x12
86 #define CONF_SB		0x14
87 #define CONF_CDROM	0x16
88 #define CONF_MIDI	0x18
89 
90 /*
91  * Status bits.
92  */
93 #define PSS_FLAG3     0x0800
94 #define PSS_FLAG2     0x0400
95 #define PSS_FLAG1     0x1000
96 #define PSS_FLAG0     0x0800
97 #define PSS_WRITE_EMPTY  0x8000
98 #define PSS_READ_FULL    0x4000
99 
100 /*
101  * WSS registers
102  */
103 #define WSS_INDEX 4
104 #define WSS_DATA 5
105 
106 /*
107  * WSS status bits
108  */
109 #define WSS_INITIALIZING 0x80
110 #define WSS_AUTOCALIBRATION 0x20
111 
112 #define NO_WSS_MIXER	-1
113 
114 #include "coproc.h"
115 
116 #include "pss_boot.h"
117 
118 /* If compiled into kernel, it enable or disable pss mixer */
119 #ifdef CONFIG_PSS_MIXER
120 static unsigned char pss_mixer = 1;
121 #else
122 static unsigned char pss_mixer = 0;
123 #endif
124 
125 
126 typedef struct pss_mixerdata {
127 	unsigned int volume_l;
128 	unsigned int volume_r;
129 	unsigned int bass;
130 	unsigned int treble;
131 	unsigned int synth;
132 } pss_mixerdata;
133 
134 typedef struct pss_confdata {
135 	int             base;
136 	int             irq;
137 	int             dma;
138 	int            *osp;
139 	pss_mixerdata   mixer;
140 	int             ad_mixer_dev;
141 } pss_confdata;
142 
143 static pss_confdata pss_data;
144 static pss_confdata *devc = &pss_data;
145 
146 static int      pss_initialized = 0;
147 static int      nonstandard_microcode = 0;
148 static int	pss_cdrom_port = -1;	/* Parameter for the PSS cdrom port */
149 static int	pss_enable_joystick = 0;/* Parameter for enabling the joystick */
150 
pss_write(pss_confdata * devc,int data)151 static void pss_write(pss_confdata *devc, int data)
152 {
153 	int i, limit;
154 
155 	limit = jiffies + HZ/10;	/* The timeout is 0.1 seconds */
156 	/*
157 	 * Note! the i<5000000 is an emergency exit. The dsp_command() is sometimes
158 	 * called while interrupts are disabled. This means that the timer is
159 	 * disabled also. However the timeout situation is a abnormal condition.
160 	 * Normally the DSP should be ready to accept commands after just couple of
161 	 * loops.
162 	 */
163 
164 	for (i = 0; i < 5000000 && time_before(jiffies, limit); i++)
165  	{
166  		if (inw(REG(PSS_STATUS)) & PSS_WRITE_EMPTY)
167  		{
168  			outw(data, REG(PSS_DATA));
169  			return;
170  		}
171  	}
172  	printk(KERN_WARNING "PSS: DSP Command (%04x) Timeout.\n", data);
173 }
174 
probe_pss(struct address_info * hw_config)175 int __init probe_pss(struct address_info *hw_config)
176 {
177 	unsigned short id;
178 	int irq, dma;
179 
180 	devc->base = hw_config->io_base;
181 	irq = devc->irq = hw_config->irq;
182 	dma = devc->dma = hw_config->dma;
183 	devc->osp = hw_config->osp;
184 
185 	if (devc->base != 0x220 && devc->base != 0x240)
186 		if (devc->base != 0x230 && devc->base != 0x250)		/* Some cards use these */
187 			return 0;
188 
189 	if (check_region(devc->base, 0x19 /*16*/)) {
190 		printk(KERN_ERR "PSS: I/O port conflict\n");
191 		return 0;
192 	}
193 	id = inw(REG(PSS_ID));
194 	if ((id >> 8) != 'E') {
195 		printk(KERN_ERR "No PSS signature detected at 0x%x (0x%x)\n",  devc->base,  id);
196 		return 0;
197 	}
198 	return 1;
199 }
200 
set_irq(pss_confdata * devc,int dev,int irq)201 static int set_irq(pss_confdata * devc, int dev, int irq)
202 {
203 	static unsigned short irq_bits[16] =
204 	{
205 		0x0000, 0x0000, 0x0000, 0x0008,
206 		0x0000, 0x0010, 0x0000, 0x0018,
207 		0x0000, 0x0020, 0x0028, 0x0030,
208 		0x0038, 0x0000, 0x0000, 0x0000
209 	};
210 
211 	unsigned short  tmp, bits;
212 
213 	if (irq < 0 || irq > 15)
214 		return 0;
215 
216 	tmp = inw(REG(dev)) & ~0x38;	/* Load confreg, mask IRQ bits out */
217 
218 	if ((bits = irq_bits[irq]) == 0 && irq != 0)
219 	{
220 		printk(KERN_ERR "PSS: Invalid IRQ %d\n", irq);
221 		return 0;
222 	}
223 	outw(tmp | bits, REG(dev));
224 	return 1;
225 }
226 
set_io_base(pss_confdata * devc,int dev,int base)227 static int set_io_base(pss_confdata * devc, int dev, int base)
228 {
229 	unsigned short  tmp = inw(REG(dev)) & 0x003f;
230 	unsigned short  bits = (base & 0x0ffc) << 4;
231 
232 	outw(bits | tmp, REG(dev));
233 
234 	return 1;
235 }
236 
set_dma(pss_confdata * devc,int dev,int dma)237 static int set_dma(pss_confdata * devc, int dev, int dma)
238 {
239 	static unsigned short dma_bits[8] =
240 	{
241 		0x0001, 0x0002, 0x0000, 0x0003,
242 		0x0000, 0x0005, 0x0006, 0x0007
243 	};
244 
245 	unsigned short  tmp, bits;
246 
247 	if (dma < 0 || dma > 7)
248 		return 0;
249 
250 	tmp = inw(REG(dev)) & ~0x07;	/* Load confreg, mask DMA bits out */
251 
252 	if ((bits = dma_bits[dma]) == 0 && dma != 4)
253 	{
254 		  printk(KERN_ERR "PSS: Invalid DMA %d\n", dma);
255 		  return 0;
256 	}
257 	outw(tmp | bits, REG(dev));
258 	return 1;
259 }
260 
pss_reset_dsp(pss_confdata * devc)261 static int pss_reset_dsp(pss_confdata * devc)
262 {
263 	unsigned long   i, limit = jiffies + HZ/10;
264 
265 	outw(0x2000, REG(PSS_CONTROL));
266 	for (i = 0; i < 32768 && (limit-jiffies >= 0); i++)
267 		inw(REG(PSS_CONTROL));
268 	outw(0x0000, REG(PSS_CONTROL));
269 	return 1;
270 }
271 
pss_put_dspword(pss_confdata * devc,unsigned short word)272 static int pss_put_dspword(pss_confdata * devc, unsigned short word)
273 {
274 	int i, val;
275 
276 	for (i = 0; i < 327680; i++)
277 	{
278 		val = inw(REG(PSS_STATUS));
279 		if (val & PSS_WRITE_EMPTY)
280 		{
281 			outw(word, REG(PSS_DATA));
282 			return 1;
283 		}
284 	}
285 	return 0;
286 }
287 
pss_get_dspword(pss_confdata * devc,unsigned short * word)288 static int pss_get_dspword(pss_confdata * devc, unsigned short *word)
289 {
290 	int i, val;
291 
292 	for (i = 0; i < 327680; i++)
293 	{
294 		val = inw(REG(PSS_STATUS));
295 		if (val & PSS_READ_FULL)
296 		{
297 			*word = inw(REG(PSS_DATA));
298 			return 1;
299 		}
300 	}
301 	return 0;
302 }
303 
pss_download_boot(pss_confdata * devc,unsigned char * block,int size,int flags)304 static int pss_download_boot(pss_confdata * devc, unsigned char *block, int size, int flags)
305 {
306 	int i, limit, val, count;
307 
308 	if (flags & CPF_FIRST)
309 	{
310 /*_____ Warn DSP software that a boot is coming */
311 		outw(0x00fe, REG(PSS_DATA));
312 
313 		limit = jiffies + HZ/10;
314 		for (i = 0; i < 32768 && time_before(jiffies, limit); i++)
315 			if (inw(REG(PSS_DATA)) == 0x5500)
316 				break;
317 
318 		outw(*block++, REG(PSS_DATA));
319 		pss_reset_dsp(devc);
320 	}
321 	count = 1;
322 	while ((flags&CPF_LAST) || count<size )
323 	{
324 		int j;
325 
326 		for (j = 0; j < 327670; j++)
327 		{
328 /*_____ Wait for BG to appear */
329 			if (inw(REG(PSS_STATUS)) & PSS_FLAG3)
330 				break;
331 		}
332 
333 		if (j == 327670)
334 		{
335 			/* It's ok we timed out when the file was empty */
336 			if (count >= size && flags & CPF_LAST)
337 				break;
338 			else
339 			{
340 				printk("\n");
341 				printk(KERN_ERR "PSS: Download timeout problems, byte %d=%d\n", count, size);
342 				return 0;
343 			}
344 		}
345 /*_____ Send the next byte */
346 		if (count >= size)
347 		{
348 			/* If not data in block send 0xffff */
349 			outw (0xffff, REG (PSS_DATA));
350 		}
351 		else
352 		{
353 			/*_____ Send the next byte */
354 			outw (*block++, REG (PSS_DATA));
355 		};
356 		count++;
357 	}
358 
359 	if (flags & CPF_LAST)
360 	{
361 /*_____ Why */
362 		outw(0, REG(PSS_DATA));
363 
364 		limit = jiffies + HZ/10;
365 		for (i = 0; i < 32768 && (limit - jiffies >= 0); i++)
366 			val = inw(REG(PSS_STATUS));
367 
368 		limit = jiffies + HZ/10;
369 		for (i = 0; i < 32768 && (limit-jiffies >= 0); i++)
370 		{
371 			val = inw(REG(PSS_STATUS));
372 			if (val & 0x4000)
373 				break;
374 		}
375 
376 		/* now read the version */
377 		for (i = 0; i < 32000; i++)
378 		{
379 			val = inw(REG(PSS_STATUS));
380 			if (val & PSS_READ_FULL)
381 				break;
382 		}
383 		if (i == 32000)
384 			return 0;
385 
386 		val = inw(REG(PSS_DATA));
387 		/* printk( "<PSS: microcode version %d.%d loaded>",  val/16,  val % 16); */
388 	}
389 	return 1;
390 }
391 
392 /* Mixer */
set_master_volume(pss_confdata * devc,int left,int right)393 static void set_master_volume(pss_confdata *devc, int left, int right)
394 {
395 	static unsigned char log_scale[101] =  {
396 		0xdb, 0xe0, 0xe3, 0xe5, 0xe7, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xed, 0xee,
397 		0xef, 0xef, 0xf0, 0xf0, 0xf1, 0xf1, 0xf2, 0xf2, 0xf2, 0xf3, 0xf3, 0xf3,
398 		0xf4, 0xf4, 0xf4, 0xf5, 0xf5, 0xf5, 0xf5, 0xf6, 0xf6, 0xf6, 0xf6, 0xf7,
399 		0xf7, 0xf7, 0xf7, 0xf7, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf9, 0xf9, 0xf9,
400 		0xf9, 0xf9, 0xf9, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xfb, 0xfb,
401 		0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc,
402 		0xfc, 0xfc, 0xfc, 0xfc, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd,
403 		0xfd, 0xfd, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
404 		0xfe, 0xfe, 0xff, 0xff, 0xff
405 	};
406 	pss_write(devc, 0x0010);
407 	pss_write(devc, log_scale[left] | 0x0000);
408 	pss_write(devc, 0x0010);
409 	pss_write(devc, log_scale[right] | 0x0100);
410 }
411 
set_synth_volume(pss_confdata * devc,int volume)412 static void set_synth_volume(pss_confdata *devc, int volume)
413 {
414 	int vol = ((0x8000*volume)/100L);
415 	pss_write(devc, 0x0080);
416 	pss_write(devc, vol);
417 	pss_write(devc, 0x0081);
418 	pss_write(devc, vol);
419 }
420 
set_bass(pss_confdata * devc,int level)421 static void set_bass(pss_confdata *devc, int level)
422 {
423 	int vol = (int)(((0xfd - 0xf0) * level)/100L) + 0xf0;
424 	pss_write(devc, 0x0010);
425 	pss_write(devc, vol | 0x0200);
426 };
427 
set_treble(pss_confdata * devc,int level)428 static void set_treble(pss_confdata *devc, int level)
429 {
430 	int vol = (((0xfd - 0xf0) * level)/100L) + 0xf0;
431 	pss_write(devc, 0x0010);
432 	pss_write(devc, vol | 0x0300);
433 };
434 
pss_mixer_reset(pss_confdata * devc)435 static void pss_mixer_reset(pss_confdata *devc)
436 {
437 	set_master_volume(devc, 33, 33);
438 	set_bass(devc, 50);
439 	set_treble(devc, 50);
440 	set_synth_volume(devc, 30);
441 	pss_write (devc, 0x0010);
442 	pss_write (devc, 0x0800 | 0xce);	/* Stereo */
443 
444 	if(pss_mixer)
445 	{
446 		devc->mixer.volume_l = devc->mixer.volume_r = 33;
447 		devc->mixer.bass = 50;
448 		devc->mixer.treble = 50;
449 		devc->mixer.synth = 30;
450 	}
451 }
452 
set_volume_mono(caddr_t p,int * aleft)453 static int set_volume_mono(caddr_t p, int *aleft)
454 {
455 	int left;
456 	unsigned volume;
457 	if (get_user(volume, (unsigned *)p))
458 		return -EFAULT;
459 
460 	left = volume & 0xff;
461 	if (left > 100)
462 		left = 100;
463 	*aleft = left;
464 	return 0;
465 }
466 
set_volume_stereo(caddr_t p,int * aleft,int * aright)467 static int set_volume_stereo(caddr_t p, int *aleft, int *aright)
468 {
469 	int left, right;
470 	unsigned volume;
471 	if (get_user(volume, (unsigned *)p))
472 		return -EFAULT;
473 
474 	left = volume & 0xff;
475 	if (left > 100)
476 		left = 100;
477 	right = (volume >> 8) & 0xff;
478 	if (right > 100)
479 		right = 100;
480 	*aleft = left;
481 	*aright = right;
482 	return 0;
483 }
484 
ret_vol_mono(int left)485 static int ret_vol_mono(int left)
486 {
487 	return ((left << 8) | left);
488 }
489 
ret_vol_stereo(int left,int right)490 static int ret_vol_stereo(int left, int right)
491 {
492 	return ((right << 8) | left);
493 }
494 
call_ad_mixer(pss_confdata * devc,unsigned int cmd,caddr_t arg)495 static int call_ad_mixer(pss_confdata *devc,unsigned int cmd, caddr_t arg)
496 {
497 	if (devc->ad_mixer_dev != NO_WSS_MIXER)
498 		return mixer_devs[devc->ad_mixer_dev]->ioctl(devc->ad_mixer_dev, cmd, arg);
499 	else
500 		return -EINVAL;
501 }
502 
pss_mixer_ioctl(int dev,unsigned int cmd,caddr_t arg)503 static int pss_mixer_ioctl (int dev, unsigned int cmd, caddr_t arg)
504 {
505 	pss_confdata *devc = mixer_devs[dev]->devc;
506 	int cmdf = cmd & 0xff;
507 
508 	if ((cmdf != SOUND_MIXER_VOLUME) && (cmdf != SOUND_MIXER_BASS) &&
509 		(cmdf != SOUND_MIXER_TREBLE) && (cmdf != SOUND_MIXER_SYNTH) &&
510 		(cmdf != SOUND_MIXER_DEVMASK) && (cmdf != SOUND_MIXER_STEREODEVS) &&
511 		(cmdf != SOUND_MIXER_RECMASK) && (cmdf != SOUND_MIXER_CAPS) &&
512 		(cmdf != SOUND_MIXER_RECSRC))
513 	{
514 		return call_ad_mixer(devc, cmd, arg);
515 	}
516 
517 	if (((cmd >> 8) & 0xff) != 'M')
518 		return -EINVAL;
519 
520 	if (_SIOC_DIR (cmd) & _SIOC_WRITE)
521 	{
522 		switch (cmdf)
523 		{
524 			case SOUND_MIXER_RECSRC:
525 				if (devc->ad_mixer_dev != NO_WSS_MIXER)
526 					return call_ad_mixer(devc, cmd, arg);
527 				else
528 				{
529 					int v;
530 					if (get_user(v, (int *)arg))
531 						return -EFAULT;
532 					if (v != 0)
533 						return -EINVAL;
534 					return 0;
535 				}
536 			case SOUND_MIXER_VOLUME:
537 				if (set_volume_stereo(arg,
538 					&devc->mixer.volume_l,
539 					&devc->mixer.volume_r))
540 					return -EFAULT;
541 				set_master_volume(devc, devc->mixer.volume_l,
542 					devc->mixer.volume_r);
543 				return ret_vol_stereo(devc->mixer.volume_l,
544 					devc->mixer.volume_r);
545 
546 			case SOUND_MIXER_BASS:
547 				if (set_volume_mono(arg, &devc->mixer.bass))
548 					return -EFAULT;
549 				set_bass(devc, devc->mixer.bass);
550 				return ret_vol_mono(devc->mixer.bass);
551 
552 			case SOUND_MIXER_TREBLE:
553 				if (set_volume_mono(arg, &devc->mixer.treble))
554 					return -EFAULT;
555 				set_treble(devc, devc->mixer.treble);
556 				return ret_vol_mono(devc->mixer.treble);
557 
558 			case SOUND_MIXER_SYNTH:
559 				if (set_volume_mono(arg, &devc->mixer.synth))
560 					return -EFAULT;
561 				set_synth_volume(devc, devc->mixer.synth);
562 				return ret_vol_mono(devc->mixer.synth);
563 
564 			default:
565 				return -EINVAL;
566 		}
567 	}
568 	else
569 	{
570 		int val, and_mask = 0, or_mask = 0;
571 		/*
572 		 * Return parameters
573 		 */
574 		switch (cmdf)
575 		{
576 			case SOUND_MIXER_DEVMASK:
577 				if (call_ad_mixer(devc, cmd, arg) == -EINVAL)
578 					break;
579 				and_mask = ~0;
580 				or_mask = SOUND_MASK_VOLUME | SOUND_MASK_BASS | SOUND_MASK_TREBLE | SOUND_MASK_SYNTH;
581 				break;
582 
583 			case SOUND_MIXER_STEREODEVS:
584 				if (call_ad_mixer(devc, cmd, arg) == -EINVAL)
585 					break;
586 				and_mask = ~0;
587 				or_mask = SOUND_MASK_VOLUME;
588 				break;
589 
590 			case SOUND_MIXER_RECMASK:
591 				if (devc->ad_mixer_dev != NO_WSS_MIXER)
592 					return call_ad_mixer(devc, cmd, arg);
593 				break;
594 
595 			case SOUND_MIXER_CAPS:
596 				if (devc->ad_mixer_dev != NO_WSS_MIXER)
597 					return call_ad_mixer(devc, cmd, arg);
598 				or_mask = SOUND_CAP_EXCL_INPUT;
599 				break;
600 
601 			case SOUND_MIXER_RECSRC:
602 				if (devc->ad_mixer_dev != NO_WSS_MIXER)
603 					return call_ad_mixer(devc, cmd, arg);
604 				break;
605 
606 			case SOUND_MIXER_VOLUME:
607 				or_mask =  ret_vol_stereo(devc->mixer.volume_l, devc->mixer.volume_r);
608 				break;
609 
610 			case SOUND_MIXER_BASS:
611 				or_mask =  ret_vol_mono(devc->mixer.bass);
612 				break;
613 
614 			case SOUND_MIXER_TREBLE:
615 				or_mask = ret_vol_mono(devc->mixer.treble);
616 				break;
617 
618 			case SOUND_MIXER_SYNTH:
619 				or_mask = ret_vol_mono(devc->mixer.synth);
620 				break;
621 			default:
622 				return -EINVAL;
623 		}
624 		if (get_user(val, (int *)arg))
625 			return -EFAULT;
626 		val &= and_mask;
627 		val |= or_mask;
628 		if (put_user(val, (int *)arg))
629 			return -EFAULT;
630 		return val;
631 	}
632 }
633 
634 static struct mixer_operations pss_mixer_operations =
635 {
636 	owner:	THIS_MODULE,
637 	id:	"SOUNDPORT",
638 	name:	"PSS-AD1848",
639 	ioctl:	pss_mixer_ioctl
640 };
641 
disable_all_emulations(void)642 void disable_all_emulations(void)
643 {
644 	outw(0x0000, REG(CONF_PSS));	/* 0x0400 enables joystick */
645 	outw(0x0000, REG(CONF_WSS));
646 	outw(0x0000, REG(CONF_SB));
647 	outw(0x0000, REG(CONF_MIDI));
648 	outw(0x0000, REG(CONF_CDROM));
649 }
650 
configure_nonsound_components(void)651 void configure_nonsound_components(void)
652 {
653 	/* Configure Joystick port */
654 
655 	if(pss_enable_joystick)
656 	{
657 		outw(0x0400, REG(CONF_PSS));	/* 0x0400 enables joystick */
658 		printk(KERN_INFO "PSS: joystick enabled.\n");
659 	}
660 	else
661 	{
662 		printk(KERN_INFO "PSS: joystick port not enabled.\n");
663 	}
664 
665 	/* Configure CDROM port */
666 
667 	if(pss_cdrom_port == -1)	/* If cdrom port enablation wasn't requested */
668 	{
669 		printk(KERN_INFO "PSS: CDROM port not enabled.\n");
670 	}
671 	else if(check_region(pss_cdrom_port, 2))
672 	{
673 		printk(KERN_ERR "PSS: CDROM I/O port conflict.\n");
674 	}
675 	else if(!set_io_base(devc, CONF_CDROM, pss_cdrom_port))
676 	{
677 		printk(KERN_ERR "PSS: CDROM I/O port could not be set.\n");
678 	}
679 	else					/* CDROM port successfully configured */
680 	{
681 		printk(KERN_INFO "PSS: CDROM I/O port set to 0x%x.\n", pss_cdrom_port);
682 	}
683 }
684 
attach_pss(struct address_info * hw_config)685 void __init attach_pss(struct address_info *hw_config)
686 {
687 	unsigned short  id;
688 	char tmp[100];
689 
690 	devc->base = hw_config->io_base;
691 	devc->irq = hw_config->irq;
692 	devc->dma = hw_config->dma;
693 	devc->osp = hw_config->osp;
694 	devc->ad_mixer_dev = NO_WSS_MIXER;
695 
696 	if (!probe_pss(hw_config))
697 		return;
698 
699 	request_region(hw_config->io_base, 0x10, "PSS mixer, SB emulation");
700 	request_region(hw_config->io_base + 0x10, 0x9, "PSS config");
701 
702 	id = inw(REG(PSS_ID)) & 0x00ff;
703 
704 	/*
705 	 * Disable all emulations. Will be enabled later (if required).
706 	 */
707 
708 	disable_all_emulations();
709 
710 #if YOU_REALLY_WANT_TO_ALLOCATE_THESE_RESOURCES
711 	if (sound_alloc_dma(hw_config->dma, "PSS"))
712 	{
713 		printk("pss.c: Can't allocate DMA channel.\n");
714 		return;
715 	}
716 	if (!set_irq(devc, CONF_PSS, devc->irq))
717 	{
718 		printk("PSS: IRQ allocation error.\n");
719 		return;
720 	}
721 	if (!set_dma(devc, CONF_PSS, devc->dma))
722 	{
723 		printk(KERN_ERR "PSS: DMA allocation error\n");
724 		return;
725 	}
726 #endif
727 
728 	configure_nonsound_components();
729 	pss_initialized = 1;
730 	sprintf(tmp, "ECHO-PSS  Rev. %d", id);
731 	conf_printf(tmp, hw_config);
732 }
733 
probe_pss_mpu(struct address_info * hw_config)734 int __init probe_pss_mpu(struct address_info *hw_config)
735 {
736 	int timeout;
737 
738 	if (!pss_initialized)
739 		return 0;
740 
741 	if (check_region(hw_config->io_base, 2))
742 	{
743 		printk(KERN_ERR "PSS: MPU I/O port conflict\n");
744 		return 0;
745 	}
746 	if (!set_io_base(devc, CONF_MIDI, hw_config->io_base))
747 	{
748 		  printk(KERN_ERR "PSS: MIDI base could not be set.\n");
749 		  return 0;
750 	}
751 	if (!set_irq(devc, CONF_MIDI, hw_config->irq))
752 	{
753 		  printk(KERN_ERR "PSS: MIDI IRQ allocation error.\n");
754 		  return 0;
755 	}
756 	if (!pss_synthLen)
757 	{
758 		printk(KERN_ERR "PSS: Can't enable MPU. MIDI synth microcode not available.\n");
759 		return 0;
760 	}
761 	if (!pss_download_boot(devc, pss_synth, pss_synthLen, CPF_FIRST | CPF_LAST))
762 	{
763 		printk(KERN_ERR "PSS: Unable to load MIDI synth microcode to DSP.\n");
764 		return 0;
765 	}
766 
767 	/*
768 	 * Finally wait until the DSP algorithm has initialized itself and
769 	 * deactivates receive interrupt.
770 	 */
771 
772 	for (timeout = 900000; timeout > 0; timeout--)
773 	{
774 		if ((inb(hw_config->io_base + 1) & 0x80) == 0)	/* Input data avail */
775 			inb(hw_config->io_base);	/* Discard it */
776 		else
777 			break;	/* No more input */
778 	}
779 
780 	return probe_mpu401(hw_config);
781 }
782 
pss_coproc_open(void * dev_info,int sub_device)783 static int pss_coproc_open(void *dev_info, int sub_device)
784 {
785 	switch (sub_device)
786 	{
787 		case COPR_MIDI:
788 			if (pss_synthLen == 0)
789 			{
790 				printk(KERN_ERR "PSS: MIDI synth microcode not available.\n");
791 				return -EIO;
792 			}
793 			if (nonstandard_microcode)
794 				if (!pss_download_boot(devc, pss_synth, pss_synthLen, CPF_FIRST | CPF_LAST))
795 			{
796 				printk(KERN_ERR "PSS: Unable to load MIDI synth microcode to DSP.\n");
797 				return -EIO;
798 			}
799 			nonstandard_microcode = 0;
800 			break;
801 
802 		default:
803 			break;
804 	}
805 	return 0;
806 }
807 
pss_coproc_close(void * dev_info,int sub_device)808 static void pss_coproc_close(void *dev_info, int sub_device)
809 {
810 	return;
811 }
812 
pss_coproc_reset(void * dev_info)813 static void pss_coproc_reset(void *dev_info)
814 {
815 	if (pss_synthLen)
816 		if (!pss_download_boot(devc, pss_synth, pss_synthLen, CPF_FIRST | CPF_LAST))
817 		{
818 			printk(KERN_ERR "PSS: Unable to load MIDI synth microcode to DSP.\n");
819 		}
820 	nonstandard_microcode = 0;
821 }
822 
download_boot_block(void * dev_info,copr_buffer * buf)823 static int download_boot_block(void *dev_info, copr_buffer * buf)
824 {
825 	if (buf->len <= 0 || buf->len > sizeof(buf->data))
826 		return -EINVAL;
827 
828 	if (!pss_download_boot(devc, buf->data, buf->len, buf->flags))
829 	{
830 		printk(KERN_ERR "PSS: Unable to load microcode block to DSP.\n");
831 		return -EIO;
832 	}
833 	nonstandard_microcode = 1;	/* The MIDI microcode has been overwritten */
834 	return 0;
835 }
836 
pss_coproc_ioctl(void * dev_info,unsigned int cmd,caddr_t arg,int local)837 static int pss_coproc_ioctl(void *dev_info, unsigned int cmd, caddr_t arg, int local)
838 {
839 	copr_buffer *buf;
840 	copr_msg *mbuf;
841 	copr_debug_buf dbuf;
842 	unsigned short tmp;
843 	unsigned long flags;
844 	unsigned short *data;
845 	int i, err;
846 	/* printk( "PSS coproc ioctl %x %x %d\n",  cmd,  arg,  local); */
847 
848 	switch (cmd)
849 	{
850 		case SNDCTL_COPR_RESET:
851 			pss_coproc_reset(dev_info);
852 			return 0;
853 
854 		case SNDCTL_COPR_LOAD:
855 			buf = (copr_buffer *) vmalloc(sizeof(copr_buffer));
856 			if (buf == NULL)
857 				return -ENOSPC;
858 			if (copy_from_user(buf, arg, sizeof(copr_buffer))) {
859 				vfree(buf);
860 				return -EFAULT;
861 			}
862 			err = download_boot_block(dev_info, buf);
863 			vfree(buf);
864 			return err;
865 
866 		case SNDCTL_COPR_SENDMSG:
867 			mbuf = (copr_msg *)vmalloc(sizeof(copr_msg));
868 			if (mbuf == NULL)
869 				return -ENOSPC;
870 			if (copy_from_user(mbuf, arg, sizeof(copr_msg))) {
871 				vfree(mbuf);
872 				return -EFAULT;
873 			}
874 			data = (unsigned short *)(mbuf->data);
875 			save_flags(flags);
876 			cli();
877 			for (i = 0; i < mbuf->len; i++) {
878 				if (!pss_put_dspword(devc, *data++)) {
879 					restore_flags(flags);
880 					mbuf->len = i;	/* feed back number of WORDs sent */
881 					err = copy_to_user(arg, mbuf, sizeof(copr_msg));
882 					vfree(mbuf);
883 					return err ? -EFAULT : -EIO;
884 				}
885 			}
886 			restore_flags(flags);
887 			vfree(mbuf);
888 			return 0;
889 
890 		case SNDCTL_COPR_RCVMSG:
891 			err = 0;
892 			mbuf = (copr_msg *)vmalloc(sizeof(copr_msg));
893 			if (mbuf == NULL)
894 				return -ENOSPC;
895 			data = (unsigned short *)mbuf->data;
896 			save_flags(flags);
897 			cli();
898 			for (i = 0; i < sizeof(mbuf->data)/sizeof(unsigned short); i++) {
899 				mbuf->len = i;	/* feed back number of WORDs read */
900 				if (!pss_get_dspword(devc, data++)) {
901 					if (i == 0)
902 						err = -EIO;
903 					break;
904 				}
905 			}
906 			restore_flags(flags);
907 			if (copy_to_user(arg, mbuf, sizeof(copr_msg)))
908 				err = -EFAULT;
909 			vfree(mbuf);
910 			return err;
911 
912 		case SNDCTL_COPR_RDATA:
913 			if (copy_from_user(&dbuf, arg, sizeof(dbuf)))
914 				return -EFAULT;
915 			save_flags(flags);
916 			cli();
917 			if (!pss_put_dspword(devc, 0x00d0)) {
918 				restore_flags(flags);
919 				return -EIO;
920 			}
921 			if (!pss_put_dspword(devc, (unsigned short)(dbuf.parm1 & 0xffff))) {
922 				restore_flags(flags);
923 				return -EIO;
924 			}
925 			if (!pss_get_dspword(devc, &tmp)) {
926 				restore_flags(flags);
927 				return -EIO;
928 			}
929 			dbuf.parm1 = tmp;
930 			restore_flags(flags);
931 			if (copy_to_user(arg, &dbuf, sizeof(dbuf)))
932 				return -EFAULT;
933 			return 0;
934 
935 		case SNDCTL_COPR_WDATA:
936 			if (copy_from_user(&dbuf, arg, sizeof(dbuf)))
937 				return -EFAULT;
938 			save_flags(flags);
939 			cli();
940 			if (!pss_put_dspword(devc, 0x00d1)) {
941 				restore_flags(flags);
942 				return -EIO;
943 			}
944 			if (!pss_put_dspword(devc, (unsigned short) (dbuf.parm1 & 0xffff))) {
945 				restore_flags(flags);
946 				return -EIO;
947 			}
948 			tmp = (unsigned int)dbuf.parm2 & 0xffff;
949 			if (!pss_put_dspword(devc, tmp)) {
950 				restore_flags(flags);
951 				return -EIO;
952 			}
953 			restore_flags(flags);
954 			return 0;
955 
956 		case SNDCTL_COPR_WCODE:
957 			if (copy_from_user(&dbuf, arg, sizeof(dbuf)))
958 				return -EFAULT;
959 			save_flags(flags);
960 			cli();
961 			if (!pss_put_dspword(devc, 0x00d3)) {
962 				restore_flags(flags);
963 				return -EIO;
964 			}
965 			if (!pss_put_dspword(devc, (unsigned short)(dbuf.parm1 & 0xffff))) {
966 				restore_flags(flags);
967 				return -EIO;
968 			}
969 			tmp = (unsigned int)dbuf.parm2 & 0x00ff;
970 			if (!pss_put_dspword(devc, tmp)) {
971 				restore_flags(flags);
972 				return -EIO;
973 			}
974 			tmp = ((unsigned int)dbuf.parm2 >> 8) & 0xffff;
975 			if (!pss_put_dspword(devc, tmp)) {
976 				restore_flags(flags);
977 				return -EIO;
978 			}
979 			restore_flags(flags);
980 			return 0;
981 
982 		case SNDCTL_COPR_RCODE:
983 			if (copy_from_user(&dbuf, arg, sizeof(dbuf)))
984 				return -EFAULT;
985 			save_flags(flags);
986 			cli();
987 			if (!pss_put_dspword(devc, 0x00d2)) {
988 				restore_flags(flags);
989 				return -EIO;
990 			}
991 			if (!pss_put_dspword(devc, (unsigned short)(dbuf.parm1 & 0xffff))) {
992 				restore_flags(flags);
993 				return -EIO;
994 			}
995 			if (!pss_get_dspword(devc, &tmp)) { /* Read MSB */
996 				restore_flags(flags);
997 				return -EIO;
998 			}
999 			dbuf.parm1 = tmp << 8;
1000 			if (!pss_get_dspword(devc, &tmp)) { /* Read LSB */
1001 				restore_flags(flags);
1002 				return -EIO;
1003 			}
1004 			dbuf.parm1 |= tmp & 0x00ff;
1005 			restore_flags(flags);
1006 			if (copy_to_user(arg, &dbuf, sizeof(dbuf)))
1007 				return -EFAULT;
1008 			return 0;
1009 
1010 		default:
1011 			return -EINVAL;
1012 	}
1013 	return -EINVAL;
1014 }
1015 
1016 static coproc_operations pss_coproc_operations =
1017 {
1018 	"ADSP-2115",
1019 	THIS_MODULE,
1020 	pss_coproc_open,
1021 	pss_coproc_close,
1022 	pss_coproc_ioctl,
1023 	pss_coproc_reset,
1024 	&pss_data
1025 };
1026 
attach_pss_mpu(struct address_info * hw_config)1027 static void __init attach_pss_mpu(struct address_info *hw_config)
1028 {
1029 	attach_mpu401(hw_config, THIS_MODULE);	/* Slot 1 */
1030 	if (hw_config->slots[1] != -1)	/* The MPU driver installed itself */
1031 		midi_devs[hw_config->slots[1]]->coproc = &pss_coproc_operations;
1032 }
1033 
probe_pss_mss(struct address_info * hw_config)1034 static int __init probe_pss_mss(struct address_info *hw_config)
1035 {
1036 	volatile int timeout;
1037 
1038 	if (!pss_initialized)
1039 		return 0;
1040 
1041 	if (check_region(hw_config->io_base, 8))
1042 	{
1043 		  printk(KERN_ERR "PSS: WSS I/O port conflicts.\n");
1044 		  return 0;
1045 	}
1046 	if (!set_io_base(devc, CONF_WSS, hw_config->io_base))
1047 	{
1048 		printk("PSS: WSS base not settable.\n");
1049 		return 0;
1050 	}
1051 	if (!set_irq(devc, CONF_WSS, hw_config->irq))
1052 	{
1053 		printk("PSS: WSS IRQ allocation error.\n");
1054 		return 0;
1055 	}
1056 	if (!set_dma(devc, CONF_WSS, hw_config->dma))
1057 	{
1058 		printk(KERN_ERR "PSS: WSS DMA allocation error\n");
1059 		return 0;
1060 	}
1061 	/*
1062 	 * For some reason the card returns 0xff in the WSS status register
1063 	 * immediately after boot. Probably MIDI+SB emulation algorithm
1064 	 * downloaded to the ADSP2115 spends some time initializing the card.
1065 	 * Let's try to wait until it finishes this task.
1066 	 */
1067 	for (timeout = 0; timeout < 100000 && (inb(hw_config->io_base + WSS_INDEX) &
1068 	  WSS_INITIALIZING); timeout++)
1069 		;
1070 
1071 	outb((0x0b), hw_config->io_base + WSS_INDEX);	/* Required by some cards */
1072 
1073 	for (timeout = 0; (inb(hw_config->io_base + WSS_DATA) & WSS_AUTOCALIBRATION) &&
1074 	  (timeout < 100000); timeout++)
1075 		;
1076 
1077 	return probe_ms_sound(hw_config);
1078 }
1079 
attach_pss_mss(struct address_info * hw_config)1080 static void __init attach_pss_mss(struct address_info *hw_config)
1081 {
1082 	int        my_mix = -999;	/* gcc shut up */
1083 
1084 	devc->ad_mixer_dev = NO_WSS_MIXER;
1085 	if (pss_mixer)
1086 	{
1087 		if ((my_mix = sound_install_mixer (MIXER_DRIVER_VERSION,
1088 			"PSS-SPEAKERS and AD1848 (through MSS audio codec)",
1089 			&pss_mixer_operations,
1090 			sizeof (struct mixer_operations),
1091 			devc)) < 0)
1092 		{
1093 			printk(KERN_ERR "Could not install PSS mixer\n");
1094 			return;
1095 		}
1096 	}
1097 	pss_mixer_reset(devc);
1098 	attach_ms_sound(hw_config, THIS_MODULE);	/* Slot 0 */
1099 
1100 	if (hw_config->slots[0] != -1)
1101 	{
1102 		/* The MSS driver installed itself */
1103 		audio_devs[hw_config->slots[0]]->coproc = &pss_coproc_operations;
1104 		if (pss_mixer && (num_mixers == (my_mix + 2)))
1105 		{
1106 			/* The MSS mixer installed */
1107 			devc->ad_mixer_dev = audio_devs[hw_config->slots[0]]->mixer_dev;
1108 		}
1109 	}
1110 }
1111 
unload_pss(struct address_info * hw_config)1112 static inline void __exit unload_pss(struct address_info *hw_config)
1113 {
1114 	release_region(hw_config->io_base, 0x10);
1115 	release_region(hw_config->io_base+0x10, 0x9);
1116 }
1117 
unload_pss_mpu(struct address_info * hw_config)1118 static inline void __exit unload_pss_mpu(struct address_info *hw_config)
1119 {
1120 	unload_mpu401(hw_config);
1121 }
1122 
unload_pss_mss(struct address_info * hw_config)1123 static inline void __exit unload_pss_mss(struct address_info *hw_config)
1124 {
1125 	unload_ms_sound(hw_config);
1126 }
1127 
1128 
1129 static struct address_info cfg;
1130 static struct address_info cfg2;
1131 static struct address_info cfg_mpu;
1132 
1133 static int pss_io __initdata	= -1;
1134 static int mss_io __initdata	= -1;
1135 static int mss_irq __initdata	= -1;
1136 static int mss_dma __initdata	= -1;
1137 static int mpu_io __initdata	= -1;
1138 static int mpu_irq __initdata	= -1;
1139 static int pss_no_sound __initdata = 0;	/* Just configure non-sound components */
1140 static int pss_keep_settings  = 1;	/* Keep hardware settings at module exit */
1141 static char *pss_firmware = "/etc/sound/pss_synth";
1142 
1143 MODULE_PARM(pss_io, "i");
1144 MODULE_PARM_DESC(pss_io, "Set i/o base of PSS card (probably 0x220 or 0x240)");
1145 MODULE_PARM(mss_io, "i");
1146 MODULE_PARM_DESC(mss_io, "Set WSS (audio) i/o base (0x530, 0x604, 0xE80, 0xF40, or other. Address must end in 0 or 4 and must be from 0x100 to 0xFF4)");
1147 MODULE_PARM(mss_irq, "i");
1148 MODULE_PARM_DESC(mss_irq, "Set WSS (audio) IRQ (3, 5, 7, 9, 10, 11, 12)");
1149 MODULE_PARM(mss_dma, "i");
1150 MODULE_PARM_DESC(mss_dma, "Set WSS (audio) DMA (0, 1, 3)");
1151 MODULE_PARM(mpu_io, "i");
1152 MODULE_PARM_DESC(mpu_io, "Set MIDI i/o base (0x330 or other. Address must be on 4 location boundaries and must be from 0x100 to 0xFFC)");
1153 MODULE_PARM(mpu_irq, "i");
1154 MODULE_PARM_DESC(mpu_irq, "Set MIDI IRQ (3, 5, 7, 9, 10, 11, 12)");
1155 MODULE_PARM(pss_cdrom_port, "i");
1156 MODULE_PARM_DESC(pss_cdrom_port, "Set the PSS CDROM port i/o base (0x340 or other)");
1157 MODULE_PARM(pss_enable_joystick, "i");
1158 MODULE_PARM_DESC(pss_enable_joystick, "Enables the PSS joystick port (1 to enable, 0 to disable)");
1159 MODULE_PARM(pss_no_sound, "i");
1160 MODULE_PARM_DESC(pss_no_sound, "Configure sound compoents (0 - no, 1 - yes)");
1161 MODULE_PARM(pss_keep_settings, "i");
1162 MODULE_PARM_DESC(pss_keep_settings, "Keep hardware setting at driver unloading (0 - no, 1 - yes)");
1163 MODULE_PARM(pss_firmware, "s");
1164 MODULE_PARM_DESC(pss_firmware, "Location of the firmware file (default - /etc/sound/pss_synth)");
1165 MODULE_PARM(pss_mixer, "b");
1166 MODULE_PARM_DESC(pss_mixer, "Enable (1) or disable (0) PSS mixer (controlling of output volume, bass, treble, synth volume). The mixer is not available on all PSS cards.");
1167 MODULE_AUTHOR("Hannu Savolainen, Vladimir Michl");
1168 MODULE_DESCRIPTION("Module for PSS sound cards (based on AD1848, ADSP-2115 and ESC614). This module includes control of output amplifier and synth volume of the Beethoven ADSP-16 card (this may work with other PSS cards).");
1169 MODULE_LICENSE("GPL");
1170 
1171 
1172 static int fw_load = 0;
1173 static int pssmpu = 0, pssmss = 0;
1174 
1175 /*
1176  *    Load a PSS sound card module
1177  */
1178 
init_pss(void)1179 static int __init init_pss(void)
1180 {
1181 
1182 	if(pss_no_sound)		/* If configuring only nonsound components */
1183 	{
1184 		cfg.io_base = pss_io;
1185 		if(!probe_pss(&cfg))
1186 			return -ENODEV;
1187 		printk(KERN_INFO "ECHO-PSS  Rev. %d\n", inw(REG(PSS_ID)) & 0x00ff);
1188 		printk(KERN_INFO "PSS: loading in no sound mode.\n");
1189 		disable_all_emulations();
1190 		configure_nonsound_components();
1191 		return 0;
1192 	}
1193 
1194 	cfg.io_base = pss_io;
1195 
1196 	cfg2.io_base = mss_io;
1197 	cfg2.irq = mss_irq;
1198 	cfg2.dma = mss_dma;
1199 
1200 	cfg_mpu.io_base = mpu_io;
1201 	cfg_mpu.irq = mpu_irq;
1202 
1203 	if (cfg.io_base == -1 || cfg2.io_base == -1 || cfg2.irq == -1 || cfg.dma == -1) {
1204 		printk(KERN_INFO "pss: mss_io, mss_dma, mss_irq and pss_io must be set.\n");
1205 		return -EINVAL;
1206 	}
1207 
1208 	if (!pss_synth) {
1209 		fw_load = 1;
1210 		pss_synthLen = mod_firmware_load(pss_firmware, (void *) &pss_synth);
1211 	}
1212 	if (!probe_pss(&cfg))
1213 		return -ENODEV;
1214 	attach_pss(&cfg);
1215 	/*
1216 	 *    Attach stuff
1217 	 */
1218 	if (probe_pss_mpu(&cfg_mpu)) {
1219 		pssmpu = 1;
1220 		attach_pss_mpu(&cfg_mpu);
1221 	}
1222 	if (probe_pss_mss(&cfg2)) {
1223 		pssmss = 1;
1224 		attach_pss_mss(&cfg2);
1225 	}
1226 
1227 	return 0;
1228 }
1229 
cleanup_pss(void)1230 static void __exit cleanup_pss(void)
1231 {
1232 	if(!pss_no_sound)
1233 	{
1234 		if(fw_load && pss_synth)
1235 			vfree(pss_synth);
1236 		if(pssmss)
1237 			unload_pss_mss(&cfg2);
1238 		if(pssmpu)
1239 			unload_pss_mpu(&cfg_mpu);
1240 		unload_pss(&cfg);
1241 	}
1242 
1243 	if(!pss_keep_settings)	/* Keep hardware settings if asked */
1244 	{
1245 		disable_all_emulations();
1246 		printk(KERN_INFO "Resetting PSS sound card configurations.\n");
1247 	}
1248 }
1249 
1250 module_init(init_pss);
1251 module_exit(cleanup_pss);
1252 
1253 #ifndef MODULE
setup_pss(char * str)1254 static int __init setup_pss(char *str)
1255 {
1256 	/* io, mss_io, mss_irq, mss_dma, mpu_io, mpu_irq */
1257 	int ints[7];
1258 
1259 	str = get_options(str, ARRAY_SIZE(ints), ints);
1260 
1261 	pss_io	= ints[1];
1262 	mss_io	= ints[2];
1263 	mss_irq	= ints[3];
1264 	mss_dma	= ints[4];
1265 	mpu_io	= ints[5];
1266 	mpu_irq	= ints[6];
1267 
1268 	return 1;
1269 }
1270 
1271 __setup("pss=", setup_pss);
1272 #endif
1273