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 * 00-03-03: Christoph Hellwig <chhellwig@gmx.net>
28 * Adapted to module_init/module_exit
32 #include <linux/config.h>
33 #include <linux/init.h>
34 #include <linux/module.h>
36 #include "sound_config.h"
37 #include "sound_firmware.h"
38 #include "soundmodule.h"
46 #define REG(x) (devc->base+x)
60 #define CONF_CDROM 0x16
61 #define CONF_MIDI 0x18
66 #define PSS_FLAG3 0x0800
67 #define PSS_FLAG2 0x0400
68 #define PSS_FLAG1 0x1000
69 #define PSS_FLAG0 0x0800
70 #define PSS_WRITE_EMPTY 0x8000
71 #define PSS_READ_FULL 0x4000
82 #define WSS_INITIALIZING 0x80
83 #define WSS_AUTOCALIBRATION 0x20
85 #define NO_WSS_MIXER -1
90 /* If compiled into kernel, it enable or disable pss mixer */
91 #ifdef CONFIG_PSS_MIXER
92 static unsigned char pss_mixer
= 1;
94 static unsigned char pss_mixer
= 0;
98 typedef struct pss_mixerdata
{
99 unsigned int volume_l
;
100 unsigned int volume_r
;
106 typedef struct pss_confdata
{
115 static pss_confdata pss_data
;
116 static pss_confdata
*devc
= &pss_data
;
118 static int pss_initialized
= 0;
119 static int nonstandard_microcode
= 0;
121 static void pss_write(pss_confdata
*devc
, int data
)
125 limit
= jiffies
+ HZ
/10; /* The timeout is 0.1 seconds */
127 * Note! the i<5000000 is an emergency exit. The dsp_command() is sometimes
128 * called while interrupts are disabled. This means that the timer is
129 * disabled also. However the timeout situation is a abnormal condition.
130 * Normally the DSP should be ready to accept commands after just couple of
134 for (i
= 0; i
< 5000000 && time_before(jiffies
, limit
); i
++)
136 if (inw(REG(PSS_STATUS
)) & PSS_WRITE_EMPTY
)
138 outw(data
, REG(PSS_DATA
));
142 printk(KERN_WARNING
"PSS: DSP Command (%04x) Timeout.\n", data
);
145 int probe_pss(struct address_info
*hw_config
)
150 devc
->base
= hw_config
->io_base
;
151 irq
= devc
->irq
= hw_config
->irq
;
152 dma
= devc
->dma
= hw_config
->dma
;
153 devc
->osp
= hw_config
->osp
;
155 if (devc
->base
!= 0x220 && devc
->base
!= 0x240)
156 if (devc
->base
!= 0x230 && devc
->base
!= 0x250) /* Some cards use these */
159 if (check_region(devc
->base
, 0x19 /*16*/)) {
160 printk(KERN_ERR
"PSS: I/O port conflict\n");
163 id
= inw(REG(PSS_ID
));
164 if ((id
>> 8) != 'E') {
165 printk(KERN_ERR
"No PSS signature detected at 0x%x (0x%x)\n", devc
->base
, id
);
171 static int set_irq(pss_confdata
* devc
, int dev
, int irq
)
173 static unsigned short irq_bits
[16] =
175 0x0000, 0x0000, 0x0000, 0x0008,
176 0x0000, 0x0010, 0x0000, 0x0018,
177 0x0000, 0x0020, 0x0028, 0x0030,
178 0x0038, 0x0000, 0x0000, 0x0000
181 unsigned short tmp
, bits
;
183 if (irq
< 0 || irq
> 15)
186 tmp
= inw(REG(dev
)) & ~0x38; /* Load confreg, mask IRQ bits out */
188 if ((bits
= irq_bits
[irq
]) == 0 && irq
!= 0)
190 printk(KERN_ERR
"PSS: Invalid IRQ %d\n", irq
);
193 outw(tmp
| bits
, REG(dev
));
197 static int set_io_base(pss_confdata
* devc
, int dev
, int base
)
199 unsigned short tmp
= inw(REG(dev
)) & 0x003f;
200 unsigned short bits
= (base
& 0x0ffc) << 4;
202 outw(bits
| tmp
, REG(dev
));
207 static int set_dma(pss_confdata
* devc
, int dev
, int dma
)
209 static unsigned short dma_bits
[8] =
211 0x0001, 0x0002, 0x0000, 0x0003,
212 0x0000, 0x0005, 0x0006, 0x0007
215 unsigned short tmp
, bits
;
217 if (dma
< 0 || dma
> 7)
220 tmp
= inw(REG(dev
)) & ~0x07; /* Load confreg, mask DMA bits out */
222 if ((bits
= dma_bits
[dma
]) == 0 && dma
!= 4)
224 printk(KERN_ERR
"PSS: Invalid DMA %d\n", dma
);
227 outw(tmp
| bits
, REG(dev
));
231 static int pss_reset_dsp(pss_confdata
* devc
)
233 unsigned long i
, limit
= jiffies
+ HZ
/10;
235 outw(0x2000, REG(PSS_CONTROL
));
236 for (i
= 0; i
< 32768 && (limit
-jiffies
>= 0); i
++)
237 inw(REG(PSS_CONTROL
));
238 outw(0x0000, REG(PSS_CONTROL
));
242 static int pss_put_dspword(pss_confdata
* devc
, unsigned short word
)
246 for (i
= 0; i
< 327680; i
++)
248 val
= inw(REG(PSS_STATUS
));
249 if (val
& PSS_WRITE_EMPTY
)
251 outw(word
, REG(PSS_DATA
));
258 static int pss_get_dspword(pss_confdata
* devc
, unsigned short *word
)
262 for (i
= 0; i
< 327680; i
++)
264 val
= inw(REG(PSS_STATUS
));
265 if (val
& PSS_READ_FULL
)
267 *word
= inw(REG(PSS_DATA
));
274 static int pss_download_boot(pss_confdata
* devc
, unsigned char *block
, int size
, int flags
)
276 int i
, limit
, val
, count
;
278 if (flags
& CPF_FIRST
)
280 /*_____ Warn DSP software that a boot is coming */
281 outw(0x00fe, REG(PSS_DATA
));
283 limit
= jiffies
+ HZ
/10;
284 for (i
= 0; i
< 32768 && time_before(jiffies
, limit
); i
++)
285 if (inw(REG(PSS_DATA
)) == 0x5500)
288 outw(*block
++, REG(PSS_DATA
));
292 while ((flags
&CPF_LAST
) || count
<size
)
296 for (j
= 0; j
< 327670; j
++)
298 /*_____ Wait for BG to appear */
299 if (inw(REG(PSS_STATUS
)) & PSS_FLAG3
)
305 /* It's ok we timed out when the file was empty */
306 if (count
>= size
&& flags
& CPF_LAST
)
311 printk(KERN_ERR
"PSS: Download timeout problems, byte %d=%d\n", count
, size
);
315 /*_____ Send the next byte */
318 /* If not data in block send 0xffff */
319 outw (0xffff, REG (PSS_DATA
));
323 /*_____ Send the next byte */
324 outw (*block
++, REG (PSS_DATA
));
329 if (flags
& CPF_LAST
)
332 outw(0, REG(PSS_DATA
));
334 limit
= jiffies
+ HZ
/10;
335 for (i
= 0; i
< 32768 && (limit
- jiffies
>= 0); i
++)
336 val
= inw(REG(PSS_STATUS
));
338 limit
= jiffies
+ HZ
/10;
339 for (i
= 0; i
< 32768 && (limit
-jiffies
>= 0); i
++)
341 val
= inw(REG(PSS_STATUS
));
346 /* now read the version */
347 for (i
= 0; i
< 32000; i
++)
349 val
= inw(REG(PSS_STATUS
));
350 if (val
& PSS_READ_FULL
)
356 val
= inw(REG(PSS_DATA
));
357 /* printk( "<PSS: microcode version %d.%d loaded>", val/16, val % 16); */
363 static void set_master_volume(pss_confdata
*devc
, int left
, int right
)
365 static unsigned char log_scale
[101] = {
366 0xdb, 0xe0, 0xe3, 0xe5, 0xe7, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xed, 0xee,
367 0xef, 0xef, 0xf0, 0xf0, 0xf1, 0xf1, 0xf2, 0xf2, 0xf2, 0xf3, 0xf3, 0xf3,
368 0xf4, 0xf4, 0xf4, 0xf5, 0xf5, 0xf5, 0xf5, 0xf6, 0xf6, 0xf6, 0xf6, 0xf7,
369 0xf7, 0xf7, 0xf7, 0xf7, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf9, 0xf9, 0xf9,
370 0xf9, 0xf9, 0xf9, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xfb, 0xfb,
371 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc,
372 0xfc, 0xfc, 0xfc, 0xfc, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd,
373 0xfd, 0xfd, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
374 0xfe, 0xfe, 0xff, 0xff, 0xff
376 pss_write(devc
, 0x0010);
377 pss_write(devc
, log_scale
[left
] | 0x0000);
378 pss_write(devc
, 0x0010);
379 pss_write(devc
, log_scale
[right
] | 0x0100);
382 static void set_synth_volume(pss_confdata
*devc
, int volume
)
384 int vol
= ((0x8000*volume
)/100L);
385 pss_write(devc
, 0x0080);
386 pss_write(devc
, vol
);
387 pss_write(devc
, 0x0081);
388 pss_write(devc
, vol
);
391 static void set_bass(pss_confdata
*devc
, int level
)
393 int vol
= (int)(((0xfd - 0xf0) * level
)/100L) + 0xf0;
394 pss_write(devc
, 0x0010);
395 pss_write(devc
, vol
| 0x0200);
398 static void set_treble(pss_confdata
*devc
, int level
)
400 int vol
= (((0xfd - 0xf0) * level
)/100L) + 0xf0;
401 pss_write(devc
, 0x0010);
402 pss_write(devc
, vol
| 0x0300);
405 static void pss_mixer_reset(pss_confdata
*devc
)
407 set_master_volume(devc
, 33, 33);
409 set_treble(devc
, 50);
410 set_synth_volume(devc
, 30);
411 pss_write (devc
, 0x0010);
412 pss_write (devc
, 0x0800 | 0xce); /* Stereo */
416 devc
->mixer
.volume_l
= devc
->mixer
.volume_r
= 33;
417 devc
->mixer
.bass
= 50;
418 devc
->mixer
.treble
= 50;
419 devc
->mixer
.synth
= 30;
423 static void arg_to_volume_mono(unsigned int volume
, int *aleft
)
427 left
= volume
& 0x00ff;
433 static void arg_to_volume_stereo(unsigned int volume
, int *aleft
, int *aright
)
435 arg_to_volume_mono(volume
, aleft
);
436 arg_to_volume_mono(volume
>> 8, aright
);
439 static int ret_vol_mono(int left
)
441 return ((left
<< 8) | left
);
444 static int ret_vol_stereo(int left
, int right
)
446 return ((right
<< 8) | left
);
449 static int call_ad_mixer(pss_confdata
*devc
,unsigned int cmd
, caddr_t arg
)
451 if (devc
->ad_mixer_dev
!= NO_WSS_MIXER
)
452 return mixer_devs
[devc
->ad_mixer_dev
]->ioctl(devc
->ad_mixer_dev
, cmd
, arg
);
457 static int pss_mixer_ioctl (int dev
, unsigned int cmd
, caddr_t arg
)
459 pss_confdata
*devc
= mixer_devs
[dev
]->devc
;
460 int cmdf
= cmd
& 0xff;
462 if ((cmdf
!= SOUND_MIXER_VOLUME
) && (cmdf
!= SOUND_MIXER_BASS
) &&
463 (cmdf
!= SOUND_MIXER_TREBLE
) && (cmdf
!= SOUND_MIXER_SYNTH
) &&
464 (cmdf
!= SOUND_MIXER_DEVMASK
) && (cmdf
!= SOUND_MIXER_STEREODEVS
) &&
465 (cmdf
!= SOUND_MIXER_RECMASK
) && (cmdf
!= SOUND_MIXER_CAPS
) &&
466 (cmdf
!= SOUND_MIXER_RECSRC
))
468 return call_ad_mixer(devc
, cmd
, arg
);
471 if (((cmd
>> 8) & 0xff) != 'M')
474 if (_SIOC_DIR (cmd
) & _SIOC_WRITE
)
478 case SOUND_MIXER_RECSRC
:
479 if (devc
->ad_mixer_dev
!= NO_WSS_MIXER
)
480 return call_ad_mixer(devc
, cmd
, arg
);
483 if (*(int *)arg
!= 0)
487 case SOUND_MIXER_VOLUME
:
488 arg_to_volume_stereo(*(unsigned int *)arg
, &devc
->mixer
.volume_l
,
489 &devc
->mixer
.volume_r
);
490 set_master_volume(devc
, devc
->mixer
.volume_l
,
491 devc
->mixer
.volume_r
);
492 return ret_vol_stereo(devc
->mixer
.volume_l
,
493 devc
->mixer
.volume_r
);
495 case SOUND_MIXER_BASS
:
496 arg_to_volume_mono(*(unsigned int *)arg
,
498 set_bass(devc
, devc
->mixer
.bass
);
499 return ret_vol_mono(devc
->mixer
.bass
);
501 case SOUND_MIXER_TREBLE
:
502 arg_to_volume_mono(*(unsigned int *)arg
,
503 &devc
->mixer
.treble
);
504 set_treble(devc
, devc
->mixer
.treble
);
505 return ret_vol_mono(devc
->mixer
.treble
);
507 case SOUND_MIXER_SYNTH
:
508 arg_to_volume_mono(*(unsigned int *)arg
,
510 set_synth_volume(devc
, devc
->mixer
.synth
);
511 return ret_vol_mono(devc
->mixer
.synth
);
525 case SOUND_MIXER_DEVMASK
:
526 if (call_ad_mixer(devc
, cmd
, arg
) == -EINVAL
)
527 *(int *)arg
= 0; /* no mixer devices */
528 return (*(int *)arg
|= SOUND_MASK_VOLUME
| SOUND_MASK_BASS
| SOUND_MASK_TREBLE
| SOUND_MASK_SYNTH
);
530 case SOUND_MIXER_STEREODEVS
:
531 if (call_ad_mixer(devc
, cmd
, arg
) == -EINVAL
)
532 *(int *)arg
= 0; /* no stereo devices */
533 return (*(int *)arg
|= SOUND_MASK_VOLUME
);
535 case SOUND_MIXER_RECMASK
:
536 if (devc
->ad_mixer_dev
!= NO_WSS_MIXER
)
537 return call_ad_mixer(devc
, cmd
, arg
);
539 return (*(int *)arg
= 0); /* no record devices */
541 case SOUND_MIXER_CAPS
:
542 if (devc
->ad_mixer_dev
!= NO_WSS_MIXER
)
543 return call_ad_mixer(devc
, cmd
, arg
);
545 return (*(int *)arg
= SOUND_CAP_EXCL_INPUT
);
547 case SOUND_MIXER_RECSRC
:
548 if (devc
->ad_mixer_dev
!= NO_WSS_MIXER
)
549 return call_ad_mixer(devc
, cmd
, arg
);
551 return (*(int *)arg
= 0); /* no record source */
553 case SOUND_MIXER_VOLUME
:
554 return (*(int *)arg
= ret_vol_stereo(devc
->mixer
.volume_l
, devc
->mixer
.volume_r
));
556 case SOUND_MIXER_BASS
:
557 return (*(int *)arg
= ret_vol_mono(devc
->mixer
.bass
));
559 case SOUND_MIXER_TREBLE
:
560 return (*(int *)arg
= ret_vol_mono(devc
->mixer
.treble
));
562 case SOUND_MIXER_SYNTH
:
563 return (*(int *)arg
= ret_vol_mono(devc
->mixer
.synth
));
570 static struct mixer_operations pss_mixer_operations
=
577 void attach_pss(struct address_info
*hw_config
)
582 devc
->base
= hw_config
->io_base
;
583 devc
->irq
= hw_config
->irq
;
584 devc
->dma
= hw_config
->dma
;
585 devc
->osp
= hw_config
->osp
;
586 devc
->ad_mixer_dev
= NO_WSS_MIXER
;
588 if (!probe_pss(hw_config
))
591 request_region(hw_config
->io_base
, 0x10, "PSS mixer, SB emulation");
592 request_region(hw_config
->io_base
+ 0x10, 0x9, "PSS config");
594 id
= inw(REG(PSS_ID
)) & 0x00ff;
597 * Disable all emulations. Will be enabled later (if required).
599 outw(0x0000, REG(CONF_PSS
)); /* 0x0400 enables joystick */
600 outw(0x0000, REG(CONF_WSS
));
601 outw(0x0000, REG(CONF_SB
));
602 outw(0x0000, REG(CONF_MIDI
));
603 outw(0x0000, REG(CONF_CDROM
));
605 #if YOU_REALLY_WANT_TO_ALLOCATE_THESE_RESOURCES
606 if (sound_alloc_dma(hw_config
->dma
, "PSS"))
608 printk("pss.c: Can't allocate DMA channel.\n");
611 if (!set_irq(devc
, CONF_PSS
, devc
->irq
))
613 printk("PSS: IRQ allocation error.\n");
616 if (!set_dma(devc
, CONF_PSS
, devc
->dma
))
618 printk(KERN_ERR
"PSS: DMA allocation error\n");
624 sprintf(tmp
, "ECHO-PSS Rev. %d", id
);
625 conf_printf(tmp
, hw_config
);
628 int probe_pss_mpu(struct address_info
*hw_config
)
632 if (!pss_initialized
)
635 if (check_region(hw_config
->io_base
, 2))
637 printk(KERN_ERR
"PSS: MPU I/O port conflict\n");
640 if (!set_io_base(devc
, CONF_MIDI
, hw_config
->io_base
))
642 printk(KERN_ERR
"PSS: MIDI base could not be set.\n");
645 if (!set_irq(devc
, CONF_MIDI
, hw_config
->irq
))
647 printk(KERN_ERR
"PSS: MIDI IRQ allocation error.\n");
652 printk(KERN_ERR
"PSS: Can't enable MPU. MIDI synth microcode not available.\n");
655 if (!pss_download_boot(devc
, pss_synth
, pss_synthLen
, CPF_FIRST
| CPF_LAST
))
657 printk(KERN_ERR
"PSS: Unable to load MIDI synth microcode to DSP.\n");
662 * Finally wait until the DSP algorithm has initialized itself and
663 * deactivates receive interrupt.
666 for (timeout
= 900000; timeout
> 0; timeout
--)
668 if ((inb(hw_config
->io_base
+ 1) & 0x80) == 0) /* Input data avail */
669 inb(hw_config
->io_base
); /* Discard it */
671 break; /* No more input */
674 return probe_mpu401(hw_config
);
677 static int pss_coproc_open(void *dev_info
, int sub_device
)
682 if (pss_synthLen
== 0)
684 printk(KERN_ERR
"PSS: MIDI synth microcode not available.\n");
687 if (nonstandard_microcode
)
688 if (!pss_download_boot(devc
, pss_synth
, pss_synthLen
, CPF_FIRST
| CPF_LAST
))
690 printk(KERN_ERR
"PSS: Unable to load MIDI synth microcode to DSP.\n");
693 nonstandard_microcode
= 0;
701 static void pss_coproc_close(void *dev_info
, int sub_device
)
706 static void pss_coproc_reset(void *dev_info
)
709 if (!pss_download_boot(devc
, pss_synth
, pss_synthLen
, CPF_FIRST
| CPF_LAST
))
711 printk(KERN_ERR
"PSS: Unable to load MIDI synth microcode to DSP.\n");
713 nonstandard_microcode
= 0;
716 static int download_boot_block(void *dev_info
, copr_buffer
* buf
)
718 if (buf
->len
<= 0 || buf
->len
> sizeof(buf
->data
))
721 if (!pss_download_boot(devc
, buf
->data
, buf
->len
, buf
->flags
))
723 printk(KERN_ERR
"PSS: Unable to load microcode block to DSP.\n");
726 nonstandard_microcode
= 1; /* The MIDI microcode has been overwritten */
730 static int pss_coproc_ioctl(void *dev_info
, unsigned int cmd
, caddr_t arg
, int local
)
737 unsigned short *data
;
739 /* printk( "PSS coproc ioctl %x %x %d\n", cmd, arg, local); */
743 case SNDCTL_COPR_RESET
:
744 pss_coproc_reset(dev_info
);
747 case SNDCTL_COPR_LOAD
:
748 buf
= (copr_buffer
*) vmalloc(sizeof(copr_buffer
));
751 if (copy_from_user(buf
, arg
, sizeof(copr_buffer
))) {
755 err
= download_boot_block(dev_info
, buf
);
759 case SNDCTL_COPR_SENDMSG
:
760 mbuf
= (copr_msg
*)vmalloc(sizeof(copr_msg
));
763 if (copy_from_user(mbuf
, arg
, sizeof(copr_msg
))) {
767 data
= (unsigned short *)(mbuf
->data
);
770 for (i
= 0; i
< mbuf
->len
; i
++) {
771 if (!pss_put_dspword(devc
, *data
++)) {
772 restore_flags(flags
);
773 mbuf
->len
= i
; /* feed back number of WORDs sent */
774 err
= copy_to_user(arg
, mbuf
, sizeof(copr_msg
));
776 return err
? -EFAULT
: -EIO
;
779 restore_flags(flags
);
783 case SNDCTL_COPR_RCVMSG
:
785 mbuf
= (copr_msg
*)vmalloc(sizeof(copr_msg
));
788 data
= (unsigned short *)mbuf
->data
;
791 for (i
= 0; i
< sizeof(mbuf
->data
)/sizeof(unsigned short); i
++) {
792 mbuf
->len
= i
; /* feed back number of WORDs read */
793 if (!pss_get_dspword(devc
, data
++)) {
799 restore_flags(flags
);
800 if (copy_to_user(arg
, mbuf
, sizeof(copr_msg
)))
805 case SNDCTL_COPR_RDATA
:
806 if (copy_from_user(&dbuf
, arg
, sizeof(dbuf
)))
810 if (!pss_put_dspword(devc
, 0x00d0)) {
811 restore_flags(flags
);
814 if (!pss_put_dspword(devc
, (unsigned short)(dbuf
.parm1
& 0xffff))) {
815 restore_flags(flags
);
818 if (!pss_get_dspword(devc
, &tmp
)) {
819 restore_flags(flags
);
823 restore_flags(flags
);
824 if (copy_to_user(arg
, &dbuf
, sizeof(dbuf
)))
828 case SNDCTL_COPR_WDATA
:
829 if (copy_from_user(&dbuf
, arg
, sizeof(dbuf
)))
833 if (!pss_put_dspword(devc
, 0x00d1)) {
834 restore_flags(flags
);
837 if (!pss_put_dspword(devc
, (unsigned short) (dbuf
.parm1
& 0xffff))) {
838 restore_flags(flags
);
841 tmp
= (unsigned int)dbuf
.parm2
& 0xffff;
842 if (!pss_put_dspword(devc
, tmp
)) {
843 restore_flags(flags
);
846 restore_flags(flags
);
849 case SNDCTL_COPR_WCODE
:
850 if (copy_from_user(&dbuf
, arg
, sizeof(dbuf
)))
854 if (!pss_put_dspword(devc
, 0x00d3)) {
855 restore_flags(flags
);
858 if (!pss_put_dspword(devc
, (unsigned short)(dbuf
.parm1
& 0xffff))) {
859 restore_flags(flags
);
862 tmp
= (unsigned int)dbuf
.parm2
& 0x00ff;
863 if (!pss_put_dspword(devc
, tmp
)) {
864 restore_flags(flags
);
867 tmp
= ((unsigned int)dbuf
.parm2
>> 8) & 0xffff;
868 if (!pss_put_dspword(devc
, tmp
)) {
869 restore_flags(flags
);
872 restore_flags(flags
);
875 case SNDCTL_COPR_RCODE
:
876 if (copy_from_user(&dbuf
, arg
, sizeof(dbuf
)))
880 if (!pss_put_dspword(devc
, 0x00d2)) {
881 restore_flags(flags
);
884 if (!pss_put_dspword(devc
, (unsigned short)(dbuf
.parm1
& 0xffff))) {
885 restore_flags(flags
);
888 if (!pss_get_dspword(devc
, &tmp
)) { /* Read MSB */
889 restore_flags(flags
);
892 dbuf
.parm1
= tmp
<< 8;
893 if (!pss_get_dspword(devc
, &tmp
)) { /* Read LSB */
894 restore_flags(flags
);
897 dbuf
.parm1
|= tmp
& 0x00ff;
898 restore_flags(flags
);
899 if (copy_to_user(arg
, &dbuf
, sizeof(dbuf
)))
909 static coproc_operations pss_coproc_operations
=
919 static void __init
attach_pss_mpu(struct address_info
*hw_config
)
921 attach_mpu401(hw_config
); /* Slot 1 */
922 if (hw_config
->slots
[1] != -1) /* The MPU driver installed itself */
923 midi_devs
[hw_config
->slots
[1]]->coproc
= &pss_coproc_operations
;
926 static int __init
probe_pss_mss(struct address_info
*hw_config
)
928 volatile int timeout
;
930 if (!pss_initialized
)
933 if (check_region(hw_config
->io_base
, 8))
935 printk(KERN_ERR
"PSS: WSS I/O port conflicts.\n");
938 if (!set_io_base(devc
, CONF_WSS
, hw_config
->io_base
))
940 printk("PSS: WSS base not settable.\n");
943 if (!set_irq(devc
, CONF_WSS
, hw_config
->irq
))
945 printk("PSS: WSS IRQ allocation error.\n");
948 if (!set_dma(devc
, CONF_WSS
, hw_config
->dma
))
950 printk(KERN_ERR
"PSS: WSS DMA allocation error\n");
954 * For some reason the card returns 0xff in the WSS status register
955 * immediately after boot. Probably MIDI+SB emulation algorithm
956 * downloaded to the ADSP2115 spends some time initializing the card.
957 * Let's try to wait until it finishes this task.
959 for (timeout
= 0; timeout
< 100000 && (inb(hw_config
->io_base
+ WSS_INDEX
) &
960 WSS_INITIALIZING
); timeout
++)
963 outb((0x0b), hw_config
->io_base
+ WSS_INDEX
); /* Required by some cards */
965 for (timeout
= 0; (inb(hw_config
->io_base
+ WSS_DATA
) & WSS_AUTOCALIBRATION
) &&
966 (timeout
< 100000); timeout
++)
969 return probe_ms_sound(hw_config
);
972 static void __init
attach_pss_mss(struct address_info
*hw_config
)
974 int my_mix
= -999; /* gcc shut up */
976 devc
->ad_mixer_dev
= NO_WSS_MIXER
;
979 if ((my_mix
= sound_install_mixer (MIXER_DRIVER_VERSION
,
980 "PSS-SPEAKERS and AD1848 (through MSS audio codec)",
981 &pss_mixer_operations
,
982 sizeof (struct mixer_operations
),
985 printk(KERN_ERR
"Could not install PSS mixer\n");
989 pss_mixer_reset(devc
);
990 attach_ms_sound(hw_config
); /* Slot 0 */
992 if (hw_config
->slots
[0] != -1)
994 /* The MSS driver installed itself */
995 audio_devs
[hw_config
->slots
[0]]->coproc
= &pss_coproc_operations
;
996 if (pss_mixer
&& (num_mixers
== (my_mix
+ 2)))
998 /* The MSS mixer installed */
999 devc
->ad_mixer_dev
= audio_devs
[hw_config
->slots
[0]]->mixer_dev
;
1004 static inline void __exit
unload_pss(struct address_info
*hw_config
)
1006 release_region(hw_config
->io_base
, 0x10);
1007 release_region(hw_config
->io_base
+0x10, 0x9);
1010 static inline void __exit
unload_pss_mpu(struct address_info
*hw_config
)
1012 unload_mpu401(hw_config
);
1015 static inline void __exit
unload_pss_mss(struct address_info
*hw_config
)
1017 unload_ms_sound(hw_config
);
1021 static struct address_info cfg
;
1022 static struct address_info cfg2
;
1023 static struct address_info cfg_mpu
;
1025 static int pss_io __initdata
= -1;
1026 static int mss_io __initdata
= -1;
1027 static int mss_irq __initdata
= -1;
1028 static int mss_dma __initdata
= -1;
1029 static int mpu_io __initdata
= -1;
1030 static int mpu_irq __initdata
= -1;
1032 MODULE_PARM(pss_io
, "i");
1033 MODULE_PARM_DESC(pss_io
, "Set i/o base of PSS card (probably 0x220 or 0x240)");
1034 MODULE_PARM(mss_io
, "i");
1035 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)");
1036 MODULE_PARM(mss_irq
, "i");
1037 MODULE_PARM_DESC(mss_irq
, "Set WSS (audio) IRQ (3, 5, 7, 9, 10, 11, 12)");
1038 MODULE_PARM(mss_dma
, "i");
1039 MODULE_PARM_DESC(mss_dma
, "Set WSS (audio) DMA (0, 1, 3)");
1040 MODULE_PARM(mpu_io
, "i");
1041 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)");
1042 MODULE_PARM(mpu_irq
, "i");
1043 MODULE_PARM_DESC(mpu_irq
, "Set MIDI IRQ (3, 5, 7, 9, 10, 11, 12)");
1044 MODULE_PARM(pss_mixer
, "b");
1045 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.");
1046 MODULE_AUTHOR("Hannu Savolainen, Vladimir Michl");
1047 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).\n");
1049 static int fw_load
= 0;
1050 static int pssmpu
= 0, pssmss
= 0;
1053 * Load a PSS sound card module
1056 static int __init
init_pss(void)
1058 cfg
.io_base
= pss_io
;
1060 cfg2
.io_base
= mss_io
;
1064 cfg_mpu
.io_base
= mpu_io
;
1065 cfg_mpu
.irq
= mpu_irq
;
1067 if (cfg
.io_base
== -1 || cfg2
.io_base
== -1 || cfg2
.irq
== -1 || cfg
.dma
== -1) {
1068 printk(KERN_INFO
"pss: mss_io, mss_dma, mss_irq and pss_io must be set.\n");
1074 pss_synthLen
= mod_firmware_load("/etc/sound/pss_synth", (void *) &pss_synth
);
1076 if (!probe_pss(&cfg
))
1082 if (probe_pss_mpu(&cfg_mpu
)) {
1084 attach_pss_mpu(&cfg_mpu
);
1086 if (probe_pss_mss(&cfg2
)) {
1088 attach_pss_mss(&cfg2
);
1094 static void __exit
cleanup_pss(void)
1096 if (fw_load
&& pss_synth
)
1099 unload_pss_mss(&cfg2
);
1101 unload_pss_mpu(&cfg_mpu
);
1106 module_init(init_pss
);
1107 module_exit(cleanup_pss
);
1110 static int __init
setup_pss(char *str
)
1112 /* io, mss_io, mss_irq, mss_dma, mpu_io, mpu_irq */
1115 str
= get_options(str
, ARRAY_SIZE(ints
), ints
);
1127 __setup("pss=", setup_pss
);