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 firmware 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 bool pss_mixer = 1;
121 #else
122 static bool 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 bool	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 && time_after_eq(limit, jiffies); 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 && time_after_eq(limit, jiffies); i++)
373 			val = inw(REG(PSS_STATUS));
374 
375 		limit = jiffies + HZ/10;
376 		for (i = 0; i < 32768 && time_after_eq(limit, jiffies); 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,unsigned int * aleft)460 static int set_volume_mono(unsigned __user *p, unsigned int *aleft)
461 {
462 	unsigned int left, volume;
463 	if (get_user(volume, p))
464 		return -EFAULT;
465 
466 	left = volume & 0xff;
467 	if (left > 100)
468 		left = 100;
469 	*aleft = left;
470 	return 0;
471 }
472 
set_volume_stereo(unsigned __user * p,unsigned int * aleft,unsigned int * aright)473 static int set_volume_stereo(unsigned __user *p,
474 			     unsigned int *aleft,
475 			     unsigned int *aright)
476 {
477 	unsigned int left, right, 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 (!request_region(pss_cdrom_port, 2, "PSS CDROM")) {
677 		pss_cdrom_port = -1;
678 		printk(KERN_ERR "PSS: CDROM I/O port conflict.\n");
679 	} else {
680 		set_io_base(devc, CONF_CDROM, pss_cdrom_port);
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 static int __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 0;
698 
699 	id = inw(REG(PSS_ID)) & 0x00ff;
700 
701 	/*
702 	 * Disable all emulations. Will be enabled later (if required).
703 	 */
704 
705 	disable_all_emulations();
706 
707 #ifdef YOU_REALLY_WANT_TO_ALLOCATE_THESE_RESOURCES
708 	if (sound_alloc_dma(hw_config->dma, "PSS"))
709 	{
710 		printk("pss.c: Can't allocate DMA channel.\n");
711 		release_region(hw_config->io_base, 0x10);
712 		release_region(hw_config->io_base+0x10, 0x9);
713 		return 0;
714 	}
715 	if (!set_irq(devc, CONF_PSS, devc->irq))
716 	{
717 		printk("PSS: IRQ allocation error.\n");
718 		release_region(hw_config->io_base, 0x10);
719 		release_region(hw_config->io_base+0x10, 0x9);
720 		return 0;
721 	}
722 	if (!set_dma(devc, CONF_PSS, devc->dma))
723 	{
724 		printk(KERN_ERR "PSS: DMA allocation error\n");
725 		release_region(hw_config->io_base, 0x10);
726 		release_region(hw_config->io_base+0x10, 0x9);
727 		return 0;
728 	}
729 #endif
730 
731 	configure_nonsound_components();
732 	pss_initialized = 1;
733 	sprintf(tmp, "ECHO-PSS  Rev. %d", id);
734 	conf_printf(tmp, hw_config);
735 	return 1;
736 }
737 
probe_pss_mpu(struct address_info * hw_config)738 static int __init probe_pss_mpu(struct address_info *hw_config)
739 {
740 	struct resource *ports;
741 	int timeout;
742 
743 	if (!pss_initialized)
744 		return 0;
745 
746 	ports = request_region(hw_config->io_base, 2, "mpu401");
747 
748 	if (!ports) {
749 		printk(KERN_ERR "PSS: MPU I/O port conflict\n");
750 		return 0;
751 	}
752 	set_io_base(devc, CONF_MIDI, hw_config->io_base);
753 	if (!set_irq(devc, CONF_MIDI, hw_config->irq)) {
754 		printk(KERN_ERR "PSS: MIDI IRQ allocation error.\n");
755 		goto fail;
756 	}
757 	if (!pss_synthLen) {
758 		printk(KERN_ERR "PSS: Can't enable MPU. MIDI synth microcode not available.\n");
759 		goto fail;
760 	}
761 	if (!pss_download_boot(devc, pss_synth, pss_synthLen, CPF_FIRST | CPF_LAST)) {
762 		printk(KERN_ERR "PSS: Unable to load MIDI synth microcode to DSP.\n");
763 		goto fail;
764 	}
765 
766 	/*
767 	 * Finally wait until the DSP algorithm has initialized itself and
768 	 * deactivates receive interrupt.
769 	 */
770 
771 	for (timeout = 900000; timeout > 0; timeout--)
772 	{
773 		if ((inb(hw_config->io_base + 1) & 0x80) == 0)	/* Input data avail */
774 			inb(hw_config->io_base);	/* Discard it */
775 		else
776 			break;	/* No more input */
777 	}
778 
779 	if (!probe_mpu401(hw_config, ports))
780 		goto fail;
781 
782 	attach_mpu401(hw_config, THIS_MODULE);	/* Slot 1 */
783 	if (hw_config->slots[1] != -1)	/* The MPU driver installed itself */
784 		midi_devs[hw_config->slots[1]]->coproc = &pss_coproc_operations;
785 	return 1;
786 fail:
787 	release_region(hw_config->io_base, 2);
788 	return 0;
789 }
790 
pss_coproc_open(void * dev_info,int sub_device)791 static int pss_coproc_open(void *dev_info, int sub_device)
792 {
793 	switch (sub_device)
794 	{
795 		case COPR_MIDI:
796 			if (pss_synthLen == 0)
797 			{
798 				printk(KERN_ERR "PSS: MIDI synth microcode not available.\n");
799 				return -EIO;
800 			}
801 			if (nonstandard_microcode)
802 				if (!pss_download_boot(devc, pss_synth, pss_synthLen, CPF_FIRST | CPF_LAST))
803 			{
804 				printk(KERN_ERR "PSS: Unable to load MIDI synth microcode to DSP.\n");
805 				return -EIO;
806 			}
807 			nonstandard_microcode = 0;
808 			break;
809 
810 		default:
811 			break;
812 	}
813 	return 0;
814 }
815 
pss_coproc_close(void * dev_info,int sub_device)816 static void pss_coproc_close(void *dev_info, int sub_device)
817 {
818 	return;
819 }
820 
pss_coproc_reset(void * dev_info)821 static void pss_coproc_reset(void *dev_info)
822 {
823 	if (pss_synthLen)
824 		if (!pss_download_boot(devc, pss_synth, pss_synthLen, CPF_FIRST | CPF_LAST))
825 		{
826 			printk(KERN_ERR "PSS: Unable to load MIDI synth microcode to DSP.\n");
827 		}
828 	nonstandard_microcode = 0;
829 }
830 
download_boot_block(void * dev_info,copr_buffer * buf)831 static int download_boot_block(void *dev_info, copr_buffer * buf)
832 {
833 	if (buf->len <= 0 || buf->len > sizeof(buf->data))
834 		return -EINVAL;
835 
836 	if (!pss_download_boot(devc, buf->data, buf->len, buf->flags))
837 	{
838 		printk(KERN_ERR "PSS: Unable to load microcode block to DSP.\n");
839 		return -EIO;
840 	}
841 	nonstandard_microcode = 1;	/* The MIDI microcode has been overwritten */
842 	return 0;
843 }
844 
pss_coproc_ioctl(void * dev_info,unsigned int cmd,void __user * arg,int local)845 static int pss_coproc_ioctl(void *dev_info, unsigned int cmd, void __user *arg, int local)
846 {
847 	copr_buffer *buf;
848 	copr_msg *mbuf;
849 	copr_debug_buf dbuf;
850 	unsigned short tmp;
851 	unsigned long flags;
852 	unsigned short *data;
853 	int i, err;
854 	/* printk( "PSS coproc ioctl %x %x %d\n",  cmd,  arg,  local); */
855 
856 	switch (cmd)
857 	{
858 		case SNDCTL_COPR_RESET:
859 			pss_coproc_reset(dev_info);
860 			return 0;
861 
862 		case SNDCTL_COPR_LOAD:
863 			buf = vmalloc(sizeof(copr_buffer));
864 			if (buf == NULL)
865 				return -ENOSPC;
866 			if (copy_from_user(buf, arg, sizeof(copr_buffer))) {
867 				vfree(buf);
868 				return -EFAULT;
869 			}
870 			err = download_boot_block(dev_info, buf);
871 			vfree(buf);
872 			return err;
873 
874 		case SNDCTL_COPR_SENDMSG:
875 			mbuf = vmalloc(sizeof(copr_msg));
876 			if (mbuf == NULL)
877 				return -ENOSPC;
878 			if (copy_from_user(mbuf, arg, sizeof(copr_msg))) {
879 				vfree(mbuf);
880 				return -EFAULT;
881 			}
882 			data = (unsigned short *)(mbuf->data);
883 			spin_lock_irqsave(&lock, flags);
884 			for (i = 0; i < mbuf->len; i++) {
885 				if (!pss_put_dspword(devc, *data++)) {
886 					spin_unlock_irqrestore(&lock,flags);
887 					mbuf->len = i;	/* feed back number of WORDs sent */
888 					err = copy_to_user(arg, mbuf, sizeof(copr_msg));
889 					vfree(mbuf);
890 					return err ? -EFAULT : -EIO;
891 				}
892 			}
893 			spin_unlock_irqrestore(&lock,flags);
894 			vfree(mbuf);
895 			return 0;
896 
897 		case SNDCTL_COPR_RCVMSG:
898 			err = 0;
899 			mbuf = vmalloc(sizeof(copr_msg));
900 			if (mbuf == NULL)
901 				return -ENOSPC;
902 			data = (unsigned short *)mbuf->data;
903 			spin_lock_irqsave(&lock, flags);
904 			for (i = 0; i < sizeof(mbuf->data)/sizeof(unsigned short); i++) {
905 				mbuf->len = i;	/* feed back number of WORDs read */
906 				if (!pss_get_dspword(devc, data++)) {
907 					if (i == 0)
908 						err = -EIO;
909 					break;
910 				}
911 			}
912 			spin_unlock_irqrestore(&lock,flags);
913 			if (copy_to_user(arg, mbuf, sizeof(copr_msg)))
914 				err = -EFAULT;
915 			vfree(mbuf);
916 			return err;
917 
918 		case SNDCTL_COPR_RDATA:
919 			if (copy_from_user(&dbuf, arg, sizeof(dbuf)))
920 				return -EFAULT;
921 			spin_lock_irqsave(&lock, flags);
922 			if (!pss_put_dspword(devc, 0x00d0)) {
923 				spin_unlock_irqrestore(&lock,flags);
924 				return -EIO;
925 			}
926 			if (!pss_put_dspword(devc, (unsigned short)(dbuf.parm1 & 0xffff))) {
927 				spin_unlock_irqrestore(&lock,flags);
928 				return -EIO;
929 			}
930 			if (!pss_get_dspword(devc, &tmp)) {
931 				spin_unlock_irqrestore(&lock,flags);
932 				return -EIO;
933 			}
934 			dbuf.parm1 = tmp;
935 			spin_unlock_irqrestore(&lock,flags);
936 			if (copy_to_user(arg, &dbuf, sizeof(dbuf)))
937 				return -EFAULT;
938 			return 0;
939 
940 		case SNDCTL_COPR_WDATA:
941 			if (copy_from_user(&dbuf, arg, sizeof(dbuf)))
942 				return -EFAULT;
943 			spin_lock_irqsave(&lock, flags);
944 			if (!pss_put_dspword(devc, 0x00d1)) {
945 				spin_unlock_irqrestore(&lock,flags);
946 				return -EIO;
947 			}
948 			if (!pss_put_dspword(devc, (unsigned short) (dbuf.parm1 & 0xffff))) {
949 				spin_unlock_irqrestore(&lock,flags);
950 				return -EIO;
951 			}
952 			tmp = (unsigned int)dbuf.parm2 & 0xffff;
953 			if (!pss_put_dspword(devc, tmp)) {
954 				spin_unlock_irqrestore(&lock,flags);
955 				return -EIO;
956 			}
957 			spin_unlock_irqrestore(&lock,flags);
958 			return 0;
959 
960 		case SNDCTL_COPR_WCODE:
961 			if (copy_from_user(&dbuf, arg, sizeof(dbuf)))
962 				return -EFAULT;
963 			spin_lock_irqsave(&lock, flags);
964 			if (!pss_put_dspword(devc, 0x00d3)) {
965 				spin_unlock_irqrestore(&lock,flags);
966 				return -EIO;
967 			}
968 			if (!pss_put_dspword(devc, (unsigned short)(dbuf.parm1 & 0xffff))) {
969 				spin_unlock_irqrestore(&lock,flags);
970 				return -EIO;
971 			}
972 			tmp = (unsigned int)dbuf.parm2 & 0x00ff;
973 			if (!pss_put_dspword(devc, tmp)) {
974 				spin_unlock_irqrestore(&lock,flags);
975 				return -EIO;
976 			}
977 			tmp = ((unsigned int)dbuf.parm2 >> 8) & 0xffff;
978 			if (!pss_put_dspword(devc, tmp)) {
979 				spin_unlock_irqrestore(&lock,flags);
980 				return -EIO;
981 			}
982 			spin_unlock_irqrestore(&lock,flags);
983 			return 0;
984 
985 		case SNDCTL_COPR_RCODE:
986 			if (copy_from_user(&dbuf, arg, sizeof(dbuf)))
987 				return -EFAULT;
988 			spin_lock_irqsave(&lock, flags);
989 			if (!pss_put_dspword(devc, 0x00d2)) {
990 				spin_unlock_irqrestore(&lock,flags);
991 				return -EIO;
992 			}
993 			if (!pss_put_dspword(devc, (unsigned short)(dbuf.parm1 & 0xffff))) {
994 				spin_unlock_irqrestore(&lock,flags);
995 				return -EIO;
996 			}
997 			if (!pss_get_dspword(devc, &tmp)) { /* Read MSB */
998 				spin_unlock_irqrestore(&lock,flags);
999 				return -EIO;
1000 			}
1001 			dbuf.parm1 = tmp << 8;
1002 			if (!pss_get_dspword(devc, &tmp)) { /* Read LSB */
1003 				spin_unlock_irqrestore(&lock,flags);
1004 				return -EIO;
1005 			}
1006 			dbuf.parm1 |= tmp & 0x00ff;
1007 			spin_unlock_irqrestore(&lock,flags);
1008 			if (copy_to_user(arg, &dbuf, sizeof(dbuf)))
1009 				return -EFAULT;
1010 			return 0;
1011 
1012 		default:
1013 			return -EINVAL;
1014 	}
1015 	return -EINVAL;
1016 }
1017 
1018 static coproc_operations pss_coproc_operations =
1019 {
1020 	"ADSP-2115",
1021 	THIS_MODULE,
1022 	pss_coproc_open,
1023 	pss_coproc_close,
1024 	pss_coproc_ioctl,
1025 	pss_coproc_reset,
1026 	&pss_data
1027 };
1028 
probe_pss_mss(struct address_info * hw_config)1029 static int __init probe_pss_mss(struct address_info *hw_config)
1030 {
1031 	volatile int timeout;
1032 	struct resource *ports;
1033 	int        my_mix = -999;	/* gcc shut up */
1034 
1035 	if (!pss_initialized)
1036 		return 0;
1037 
1038 	if (!request_region(hw_config->io_base, 4, "WSS config")) {
1039 		printk(KERN_ERR "PSS: WSS I/O port conflicts.\n");
1040 		return 0;
1041 	}
1042 	ports = request_region(hw_config->io_base + 4, 4, "ad1848");
1043 	if (!ports) {
1044 		printk(KERN_ERR "PSS: WSS I/O port conflicts.\n");
1045 		release_region(hw_config->io_base, 4);
1046 		return 0;
1047 	}
1048 	set_io_base(devc, CONF_WSS, hw_config->io_base);
1049 	if (!set_irq(devc, CONF_WSS, hw_config->irq)) {
1050 		printk("PSS: WSS IRQ allocation error.\n");
1051 		goto fail;
1052 	}
1053 	if (!set_dma(devc, CONF_WSS, hw_config->dma)) {
1054 		printk(KERN_ERR "PSS: WSS DMA allocation error\n");
1055 		goto fail;
1056 	}
1057 	/*
1058 	 * For some reason the card returns 0xff in the WSS status register
1059 	 * immediately after boot. Probably MIDI+SB emulation algorithm
1060 	 * downloaded to the ADSP2115 spends some time initializing the card.
1061 	 * Let's try to wait until it finishes this task.
1062 	 */
1063 	for (timeout = 0; timeout < 100000 && (inb(hw_config->io_base + WSS_INDEX) &
1064 	  WSS_INITIALIZING); timeout++)
1065 		;
1066 
1067 	outb((0x0b), hw_config->io_base + WSS_INDEX);	/* Required by some cards */
1068 
1069 	for (timeout = 0; (inb(hw_config->io_base + WSS_DATA) & WSS_AUTOCALIBRATION) &&
1070 	  (timeout < 100000); timeout++)
1071 		;
1072 
1073 	if (!probe_ms_sound(hw_config, ports))
1074 		goto fail;
1075 
1076 	devc->ad_mixer_dev = NO_WSS_MIXER;
1077 	if (pss_mixer)
1078 	{
1079 		if ((my_mix = sound_install_mixer (MIXER_DRIVER_VERSION,
1080 			"PSS-SPEAKERS and AD1848 (through MSS audio codec)",
1081 			&pss_mixer_operations,
1082 			sizeof (struct mixer_operations),
1083 			devc)) < 0)
1084 		{
1085 			printk(KERN_ERR "Could not install PSS mixer\n");
1086 			goto fail;
1087 		}
1088 	}
1089 	pss_mixer_reset(devc);
1090 	attach_ms_sound(hw_config, ports, THIS_MODULE);	/* Slot 0 */
1091 
1092 	if (hw_config->slots[0] != -1)
1093 	{
1094 		/* The MSS driver installed itself */
1095 		audio_devs[hw_config->slots[0]]->coproc = &pss_coproc_operations;
1096 		if (pss_mixer && (num_mixers == (my_mix + 2)))
1097 		{
1098 			/* The MSS mixer installed */
1099 			devc->ad_mixer_dev = audio_devs[hw_config->slots[0]]->mixer_dev;
1100 		}
1101 	}
1102 	return 1;
1103 fail:
1104 	release_region(hw_config->io_base + 4, 4);
1105 	release_region(hw_config->io_base, 4);
1106 	return 0;
1107 }
1108 
unload_pss(struct address_info * hw_config)1109 static inline void __exit unload_pss(struct address_info *hw_config)
1110 {
1111 	release_region(hw_config->io_base, 0x10);
1112 	release_region(hw_config->io_base+0x10, 0x9);
1113 }
1114 
unload_pss_mpu(struct address_info * hw_config)1115 static inline void __exit unload_pss_mpu(struct address_info *hw_config)
1116 {
1117 	unload_mpu401(hw_config);
1118 }
1119 
unload_pss_mss(struct address_info * hw_config)1120 static inline void __exit unload_pss_mss(struct address_info *hw_config)
1121 {
1122 	unload_ms_sound(hw_config);
1123 }
1124 
1125 
1126 static struct address_info cfg;
1127 static struct address_info cfg2;
1128 static struct address_info cfg_mpu;
1129 
1130 static int pss_io __initdata	= -1;
1131 static int mss_io __initdata	= -1;
1132 static int mss_irq __initdata	= -1;
1133 static int mss_dma __initdata	= -1;
1134 static int mpu_io __initdata	= -1;
1135 static int mpu_irq __initdata	= -1;
1136 static bool pss_no_sound = 0;	/* Just configure non-sound components */
1137 static bool pss_keep_settings  = 1;	/* Keep hardware settings at module exit */
1138 static char *pss_firmware = "/etc/sound/pss_synth";
1139 
1140 module_param(pss_io, int, 0);
1141 MODULE_PARM_DESC(pss_io, "Set i/o base of PSS card (probably 0x220 or 0x240)");
1142 module_param(mss_io, int, 0);
1143 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)");
1144 module_param(mss_irq, int, 0);
1145 MODULE_PARM_DESC(mss_irq, "Set WSS (audio) IRQ (3, 5, 7, 9, 10, 11, 12)");
1146 module_param(mss_dma, int, 0);
1147 MODULE_PARM_DESC(mss_dma, "Set WSS (audio) DMA (0, 1, 3)");
1148 module_param(mpu_io, int, 0);
1149 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)");
1150 module_param(mpu_irq, int, 0);
1151 MODULE_PARM_DESC(mpu_irq, "Set MIDI IRQ (3, 5, 7, 9, 10, 11, 12)");
1152 module_param(pss_cdrom_port, int, 0);
1153 MODULE_PARM_DESC(pss_cdrom_port, "Set the PSS CDROM port i/o base (0x340 or other)");
1154 module_param(pss_enable_joystick, bool, 0);
1155 MODULE_PARM_DESC(pss_enable_joystick, "Enables the PSS joystick port (1 to enable, 0 to disable)");
1156 module_param(pss_no_sound, bool, 0);
1157 MODULE_PARM_DESC(pss_no_sound, "Configure sound compoents (0 - no, 1 - yes)");
1158 module_param(pss_keep_settings, bool, 0);
1159 MODULE_PARM_DESC(pss_keep_settings, "Keep hardware setting at driver unloading (0 - no, 1 - yes)");
1160 module_param(pss_firmware, charp, 0);
1161 MODULE_PARM_DESC(pss_firmware, "Location of the firmware file (default - /etc/sound/pss_synth)");
1162 module_param(pss_mixer, bool, 0);
1163 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.");
1164 MODULE_AUTHOR("Hannu Savolainen, Vladimir Michl");
1165 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).");
1166 MODULE_LICENSE("GPL");
1167 
1168 
1169 static int fw_load = 0;
1170 static int pssmpu = 0, pssmss = 0;
1171 
1172 /*
1173  *    Load a PSS sound card module
1174  */
1175 
init_pss(void)1176 static int __init init_pss(void)
1177 {
1178 
1179 	if(pss_no_sound)		/* If configuring only nonsound components */
1180 	{
1181 		cfg.io_base = pss_io;
1182 		if(!probe_pss(&cfg))
1183 			return -ENODEV;
1184 		printk(KERN_INFO "ECHO-PSS  Rev. %d\n", inw(REG(PSS_ID)) & 0x00ff);
1185 		printk(KERN_INFO "PSS: loading in no sound mode.\n");
1186 		disable_all_emulations();
1187 		configure_nonsound_components();
1188 		release_region(pss_io, 0x10);
1189 		release_region(pss_io + 0x10, 0x9);
1190 		return 0;
1191 	}
1192 
1193 	cfg.io_base = pss_io;
1194 
1195 	cfg2.io_base = mss_io;
1196 	cfg2.irq = mss_irq;
1197 	cfg2.dma = mss_dma;
1198 
1199 	cfg_mpu.io_base = mpu_io;
1200 	cfg_mpu.irq = mpu_irq;
1201 
1202 	if (cfg.io_base == -1 || cfg2.io_base == -1 || cfg2.irq == -1 || cfg.dma == -1) {
1203 		printk(KERN_INFO "pss: mss_io, mss_dma, mss_irq and pss_io must be set.\n");
1204 		return -EINVAL;
1205 	}
1206 
1207 	if (!pss_synth) {
1208 		fw_load = 1;
1209 		pss_synthLen = mod_firmware_load(pss_firmware, (void *) &pss_synth);
1210 	}
1211 	if (!attach_pss(&cfg))
1212 		return -ENODEV;
1213 	/*
1214 	 *    Attach stuff
1215 	 */
1216 	if (probe_pss_mpu(&cfg_mpu))
1217 		pssmpu = 1;
1218 
1219 	if (probe_pss_mss(&cfg2))
1220 		pssmss = 1;
1221 
1222 	return 0;
1223 }
1224 
cleanup_pss(void)1225 static void __exit cleanup_pss(void)
1226 {
1227 	if(!pss_no_sound)
1228 	{
1229 		if(fw_load && pss_synth)
1230 			vfree(pss_synth);
1231 		if(pssmss)
1232 			unload_pss_mss(&cfg2);
1233 		if(pssmpu)
1234 			unload_pss_mpu(&cfg_mpu);
1235 		unload_pss(&cfg);
1236 	} else if (pss_cdrom_port != -1)
1237 		release_region(pss_cdrom_port, 2);
1238 
1239 	if(!pss_keep_settings)	/* Keep hardware settings if asked */
1240 	{
1241 		disable_all_emulations();
1242 		printk(KERN_INFO "Resetting PSS sound card configurations.\n");
1243 	}
1244 }
1245 
1246 module_init(init_pss);
1247 module_exit(cleanup_pss);
1248 
1249 #ifndef MODULE
setup_pss(char * str)1250 static int __init setup_pss(char *str)
1251 {
1252 	/* io, mss_io, mss_irq, mss_dma, mpu_io, mpu_irq */
1253 	int ints[7];
1254 
1255 	str = get_options(str, ARRAY_SIZE(ints), ints);
1256 
1257 	pss_io	= ints[1];
1258 	mss_io	= ints[2];
1259 	mss_irq	= ints[3];
1260 	mss_dma	= ints[4];
1261 	mpu_io	= ints[5];
1262 	mpu_irq	= ints[6];
1263 
1264 	return 1;
1265 }
1266 
1267 __setup("pss=", setup_pss);
1268 #endif
1269