4 * The low level driver for the Personal Sound System (ECHO ESC614).
7 * Copyright (C) by Hannu Savolainen 1993-1997
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
14 * Thomas Sailer ioctl code reworked (vmalloc/vfree removed)
15 * Alan Cox modularisation, clean up.
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
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
60 #include <linux/config.h>
61 #include <linux/init.h>
62 #include <linux/module.h>
64 #include "sound_config.h"
65 #include "sound_firmware.h"
73 #define REG(x) (devc->base+x)
87 #define CONF_CDROM 0x16
88 #define CONF_MIDI 0x18
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
109 #define WSS_INITIALIZING 0x80
110 #define WSS_AUTOCALIBRATION 0x20
112 #define NO_WSS_MIXER -1
116 #include "pss_boot.h"
118 /* If compiled into kernel, it enable or disable pss mixer */
119 #ifdef CONFIG_PSS_MIXER
120 static unsigned char pss_mixer = 1;
122 static unsigned char pss_mixer = 0;
126 typedef struct pss_mixerdata {
127 unsigned int volume_l;
128 unsigned int volume_r;
134 typedef struct pss_confdata {
143 static pss_confdata pss_data;
144 static pss_confdata *devc = &pss_data;
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 */
151 static void pss_write(pss_confdata *devc, int data)
155 limit = jiffies + HZ/10; /* The timeout is 0.1 seconds */
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
164 for (i = 0; i < 5000000 && time_before(jiffies, limit); i++)
166 if (inw(REG(PSS_STATUS)) & PSS_WRITE_EMPTY)
168 outw(data, REG(PSS_DATA));
172 printk(KERN_WARNING "PSS: DSP Command (%04x) Timeout.\n", data);
175 int __init probe_pss(struct address_info *hw_config)
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;
185 if (devc->base != 0x220 && devc->base != 0x240)
186 if (devc->base != 0x230 && devc->base != 0x250) /* Some cards use these */
189 if (check_region(devc->base, 0x19 /*16*/)) {
190 printk(KERN_ERR "PSS: I/O port conflict\n");
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);
201 static int set_irq(pss_confdata * devc, int dev, int irq)
203 static unsigned short irq_bits[16] =
205 0x0000, 0x0000, 0x0000, 0x0008,
206 0x0000, 0x0010, 0x0000, 0x0018,
207 0x0000, 0x0020, 0x0028, 0x0030,
208 0x0038, 0x0000, 0x0000, 0x0000
211 unsigned short tmp, bits;
213 if (irq < 0 || irq > 15)
216 tmp = inw(REG(dev)) & ~0x38; /* Load confreg, mask IRQ bits out */
218 if ((bits = irq_bits[irq]) == 0 && irq != 0)
220 printk(KERN_ERR "PSS: Invalid IRQ %d\n", irq);
223 outw(tmp | bits, REG(dev));
227 static int set_io_base(pss_confdata * devc, int dev, int base)
229 unsigned short tmp = inw(REG(dev)) & 0x003f;
230 unsigned short bits = (base & 0x0ffc) << 4;
232 outw(bits | tmp, REG(dev));
237 static int set_dma(pss_confdata * devc, int dev, int dma)
239 static unsigned short dma_bits[8] =
241 0x0001, 0x0002, 0x0000, 0x0003,
242 0x0000, 0x0005, 0x0006, 0x0007
245 unsigned short tmp, bits;
247 if (dma < 0 || dma > 7)
250 tmp = inw(REG(dev)) & ~0x07; /* Load confreg, mask DMA bits out */
252 if ((bits = dma_bits[dma]) == 0 && dma != 4)
254 printk(KERN_ERR "PSS: Invalid DMA %d\n", dma);
257 outw(tmp | bits, REG(dev));
261 static int pss_reset_dsp(pss_confdata * devc)
263 unsigned long i, limit = jiffies + HZ/10;
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));
272 static int pss_put_dspword(pss_confdata * devc, unsigned short word)
276 for (i = 0; i < 327680; i++)
278 val = inw(REG(PSS_STATUS));
279 if (val & PSS_WRITE_EMPTY)
281 outw(word, REG(PSS_DATA));
288 static int pss_get_dspword(pss_confdata * devc, unsigned short *word)
292 for (i = 0; i < 327680; i++)
294 val = inw(REG(PSS_STATUS));
295 if (val & PSS_READ_FULL)
297 *word = inw(REG(PSS_DATA));
304 static int pss_download_boot(pss_confdata * devc, unsigned char *block, int size, int flags)
306 int i, limit, val, count;
308 if (flags & CPF_FIRST)
310 /*_____ Warn DSP software that a boot is coming */
311 outw(0x00fe, REG(PSS_DATA));
313 limit = jiffies + HZ/10;
314 for (i = 0; i < 32768 && time_before(jiffies, limit); i++)
315 if (inw(REG(PSS_DATA)) == 0x5500)
318 outw(*block++, REG(PSS_DATA));
322 while ((flags&CPF_LAST) || count<size )
326 for (j = 0; j < 327670; j++)
328 /*_____ Wait for BG to appear */
329 if (inw(REG(PSS_STATUS)) & PSS_FLAG3)
335 /* It's ok we timed out when the file was empty */
336 if (count >= size && flags & CPF_LAST)
341 printk(KERN_ERR "PSS: Download timeout problems, byte %d=%d\n", count, size);
345 /*_____ Send the next byte */
348 /* If not data in block send 0xffff */
349 outw (0xffff, REG (PSS_DATA));
353 /*_____ Send the next byte */
354 outw (*block++, REG (PSS_DATA));
359 if (flags & CPF_LAST)
362 outw(0, REG(PSS_DATA));
364 limit = jiffies + HZ/10;
365 for (i = 0; i < 32768 && (limit - jiffies >= 0); i++)
366 val = inw(REG(PSS_STATUS));
368 limit = jiffies + HZ/10;
369 for (i = 0; i < 32768 && (limit-jiffies >= 0); i++)
371 val = inw(REG(PSS_STATUS));
376 /* now read the version */
377 for (i = 0; i < 32000; i++)
379 val = inw(REG(PSS_STATUS));
380 if (val & PSS_READ_FULL)
386 val = inw(REG(PSS_DATA));
387 /* printk( "<PSS: microcode version %d.%d loaded>", val/16, val % 16); */
393 static void set_master_volume(pss_confdata *devc, int left, int right)
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
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);
412 static void set_synth_volume(pss_confdata *devc, int volume)
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);
421 static void set_bass(pss_confdata *devc, int level)
423 int vol = (int)(((0xfd - 0xf0) * level)/100L) + 0xf0;
424 pss_write(devc, 0x0010);
425 pss_write(devc, vol | 0x0200);
428 static void set_treble(pss_confdata *devc, int level)
430 int vol = (((0xfd - 0xf0) * level)/100L) + 0xf0;
431 pss_write(devc, 0x0010);
432 pss_write(devc, vol | 0x0300);
435 static void pss_mixer_reset(pss_confdata *devc)
437 set_master_volume(devc, 33, 33);
439 set_treble(devc, 50);
440 set_synth_volume(devc, 30);
441 pss_write (devc, 0x0010);
442 pss_write (devc, 0x0800 | 0xce); /* Stereo */
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;
453 static int set_volume_mono(caddr_t p, int *aleft)
457 if (get_user(volume, (unsigned *)p))
460 left = volume & 0xff;
467 static int set_volume_stereo(caddr_t p, int *aleft, int *aright)
471 if (get_user(volume, (unsigned *)p))
474 left = volume & 0xff;
477 right = (volume >> 8) & 0xff;
485 static int ret_vol_mono(int left)
487 return ((left << 8) | left);
490 static int ret_vol_stereo(int left, int right)
492 return ((right << 8) | left);
495 static int call_ad_mixer(pss_confdata *devc,unsigned int cmd, caddr_t arg)
497 if (devc->ad_mixer_dev != NO_WSS_MIXER)
498 return mixer_devs[devc->ad_mixer_dev]->ioctl(devc->ad_mixer_dev, cmd, arg);
503 static int pss_mixer_ioctl (int dev, unsigned int cmd, caddr_t arg)
505 pss_confdata *devc = mixer_devs[dev]->devc;
506 int cmdf = cmd & 0xff;
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))
514 return call_ad_mixer(devc, cmd, arg);
517 if (((cmd >> 8) & 0xff) != 'M')
520 if (_SIOC_DIR (cmd) & _SIOC_WRITE)
524 case SOUND_MIXER_RECSRC:
525 if (devc->ad_mixer_dev != NO_WSS_MIXER)
526 return call_ad_mixer(devc, cmd, arg);
530 if (get_user(v, (int *)arg))
536 case SOUND_MIXER_VOLUME:
537 if (set_volume_stereo(arg,
538 &devc->mixer.volume_l,
539 &devc->mixer.volume_r))
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);
546 case SOUND_MIXER_BASS:
547 if (set_volume_mono(arg, &devc->mixer.bass))
549 set_bass(devc, devc->mixer.bass);
550 return ret_vol_mono(devc->mixer.bass);
552 case SOUND_MIXER_TREBLE:
553 if (set_volume_mono(arg, &devc->mixer.treble))
555 set_treble(devc, devc->mixer.treble);
556 return ret_vol_mono(devc->mixer.treble);
558 case SOUND_MIXER_SYNTH:
559 if (set_volume_mono(arg, &devc->mixer.synth))
561 set_synth_volume(devc, devc->mixer.synth);
562 return ret_vol_mono(devc->mixer.synth);
570 int val, and_mask = 0, or_mask = 0;
576 case SOUND_MIXER_DEVMASK:
577 if (call_ad_mixer(devc, cmd, arg) == -EINVAL)
580 or_mask = SOUND_MASK_VOLUME | SOUND_MASK_BASS | SOUND_MASK_TREBLE | SOUND_MASK_SYNTH;
583 case SOUND_MIXER_STEREODEVS:
584 if (call_ad_mixer(devc, cmd, arg) == -EINVAL)
587 or_mask = SOUND_MASK_VOLUME;
590 case SOUND_MIXER_RECMASK:
591 if (devc->ad_mixer_dev != NO_WSS_MIXER)
592 return call_ad_mixer(devc, cmd, arg);
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;
601 case SOUND_MIXER_RECSRC:
602 if (devc->ad_mixer_dev != NO_WSS_MIXER)
603 return call_ad_mixer(devc, cmd, arg);
606 case SOUND_MIXER_VOLUME:
607 or_mask = ret_vol_stereo(devc->mixer.volume_l, devc->mixer.volume_r);
610 case SOUND_MIXER_BASS:
611 or_mask = ret_vol_mono(devc->mixer.bass);
614 case SOUND_MIXER_TREBLE:
615 or_mask = ret_vol_mono(devc->mixer.treble);
618 case SOUND_MIXER_SYNTH:
619 or_mask = ret_vol_mono(devc->mixer.synth);
624 if (get_user(val, (int *)arg))
628 if (put_user(val, (int *)arg))
634 static struct mixer_operations pss_mixer_operations =
639 ioctl: pss_mixer_ioctl
642 void disable_all_emulations(void)
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));
651 void configure_nonsound_components(void)
653 /* Configure Joystick port */
655 if(pss_enable_joystick)
657 outw(0x0400, REG(CONF_PSS)); /* 0x0400 enables joystick */
658 printk(KERN_INFO "PSS: joystick enabled.\n");
662 printk(KERN_INFO "PSS: joystick port not enabled.\n");
665 /* Configure CDROM port */
667 if(pss_cdrom_port == -1) /* If cdrom port enablation wasn't requested */
669 printk(KERN_INFO "PSS: CDROM port not enabled.\n");
671 else if(check_region(pss_cdrom_port, 2))
673 printk(KERN_ERR "PSS: CDROM I/O port conflict.\n");
675 else if(!set_io_base(devc, CONF_CDROM, pss_cdrom_port))
677 printk(KERN_ERR "PSS: CDROM I/O port could not be set.\n");
679 else /* CDROM port successfully configured */
681 printk(KERN_INFO "PSS: CDROM I/O port set to 0x%x.\n", pss_cdrom_port);
685 void __init attach_pss(struct address_info *hw_config)
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;
696 if (!probe_pss(hw_config))
699 request_region(hw_config->io_base, 0x10, "PSS mixer, SB emulation");
700 request_region(hw_config->io_base + 0x10, 0x9, "PSS config");
702 id = inw(REG(PSS_ID)) & 0x00ff;
705 * Disable all emulations. Will be enabled later (if required).
708 disable_all_emulations();
710 #if YOU_REALLY_WANT_TO_ALLOCATE_THESE_RESOURCES
711 if (sound_alloc_dma(hw_config->dma, "PSS"))
713 printk("pss.c: Can't allocate DMA channel.\n");
716 if (!set_irq(devc, CONF_PSS, devc->irq))
718 printk("PSS: IRQ allocation error.\n");
721 if (!set_dma(devc, CONF_PSS, devc->dma))
723 printk(KERN_ERR "PSS: DMA allocation error\n");
728 configure_nonsound_components();
730 sprintf(tmp, "ECHO-PSS Rev. %d", id);
731 conf_printf(tmp, hw_config);
734 int __init probe_pss_mpu(struct address_info *hw_config)
738 if (!pss_initialized)
741 if (check_region(hw_config->io_base, 2))
743 printk(KERN_ERR "PSS: MPU I/O port conflict\n");
746 if (!set_io_base(devc, CONF_MIDI, hw_config->io_base))
748 printk(KERN_ERR "PSS: MIDI base could not be set.\n");
751 if (!set_irq(devc, CONF_MIDI, hw_config->irq))
753 printk(KERN_ERR "PSS: MIDI IRQ allocation error.\n");
758 printk(KERN_ERR "PSS: Can't enable MPU. MIDI synth microcode not available.\n");
761 if (!pss_download_boot(devc, pss_synth, pss_synthLen, CPF_FIRST | CPF_LAST))
763 printk(KERN_ERR "PSS: Unable to load MIDI synth microcode to DSP.\n");
768 * Finally wait until the DSP algorithm has initialized itself and
769 * deactivates receive interrupt.
772 for (timeout = 900000; timeout > 0; timeout--)
774 if ((inb(hw_config->io_base + 1) & 0x80) == 0) /* Input data avail */
775 inb(hw_config->io_base); /* Discard it */
777 break; /* No more input */
780 return probe_mpu401(hw_config);
783 static int pss_coproc_open(void *dev_info, int sub_device)
788 if (pss_synthLen == 0)
790 printk(KERN_ERR "PSS: MIDI synth microcode not available.\n");
793 if (nonstandard_microcode)
794 if (!pss_download_boot(devc, pss_synth, pss_synthLen, CPF_FIRST | CPF_LAST))
796 printk(KERN_ERR "PSS: Unable to load MIDI synth microcode to DSP.\n");
799 nonstandard_microcode = 0;
808 static void pss_coproc_close(void *dev_info, int sub_device)
813 static void pss_coproc_reset(void *dev_info)
816 if (!pss_download_boot(devc, pss_synth, pss_synthLen, CPF_FIRST | CPF_LAST))
818 printk(KERN_ERR "PSS: Unable to load MIDI synth microcode to DSP.\n");
820 nonstandard_microcode = 0;
823 static int download_boot_block(void *dev_info, copr_buffer * buf)
825 if (buf->len <= 0 || buf->len > sizeof(buf->data))
828 if (!pss_download_boot(devc, buf->data, buf->len, buf->flags))
830 printk(KERN_ERR "PSS: Unable to load microcode block to DSP.\n");
833 nonstandard_microcode = 1; /* The MIDI microcode has been overwritten */
837 static int pss_coproc_ioctl(void *dev_info, unsigned int cmd, caddr_t arg, int local)
844 unsigned short *data;
846 /* printk( "PSS coproc ioctl %x %x %d\n", cmd, arg, local); */
850 case SNDCTL_COPR_RESET:
851 pss_coproc_reset(dev_info);
854 case SNDCTL_COPR_LOAD:
855 buf = (copr_buffer *) vmalloc(sizeof(copr_buffer));
858 if (copy_from_user(buf, arg, sizeof(copr_buffer))) {
862 err = download_boot_block(dev_info, buf);
866 case SNDCTL_COPR_SENDMSG:
867 mbuf = (copr_msg *)vmalloc(sizeof(copr_msg));
870 if (copy_from_user(mbuf, arg, sizeof(copr_msg))) {
874 data = (unsigned short *)(mbuf->data);
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));
883 return err ? -EFAULT : -EIO;
886 restore_flags(flags);
890 case SNDCTL_COPR_RCVMSG:
892 mbuf = (copr_msg *)vmalloc(sizeof(copr_msg));
895 data = (unsigned short *)mbuf->data;
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++)) {
906 restore_flags(flags);
907 if (copy_to_user(arg, mbuf, sizeof(copr_msg)))
912 case SNDCTL_COPR_RDATA:
913 if (copy_from_user(&dbuf, arg, sizeof(dbuf)))
917 if (!pss_put_dspword(devc, 0x00d0)) {
918 restore_flags(flags);
921 if (!pss_put_dspword(devc, (unsigned short)(dbuf.parm1 & 0xffff))) {
922 restore_flags(flags);
925 if (!pss_get_dspword(devc, &tmp)) {
926 restore_flags(flags);
930 restore_flags(flags);
931 if (copy_to_user(arg, &dbuf, sizeof(dbuf)))
935 case SNDCTL_COPR_WDATA:
936 if (copy_from_user(&dbuf, arg, sizeof(dbuf)))
940 if (!pss_put_dspword(devc, 0x00d1)) {
941 restore_flags(flags);
944 if (!pss_put_dspword(devc, (unsigned short) (dbuf.parm1 & 0xffff))) {
945 restore_flags(flags);
948 tmp = (unsigned int)dbuf.parm2 & 0xffff;
949 if (!pss_put_dspword(devc, tmp)) {
950 restore_flags(flags);
953 restore_flags(flags);
956 case SNDCTL_COPR_WCODE:
957 if (copy_from_user(&dbuf, arg, sizeof(dbuf)))
961 if (!pss_put_dspword(devc, 0x00d3)) {
962 restore_flags(flags);
965 if (!pss_put_dspword(devc, (unsigned short)(dbuf.parm1 & 0xffff))) {
966 restore_flags(flags);
969 tmp = (unsigned int)dbuf.parm2 & 0x00ff;
970 if (!pss_put_dspword(devc, tmp)) {
971 restore_flags(flags);
974 tmp = ((unsigned int)dbuf.parm2 >> 8) & 0xffff;
975 if (!pss_put_dspword(devc, tmp)) {
976 restore_flags(flags);
979 restore_flags(flags);
982 case SNDCTL_COPR_RCODE:
983 if (copy_from_user(&dbuf, arg, sizeof(dbuf)))
987 if (!pss_put_dspword(devc, 0x00d2)) {
988 restore_flags(flags);
991 if (!pss_put_dspword(devc, (unsigned short)(dbuf.parm1 & 0xffff))) {
992 restore_flags(flags);
995 if (!pss_get_dspword(devc, &tmp)) { /* Read MSB */
996 restore_flags(flags);
999 dbuf.parm1 = tmp << 8;
1000 if (!pss_get_dspword(devc, &tmp)) { /* Read LSB */
1001 restore_flags(flags);
1004 dbuf.parm1 |= tmp & 0x00ff;
1005 restore_flags(flags);
1006 if (copy_to_user(arg, &dbuf, sizeof(dbuf)))
1016 static coproc_operations pss_coproc_operations =
1027 static void __init attach_pss_mpu(struct address_info *hw_config)
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;
1034 static int __init probe_pss_mss(struct address_info *hw_config)
1036 volatile int timeout;
1038 if (!pss_initialized)
1041 if (check_region(hw_config->io_base, 8))
1043 printk(KERN_ERR "PSS: WSS I/O port conflicts.\n");
1046 if (!set_io_base(devc, CONF_WSS, hw_config->io_base))
1048 printk("PSS: WSS base not settable.\n");
1051 if (!set_irq(devc, CONF_WSS, hw_config->irq))
1053 printk("PSS: WSS IRQ allocation error.\n");
1056 if (!set_dma(devc, CONF_WSS, hw_config->dma))
1058 printk(KERN_ERR "PSS: WSS DMA allocation error\n");
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.
1067 for (timeout = 0; timeout < 100000 && (inb(hw_config->io_base + WSS_INDEX) &
1068 WSS_INITIALIZING); timeout++)
1071 outb((0x0b), hw_config->io_base + WSS_INDEX); /* Required by some cards */
1073 for (timeout = 0; (inb(hw_config->io_base + WSS_DATA) & WSS_AUTOCALIBRATION) &&
1074 (timeout < 100000); timeout++)
1077 return probe_ms_sound(hw_config);
1080 static void __init attach_pss_mss(struct address_info *hw_config)
1082 int my_mix = -999; /* gcc shut up */
1084 devc->ad_mixer_dev = NO_WSS_MIXER;
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),
1093 printk(KERN_ERR "Could not install PSS mixer\n");
1097 pss_mixer_reset(devc);
1098 attach_ms_sound(hw_config, THIS_MODULE); /* Slot 0 */
1100 if (hw_config->slots[0] != -1)
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)))
1106 /* The MSS mixer installed */
1107 devc->ad_mixer_dev = audio_devs[hw_config->slots[0]]->mixer_dev;
1112 static inline void __exit unload_pss(struct address_info *hw_config)
1114 release_region(hw_config->io_base, 0x10);
1115 release_region(hw_config->io_base+0x10, 0x9);
1118 static inline void __exit unload_pss_mpu(struct address_info *hw_config)
1120 unload_mpu401(hw_config);
1123 static inline void __exit unload_pss_mss(struct address_info *hw_config)
1125 unload_ms_sound(hw_config);
1129 static struct address_info cfg;
1130 static struct address_info cfg2;
1131 static struct address_info cfg_mpu;
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";
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");
1172 static int fw_load = 0;
1173 static int pssmpu = 0, pssmss = 0;
1176 * Load a PSS sound card module
1179 static int __init init_pss(void)
1182 if(pss_no_sound) /* If configuring only nonsound components */
1184 cfg.io_base = pss_io;
1185 if(!probe_pss(&cfg))
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();
1194 cfg.io_base = pss_io;
1196 cfg2.io_base = mss_io;
1200 cfg_mpu.io_base = mpu_io;
1201 cfg_mpu.irq = mpu_irq;
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");
1210 pss_synthLen = mod_firmware_load(pss_firmware, (void *) &pss_synth);
1212 if (!probe_pss(&cfg))
1218 if (probe_pss_mpu(&cfg_mpu)) {
1220 attach_pss_mpu(&cfg_mpu);
1222 if (probe_pss_mss(&cfg2)) {
1224 attach_pss_mss(&cfg2);
1230 static void __exit cleanup_pss(void)
1234 if(fw_load && pss_synth)
1237 unload_pss_mss(&cfg2);
1239 unload_pss_mpu(&cfg_mpu);
1243 if(!pss_keep_settings) /* Keep hardware settings if asked */
1245 disable_all_emulations();
1246 printk(KERN_INFO "Resetting PSS sound card configurations.\n");
1250 module_init(init_pss);
1251 module_exit(cleanup_pss);
1254 static int __init setup_pss(char *str)
1256 /* io, mss_io, mss_irq, mss_dma, mpu_io, mpu_irq */
1259 str = get_options(str, ARRAY_SIZE(ints), ints);
1271 __setup("pss=", setup_pss);