5 * A Linux driver for Turtle Beach WaveFront Series (Maui, Tropez, Tropez Plus)
7 * This driver supports the onboard wavetable synthesizer (an ICS2115),
8 * including patch, sample and program loading and unloading, conversion
9 * of GUS patches during loading, and full user-level access to all
10 * WaveFront commands. It tries to provide semi-intelligent patch and
11 * sample management as well.
13 * It also provides support for the ICS emulation of an MPU-401. Full
14 * support for the ICS emulation's "virtual MIDI mode" is provided in
17 * Support is also provided for the Tropez Plus' onboard FX processor,
18 * a Yamaha YSS225. Currently, code exists to configure the YSS225,
19 * and there is an interface allowing tweaking of any of its memory
20 * addresses. However, I have been unable to decipher the logical
21 * positioning of the configuration info for various effects, so for
22 * now, you just get the YSS225 in the same state as Turtle Beach's
23 * "SETUPSND.EXE" utility leaves it.
25 * The boards' DAC/ADC (a Crystal CS4232) is supported by cs4232.[co],
26 * This chip also controls the configuration of the card: the wavefront
27 * synth is logical unit 4.
32 * /dev/dsp - using cs4232+ad1848 modules, OSS compatible
33 * /dev/midiNN and /dev/midiNN+1 - using wf_midi code, OSS compatible
34 * /dev/synth00 - raw synth interface
36 **********************************************************************
38 * Copyright (C) by Paul Barton-Davis 1998
40 * Some portions of this file are taken from work that is
41 * copyright (C) by Hannu Savolainen 1993-1996
43 * Although the relevant code here is all new, the handling of
44 * sample/alias/multi- samples is entirely based on a driver by Matt
45 * Martin and Rutger Nijlunsing which demonstrated how to get things
46 * to work correctly. The GUS patch loading code has been almost
47 * unaltered by me, except to fit formatting and function names in the
48 * rest of the file. Many thanks to them.
50 * Appreciation and thanks to Hannu Savolainen for his early work on the Maui
51 * driver, and answering a few questions while this one was developed.
53 * Absolutely NO thanks to Turtle Beach/Voyetra and Yamaha for their
54 * complete lack of help in developing this driver, and in particular
55 * for their utter silence in response to questions about undocumented
56 * aspects of configuring a WaveFront soundcard, particularly the
59 * $Id: wavfront.c,v 0.7 1998/09/09 15:47:36 pbd Exp $
61 * This program is distributed under the GNU GENERAL PUBLIC LICENSE (GPL)
62 * Version 2 (June 1991). See the "COPYING" file distributed with this software
66 * 11-10-2000 Bartlomiej Zolnierkiewicz <bkz@linux-ide.org>
67 * Added some __init and __initdata to entries in yss225.c
70 #include <linux/module.h>
72 #include <linux/kernel.h>
73 #include <linux/init.h>
74 #include <linux/sched.h>
75 #include <linux/smp_lock.h>
76 #include <linux/ptrace.h>
77 #include <linux/fcntl.h>
78 #include <linux/syscalls.h>
79 #include <linux/ioport.h>
80 #include <linux/spinlock.h>
81 #include <linux/interrupt.h>
83 #include <linux/delay.h>
85 #include "sound_config.h"
87 #include <linux/wavefront.h>
89 #define _MIDI_SYNTH_C_
90 #define MIDI_SYNTH_NAME "WaveFront MIDI"
91 #define MIDI_SYNTH_CAPS SYNTH_CAP_INPUT
92 #include "midi_synth.h"
94 /* Compile-time control of the extent to which OSS is supported.
96 I consider /dev/sequencer to be an anachronism, but given its
97 widespread usage by various Linux MIDI software, it seems worth
98 offering support to it if it's not too painful. Instead of using
99 /dev/sequencer, I recommend:
101 for synth programming and patch loading: /dev/synthNN
102 for kernel-synchronized MIDI sequencing: the ALSA sequencer
103 for direct MIDI control: /dev/midiNN
105 I have never tried static compilation into the kernel. The #if's
106 for this are really just notes to myself about what the code is
110 #define OSS_SUPPORT_SEQ 0x1 /* use of /dev/sequencer */
111 #define OSS_SUPPORT_STATIC_INSTALL 0x2 /* static compilation into kernel */
113 #define OSS_SUPPORT_LEVEL 0x1 /* just /dev/sequencer for now */
115 #if OSS_SUPPORT_LEVEL & OSS_SUPPORT_SEQ
116 static int (*midi_load_patch) (int devno, int format, const char __user *addr,
117 int offs, int count, int pmgr_flag) = NULL;
118 #endif /* OSS_SUPPORT_SEQ */
120 /* if WF_DEBUG not defined, no run-time debugging messages will
121 be available via the debug flag setting. Given the current
122 beta state of the driver, this will remain set until a future
130 /* Thank goodness for gcc's preprocessor ... */
132 #define DPRINT(cond, format, args...) \
133 if ((dev.debug & (cond)) == (cond)) { \
134 printk (KERN_DEBUG LOGNAME format, ## args); \
137 #define DPRINT(cond, format, args...)
140 #define LOGNAME "WaveFront: "
142 /* bitmasks for WaveFront status port value */
144 #define STAT_RINTR_ENABLED 0x01
145 #define STAT_CAN_READ 0x02
146 #define STAT_INTR_READ 0x04
147 #define STAT_WINTR_ENABLED 0x10
148 #define STAT_CAN_WRITE 0x20
149 #define STAT_INTR_WRITE 0x40
151 /*** Module-accessible parameters ***************************************/
153 static int wf_raw; /* we normally check for "raw state" to firmware
154 loading. if set, then during driver loading, the
155 state of the board is ignored, and we reset the
156 board and load the firmware anyway.
159 static int fx_raw = 1; /* if this is zero, we'll leave the FX processor in
160 whatever state it is when the driver is loaded.
161 The default is to download the microprogram and
162 associated coefficients to set it up for "default"
163 operation, whatever that means.
166 static int debug_default; /* you can set this to control debugging
167 during driver loading. it takes any combination
168 of the WF_DEBUG_* flags defined in
172 /* XXX this needs to be made firmware and hardware version dependent */
174 static char *ospath = "/etc/sound/wavefront.os"; /* where to find a processed
175 version of the WaveFront OS
178 static int wait_polls = 2000; /* This is a number of tries we poll the
179 status register before resorting to sleeping.
180 WaveFront being an ISA card each poll takes
181 about 1.2us. So before going to
182 sleep we wait up to 2.4ms in a loop.
185 static int sleep_length = HZ/100; /* This says how long we're going to
187 10ms sounds reasonable for fast response.
190 static int sleep_tries = 50; /* Wait for status 0.5 seconds total. */
192 static int reset_time = 2; /* hundreths of a second we wait after a HW reset for
193 the expected interrupt.
196 static int ramcheck_time = 20; /* time in seconds to wait while ROM code
200 static int osrun_time = 10; /* time in seconds we wait for the OS to
204 module_param(wf_raw, int, 0);
205 module_param(fx_raw, int, 0);
206 module_param(debug_default, int, 0);
207 module_param(wait_polls, int, 0);
208 module_param(sleep_length, int, 0);
209 module_param(sleep_tries, int, 0);
210 module_param(ospath, charp, 0);
211 module_param(reset_time, int, 0);
212 module_param(ramcheck_time, int, 0);
213 module_param(osrun_time, int, 0);
215 /***************************************************************************/
217 /* Note: because this module doesn't export any symbols, this really isn't
218 a global variable, even if it looks like one. I was quite confused by
219 this when I started writing this as a (newer) module -- pbd.
223 int devno; /* device number from kernel */
224 int irq; /* "you were one, one of the few ..." */
225 int base; /* low i/o port address */
227 #define mpu_data_port base
228 #define mpu_command_port base + 1 /* write semantics */
229 #define mpu_status_port base + 1 /* read semantics */
230 #define data_port base + 2
231 #define status_port base + 3 /* read semantics */
232 #define control_port base + 3 /* write semantics */
233 #define block_port base + 4 /* 16 bit, writeonly */
234 #define last_block_port base + 6 /* 16 bit, writeonly */
236 /* FX ports. These are mapped through the ICS2115 to the YS225.
237 The ICS2115 takes care of flipping the relevant pins on the
238 YS225 so that access to each of these ports does the right
239 thing. Note: these are NOT documented by Turtle Beach.
242 #define fx_status base + 8
243 #define fx_op base + 8
244 #define fx_lcr base + 9
245 #define fx_dsp_addr base + 0xa
246 #define fx_dsp_page base + 0xb
247 #define fx_dsp_lsb base + 0xc
248 #define fx_dsp_msb base + 0xd
249 #define fx_mod_addr base + 0xe
250 #define fx_mod_data base + 0xf
252 volatile int irq_ok; /* set by interrupt handler */
253 volatile int irq_cnt; /* ditto */
254 int opened; /* flag, holds open(2) mode */
255 char debug; /* debugging flags */
256 int freemem; /* installed RAM, in bytes */
258 int synth_dev; /* devno for "raw" synth */
259 int mididev; /* devno for internal MIDI */
260 int ext_mididev; /* devno for external MIDI */
261 int fx_mididev; /* devno for FX MIDI interface */
262 #if OSS_SUPPORT_LEVEL & OSS_SUPPORT_SEQ
263 int oss_dev; /* devno for OSS sequencer synth */
264 #endif /* OSS_SUPPORT_SEQ */
266 char fw_version[2]; /* major = [0], minor = [1] */
267 char hw_version[2]; /* major = [0], minor = [1] */
268 char israw; /* needs Motorola microcode */
269 char has_fx; /* has FX processor (Tropez+) */
270 char prog_status[WF_MAX_PROGRAM]; /* WF_SLOT_* */
271 char patch_status[WF_MAX_PATCH]; /* WF_SLOT_* */
272 char sample_status[WF_MAX_SAMPLE]; /* WF_ST_* | WF_SLOT_* */
273 int samples_used; /* how many */
274 char interrupts_on; /* h/w MPU interrupts enabled ? */
275 char rom_samples_rdonly; /* can we write on ROM samples */
276 wait_queue_head_t interrupt_sleeper;
279 static DEFINE_SPINLOCK(lock);
280 static int detect_wffx(void);
281 static int wffx_ioctl (wavefront_fx_info *);
282 static int wffx_init (void);
284 static int wavefront_delete_sample (int sampnum);
285 static int wavefront_find_free_sample (void);
289 extern int virtual_midi_enable (void);
290 extern int virtual_midi_disable (void);
291 extern int detect_wf_mpu (int, int);
292 extern int install_wf_mpu (void);
293 extern int uninstall_wf_mpu (void);
298 unsigned int read_cnt;
299 unsigned int write_cnt;
306 } wavefront_errors[] = {
307 { 0x01, "Bad sample number" },
308 { 0x02, "Out of sample memory" },
309 { 0x03, "Bad patch number" },
310 { 0x04, "Error in number of voices" },
311 { 0x06, "Sample load already in progress" },
312 { 0x0B, "No sample load request pending" },
313 { 0x0E, "Bad MIDI channel number" },
314 { 0x10, "Download Record Error" },
321 static wavefront_command wavefront_commands[] = {
322 { WFC_SET_SYNTHVOL, "set synthesizer volume", 0, 1, NEEDS_ACK },
323 { WFC_GET_SYNTHVOL, "get synthesizer volume", 1, 0, 0},
324 { WFC_SET_NVOICES, "set number of voices", 0, 1, NEEDS_ACK },
325 { WFC_GET_NVOICES, "get number of voices", 1, 0, 0 },
326 { WFC_SET_TUNING, "set synthesizer tuning", 0, 2, NEEDS_ACK },
327 { WFC_GET_TUNING, "get synthesizer tuning", 2, 0, 0 },
328 { WFC_DISABLE_CHANNEL, "disable synth channel", 0, 1, NEEDS_ACK },
329 { WFC_ENABLE_CHANNEL, "enable synth channel", 0, 1, NEEDS_ACK },
330 { WFC_GET_CHANNEL_STATUS, "get synth channel status", 3, 0, 0 },
331 { WFC_MISYNTH_OFF, "disable midi-in to synth", 0, 0, NEEDS_ACK },
332 { WFC_MISYNTH_ON, "enable midi-in to synth", 0, 0, NEEDS_ACK },
333 { WFC_VMIDI_ON, "enable virtual midi mode", 0, 0, NEEDS_ACK },
334 { WFC_VMIDI_OFF, "disable virtual midi mode", 0, 0, NEEDS_ACK },
335 { WFC_MIDI_STATUS, "report midi status", 1, 0, 0 },
336 { WFC_FIRMWARE_VERSION, "report firmware version", 2, 0, 0 },
337 { WFC_HARDWARE_VERSION, "report hardware version", 2, 0, 0 },
338 { WFC_GET_NSAMPLES, "report number of samples", 2, 0, 0 },
339 { WFC_INSTOUT_LEVELS, "report instantaneous output levels", 7, 0, 0 },
340 { WFC_PEAKOUT_LEVELS, "report peak output levels", 7, 0, 0 },
341 { WFC_DOWNLOAD_SAMPLE, "download sample",
342 0, WF_SAMPLE_BYTES, NEEDS_ACK },
343 { WFC_DOWNLOAD_BLOCK, "download block", 0, 0, NEEDS_ACK},
344 { WFC_DOWNLOAD_SAMPLE_HEADER, "download sample header",
345 0, WF_SAMPLE_HDR_BYTES, NEEDS_ACK },
346 { WFC_UPLOAD_SAMPLE_HEADER, "upload sample header", 13, 2, 0 },
348 /* This command requires a variable number of bytes to be written.
349 There is a hack in wavefront_cmd() to support this. The actual
350 count is passed in as the read buffer ptr, cast appropriately.
354 { WFC_DOWNLOAD_MULTISAMPLE, "download multisample", 0, 0, NEEDS_ACK },
356 /* This one is a hack as well. We just read the first byte of the
357 response, don't fetch an ACK, and leave the rest to the
358 calling function. Ugly, ugly, ugly.
361 { WFC_UPLOAD_MULTISAMPLE, "upload multisample", 2, 1, 0 },
362 { WFC_DOWNLOAD_SAMPLE_ALIAS, "download sample alias",
363 0, WF_ALIAS_BYTES, NEEDS_ACK },
364 { WFC_UPLOAD_SAMPLE_ALIAS, "upload sample alias", WF_ALIAS_BYTES, 2, 0},
365 { WFC_DELETE_SAMPLE, "delete sample", 0, 2, NEEDS_ACK },
366 { WFC_IDENTIFY_SAMPLE_TYPE, "identify sample type", 5, 2, 0 },
367 { WFC_UPLOAD_SAMPLE_PARAMS, "upload sample parameters" },
368 { WFC_REPORT_FREE_MEMORY, "report free memory", 4, 0, 0 },
369 { WFC_DOWNLOAD_PATCH, "download patch", 0, 134, NEEDS_ACK },
370 { WFC_UPLOAD_PATCH, "upload patch", 132, 2, 0 },
371 { WFC_DOWNLOAD_PROGRAM, "download program", 0, 33, NEEDS_ACK },
372 { WFC_UPLOAD_PROGRAM, "upload program", 32, 1, 0 },
373 { WFC_DOWNLOAD_EDRUM_PROGRAM, "download enhanced drum program", 0, 9,
375 { WFC_UPLOAD_EDRUM_PROGRAM, "upload enhanced drum program", 8, 1, 0},
376 { WFC_SET_EDRUM_CHANNEL, "set enhanced drum program channel",
378 { WFC_DISABLE_DRUM_PROGRAM, "disable drum program", 0, 1, NEEDS_ACK },
379 { WFC_REPORT_CHANNEL_PROGRAMS, "report channel program numbers",
381 { WFC_NOOP, "the no-op command", 0, 0, NEEDS_ACK },
386 wavefront_errorstr (int errnum)
391 for (i = 0; wavefront_errors[i].errstr; i++) {
392 if (wavefront_errors[i].errno == errnum) {
393 return wavefront_errors[i].errstr;
397 return "Unknown WaveFront error";
400 static wavefront_command *
401 wavefront_get_command (int cmd)
406 for (i = 0; wavefront_commands[i].cmd != 0; i++) {
407 if (cmd == wavefront_commands[i].cmd) {
408 return &wavefront_commands[i];
412 return (wavefront_command *) 0;
416 wavefront_status (void)
419 return inb (dev.status_port);
423 wavefront_wait (int mask)
428 for (i = 0; i < wait_polls; i++)
429 if (wavefront_status() & mask)
432 for (i = 0; i < sleep_tries; i++) {
434 if (wavefront_status() & mask) {
435 set_current_state(TASK_RUNNING);
439 set_current_state(TASK_INTERRUPTIBLE);
440 schedule_timeout(sleep_length);
441 if (signal_pending(current))
445 set_current_state(TASK_RUNNING);
450 wavefront_read (void)
453 if (wavefront_wait (STAT_CAN_READ))
454 return inb (dev.data_port);
456 DPRINT (WF_DEBUG_DATA, "read timeout.\n");
462 wavefront_write (unsigned char data)
465 if (wavefront_wait (STAT_CAN_WRITE)) {
466 outb (data, dev.data_port);
470 DPRINT (WF_DEBUG_DATA, "write timeout.\n");
476 wavefront_cmd (int cmd, unsigned char *rbuf, unsigned char *wbuf)
482 wavefront_command *wfcmd;
484 if ((wfcmd = wavefront_get_command (cmd)) == (wavefront_command *) 0) {
485 printk (KERN_WARNING LOGNAME "command 0x%x not supported.\n",
490 /* Hack to handle the one variable-size write command. See
491 wavefront_send_multisample() for the other half of this
492 gross and ugly strategy.
495 if (cmd == WFC_DOWNLOAD_MULTISAMPLE) {
496 wfcmd->write_cnt = (unsigned int) rbuf;
500 DPRINT (WF_DEBUG_CMD, "0x%x [%s] (%d,%d,%d)\n",
501 cmd, wfcmd->action, wfcmd->read_cnt,
502 wfcmd->write_cnt, wfcmd->need_ack);
504 if (wavefront_write (cmd)) {
505 DPRINT ((WF_DEBUG_IO|WF_DEBUG_CMD), "cannot request "
511 if (wfcmd->write_cnt > 0) {
512 DPRINT (WF_DEBUG_DATA, "writing %d bytes "
514 wfcmd->write_cnt, cmd);
516 for (i = 0; i < wfcmd->write_cnt; i++) {
517 if (wavefront_write (wbuf[i])) {
518 DPRINT (WF_DEBUG_IO, "bad write for byte "
519 "%d of 0x%x [%s].\n",
520 i, cmd, wfcmd->action);
524 DPRINT (WF_DEBUG_DATA, "write[%d] = 0x%x\n",
529 if (wfcmd->read_cnt > 0) {
530 DPRINT (WF_DEBUG_DATA, "reading %d ints "
532 wfcmd->read_cnt, cmd);
534 for (i = 0; i < wfcmd->read_cnt; i++) {
536 if ((c = wavefront_read()) == -1) {
537 DPRINT (WF_DEBUG_IO, "bad read for byte "
538 "%d of 0x%x [%s].\n",
539 i, cmd, wfcmd->action);
543 /* Now handle errors. Lots of special cases here */
546 if ((c = wavefront_read ()) == -1) {
547 DPRINT (WF_DEBUG_IO, "bad read for "
556 /* Can you believe this madness ? */
559 wfcmd->cmd == WFC_IDENTIFY_SAMPLE_TYPE) {
560 rbuf[0] = WF_ST_EMPTY;
564 wfcmd->cmd == WFC_UPLOAD_PATCH) {
569 wfcmd->cmd == WFC_UPLOAD_PROGRAM) {
575 DPRINT (WF_DEBUG_IO, "error %d (%s) "
581 wavefront_errorstr (c),
592 DPRINT (WF_DEBUG_DATA, "read[%d] = 0x%x\n",i, rbuf[i]);
596 if ((wfcmd->read_cnt == 0 && wfcmd->write_cnt == 0) || wfcmd->need_ack) {
598 DPRINT (WF_DEBUG_CMD, "reading ACK for 0x%x\n", cmd);
600 /* Some commands need an ACK, but return zero instead
601 of the standard value.
604 if ((ack = wavefront_read()) == 0) {
610 DPRINT (WF_DEBUG_IO, "cannot read ack for "
616 int err = -1; /* something unknown */
618 if (ack == 0xff) { /* explicit error */
620 if ((err = wavefront_read ()) == -1) {
621 DPRINT (WF_DEBUG_DATA,
628 DPRINT (WF_DEBUG_IO, "0x%x [%s] "
629 "failed (0x%x, 0x%x, %s)\n",
630 cmd, wfcmd->action, ack, err,
631 wavefront_errorstr (err));
637 DPRINT (WF_DEBUG_DATA, "ack received "
642 DPRINT (WF_DEBUG_CMD, "0x%x [%s] does not need "
644 cmd, wfcmd->action, wfcmd->read_cnt,
645 wfcmd->write_cnt, wfcmd->need_ack);
652 /***********************************************************************
653 WaveFront: data munging
655 Things here are weird. All data written to the board cannot
656 have its most significant bit set. Any data item with values
657 potentially > 0x7F (127) must be split across multiple bytes.
659 Sometimes, we need to munge numeric values that are represented on
660 the x86 side as 8-32 bit values. Sometimes, we need to munge data
661 that is represented on the x86 side as an array of bytes. The most
662 efficient approach to handling both cases seems to be to use 2
663 different functions for munging and 2 for de-munging. This avoids
664 weird casting and worrying about bit-level offsets.
666 **********************************************************************/
670 munge_int32 (unsigned int src,
672 unsigned int dst_size)
676 for (i = 0;i < dst_size; i++) {
677 *dst = src & 0x7F; /* Mask high bit of LSB */
678 src = src >> 7; /* Rotate Right 7 bits */
679 /* Note: we leave the upper bits in place */
687 demunge_int32 (unsigned char* src, int src_size)
693 for (i = src_size - 1; i >= 0; i--) {
694 outval=(outval<<7)+src[i];
702 munge_buf (unsigned char *src, unsigned char *dst, unsigned int dst_size)
706 unsigned int last = dst_size / 2;
708 for (i = 0; i < last; i++) {
709 *dst++ = src[i] & 0x7f;
710 *dst++ = src[i] >> 7;
717 demunge_buf (unsigned char *src, unsigned char *dst, unsigned int src_bytes)
721 unsigned char *end = src + src_bytes;
723 end = src + src_bytes;
725 /* NOTE: src and dst *CAN* point to the same address */
727 for (i = 0; src != end; i++) {
729 dst[i] |= (*src++)<<7;
735 /***********************************************************************
736 WaveFront: sample, patch and program management.
737 ***********************************************************************/
740 wavefront_delete_sample (int sample_num)
743 unsigned char wbuf[2];
746 wbuf[0] = sample_num & 0x7f;
747 wbuf[1] = sample_num >> 7;
749 if ((x = wavefront_cmd (WFC_DELETE_SAMPLE, NULL, wbuf)) == 0) {
750 dev.sample_status[sample_num] = WF_ST_EMPTY;
757 wavefront_get_sample_status (int assume_rom)
761 unsigned char rbuf[32], wbuf[32];
762 unsigned int sc_real, sc_alias, sc_multi;
764 /* check sample status */
766 if (wavefront_cmd (WFC_GET_NSAMPLES, rbuf, wbuf)) {
767 printk (KERN_WARNING LOGNAME "cannot request sample count.\n");
771 sc_real = sc_alias = sc_multi = dev.samples_used = 0;
773 for (i = 0; i < WF_MAX_SAMPLE; i++) {
778 if (wavefront_cmd (WFC_IDENTIFY_SAMPLE_TYPE, rbuf, wbuf)) {
779 printk (KERN_WARNING LOGNAME
780 "cannot identify sample "
781 "type of slot %d\n", i);
782 dev.sample_status[i] = WF_ST_EMPTY;
786 dev.sample_status[i] = (WF_SLOT_FILLED|rbuf[0]);
789 dev.sample_status[i] |= WF_SLOT_ROM;
792 switch (rbuf[0] & WF_ST_MASK) {
796 case WF_ST_MULTISAMPLE:
806 printk (KERN_WARNING LOGNAME "unknown sample type for "
811 if (rbuf[0] != WF_ST_EMPTY) {
816 printk (KERN_INFO LOGNAME
817 "%d samples used (%d real, %d aliases, %d multi), "
818 "%d empty\n", dev.samples_used, sc_real, sc_alias, sc_multi,
819 WF_MAX_SAMPLE - dev.samples_used);
827 wavefront_get_patch_status (void)
830 unsigned char patchbuf[WF_PATCH_BYTES];
831 unsigned char patchnum[2];
835 for (i = 0; i < WF_MAX_PATCH; i++) {
836 patchnum[0] = i & 0x7f;
837 patchnum[1] = i >> 7;
839 if ((x = wavefront_cmd (WFC_UPLOAD_PATCH, patchbuf,
842 dev.patch_status[i] |= WF_SLOT_FILLED;
843 p = (wavefront_patch *) patchbuf;
845 [p->sample_number|(p->sample_msb<<7)] |=
848 } else if (x == 3) { /* Bad patch number */
849 dev.patch_status[i] = 0;
851 printk (KERN_ERR LOGNAME "upload patch "
853 dev.patch_status[i] = 0;
858 /* program status has already filled in slot_used bits */
860 for (i = 0, cnt = 0, cnt2 = 0; i < WF_MAX_PATCH; i++) {
861 if (dev.patch_status[i] & WF_SLOT_FILLED) {
864 if (dev.patch_status[i] & WF_SLOT_USED) {
869 printk (KERN_INFO LOGNAME
870 "%d patch slots filled, %d in use\n", cnt, cnt2);
876 wavefront_get_program_status (void)
879 unsigned char progbuf[WF_PROGRAM_BYTES];
880 wavefront_program prog;
881 unsigned char prognum;
884 for (i = 0; i < WF_MAX_PROGRAM; i++) {
887 if ((x = wavefront_cmd (WFC_UPLOAD_PROGRAM, progbuf,
890 dev.prog_status[i] |= WF_SLOT_USED;
892 demunge_buf (progbuf, (unsigned char *) &prog,
895 for (l = 0; l < WF_NUM_LAYERS; l++) {
896 if (prog.layer[l].mute) {
898 [prog.layer[l].patch_number] |=
902 } else if (x == 1) { /* Bad program number */
903 dev.prog_status[i] = 0;
905 printk (KERN_ERR LOGNAME "upload program "
907 dev.prog_status[i] = 0;
911 for (i = 0, cnt = 0; i < WF_MAX_PROGRAM; i++) {
912 if (dev.prog_status[i]) {
917 printk (KERN_INFO LOGNAME "%d programs slots in use\n", cnt);
923 wavefront_send_patch (wavefront_patch_info *header)
926 unsigned char buf[WF_PATCH_BYTES+2];
929 DPRINT (WF_DEBUG_LOAD_PATCH, "downloading patch %d\n",
932 dev.patch_status[header->number] |= WF_SLOT_FILLED;
935 bptr = munge_int32 (header->number, buf, 2);
936 munge_buf ((unsigned char *)&header->hdr.p, bptr, WF_PATCH_BYTES);
938 if (wavefront_cmd (WFC_DOWNLOAD_PATCH, NULL, buf)) {
939 printk (KERN_ERR LOGNAME "download patch failed\n");
947 wavefront_send_program (wavefront_patch_info *header)
950 unsigned char buf[WF_PROGRAM_BYTES+1];
953 DPRINT (WF_DEBUG_LOAD_PATCH, "downloading program %d\n",
956 dev.prog_status[header->number] = WF_SLOT_USED;
958 /* XXX need to zero existing SLOT_USED bit for program_status[i]
959 where `i' is the program that's being (potentially) overwritten.
962 for (i = 0; i < WF_NUM_LAYERS; i++) {
963 if (header->hdr.pr.layer[i].mute) {
964 dev.patch_status[header->hdr.pr.layer[i].patch_number] |=
967 /* XXX need to mark SLOT_USED for sample used by
968 patch_number, but this means we have to load it. Ick.
973 buf[0] = header->number;
974 munge_buf ((unsigned char *)&header->hdr.pr, &buf[1], WF_PROGRAM_BYTES);
976 if (wavefront_cmd (WFC_DOWNLOAD_PROGRAM, NULL, buf)) {
977 printk (KERN_WARNING LOGNAME "download patch failed\n");
985 wavefront_freemem (void)
990 if (wavefront_cmd (WFC_REPORT_FREE_MEMORY, rbuf, NULL)) {
991 printk (KERN_WARNING LOGNAME "can't get memory stats.\n");
994 return demunge_int32 (rbuf, 4);
999 wavefront_send_sample (wavefront_patch_info *header,
1000 UINT16 __user *dataptr,
1001 int data_is_unsigned)
1004 /* samples are downloaded via a 16-bit wide i/o port
1005 (you could think of it as 2 adjacent 8-bit wide ports
1006 but its less efficient that way). therefore, all
1007 the blocksizes and so forth listed in the documentation,
1008 and used conventionally to refer to sample sizes,
1009 which are given in 8-bit units (bytes), need to be
1013 UINT16 sample_short;
1015 UINT16 __user *data_end = NULL;
1017 const int max_blksize = 4096/2;
1018 unsigned int written;
1019 unsigned int blocksize;
1022 unsigned char sample_hdr[WF_SAMPLE_HDR_BYTES];
1023 unsigned char *shptr;
1025 int initial_skip = 0;
1027 DPRINT (WF_DEBUG_LOAD_PATCH, "sample %sdownload for slot %d, "
1028 "type %d, %d bytes from %p\n",
1029 header->size ? "" : "header ",
1030 header->number, header->subkey,
1034 if (header->number == WAVEFRONT_FIND_FREE_SAMPLE_SLOT) {
1037 if ((x = wavefront_find_free_sample ()) < 0) {
1040 printk (KERN_DEBUG LOGNAME "unspecified sample => %d\n", x);
1046 /* XXX it's a debatable point whether or not RDONLY semantics
1047 on the ROM samples should cover just the sample data or
1048 the sample header. For now, it only covers the sample data,
1049 so anyone is free at all times to rewrite sample headers.
1051 My reason for this is that we have the sample headers
1052 available in the WFB file for General MIDI, and so these
1053 can always be reset if needed. The sample data, however,
1054 cannot be recovered without a complete reset and firmware
1055 reload of the ICS2115, which is a very expensive operation.
1057 So, doing things this way allows us to honor the notion of
1058 "RESETSAMPLES" reasonably cheaply. Note however, that this
1059 is done purely at user level: there is no WFB parser in
1060 this driver, and so a complete reset (back to General MIDI,
1061 or theoretically some other configuration) is the
1062 responsibility of the user level library.
1064 To try to do this in the kernel would be a little
1065 crazy: we'd need 158K of kernel space just to hold
1066 a copy of the patch/program/sample header data.
1069 if (dev.rom_samples_rdonly) {
1070 if (dev.sample_status[header->number] & WF_SLOT_ROM) {
1071 printk (KERN_ERR LOGNAME "sample slot %d "
1072 "write protected\n",
1078 wavefront_delete_sample (header->number);
1082 dev.freemem = wavefront_freemem ();
1084 if (dev.freemem < header->size) {
1085 printk (KERN_ERR LOGNAME
1086 "insufficient memory to "
1087 "load %d byte sample.\n",
1094 skip = WF_GET_CHANNEL(&header->hdr.s);
1096 if (skip > 0 && header->hdr.s.SampleResolution != LINEAR_16BIT) {
1097 printk (KERN_ERR LOGNAME "channel selection only "
1098 "possible on 16-bit samples");
1133 DPRINT (WF_DEBUG_LOAD_PATCH, "channel selection: %d => "
1134 "initial skip = %d, skip = %d\n",
1135 WF_GET_CHANNEL (&header->hdr.s),
1136 initial_skip, skip);
1138 /* Be safe, and zero the "Unused" bits ... */
1140 WF_SET_CHANNEL(&header->hdr.s, 0);
1142 /* adjust size for 16 bit samples by dividing by two. We always
1143 send 16 bits per write, even for 8 bit samples, so the length
1144 is always half the size of the sample data in bytes.
1147 length = header->size / 2;
1149 /* the data we're sent has not been munged, and in fact, the
1150 header we have to send isn't just a munged copy either.
1151 so, build the sample header right here.
1154 shptr = &sample_hdr[0];
1156 shptr = munge_int32 (header->number, shptr, 2);
1159 shptr = munge_int32 (length, shptr, 4);
1162 /* Yes, a 4 byte result doesn't contain all of the offset bits,
1163 but the offset only uses 24 bits.
1166 shptr = munge_int32 (*((UINT32 *) &header->hdr.s.sampleStartOffset),
1168 shptr = munge_int32 (*((UINT32 *) &header->hdr.s.loopStartOffset),
1170 shptr = munge_int32 (*((UINT32 *) &header->hdr.s.loopEndOffset),
1172 shptr = munge_int32 (*((UINT32 *) &header->hdr.s.sampleEndOffset),
1175 /* This one is truly weird. What kind of weirdo decided that in
1176 a system dominated by 16 and 32 bit integers, they would use
1180 shptr = munge_int32 (header->hdr.s.FrequencyBias, shptr, 3);
1182 /* Why is this nybblified, when the MSB is *always* zero ?
1183 Anyway, we can't take address of bitfield, so make a
1184 good-faith guess at where it starts.
1187 shptr = munge_int32 (*(&header->hdr.s.FrequencyBias+1),
1190 if (wavefront_cmd (header->size ?
1191 WFC_DOWNLOAD_SAMPLE : WFC_DOWNLOAD_SAMPLE_HEADER,
1192 NULL, sample_hdr)) {
1193 printk (KERN_WARNING LOGNAME "sample %sdownload refused.\n",
1194 header->size ? "" : "header ");
1198 if (header->size == 0) {
1199 goto sent; /* Sorry. Just had to have one somewhere */
1202 data_end = dataptr + length;
1204 /* Do any initial skip over an unused channel's data */
1206 dataptr += initial_skip;
1208 for (written = 0, blocknum = 0;
1209 written < length; written += max_blksize, blocknum++) {
1211 if ((length - written) > max_blksize) {
1212 blocksize = max_blksize;
1214 /* round to nearest 16-byte value */
1215 blocksize = ((length-written+7)&~0x7);
1218 if (wavefront_cmd (WFC_DOWNLOAD_BLOCK, NULL, NULL)) {
1219 printk (KERN_WARNING LOGNAME "download block "
1220 "request refused.\n");
1224 for (i = 0; i < blocksize; i++) {
1226 if (dataptr < data_end) {
1228 __get_user (sample_short, dataptr);
1231 if (data_is_unsigned) { /* GUS ? */
1233 if (WF_SAMPLE_IS_8BIT(&header->hdr.s)) {
1241 &sample_short)[0] += 0x7f;
1243 &sample_short)[1] += 0x7f;
1252 sample_short += 0x7fff;
1258 /* In padding section of final block:
1260 Don't fetch unsupplied data from
1261 user space, just continue with
1262 whatever the final value was.
1266 if (i < blocksize - 1) {
1267 outw (sample_short, dev.block_port);
1269 outw (sample_short, dev.last_block_port);
1273 /* Get "DMA page acknowledge", even though its really
1274 nothing to do with DMA at all.
1277 if ((dma_ack = wavefront_read ()) != WF_DMA_ACK) {
1278 if (dma_ack == -1) {
1279 printk (KERN_ERR LOGNAME "upload sample "
1280 "DMA ack timeout\n");
1283 printk (KERN_ERR LOGNAME "upload sample "
1284 "DMA ack error 0x%x\n",
1291 dev.sample_status[header->number] = (WF_SLOT_FILLED|WF_ST_SAMPLE);
1293 /* Note, label is here because sending the sample header shouldn't
1294 alter the sample_status info at all.
1302 wavefront_send_alias (wavefront_patch_info *header)
1305 unsigned char alias_hdr[WF_ALIAS_BYTES];
1307 DPRINT (WF_DEBUG_LOAD_PATCH, "download alias, %d is "
1310 header->hdr.a.OriginalSample);
1312 munge_int32 (header->number, &alias_hdr[0], 2);
1313 munge_int32 (header->hdr.a.OriginalSample, &alias_hdr[2], 2);
1314 munge_int32 (*((unsigned int *)&header->hdr.a.sampleStartOffset),
1316 munge_int32 (*((unsigned int *)&header->hdr.a.loopStartOffset),
1318 munge_int32 (*((unsigned int *)&header->hdr.a.loopEndOffset),
1320 munge_int32 (*((unsigned int *)&header->hdr.a.sampleEndOffset),
1322 munge_int32 (header->hdr.a.FrequencyBias, &alias_hdr[20], 3);
1323 munge_int32 (*(&header->hdr.a.FrequencyBias+1), &alias_hdr[23], 2);
1325 if (wavefront_cmd (WFC_DOWNLOAD_SAMPLE_ALIAS, NULL, alias_hdr)) {
1326 printk (KERN_ERR LOGNAME "download alias failed.\n");
1330 dev.sample_status[header->number] = (WF_SLOT_FILLED|WF_ST_ALIAS);
1336 wavefront_send_multisample (wavefront_patch_info *header)
1340 unsigned char msample_hdr[WF_MSAMPLE_BYTES];
1342 munge_int32 (header->number, &msample_hdr[0], 2);
1344 /* You'll recall at this point that the "number of samples" value
1345 in a wavefront_multisample struct is actually the log2 of the
1346 real number of samples.
1349 num_samples = (1<<(header->hdr.ms.NumberOfSamples&7));
1350 msample_hdr[2] = (unsigned char) header->hdr.ms.NumberOfSamples;
1352 DPRINT (WF_DEBUG_LOAD_PATCH, "multi %d with %d=%d samples\n",
1354 header->hdr.ms.NumberOfSamples,
1357 for (i = 0; i < num_samples; i++) {
1358 DPRINT(WF_DEBUG_LOAD_PATCH|WF_DEBUG_DATA, "sample[%d] = %d\n",
1359 i, header->hdr.ms.SampleNumber[i]);
1360 munge_int32 (header->hdr.ms.SampleNumber[i],
1361 &msample_hdr[3+(i*2)], 2);
1364 /* Need a hack here to pass in the number of bytes
1365 to be written to the synth. This is ugly, and perhaps
1366 one day, I'll fix it.
1369 if (wavefront_cmd (WFC_DOWNLOAD_MULTISAMPLE,
1370 (unsigned char *) ((num_samples*2)+3),
1372 printk (KERN_ERR LOGNAME "download of multisample failed.\n");
1376 dev.sample_status[header->number] = (WF_SLOT_FILLED|WF_ST_MULTISAMPLE);
1382 wavefront_fetch_multisample (wavefront_patch_info *header)
1385 unsigned char log_ns[1];
1386 unsigned char number[2];
1389 munge_int32 (header->number, number, 2);
1391 if (wavefront_cmd (WFC_UPLOAD_MULTISAMPLE, log_ns, number)) {
1392 printk (KERN_ERR LOGNAME "upload multisample failed.\n");
1396 DPRINT (WF_DEBUG_DATA, "msample %d has %d samples\n",
1397 header->number, log_ns[0]);
1399 header->hdr.ms.NumberOfSamples = log_ns[0];
1401 /* get the number of samples ... */
1403 num_samples = (1 << log_ns[0]);
1405 for (i = 0; i < num_samples; i++) {
1408 if ((d[0] = wavefront_read ()) == -1) {
1409 printk (KERN_ERR LOGNAME "upload multisample failed "
1410 "during sample loop.\n");
1414 if ((d[1] = wavefront_read ()) == -1) {
1415 printk (KERN_ERR LOGNAME "upload multisample failed "
1416 "during sample loop.\n");
1420 header->hdr.ms.SampleNumber[i] =
1421 demunge_int32 ((unsigned char *) d, 2);
1423 DPRINT (WF_DEBUG_DATA, "msample sample[%d] = %d\n",
1424 i, header->hdr.ms.SampleNumber[i]);
1432 wavefront_send_drum (wavefront_patch_info *header)
1435 unsigned char drumbuf[WF_DRUM_BYTES];
1436 wavefront_drum *drum = &header->hdr.d;
1439 DPRINT (WF_DEBUG_LOAD_PATCH, "downloading edrum for MIDI "
1440 "note %d, patch = %d\n",
1441 header->number, drum->PatchNumber);
1443 drumbuf[0] = header->number & 0x7f;
1445 for (i = 0; i < 4; i++) {
1446 munge_int32 (((unsigned char *)drum)[i], &drumbuf[1+(i*2)], 2);
1449 if (wavefront_cmd (WFC_DOWNLOAD_EDRUM_PROGRAM, NULL, drumbuf)) {
1450 printk (KERN_ERR LOGNAME "download drum failed.\n");
1458 wavefront_find_free_sample (void)
1463 for (i = 0; i < WF_MAX_SAMPLE; i++) {
1464 if (!(dev.sample_status[i] & WF_SLOT_FILLED)) {
1468 printk (KERN_WARNING LOGNAME "no free sample slots!\n");
1473 wavefront_find_free_patch (void)
1478 for (i = 0; i < WF_MAX_PATCH; i++) {
1479 if (!(dev.patch_status[i] & WF_SLOT_FILLED)) {
1483 printk (KERN_WARNING LOGNAME "no free patch slots!\n");
1491 int tbl[]={0, 0, 2048, 3246, 4096, 4755, 5294, 5749, 6143,
1492 6492, 6803, 7084, 7342, 7578, 7797, 8001, 8192,
1493 8371, 8540, 8699, 8851, 8995, 9132, 9264, 9390,
1494 9510, 9626, 9738, 9845, 9949, 10049, 10146};
1497 /* Returns 2048*log2(n) */
1499 /* FIXME: this is like doing integer math
1500 on quantum particles (RuN) */
1516 wavefront_load_gus_patch (int devno, int format, const char __user *addr,
1517 int offs, int count, int pmgr_flag)
1519 struct patch_info guspatch;
1520 wavefront_patch_info *samp, *pat, *prog;
1521 wavefront_patch *patp;
1522 wavefront_sample *sampp;
1523 wavefront_program *progp;
1529 samp = kmalloc(3 * sizeof(wavefront_patch_info), GFP_KERNEL);
1535 /* Copy in the header of the GUS patch */
1537 sizeof_patch = (long) &guspatch.data[0] - (long) &guspatch;
1538 if (copy_from_user(&((char *) &guspatch)[offs],
1539 &(addr)[offs], sizeof_patch - offs)) {
1544 if ((i = wavefront_find_free_patch ()) == -1) {
1549 pat->subkey = WF_ST_PATCH;
1552 if ((i = wavefront_find_free_sample ()) == -1) {
1557 samp->subkey = WF_ST_SAMPLE;
1558 samp->size = guspatch.len;
1559 sampp = &samp->hdr.s;
1561 prog->number = guspatch.instr_no;
1562 progp = &prog->hdr.pr;
1564 /* Setup the patch structure */
1566 patp->amplitude_bias=guspatch.volume;
1568 patp->sample_number= samp->number & 0xff;
1569 patp->sample_msb= samp->number >> 8;
1570 patp->pitch_bend= /*12*/ 0;
1573 patp->nohold=(guspatch.mode & WAVE_SUSTAIN_ON) ? 0:1;
1574 patp->frequency_bias=0;
1579 patp->fm_src1=WF_MOD_MOD_WHEEL;
1580 patp->am_src=WF_MOD_PRESSURE;
1581 patp->am_amount=127;
1582 patp->fc1_mod_amount=0;
1583 patp->fc2_mod_amount=0;
1586 patp->envelope1.attack_level=127;
1587 patp->envelope1.decay1_level=127;
1588 patp->envelope1.decay2_level=127;
1589 patp->envelope1.sustain_level=127;
1590 patp->envelope1.release_level=0;
1591 patp->envelope2.attack_velocity=127;
1592 patp->envelope2.attack_level=127;
1593 patp->envelope2.decay1_level=127;
1594 patp->envelope2.decay2_level=127;
1595 patp->envelope2.sustain_level=127;
1596 patp->envelope2.release_level=0;
1597 patp->envelope2.attack_velocity=127;
1600 /* Program for this patch */
1602 progp->layer[0].patch_number= pat->number; /* XXX is this right ? */
1603 progp->layer[0].mute=1;
1604 progp->layer[0].pan_or_mod=1;
1605 progp->layer[0].pan=7;
1606 progp->layer[0].mix_level=127 /* guspatch.volume */;
1607 progp->layer[0].split_type=0;
1608 progp->layer[0].split_point=0;
1609 progp->layer[0].play_below=0;
1611 for (i = 1; i < 4; i++) {
1612 progp->layer[i].mute=0;
1617 sampp->SampleResolution=((~guspatch.mode & WAVE_16_BITS)<<1);
1620 note_to_freq (base_note) < guspatch.base_note;
1623 if ((guspatch.base_note-note_to_freq(base_note))
1624 >(note_to_freq(base_note)-guspatch.base_note))
1627 printk(KERN_DEBUG "ref freq=%d,base note=%d\n",
1631 sampp->FrequencyBias = (29550 - log2_2048(guspatch.base_freq)
1633 printk(KERN_DEBUG "Freq Bias is %d\n", sampp->FrequencyBias);
1634 sampp->Loop=(guspatch.mode & WAVE_LOOPING) ? 1:0;
1635 sampp->sampleStartOffset.Fraction=0;
1636 sampp->sampleStartOffset.Integer=0;
1637 sampp->loopStartOffset.Fraction=0;
1638 sampp->loopStartOffset.Integer=guspatch.loop_start
1639 >>((guspatch.mode&WAVE_16_BITS) ? 1:0);
1640 sampp->loopEndOffset.Fraction=0;
1641 sampp->loopEndOffset.Integer=guspatch.loop_end
1642 >>((guspatch.mode&WAVE_16_BITS) ? 1:0);
1643 sampp->sampleEndOffset.Fraction=0;
1644 sampp->sampleEndOffset.Integer=guspatch.len >> (guspatch.mode&1);
1645 sampp->Bidirectional=(guspatch.mode&WAVE_BIDIR_LOOP) ? 1:0;
1646 sampp->Reverse=(guspatch.mode&WAVE_LOOP_BACK) ? 1:0;
1648 /* Now ship it down */
1650 wavefront_send_sample (samp,
1651 (unsigned short __user *) &(addr)[sizeof_patch],
1652 (guspatch.mode & WAVE_UNSIGNED) ? 1:0);
1653 wavefront_send_patch (pat);
1654 wavefront_send_program (prog);
1656 /* Now pan as best we can ... use the slave/internal MIDI device
1657 number if it exists (since it talks to the WaveFront), or the
1661 if (dev.mididev > 0) {
1662 midi_synth_controller (dev.mididev, guspatch.instr_no, 10,
1663 ((guspatch.panning << 4) > 127) ?
1664 127 : (guspatch.panning << 4));
1674 wavefront_load_patch (const char __user *addr)
1678 wavefront_patch_info header;
1680 if (copy_from_user (&header, addr, sizeof(wavefront_patch_info) -
1681 sizeof(wavefront_any))) {
1682 printk (KERN_WARNING LOGNAME "bad address for load patch.\n");
1686 DPRINT (WF_DEBUG_LOAD_PATCH, "download "
1688 "Sample number: %d "
1689 "Sample size: %d\n",
1694 switch (header.subkey) {
1695 case WF_ST_SAMPLE: /* sample or sample_header, based on patch->size */
1697 if (copy_from_user((unsigned char *) &header.hdr.s,
1698 (unsigned char __user *) header.hdrptr,
1699 sizeof (wavefront_sample)))
1702 return wavefront_send_sample (&header, header.dataptr, 0);
1704 case WF_ST_MULTISAMPLE:
1706 if (copy_from_user(&header.hdr.s, header.hdrptr,
1707 sizeof(wavefront_multisample)))
1710 return wavefront_send_multisample (&header);
1715 if (copy_from_user(&header.hdr.a, header.hdrptr,
1716 sizeof (wavefront_alias)))
1719 return wavefront_send_alias (&header);
1722 if (copy_from_user(&header.hdr.d, header.hdrptr,
1723 sizeof (wavefront_drum)))
1726 return wavefront_send_drum (&header);
1729 if (copy_from_user(&header.hdr.p, header.hdrptr,
1730 sizeof (wavefront_patch)))
1733 return wavefront_send_patch (&header);
1736 if (copy_from_user(&header.hdr.pr, header.hdrptr,
1737 sizeof (wavefront_program)))
1740 return wavefront_send_program (&header);
1743 printk (KERN_ERR LOGNAME "unknown patch type %d.\n",
1751 /***********************************************************************
1752 WaveFront: /dev/sequencer{,2} and other hardware-dependent interfaces
1753 ***********************************************************************/
1756 process_sample_hdr (UCHAR8 *buf)
1764 /* The board doesn't send us an exact copy of a "wavefront_sample"
1765 in response to an Upload Sample Header command. Instead, we
1766 have to convert the data format back into our data structure,
1767 just as in the Download Sample command, where we have to do
1768 something very similar in the reverse direction.
1771 *((UINT32 *) &s.sampleStartOffset) = demunge_int32 (ptr, 4); ptr += 4;
1772 *((UINT32 *) &s.loopStartOffset) = demunge_int32 (ptr, 4); ptr += 4;
1773 *((UINT32 *) &s.loopEndOffset) = demunge_int32 (ptr, 4); ptr += 4;
1774 *((UINT32 *) &s.sampleEndOffset) = demunge_int32 (ptr, 4); ptr += 4;
1775 *((UINT32 *) &s.FrequencyBias) = demunge_int32 (ptr, 3); ptr += 3;
1777 s.SampleResolution = *ptr & 0x3;
1778 s.Loop = *ptr & 0x8;
1779 s.Bidirectional = *ptr & 0x10;
1780 s.Reverse = *ptr & 0x40;
1782 /* Now copy it back to where it came from */
1784 memcpy (buf, (unsigned char *) &s, sizeof (wavefront_sample));
1788 wavefront_synth_control (int cmd, wavefront_control *wc)
1791 unsigned char patchnumbuf[2];
1794 DPRINT (WF_DEBUG_CMD, "synth control with "
1795 "cmd 0x%x\n", wc->cmd);
1797 /* Pre-handling of or for various commands */
1800 case WFC_DISABLE_INTERRUPTS:
1801 printk (KERN_INFO LOGNAME "interrupts disabled.\n");
1802 outb (0x80|0x20, dev.control_port);
1803 dev.interrupts_on = 0;
1806 case WFC_ENABLE_INTERRUPTS:
1807 printk (KERN_INFO LOGNAME "interrupts enabled.\n");
1808 outb (0x80|0x40|0x20, dev.control_port);
1809 dev.interrupts_on = 1;
1812 case WFC_INTERRUPT_STATUS:
1813 wc->rbuf[0] = dev.interrupts_on;
1816 case WFC_ROMSAMPLES_RDONLY:
1817 dev.rom_samples_rdonly = wc->wbuf[0];
1821 case WFC_IDENTIFY_SLOT_TYPE:
1822 i = wc->wbuf[0] | (wc->wbuf[1] << 7);
1823 if (i <0 || i >= WF_MAX_SAMPLE) {
1824 printk (KERN_WARNING LOGNAME "invalid slot ID %d\n",
1826 wc->status = EINVAL;
1829 wc->rbuf[0] = dev.sample_status[i];
1833 case WFC_DEBUG_DRIVER:
1834 dev.debug = wc->wbuf[0];
1835 printk (KERN_INFO LOGNAME "debug = 0x%x\n", dev.debug);
1839 wffx_ioctl ((wavefront_fx_info *) &wc->wbuf[0]);
1842 case WFC_UPLOAD_PATCH:
1843 munge_int32 (*((UINT32 *) wc->wbuf), patchnumbuf, 2);
1844 memcpy (wc->wbuf, patchnumbuf, 2);
1847 case WFC_UPLOAD_MULTISAMPLE:
1848 /* multisamples have to be handled differently, and
1849 cannot be dealt with properly by wavefront_cmd() alone.
1851 wc->status = wavefront_fetch_multisample
1852 ((wavefront_patch_info *) wc->rbuf);
1855 case WFC_UPLOAD_SAMPLE_ALIAS:
1856 printk (KERN_INFO LOGNAME "support for sample alias upload "
1857 "being considered.\n");
1858 wc->status = EINVAL;
1862 wc->status = wavefront_cmd (wc->cmd, wc->rbuf, wc->wbuf);
1864 /* Post-handling of certain commands.
1866 In particular, if the command was an upload, demunge the data
1867 so that the user-level doesn't have to think about it.
1870 if (wc->status == 0) {
1872 /* intercept any freemem requests so that we know
1873 we are always current with the user-level view
1877 case WFC_REPORT_FREE_MEMORY:
1878 dev.freemem = demunge_int32 (wc->rbuf, 4);
1881 case WFC_UPLOAD_PATCH:
1882 demunge_buf (wc->rbuf, wc->rbuf, WF_PATCH_BYTES);
1885 case WFC_UPLOAD_PROGRAM:
1886 demunge_buf (wc->rbuf, wc->rbuf, WF_PROGRAM_BYTES);
1889 case WFC_UPLOAD_EDRUM_PROGRAM:
1890 demunge_buf (wc->rbuf, wc->rbuf, WF_DRUM_BYTES - 1);
1893 case WFC_UPLOAD_SAMPLE_HEADER:
1894 process_sample_hdr (wc->rbuf);
1897 case WFC_UPLOAD_SAMPLE_ALIAS:
1898 printk (KERN_INFO LOGNAME "support for "
1899 "sample aliases still "
1900 "being considered.\n");
1904 if (virtual_midi_disable () < 0) {
1910 if (virtual_midi_enable () < 0) {
1921 /***********************************************************************/
1922 /* WaveFront: Linux file system interface (for access via raw synth) */
1923 /***********************************************************************/
1926 wavefront_open (struct inode *inode, struct file *file)
1929 dev.opened = file->f_flags;
1934 wavefront_release(struct inode *inode, struct file *file)
1944 wavefront_ioctl(struct inode *inode, struct file *file,
1945 unsigned int cmd, unsigned long arg)
1947 wavefront_control wc;
1953 if (copy_from_user(&wc, (void __user *) arg, sizeof (wc)))
1956 if ((err = wavefront_synth_control (cmd, &wc)) == 0) {
1957 if (copy_to_user ((void __user *) arg, &wc, sizeof (wc)))
1963 case WFCTL_LOAD_SPP:
1964 return wavefront_load_patch ((const char __user *) arg);
1967 printk (KERN_WARNING LOGNAME "invalid ioctl %#x\n", cmd);
1974 static /*const*/ struct file_operations wavefront_fops = {
1975 .owner = THIS_MODULE,
1976 .llseek = no_llseek,
1977 .ioctl = wavefront_ioctl,
1978 .open = wavefront_open,
1979 .release = wavefront_release,
1983 /***********************************************************************/
1984 /* WaveFront: OSS installation and support interface */
1985 /***********************************************************************/
1987 #if OSS_SUPPORT_LEVEL & OSS_SUPPORT_SEQ
1989 static struct synth_info wavefront_info =
1990 {"Turtle Beach WaveFront", 0, SYNTH_TYPE_SAMPLE, SAMPLE_TYPE_WAVEFRONT,
1991 0, 32, 0, 0, SYNTH_CAP_INPUT};
1994 wavefront_oss_open (int devno, int mode)
2002 wavefront_oss_close (int devno)
2011 wavefront_oss_ioctl (int devno, unsigned int cmd, void __user * arg)
2014 wavefront_control wc;
2018 case SNDCTL_SYNTH_INFO:
2019 if(copy_to_user(arg, &wavefront_info, sizeof (wavefront_info)))
2023 case SNDCTL_SEQ_RESETSAMPLES:
2024 // printk (KERN_WARNING LOGNAME "driver cannot reset samples.\n");
2025 return 0; /* don't force an error */
2027 case SNDCTL_SEQ_PERCMODE:
2028 return 0; /* don't force an error */
2030 case SNDCTL_SYNTH_MEMAVL:
2031 if ((dev.freemem = wavefront_freemem ()) < 0) {
2032 printk (KERN_ERR LOGNAME "cannot get memory size\n");
2039 case SNDCTL_SYNTH_CONTROL:
2040 if(copy_from_user (&wc, arg, sizeof (wc)))
2042 else if ((err = wavefront_synth_control (cmd, &wc)) == 0) {
2043 if(copy_to_user (arg, &wc, sizeof (wc)))
2055 wavefront_oss_load_patch (int devno, int format, const char __user *addr,
2056 int offs, int count, int pmgr_flag)
2059 if (format == SYSEX_PATCH) { /* Handled by midi_synth.c */
2060 if (midi_load_patch == NULL) {
2061 printk (KERN_ERR LOGNAME
2062 "SYSEX not loadable: "
2063 "no midi patch loader!\n");
2067 return midi_load_patch (devno, format, addr,
2068 offs, count, pmgr_flag);
2070 } else if (format == GUS_PATCH) {
2071 return wavefront_load_gus_patch (devno, format,
2072 addr, offs, count, pmgr_flag);
2074 } else if (format != WAVEFRONT_PATCH) {
2075 printk (KERN_ERR LOGNAME "unknown patch format %d\n", format);
2079 if (count < sizeof (wavefront_patch_info)) {
2080 printk (KERN_ERR LOGNAME "sample header too short\n");
2084 /* "addr" points to a user-space wavefront_patch_info */
2086 return wavefront_load_patch (addr);
2089 static struct synth_operations wavefront_operations =
2091 .owner = THIS_MODULE,
2093 .info = &wavefront_info,
2095 .synth_type = SYNTH_TYPE_SAMPLE,
2096 .synth_subtype = SAMPLE_TYPE_WAVEFRONT,
2097 .open = wavefront_oss_open,
2098 .close = wavefront_oss_close,
2099 .ioctl = wavefront_oss_ioctl,
2100 .kill_note = midi_synth_kill_note,
2101 .start_note = midi_synth_start_note,
2102 .set_instr = midi_synth_set_instr,
2103 .reset = midi_synth_reset,
2104 .load_patch = midi_synth_load_patch,
2105 .aftertouch = midi_synth_aftertouch,
2106 .controller = midi_synth_controller,
2107 .panning = midi_synth_panning,
2108 .bender = midi_synth_bender,
2109 .setup_voice = midi_synth_setup_voice
2111 #endif /* OSS_SUPPORT_SEQ */
2113 #if OSS_SUPPORT_LEVEL & OSS_SUPPORT_STATIC_INSTALL
2115 static void __init attach_wavefront (struct address_info *hw_config)
2117 (void) install_wavefront ();
2120 static int __init probe_wavefront (struct address_info *hw_config)
2122 return !detect_wavefront (hw_config->irq, hw_config->io_base);
2125 static void __exit unload_wavefront (struct address_info *hw_config)
2127 (void) uninstall_wavefront ();
2130 #endif /* OSS_SUPPORT_STATIC_INSTALL */
2132 /***********************************************************************/
2133 /* WaveFront: Linux modular sound kernel installation interface */
2134 /***********************************************************************/
2137 wavefrontintr(int irq, void *dev_id, struct pt_regs *dummy)
2139 struct wf_config *hw = dev_id;
2142 Some comments on interrupts. I attempted a version of this
2143 driver that used interrupts throughout the code instead of
2144 doing busy and/or sleep-waiting. Alas, it appears that once
2145 the Motorola firmware is downloaded, the card *never*
2146 generates an RX interrupt. These are successfully generated
2147 during firmware loading, and after that wavefront_status()
2148 reports that an interrupt is pending on the card from time
2149 to time, but it never seems to be delivered to this
2150 driver. Note also that wavefront_status() continues to
2151 report that RX interrupts are enabled, suggesting that I
2152 didn't goof up and disable them by mistake.
2154 Thus, I stepped back to a prior version of
2155 wavefront_wait(), the only place where this really
2156 matters. Its sad, but I've looked through the code to check
2157 on things, and I really feel certain that the Motorola
2158 firmware prevents RX-ready interrupts.
2161 if ((wavefront_status() & (STAT_INTR_READ|STAT_INTR_WRITE)) == 0) {
2167 wake_up_interruptible (&hw->interrupt_sleeper);
2173 0 Host Rx Interrupt Enable (1=Enabled)
2174 1 Host Rx Register Full (1=Full)
2175 2 Host Rx Interrupt Pending (1=Interrupt)
2177 4 Host Tx Interrupt (1=Enabled)
2178 5 Host Tx Register empty (1=Empty)
2179 6 Host Tx Interrupt Pending (1=Interrupt)
2184 wavefront_interrupt_bits (int irq)
2204 printk (KERN_WARNING LOGNAME "invalid IRQ %d\n", irq);
2212 wavefront_should_cause_interrupt (int val, int port, int timeout)
2215 unsigned long flags;
2217 /* this will not help on SMP - but at least it compiles */
2218 spin_lock_irqsave(&lock, flags);
2221 interruptible_sleep_on_timeout (&dev.interrupt_sleeper, timeout);
2222 spin_unlock_irqrestore(&lock,flags);
2225 static int __init wavefront_hw_reset (void)
2229 unsigned long irq_mask;
2232 /* IRQ already checked in init_module() */
2234 bits = wavefront_interrupt_bits (dev.irq);
2236 printk (KERN_DEBUG LOGNAME "autodetecting WaveFront IRQ\n");
2238 irq_mask = probe_irq_on ();
2240 outb (0x0, dev.control_port);
2241 outb (0x80 | 0x40 | bits, dev.data_port);
2242 wavefront_should_cause_interrupt(0x80|0x40|0x10|0x1,
2244 (reset_time*HZ)/100);
2246 reported_irq = probe_irq_off (irq_mask);
2248 if (reported_irq != dev.irq) {
2249 if (reported_irq == 0) {
2250 printk (KERN_ERR LOGNAME
2251 "No unassigned interrupts detected "
2252 "after h/w reset\n");
2253 } else if (reported_irq < 0) {
2254 printk (KERN_ERR LOGNAME
2255 "Multiple unassigned interrupts detected "
2256 "after h/w reset\n");
2258 printk (KERN_ERR LOGNAME "autodetected IRQ %d not the "
2259 "value provided (%d)\n", reported_irq,
2265 printk (KERN_INFO LOGNAME "autodetected IRQ at %d\n",
2269 if (request_irq (dev.irq, wavefrontintr,
2270 IRQF_DISABLED|IRQF_SHARED,
2271 "wavefront synth", &dev) < 0) {
2272 printk (KERN_WARNING LOGNAME "IRQ %d not available!\n",
2277 /* try reset of port */
2279 outb (0x0, dev.control_port);
2281 /* At this point, the board is in reset, and the H/W initialization
2282 register is accessed at the same address as the data port.
2284 Bit 7 - Enable IRQ Driver
2285 0 - Tri-state the Wave-Board drivers for the PC Bus IRQs
2286 1 - Enable IRQ selected by bits 5:3 to be driven onto the PC Bus.
2288 Bit 6 - MIDI Interface Select
2290 0 - Use the MIDI Input from the 26-pin WaveBlaster
2291 compatible header as the serial MIDI source
2292 1 - Use the MIDI Input from the 9-pin D connector as the
2295 Bits 5:3 - IRQ Selection
2306 Bit 0 - Disable Boot ROM
2307 0 - memory accesses to 03FC30-03FFFFH utilize the internal Boot ROM
2308 1 - memory accesses to 03FC30-03FFFFH are directed to external
2313 /* configure hardware: IRQ, enable interrupts,
2314 plus external 9-pin MIDI interface selected
2317 outb (0x80 | 0x40 | bits, dev.data_port);
2321 0 Host Rx Interrupt Enable (1=Enabled) 0x1
2325 4 Host Tx Interrupt Enable 0x10
2326 5 Mute (0=Mute; 1=Play) 0x20
2327 6 Master Interrupt Enable (1=Enabled) 0x40
2328 7 Master Reset (0=Reset; 1=Run) 0x80
2330 Take us out of reset, mute output, master + TX + RX interrupts on.
2332 We'll get an interrupt presumably to tell us that the TX
2336 wavefront_should_cause_interrupt(0x80|0x40|0x10|0x1,
2338 (reset_time*HZ)/100);
2340 /* Note: data port is now the data port, not the h/w initialization
2345 printk (KERN_WARNING LOGNAME
2346 "intr not received after h/w un-reset.\n");
2350 dev.interrupts_on = 1;
2352 /* Note: data port is now the data port, not the h/w initialization
2355 At this point, only "HW VERSION" or "DOWNLOAD OS" commands
2356 will work. So, issue one of them, and wait for TX
2357 interrupt. This can take a *long* time after a cold boot,
2358 while the ISC ROM does its RAM test. The SDK says up to 4
2359 seconds - with 12MB of RAM on a Tropez+, it takes a lot
2360 longer than that (~16secs). Note that the card understands
2361 the difference between a warm and a cold boot, so
2362 subsequent ISC2115 reboots (say, caused by module
2363 reloading) will get through this much faster.
2365 XXX Interesting question: why is no RX interrupt received first ?
2368 wavefront_should_cause_interrupt(WFC_HARDWARE_VERSION,
2369 dev.data_port, ramcheck_time*HZ);
2372 printk (KERN_WARNING LOGNAME
2373 "post-RAM-check interrupt not received.\n");
2377 if (!wavefront_wait (STAT_CAN_READ)) {
2378 printk (KERN_WARNING LOGNAME
2379 "no response to HW version cmd.\n");
2383 if ((hwv[0] = wavefront_read ()) == -1) {
2384 printk (KERN_WARNING LOGNAME
2385 "board not responding correctly.\n");
2389 if (hwv[0] == 0xFF) { /* NAK */
2391 /* Board's RAM test failed. Try to read error code,
2392 and tell us about it either way.
2395 if ((hwv[0] = wavefront_read ()) == -1) {
2396 printk (KERN_WARNING LOGNAME "on-board RAM test failed "
2397 "(bad error code).\n");
2399 printk (KERN_WARNING LOGNAME "on-board RAM test failed "
2400 "(error code: 0x%x).\n",
2406 /* We're OK, just get the next byte of the HW version response */
2408 if ((hwv[1] = wavefront_read ()) == -1) {
2409 printk (KERN_WARNING LOGNAME "incorrect h/w response.\n");
2413 printk (KERN_INFO LOGNAME "hardware version %d.%d\n",
2421 free_irq (dev.irq, &dev);
2427 static int __init detect_wavefront (int irq, int io_base)
2429 unsigned char rbuf[4], wbuf[4];
2431 /* TB docs say the device takes up 8 ports, but we know that
2432 if there is an FX device present (i.e. a Tropez+) it really
2436 if (!request_region (io_base, 16, "wavfront")) {
2437 printk (KERN_ERR LOGNAME "IO address range 0x%x - 0x%x "
2438 "already in use - ignored\n", dev.base,
2446 dev.debug = debug_default;
2447 dev.interrupts_on = 0;
2449 dev.rom_samples_rdonly = 1; /* XXX default lock on ROM sample slots */
2451 if (wavefront_cmd (WFC_FIRMWARE_VERSION, rbuf, wbuf) == 0) {
2453 dev.fw_version[0] = rbuf[0];
2454 dev.fw_version[1] = rbuf[1];
2455 printk (KERN_INFO LOGNAME
2456 "firmware %d.%d already loaded.\n",
2459 /* check that a command actually works */
2461 if (wavefront_cmd (WFC_HARDWARE_VERSION,
2463 dev.hw_version[0] = rbuf[0];
2464 dev.hw_version[1] = rbuf[1];
2466 printk (KERN_WARNING LOGNAME "not raw, but no "
2467 "hardware version!\n");
2468 release_region (io_base, 16);
2473 /* will re-acquire region in install_wavefront() */
2474 release_region (io_base, 16);
2477 printk (KERN_INFO LOGNAME
2478 "reloading firmware anyway.\n");
2485 printk (KERN_INFO LOGNAME
2486 "no response to firmware probe, assume raw.\n");
2490 init_waitqueue_head (&dev.interrupt_sleeper);
2492 if (wavefront_hw_reset ()) {
2493 printk (KERN_WARNING LOGNAME "hardware reset failed\n");
2494 release_region (io_base, 16);
2498 /* Check for FX device, present only on Tropez+ */
2500 dev.has_fx = (detect_wffx () == 0);
2502 /* will re-acquire region in install_wavefront() */
2503 release_region (io_base, 16);
2508 #include <linux/fs.h>
2509 #include <linux/mm.h>
2510 #include <linux/slab.h>
2511 #include <asm/uaccess.h>
2515 wavefront_download_firmware (char *path)
2518 unsigned char section[WF_SECTION_MAX];
2519 char section_length; /* yes, just a char; max value is WF_SECTION_MAX */
2520 int section_cnt_downloaded = 0;
2526 /* This tries to be a bit cleverer than the stuff Alan Cox did for
2527 the generic sound firmware, in that it actually knows
2528 something about the structure of the Motorola firmware. In
2529 particular, it uses a version that has been stripped of the
2530 20K of useless header information, and had section lengths
2531 added, making it possible to load the entire OS without any
2532 [kv]malloc() activity, since the longest entity we ever read is
2533 42 bytes (well, WF_SECTION_MAX) long.
2539 if ((fd = sys_open (path, 0, 0)) < 0) {
2540 printk (KERN_WARNING LOGNAME "Unable to load \"%s\".\n",
2548 if ((x = sys_read (fd, §ion_length, sizeof (section_length))) !=
2549 sizeof (section_length)) {
2550 printk (KERN_ERR LOGNAME "firmware read error.\n");
2554 if (section_length == 0) {
2558 if (sys_read (fd, section, section_length) != section_length) {
2559 printk (KERN_ERR LOGNAME "firmware section "
2566 if (wavefront_write (WFC_DOWNLOAD_OS)) {
2570 for (i = 0; i < section_length; i++) {
2571 if (wavefront_write (section[i])) {
2578 if (wavefront_wait (STAT_CAN_READ)) {
2580 if ((c = inb (dev.data_port)) != WF_ACK) {
2582 printk (KERN_ERR LOGNAME "download "
2583 "of section #%d not "
2584 "acknowledged, ack = 0x%x\n",
2585 section_cnt_downloaded + 1, c);
2591 printk (KERN_ERR LOGNAME "time out for firmware ACK.\n");
2604 printk (KERN_ERR "\nWaveFront: firmware download failed!!!\n");
2608 static int __init wavefront_config_midi (void)
2610 unsigned char rbuf[4], wbuf[4];
2612 if (detect_wf_mpu (dev.irq, dev.base) < 0) {
2613 printk (KERN_WARNING LOGNAME
2614 "could not find working MIDI device\n");
2618 if ((dev.mididev = install_wf_mpu ()) < 0) {
2619 printk (KERN_WARNING LOGNAME
2620 "MIDI interfaces not configured\n");
2624 /* Route external MIDI to WaveFront synth (by default) */
2626 if (wavefront_cmd (WFC_MISYNTH_ON, rbuf, wbuf)) {
2627 printk (KERN_WARNING LOGNAME
2628 "cannot enable MIDI-IN to synth routing.\n");
2633 #if OSS_SUPPORT_LEVEL & OSS_SUPPORT_SEQ
2634 /* Get the regular MIDI patch loading function, so we can
2635 use it if we ever get handed a SYSEX patch. This is
2636 unlikely, because its so damn slow, but we may as well
2637 leave this functionality from maui.c behind, since it
2638 could be useful for sequencer applications that can
2639 only use MIDI to do patch loading.
2642 if (midi_devs[dev.mididev]->converter != NULL) {
2643 midi_load_patch = midi_devs[dev.mididev]->converter->load_patch;
2644 midi_devs[dev.mididev]->converter->load_patch =
2645 &wavefront_oss_load_patch;
2648 #endif /* OSS_SUPPORT_SEQ */
2650 /* Turn on Virtual MIDI, but first *always* turn it off,
2651 since otherwise consectutive reloads of the driver will
2652 never cause the hardware to generate the initial "internal" or
2653 "external" source bytes in the MIDI data stream. This
2654 is pretty important, since the internal hardware generally will
2655 be used to generate none or very little MIDI output, and
2656 thus the only source of MIDI data is actually external. Without
2657 the switch bytes, the driver will think it all comes from
2658 the internal interface. Duh.
2661 if (wavefront_cmd (WFC_VMIDI_OFF, rbuf, wbuf)) {
2662 printk (KERN_WARNING LOGNAME
2663 "virtual MIDI mode not disabled\n");
2664 return 0; /* We're OK, but missing the external MIDI dev */
2667 if ((dev.ext_mididev = virtual_midi_enable ()) < 0) {
2668 printk (KERN_WARNING LOGNAME "no virtual MIDI access.\n");
2670 if (wavefront_cmd (WFC_VMIDI_ON, rbuf, wbuf)) {
2671 printk (KERN_WARNING LOGNAME
2672 "cannot enable virtual MIDI mode.\n");
2673 virtual_midi_disable ();
2680 static int __init wavefront_do_reset (int atboot)
2684 if (!atboot && wavefront_hw_reset ()) {
2685 printk (KERN_WARNING LOGNAME "hw reset failed.\n");
2690 if (wavefront_download_firmware (ospath)) {
2696 /* Wait for the OS to get running. The protocol for
2697 this is non-obvious, and was determined by
2698 using port-IO tracing in DOSemu and some
2699 experimentation here.
2701 Rather than using timed waits, use interrupts creatively.
2704 wavefront_should_cause_interrupt (WFC_NOOP,
2709 printk (KERN_WARNING LOGNAME
2710 "no post-OS interrupt.\n");
2714 /* Now, do it again ! */
2716 wavefront_should_cause_interrupt (WFC_NOOP,
2717 dev.data_port, (10*HZ));
2720 printk (KERN_WARNING LOGNAME
2721 "no post-OS interrupt(2).\n");
2725 /* OK, no (RX/TX) interrupts any more, but leave mute
2729 outb (0x80|0x40, dev.control_port);
2731 /* No need for the IRQ anymore */
2733 free_irq (dev.irq, &dev);
2737 if (dev.has_fx && fx_raw) {
2741 /* SETUPSND.EXE asks for sample memory config here, but since i
2742 have no idea how to interpret the result, we'll forget
2746 if ((dev.freemem = wavefront_freemem ()) < 0) {
2750 printk (KERN_INFO LOGNAME "available DRAM %dk\n", dev.freemem / 1024);
2752 if (wavefront_write (0xf0) ||
2753 wavefront_write (1) ||
2754 (wavefront_read () < 0)) {
2756 printk (KERN_WARNING LOGNAME "MPU emulation mode not set.\n");
2762 if (wavefront_cmd (WFC_SET_NVOICES, NULL, voices)) {
2763 printk (KERN_WARNING LOGNAME
2764 "cannot set number of voices to 32.\n");
2772 /* reset that sucker so that it doesn't bother us. */
2774 outb (0x0, dev.control_port);
2775 dev.interrupts_on = 0;
2777 free_irq (dev.irq, &dev);
2782 static int __init wavefront_init (int atboot)
2784 int samples_are_from_rom;
2787 samples_are_from_rom = 1;
2789 /* XXX is this always true ? */
2790 samples_are_from_rom = 0;
2793 if (dev.israw || fx_raw) {
2794 if (wavefront_do_reset (atboot)) {
2799 wavefront_get_sample_status (samples_are_from_rom);
2800 wavefront_get_program_status ();
2801 wavefront_get_patch_status ();
2803 /* Start normal operation: unreset, master interrupt enabled, no mute
2806 outb (0x80|0x40|0x20, dev.control_port);
2811 static int __init install_wavefront (void)
2813 if (!request_region (dev.base+2, 6, "wavefront synth"))
2817 if (!request_region (dev.base+8, 8, "wavefront fx")) {
2818 release_region (dev.base+2, 6);
2823 if ((dev.synth_dev = register_sound_synth (&wavefront_fops, -1)) < 0) {
2824 printk (KERN_ERR LOGNAME "cannot register raw synth\n");
2828 #if OSS_SUPPORT_LEVEL & OSS_SUPPORT_SEQ
2829 if ((dev.oss_dev = sound_alloc_synthdev()) == -1) {
2830 printk (KERN_ERR LOGNAME "Too many sequencers\n");
2831 /* FIXME: leak: should unregister sound synth */
2834 synth_devs[dev.oss_dev] = &wavefront_operations;
2836 #endif /* OSS_SUPPORT_SEQ */
2838 if (wavefront_init (1) < 0) {
2839 printk (KERN_WARNING LOGNAME "initialization failed.\n");
2841 #if OSS_SUPPORT_LEVEL & OSS_SUPPORT_SEQ
2842 sound_unload_synthdev (dev.oss_dev);
2843 #endif /* OSS_SUPPORT_SEQ */
2848 if (wavefront_config_midi ()) {
2849 printk (KERN_WARNING LOGNAME "could not initialize MIDI.\n");
2855 release_region (dev.base+2, 6);
2857 release_region (dev.base+8, 8);
2861 static void __exit uninstall_wavefront (void)
2863 /* the first two i/o addresses are freed by the wf_mpu code */
2864 release_region (dev.base+2, 6);
2867 release_region (dev.base+8, 8);
2870 unregister_sound_synth (dev.synth_dev);
2872 #if OSS_SUPPORT_LEVEL & OSS_SUPPORT_SEQ
2873 sound_unload_synthdev (dev.oss_dev);
2874 #endif /* OSS_SUPPORT_SEQ */
2875 uninstall_wf_mpu ();
2878 /***********************************************************************/
2879 /* WaveFront FX control */
2880 /***********************************************************************/
2884 /* Control bits for the Load Control Register
2887 #define FX_LSB_TRANSFER 0x01 /* transfer after DSP LSB byte written */
2888 #define FX_MSB_TRANSFER 0x02 /* transfer after DSP MSB byte written */
2889 #define FX_AUTO_INCR 0x04 /* auto-increment DSP address after transfer */
2896 unsigned int x = 0x80;
2898 for (i = 0; i < 1000; i++) {
2899 x = inb (dev.fx_status);
2900 if ((x & 0x80) == 0) {
2906 printk (KERN_ERR LOGNAME "FX device never idle.\n");
2913 int __init detect_wffx (void)
2915 /* This is a crude check, but its the best one I have for now.
2916 Certainly on the Maui and the Tropez, wffx_idle() will
2917 report "never idle", which suggests that this test should
2921 if (inb (dev.fx_status) & 0x80) {
2922 printk (KERN_INFO LOGNAME "Hmm, probably a Maui or Tropez.\n");
2930 wffx_mute (int onoff)
2937 outb (onoff ? 0x02 : 0x00, dev.fx_op);
2941 wffx_memset (int page,
2942 int addr, int cnt, unsigned short *data)
2944 if (page < 0 || page > 7) {
2945 printk (KERN_ERR LOGNAME "FX memset: "
2946 "page must be >= 0 and <= 7\n");
2950 if (addr < 0 || addr > 0x7f) {
2951 printk (KERN_ERR LOGNAME "FX memset: "
2952 "addr must be >= 0 and <= 7f\n");
2958 outb (FX_LSB_TRANSFER, dev.fx_lcr);
2959 outb (page, dev.fx_dsp_page);
2960 outb (addr, dev.fx_dsp_addr);
2961 outb ((data[0] >> 8), dev.fx_dsp_msb);
2962 outb ((data[0] & 0xff), dev.fx_dsp_lsb);
2964 printk (KERN_INFO LOGNAME "FX: addr %d:%x set to 0x%x\n",
2965 page, addr, data[0]);
2970 outb (FX_AUTO_INCR|FX_LSB_TRANSFER, dev.fx_lcr);
2971 outb (page, dev.fx_dsp_page);
2972 outb (addr, dev.fx_dsp_addr);
2974 for (i = 0; i < cnt; i++) {
2975 outb ((data[i] >> 8), dev.fx_dsp_msb);
2976 outb ((data[i] & 0xff), dev.fx_dsp_lsb);
2977 if (!wffx_idle ()) {
2983 printk (KERN_WARNING LOGNAME
2985 "(0x%x, 0x%x, %p, %d) incomplete\n",
2986 page, addr, data, cnt);
2995 wffx_ioctl (wavefront_fx_info *r)
2998 unsigned short page_data[256];
3001 switch (r->request) {
3003 wffx_mute (r->data[0]);
3008 if (r->data[2] <= 0) {
3009 printk (KERN_ERR LOGNAME "cannot write "
3010 "<= 0 bytes to FX\n");
3012 } else if (r->data[2] == 1) {
3013 pd = (unsigned short *) &r->data[3];
3015 if (r->data[2] > sizeof (page_data)) {
3016 printk (KERN_ERR LOGNAME "cannot write "
3017 "> 255 bytes to FX\n");
3020 if (copy_from_user(page_data,
3021 (unsigned char __user *)r->data[3],
3027 return wffx_memset (r->data[0], /* page */
3028 r->data[1], /* addr */
3029 r->data[2], /* cnt */
3033 printk (KERN_WARNING LOGNAME
3034 "FX: ioctl %d not yet supported\n",
3040 /* YSS225 initialization.
3042 This code was developed using DOSEMU. The Turtle Beach SETUPSND
3043 utility was run with I/O tracing in DOSEMU enabled, and a reconstruction
3044 of the port I/O done, using the Yamaha faxback document as a guide
3045 to add more logic to the code. Its really pretty weird.
3047 There was an alternative approach of just dumping the whole I/O
3048 sequence as a series of port/value pairs and a simple loop
3049 that output it. However, I hope that eventually I'll get more
3050 control over what this code does, and so I tried to stick with
3051 a somewhat "algorithmic" approach.
3054 static int __init wffx_init (void)
3059 /* Set all bits for all channels on the MOD unit to zero */
3060 /* XXX But why do this twice ? */
3062 for (j = 0; j < 2; j++) {
3063 for (i = 0x10; i <= 0xff; i++) {
3065 if (!wffx_idle ()) {
3069 outb (i, dev.fx_mod_addr);
3070 outb (0x0, dev.fx_mod_data);
3074 if (!wffx_idle()) return (-1);
3075 outb (0x02, dev.fx_op); /* mute on */
3077 if (!wffx_idle()) return (-1);
3078 outb (0x07, dev.fx_dsp_page);
3079 outb (0x44, dev.fx_dsp_addr);
3080 outb (0x00, dev.fx_dsp_msb);
3081 outb (0x00, dev.fx_dsp_lsb);
3082 if (!wffx_idle()) return (-1);
3083 outb (0x07, dev.fx_dsp_page);
3084 outb (0x42, dev.fx_dsp_addr);
3085 outb (0x00, dev.fx_dsp_msb);
3086 outb (0x00, dev.fx_dsp_lsb);
3087 if (!wffx_idle()) return (-1);
3088 outb (0x07, dev.fx_dsp_page);
3089 outb (0x43, dev.fx_dsp_addr);
3090 outb (0x00, dev.fx_dsp_msb);
3091 outb (0x00, dev.fx_dsp_lsb);
3092 if (!wffx_idle()) return (-1);
3093 outb (0x07, dev.fx_dsp_page);
3094 outb (0x7c, dev.fx_dsp_addr);
3095 outb (0x00, dev.fx_dsp_msb);
3096 outb (0x00, dev.fx_dsp_lsb);
3097 if (!wffx_idle()) return (-1);
3098 outb (0x07, dev.fx_dsp_page);
3099 outb (0x7e, dev.fx_dsp_addr);
3100 outb (0x00, dev.fx_dsp_msb);
3101 outb (0x00, dev.fx_dsp_lsb);
3102 if (!wffx_idle()) return (-1);
3103 outb (0x07, dev.fx_dsp_page);
3104 outb (0x46, dev.fx_dsp_addr);
3105 outb (0x00, dev.fx_dsp_msb);
3106 outb (0x00, dev.fx_dsp_lsb);
3107 if (!wffx_idle()) return (-1);
3108 outb (0x07, dev.fx_dsp_page);
3109 outb (0x49, dev.fx_dsp_addr);
3110 outb (0x00, dev.fx_dsp_msb);
3111 outb (0x00, dev.fx_dsp_lsb);
3112 if (!wffx_idle()) return (-1);
3113 outb (0x07, dev.fx_dsp_page);
3114 outb (0x47, dev.fx_dsp_addr);
3115 outb (0x00, dev.fx_dsp_msb);
3116 outb (0x00, dev.fx_dsp_lsb);
3117 if (!wffx_idle()) return (-1);
3118 outb (0x07, dev.fx_dsp_page);
3119 outb (0x4a, dev.fx_dsp_addr);
3120 outb (0x00, dev.fx_dsp_msb);
3121 outb (0x00, dev.fx_dsp_lsb);
3123 /* either because of stupidity by TB's programmers, or because it
3124 actually does something, rezero the MOD page.
3126 for (i = 0x10; i <= 0xff; i++) {
3128 if (!wffx_idle ()) {
3132 outb (i, dev.fx_mod_addr);
3133 outb (0x0, dev.fx_mod_data);
3135 /* load page zero */
3137 outb (FX_AUTO_INCR|FX_LSB_TRANSFER, dev.fx_lcr);
3138 outb (0x00, dev.fx_dsp_page);
3139 outb (0x00, dev.fx_dsp_addr);
3141 for (i = 0; i < sizeof (page_zero); i += 2) {
3142 outb (page_zero[i], dev.fx_dsp_msb);
3143 outb (page_zero[i+1], dev.fx_dsp_lsb);
3144 if (!wffx_idle()) return (-1);
3147 /* Now load page one */
3149 outb (FX_AUTO_INCR|FX_LSB_TRANSFER, dev.fx_lcr);
3150 outb (0x01, dev.fx_dsp_page);
3151 outb (0x00, dev.fx_dsp_addr);
3153 for (i = 0; i < sizeof (page_one); i += 2) {
3154 outb (page_one[i], dev.fx_dsp_msb);
3155 outb (page_one[i+1], dev.fx_dsp_lsb);
3156 if (!wffx_idle()) return (-1);
3159 outb (FX_AUTO_INCR|FX_LSB_TRANSFER, dev.fx_lcr);
3160 outb (0x02, dev.fx_dsp_page);
3161 outb (0x00, dev.fx_dsp_addr);
3163 for (i = 0; i < sizeof (page_two); i++) {
3164 outb (page_two[i], dev.fx_dsp_lsb);
3165 if (!wffx_idle()) return (-1);
3168 outb (FX_AUTO_INCR|FX_LSB_TRANSFER, dev.fx_lcr);
3169 outb (0x03, dev.fx_dsp_page);
3170 outb (0x00, dev.fx_dsp_addr);
3172 for (i = 0; i < sizeof (page_three); i++) {
3173 outb (page_three[i], dev.fx_dsp_lsb);
3174 if (!wffx_idle()) return (-1);
3177 outb (FX_AUTO_INCR|FX_LSB_TRANSFER, dev.fx_lcr);
3178 outb (0x04, dev.fx_dsp_page);
3179 outb (0x00, dev.fx_dsp_addr);
3181 for (i = 0; i < sizeof (page_four); i++) {
3182 outb (page_four[i], dev.fx_dsp_lsb);
3183 if (!wffx_idle()) return (-1);
3186 /* Load memory area (page six) */
3188 outb (FX_LSB_TRANSFER, dev.fx_lcr);
3189 outb (0x06, dev.fx_dsp_page);
3191 for (i = 0; i < sizeof (page_six); i += 3) {
3192 outb (page_six[i], dev.fx_dsp_addr);
3193 outb (page_six[i+1], dev.fx_dsp_msb);
3194 outb (page_six[i+2], dev.fx_dsp_lsb);
3195 if (!wffx_idle()) return (-1);
3198 outb (FX_AUTO_INCR|FX_LSB_TRANSFER, dev.fx_lcr);
3199 outb (0x07, dev.fx_dsp_page);
3200 outb (0x00, dev.fx_dsp_addr);
3202 for (i = 0; i < sizeof (page_seven); i += 2) {
3203 outb (page_seven[i], dev.fx_dsp_msb);
3204 outb (page_seven[i+1], dev.fx_dsp_lsb);
3205 if (!wffx_idle()) return (-1);
3208 /* Now setup the MOD area. We do this algorithmically in order to
3209 save a little data space. It could be done in the same fashion
3213 for (i = 0x00; i <= 0x0f; i++) {
3214 outb (0x01, dev.fx_mod_addr);
3215 outb (i, dev.fx_mod_data);
3216 if (!wffx_idle()) return (-1);
3217 outb (0x02, dev.fx_mod_addr);
3218 outb (0x00, dev.fx_mod_data);
3219 if (!wffx_idle()) return (-1);
3222 for (i = 0xb0; i <= 0xbf; i++) {
3223 outb (i, dev.fx_mod_addr);
3224 outb (0x20, dev.fx_mod_data);
3225 if (!wffx_idle()) return (-1);
3228 for (i = 0xf0; i <= 0xff; i++) {
3229 outb (i, dev.fx_mod_addr);
3230 outb (0x20, dev.fx_mod_data);
3231 if (!wffx_idle()) return (-1);
3234 for (i = 0x10; i <= 0x1d; i++) {
3235 outb (i, dev.fx_mod_addr);
3236 outb (0xff, dev.fx_mod_data);
3237 if (!wffx_idle()) return (-1);
3240 outb (0x1e, dev.fx_mod_addr);
3241 outb (0x40, dev.fx_mod_data);
3242 if (!wffx_idle()) return (-1);
3244 for (i = 0x1f; i <= 0x2d; i++) {
3245 outb (i, dev.fx_mod_addr);
3246 outb (0xff, dev.fx_mod_data);
3247 if (!wffx_idle()) return (-1);
3250 outb (0x2e, dev.fx_mod_addr);
3251 outb (0x00, dev.fx_mod_data);
3252 if (!wffx_idle()) return (-1);
3254 for (i = 0x2f; i <= 0x3e; i++) {
3255 outb (i, dev.fx_mod_addr);
3256 outb (0x00, dev.fx_mod_data);
3257 if (!wffx_idle()) return (-1);
3260 outb (0x3f, dev.fx_mod_addr);
3261 outb (0x20, dev.fx_mod_data);
3262 if (!wffx_idle()) return (-1);
3264 for (i = 0x40; i <= 0x4d; i++) {
3265 outb (i, dev.fx_mod_addr);
3266 outb (0x00, dev.fx_mod_data);
3267 if (!wffx_idle()) return (-1);
3270 outb (0x4e, dev.fx_mod_addr);
3271 outb (0x0e, dev.fx_mod_data);
3272 if (!wffx_idle()) return (-1);
3273 outb (0x4f, dev.fx_mod_addr);
3274 outb (0x0e, dev.fx_mod_data);
3275 if (!wffx_idle()) return (-1);
3278 for (i = 0x50; i <= 0x6b; i++) {
3279 outb (i, dev.fx_mod_addr);
3280 outb (0x00, dev.fx_mod_data);
3281 if (!wffx_idle()) return (-1);
3284 outb (0x6c, dev.fx_mod_addr);
3285 outb (0x40, dev.fx_mod_data);
3286 if (!wffx_idle()) return (-1);
3288 outb (0x6d, dev.fx_mod_addr);
3289 outb (0x00, dev.fx_mod_data);
3290 if (!wffx_idle()) return (-1);
3292 outb (0x6e, dev.fx_mod_addr);
3293 outb (0x40, dev.fx_mod_data);
3294 if (!wffx_idle()) return (-1);
3296 outb (0x6f, dev.fx_mod_addr);
3297 outb (0x40, dev.fx_mod_data);
3298 if (!wffx_idle()) return (-1);
3300 for (i = 0x70; i <= 0x7f; i++) {
3301 outb (i, dev.fx_mod_addr);
3302 outb (0xc0, dev.fx_mod_data);
3303 if (!wffx_idle()) return (-1);
3306 for (i = 0x80; i <= 0xaf; i++) {
3307 outb (i, dev.fx_mod_addr);
3308 outb (0x00, dev.fx_mod_data);
3309 if (!wffx_idle()) return (-1);
3312 for (i = 0xc0; i <= 0xdd; i++) {
3313 outb (i, dev.fx_mod_addr);
3314 outb (0x00, dev.fx_mod_data);
3315 if (!wffx_idle()) return (-1);
3318 outb (0xde, dev.fx_mod_addr);
3319 outb (0x10, dev.fx_mod_data);
3320 if (!wffx_idle()) return (-1);
3321 outb (0xdf, dev.fx_mod_addr);
3322 outb (0x10, dev.fx_mod_data);
3323 if (!wffx_idle()) return (-1);
3325 for (i = 0xe0; i <= 0xef; i++) {
3326 outb (i, dev.fx_mod_addr);
3327 outb (0x00, dev.fx_mod_data);
3328 if (!wffx_idle()) return (-1);
3331 for (i = 0x00; i <= 0x0f; i++) {
3332 outb (0x01, dev.fx_mod_addr);
3333 outb (i, dev.fx_mod_data);
3334 outb (0x02, dev.fx_mod_addr);
3335 outb (0x01, dev.fx_mod_data);
3336 if (!wffx_idle()) return (-1);
3339 outb (0x02, dev.fx_op); /* mute on */
3341 /* Now set the coefficients and so forth for the programs above */
3343 for (i = 0; i < sizeof (coefficients); i += 4) {
3344 outb (coefficients[i], dev.fx_dsp_page);
3345 outb (coefficients[i+1], dev.fx_dsp_addr);
3346 outb (coefficients[i+2], dev.fx_dsp_msb);
3347 outb (coefficients[i+3], dev.fx_dsp_lsb);
3348 if (!wffx_idle()) return (-1);
3351 /* Some settings (?) that are too small to bundle into loops */
3353 if (!wffx_idle()) return (-1);
3354 outb (0x1e, dev.fx_mod_addr);
3355 outb (0x14, dev.fx_mod_data);
3356 if (!wffx_idle()) return (-1);
3357 outb (0xde, dev.fx_mod_addr);
3358 outb (0x20, dev.fx_mod_data);
3359 if (!wffx_idle()) return (-1);
3360 outb (0xdf, dev.fx_mod_addr);
3361 outb (0x20, dev.fx_mod_data);
3363 /* some more coefficients */
3365 if (!wffx_idle()) return (-1);
3366 outb (0x06, dev.fx_dsp_page);
3367 outb (0x78, dev.fx_dsp_addr);
3368 outb (0x00, dev.fx_dsp_msb);
3369 outb (0x40, dev.fx_dsp_lsb);
3370 if (!wffx_idle()) return (-1);
3371 outb (0x07, dev.fx_dsp_page);
3372 outb (0x03, dev.fx_dsp_addr);
3373 outb (0x0f, dev.fx_dsp_msb);
3374 outb (0xff, dev.fx_dsp_lsb);
3375 if (!wffx_idle()) return (-1);
3376 outb (0x07, dev.fx_dsp_page);
3377 outb (0x0b, dev.fx_dsp_addr);
3378 outb (0x0f, dev.fx_dsp_msb);
3379 outb (0xff, dev.fx_dsp_lsb);
3380 if (!wffx_idle()) return (-1);
3381 outb (0x07, dev.fx_dsp_page);
3382 outb (0x02, dev.fx_dsp_addr);
3383 outb (0x00, dev.fx_dsp_msb);
3384 outb (0x00, dev.fx_dsp_lsb);
3385 if (!wffx_idle()) return (-1);
3386 outb (0x07, dev.fx_dsp_page);
3387 outb (0x0a, dev.fx_dsp_addr);
3388 outb (0x00, dev.fx_dsp_msb);
3389 outb (0x00, dev.fx_dsp_lsb);
3390 if (!wffx_idle()) return (-1);
3391 outb (0x07, dev.fx_dsp_page);
3392 outb (0x46, dev.fx_dsp_addr);
3393 outb (0x00, dev.fx_dsp_msb);
3394 outb (0x00, dev.fx_dsp_lsb);
3395 if (!wffx_idle()) return (-1);
3396 outb (0x07, dev.fx_dsp_page);
3397 outb (0x49, dev.fx_dsp_addr);
3398 outb (0x00, dev.fx_dsp_msb);
3399 outb (0x00, dev.fx_dsp_lsb);
3401 /* Now, for some strange reason, lets reload every page
3402 and all the coefficients over again. I have *NO* idea
3403 why this is done. I do know that no sound is produced
3404 is this phase is omitted.
3407 outb (FX_AUTO_INCR|FX_LSB_TRANSFER, dev.fx_lcr);
3408 outb (0x00, dev.fx_dsp_page);
3409 outb (0x10, dev.fx_dsp_addr);
3411 for (i = 0; i < sizeof (page_zero_v2); i += 2) {
3412 outb (page_zero_v2[i], dev.fx_dsp_msb);
3413 outb (page_zero_v2[i+1], dev.fx_dsp_lsb);
3414 if (!wffx_idle()) return (-1);
3417 outb (FX_AUTO_INCR|FX_LSB_TRANSFER, dev.fx_lcr);
3418 outb (0x01, dev.fx_dsp_page);
3419 outb (0x10, dev.fx_dsp_addr);
3421 for (i = 0; i < sizeof (page_one_v2); i += 2) {
3422 outb (page_one_v2[i], dev.fx_dsp_msb);
3423 outb (page_one_v2[i+1], dev.fx_dsp_lsb);
3424 if (!wffx_idle()) return (-1);
3427 if (!wffx_idle()) return (-1);
3428 if (!wffx_idle()) return (-1);
3430 outb (FX_AUTO_INCR|FX_LSB_TRANSFER, dev.fx_lcr);
3431 outb (0x02, dev.fx_dsp_page);
3432 outb (0x10, dev.fx_dsp_addr);
3434 for (i = 0; i < sizeof (page_two_v2); i++) {
3435 outb (page_two_v2[i], dev.fx_dsp_lsb);
3436 if (!wffx_idle()) return (-1);
3438 outb (FX_AUTO_INCR|FX_LSB_TRANSFER, dev.fx_lcr);
3439 outb (0x03, dev.fx_dsp_page);
3440 outb (0x10, dev.fx_dsp_addr);
3442 for (i = 0; i < sizeof (page_three_v2); i++) {
3443 outb (page_three_v2[i], dev.fx_dsp_lsb);
3444 if (!wffx_idle()) return (-1);
3447 outb (FX_AUTO_INCR|FX_LSB_TRANSFER, dev.fx_lcr);
3448 outb (0x04, dev.fx_dsp_page);
3449 outb (0x10, dev.fx_dsp_addr);
3451 for (i = 0; i < sizeof (page_four_v2); i++) {
3452 outb (page_four_v2[i], dev.fx_dsp_lsb);
3453 if (!wffx_idle()) return (-1);
3456 outb (FX_LSB_TRANSFER, dev.fx_lcr);
3457 outb (0x06, dev.fx_dsp_page);
3459 /* Page six v.2 is algorithmic */
3461 for (i = 0x10; i <= 0x3e; i += 2) {
3462 outb (i, dev.fx_dsp_addr);
3463 outb (0x00, dev.fx_dsp_msb);
3464 outb (0x00, dev.fx_dsp_lsb);
3465 if (!wffx_idle()) return (-1);
3468 outb (FX_AUTO_INCR|FX_LSB_TRANSFER, dev.fx_lcr);
3469 outb (0x07, dev.fx_dsp_page);
3470 outb (0x10, dev.fx_dsp_addr);
3472 for (i = 0; i < sizeof (page_seven_v2); i += 2) {
3473 outb (page_seven_v2[i], dev.fx_dsp_msb);
3474 outb (page_seven_v2[i+1], dev.fx_dsp_lsb);
3475 if (!wffx_idle()) return (-1);
3478 for (i = 0x00; i < sizeof(mod_v2); i += 2) {
3479 outb (mod_v2[i], dev.fx_mod_addr);
3480 outb (mod_v2[i+1], dev.fx_mod_data);
3481 if (!wffx_idle()) return (-1);
3484 for (i = 0; i < sizeof (coefficients2); i += 4) {
3485 outb (coefficients2[i], dev.fx_dsp_page);
3486 outb (coefficients2[i+1], dev.fx_dsp_addr);
3487 outb (coefficients2[i+2], dev.fx_dsp_msb);
3488 outb (coefficients2[i+3], dev.fx_dsp_lsb);
3489 if (!wffx_idle()) return (-1);
3492 for (i = 0; i < sizeof (coefficients3); i += 2) {
3495 outb (0x07, dev.fx_dsp_page);
3496 x = (i % 4) ? 0x4e : 0x4c;
3497 outb (x, dev.fx_dsp_addr);
3498 outb (coefficients3[i], dev.fx_dsp_msb);
3499 outb (coefficients3[i+1], dev.fx_dsp_lsb);
3502 outb (0x00, dev.fx_op); /* mute off */
3503 if (!wffx_idle()) return (-1);
3509 static int irq = -1;
3511 MODULE_AUTHOR ("Paul Barton-Davis <pbd@op.net>");
3512 MODULE_DESCRIPTION ("Turtle Beach WaveFront Linux Driver");
3513 MODULE_LICENSE("GPL");
3514 module_param (io, int, 0);
3515 module_param (irq, int, 0);
3517 static int __init init_wavfront (void)
3519 printk ("Turtle Beach WaveFront Driver\n"
3520 "Copyright (C) by Hannu Solvainen, "
3521 "Paul Barton-Davis 1993-1998.\n");
3523 /* XXX t'would be lovely to ask the CS4232 for these values, eh ? */
3525 if (io == -1 || irq == -1) {
3526 printk (KERN_INFO LOGNAME "irq and io options must be set.\n");
3530 if (wavefront_interrupt_bits (irq) < 0) {
3531 printk (KERN_INFO LOGNAME
3532 "IRQ must be 9, 5, 12 or 15 (not %d)\n", irq);
3536 if (detect_wavefront (irq, io) < 0) {
3540 if (install_wavefront () < 0) {
3547 static void __exit cleanup_wavfront (void)
3549 uninstall_wavefront ();
3552 module_init(init_wavfront);
3553 module_exit(cleanup_wavfront);