blob: b1a4eeb9dc083fb3dff34e48be328e64a48b1d50 [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001/* -*- linux-c -*-
2 *
3 * sound/wavfront.c
4 *
5 * A Linux driver for Turtle Beach WaveFront Series (Maui, Tropez, Tropez Plus)
6 *
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.
12 *
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
15 * wf_midi.c.
16 *
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.
24 *
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.
28 *
29 *
30 * Supported devices:
31 *
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
35 *
36 **********************************************************************
37 *
38 * Copyright (C) by Paul Barton-Davis 1998
39 *
40 * Some portions of this file are taken from work that is
41 * copyright (C) by Hannu Savolainen 1993-1996
42 *
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.
49 *
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.
52 *
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
57 * effects processor.
58 *
59 * $Id: wavfront.c,v 0.7 1998/09/09 15:47:36 pbd Exp $
60 *
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
63 * for more info.
64 *
65 * Changes:
66 * 11-10-2000 Bartlomiej Zolnierkiewicz <bkz@linux-ide.org>
67 * Added some __init and __initdata to entries in yss225.c
68 */
69
70#include <linux/module.h>
71
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>
82#include <linux/config.h>
83
84#include <linux/delay.h>
85
86#include "sound_config.h"
87
88#include <linux/wavefront.h>
89
90#define _MIDI_SYNTH_C_
91#define MIDI_SYNTH_NAME "WaveFront MIDI"
92#define MIDI_SYNTH_CAPS SYNTH_CAP_INPUT
93#include "midi_synth.h"
94
95/* Compile-time control of the extent to which OSS is supported.
96
97 I consider /dev/sequencer to be an anachronism, but given its
98 widespread usage by various Linux MIDI software, it seems worth
99 offering support to it if it's not too painful. Instead of using
100 /dev/sequencer, I recommend:
101
102 for synth programming and patch loading: /dev/synthNN
103 for kernel-synchronized MIDI sequencing: the ALSA sequencer
104 for direct MIDI control: /dev/midiNN
105
106 I have never tried static compilation into the kernel. The #if's
107 for this are really just notes to myself about what the code is
108 for.
109*/
110
111#define OSS_SUPPORT_SEQ 0x1 /* use of /dev/sequencer */
112#define OSS_SUPPORT_STATIC_INSTALL 0x2 /* static compilation into kernel */
113
114#define OSS_SUPPORT_LEVEL 0x1 /* just /dev/sequencer for now */
115
116#if OSS_SUPPORT_LEVEL & OSS_SUPPORT_SEQ
117static int (*midi_load_patch) (int devno, int format, const char __user *addr,
118 int offs, int count, int pmgr_flag) = NULL;
119#endif /* OSS_SUPPORT_SEQ */
120
121/* if WF_DEBUG not defined, no run-time debugging messages will
122 be available via the debug flag setting. Given the current
123 beta state of the driver, this will remain set until a future
124 version.
125*/
126
127#define WF_DEBUG 1
128
129#ifdef WF_DEBUG
130
131/* Thank goodness for gcc's preprocessor ... */
132
133#define DPRINT(cond, format, args...) \
134 if ((dev.debug & (cond)) == (cond)) { \
135 printk (KERN_DEBUG LOGNAME format, ## args); \
136 }
137#else
138#define DPRINT(cond, format, args...)
139#endif
140
141#define LOGNAME "WaveFront: "
142
143/* bitmasks for WaveFront status port value */
144
145#define STAT_RINTR_ENABLED 0x01
146#define STAT_CAN_READ 0x02
147#define STAT_INTR_READ 0x04
148#define STAT_WINTR_ENABLED 0x10
149#define STAT_CAN_WRITE 0x20
150#define STAT_INTR_WRITE 0x40
151
152/*** Module-accessible parameters ***************************************/
153
Adrian Bunk155542c2005-06-25 14:58:53 -0700154static int wf_raw; /* we normally check for "raw state" to firmware
155 loading. if set, then during driver loading, the
156 state of the board is ignored, and we reset the
157 board and load the firmware anyway.
158 */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700159
160static int fx_raw = 1; /* if this is zero, we'll leave the FX processor in
161 whatever state it is when the driver is loaded.
162 The default is to download the microprogram and
163 associated coefficients to set it up for "default"
164 operation, whatever that means.
165 */
166
167static int debug_default; /* you can set this to control debugging
168 during driver loading. it takes any combination
169 of the WF_DEBUG_* flags defined in
170 wavefront.h
171 */
172
173/* XXX this needs to be made firmware and hardware version dependent */
174
175static char *ospath = "/etc/sound/wavefront.os"; /* where to find a processed
176 version of the WaveFront OS
177 */
178
179static int wait_polls = 2000; /* This is a number of tries we poll the
180 status register before resorting to sleeping.
181 WaveFront being an ISA card each poll takes
182 about 1.2us. So before going to
183 sleep we wait up to 2.4ms in a loop.
184 */
185
186static int sleep_length = HZ/100; /* This says how long we're going to
187 sleep between polls.
188 10ms sounds reasonable for fast response.
189 */
190
191static int sleep_tries = 50; /* Wait for status 0.5 seconds total. */
192
193static int reset_time = 2; /* hundreths of a second we wait after a HW reset for
194 the expected interrupt.
195 */
196
197static int ramcheck_time = 20; /* time in seconds to wait while ROM code
198 checks on-board RAM.
199 */
200
201static int osrun_time = 10; /* time in seconds we wait for the OS to
202 start running.
203 */
204
205module_param(wf_raw, int, 0);
206module_param(fx_raw, int, 0);
207module_param(debug_default, int, 0);
208module_param(wait_polls, int, 0);
209module_param(sleep_length, int, 0);
210module_param(sleep_tries, int, 0);
211module_param(ospath, charp, 0);
212module_param(reset_time, int, 0);
213module_param(ramcheck_time, int, 0);
214module_param(osrun_time, int, 0);
215
216/***************************************************************************/
217
218/* Note: because this module doesn't export any symbols, this really isn't
219 a global variable, even if it looks like one. I was quite confused by
220 this when I started writing this as a (newer) module -- pbd.
221*/
222
223struct wf_config {
224 int devno; /* device number from kernel */
225 int irq; /* "you were one, one of the few ..." */
226 int base; /* low i/o port address */
227
228#define mpu_data_port base
229#define mpu_command_port base + 1 /* write semantics */
230#define mpu_status_port base + 1 /* read semantics */
231#define data_port base + 2
232#define status_port base + 3 /* read semantics */
233#define control_port base + 3 /* write semantics */
234#define block_port base + 4 /* 16 bit, writeonly */
235#define last_block_port base + 6 /* 16 bit, writeonly */
236
237 /* FX ports. These are mapped through the ICS2115 to the YS225.
238 The ICS2115 takes care of flipping the relevant pins on the
239 YS225 so that access to each of these ports does the right
240 thing. Note: these are NOT documented by Turtle Beach.
241 */
242
243#define fx_status base + 8
244#define fx_op base + 8
245#define fx_lcr base + 9
246#define fx_dsp_addr base + 0xa
247#define fx_dsp_page base + 0xb
248#define fx_dsp_lsb base + 0xc
249#define fx_dsp_msb base + 0xd
250#define fx_mod_addr base + 0xe
251#define fx_mod_data base + 0xf
252
253 volatile int irq_ok; /* set by interrupt handler */
254 volatile int irq_cnt; /* ditto */
255 int opened; /* flag, holds open(2) mode */
256 char debug; /* debugging flags */
257 int freemem; /* installed RAM, in bytes */
258
259 int synth_dev; /* devno for "raw" synth */
260 int mididev; /* devno for internal MIDI */
261 int ext_mididev; /* devno for external MIDI */
262 int fx_mididev; /* devno for FX MIDI interface */
263#if OSS_SUPPORT_LEVEL & OSS_SUPPORT_SEQ
264 int oss_dev; /* devno for OSS sequencer synth */
265#endif /* OSS_SUPPORT_SEQ */
266
267 char fw_version[2]; /* major = [0], minor = [1] */
268 char hw_version[2]; /* major = [0], minor = [1] */
269 char israw; /* needs Motorola microcode */
270 char has_fx; /* has FX processor (Tropez+) */
271 char prog_status[WF_MAX_PROGRAM]; /* WF_SLOT_* */
272 char patch_status[WF_MAX_PATCH]; /* WF_SLOT_* */
273 char sample_status[WF_MAX_SAMPLE]; /* WF_ST_* | WF_SLOT_* */
274 int samples_used; /* how many */
275 char interrupts_on; /* h/w MPU interrupts enabled ? */
276 char rom_samples_rdonly; /* can we write on ROM samples */
277 wait_queue_head_t interrupt_sleeper;
278} dev;
279
280static DEFINE_SPINLOCK(lock);
281static int detect_wffx(void);
282static int wffx_ioctl (wavefront_fx_info *);
283static int wffx_init (void);
284
285static int wavefront_delete_sample (int sampnum);
286static int wavefront_find_free_sample (void);
287
288/* From wf_midi.c */
289
290extern int virtual_midi_enable (void);
291extern int virtual_midi_disable (void);
292extern int detect_wf_mpu (int, int);
293extern int install_wf_mpu (void);
294extern int uninstall_wf_mpu (void);
295
296typedef struct {
297 int cmd;
298 char *action;
299 unsigned int read_cnt;
300 unsigned int write_cnt;
301 int need_ack;
302} wavefront_command;
303
304static struct {
305 int errno;
306 const char *errstr;
307} wavefront_errors[] = {
308 { 0x01, "Bad sample number" },
309 { 0x02, "Out of sample memory" },
310 { 0x03, "Bad patch number" },
311 { 0x04, "Error in number of voices" },
312 { 0x06, "Sample load already in progress" },
313 { 0x0B, "No sample load request pending" },
314 { 0x0E, "Bad MIDI channel number" },
315 { 0x10, "Download Record Error" },
316 { 0x80, "Success" },
317 { 0 }
318};
319
320#define NEEDS_ACK 1
321
322static wavefront_command wavefront_commands[] = {
323 { WFC_SET_SYNTHVOL, "set synthesizer volume", 0, 1, NEEDS_ACK },
324 { WFC_GET_SYNTHVOL, "get synthesizer volume", 1, 0, 0},
325 { WFC_SET_NVOICES, "set number of voices", 0, 1, NEEDS_ACK },
326 { WFC_GET_NVOICES, "get number of voices", 1, 0, 0 },
327 { WFC_SET_TUNING, "set synthesizer tuning", 0, 2, NEEDS_ACK },
328 { WFC_GET_TUNING, "get synthesizer tuning", 2, 0, 0 },
329 { WFC_DISABLE_CHANNEL, "disable synth channel", 0, 1, NEEDS_ACK },
330 { WFC_ENABLE_CHANNEL, "enable synth channel", 0, 1, NEEDS_ACK },
331 { WFC_GET_CHANNEL_STATUS, "get synth channel status", 3, 0, 0 },
332 { WFC_MISYNTH_OFF, "disable midi-in to synth", 0, 0, NEEDS_ACK },
333 { WFC_MISYNTH_ON, "enable midi-in to synth", 0, 0, NEEDS_ACK },
334 { WFC_VMIDI_ON, "enable virtual midi mode", 0, 0, NEEDS_ACK },
335 { WFC_VMIDI_OFF, "disable virtual midi mode", 0, 0, NEEDS_ACK },
336 { WFC_MIDI_STATUS, "report midi status", 1, 0, 0 },
337 { WFC_FIRMWARE_VERSION, "report firmware version", 2, 0, 0 },
338 { WFC_HARDWARE_VERSION, "report hardware version", 2, 0, 0 },
339 { WFC_GET_NSAMPLES, "report number of samples", 2, 0, 0 },
340 { WFC_INSTOUT_LEVELS, "report instantaneous output levels", 7, 0, 0 },
341 { WFC_PEAKOUT_LEVELS, "report peak output levels", 7, 0, 0 },
342 { WFC_DOWNLOAD_SAMPLE, "download sample",
343 0, WF_SAMPLE_BYTES, NEEDS_ACK },
344 { WFC_DOWNLOAD_BLOCK, "download block", 0, 0, NEEDS_ACK},
345 { WFC_DOWNLOAD_SAMPLE_HEADER, "download sample header",
346 0, WF_SAMPLE_HDR_BYTES, NEEDS_ACK },
347 { WFC_UPLOAD_SAMPLE_HEADER, "upload sample header", 13, 2, 0 },
348
349 /* This command requires a variable number of bytes to be written.
350 There is a hack in wavefront_cmd() to support this. The actual
351 count is passed in as the read buffer ptr, cast appropriately.
352 Ugh.
353 */
354
355 { WFC_DOWNLOAD_MULTISAMPLE, "download multisample", 0, 0, NEEDS_ACK },
356
357 /* This one is a hack as well. We just read the first byte of the
358 response, don't fetch an ACK, and leave the rest to the
359 calling function. Ugly, ugly, ugly.
360 */
361
362 { WFC_UPLOAD_MULTISAMPLE, "upload multisample", 2, 1, 0 },
363 { WFC_DOWNLOAD_SAMPLE_ALIAS, "download sample alias",
364 0, WF_ALIAS_BYTES, NEEDS_ACK },
365 { WFC_UPLOAD_SAMPLE_ALIAS, "upload sample alias", WF_ALIAS_BYTES, 2, 0},
366 { WFC_DELETE_SAMPLE, "delete sample", 0, 2, NEEDS_ACK },
367 { WFC_IDENTIFY_SAMPLE_TYPE, "identify sample type", 5, 2, 0 },
368 { WFC_UPLOAD_SAMPLE_PARAMS, "upload sample parameters" },
369 { WFC_REPORT_FREE_MEMORY, "report free memory", 4, 0, 0 },
370 { WFC_DOWNLOAD_PATCH, "download patch", 0, 134, NEEDS_ACK },
371 { WFC_UPLOAD_PATCH, "upload patch", 132, 2, 0 },
372 { WFC_DOWNLOAD_PROGRAM, "download program", 0, 33, NEEDS_ACK },
373 { WFC_UPLOAD_PROGRAM, "upload program", 32, 1, 0 },
374 { WFC_DOWNLOAD_EDRUM_PROGRAM, "download enhanced drum program", 0, 9,
375 NEEDS_ACK},
376 { WFC_UPLOAD_EDRUM_PROGRAM, "upload enhanced drum program", 8, 1, 0},
377 { WFC_SET_EDRUM_CHANNEL, "set enhanced drum program channel",
378 0, 1, NEEDS_ACK },
379 { WFC_DISABLE_DRUM_PROGRAM, "disable drum program", 0, 1, NEEDS_ACK },
380 { WFC_REPORT_CHANNEL_PROGRAMS, "report channel program numbers",
381 32, 0, 0 },
382 { WFC_NOOP, "the no-op command", 0, 0, NEEDS_ACK },
383 { 0x00 }
384};
385
386static const char *
387wavefront_errorstr (int errnum)
388
389{
390 int i;
391
392 for (i = 0; wavefront_errors[i].errstr; i++) {
393 if (wavefront_errors[i].errno == errnum) {
394 return wavefront_errors[i].errstr;
395 }
396 }
397
398 return "Unknown WaveFront error";
399}
400
401static wavefront_command *
402wavefront_get_command (int cmd)
403
404{
405 int i;
406
407 for (i = 0; wavefront_commands[i].cmd != 0; i++) {
408 if (cmd == wavefront_commands[i].cmd) {
409 return &wavefront_commands[i];
410 }
411 }
412
413 return (wavefront_command *) 0;
414}
415
416static inline int
417wavefront_status (void)
418
419{
420 return inb (dev.status_port);
421}
422
423static int
424wavefront_wait (int mask)
425
426{
427 int i;
428
429 for (i = 0; i < wait_polls; i++)
430 if (wavefront_status() & mask)
431 return 1;
432
433 for (i = 0; i < sleep_tries; i++) {
434
435 if (wavefront_status() & mask) {
436 set_current_state(TASK_RUNNING);
437 return 1;
438 }
439
440 set_current_state(TASK_INTERRUPTIBLE);
441 schedule_timeout(sleep_length);
442 if (signal_pending(current))
443 break;
444 }
445
446 set_current_state(TASK_RUNNING);
447 return 0;
448}
449
450static int
451wavefront_read (void)
452
453{
454 if (wavefront_wait (STAT_CAN_READ))
455 return inb (dev.data_port);
456
457 DPRINT (WF_DEBUG_DATA, "read timeout.\n");
458
459 return -1;
460}
461
462static int
463wavefront_write (unsigned char data)
464
465{
466 if (wavefront_wait (STAT_CAN_WRITE)) {
467 outb (data, dev.data_port);
468 return 0;
469 }
470
471 DPRINT (WF_DEBUG_DATA, "write timeout.\n");
472
473 return -1;
474}
475
476static int
477wavefront_cmd (int cmd, unsigned char *rbuf, unsigned char *wbuf)
478
479{
480 int ack;
481 int i;
482 int c;
483 wavefront_command *wfcmd;
484
485 if ((wfcmd = wavefront_get_command (cmd)) == (wavefront_command *) 0) {
486 printk (KERN_WARNING LOGNAME "command 0x%x not supported.\n",
487 cmd);
488 return 1;
489 }
490
491 /* Hack to handle the one variable-size write command. See
492 wavefront_send_multisample() for the other half of this
493 gross and ugly strategy.
494 */
495
496 if (cmd == WFC_DOWNLOAD_MULTISAMPLE) {
497 wfcmd->write_cnt = (unsigned int) rbuf;
498 rbuf = NULL;
499 }
500
501 DPRINT (WF_DEBUG_CMD, "0x%x [%s] (%d,%d,%d)\n",
502 cmd, wfcmd->action, wfcmd->read_cnt,
503 wfcmd->write_cnt, wfcmd->need_ack);
504
505 if (wavefront_write (cmd)) {
506 DPRINT ((WF_DEBUG_IO|WF_DEBUG_CMD), "cannot request "
507 "0x%x [%s].\n",
508 cmd, wfcmd->action);
509 return 1;
510 }
511
512 if (wfcmd->write_cnt > 0) {
513 DPRINT (WF_DEBUG_DATA, "writing %d bytes "
514 "for 0x%x\n",
515 wfcmd->write_cnt, cmd);
516
517 for (i = 0; i < wfcmd->write_cnt; i++) {
518 if (wavefront_write (wbuf[i])) {
519 DPRINT (WF_DEBUG_IO, "bad write for byte "
520 "%d of 0x%x [%s].\n",
521 i, cmd, wfcmd->action);
522 return 1;
523 }
524
525 DPRINT (WF_DEBUG_DATA, "write[%d] = 0x%x\n",
526 i, wbuf[i]);
527 }
528 }
529
530 if (wfcmd->read_cnt > 0) {
531 DPRINT (WF_DEBUG_DATA, "reading %d ints "
532 "for 0x%x\n",
533 wfcmd->read_cnt, cmd);
534
535 for (i = 0; i < wfcmd->read_cnt; i++) {
536
537 if ((c = wavefront_read()) == -1) {
538 DPRINT (WF_DEBUG_IO, "bad read for byte "
539 "%d of 0x%x [%s].\n",
540 i, cmd, wfcmd->action);
541 return 1;
542 }
543
544 /* Now handle errors. Lots of special cases here */
545
546 if (c == 0xff) {
547 if ((c = wavefront_read ()) == -1) {
548 DPRINT (WF_DEBUG_IO, "bad read for "
549 "error byte at "
550 "read byte %d "
551 "of 0x%x [%s].\n",
552 i, cmd,
553 wfcmd->action);
554 return 1;
555 }
556
557 /* Can you believe this madness ? */
558
559 if (c == 1 &&
560 wfcmd->cmd == WFC_IDENTIFY_SAMPLE_TYPE) {
561 rbuf[0] = WF_ST_EMPTY;
562 return (0);
563
564 } else if (c == 3 &&
565 wfcmd->cmd == WFC_UPLOAD_PATCH) {
566
567 return 3;
568
569 } else if (c == 1 &&
570 wfcmd->cmd == WFC_UPLOAD_PROGRAM) {
571
572 return 1;
573
574 } else {
575
576 DPRINT (WF_DEBUG_IO, "error %d (%s) "
577 "during "
578 "read for byte "
579 "%d of 0x%x "
580 "[%s].\n",
581 c,
582 wavefront_errorstr (c),
583 i, cmd,
584 wfcmd->action);
585 return 1;
586
587 }
588
589 } else {
590 rbuf[i] = c;
591 }
592
593 DPRINT (WF_DEBUG_DATA, "read[%d] = 0x%x\n",i, rbuf[i]);
594 }
595 }
596
597 if ((wfcmd->read_cnt == 0 && wfcmd->write_cnt == 0) || wfcmd->need_ack) {
598
599 DPRINT (WF_DEBUG_CMD, "reading ACK for 0x%x\n", cmd);
600
601 /* Some commands need an ACK, but return zero instead
602 of the standard value.
603 */
604
605 if ((ack = wavefront_read()) == 0) {
606 ack = WF_ACK;
607 }
608
609 if (ack != WF_ACK) {
610 if (ack == -1) {
611 DPRINT (WF_DEBUG_IO, "cannot read ack for "
612 "0x%x [%s].\n",
613 cmd, wfcmd->action);
614 return 1;
615
616 } else {
617 int err = -1; /* something unknown */
618
619 if (ack == 0xff) { /* explicit error */
620
621 if ((err = wavefront_read ()) == -1) {
622 DPRINT (WF_DEBUG_DATA,
623 "cannot read err "
624 "for 0x%x [%s].\n",
625 cmd, wfcmd->action);
626 }
627 }
628
629 DPRINT (WF_DEBUG_IO, "0x%x [%s] "
630 "failed (0x%x, 0x%x, %s)\n",
631 cmd, wfcmd->action, ack, err,
632 wavefront_errorstr (err));
633
634 return -err;
635 }
636 }
637
638 DPRINT (WF_DEBUG_DATA, "ack received "
639 "for 0x%x [%s]\n",
640 cmd, wfcmd->action);
641 } else {
642
643 DPRINT (WF_DEBUG_CMD, "0x%x [%s] does not need "
644 "ACK (%d,%d,%d)\n",
645 cmd, wfcmd->action, wfcmd->read_cnt,
646 wfcmd->write_cnt, wfcmd->need_ack);
647 }
648
649 return 0;
650
651}
652
653/***********************************************************************
654WaveFront: data munging
655
656Things here are weird. All data written to the board cannot
657have its most significant bit set. Any data item with values
658potentially > 0x7F (127) must be split across multiple bytes.
659
660Sometimes, we need to munge numeric values that are represented on
661the x86 side as 8-32 bit values. Sometimes, we need to munge data
662that is represented on the x86 side as an array of bytes. The most
663efficient approach to handling both cases seems to be to use 2
664different functions for munging and 2 for de-munging. This avoids
665weird casting and worrying about bit-level offsets.
666
667**********************************************************************/
668
669static
670unsigned char *
671munge_int32 (unsigned int src,
672 unsigned char *dst,
673 unsigned int dst_size)
674{
675 int i;
676
677 for (i = 0;i < dst_size; i++) {
678 *dst = src & 0x7F; /* Mask high bit of LSB */
679 src = src >> 7; /* Rotate Right 7 bits */
680 /* Note: we leave the upper bits in place */
681
682 dst++;
683 };
684 return dst;
685};
686
687static int
688demunge_int32 (unsigned char* src, int src_size)
689
690{
691 int i;
692 int outval = 0;
693
694 for (i = src_size - 1; i >= 0; i--) {
695 outval=(outval<<7)+src[i];
696 }
697
698 return outval;
699};
700
701static
702unsigned char *
703munge_buf (unsigned char *src, unsigned char *dst, unsigned int dst_size)
704
705{
706 int i;
707 unsigned int last = dst_size / 2;
708
709 for (i = 0; i < last; i++) {
710 *dst++ = src[i] & 0x7f;
711 *dst++ = src[i] >> 7;
712 }
713 return dst;
714}
715
716static
717unsigned char *
718demunge_buf (unsigned char *src, unsigned char *dst, unsigned int src_bytes)
719
720{
721 int i;
722 unsigned char *end = src + src_bytes;
723
724 end = src + src_bytes;
725
726 /* NOTE: src and dst *CAN* point to the same address */
727
728 for (i = 0; src != end; i++) {
729 dst[i] = *src++;
730 dst[i] |= (*src++)<<7;
731 }
732
733 return dst;
734}
735
736/***********************************************************************
737WaveFront: sample, patch and program management.
738***********************************************************************/
739
740static int
741wavefront_delete_sample (int sample_num)
742
743{
744 unsigned char wbuf[2];
745 int x;
746
747 wbuf[0] = sample_num & 0x7f;
748 wbuf[1] = sample_num >> 7;
749
750 if ((x = wavefront_cmd (WFC_DELETE_SAMPLE, NULL, wbuf)) == 0) {
751 dev.sample_status[sample_num] = WF_ST_EMPTY;
752 }
753
754 return x;
755}
756
757static int
758wavefront_get_sample_status (int assume_rom)
759
760{
761 int i;
762 unsigned char rbuf[32], wbuf[32];
763 unsigned int sc_real, sc_alias, sc_multi;
764
765 /* check sample status */
766
767 if (wavefront_cmd (WFC_GET_NSAMPLES, rbuf, wbuf)) {
768 printk (KERN_WARNING LOGNAME "cannot request sample count.\n");
769 return -1;
770 }
771
772 sc_real = sc_alias = sc_multi = dev.samples_used = 0;
773
774 for (i = 0; i < WF_MAX_SAMPLE; i++) {
775
776 wbuf[0] = i & 0x7f;
777 wbuf[1] = i >> 7;
778
779 if (wavefront_cmd (WFC_IDENTIFY_SAMPLE_TYPE, rbuf, wbuf)) {
780 printk (KERN_WARNING LOGNAME
781 "cannot identify sample "
782 "type of slot %d\n", i);
783 dev.sample_status[i] = WF_ST_EMPTY;
784 continue;
785 }
786
787 dev.sample_status[i] = (WF_SLOT_FILLED|rbuf[0]);
788
789 if (assume_rom) {
790 dev.sample_status[i] |= WF_SLOT_ROM;
791 }
792
793 switch (rbuf[0] & WF_ST_MASK) {
794 case WF_ST_SAMPLE:
795 sc_real++;
796 break;
797 case WF_ST_MULTISAMPLE:
798 sc_multi++;
799 break;
800 case WF_ST_ALIAS:
801 sc_alias++;
802 break;
803 case WF_ST_EMPTY:
804 break;
805
806 default:
807 printk (KERN_WARNING LOGNAME "unknown sample type for "
808 "slot %d (0x%x)\n",
809 i, rbuf[0]);
810 }
811
812 if (rbuf[0] != WF_ST_EMPTY) {
813 dev.samples_used++;
814 }
815 }
816
817 printk (KERN_INFO LOGNAME
818 "%d samples used (%d real, %d aliases, %d multi), "
819 "%d empty\n", dev.samples_used, sc_real, sc_alias, sc_multi,
820 WF_MAX_SAMPLE - dev.samples_used);
821
822
823 return (0);
824
825}
826
827static int
828wavefront_get_patch_status (void)
829
830{
831 unsigned char patchbuf[WF_PATCH_BYTES];
832 unsigned char patchnum[2];
833 wavefront_patch *p;
834 int i, x, cnt, cnt2;
835
836 for (i = 0; i < WF_MAX_PATCH; i++) {
837 patchnum[0] = i & 0x7f;
838 patchnum[1] = i >> 7;
839
840 if ((x = wavefront_cmd (WFC_UPLOAD_PATCH, patchbuf,
841 patchnum)) == 0) {
842
843 dev.patch_status[i] |= WF_SLOT_FILLED;
844 p = (wavefront_patch *) patchbuf;
845 dev.sample_status
846 [p->sample_number|(p->sample_msb<<7)] |=
847 WF_SLOT_USED;
848
849 } else if (x == 3) { /* Bad patch number */
850 dev.patch_status[i] = 0;
851 } else {
852 printk (KERN_ERR LOGNAME "upload patch "
853 "error 0x%x\n", x);
854 dev.patch_status[i] = 0;
855 return 1;
856 }
857 }
858
859 /* program status has already filled in slot_used bits */
860
861 for (i = 0, cnt = 0, cnt2 = 0; i < WF_MAX_PATCH; i++) {
862 if (dev.patch_status[i] & WF_SLOT_FILLED) {
863 cnt++;
864 }
865 if (dev.patch_status[i] & WF_SLOT_USED) {
866 cnt2++;
867 }
868
869 }
870 printk (KERN_INFO LOGNAME
871 "%d patch slots filled, %d in use\n", cnt, cnt2);
872
873 return (0);
874}
875
876static int
877wavefront_get_program_status (void)
878
879{
880 unsigned char progbuf[WF_PROGRAM_BYTES];
881 wavefront_program prog;
882 unsigned char prognum;
883 int i, x, l, cnt;
884
885 for (i = 0; i < WF_MAX_PROGRAM; i++) {
886 prognum = i;
887
888 if ((x = wavefront_cmd (WFC_UPLOAD_PROGRAM, progbuf,
889 &prognum)) == 0) {
890
891 dev.prog_status[i] |= WF_SLOT_USED;
892
893 demunge_buf (progbuf, (unsigned char *) &prog,
894 WF_PROGRAM_BYTES);
895
896 for (l = 0; l < WF_NUM_LAYERS; l++) {
897 if (prog.layer[l].mute) {
898 dev.patch_status
899 [prog.layer[l].patch_number] |=
900 WF_SLOT_USED;
901 }
902 }
903 } else if (x == 1) { /* Bad program number */
904 dev.prog_status[i] = 0;
905 } else {
906 printk (KERN_ERR LOGNAME "upload program "
907 "error 0x%x\n", x);
908 dev.prog_status[i] = 0;
909 }
910 }
911
912 for (i = 0, cnt = 0; i < WF_MAX_PROGRAM; i++) {
913 if (dev.prog_status[i]) {
914 cnt++;
915 }
916 }
917
918 printk (KERN_INFO LOGNAME "%d programs slots in use\n", cnt);
919
920 return (0);
921}
922
923static int
924wavefront_send_patch (wavefront_patch_info *header)
925
926{
927 unsigned char buf[WF_PATCH_BYTES+2];
928 unsigned char *bptr;
929
930 DPRINT (WF_DEBUG_LOAD_PATCH, "downloading patch %d\n",
931 header->number);
932
933 dev.patch_status[header->number] |= WF_SLOT_FILLED;
934
935 bptr = buf;
936 bptr = munge_int32 (header->number, buf, 2);
937 munge_buf ((unsigned char *)&header->hdr.p, bptr, WF_PATCH_BYTES);
938
939 if (wavefront_cmd (WFC_DOWNLOAD_PATCH, NULL, buf)) {
940 printk (KERN_ERR LOGNAME "download patch failed\n");
941 return -(EIO);
942 }
943
944 return (0);
945}
946
947static int
948wavefront_send_program (wavefront_patch_info *header)
949
950{
951 unsigned char buf[WF_PROGRAM_BYTES+1];
952 int i;
953
954 DPRINT (WF_DEBUG_LOAD_PATCH, "downloading program %d\n",
955 header->number);
956
957 dev.prog_status[header->number] = WF_SLOT_USED;
958
959 /* XXX need to zero existing SLOT_USED bit for program_status[i]
960 where `i' is the program that's being (potentially) overwritten.
961 */
962
963 for (i = 0; i < WF_NUM_LAYERS; i++) {
964 if (header->hdr.pr.layer[i].mute) {
965 dev.patch_status[header->hdr.pr.layer[i].patch_number] |=
966 WF_SLOT_USED;
967
968 /* XXX need to mark SLOT_USED for sample used by
969 patch_number, but this means we have to load it. Ick.
970 */
971 }
972 }
973
974 buf[0] = header->number;
975 munge_buf ((unsigned char *)&header->hdr.pr, &buf[1], WF_PROGRAM_BYTES);
976
977 if (wavefront_cmd (WFC_DOWNLOAD_PROGRAM, NULL, buf)) {
978 printk (KERN_WARNING LOGNAME "download patch failed\n");
979 return -(EIO);
980 }
981
982 return (0);
983}
984
985static int
986wavefront_freemem (void)
987
988{
989 char rbuf[8];
990
991 if (wavefront_cmd (WFC_REPORT_FREE_MEMORY, rbuf, NULL)) {
992 printk (KERN_WARNING LOGNAME "can't get memory stats.\n");
993 return -1;
994 } else {
995 return demunge_int32 (rbuf, 4);
996 }
997}
998
999static int
1000wavefront_send_sample (wavefront_patch_info *header,
1001 UINT16 __user *dataptr,
1002 int data_is_unsigned)
1003
1004{
1005 /* samples are downloaded via a 16-bit wide i/o port
1006 (you could think of it as 2 adjacent 8-bit wide ports
1007 but its less efficient that way). therefore, all
1008 the blocksizes and so forth listed in the documentation,
1009 and used conventionally to refer to sample sizes,
1010 which are given in 8-bit units (bytes), need to be
1011 divided by 2.
1012 */
1013
1014 UINT16 sample_short;
1015 UINT32 length;
1016 UINT16 __user *data_end = NULL;
1017 unsigned int i;
1018 const int max_blksize = 4096/2;
1019 unsigned int written;
1020 unsigned int blocksize;
1021 int dma_ack;
1022 int blocknum;
1023 unsigned char sample_hdr[WF_SAMPLE_HDR_BYTES];
1024 unsigned char *shptr;
1025 int skip = 0;
1026 int initial_skip = 0;
1027
1028 DPRINT (WF_DEBUG_LOAD_PATCH, "sample %sdownload for slot %d, "
1029 "type %d, %d bytes from %p\n",
1030 header->size ? "" : "header ",
1031 header->number, header->subkey,
1032 header->size,
1033 header->dataptr);
1034
1035 if (header->number == WAVEFRONT_FIND_FREE_SAMPLE_SLOT) {
1036 int x;
1037
1038 if ((x = wavefront_find_free_sample ()) < 0) {
1039 return -ENOMEM;
1040 }
1041 printk (KERN_DEBUG LOGNAME "unspecified sample => %d\n", x);
1042 header->number = x;
1043 }
1044
1045 if (header->size) {
1046
1047 /* XXX it's a debatable point whether or not RDONLY semantics
1048 on the ROM samples should cover just the sample data or
1049 the sample header. For now, it only covers the sample data,
1050 so anyone is free at all times to rewrite sample headers.
1051
1052 My reason for this is that we have the sample headers
1053 available in the WFB file for General MIDI, and so these
1054 can always be reset if needed. The sample data, however,
1055 cannot be recovered without a complete reset and firmware
1056 reload of the ICS2115, which is a very expensive operation.
1057
1058 So, doing things this way allows us to honor the notion of
1059 "RESETSAMPLES" reasonably cheaply. Note however, that this
1060 is done purely at user level: there is no WFB parser in
1061 this driver, and so a complete reset (back to General MIDI,
1062 or theoretically some other configuration) is the
1063 responsibility of the user level library.
1064
1065 To try to do this in the kernel would be a little
1066 crazy: we'd need 158K of kernel space just to hold
1067 a copy of the patch/program/sample header data.
1068 */
1069
1070 if (dev.rom_samples_rdonly) {
1071 if (dev.sample_status[header->number] & WF_SLOT_ROM) {
1072 printk (KERN_ERR LOGNAME "sample slot %d "
1073 "write protected\n",
1074 header->number);
1075 return -EACCES;
1076 }
1077 }
1078
1079 wavefront_delete_sample (header->number);
1080 }
1081
1082 if (header->size) {
1083 dev.freemem = wavefront_freemem ();
1084
1085 if (dev.freemem < header->size) {
1086 printk (KERN_ERR LOGNAME
1087 "insufficient memory to "
1088 "load %d byte sample.\n",
1089 header->size);
1090 return -ENOMEM;
1091 }
1092
1093 }
1094
1095 skip = WF_GET_CHANNEL(&header->hdr.s);
1096
1097 if (skip > 0 && header->hdr.s.SampleResolution != LINEAR_16BIT) {
1098 printk (KERN_ERR LOGNAME "channel selection only "
1099 "possible on 16-bit samples");
1100 return -(EINVAL);
1101 }
1102
1103 switch (skip) {
1104 case 0:
1105 initial_skip = 0;
1106 skip = 1;
1107 break;
1108 case 1:
1109 initial_skip = 0;
1110 skip = 2;
1111 break;
1112 case 2:
1113 initial_skip = 1;
1114 skip = 2;
1115 break;
1116 case 3:
1117 initial_skip = 2;
1118 skip = 3;
1119 break;
1120 case 4:
1121 initial_skip = 3;
1122 skip = 4;
1123 break;
1124 case 5:
1125 initial_skip = 4;
1126 skip = 5;
1127 break;
1128 case 6:
1129 initial_skip = 5;
1130 skip = 6;
1131 break;
1132 }
1133
1134 DPRINT (WF_DEBUG_LOAD_PATCH, "channel selection: %d => "
1135 "initial skip = %d, skip = %d\n",
1136 WF_GET_CHANNEL (&header->hdr.s),
1137 initial_skip, skip);
1138
1139 /* Be safe, and zero the "Unused" bits ... */
1140
1141 WF_SET_CHANNEL(&header->hdr.s, 0);
1142
1143 /* adjust size for 16 bit samples by dividing by two. We always
1144 send 16 bits per write, even for 8 bit samples, so the length
1145 is always half the size of the sample data in bytes.
1146 */
1147
1148 length = header->size / 2;
1149
1150 /* the data we're sent has not been munged, and in fact, the
1151 header we have to send isn't just a munged copy either.
1152 so, build the sample header right here.
1153 */
1154
1155 shptr = &sample_hdr[0];
1156
1157 shptr = munge_int32 (header->number, shptr, 2);
1158
1159 if (header->size) {
1160 shptr = munge_int32 (length, shptr, 4);
1161 }
1162
1163 /* Yes, a 4 byte result doesn't contain all of the offset bits,
1164 but the offset only uses 24 bits.
1165 */
1166
1167 shptr = munge_int32 (*((UINT32 *) &header->hdr.s.sampleStartOffset),
1168 shptr, 4);
1169 shptr = munge_int32 (*((UINT32 *) &header->hdr.s.loopStartOffset),
1170 shptr, 4);
1171 shptr = munge_int32 (*((UINT32 *) &header->hdr.s.loopEndOffset),
1172 shptr, 4);
1173 shptr = munge_int32 (*((UINT32 *) &header->hdr.s.sampleEndOffset),
1174 shptr, 4);
1175
1176 /* This one is truly weird. What kind of weirdo decided that in
1177 a system dominated by 16 and 32 bit integers, they would use
1178 a just 12 bits ?
1179 */
1180
1181 shptr = munge_int32 (header->hdr.s.FrequencyBias, shptr, 3);
1182
1183 /* Why is this nybblified, when the MSB is *always* zero ?
1184 Anyway, we can't take address of bitfield, so make a
1185 good-faith guess at where it starts.
1186 */
1187
1188 shptr = munge_int32 (*(&header->hdr.s.FrequencyBias+1),
1189 shptr, 2);
1190
1191 if (wavefront_cmd (header->size ?
1192 WFC_DOWNLOAD_SAMPLE : WFC_DOWNLOAD_SAMPLE_HEADER,
1193 NULL, sample_hdr)) {
1194 printk (KERN_WARNING LOGNAME "sample %sdownload refused.\n",
1195 header->size ? "" : "header ");
1196 return -(EIO);
1197 }
1198
1199 if (header->size == 0) {
1200 goto sent; /* Sorry. Just had to have one somewhere */
1201 }
1202
1203 data_end = dataptr + length;
1204
1205 /* Do any initial skip over an unused channel's data */
1206
1207 dataptr += initial_skip;
1208
1209 for (written = 0, blocknum = 0;
1210 written < length; written += max_blksize, blocknum++) {
1211
1212 if ((length - written) > max_blksize) {
1213 blocksize = max_blksize;
1214 } else {
1215 /* round to nearest 16-byte value */
1216 blocksize = ((length-written+7)&~0x7);
1217 }
1218
1219 if (wavefront_cmd (WFC_DOWNLOAD_BLOCK, NULL, NULL)) {
1220 printk (KERN_WARNING LOGNAME "download block "
1221 "request refused.\n");
1222 return -(EIO);
1223 }
1224
1225 for (i = 0; i < blocksize; i++) {
1226
1227 if (dataptr < data_end) {
1228
1229 __get_user (sample_short, dataptr);
1230 dataptr += skip;
1231
1232 if (data_is_unsigned) { /* GUS ? */
1233
1234 if (WF_SAMPLE_IS_8BIT(&header->hdr.s)) {
1235
1236 /* 8 bit sample
1237 resolution, sign
1238 extend both bytes.
1239 */
1240
1241 ((unsigned char*)
1242 &sample_short)[0] += 0x7f;
1243 ((unsigned char*)
1244 &sample_short)[1] += 0x7f;
1245
1246 } else {
1247
1248 /* 16 bit sample
1249 resolution, sign
1250 extend the MSB.
1251 */
1252
1253 sample_short += 0x7fff;
1254 }
1255 }
1256
1257 } else {
1258
1259 /* In padding section of final block:
1260
1261 Don't fetch unsupplied data from
1262 user space, just continue with
1263 whatever the final value was.
1264 */
1265 }
1266
1267 if (i < blocksize - 1) {
1268 outw (sample_short, dev.block_port);
1269 } else {
1270 outw (sample_short, dev.last_block_port);
1271 }
1272 }
1273
1274 /* Get "DMA page acknowledge", even though its really
1275 nothing to do with DMA at all.
1276 */
1277
1278 if ((dma_ack = wavefront_read ()) != WF_DMA_ACK) {
1279 if (dma_ack == -1) {
1280 printk (KERN_ERR LOGNAME "upload sample "
1281 "DMA ack timeout\n");
1282 return -(EIO);
1283 } else {
1284 printk (KERN_ERR LOGNAME "upload sample "
1285 "DMA ack error 0x%x\n",
1286 dma_ack);
1287 return -(EIO);
1288 }
1289 }
1290 }
1291
1292 dev.sample_status[header->number] = (WF_SLOT_FILLED|WF_ST_SAMPLE);
1293
1294 /* Note, label is here because sending the sample header shouldn't
1295 alter the sample_status info at all.
1296 */
1297
1298 sent:
1299 return (0);
1300}
1301
1302static int
1303wavefront_send_alias (wavefront_patch_info *header)
1304
1305{
1306 unsigned char alias_hdr[WF_ALIAS_BYTES];
1307
1308 DPRINT (WF_DEBUG_LOAD_PATCH, "download alias, %d is "
1309 "alias for %d\n",
1310 header->number,
1311 header->hdr.a.OriginalSample);
1312
1313 munge_int32 (header->number, &alias_hdr[0], 2);
1314 munge_int32 (header->hdr.a.OriginalSample, &alias_hdr[2], 2);
1315 munge_int32 (*((unsigned int *)&header->hdr.a.sampleStartOffset),
1316 &alias_hdr[4], 4);
1317 munge_int32 (*((unsigned int *)&header->hdr.a.loopStartOffset),
1318 &alias_hdr[8], 4);
1319 munge_int32 (*((unsigned int *)&header->hdr.a.loopEndOffset),
1320 &alias_hdr[12], 4);
1321 munge_int32 (*((unsigned int *)&header->hdr.a.sampleEndOffset),
1322 &alias_hdr[16], 4);
1323 munge_int32 (header->hdr.a.FrequencyBias, &alias_hdr[20], 3);
1324 munge_int32 (*(&header->hdr.a.FrequencyBias+1), &alias_hdr[23], 2);
1325
1326 if (wavefront_cmd (WFC_DOWNLOAD_SAMPLE_ALIAS, NULL, alias_hdr)) {
1327 printk (KERN_ERR LOGNAME "download alias failed.\n");
1328 return -(EIO);
1329 }
1330
1331 dev.sample_status[header->number] = (WF_SLOT_FILLED|WF_ST_ALIAS);
1332
1333 return (0);
1334}
1335
1336static int
1337wavefront_send_multisample (wavefront_patch_info *header)
1338{
1339 int i;
1340 int num_samples;
1341 unsigned char msample_hdr[WF_MSAMPLE_BYTES];
1342
1343 munge_int32 (header->number, &msample_hdr[0], 2);
1344
1345 /* You'll recall at this point that the "number of samples" value
1346 in a wavefront_multisample struct is actually the log2 of the
1347 real number of samples.
1348 */
1349
1350 num_samples = (1<<(header->hdr.ms.NumberOfSamples&7));
1351 msample_hdr[2] = (unsigned char) header->hdr.ms.NumberOfSamples;
1352
1353 DPRINT (WF_DEBUG_LOAD_PATCH, "multi %d with %d=%d samples\n",
1354 header->number,
1355 header->hdr.ms.NumberOfSamples,
1356 num_samples);
1357
1358 for (i = 0; i < num_samples; i++) {
1359 DPRINT(WF_DEBUG_LOAD_PATCH|WF_DEBUG_DATA, "sample[%d] = %d\n",
1360 i, header->hdr.ms.SampleNumber[i]);
1361 munge_int32 (header->hdr.ms.SampleNumber[i],
1362 &msample_hdr[3+(i*2)], 2);
1363 }
1364
1365 /* Need a hack here to pass in the number of bytes
1366 to be written to the synth. This is ugly, and perhaps
1367 one day, I'll fix it.
1368 */
1369
1370 if (wavefront_cmd (WFC_DOWNLOAD_MULTISAMPLE,
1371 (unsigned char *) ((num_samples*2)+3),
1372 msample_hdr)) {
1373 printk (KERN_ERR LOGNAME "download of multisample failed.\n");
1374 return -(EIO);
1375 }
1376
1377 dev.sample_status[header->number] = (WF_SLOT_FILLED|WF_ST_MULTISAMPLE);
1378
1379 return (0);
1380}
1381
1382static int
1383wavefront_fetch_multisample (wavefront_patch_info *header)
1384{
1385 int i;
1386 unsigned char log_ns[1];
1387 unsigned char number[2];
1388 int num_samples;
1389
1390 munge_int32 (header->number, number, 2);
1391
1392 if (wavefront_cmd (WFC_UPLOAD_MULTISAMPLE, log_ns, number)) {
1393 printk (KERN_ERR LOGNAME "upload multisample failed.\n");
1394 return -(EIO);
1395 }
1396
1397 DPRINT (WF_DEBUG_DATA, "msample %d has %d samples\n",
1398 header->number, log_ns[0]);
1399
1400 header->hdr.ms.NumberOfSamples = log_ns[0];
1401
1402 /* get the number of samples ... */
1403
1404 num_samples = (1 << log_ns[0]);
1405
1406 for (i = 0; i < num_samples; i++) {
1407 s8 d[2];
1408
1409 if ((d[0] = wavefront_read ()) == -1) {
1410 printk (KERN_ERR LOGNAME "upload multisample failed "
1411 "during sample loop.\n");
1412 return -(EIO);
1413 }
1414
1415 if ((d[1] = wavefront_read ()) == -1) {
1416 printk (KERN_ERR LOGNAME "upload multisample failed "
1417 "during sample loop.\n");
1418 return -(EIO);
1419 }
1420
1421 header->hdr.ms.SampleNumber[i] =
1422 demunge_int32 ((unsigned char *) d, 2);
1423
1424 DPRINT (WF_DEBUG_DATA, "msample sample[%d] = %d\n",
1425 i, header->hdr.ms.SampleNumber[i]);
1426 }
1427
1428 return (0);
1429}
1430
1431
1432static int
1433wavefront_send_drum (wavefront_patch_info *header)
1434
1435{
1436 unsigned char drumbuf[WF_DRUM_BYTES];
1437 wavefront_drum *drum = &header->hdr.d;
1438 int i;
1439
1440 DPRINT (WF_DEBUG_LOAD_PATCH, "downloading edrum for MIDI "
1441 "note %d, patch = %d\n",
1442 header->number, drum->PatchNumber);
1443
1444 drumbuf[0] = header->number & 0x7f;
1445
1446 for (i = 0; i < 4; i++) {
1447 munge_int32 (((unsigned char *)drum)[i], &drumbuf[1+(i*2)], 2);
1448 }
1449
1450 if (wavefront_cmd (WFC_DOWNLOAD_EDRUM_PROGRAM, NULL, drumbuf)) {
1451 printk (KERN_ERR LOGNAME "download drum failed.\n");
1452 return -(EIO);
1453 }
1454
1455 return (0);
1456}
1457
1458static int
1459wavefront_find_free_sample (void)
1460
1461{
1462 int i;
1463
1464 for (i = 0; i < WF_MAX_SAMPLE; i++) {
1465 if (!(dev.sample_status[i] & WF_SLOT_FILLED)) {
1466 return i;
1467 }
1468 }
1469 printk (KERN_WARNING LOGNAME "no free sample slots!\n");
1470 return -1;
1471}
1472
1473static int
1474wavefront_find_free_patch (void)
1475
1476{
1477 int i;
1478
1479 for (i = 0; i < WF_MAX_PATCH; i++) {
1480 if (!(dev.patch_status[i] & WF_SLOT_FILLED)) {
1481 return i;
1482 }
1483 }
1484 printk (KERN_WARNING LOGNAME "no free patch slots!\n");
1485 return -1;
1486}
1487
1488static int
1489log2_2048(int n)
1490
1491{
1492 int tbl[]={0, 0, 2048, 3246, 4096, 4755, 5294, 5749, 6143,
1493 6492, 6803, 7084, 7342, 7578, 7797, 8001, 8192,
1494 8371, 8540, 8699, 8851, 8995, 9132, 9264, 9390,
1495 9510, 9626, 9738, 9845, 9949, 10049, 10146};
1496 int i;
1497
1498 /* Returns 2048*log2(n) */
1499
1500 /* FIXME: this is like doing integer math
1501 on quantum particles (RuN) */
1502
1503 i=0;
1504 while(n>=32*256) {
1505 n>>=8;
1506 i+=2048*8;
1507 }
1508 while(n>=32) {
1509 n>>=1;
1510 i+=2048;
1511 }
1512 i+=tbl[n];
1513 return(i);
1514}
1515
1516static int
1517wavefront_load_gus_patch (int devno, int format, const char __user *addr,
1518 int offs, int count, int pmgr_flag)
1519{
1520 struct patch_info guspatch;
1521 wavefront_patch_info *samp, *pat, *prog;
1522 wavefront_patch *patp;
1523 wavefront_sample *sampp;
1524 wavefront_program *progp;
1525
1526 int i,base_note;
1527 long sizeof_patch;
1528 int rc = -ENOMEM;
1529
1530 samp = kmalloc(3 * sizeof(wavefront_patch_info), GFP_KERNEL);
1531 if (!samp)
1532 goto free_fail;
1533 pat = samp + 1;
1534 prog = pat + 1;
1535
1536 /* Copy in the header of the GUS patch */
1537
1538 sizeof_patch = (long) &guspatch.data[0] - (long) &guspatch;
1539 if (copy_from_user(&((char *) &guspatch)[offs],
1540 &(addr)[offs], sizeof_patch - offs)) {
1541 rc = -EFAULT;
1542 goto free_fail;
1543 }
1544
1545 if ((i = wavefront_find_free_patch ()) == -1) {
1546 rc = -EBUSY;
1547 goto free_fail;
1548 }
1549 pat->number = i;
1550 pat->subkey = WF_ST_PATCH;
1551 patp = &pat->hdr.p;
1552
1553 if ((i = wavefront_find_free_sample ()) == -1) {
1554 rc = -EBUSY;
1555 goto free_fail;
1556 }
1557 samp->number = i;
1558 samp->subkey = WF_ST_SAMPLE;
1559 samp->size = guspatch.len;
1560 sampp = &samp->hdr.s;
1561
1562 prog->number = guspatch.instr_no;
1563 progp = &prog->hdr.pr;
1564
1565 /* Setup the patch structure */
1566
1567 patp->amplitude_bias=guspatch.volume;
1568 patp->portamento=0;
1569 patp->sample_number= samp->number & 0xff;
1570 patp->sample_msb= samp->number >> 8;
1571 patp->pitch_bend= /*12*/ 0;
1572 patp->mono=1;
1573 patp->retrigger=1;
1574 patp->nohold=(guspatch.mode & WAVE_SUSTAIN_ON) ? 0:1;
1575 patp->frequency_bias=0;
1576 patp->restart=0;
1577 patp->reuse=0;
1578 patp->reset_lfo=1;
1579 patp->fm_src2=0;
1580 patp->fm_src1=WF_MOD_MOD_WHEEL;
1581 patp->am_src=WF_MOD_PRESSURE;
1582 patp->am_amount=127;
1583 patp->fc1_mod_amount=0;
1584 patp->fc2_mod_amount=0;
1585 patp->fm_amount1=0;
1586 patp->fm_amount2=0;
1587 patp->envelope1.attack_level=127;
1588 patp->envelope1.decay1_level=127;
1589 patp->envelope1.decay2_level=127;
1590 patp->envelope1.sustain_level=127;
1591 patp->envelope1.release_level=0;
1592 patp->envelope2.attack_velocity=127;
1593 patp->envelope2.attack_level=127;
1594 patp->envelope2.decay1_level=127;
1595 patp->envelope2.decay2_level=127;
1596 patp->envelope2.sustain_level=127;
1597 patp->envelope2.release_level=0;
1598 patp->envelope2.attack_velocity=127;
1599 patp->randomizer=0;
1600
1601 /* Program for this patch */
1602
1603 progp->layer[0].patch_number= pat->number; /* XXX is this right ? */
1604 progp->layer[0].mute=1;
1605 progp->layer[0].pan_or_mod=1;
1606 progp->layer[0].pan=7;
1607 progp->layer[0].mix_level=127 /* guspatch.volume */;
1608 progp->layer[0].split_type=0;
1609 progp->layer[0].split_point=0;
1610 progp->layer[0].play_below=0;
1611
1612 for (i = 1; i < 4; i++) {
1613 progp->layer[i].mute=0;
1614 }
1615
1616 /* Sample data */
1617
1618 sampp->SampleResolution=((~guspatch.mode & WAVE_16_BITS)<<1);
1619
1620 for (base_note=0;
1621 note_to_freq (base_note) < guspatch.base_note;
1622 base_note++);
1623
1624 if ((guspatch.base_note-note_to_freq(base_note))
1625 >(note_to_freq(base_note)-guspatch.base_note))
1626 base_note++;
1627
1628 printk(KERN_DEBUG "ref freq=%d,base note=%d\n",
1629 guspatch.base_freq,
1630 base_note);
1631
1632 sampp->FrequencyBias = (29550 - log2_2048(guspatch.base_freq)
1633 + base_note*171);
1634 printk(KERN_DEBUG "Freq Bias is %d\n", sampp->FrequencyBias);
1635 sampp->Loop=(guspatch.mode & WAVE_LOOPING) ? 1:0;
1636 sampp->sampleStartOffset.Fraction=0;
1637 sampp->sampleStartOffset.Integer=0;
1638 sampp->loopStartOffset.Fraction=0;
1639 sampp->loopStartOffset.Integer=guspatch.loop_start
1640 >>((guspatch.mode&WAVE_16_BITS) ? 1:0);
1641 sampp->loopEndOffset.Fraction=0;
1642 sampp->loopEndOffset.Integer=guspatch.loop_end
1643 >>((guspatch.mode&WAVE_16_BITS) ? 1:0);
1644 sampp->sampleEndOffset.Fraction=0;
1645 sampp->sampleEndOffset.Integer=guspatch.len >> (guspatch.mode&1);
1646 sampp->Bidirectional=(guspatch.mode&WAVE_BIDIR_LOOP) ? 1:0;
1647 sampp->Reverse=(guspatch.mode&WAVE_LOOP_BACK) ? 1:0;
1648
1649 /* Now ship it down */
1650
1651 wavefront_send_sample (samp,
1652 (unsigned short __user *) &(addr)[sizeof_patch],
1653 (guspatch.mode & WAVE_UNSIGNED) ? 1:0);
1654 wavefront_send_patch (pat);
1655 wavefront_send_program (prog);
1656
1657 /* Now pan as best we can ... use the slave/internal MIDI device
1658 number if it exists (since it talks to the WaveFront), or the
1659 master otherwise.
1660 */
1661
1662 if (dev.mididev > 0) {
1663 midi_synth_controller (dev.mididev, guspatch.instr_no, 10,
1664 ((guspatch.panning << 4) > 127) ?
1665 127 : (guspatch.panning << 4));
1666 }
1667 rc = 0;
1668
1669free_fail:
1670 kfree(samp);
1671 return rc;
1672}
1673
1674static int
1675wavefront_load_patch (const char __user *addr)
1676
1677
1678{
1679 wavefront_patch_info header;
1680
1681 if (copy_from_user (&header, addr, sizeof(wavefront_patch_info) -
1682 sizeof(wavefront_any))) {
1683 printk (KERN_WARNING LOGNAME "bad address for load patch.\n");
1684 return -EFAULT;
1685 }
1686
1687 DPRINT (WF_DEBUG_LOAD_PATCH, "download "
1688 "Sample type: %d "
1689 "Sample number: %d "
1690 "Sample size: %d\n",
1691 header.subkey,
1692 header.number,
1693 header.size);
1694
1695 switch (header.subkey) {
1696 case WF_ST_SAMPLE: /* sample or sample_header, based on patch->size */
1697
1698 if (copy_from_user((unsigned char *) &header.hdr.s,
1699 (unsigned char __user *) header.hdrptr,
1700 sizeof (wavefront_sample)))
1701 return -EFAULT;
1702
1703 return wavefront_send_sample (&header, header.dataptr, 0);
1704
1705 case WF_ST_MULTISAMPLE:
1706
1707 if (copy_from_user(&header.hdr.s, header.hdrptr,
1708 sizeof(wavefront_multisample)))
1709 return -EFAULT;
1710
1711 return wavefront_send_multisample (&header);
1712
1713
1714 case WF_ST_ALIAS:
1715
1716 if (copy_from_user(&header.hdr.a, header.hdrptr,
1717 sizeof (wavefront_alias)))
1718 return -EFAULT;
1719
1720 return wavefront_send_alias (&header);
1721
1722 case WF_ST_DRUM:
1723 if (copy_from_user(&header.hdr.d, header.hdrptr,
1724 sizeof (wavefront_drum)))
1725 return -EFAULT;
1726
1727 return wavefront_send_drum (&header);
1728
1729 case WF_ST_PATCH:
1730 if (copy_from_user(&header.hdr.p, header.hdrptr,
1731 sizeof (wavefront_patch)))
1732 return -EFAULT;
1733
1734 return wavefront_send_patch (&header);
1735
1736 case WF_ST_PROGRAM:
1737 if (copy_from_user(&header.hdr.pr, header.hdrptr,
1738 sizeof (wavefront_program)))
1739 return -EFAULT;
1740
1741 return wavefront_send_program (&header);
1742
1743 default:
1744 printk (KERN_ERR LOGNAME "unknown patch type %d.\n",
1745 header.subkey);
1746 return -(EINVAL);
1747 }
1748
1749 return 0;
1750}
1751
1752/***********************************************************************
1753WaveFront: /dev/sequencer{,2} and other hardware-dependent interfaces
1754***********************************************************************/
1755
1756static void
1757process_sample_hdr (UCHAR8 *buf)
1758
1759{
1760 wavefront_sample s;
1761 UCHAR8 *ptr;
1762
1763 ptr = buf;
1764
1765 /* The board doesn't send us an exact copy of a "wavefront_sample"
1766 in response to an Upload Sample Header command. Instead, we
1767 have to convert the data format back into our data structure,
1768 just as in the Download Sample command, where we have to do
1769 something very similar in the reverse direction.
1770 */
1771
1772 *((UINT32 *) &s.sampleStartOffset) = demunge_int32 (ptr, 4); ptr += 4;
1773 *((UINT32 *) &s.loopStartOffset) = demunge_int32 (ptr, 4); ptr += 4;
1774 *((UINT32 *) &s.loopEndOffset) = demunge_int32 (ptr, 4); ptr += 4;
1775 *((UINT32 *) &s.sampleEndOffset) = demunge_int32 (ptr, 4); ptr += 4;
1776 *((UINT32 *) &s.FrequencyBias) = demunge_int32 (ptr, 3); ptr += 3;
1777
1778 s.SampleResolution = *ptr & 0x3;
1779 s.Loop = *ptr & 0x8;
1780 s.Bidirectional = *ptr & 0x10;
1781 s.Reverse = *ptr & 0x40;
1782
1783 /* Now copy it back to where it came from */
1784
1785 memcpy (buf, (unsigned char *) &s, sizeof (wavefront_sample));
1786}
1787
1788static int
1789wavefront_synth_control (int cmd, wavefront_control *wc)
1790
1791{
1792 unsigned char patchnumbuf[2];
1793 int i;
1794
1795 DPRINT (WF_DEBUG_CMD, "synth control with "
1796 "cmd 0x%x\n", wc->cmd);
1797
1798 /* Pre-handling of or for various commands */
1799
1800 switch (wc->cmd) {
1801 case WFC_DISABLE_INTERRUPTS:
1802 printk (KERN_INFO LOGNAME "interrupts disabled.\n");
1803 outb (0x80|0x20, dev.control_port);
1804 dev.interrupts_on = 0;
1805 return 0;
1806
1807 case WFC_ENABLE_INTERRUPTS:
1808 printk (KERN_INFO LOGNAME "interrupts enabled.\n");
1809 outb (0x80|0x40|0x20, dev.control_port);
1810 dev.interrupts_on = 1;
1811 return 0;
1812
1813 case WFC_INTERRUPT_STATUS:
1814 wc->rbuf[0] = dev.interrupts_on;
1815 return 0;
1816
1817 case WFC_ROMSAMPLES_RDONLY:
1818 dev.rom_samples_rdonly = wc->wbuf[0];
1819 wc->status = 0;
1820 return 0;
1821
1822 case WFC_IDENTIFY_SLOT_TYPE:
1823 i = wc->wbuf[0] | (wc->wbuf[1] << 7);
1824 if (i <0 || i >= WF_MAX_SAMPLE) {
1825 printk (KERN_WARNING LOGNAME "invalid slot ID %d\n",
1826 i);
1827 wc->status = EINVAL;
1828 return 0;
1829 }
1830 wc->rbuf[0] = dev.sample_status[i];
1831 wc->status = 0;
1832 return 0;
1833
1834 case WFC_DEBUG_DRIVER:
1835 dev.debug = wc->wbuf[0];
1836 printk (KERN_INFO LOGNAME "debug = 0x%x\n", dev.debug);
1837 return 0;
1838
1839 case WFC_FX_IOCTL:
1840 wffx_ioctl ((wavefront_fx_info *) &wc->wbuf[0]);
1841 return 0;
1842
1843 case WFC_UPLOAD_PATCH:
1844 munge_int32 (*((UINT32 *) wc->wbuf), patchnumbuf, 2);
1845 memcpy (wc->wbuf, patchnumbuf, 2);
1846 break;
1847
1848 case WFC_UPLOAD_MULTISAMPLE:
1849 /* multisamples have to be handled differently, and
1850 cannot be dealt with properly by wavefront_cmd() alone.
1851 */
1852 wc->status = wavefront_fetch_multisample
1853 ((wavefront_patch_info *) wc->rbuf);
1854 return 0;
1855
1856 case WFC_UPLOAD_SAMPLE_ALIAS:
1857 printk (KERN_INFO LOGNAME "support for sample alias upload "
1858 "being considered.\n");
1859 wc->status = EINVAL;
1860 return -EINVAL;
1861 }
1862
1863 wc->status = wavefront_cmd (wc->cmd, wc->rbuf, wc->wbuf);
1864
1865 /* Post-handling of certain commands.
1866
1867 In particular, if the command was an upload, demunge the data
1868 so that the user-level doesn't have to think about it.
1869 */
1870
1871 if (wc->status == 0) {
1872 switch (wc->cmd) {
1873 /* intercept any freemem requests so that we know
1874 we are always current with the user-level view
1875 of things.
1876 */
1877
1878 case WFC_REPORT_FREE_MEMORY:
1879 dev.freemem = demunge_int32 (wc->rbuf, 4);
1880 break;
1881
1882 case WFC_UPLOAD_PATCH:
1883 demunge_buf (wc->rbuf, wc->rbuf, WF_PATCH_BYTES);
1884 break;
1885
1886 case WFC_UPLOAD_PROGRAM:
1887 demunge_buf (wc->rbuf, wc->rbuf, WF_PROGRAM_BYTES);
1888 break;
1889
1890 case WFC_UPLOAD_EDRUM_PROGRAM:
1891 demunge_buf (wc->rbuf, wc->rbuf, WF_DRUM_BYTES - 1);
1892 break;
1893
1894 case WFC_UPLOAD_SAMPLE_HEADER:
1895 process_sample_hdr (wc->rbuf);
1896 break;
1897
1898 case WFC_UPLOAD_SAMPLE_ALIAS:
1899 printk (KERN_INFO LOGNAME "support for "
1900 "sample aliases still "
1901 "being considered.\n");
1902 break;
1903
1904 case WFC_VMIDI_OFF:
1905 if (virtual_midi_disable () < 0) {
1906 return -(EIO);
1907 }
1908 break;
1909
1910 case WFC_VMIDI_ON:
1911 if (virtual_midi_enable () < 0) {
1912 return -(EIO);
1913 }
1914 break;
1915 }
1916 }
1917
1918 return 0;
1919}
1920
1921
1922/***********************************************************************/
1923/* WaveFront: Linux file system interface (for access via raw synth) */
1924/***********************************************************************/
1925
1926static int
1927wavefront_open (struct inode *inode, struct file *file)
1928{
1929 /* XXX fix me */
1930 dev.opened = file->f_flags;
1931 return 0;
1932}
1933
1934static int
1935wavefront_release(struct inode *inode, struct file *file)
1936{
1937 lock_kernel();
1938 dev.opened = 0;
1939 dev.debug = 0;
1940 unlock_kernel();
1941 return 0;
1942}
1943
1944static int
1945wavefront_ioctl(struct inode *inode, struct file *file,
1946 unsigned int cmd, unsigned long arg)
1947{
1948 wavefront_control wc;
1949 int err;
1950
1951 switch (cmd) {
1952
1953 case WFCTL_WFCMD:
1954 if (copy_from_user(&wc, (void __user *) arg, sizeof (wc)))
1955 return -EFAULT;
1956
1957 if ((err = wavefront_synth_control (cmd, &wc)) == 0) {
1958 if (copy_to_user ((void __user *) arg, &wc, sizeof (wc)))
1959 return -EFAULT;
1960 }
1961
1962 return err;
1963
1964 case WFCTL_LOAD_SPP:
1965 return wavefront_load_patch ((const char __user *) arg);
1966
1967 default:
1968 printk (KERN_WARNING LOGNAME "invalid ioctl %#x\n", cmd);
1969 return -(EINVAL);
1970
1971 }
1972 return 0;
1973}
1974
1975static /*const*/ struct file_operations wavefront_fops = {
1976 .owner = THIS_MODULE,
1977 .llseek = no_llseek,
1978 .ioctl = wavefront_ioctl,
1979 .open = wavefront_open,
1980 .release = wavefront_release,
1981};
1982
1983
1984/***********************************************************************/
1985/* WaveFront: OSS installation and support interface */
1986/***********************************************************************/
1987
1988#if OSS_SUPPORT_LEVEL & OSS_SUPPORT_SEQ
1989
1990static struct synth_info wavefront_info =
1991{"Turtle Beach WaveFront", 0, SYNTH_TYPE_SAMPLE, SAMPLE_TYPE_WAVEFRONT,
1992 0, 32, 0, 0, SYNTH_CAP_INPUT};
1993
1994static int
1995wavefront_oss_open (int devno, int mode)
1996
1997{
1998 dev.opened = mode;
1999 return 0;
2000}
2001
2002static void
2003wavefront_oss_close (int devno)
2004
2005{
2006 dev.opened = 0;
2007 dev.debug = 0;
2008 return;
2009}
2010
2011static int
2012wavefront_oss_ioctl (int devno, unsigned int cmd, void __user * arg)
2013
2014{
2015 wavefront_control wc;
2016 int err;
2017
2018 switch (cmd) {
2019 case SNDCTL_SYNTH_INFO:
2020 if(copy_to_user(arg, &wavefront_info, sizeof (wavefront_info)))
2021 return -EFAULT;
2022 return 0;
2023
2024 case SNDCTL_SEQ_RESETSAMPLES:
2025// printk (KERN_WARNING LOGNAME "driver cannot reset samples.\n");
2026 return 0; /* don't force an error */
2027
2028 case SNDCTL_SEQ_PERCMODE:
2029 return 0; /* don't force an error */
2030
2031 case SNDCTL_SYNTH_MEMAVL:
2032 if ((dev.freemem = wavefront_freemem ()) < 0) {
2033 printk (KERN_ERR LOGNAME "cannot get memory size\n");
2034 return -EIO;
2035 } else {
2036 return dev.freemem;
2037 }
2038 break;
2039
2040 case SNDCTL_SYNTH_CONTROL:
2041 if(copy_from_user (&wc, arg, sizeof (wc)))
2042 err = -EFAULT;
2043 else if ((err = wavefront_synth_control (cmd, &wc)) == 0) {
2044 if(copy_to_user (arg, &wc, sizeof (wc)))
2045 err = -EFAULT;
2046 }
2047
2048 return err;
2049
2050 default:
2051 return -(EINVAL);
2052 }
2053}
2054
2055static int
2056wavefront_oss_load_patch (int devno, int format, const char __user *addr,
2057 int offs, int count, int pmgr_flag)
2058{
2059
2060 if (format == SYSEX_PATCH) { /* Handled by midi_synth.c */
2061 if (midi_load_patch == NULL) {
2062 printk (KERN_ERR LOGNAME
2063 "SYSEX not loadable: "
2064 "no midi patch loader!\n");
2065 return -(EINVAL);
2066 }
2067
2068 return midi_load_patch (devno, format, addr,
2069 offs, count, pmgr_flag);
2070
2071 } else if (format == GUS_PATCH) {
2072 return wavefront_load_gus_patch (devno, format,
2073 addr, offs, count, pmgr_flag);
2074
2075 } else if (format != WAVEFRONT_PATCH) {
2076 printk (KERN_ERR LOGNAME "unknown patch format %d\n", format);
2077 return -(EINVAL);
2078 }
2079
2080 if (count < sizeof (wavefront_patch_info)) {
2081 printk (KERN_ERR LOGNAME "sample header too short\n");
2082 return -(EINVAL);
2083 }
2084
2085 /* "addr" points to a user-space wavefront_patch_info */
2086
2087 return wavefront_load_patch (addr);
2088}
2089
2090static struct synth_operations wavefront_operations =
2091{
2092 .owner = THIS_MODULE,
2093 .id = "WaveFront",
2094 .info = &wavefront_info,
2095 .midi_dev = 0,
2096 .synth_type = SYNTH_TYPE_SAMPLE,
2097 .synth_subtype = SAMPLE_TYPE_WAVEFRONT,
2098 .open = wavefront_oss_open,
2099 .close = wavefront_oss_close,
2100 .ioctl = wavefront_oss_ioctl,
2101 .kill_note = midi_synth_kill_note,
2102 .start_note = midi_synth_start_note,
2103 .set_instr = midi_synth_set_instr,
2104 .reset = midi_synth_reset,
2105 .load_patch = midi_synth_load_patch,
2106 .aftertouch = midi_synth_aftertouch,
2107 .controller = midi_synth_controller,
2108 .panning = midi_synth_panning,
2109 .bender = midi_synth_bender,
2110 .setup_voice = midi_synth_setup_voice
2111};
2112#endif /* OSS_SUPPORT_SEQ */
2113
2114#if OSS_SUPPORT_LEVEL & OSS_SUPPORT_STATIC_INSTALL
2115
2116static void __init attach_wavefront (struct address_info *hw_config)
2117{
2118 (void) install_wavefront ();
2119}
2120
2121static int __init probe_wavefront (struct address_info *hw_config)
2122{
2123 return !detect_wavefront (hw_config->irq, hw_config->io_base);
2124}
2125
2126static void __exit unload_wavefront (struct address_info *hw_config)
2127{
2128 (void) uninstall_wavefront ();
2129}
2130
2131#endif /* OSS_SUPPORT_STATIC_INSTALL */
2132
2133/***********************************************************************/
2134/* WaveFront: Linux modular sound kernel installation interface */
2135/***********************************************************************/
2136
2137static irqreturn_t
2138wavefrontintr(int irq, void *dev_id, struct pt_regs *dummy)
2139{
2140 struct wf_config *hw = dev_id;
2141
2142 /*
2143 Some comments on interrupts. I attempted a version of this
2144 driver that used interrupts throughout the code instead of
2145 doing busy and/or sleep-waiting. Alas, it appears that once
2146 the Motorola firmware is downloaded, the card *never*
2147 generates an RX interrupt. These are successfully generated
2148 during firmware loading, and after that wavefront_status()
2149 reports that an interrupt is pending on the card from time
2150 to time, but it never seems to be delivered to this
2151 driver. Note also that wavefront_status() continues to
2152 report that RX interrupts are enabled, suggesting that I
2153 didn't goof up and disable them by mistake.
2154
2155 Thus, I stepped back to a prior version of
2156 wavefront_wait(), the only place where this really
2157 matters. Its sad, but I've looked through the code to check
2158 on things, and I really feel certain that the Motorola
2159 firmware prevents RX-ready interrupts.
2160 */
2161
2162 if ((wavefront_status() & (STAT_INTR_READ|STAT_INTR_WRITE)) == 0) {
2163 return IRQ_NONE;
2164 }
2165
2166 hw->irq_ok = 1;
2167 hw->irq_cnt++;
2168 wake_up_interruptible (&hw->interrupt_sleeper);
2169 return IRQ_HANDLED;
2170}
2171
2172/* STATUS REGISTER
2173
21740 Host Rx Interrupt Enable (1=Enabled)
21751 Host Rx Register Full (1=Full)
21762 Host Rx Interrupt Pending (1=Interrupt)
21773 Unused
21784 Host Tx Interrupt (1=Enabled)
21795 Host Tx Register empty (1=Empty)
21806 Host Tx Interrupt Pending (1=Interrupt)
21817 Unused
2182*/
2183
2184static int
2185wavefront_interrupt_bits (int irq)
2186
2187{
2188 int bits;
2189
2190 switch (irq) {
2191 case 9:
2192 bits = 0x00;
2193 break;
2194 case 5:
2195 bits = 0x08;
2196 break;
2197 case 12:
2198 bits = 0x10;
2199 break;
2200 case 15:
2201 bits = 0x18;
2202 break;
2203
2204 default:
2205 printk (KERN_WARNING LOGNAME "invalid IRQ %d\n", irq);
2206 bits = -1;
2207 }
2208
2209 return bits;
2210}
2211
2212static void
2213wavefront_should_cause_interrupt (int val, int port, int timeout)
2214
2215{
2216 unsigned long flags;
2217
2218 /* this will not help on SMP - but at least it compiles */
2219 spin_lock_irqsave(&lock, flags);
2220 dev.irq_ok = 0;
2221 outb (val,port);
2222 interruptible_sleep_on_timeout (&dev.interrupt_sleeper, timeout);
2223 spin_unlock_irqrestore(&lock,flags);
2224}
2225
2226static int __init wavefront_hw_reset (void)
2227{
2228 int bits;
2229 int hwv[2];
2230 unsigned long irq_mask;
2231 short reported_irq;
2232
2233 /* IRQ already checked in init_module() */
2234
2235 bits = wavefront_interrupt_bits (dev.irq);
2236
2237 printk (KERN_DEBUG LOGNAME "autodetecting WaveFront IRQ\n");
2238
2239 irq_mask = probe_irq_on ();
2240
2241 outb (0x0, dev.control_port);
2242 outb (0x80 | 0x40 | bits, dev.data_port);
2243 wavefront_should_cause_interrupt(0x80|0x40|0x10|0x1,
2244 dev.control_port,
2245 (reset_time*HZ)/100);
2246
2247 reported_irq = probe_irq_off (irq_mask);
2248
2249 if (reported_irq != dev.irq) {
2250 if (reported_irq == 0) {
2251 printk (KERN_ERR LOGNAME
2252 "No unassigned interrupts detected "
2253 "after h/w reset\n");
2254 } else if (reported_irq < 0) {
2255 printk (KERN_ERR LOGNAME
2256 "Multiple unassigned interrupts detected "
2257 "after h/w reset\n");
2258 } else {
2259 printk (KERN_ERR LOGNAME "autodetected IRQ %d not the "
2260 "value provided (%d)\n", reported_irq,
2261 dev.irq);
2262 }
2263 dev.irq = -1;
2264 return 1;
2265 } else {
2266 printk (KERN_INFO LOGNAME "autodetected IRQ at %d\n",
2267 reported_irq);
2268 }
2269
2270 if (request_irq (dev.irq, wavefrontintr,
2271 SA_INTERRUPT|SA_SHIRQ,
2272 "wavefront synth", &dev) < 0) {
2273 printk (KERN_WARNING LOGNAME "IRQ %d not available!\n",
2274 dev.irq);
2275 return 1;
2276 }
2277
2278 /* try reset of port */
2279
2280 outb (0x0, dev.control_port);
2281
2282 /* At this point, the board is in reset, and the H/W initialization
2283 register is accessed at the same address as the data port.
2284
2285 Bit 7 - Enable IRQ Driver
2286 0 - Tri-state the Wave-Board drivers for the PC Bus IRQs
2287 1 - Enable IRQ selected by bits 5:3 to be driven onto the PC Bus.
2288
2289 Bit 6 - MIDI Interface Select
2290
2291 0 - Use the MIDI Input from the 26-pin WaveBlaster
2292 compatible header as the serial MIDI source
2293 1 - Use the MIDI Input from the 9-pin D connector as the
2294 serial MIDI source.
2295
2296 Bits 5:3 - IRQ Selection
2297 0 0 0 - IRQ 2/9
2298 0 0 1 - IRQ 5
2299 0 1 0 - IRQ 12
2300 0 1 1 - IRQ 15
2301 1 0 0 - Reserved
2302 1 0 1 - Reserved
2303 1 1 0 - Reserved
2304 1 1 1 - Reserved
2305
2306 Bits 2:1 - Reserved
2307 Bit 0 - Disable Boot ROM
2308 0 - memory accesses to 03FC30-03FFFFH utilize the internal Boot ROM
2309 1 - memory accesses to 03FC30-03FFFFH are directed to external
2310 storage.
2311
2312 */
2313
2314 /* configure hardware: IRQ, enable interrupts,
2315 plus external 9-pin MIDI interface selected
2316 */
2317
2318 outb (0x80 | 0x40 | bits, dev.data_port);
2319
2320 /* CONTROL REGISTER
2321
2322 0 Host Rx Interrupt Enable (1=Enabled) 0x1
2323 1 Unused 0x2
2324 2 Unused 0x4
2325 3 Unused 0x8
2326 4 Host Tx Interrupt Enable 0x10
2327 5 Mute (0=Mute; 1=Play) 0x20
2328 6 Master Interrupt Enable (1=Enabled) 0x40
2329 7 Master Reset (0=Reset; 1=Run) 0x80
2330
2331 Take us out of reset, mute output, master + TX + RX interrupts on.
2332
2333 We'll get an interrupt presumably to tell us that the TX
2334 register is clear.
2335 */
2336
2337 wavefront_should_cause_interrupt(0x80|0x40|0x10|0x1,
2338 dev.control_port,
2339 (reset_time*HZ)/100);
2340
2341 /* Note: data port is now the data port, not the h/w initialization
2342 port.
2343 */
2344
2345 if (!dev.irq_ok) {
2346 printk (KERN_WARNING LOGNAME
2347 "intr not received after h/w un-reset.\n");
2348 goto gone_bad;
2349 }
2350
2351 dev.interrupts_on = 1;
2352
2353 /* Note: data port is now the data port, not the h/w initialization
2354 port.
2355
2356 At this point, only "HW VERSION" or "DOWNLOAD OS" commands
2357 will work. So, issue one of them, and wait for TX
2358 interrupt. This can take a *long* time after a cold boot,
2359 while the ISC ROM does its RAM test. The SDK says up to 4
2360 seconds - with 12MB of RAM on a Tropez+, it takes a lot
2361 longer than that (~16secs). Note that the card understands
2362 the difference between a warm and a cold boot, so
2363 subsequent ISC2115 reboots (say, caused by module
2364 reloading) will get through this much faster.
2365
2366 XXX Interesting question: why is no RX interrupt received first ?
2367 */
2368
2369 wavefront_should_cause_interrupt(WFC_HARDWARE_VERSION,
2370 dev.data_port, ramcheck_time*HZ);
2371
2372 if (!dev.irq_ok) {
2373 printk (KERN_WARNING LOGNAME
2374 "post-RAM-check interrupt not received.\n");
2375 goto gone_bad;
2376 }
2377
2378 if (!wavefront_wait (STAT_CAN_READ)) {
2379 printk (KERN_WARNING LOGNAME
2380 "no response to HW version cmd.\n");
2381 goto gone_bad;
2382 }
2383
2384 if ((hwv[0] = wavefront_read ()) == -1) {
2385 printk (KERN_WARNING LOGNAME
2386 "board not responding correctly.\n");
2387 goto gone_bad;
2388 }
2389
2390 if (hwv[0] == 0xFF) { /* NAK */
2391
2392 /* Board's RAM test failed. Try to read error code,
2393 and tell us about it either way.
2394 */
2395
2396 if ((hwv[0] = wavefront_read ()) == -1) {
2397 printk (KERN_WARNING LOGNAME "on-board RAM test failed "
2398 "(bad error code).\n");
2399 } else {
2400 printk (KERN_WARNING LOGNAME "on-board RAM test failed "
2401 "(error code: 0x%x).\n",
2402 hwv[0]);
2403 }
2404 goto gone_bad;
2405 }
2406
2407 /* We're OK, just get the next byte of the HW version response */
2408
2409 if ((hwv[1] = wavefront_read ()) == -1) {
2410 printk (KERN_WARNING LOGNAME "incorrect h/w response.\n");
2411 goto gone_bad;
2412 }
2413
2414 printk (KERN_INFO LOGNAME "hardware version %d.%d\n",
2415 hwv[0], hwv[1]);
2416
2417 return 0;
2418
2419
2420 gone_bad:
2421 if (dev.irq >= 0) {
2422 free_irq (dev.irq, &dev);
2423 dev.irq = -1;
2424 }
2425 return (1);
2426}
2427
2428static int __init detect_wavefront (int irq, int io_base)
2429{
2430 unsigned char rbuf[4], wbuf[4];
2431
2432 /* TB docs say the device takes up 8 ports, but we know that
2433 if there is an FX device present (i.e. a Tropez+) it really
2434 consumes 16.
2435 */
2436
Jeff Garzikd61780c2005-10-30 15:01:51 -08002437 if (!request_region (io_base, 16, "wavfront")) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002438 printk (KERN_ERR LOGNAME "IO address range 0x%x - 0x%x "
2439 "already in use - ignored\n", dev.base,
2440 dev.base+15);
2441 return -1;
2442 }
2443
2444 dev.irq = irq;
2445 dev.base = io_base;
2446 dev.israw = 0;
2447 dev.debug = debug_default;
2448 dev.interrupts_on = 0;
2449 dev.irq_cnt = 0;
2450 dev.rom_samples_rdonly = 1; /* XXX default lock on ROM sample slots */
2451
2452 if (wavefront_cmd (WFC_FIRMWARE_VERSION, rbuf, wbuf) == 0) {
2453
2454 dev.fw_version[0] = rbuf[0];
2455 dev.fw_version[1] = rbuf[1];
2456 printk (KERN_INFO LOGNAME
2457 "firmware %d.%d already loaded.\n",
2458 rbuf[0], rbuf[1]);
2459
2460 /* check that a command actually works */
2461
2462 if (wavefront_cmd (WFC_HARDWARE_VERSION,
2463 rbuf, wbuf) == 0) {
2464 dev.hw_version[0] = rbuf[0];
2465 dev.hw_version[1] = rbuf[1];
2466 } else {
2467 printk (KERN_WARNING LOGNAME "not raw, but no "
2468 "hardware version!\n");
Jeff Garzikd61780c2005-10-30 15:01:51 -08002469 release_region (io_base, 16);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002470 return 0;
2471 }
2472
2473 if (!wf_raw) {
Jeff Garzikd61780c2005-10-30 15:01:51 -08002474 /* will re-acquire region in install_wavefront() */
2475 release_region (io_base, 16);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002476 return 1;
2477 } else {
2478 printk (KERN_INFO LOGNAME
2479 "reloading firmware anyway.\n");
2480 dev.israw = 1;
2481 }
2482
2483 } else {
2484
2485 dev.israw = 1;
2486 printk (KERN_INFO LOGNAME
2487 "no response to firmware probe, assume raw.\n");
2488
2489 }
2490
2491 init_waitqueue_head (&dev.interrupt_sleeper);
2492
2493 if (wavefront_hw_reset ()) {
2494 printk (KERN_WARNING LOGNAME "hardware reset failed\n");
Jeff Garzikd61780c2005-10-30 15:01:51 -08002495 release_region (io_base, 16);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002496 return 0;
2497 }
2498
2499 /* Check for FX device, present only on Tropez+ */
2500
2501 dev.has_fx = (detect_wffx () == 0);
2502
Jeff Garzikd61780c2005-10-30 15:01:51 -08002503 /* will re-acquire region in install_wavefront() */
2504 release_region (io_base, 16);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002505 return 1;
2506}
2507
2508#include "os.h"
2509#include <linux/fs.h>
2510#include <linux/mm.h>
2511#include <linux/slab.h>
2512#include <asm/uaccess.h>
2513
2514
2515static int
2516wavefront_download_firmware (char *path)
2517
2518{
2519 unsigned char section[WF_SECTION_MAX];
2520 char section_length; /* yes, just a char; max value is WF_SECTION_MAX */
2521 int section_cnt_downloaded = 0;
2522 int fd;
2523 int c;
2524 int i;
2525 mm_segment_t fs;
2526
2527 /* This tries to be a bit cleverer than the stuff Alan Cox did for
2528 the generic sound firmware, in that it actually knows
2529 something about the structure of the Motorola firmware. In
2530 particular, it uses a version that has been stripped of the
2531 20K of useless header information, and had section lengths
2532 added, making it possible to load the entire OS without any
2533 [kv]malloc() activity, since the longest entity we ever read is
2534 42 bytes (well, WF_SECTION_MAX) long.
2535 */
2536
2537 fs = get_fs();
2538 set_fs (get_ds());
2539
2540 if ((fd = sys_open (path, 0, 0)) < 0) {
2541 printk (KERN_WARNING LOGNAME "Unable to load \"%s\".\n",
2542 path);
2543 return 1;
2544 }
2545
2546 while (1) {
2547 int x;
2548
2549 if ((x = sys_read (fd, &section_length, sizeof (section_length))) !=
2550 sizeof (section_length)) {
2551 printk (KERN_ERR LOGNAME "firmware read error.\n");
2552 goto failure;
2553 }
2554
2555 if (section_length == 0) {
2556 break;
2557 }
2558
2559 if (sys_read (fd, section, section_length) != section_length) {
2560 printk (KERN_ERR LOGNAME "firmware section "
2561 "read error.\n");
2562 goto failure;
2563 }
2564
2565 /* Send command */
2566
2567 if (wavefront_write (WFC_DOWNLOAD_OS)) {
2568 goto failure;
2569 }
2570
2571 for (i = 0; i < section_length; i++) {
2572 if (wavefront_write (section[i])) {
2573 goto failure;
2574 }
2575 }
2576
2577 /* get ACK */
2578
2579 if (wavefront_wait (STAT_CAN_READ)) {
2580
2581 if ((c = inb (dev.data_port)) != WF_ACK) {
2582
2583 printk (KERN_ERR LOGNAME "download "
2584 "of section #%d not "
2585 "acknowledged, ack = 0x%x\n",
2586 section_cnt_downloaded + 1, c);
2587 goto failure;
2588
2589 }
2590
2591 } else {
2592 printk (KERN_ERR LOGNAME "time out for firmware ACK.\n");
2593 goto failure;
2594 }
2595
2596 }
2597
2598 sys_close (fd);
2599 set_fs (fs);
2600 return 0;
2601
2602 failure:
2603 sys_close (fd);
2604 set_fs (fs);
2605 printk (KERN_ERR "\nWaveFront: firmware download failed!!!\n");
2606 return 1;
2607}
2608
2609static int __init wavefront_config_midi (void)
2610{
2611 unsigned char rbuf[4], wbuf[4];
2612
2613 if (detect_wf_mpu (dev.irq, dev.base) < 0) {
2614 printk (KERN_WARNING LOGNAME
2615 "could not find working MIDI device\n");
2616 return -1;
2617 }
2618
2619 if ((dev.mididev = install_wf_mpu ()) < 0) {
2620 printk (KERN_WARNING LOGNAME
2621 "MIDI interfaces not configured\n");
2622 return -1;
2623 }
2624
2625 /* Route external MIDI to WaveFront synth (by default) */
2626
2627 if (wavefront_cmd (WFC_MISYNTH_ON, rbuf, wbuf)) {
2628 printk (KERN_WARNING LOGNAME
2629 "cannot enable MIDI-IN to synth routing.\n");
2630 /* XXX error ? */
2631 }
2632
2633
2634#if OSS_SUPPORT_LEVEL & OSS_SUPPORT_SEQ
2635 /* Get the regular MIDI patch loading function, so we can
2636 use it if we ever get handed a SYSEX patch. This is
2637 unlikely, because its so damn slow, but we may as well
2638 leave this functionality from maui.c behind, since it
2639 could be useful for sequencer applications that can
2640 only use MIDI to do patch loading.
2641 */
2642
2643 if (midi_devs[dev.mididev]->converter != NULL) {
2644 midi_load_patch = midi_devs[dev.mididev]->converter->load_patch;
2645 midi_devs[dev.mididev]->converter->load_patch =
2646 &wavefront_oss_load_patch;
2647 }
2648
2649#endif /* OSS_SUPPORT_SEQ */
2650
2651 /* Turn on Virtual MIDI, but first *always* turn it off,
2652 since otherwise consectutive reloads of the driver will
2653 never cause the hardware to generate the initial "internal" or
2654 "external" source bytes in the MIDI data stream. This
2655 is pretty important, since the internal hardware generally will
2656 be used to generate none or very little MIDI output, and
2657 thus the only source of MIDI data is actually external. Without
2658 the switch bytes, the driver will think it all comes from
2659 the internal interface. Duh.
2660 */
2661
2662 if (wavefront_cmd (WFC_VMIDI_OFF, rbuf, wbuf)) {
2663 printk (KERN_WARNING LOGNAME
2664 "virtual MIDI mode not disabled\n");
2665 return 0; /* We're OK, but missing the external MIDI dev */
2666 }
2667
2668 if ((dev.ext_mididev = virtual_midi_enable ()) < 0) {
2669 printk (KERN_WARNING LOGNAME "no virtual MIDI access.\n");
2670 } else {
2671 if (wavefront_cmd (WFC_VMIDI_ON, rbuf, wbuf)) {
2672 printk (KERN_WARNING LOGNAME
2673 "cannot enable virtual MIDI mode.\n");
2674 virtual_midi_disable ();
2675 }
2676 }
2677
2678 return 0;
2679}
2680
2681static int __init wavefront_do_reset (int atboot)
2682{
2683 char voices[1];
2684
2685 if (!atboot && wavefront_hw_reset ()) {
2686 printk (KERN_WARNING LOGNAME "hw reset failed.\n");
2687 goto gone_bad;
2688 }
2689
2690 if (dev.israw) {
2691 if (wavefront_download_firmware (ospath)) {
2692 goto gone_bad;
2693 }
2694
2695 dev.israw = 0;
2696
2697 /* Wait for the OS to get running. The protocol for
2698 this is non-obvious, and was determined by
2699 using port-IO tracing in DOSemu and some
2700 experimentation here.
2701
2702 Rather than using timed waits, use interrupts creatively.
2703 */
2704
2705 wavefront_should_cause_interrupt (WFC_NOOP,
2706 dev.data_port,
2707 (osrun_time*HZ));
2708
2709 if (!dev.irq_ok) {
2710 printk (KERN_WARNING LOGNAME
2711 "no post-OS interrupt.\n");
2712 goto gone_bad;
2713 }
2714
2715 /* Now, do it again ! */
2716
2717 wavefront_should_cause_interrupt (WFC_NOOP,
2718 dev.data_port, (10*HZ));
2719
2720 if (!dev.irq_ok) {
2721 printk (KERN_WARNING LOGNAME
2722 "no post-OS interrupt(2).\n");
2723 goto gone_bad;
2724 }
2725
2726 /* OK, no (RX/TX) interrupts any more, but leave mute
2727 in effect.
2728 */
2729
2730 outb (0x80|0x40, dev.control_port);
2731
2732 /* No need for the IRQ anymore */
2733
2734 free_irq (dev.irq, &dev);
2735
2736 }
2737
2738 if (dev.has_fx && fx_raw) {
2739 wffx_init ();
2740 }
2741
2742 /* SETUPSND.EXE asks for sample memory config here, but since i
2743 have no idea how to interpret the result, we'll forget
2744 about it.
2745 */
2746
2747 if ((dev.freemem = wavefront_freemem ()) < 0) {
2748 goto gone_bad;
2749 }
2750
2751 printk (KERN_INFO LOGNAME "available DRAM %dk\n", dev.freemem / 1024);
2752
2753 if (wavefront_write (0xf0) ||
2754 wavefront_write (1) ||
2755 (wavefront_read () < 0)) {
2756 dev.debug = 0;
2757 printk (KERN_WARNING LOGNAME "MPU emulation mode not set.\n");
2758 goto gone_bad;
2759 }
2760
2761 voices[0] = 32;
2762
2763 if (wavefront_cmd (WFC_SET_NVOICES, NULL, voices)) {
2764 printk (KERN_WARNING LOGNAME
2765 "cannot set number of voices to 32.\n");
2766 goto gone_bad;
2767 }
2768
2769
2770 return 0;
2771
2772 gone_bad:
2773 /* reset that sucker so that it doesn't bother us. */
2774
2775 outb (0x0, dev.control_port);
2776 dev.interrupts_on = 0;
2777 if (dev.irq >= 0) {
2778 free_irq (dev.irq, &dev);
2779 }
2780 return 1;
2781}
2782
2783static int __init wavefront_init (int atboot)
2784{
2785 int samples_are_from_rom;
2786
2787 if (dev.israw) {
2788 samples_are_from_rom = 1;
2789 } else {
2790 /* XXX is this always true ? */
2791 samples_are_from_rom = 0;
2792 }
2793
2794 if (dev.israw || fx_raw) {
2795 if (wavefront_do_reset (atboot)) {
2796 return -1;
2797 }
2798 }
2799
2800 wavefront_get_sample_status (samples_are_from_rom);
2801 wavefront_get_program_status ();
2802 wavefront_get_patch_status ();
2803
2804 /* Start normal operation: unreset, master interrupt enabled, no mute
2805 */
2806
2807 outb (0x80|0x40|0x20, dev.control_port);
2808
2809 return (0);
2810}
2811
2812static int __init install_wavefront (void)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002813{
Jeff Garzikd61780c2005-10-30 15:01:51 -08002814 if (!request_region (dev.base+2, 6, "wavefront synth"))
2815 return -1;
2816
2817 if (dev.has_fx) {
2818 if (!request_region (dev.base+8, 8, "wavefront fx")) {
2819 release_region (dev.base+2, 6);
2820 return -1;
2821 }
2822 }
2823
Linus Torvalds1da177e2005-04-16 15:20:36 -07002824 if ((dev.synth_dev = register_sound_synth (&wavefront_fops, -1)) < 0) {
2825 printk (KERN_ERR LOGNAME "cannot register raw synth\n");
Jeff Garzikd61780c2005-10-30 15:01:51 -08002826 goto err_out;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002827 }
2828
2829#if OSS_SUPPORT_LEVEL & OSS_SUPPORT_SEQ
2830 if ((dev.oss_dev = sound_alloc_synthdev()) == -1) {
2831 printk (KERN_ERR LOGNAME "Too many sequencers\n");
Jeff Garzikd61780c2005-10-30 15:01:51 -08002832 /* FIXME: leak: should unregister sound synth */
2833 goto err_out;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002834 } else {
2835 synth_devs[dev.oss_dev] = &wavefront_operations;
2836 }
2837#endif /* OSS_SUPPORT_SEQ */
2838
2839 if (wavefront_init (1) < 0) {
2840 printk (KERN_WARNING LOGNAME "initialization failed.\n");
2841
2842#if OSS_SUPPORT_LEVEL & OSS_SUPPORT_SEQ
2843 sound_unload_synthdev (dev.oss_dev);
2844#endif /* OSS_SUPPORT_SEQ */
2845
Jeff Garzikd61780c2005-10-30 15:01:51 -08002846 goto err_out;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002847 }
2848
Linus Torvalds1da177e2005-04-16 15:20:36 -07002849 if (wavefront_config_midi ()) {
2850 printk (KERN_WARNING LOGNAME "could not initialize MIDI.\n");
2851 }
2852
2853 return dev.oss_dev;
Jeff Garzikd61780c2005-10-30 15:01:51 -08002854
2855err_out:
2856 release_region (dev.base+2, 6);
2857 if (dev.has_fx)
2858 release_region (dev.base+8, 8);
2859 return -1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002860}
2861
2862static void __exit uninstall_wavefront (void)
2863{
2864 /* the first two i/o addresses are freed by the wf_mpu code */
2865 release_region (dev.base+2, 6);
2866
2867 if (dev.has_fx) {
2868 release_region (dev.base+8, 8);
2869 }
2870
2871 unregister_sound_synth (dev.synth_dev);
2872
2873#if OSS_SUPPORT_LEVEL & OSS_SUPPORT_SEQ
2874 sound_unload_synthdev (dev.oss_dev);
2875#endif /* OSS_SUPPORT_SEQ */
2876 uninstall_wf_mpu ();
2877}
2878
2879/***********************************************************************/
2880/* WaveFront FX control */
2881/***********************************************************************/
2882
2883#include "yss225.h"
2884
2885/* Control bits for the Load Control Register
2886 */
2887
2888#define FX_LSB_TRANSFER 0x01 /* transfer after DSP LSB byte written */
2889#define FX_MSB_TRANSFER 0x02 /* transfer after DSP MSB byte written */
2890#define FX_AUTO_INCR 0x04 /* auto-increment DSP address after transfer */
2891
2892static int
2893wffx_idle (void)
2894
2895{
2896 int i;
2897 unsigned int x = 0x80;
2898
2899 for (i = 0; i < 1000; i++) {
2900 x = inb (dev.fx_status);
2901 if ((x & 0x80) == 0) {
2902 break;
2903 }
2904 }
2905
2906 if (x & 0x80) {
2907 printk (KERN_ERR LOGNAME "FX device never idle.\n");
2908 return 0;
2909 }
2910
2911 return (1);
2912}
2913
2914int __init detect_wffx (void)
2915{
2916 /* This is a crude check, but its the best one I have for now.
2917 Certainly on the Maui and the Tropez, wffx_idle() will
2918 report "never idle", which suggests that this test should
2919 work OK.
2920 */
2921
2922 if (inb (dev.fx_status) & 0x80) {
2923 printk (KERN_INFO LOGNAME "Hmm, probably a Maui or Tropez.\n");
2924 return -1;
2925 }
2926
2927 return 0;
2928}
2929
Adrian Bunk155542c2005-06-25 14:58:53 -07002930static void
Linus Torvalds1da177e2005-04-16 15:20:36 -07002931wffx_mute (int onoff)
2932
2933{
2934 if (!wffx_idle()) {
2935 return;
2936 }
2937
2938 outb (onoff ? 0x02 : 0x00, dev.fx_op);
2939}
2940
2941static int
2942wffx_memset (int page,
2943 int addr, int cnt, unsigned short *data)
2944{
2945 if (page < 0 || page > 7) {
2946 printk (KERN_ERR LOGNAME "FX memset: "
2947 "page must be >= 0 and <= 7\n");
2948 return -(EINVAL);
2949 }
2950
2951 if (addr < 0 || addr > 0x7f) {
2952 printk (KERN_ERR LOGNAME "FX memset: "
2953 "addr must be >= 0 and <= 7f\n");
2954 return -(EINVAL);
2955 }
2956
2957 if (cnt == 1) {
2958
2959 outb (FX_LSB_TRANSFER, dev.fx_lcr);
2960 outb (page, dev.fx_dsp_page);
2961 outb (addr, dev.fx_dsp_addr);
2962 outb ((data[0] >> 8), dev.fx_dsp_msb);
2963 outb ((data[0] & 0xff), dev.fx_dsp_lsb);
2964
2965 printk (KERN_INFO LOGNAME "FX: addr %d:%x set to 0x%x\n",
2966 page, addr, data[0]);
2967
2968 } else {
2969 int i;
2970
2971 outb (FX_AUTO_INCR|FX_LSB_TRANSFER, dev.fx_lcr);
2972 outb (page, dev.fx_dsp_page);
2973 outb (addr, dev.fx_dsp_addr);
2974
2975 for (i = 0; i < cnt; i++) {
2976 outb ((data[i] >> 8), dev.fx_dsp_msb);
2977 outb ((data[i] & 0xff), dev.fx_dsp_lsb);
2978 if (!wffx_idle ()) {
2979 break;
2980 }
2981 }
2982
2983 if (i != cnt) {
2984 printk (KERN_WARNING LOGNAME
2985 "FX memset "
2986 "(0x%x, 0x%x, %p, %d) incomplete\n",
2987 page, addr, data, cnt);
2988 return -(EIO);
2989 }
2990 }
2991
2992 return 0;
2993}
2994
2995static int
2996wffx_ioctl (wavefront_fx_info *r)
2997
2998{
2999 unsigned short page_data[256];
3000 unsigned short *pd;
3001
3002 switch (r->request) {
3003 case WFFX_MUTE:
3004 wffx_mute (r->data[0]);
3005 return 0;
3006
3007 case WFFX_MEMSET:
3008
3009 if (r->data[2] <= 0) {
3010 printk (KERN_ERR LOGNAME "cannot write "
3011 "<= 0 bytes to FX\n");
3012 return -(EINVAL);
3013 } else if (r->data[2] == 1) {
3014 pd = (unsigned short *) &r->data[3];
3015 } else {
3016 if (r->data[2] > sizeof (page_data)) {
3017 printk (KERN_ERR LOGNAME "cannot write "
3018 "> 255 bytes to FX\n");
3019 return -(EINVAL);
3020 }
3021 if (copy_from_user(page_data,
3022 (unsigned char __user *)r->data[3],
3023 r->data[2]))
3024 return -EFAULT;
3025 pd = page_data;
3026 }
3027
3028 return wffx_memset (r->data[0], /* page */
3029 r->data[1], /* addr */
3030 r->data[2], /* cnt */
3031 pd);
3032
3033 default:
3034 printk (KERN_WARNING LOGNAME
3035 "FX: ioctl %d not yet supported\n",
3036 r->request);
3037 return -(EINVAL);
3038 }
3039}
3040
3041/* YSS225 initialization.
3042
3043 This code was developed using DOSEMU. The Turtle Beach SETUPSND
3044 utility was run with I/O tracing in DOSEMU enabled, and a reconstruction
3045 of the port I/O done, using the Yamaha faxback document as a guide
3046 to add more logic to the code. Its really pretty weird.
3047
3048 There was an alternative approach of just dumping the whole I/O
3049 sequence as a series of port/value pairs and a simple loop
3050 that output it. However, I hope that eventually I'll get more
3051 control over what this code does, and so I tried to stick with
3052 a somewhat "algorithmic" approach.
3053*/
3054
3055static int __init wffx_init (void)
3056{
3057 int i;
3058 int j;
3059
3060 /* Set all bits for all channels on the MOD unit to zero */
3061 /* XXX But why do this twice ? */
3062
3063 for (j = 0; j < 2; j++) {
3064 for (i = 0x10; i <= 0xff; i++) {
3065
3066 if (!wffx_idle ()) {
3067 return (-1);
3068 }
3069
3070 outb (i, dev.fx_mod_addr);
3071 outb (0x0, dev.fx_mod_data);
3072 }
3073 }
3074
3075 if (!wffx_idle()) return (-1);
3076 outb (0x02, dev.fx_op); /* mute on */
3077
3078 if (!wffx_idle()) return (-1);
3079 outb (0x07, dev.fx_dsp_page);
3080 outb (0x44, dev.fx_dsp_addr);
3081 outb (0x00, dev.fx_dsp_msb);
3082 outb (0x00, dev.fx_dsp_lsb);
3083 if (!wffx_idle()) return (-1);
3084 outb (0x07, dev.fx_dsp_page);
3085 outb (0x42, dev.fx_dsp_addr);
3086 outb (0x00, dev.fx_dsp_msb);
3087 outb (0x00, dev.fx_dsp_lsb);
3088 if (!wffx_idle()) return (-1);
3089 outb (0x07, dev.fx_dsp_page);
3090 outb (0x43, dev.fx_dsp_addr);
3091 outb (0x00, dev.fx_dsp_msb);
3092 outb (0x00, dev.fx_dsp_lsb);
3093 if (!wffx_idle()) return (-1);
3094 outb (0x07, dev.fx_dsp_page);
3095 outb (0x7c, dev.fx_dsp_addr);
3096 outb (0x00, dev.fx_dsp_msb);
3097 outb (0x00, dev.fx_dsp_lsb);
3098 if (!wffx_idle()) return (-1);
3099 outb (0x07, dev.fx_dsp_page);
3100 outb (0x7e, dev.fx_dsp_addr);
3101 outb (0x00, dev.fx_dsp_msb);
3102 outb (0x00, dev.fx_dsp_lsb);
3103 if (!wffx_idle()) return (-1);
3104 outb (0x07, dev.fx_dsp_page);
3105 outb (0x46, dev.fx_dsp_addr);
3106 outb (0x00, dev.fx_dsp_msb);
3107 outb (0x00, dev.fx_dsp_lsb);
3108 if (!wffx_idle()) return (-1);
3109 outb (0x07, dev.fx_dsp_page);
3110 outb (0x49, dev.fx_dsp_addr);
3111 outb (0x00, dev.fx_dsp_msb);
3112 outb (0x00, dev.fx_dsp_lsb);
3113 if (!wffx_idle()) return (-1);
3114 outb (0x07, dev.fx_dsp_page);
3115 outb (0x47, dev.fx_dsp_addr);
3116 outb (0x00, dev.fx_dsp_msb);
3117 outb (0x00, dev.fx_dsp_lsb);
3118 if (!wffx_idle()) return (-1);
3119 outb (0x07, dev.fx_dsp_page);
3120 outb (0x4a, dev.fx_dsp_addr);
3121 outb (0x00, dev.fx_dsp_msb);
3122 outb (0x00, dev.fx_dsp_lsb);
3123
3124 /* either because of stupidity by TB's programmers, or because it
3125 actually does something, rezero the MOD page.
3126 */
3127 for (i = 0x10; i <= 0xff; i++) {
3128
3129 if (!wffx_idle ()) {
3130 return (-1);
3131 }
3132
3133 outb (i, dev.fx_mod_addr);
3134 outb (0x0, dev.fx_mod_data);
3135 }
3136 /* load page zero */
3137
3138 outb (FX_AUTO_INCR|FX_LSB_TRANSFER, dev.fx_lcr);
3139 outb (0x00, dev.fx_dsp_page);
3140 outb (0x00, dev.fx_dsp_addr);
3141
3142 for (i = 0; i < sizeof (page_zero); i += 2) {
3143 outb (page_zero[i], dev.fx_dsp_msb);
3144 outb (page_zero[i+1], dev.fx_dsp_lsb);
3145 if (!wffx_idle()) return (-1);
3146 }
3147
3148 /* Now load page one */
3149
3150 outb (FX_AUTO_INCR|FX_LSB_TRANSFER, dev.fx_lcr);
3151 outb (0x01, dev.fx_dsp_page);
3152 outb (0x00, dev.fx_dsp_addr);
3153
3154 for (i = 0; i < sizeof (page_one); i += 2) {
3155 outb (page_one[i], dev.fx_dsp_msb);
3156 outb (page_one[i+1], dev.fx_dsp_lsb);
3157 if (!wffx_idle()) return (-1);
3158 }
3159
3160 outb (FX_AUTO_INCR|FX_LSB_TRANSFER, dev.fx_lcr);
3161 outb (0x02, dev.fx_dsp_page);
3162 outb (0x00, dev.fx_dsp_addr);
3163
3164 for (i = 0; i < sizeof (page_two); i++) {
3165 outb (page_two[i], dev.fx_dsp_lsb);
3166 if (!wffx_idle()) return (-1);
3167 }
3168
3169 outb (FX_AUTO_INCR|FX_LSB_TRANSFER, dev.fx_lcr);
3170 outb (0x03, dev.fx_dsp_page);
3171 outb (0x00, dev.fx_dsp_addr);
3172
3173 for (i = 0; i < sizeof (page_three); i++) {
3174 outb (page_three[i], dev.fx_dsp_lsb);
3175 if (!wffx_idle()) return (-1);
3176 }
3177
3178 outb (FX_AUTO_INCR|FX_LSB_TRANSFER, dev.fx_lcr);
3179 outb (0x04, dev.fx_dsp_page);
3180 outb (0x00, dev.fx_dsp_addr);
3181
3182 for (i = 0; i < sizeof (page_four); i++) {
3183 outb (page_four[i], dev.fx_dsp_lsb);
3184 if (!wffx_idle()) return (-1);
3185 }
3186
3187 /* Load memory area (page six) */
3188
3189 outb (FX_LSB_TRANSFER, dev.fx_lcr);
3190 outb (0x06, dev.fx_dsp_page);
3191
3192 for (i = 0; i < sizeof (page_six); i += 3) {
3193 outb (page_six[i], dev.fx_dsp_addr);
3194 outb (page_six[i+1], dev.fx_dsp_msb);
3195 outb (page_six[i+2], dev.fx_dsp_lsb);
3196 if (!wffx_idle()) return (-1);
3197 }
3198
3199 outb (FX_AUTO_INCR|FX_LSB_TRANSFER, dev.fx_lcr);
3200 outb (0x07, dev.fx_dsp_page);
3201 outb (0x00, dev.fx_dsp_addr);
3202
3203 for (i = 0; i < sizeof (page_seven); i += 2) {
3204 outb (page_seven[i], dev.fx_dsp_msb);
3205 outb (page_seven[i+1], dev.fx_dsp_lsb);
3206 if (!wffx_idle()) return (-1);
3207 }
3208
3209 /* Now setup the MOD area. We do this algorithmically in order to
3210 save a little data space. It could be done in the same fashion
3211 as the "pages".
3212 */
3213
3214 for (i = 0x00; i <= 0x0f; i++) {
3215 outb (0x01, dev.fx_mod_addr);
3216 outb (i, dev.fx_mod_data);
3217 if (!wffx_idle()) return (-1);
3218 outb (0x02, dev.fx_mod_addr);
3219 outb (0x00, dev.fx_mod_data);
3220 if (!wffx_idle()) return (-1);
3221 }
3222
3223 for (i = 0xb0; i <= 0xbf; i++) {
3224 outb (i, dev.fx_mod_addr);
3225 outb (0x20, dev.fx_mod_data);
3226 if (!wffx_idle()) return (-1);
3227 }
3228
3229 for (i = 0xf0; i <= 0xff; i++) {
3230 outb (i, dev.fx_mod_addr);
3231 outb (0x20, dev.fx_mod_data);
3232 if (!wffx_idle()) return (-1);
3233 }
3234
3235 for (i = 0x10; i <= 0x1d; i++) {
3236 outb (i, dev.fx_mod_addr);
3237 outb (0xff, dev.fx_mod_data);
3238 if (!wffx_idle()) return (-1);
3239 }
3240
3241 outb (0x1e, dev.fx_mod_addr);
3242 outb (0x40, dev.fx_mod_data);
3243 if (!wffx_idle()) return (-1);
3244
3245 for (i = 0x1f; i <= 0x2d; i++) {
3246 outb (i, dev.fx_mod_addr);
3247 outb (0xff, dev.fx_mod_data);
3248 if (!wffx_idle()) return (-1);
3249 }
3250
3251 outb (0x2e, dev.fx_mod_addr);
3252 outb (0x00, dev.fx_mod_data);
3253 if (!wffx_idle()) return (-1);
3254
3255 for (i = 0x2f; i <= 0x3e; i++) {
3256 outb (i, dev.fx_mod_addr);
3257 outb (0x00, dev.fx_mod_data);
3258 if (!wffx_idle()) return (-1);
3259 }
3260
3261 outb (0x3f, dev.fx_mod_addr);
3262 outb (0x20, dev.fx_mod_data);
3263 if (!wffx_idle()) return (-1);
3264
3265 for (i = 0x40; i <= 0x4d; i++) {
3266 outb (i, dev.fx_mod_addr);
3267 outb (0x00, dev.fx_mod_data);
3268 if (!wffx_idle()) return (-1);
3269 }
3270
3271 outb (0x4e, dev.fx_mod_addr);
3272 outb (0x0e, dev.fx_mod_data);
3273 if (!wffx_idle()) return (-1);
3274 outb (0x4f, dev.fx_mod_addr);
3275 outb (0x0e, dev.fx_mod_data);
3276 if (!wffx_idle()) return (-1);
3277
3278
3279 for (i = 0x50; i <= 0x6b; i++) {
3280 outb (i, dev.fx_mod_addr);
3281 outb (0x00, dev.fx_mod_data);
3282 if (!wffx_idle()) return (-1);
3283 }
3284
3285 outb (0x6c, dev.fx_mod_addr);
3286 outb (0x40, dev.fx_mod_data);
3287 if (!wffx_idle()) return (-1);
3288
3289 outb (0x6d, dev.fx_mod_addr);
3290 outb (0x00, dev.fx_mod_data);
3291 if (!wffx_idle()) return (-1);
3292
3293 outb (0x6e, dev.fx_mod_addr);
3294 outb (0x40, dev.fx_mod_data);
3295 if (!wffx_idle()) return (-1);
3296
3297 outb (0x6f, dev.fx_mod_addr);
3298 outb (0x40, dev.fx_mod_data);
3299 if (!wffx_idle()) return (-1);
3300
3301 for (i = 0x70; i <= 0x7f; i++) {
3302 outb (i, dev.fx_mod_addr);
3303 outb (0xc0, dev.fx_mod_data);
3304 if (!wffx_idle()) return (-1);
3305 }
3306
3307 for (i = 0x80; i <= 0xaf; i++) {
3308 outb (i, dev.fx_mod_addr);
3309 outb (0x00, dev.fx_mod_data);
3310 if (!wffx_idle()) return (-1);
3311 }
3312
3313 for (i = 0xc0; i <= 0xdd; i++) {
3314 outb (i, dev.fx_mod_addr);
3315 outb (0x00, dev.fx_mod_data);
3316 if (!wffx_idle()) return (-1);
3317 }
3318
3319 outb (0xde, dev.fx_mod_addr);
3320 outb (0x10, dev.fx_mod_data);
3321 if (!wffx_idle()) return (-1);
3322 outb (0xdf, dev.fx_mod_addr);
3323 outb (0x10, dev.fx_mod_data);
3324 if (!wffx_idle()) return (-1);
3325
3326 for (i = 0xe0; i <= 0xef; i++) {
3327 outb (i, dev.fx_mod_addr);
3328 outb (0x00, dev.fx_mod_data);
3329 if (!wffx_idle()) return (-1);
3330 }
3331
3332 for (i = 0x00; i <= 0x0f; i++) {
3333 outb (0x01, dev.fx_mod_addr);
3334 outb (i, dev.fx_mod_data);
3335 outb (0x02, dev.fx_mod_addr);
3336 outb (0x01, dev.fx_mod_data);
3337 if (!wffx_idle()) return (-1);
3338 }
3339
3340 outb (0x02, dev.fx_op); /* mute on */
3341
3342 /* Now set the coefficients and so forth for the programs above */
3343
3344 for (i = 0; i < sizeof (coefficients); i += 4) {
3345 outb (coefficients[i], dev.fx_dsp_page);
3346 outb (coefficients[i+1], dev.fx_dsp_addr);
3347 outb (coefficients[i+2], dev.fx_dsp_msb);
3348 outb (coefficients[i+3], dev.fx_dsp_lsb);
3349 if (!wffx_idle()) return (-1);
3350 }
3351
3352 /* Some settings (?) that are too small to bundle into loops */
3353
3354 if (!wffx_idle()) return (-1);
3355 outb (0x1e, dev.fx_mod_addr);
3356 outb (0x14, dev.fx_mod_data);
3357 if (!wffx_idle()) return (-1);
3358 outb (0xde, dev.fx_mod_addr);
3359 outb (0x20, dev.fx_mod_data);
3360 if (!wffx_idle()) return (-1);
3361 outb (0xdf, dev.fx_mod_addr);
3362 outb (0x20, dev.fx_mod_data);
3363
3364 /* some more coefficients */
3365
3366 if (!wffx_idle()) return (-1);
3367 outb (0x06, dev.fx_dsp_page);
3368 outb (0x78, dev.fx_dsp_addr);
3369 outb (0x00, dev.fx_dsp_msb);
3370 outb (0x40, dev.fx_dsp_lsb);
3371 if (!wffx_idle()) return (-1);
3372 outb (0x07, dev.fx_dsp_page);
3373 outb (0x03, dev.fx_dsp_addr);
3374 outb (0x0f, dev.fx_dsp_msb);
3375 outb (0xff, dev.fx_dsp_lsb);
3376 if (!wffx_idle()) return (-1);
3377 outb (0x07, dev.fx_dsp_page);
3378 outb (0x0b, dev.fx_dsp_addr);
3379 outb (0x0f, dev.fx_dsp_msb);
3380 outb (0xff, dev.fx_dsp_lsb);
3381 if (!wffx_idle()) return (-1);
3382 outb (0x07, dev.fx_dsp_page);
3383 outb (0x02, dev.fx_dsp_addr);
3384 outb (0x00, dev.fx_dsp_msb);
3385 outb (0x00, dev.fx_dsp_lsb);
3386 if (!wffx_idle()) return (-1);
3387 outb (0x07, dev.fx_dsp_page);
3388 outb (0x0a, dev.fx_dsp_addr);
3389 outb (0x00, dev.fx_dsp_msb);
3390 outb (0x00, dev.fx_dsp_lsb);
3391 if (!wffx_idle()) return (-1);
3392 outb (0x07, dev.fx_dsp_page);
3393 outb (0x46, dev.fx_dsp_addr);
3394 outb (0x00, dev.fx_dsp_msb);
3395 outb (0x00, dev.fx_dsp_lsb);
3396 if (!wffx_idle()) return (-1);
3397 outb (0x07, dev.fx_dsp_page);
3398 outb (0x49, dev.fx_dsp_addr);
3399 outb (0x00, dev.fx_dsp_msb);
3400 outb (0x00, dev.fx_dsp_lsb);
3401
3402 /* Now, for some strange reason, lets reload every page
3403 and all the coefficients over again. I have *NO* idea
3404 why this is done. I do know that no sound is produced
3405 is this phase is omitted.
3406 */
3407
3408 outb (FX_AUTO_INCR|FX_LSB_TRANSFER, dev.fx_lcr);
3409 outb (0x00, dev.fx_dsp_page);
3410 outb (0x10, dev.fx_dsp_addr);
3411
3412 for (i = 0; i < sizeof (page_zero_v2); i += 2) {
3413 outb (page_zero_v2[i], dev.fx_dsp_msb);
3414 outb (page_zero_v2[i+1], dev.fx_dsp_lsb);
3415 if (!wffx_idle()) return (-1);
3416 }
3417
3418 outb (FX_AUTO_INCR|FX_LSB_TRANSFER, dev.fx_lcr);
3419 outb (0x01, dev.fx_dsp_page);
3420 outb (0x10, dev.fx_dsp_addr);
3421
3422 for (i = 0; i < sizeof (page_one_v2); i += 2) {
3423 outb (page_one_v2[i], dev.fx_dsp_msb);
3424 outb (page_one_v2[i+1], dev.fx_dsp_lsb);
3425 if (!wffx_idle()) return (-1);
3426 }
3427
3428 if (!wffx_idle()) return (-1);
3429 if (!wffx_idle()) return (-1);
3430
3431 outb (FX_AUTO_INCR|FX_LSB_TRANSFER, dev.fx_lcr);
3432 outb (0x02, dev.fx_dsp_page);
3433 outb (0x10, dev.fx_dsp_addr);
3434
3435 for (i = 0; i < sizeof (page_two_v2); i++) {
3436 outb (page_two_v2[i], dev.fx_dsp_lsb);
3437 if (!wffx_idle()) return (-1);
3438 }
3439 outb (FX_AUTO_INCR|FX_LSB_TRANSFER, dev.fx_lcr);
3440 outb (0x03, dev.fx_dsp_page);
3441 outb (0x10, dev.fx_dsp_addr);
3442
3443 for (i = 0; i < sizeof (page_three_v2); i++) {
3444 outb (page_three_v2[i], dev.fx_dsp_lsb);
3445 if (!wffx_idle()) return (-1);
3446 }
3447
3448 outb (FX_AUTO_INCR|FX_LSB_TRANSFER, dev.fx_lcr);
3449 outb (0x04, dev.fx_dsp_page);
3450 outb (0x10, dev.fx_dsp_addr);
3451
3452 for (i = 0; i < sizeof (page_four_v2); i++) {
3453 outb (page_four_v2[i], dev.fx_dsp_lsb);
3454 if (!wffx_idle()) return (-1);
3455 }
3456
3457 outb (FX_LSB_TRANSFER, dev.fx_lcr);
3458 outb (0x06, dev.fx_dsp_page);
3459
3460 /* Page six v.2 is algorithmic */
3461
3462 for (i = 0x10; i <= 0x3e; i += 2) {
3463 outb (i, dev.fx_dsp_addr);
3464 outb (0x00, dev.fx_dsp_msb);
3465 outb (0x00, dev.fx_dsp_lsb);
3466 if (!wffx_idle()) return (-1);
3467 }
3468
3469 outb (FX_AUTO_INCR|FX_LSB_TRANSFER, dev.fx_lcr);
3470 outb (0x07, dev.fx_dsp_page);
3471 outb (0x10, dev.fx_dsp_addr);
3472
3473 for (i = 0; i < sizeof (page_seven_v2); i += 2) {
3474 outb (page_seven_v2[i], dev.fx_dsp_msb);
3475 outb (page_seven_v2[i+1], dev.fx_dsp_lsb);
3476 if (!wffx_idle()) return (-1);
3477 }
3478
3479 for (i = 0x00; i < sizeof(mod_v2); i += 2) {
3480 outb (mod_v2[i], dev.fx_mod_addr);
3481 outb (mod_v2[i+1], dev.fx_mod_data);
3482 if (!wffx_idle()) return (-1);
3483 }
3484
3485 for (i = 0; i < sizeof (coefficients2); i += 4) {
3486 outb (coefficients2[i], dev.fx_dsp_page);
3487 outb (coefficients2[i+1], dev.fx_dsp_addr);
3488 outb (coefficients2[i+2], dev.fx_dsp_msb);
3489 outb (coefficients2[i+3], dev.fx_dsp_lsb);
3490 if (!wffx_idle()) return (-1);
3491 }
3492
3493 for (i = 0; i < sizeof (coefficients3); i += 2) {
3494 int x;
3495
3496 outb (0x07, dev.fx_dsp_page);
3497 x = (i % 4) ? 0x4e : 0x4c;
3498 outb (x, dev.fx_dsp_addr);
3499 outb (coefficients3[i], dev.fx_dsp_msb);
3500 outb (coefficients3[i+1], dev.fx_dsp_lsb);
3501 }
3502
3503 outb (0x00, dev.fx_op); /* mute off */
3504 if (!wffx_idle()) return (-1);
3505
3506 return (0);
3507}
3508
3509static int io = -1;
3510static int irq = -1;
3511
3512MODULE_AUTHOR ("Paul Barton-Davis <pbd@op.net>");
3513MODULE_DESCRIPTION ("Turtle Beach WaveFront Linux Driver");
3514MODULE_LICENSE("GPL");
3515module_param (io, int, 0);
3516module_param (irq, int, 0);
3517
3518static int __init init_wavfront (void)
3519{
3520 printk ("Turtle Beach WaveFront Driver\n"
3521 "Copyright (C) by Hannu Solvainen, "
3522 "Paul Barton-Davis 1993-1998.\n");
3523
3524 /* XXX t'would be lovely to ask the CS4232 for these values, eh ? */
3525
3526 if (io == -1 || irq == -1) {
3527 printk (KERN_INFO LOGNAME "irq and io options must be set.\n");
3528 return -EINVAL;
3529 }
3530
3531 if (wavefront_interrupt_bits (irq) < 0) {
3532 printk (KERN_INFO LOGNAME
3533 "IRQ must be 9, 5, 12 or 15 (not %d)\n", irq);
3534 return -ENODEV;
3535 }
3536
3537 if (detect_wavefront (irq, io) < 0) {
3538 return -ENODEV;
3539 }
3540
3541 if (install_wavefront () < 0) {
3542 return -EIO;
3543 }
3544
3545 return 0;
3546}
3547
3548static void __exit cleanup_wavfront (void)
3549{
3550 uninstall_wavefront ();
3551}
3552
3553module_init(init_wavfront);
3554module_exit(cleanup_wavfront);