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