Commit 59540fe8 authored by Clemens Ladisch's avatar Clemens Ladisch Committed by Jaroslav Kysela

[ALSA] wavefront: simplify YSS225 register initialization

Instead of using a somewhat algorithmic approach of initializing the
YSS225's registers, just use a simple series of port/value pairs.
This makes it easier to later replace or entirely remove the register
data blob.
Signed-off-by: default avatarClemens Ladisch <clemens@ladisch.de>
Signed-off-by: default avatarJaroslav Kysela <perex@suse.cz>
parent de66d53e
...@@ -85,6 +85,7 @@ struct _snd_wavefront { ...@@ -85,6 +85,7 @@ struct _snd_wavefront {
char hw_version[2]; /* major = [0], minor = [1] */ char hw_version[2]; /* major = [0], minor = [1] */
char israw; /* needs Motorola microcode */ char israw; /* needs Motorola microcode */
char has_fx; /* has FX processor (Tropez+) */ char has_fx; /* has FX processor (Tropez+) */
char fx_initialized; /* FX's register pages initialized */
char prog_status[WF_MAX_PROGRAM]; /* WF_SLOT_* */ char prog_status[WF_MAX_PROGRAM]; /* WF_SLOT_* */
char patch_status[WF_MAX_PATCH]; /* WF_SLOT_* */ char patch_status[WF_MAX_PATCH]; /* WF_SLOT_* */
char sample_status[WF_MAX_SAMPLE]; /* WF_ST_* | WF_SLOT_* */ char sample_status[WF_MAX_SAMPLE]; /* WF_ST_* | WF_SLOT_* */
...@@ -94,6 +95,7 @@ struct _snd_wavefront { ...@@ -94,6 +95,7 @@ struct _snd_wavefront {
spinlock_t irq_lock; spinlock_t irq_lock;
wait_queue_head_t interrupt_sleeper; wait_queue_head_t interrupt_sleeper;
snd_wavefront_midi_t midi; /* ICS2115 MIDI interface */ snd_wavefront_midi_t midi; /* ICS2115 MIDI interface */
struct snd_card *card;
}; };
struct _snd_wavefront_card { struct _snd_wavefront_card {
......
...@@ -402,6 +402,7 @@ static struct snd_card *snd_wavefront_card_new(int dev) ...@@ -402,6 +402,7 @@ static struct snd_card *snd_wavefront_card_new(int dev)
init_waitqueue_head(&acard->wavefront.interrupt_sleeper); init_waitqueue_head(&acard->wavefront.interrupt_sleeper);
spin_lock_init(&acard->wavefront.midi.open); spin_lock_init(&acard->wavefront.midi.open);
spin_lock_init(&acard->wavefront.midi.virtual); spin_lock_init(&acard->wavefront.midi.virtual);
acard->wavefront.card = card;
card->private_free = snd_wavefront_free; card->private_free = snd_wavefront_free;
return card; return card;
......
...@@ -32,325 +32,9 @@ ...@@ -32,325 +32,9 @@
#define FX_MSB_TRANSFER 0x02 /* transfer after DSP MSB byte written */ #define FX_MSB_TRANSFER 0x02 /* transfer after DSP MSB byte written */
#define FX_AUTO_INCR 0x04 /* auto-increment DSP address after transfer */ #define FX_AUTO_INCR 0x04 /* auto-increment DSP address after transfer */
/* weird stuff, derived from port I/O tracing with dosemu */ #define WAIT_IDLE 0xff
static unsigned char page_zero[] __devinitdata = { #include "yss225.c"
0x01, 0x7c, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf5, 0x00,
0x11, 0x00, 0x20, 0x00, 0x32, 0x00, 0x40, 0x00, 0x13, 0x00, 0x00,
0x00, 0x14, 0x02, 0x76, 0x00, 0x60, 0x00, 0x80, 0x02, 0x00, 0x00,
0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x19,
0x01, 0x1a, 0x01, 0x20, 0x01, 0x40, 0x01, 0x17, 0x00, 0x00, 0x01,
0x80, 0x01, 0x20, 0x00, 0x10, 0x01, 0xa0, 0x03, 0xd1, 0x00, 0x00,
0x01, 0xf2, 0x02, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0xf4, 0x02,
0xe0, 0x00, 0x15, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x17,
0x00, 0x20, 0x00, 0x00, 0x00, 0x20, 0x00, 0x50, 0x00, 0x00, 0x00,
0x40, 0x00, 0x00, 0x00, 0x71, 0x02, 0x00, 0x00, 0x60, 0x00, 0x00,
0x00, 0x92, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0xb3, 0x02,
0x00, 0x00, 0xa0, 0x00, 0x00, 0x00, 0xd4, 0x00, 0x00, 0x00, 0x40,
0x00, 0x80, 0x00, 0xf5, 0x00, 0x20, 0x00, 0x70, 0x00, 0xa0, 0x02,
0x11, 0x00, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20,
0x02, 0x00, 0x00, 0x20, 0x00, 0x10, 0x00, 0x17, 0x00, 0x1b, 0x00,
0x1d, 0x02, 0xdf
};
static unsigned char page_one[] __devinitdata = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x19, 0x00,
0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xd8, 0x00, 0x00,
0x02, 0x20, 0x00, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x01,
0xc0, 0x01, 0xfa, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x40, 0x02, 0x60,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xc0, 0x02, 0x80, 0x00,
0x00, 0x02, 0xfb, 0x02, 0xa0, 0x00, 0x00, 0x00, 0x1b, 0x02, 0xd7,
0x00, 0x00, 0x02, 0xf7, 0x03, 0x20, 0x03, 0x00, 0x00, 0x00, 0x00,
0x1c, 0x03, 0x3c, 0x00, 0x00, 0x03, 0x3f, 0x00, 0x00, 0x03, 0xc0,
0x00, 0x00, 0x03, 0xdf, 0x00, 0x00, 0x00, 0x00, 0x03, 0x5d, 0x00,
0x00, 0x03, 0xc0, 0x00, 0x00, 0x03, 0x7d, 0x00, 0x00, 0x03, 0xc0,
0x00, 0x00, 0x03, 0x9e, 0x00, 0x00, 0x03, 0xc0, 0x00, 0x00, 0x03,
0xbe, 0x00, 0x00, 0x03, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02,
0xdb, 0x00, 0x00, 0x02, 0xdb, 0x00, 0x00, 0x02, 0xe0, 0x00, 0x00,
0x02, 0xfb, 0x00, 0x00, 0x02, 0xc0, 0x02, 0x40, 0x02, 0xfb, 0x02,
0x60, 0x00, 0x1b
};
static unsigned char page_two[] __devinitdata = {
0xc4, 0x00, 0x44, 0x07, 0x44, 0x00, 0x40, 0x25, 0x01, 0x06, 0xc4,
0x07, 0x40, 0x25, 0x01, 0x00, 0x46, 0x46, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x07,
0x05, 0x05, 0x05, 0x04, 0x07, 0x05, 0x04, 0x07, 0x05, 0x44, 0x46,
0x44, 0x46, 0x46, 0x07, 0x05, 0x44, 0x46, 0x05, 0x46, 0x05, 0x46,
0x05, 0x46, 0x05, 0x44, 0x46, 0x05, 0x07, 0x44, 0x46, 0x05, 0x07,
0x44, 0x46, 0x05, 0x07, 0x44, 0x46, 0x05, 0x07, 0x44, 0x05, 0x05,
0x05, 0x44, 0x05, 0x05, 0x05, 0x46, 0x05, 0x46, 0x05, 0x46, 0x05,
0x46, 0x05, 0x46, 0x07, 0x46, 0x07, 0x44
};
static unsigned char page_three[] __devinitdata = {
0x07, 0x40, 0x00, 0x00, 0x00, 0x47, 0x00, 0x40, 0x00, 0x40, 0x06,
0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80,
0xc0, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00,
0x60, 0x00, 0x70, 0x00, 0x40, 0x00, 0x40, 0x00, 0x42, 0x00, 0x40,
0x00, 0x02, 0x00, 0x40, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00,
0x40, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00,
0x00, 0x42, 0x00, 0x40, 0x00, 0x42, 0x00, 0x02, 0x00, 0x02, 0x00,
0x02, 0x00, 0x42, 0x00, 0xc0, 0x00, 0x40
};
static unsigned char page_four[] __devinitdata = {
0x63, 0x03, 0x26, 0x02, 0x2c, 0x00, 0x24, 0x00, 0x2e, 0x02, 0x02,
0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
0x20, 0x00, 0x60, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x60, 0x00,
0x20, 0x00, 0x60, 0x00, 0x20, 0x00, 0x60, 0x00, 0x20, 0x00, 0x60,
0x00, 0x20, 0x00, 0x60, 0x00, 0x20, 0x00, 0x60, 0x00, 0x20, 0x00,
0x20, 0x00, 0x22, 0x02, 0x22, 0x02, 0x20, 0x00, 0x60, 0x00, 0x22,
0x02, 0x62, 0x02, 0x20, 0x01, 0x21, 0x01
};
static unsigned char page_six[] __devinitdata = {
0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x06, 0x00,
0x00, 0x08, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x0e,
0x00, 0x00, 0x10, 0x00, 0x00, 0x12, 0x00, 0x00, 0x14, 0x00, 0x00,
0x16, 0x00, 0x00, 0x18, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x1c, 0x00,
0x00, 0x1e, 0x00, 0x00, 0x20, 0x00, 0x00, 0x22, 0x00, 0x00, 0x24,
0x00, 0x00, 0x26, 0x00, 0x00, 0x28, 0x00, 0x00, 0x2a, 0x00, 0x00,
0x2c, 0x00, 0x00, 0x2e, 0x00, 0x00, 0x30, 0x00, 0x00, 0x32, 0x00,
0x00, 0x34, 0x00, 0x00, 0x36, 0x00, 0x00, 0x38, 0x00, 0x00, 0x3a,
0x00, 0x00, 0x3c, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x40, 0x00, 0x00,
0x42, 0x03, 0x00, 0x44, 0x01, 0x00, 0x46, 0x0a, 0x21, 0x48, 0x0d,
0x23, 0x4a, 0x23, 0x1b, 0x4c, 0x37, 0x8f, 0x4e, 0x45, 0x77, 0x50,
0x52, 0xe2, 0x52, 0x1c, 0x92, 0x54, 0x1c, 0x52, 0x56, 0x07, 0x00,
0x58, 0x2f, 0xc6, 0x5a, 0x0b, 0x00, 0x5c, 0x30, 0x06, 0x5e, 0x17,
0x00, 0x60, 0x3d, 0xda, 0x62, 0x29, 0x00, 0x64, 0x3e, 0x41, 0x66,
0x39, 0x00, 0x68, 0x4c, 0x48, 0x6a, 0x49, 0x00, 0x6c, 0x4c, 0x6c,
0x6e, 0x11, 0xd2, 0x70, 0x16, 0x0c, 0x72, 0x00, 0x00, 0x74, 0x00,
0x80, 0x76, 0x0f, 0x00, 0x78, 0x00, 0x80, 0x7a, 0x13, 0x00, 0x7c,
0x80, 0x00, 0x7e, 0x80, 0x80
};
static unsigned char page_seven[] __devinitdata = {
0x0f, 0xff, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00,
0x00, 0x00, 0x00, 0x0f, 0xff, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00,
0x08, 0x00, 0x00, 0x00, 0x0f, 0xff, 0x00, 0x00, 0x00, 0x00, 0x0f,
0xff, 0x0f, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0x0f, 0xff,
0x0f, 0xff, 0x0f, 0xff, 0x02, 0xe9, 0x06, 0x8c, 0x06, 0x8c, 0x0f,
0xff, 0x1a, 0x75, 0x0d, 0x8b, 0x04, 0xe9, 0x0b, 0x16, 0x1a, 0x38,
0x0d, 0xc8, 0x04, 0x6f, 0x0b, 0x91, 0x0f, 0xff, 0x06, 0x40, 0x06,
0x40, 0x02, 0x8f, 0x0f, 0xff, 0x06, 0x62, 0x06, 0x62, 0x02, 0x7b,
0x0f, 0xff, 0x06, 0x97, 0x06, 0x97, 0x02, 0x52, 0x0f, 0xff, 0x06,
0xf6, 0x06, 0xf6, 0x02, 0x19, 0x05, 0x55, 0x05, 0x55, 0x05, 0x55,
0x05, 0x55, 0x05, 0x55, 0x05, 0x55, 0x05, 0x55, 0x05, 0x55, 0x14,
0xda, 0x0d, 0x93, 0x04, 0xda, 0x05, 0x93, 0x14, 0xda, 0x0d, 0x93,
0x04, 0xda, 0x05, 0x93, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x02, 0x00
};
static unsigned char page_zero_v2[] __devinitdata = {
0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
static unsigned char page_one_v2[] __devinitdata = {
0x01, 0xc0, 0x01, 0xfa, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
static unsigned char page_two_v2[] __devinitdata = {
0x46, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00
};
static unsigned char page_three_v2[] __devinitdata = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00
};
static unsigned char page_four_v2[] __devinitdata = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00
};
static unsigned char page_seven_v2[] __devinitdata = {
0x0f, 0xff, 0x0f, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
static unsigned char mod_v2[] __devinitdata = {
0x01, 0x00, 0x02, 0x00, 0x01, 0x01, 0x02, 0x00, 0x01, 0x02, 0x02,
0x00, 0x01, 0x03, 0x02, 0x00, 0x01, 0x04, 0x02, 0x00, 0x01, 0x05,
0x02, 0x00, 0x01, 0x06, 0x02, 0x00, 0x01, 0x07, 0x02, 0x00, 0xb0,
0x20, 0xb1, 0x20, 0xb2, 0x20, 0xb3, 0x20, 0xb4, 0x20, 0xb5, 0x20,
0xb6, 0x20, 0xb7, 0x20, 0xf0, 0x20, 0xf1, 0x20, 0xf2, 0x20, 0xf3,
0x20, 0xf4, 0x20, 0xf5, 0x20, 0xf6, 0x20, 0xf7, 0x20, 0x10, 0xff,
0x11, 0xff, 0x12, 0xff, 0x13, 0xff, 0x14, 0xff, 0x15, 0xff, 0x16,
0xff, 0x17, 0xff, 0x20, 0xff, 0x21, 0xff, 0x22, 0xff, 0x23, 0xff,
0x24, 0xff, 0x25, 0xff, 0x26, 0xff, 0x27, 0xff, 0x30, 0x00, 0x31,
0x00, 0x32, 0x00, 0x33, 0x00, 0x34, 0x00, 0x35, 0x00, 0x36, 0x00,
0x37, 0x00, 0x40, 0x00, 0x41, 0x00, 0x42, 0x00, 0x43, 0x00, 0x44,
0x00, 0x45, 0x00, 0x46, 0x00, 0x47, 0x00, 0x50, 0x00, 0x51, 0x00,
0x52, 0x00, 0x53, 0x00, 0x54, 0x00, 0x55, 0x00, 0x56, 0x00, 0x57,
0x00, 0x60, 0x00, 0x61, 0x00, 0x62, 0x00, 0x63, 0x00, 0x64, 0x00,
0x65, 0x00, 0x66, 0x00, 0x67, 0x00, 0x70, 0xc0, 0x71, 0xc0, 0x72,
0xc0, 0x73, 0xc0, 0x74, 0xc0, 0x75, 0xc0, 0x76, 0xc0, 0x77, 0xc0,
0x80, 0x00, 0x81, 0x00, 0x82, 0x00, 0x83, 0x00, 0x84, 0x00, 0x85,
0x00, 0x86, 0x00, 0x87, 0x00, 0x90, 0x00, 0x91, 0x00, 0x92, 0x00,
0x93, 0x00, 0x94, 0x00, 0x95, 0x00, 0x96, 0x00, 0x97, 0x00, 0xa0,
0x00, 0xa1, 0x00, 0xa2, 0x00, 0xa3, 0x00, 0xa4, 0x00, 0xa5, 0x00,
0xa6, 0x00, 0xa7, 0x00, 0xc0, 0x00, 0xc1, 0x00, 0xc2, 0x00, 0xc3,
0x00, 0xc4, 0x00, 0xc5, 0x00, 0xc6, 0x00, 0xc7, 0x00, 0xd0, 0x00,
0xd1, 0x00, 0xd2, 0x00, 0xd3, 0x00, 0xd4, 0x00, 0xd5, 0x00, 0xd6,
0x00, 0xd7, 0x00, 0xe0, 0x00, 0xe1, 0x00, 0xe2, 0x00, 0xe3, 0x00,
0xe4, 0x00, 0xe5, 0x00, 0xe6, 0x00, 0xe7, 0x00, 0x01, 0x00, 0x02,
0x01, 0x01, 0x01, 0x02, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x03,
0x02, 0x01, 0x01, 0x04, 0x02, 0x01, 0x01, 0x05, 0x02, 0x01, 0x01,
0x06, 0x02, 0x01, 0x01, 0x07, 0x02, 0x01
};
static unsigned char coefficients[] __devinitdata = {
0x07, 0x46, 0x00, 0x00, 0x07, 0x49, 0x00, 0x00, 0x00, 0x4b, 0x03,
0x11, 0x00, 0x4d, 0x01, 0x32, 0x07, 0x46, 0x00, 0x00, 0x07, 0x49,
0x00, 0x00, 0x07, 0x40, 0x00, 0x00, 0x07, 0x41, 0x00, 0x00, 0x01,
0x40, 0x02, 0x40, 0x01, 0x41, 0x02, 0x60, 0x07, 0x40, 0x00, 0x00,
0x07, 0x41, 0x00, 0x00, 0x07, 0x47, 0x00, 0x00, 0x07, 0x4a, 0x00,
0x00, 0x00, 0x47, 0x01, 0x00, 0x00, 0x4a, 0x01, 0x20, 0x07, 0x47,
0x00, 0x00, 0x07, 0x4a, 0x00, 0x00, 0x07, 0x7c, 0x00, 0x00, 0x07,
0x7e, 0x00, 0x00, 0x00, 0x00, 0x01, 0x1c, 0x07, 0x7c, 0x00, 0x00,
0x07, 0x7e, 0x00, 0x00, 0x07, 0x44, 0x00, 0x00, 0x00, 0x44, 0x01,
0x00, 0x07, 0x44, 0x00, 0x00, 0x07, 0x42, 0x00, 0x00, 0x07, 0x43,
0x00, 0x00, 0x00, 0x42, 0x01, 0x1a, 0x00, 0x43, 0x01, 0x20, 0x07,
0x42, 0x00, 0x00, 0x07, 0x43, 0x00, 0x00, 0x07, 0x40, 0x00, 0x00,
0x07, 0x41, 0x00, 0x00, 0x01, 0x40, 0x02, 0x40, 0x01, 0x41, 0x02,
0x60, 0x07, 0x40, 0x00, 0x00, 0x07, 0x41, 0x00, 0x00, 0x07, 0x44,
0x0f, 0xff, 0x07, 0x42, 0x00, 0x00, 0x07, 0x43, 0x00, 0x00, 0x07,
0x40, 0x00, 0x00, 0x07, 0x41, 0x00, 0x00, 0x07, 0x51, 0x06, 0x40,
0x07, 0x50, 0x06, 0x40, 0x07, 0x4f, 0x03, 0x81, 0x07, 0x53, 0x1a,
0x76, 0x07, 0x54, 0x0d, 0x8b, 0x07, 0x55, 0x04, 0xe9, 0x07, 0x56,
0x0b, 0x17, 0x07, 0x57, 0x1a, 0x38, 0x07, 0x58, 0x0d, 0xc9, 0x07,
0x59, 0x04, 0x6f, 0x07, 0x5a, 0x0b, 0x91, 0x07, 0x73, 0x14, 0xda,
0x07, 0x74, 0x0d, 0x93, 0x07, 0x75, 0x04, 0xd9, 0x07, 0x76, 0x05,
0x93, 0x07, 0x77, 0x14, 0xda, 0x07, 0x78, 0x0d, 0x93, 0x07, 0x79,
0x04, 0xd9, 0x07, 0x7a, 0x05, 0x93, 0x07, 0x5e, 0x03, 0x68, 0x07,
0x5c, 0x04, 0x31, 0x07, 0x5d, 0x04, 0x31, 0x07, 0x62, 0x03, 0x52,
0x07, 0x60, 0x04, 0x76, 0x07, 0x61, 0x04, 0x76, 0x07, 0x66, 0x03,
0x2e, 0x07, 0x64, 0x04, 0xda, 0x07, 0x65, 0x04, 0xda, 0x07, 0x6a,
0x02, 0xf6, 0x07, 0x68, 0x05, 0x62, 0x07, 0x69, 0x05, 0x62, 0x06,
0x46, 0x0a, 0x22, 0x06, 0x48, 0x0d, 0x24, 0x06, 0x6e, 0x11, 0xd3,
0x06, 0x70, 0x15, 0xcb, 0x06, 0x52, 0x20, 0x93, 0x06, 0x54, 0x20,
0x54, 0x06, 0x4a, 0x27, 0x1d, 0x06, 0x58, 0x2f, 0xc8, 0x06, 0x5c,
0x30, 0x07, 0x06, 0x4c, 0x37, 0x90, 0x06, 0x60, 0x3d, 0xdb, 0x06,
0x64, 0x3e, 0x42, 0x06, 0x4e, 0x45, 0x78, 0x06, 0x68, 0x4c, 0x48,
0x06, 0x6c, 0x4c, 0x6c, 0x06, 0x50, 0x52, 0xe2, 0x06, 0x42, 0x02,
0xba
};
static unsigned char coefficients2[] __devinitdata = {
0x07, 0x46, 0x00, 0x00, 0x07, 0x49, 0x00, 0x00, 0x07, 0x45, 0x0f,
0xff, 0x07, 0x48, 0x0f, 0xff, 0x07, 0x7b, 0x04, 0xcc, 0x07, 0x7d,
0x04, 0xcc, 0x07, 0x7c, 0x00, 0x00, 0x07, 0x7e, 0x00, 0x00, 0x07,
0x46, 0x00, 0x00, 0x07, 0x49, 0x00, 0x00, 0x07, 0x47, 0x00, 0x00,
0x07, 0x4a, 0x00, 0x00, 0x07, 0x4c, 0x00, 0x00, 0x07, 0x4e, 0x00, 0x00
};
static unsigned char coefficients3[] __devinitdata = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, 0x28, 0x00, 0x51, 0x00,
0x51, 0x00, 0x7a, 0x00, 0x7a, 0x00, 0xa3, 0x00, 0xa3, 0x00, 0xcc,
0x00, 0xcc, 0x00, 0xf5, 0x00, 0xf5, 0x01, 0x1e, 0x01, 0x1e, 0x01,
0x47, 0x01, 0x47, 0x01, 0x70, 0x01, 0x70, 0x01, 0x99, 0x01, 0x99,
0x01, 0xc2, 0x01, 0xc2, 0x01, 0xeb, 0x01, 0xeb, 0x02, 0x14, 0x02,
0x14, 0x02, 0x3d, 0x02, 0x3d, 0x02, 0x66, 0x02, 0x66, 0x02, 0x8f,
0x02, 0x8f, 0x02, 0xb8, 0x02, 0xb8, 0x02, 0xe1, 0x02, 0xe1, 0x03,
0x0a, 0x03, 0x0a, 0x03, 0x33, 0x03, 0x33, 0x03, 0x5c, 0x03, 0x5c,
0x03, 0x85, 0x03, 0x85, 0x03, 0xae, 0x03, 0xae, 0x03, 0xd7, 0x03,
0xd7, 0x04, 0x00, 0x04, 0x00, 0x04, 0x28, 0x04, 0x28, 0x04, 0x51,
0x04, 0x51, 0x04, 0x7a, 0x04, 0x7a, 0x04, 0xa3, 0x04, 0xa3, 0x04,
0xcc, 0x04, 0xcc, 0x04, 0xf5, 0x04, 0xf5, 0x05, 0x1e, 0x05, 0x1e,
0x05, 0x47, 0x05, 0x47, 0x05, 0x70, 0x05, 0x70, 0x05, 0x99, 0x05,
0x99, 0x05, 0xc2, 0x05, 0xc2, 0x05, 0xeb, 0x05, 0xeb, 0x06, 0x14,
0x06, 0x14, 0x06, 0x3d, 0x06, 0x3d, 0x06, 0x66, 0x06, 0x66, 0x06,
0x8f, 0x06, 0x8f, 0x06, 0xb8, 0x06, 0xb8, 0x06, 0xe1, 0x06, 0xe1,
0x07, 0x0a, 0x07, 0x0a, 0x07, 0x33, 0x07, 0x33, 0x07, 0x5c, 0x07,
0x5c, 0x07, 0x85, 0x07, 0x85, 0x07, 0xae, 0x07, 0xae, 0x07, 0xd7,
0x07, 0xd7, 0x08, 0x00, 0x08, 0x00, 0x08, 0x28, 0x08, 0x28, 0x08,
0x51, 0x08, 0x51, 0x08, 0x7a, 0x08, 0x7a, 0x08, 0xa3, 0x08, 0xa3,
0x08, 0xcc, 0x08, 0xcc, 0x08, 0xf5, 0x08, 0xf5, 0x09, 0x1e, 0x09,
0x1e, 0x09, 0x47, 0x09, 0x47, 0x09, 0x70, 0x09, 0x70, 0x09, 0x99,
0x09, 0x99, 0x09, 0xc2, 0x09, 0xc2, 0x09, 0xeb, 0x09, 0xeb, 0x0a,
0x14, 0x0a, 0x14, 0x0a, 0x3d, 0x0a, 0x3d, 0x0a, 0x66, 0x0a, 0x66,
0x0a, 0x8f, 0x0a, 0x8f, 0x0a, 0xb8, 0x0a, 0xb8, 0x0a, 0xe1, 0x0a,
0xe1, 0x0b, 0x0a, 0x0b, 0x0a, 0x0b, 0x33, 0x0b, 0x33, 0x0b, 0x5c,
0x0b, 0x5c, 0x0b, 0x85, 0x0b, 0x85, 0x0b, 0xae, 0x0b, 0xae, 0x0b,
0xd7, 0x0b, 0xd7, 0x0c, 0x00, 0x0c, 0x00, 0x0c, 0x28, 0x0c, 0x28,
0x0c, 0x51, 0x0c, 0x51, 0x0c, 0x7a, 0x0c, 0x7a, 0x0c, 0xa3, 0x0c,
0xa3, 0x0c, 0xcc, 0x0c, 0xcc, 0x0c, 0xf5, 0x0c, 0xf5, 0x0d, 0x1e,
0x0d, 0x1e, 0x0d, 0x47, 0x0d, 0x47, 0x0d, 0x70, 0x0d, 0x70, 0x0d,
0x99, 0x0d, 0x99, 0x0d, 0xc2, 0x0d, 0xc2, 0x0d, 0xeb, 0x0d, 0xeb,
0x0e, 0x14, 0x0e, 0x14, 0x0e, 0x3d, 0x0e, 0x3d, 0x0e, 0x66, 0x0e,
0x66, 0x0e, 0x8f, 0x0e, 0x8f, 0x0e, 0xb8, 0x0e, 0xb8, 0x0e, 0xe1,
0x0e, 0xe1, 0x0f, 0x0a, 0x0f, 0x0a, 0x0f, 0x33, 0x0f, 0x33, 0x0f,
0x5c, 0x0f, 0x5c, 0x0f, 0x85, 0x0f, 0x85, 0x0f, 0xae, 0x0f, 0xae,
0x0f, 0xd7, 0x0f, 0xd7, 0x0f, 0xff, 0x0f, 0xff
};
static int static int
wavefront_fx_idle (snd_wavefront_t *dev) wavefront_fx_idle (snd_wavefront_t *dev)
...@@ -555,465 +239,34 @@ snd_wavefront_fx_ioctl (struct snd_hwdep *sdev, struct file *file, ...@@ -555,465 +239,34 @@ snd_wavefront_fx_ioctl (struct snd_hwdep *sdev, struct file *file,
of the port I/O done, using the Yamaha faxback document as a guide of the port I/O done, using the Yamaha faxback document as a guide
to add more logic to the code. Its really pretty weird. to add more logic to the code. Its really pretty weird.
There was an alternative approach of just dumping the whole I/O This is the approach of just dumping the whole I/O
sequence as a series of port/value pairs and a simple loop sequence as a series of port/value pairs and a simple loop
that output it. However, I hope that eventually I'll get more that outputs it.
control over what this code does, and so I tried to stick with
a somewhat "algorithmic" approach.
*/ */
int __devinit int __devinit
snd_wavefront_fx_start (snd_wavefront_t *dev) snd_wavefront_fx_start (snd_wavefront_t *dev)
{ {
unsigned int i, j; unsigned int i;
/* Set all bits for all channels on the MOD unit to zero */ if (dev->fx_initialized)
/* XXX But why do this twice ? */ return 0;
for (j = 0; j < 2; j++) {
for (i = 0x10; i <= 0xff; i++) {
if (!wavefront_fx_idle (dev)) {
return (-1);
}
outb (i, dev->fx_mod_addr);
outb (0x0, dev->fx_mod_data);
}
}
if (!wavefront_fx_idle (dev)) return (-1); for (i = 0; i < ARRAY_SIZE(yss225_registers); ++i) {
outb (0x02, dev->fx_op); /* mute on */ if (yss225_registers[i].addr >= 8 &&
yss225_registers[i].addr < 16) {
if (!wavefront_fx_idle (dev)) return (-1); outb(yss225_registers[i].data,
outb (0x07, dev->fx_dsp_page); yss225_registers[i].addr + dev->base);
outb (0x44, dev->fx_dsp_addr); } else if (yss225_registers[i].addr == WAIT_IDLE) {
outb (0x00, dev->fx_dsp_msb); if (!wavefront_fx_idle(dev))
outb (0x00, dev->fx_dsp_lsb); return -1;
if (!wavefront_fx_idle (dev)) return (-1); } else {
outb (0x07, dev->fx_dsp_page); snd_printk(KERN_ERR "invalid address"
outb (0x42, dev->fx_dsp_addr); " in register data\n");
outb (0x00, dev->fx_dsp_msb); return -1;
outb (0x00, dev->fx_dsp_lsb);
if (!wavefront_fx_idle (dev)) return (-1);
outb (0x07, dev->fx_dsp_page);
outb (0x43, dev->fx_dsp_addr);
outb (0x00, dev->fx_dsp_msb);
outb (0x00, dev->fx_dsp_lsb);
if (!wavefront_fx_idle (dev)) return (-1);
outb (0x07, dev->fx_dsp_page);
outb (0x7c, dev->fx_dsp_addr);
outb (0x00, dev->fx_dsp_msb);
outb (0x00, dev->fx_dsp_lsb);
if (!wavefront_fx_idle (dev)) return (-1);
outb (0x07, dev->fx_dsp_page);
outb (0x7e, dev->fx_dsp_addr);
outb (0x00, dev->fx_dsp_msb);
outb (0x00, dev->fx_dsp_lsb);
if (!wavefront_fx_idle (dev)) return (-1);
outb (0x07, dev->fx_dsp_page);
outb (0x46, dev->fx_dsp_addr);
outb (0x00, dev->fx_dsp_msb);
outb (0x00, dev->fx_dsp_lsb);
if (!wavefront_fx_idle (dev)) return (-1);
outb (0x07, dev->fx_dsp_page);
outb (0x49, dev->fx_dsp_addr);
outb (0x00, dev->fx_dsp_msb);
outb (0x00, dev->fx_dsp_lsb);
if (!wavefront_fx_idle (dev)) return (-1);
outb (0x07, dev->fx_dsp_page);
outb (0x47, dev->fx_dsp_addr);
outb (0x00, dev->fx_dsp_msb);
outb (0x00, dev->fx_dsp_lsb);
if (!wavefront_fx_idle (dev)) return (-1);
outb (0x07, dev->fx_dsp_page);
outb (0x4a, dev->fx_dsp_addr);
outb (0x00, dev->fx_dsp_msb);
outb (0x00, dev->fx_dsp_lsb);
/* either because of stupidity by TB's programmers, or because it
actually does something, rezero the MOD page.
*/
for (i = 0x10; i <= 0xff; i++) {
if (!wavefront_fx_idle (dev)) {
return (-1);
} }
outb (i, dev->fx_mod_addr);
outb (0x0, dev->fx_mod_data);
}
/* load page zero */
outb (FX_AUTO_INCR|FX_LSB_TRANSFER, dev->fx_lcr);
outb (0x00, dev->fx_dsp_page);
outb (0x00, dev->fx_dsp_addr);
for (i = 0; i < sizeof (page_zero); i += 2) {
outb (page_zero[i], dev->fx_dsp_msb);
outb (page_zero[i+1], dev->fx_dsp_lsb);
if (!wavefront_fx_idle (dev)) return (-1);
}
/* Now load page one */
outb (FX_AUTO_INCR|FX_LSB_TRANSFER, dev->fx_lcr);
outb (0x01, dev->fx_dsp_page);
outb (0x00, dev->fx_dsp_addr);
for (i = 0; i < sizeof (page_one); i += 2) {
outb (page_one[i], dev->fx_dsp_msb);
outb (page_one[i+1], dev->fx_dsp_lsb);
if (!wavefront_fx_idle (dev)) return (-1);
}
outb (FX_AUTO_INCR|FX_LSB_TRANSFER, dev->fx_lcr);
outb (0x02, dev->fx_dsp_page);
outb (0x00, dev->fx_dsp_addr);
for (i = 0; i < sizeof (page_two); i++) {
outb (page_two[i], dev->fx_dsp_lsb);
if (!wavefront_fx_idle (dev)) return (-1);
}
outb (FX_AUTO_INCR|FX_LSB_TRANSFER, dev->fx_lcr);
outb (0x03, dev->fx_dsp_page);
outb (0x00, dev->fx_dsp_addr);
for (i = 0; i < sizeof (page_three); i++) {
outb (page_three[i], dev->fx_dsp_lsb);
if (!wavefront_fx_idle (dev)) return (-1);
}
outb (FX_AUTO_INCR|FX_LSB_TRANSFER, dev->fx_lcr);
outb (0x04, dev->fx_dsp_page);
outb (0x00, dev->fx_dsp_addr);
for (i = 0; i < sizeof (page_four); i++) {
outb (page_four[i], dev->fx_dsp_lsb);
if (!wavefront_fx_idle (dev)) return (-1);
} }
/* Load memory area (page six) */ dev->fx_initialized = 1;
outb (FX_LSB_TRANSFER, dev->fx_lcr);
outb (0x06, dev->fx_dsp_page);
for (i = 0; i < sizeof (page_six); i += 3) {
outb (page_six[i], dev->fx_dsp_addr);
outb (page_six[i+1], dev->fx_dsp_msb);
outb (page_six[i+2], dev->fx_dsp_lsb);
if (!wavefront_fx_idle (dev)) return (-1);
}
outb (FX_AUTO_INCR|FX_LSB_TRANSFER, dev->fx_lcr);
outb (0x07, dev->fx_dsp_page);
outb (0x00, dev->fx_dsp_addr);
for (i = 0; i < sizeof (page_seven); i += 2) {
outb (page_seven[i], dev->fx_dsp_msb);
outb (page_seven[i+1], dev->fx_dsp_lsb);
if (!wavefront_fx_idle (dev)) return (-1);
}
/* Now setup the MOD area. We do this algorithmically in order to
save a little data space. It could be done in the same fashion
as the "pages".
*/
for (i = 0x00; i <= 0x0f; i++) {
outb (0x01, dev->fx_mod_addr);
outb (i, dev->fx_mod_data);
if (!wavefront_fx_idle (dev)) return (-1);
outb (0x02, dev->fx_mod_addr);
outb (0x00, dev->fx_mod_data);
if (!wavefront_fx_idle (dev)) return (-1);
}
for (i = 0xb0; i <= 0xbf; i++) {
outb (i, dev->fx_mod_addr);
outb (0x20, dev->fx_mod_data);
if (!wavefront_fx_idle (dev)) return (-1);
}
for (i = 0xf0; i <= 0xff; i++) {
outb (i, dev->fx_mod_addr);
outb (0x20, dev->fx_mod_data);
if (!wavefront_fx_idle (dev)) return (-1);
}
for (i = 0x10; i <= 0x1d; i++) {
outb (i, dev->fx_mod_addr);
outb (0xff, dev->fx_mod_data);
if (!wavefront_fx_idle (dev)) return (-1);
}
outb (0x1e, dev->fx_mod_addr);
outb (0x40, dev->fx_mod_data);
if (!wavefront_fx_idle (dev)) return (-1);
for (i = 0x1f; i <= 0x2d; i++) {
outb (i, dev->fx_mod_addr);
outb (0xff, dev->fx_mod_data);
if (!wavefront_fx_idle (dev)) return (-1);
}
outb (0x2e, dev->fx_mod_addr);
outb (0x00, dev->fx_mod_data);
if (!wavefront_fx_idle (dev)) return (-1);
for (i = 0x2f; i <= 0x3e; i++) {
outb (i, dev->fx_mod_addr);
outb (0x00, dev->fx_mod_data);
if (!wavefront_fx_idle (dev)) return (-1);
}
outb (0x3f, dev->fx_mod_addr);
outb (0x20, dev->fx_mod_data);
if (!wavefront_fx_idle (dev)) return (-1);
for (i = 0x40; i <= 0x4d; i++) {
outb (i, dev->fx_mod_addr);
outb (0x00, dev->fx_mod_data);
if (!wavefront_fx_idle (dev)) return (-1);
}
outb (0x4e, dev->fx_mod_addr);
outb (0x0e, dev->fx_mod_data);
if (!wavefront_fx_idle (dev)) return (-1);
outb (0x4f, dev->fx_mod_addr);
outb (0x0e, dev->fx_mod_data);
if (!wavefront_fx_idle (dev)) return (-1);
for (i = 0x50; i <= 0x6b; i++) {
outb (i, dev->fx_mod_addr);
outb (0x00, dev->fx_mod_data);
if (!wavefront_fx_idle (dev)) return (-1);
}
outb (0x6c, dev->fx_mod_addr);
outb (0x40, dev->fx_mod_data);
if (!wavefront_fx_idle (dev)) return (-1);
outb (0x6d, dev->fx_mod_addr);
outb (0x00, dev->fx_mod_data);
if (!wavefront_fx_idle (dev)) return (-1);
outb (0x6e, dev->fx_mod_addr);
outb (0x40, dev->fx_mod_data);
if (!wavefront_fx_idle (dev)) return (-1);
outb (0x6f, dev->fx_mod_addr);
outb (0x40, dev->fx_mod_data);
if (!wavefront_fx_idle (dev)) return (-1);
for (i = 0x70; i <= 0x7f; i++) {
outb (i, dev->fx_mod_addr);
outb (0xc0, dev->fx_mod_data);
if (!wavefront_fx_idle (dev)) return (-1);
}
for (i = 0x80; i <= 0xaf; i++) {
outb (i, dev->fx_mod_addr);
outb (0x00, dev->fx_mod_data);
if (!wavefront_fx_idle (dev)) return (-1);
}
for (i = 0xc0; i <= 0xdd; i++) {
outb (i, dev->fx_mod_addr);
outb (0x00, dev->fx_mod_data);
if (!wavefront_fx_idle (dev)) return (-1);
}
outb (0xde, dev->fx_mod_addr);
outb (0x10, dev->fx_mod_data);
if (!wavefront_fx_idle (dev)) return (-1);
outb (0xdf, dev->fx_mod_addr);
outb (0x10, dev->fx_mod_data);
if (!wavefront_fx_idle (dev)) return (-1);
for (i = 0xe0; i <= 0xef; i++) {
outb (i, dev->fx_mod_addr);
outb (0x00, dev->fx_mod_data);
if (!wavefront_fx_idle (dev)) return (-1);
}
for (i = 0x00; i <= 0x0f; i++) {
outb (0x01, dev->fx_mod_addr);
outb (i, dev->fx_mod_data);
outb (0x02, dev->fx_mod_addr);
outb (0x01, dev->fx_mod_data);
if (!wavefront_fx_idle (dev)) return (-1);
}
outb (0x02, dev->fx_op); /* mute on */
/* Now set the coefficients and so forth for the programs above */
for (i = 0; i < sizeof (coefficients); i += 4) {
outb (coefficients[i], dev->fx_dsp_page);
outb (coefficients[i+1], dev->fx_dsp_addr);
outb (coefficients[i+2], dev->fx_dsp_msb);
outb (coefficients[i+3], dev->fx_dsp_lsb);
if (!wavefront_fx_idle (dev)) return (-1);
}
/* Some settings (?) that are too small to bundle into loops */
if (!wavefront_fx_idle (dev)) return (-1);
outb (0x1e, dev->fx_mod_addr);
outb (0x14, dev->fx_mod_data);
if (!wavefront_fx_idle (dev)) return (-1);
outb (0xde, dev->fx_mod_addr);
outb (0x20, dev->fx_mod_data);
if (!wavefront_fx_idle (dev)) return (-1);
outb (0xdf, dev->fx_mod_addr);
outb (0x20, dev->fx_mod_data);
/* some more coefficients */
if (!wavefront_fx_idle (dev)) return (-1);
outb (0x06, dev->fx_dsp_page);
outb (0x78, dev->fx_dsp_addr);
outb (0x00, dev->fx_dsp_msb);
outb (0x40, dev->fx_dsp_lsb);
if (!wavefront_fx_idle (dev)) return (-1);
outb (0x07, dev->fx_dsp_page);
outb (0x03, dev->fx_dsp_addr);
outb (0x0f, dev->fx_dsp_msb);
outb (0xff, dev->fx_dsp_lsb);
if (!wavefront_fx_idle (dev)) return (-1);
outb (0x07, dev->fx_dsp_page);
outb (0x0b, dev->fx_dsp_addr);
outb (0x0f, dev->fx_dsp_msb);
outb (0xff, dev->fx_dsp_lsb);
if (!wavefront_fx_idle (dev)) return (-1);
outb (0x07, dev->fx_dsp_page);
outb (0x02, dev->fx_dsp_addr);
outb (0x00, dev->fx_dsp_msb);
outb (0x00, dev->fx_dsp_lsb);
if (!wavefront_fx_idle (dev)) return (-1);
outb (0x07, dev->fx_dsp_page);
outb (0x0a, dev->fx_dsp_addr);
outb (0x00, dev->fx_dsp_msb);
outb (0x00, dev->fx_dsp_lsb);
if (!wavefront_fx_idle (dev)) return (-1);
outb (0x07, dev->fx_dsp_page);
outb (0x46, dev->fx_dsp_addr);
outb (0x00, dev->fx_dsp_msb);
outb (0x00, dev->fx_dsp_lsb);
if (!wavefront_fx_idle (dev)) return (-1);
outb (0x07, dev->fx_dsp_page);
outb (0x49, dev->fx_dsp_addr);
outb (0x00, dev->fx_dsp_msb);
outb (0x00, dev->fx_dsp_lsb);
/* Now, for some strange reason, lets reload every page
and all the coefficients over again. I have *NO* idea
why this is done. I do know that no sound is produced
is this phase is omitted.
*/
outb (FX_AUTO_INCR|FX_LSB_TRANSFER, dev->fx_lcr);
outb (0x00, dev->fx_dsp_page);
outb (0x10, dev->fx_dsp_addr);
for (i = 0; i < sizeof (page_zero_v2); i += 2) {
outb (page_zero_v2[i], dev->fx_dsp_msb);
outb (page_zero_v2[i+1], dev->fx_dsp_lsb);
if (!wavefront_fx_idle (dev)) return (-1);
}
outb (FX_AUTO_INCR|FX_LSB_TRANSFER, dev->fx_lcr);
outb (0x01, dev->fx_dsp_page);
outb (0x10, dev->fx_dsp_addr);
for (i = 0; i < sizeof (page_one_v2); i += 2) {
outb (page_one_v2[i], dev->fx_dsp_msb);
outb (page_one_v2[i+1], dev->fx_dsp_lsb);
if (!wavefront_fx_idle (dev)) return (-1);
}
if (!wavefront_fx_idle (dev)) return (-1);
if (!wavefront_fx_idle (dev)) return (-1);
outb (FX_AUTO_INCR|FX_LSB_TRANSFER, dev->fx_lcr);
outb (0x02, dev->fx_dsp_page);
outb (0x10, dev->fx_dsp_addr);
for (i = 0; i < sizeof (page_two_v2); i++) {
outb (page_two_v2[i], dev->fx_dsp_lsb);
if (!wavefront_fx_idle (dev)) return (-1);
}
outb (FX_AUTO_INCR|FX_LSB_TRANSFER, dev->fx_lcr);
outb (0x03, dev->fx_dsp_page);
outb (0x10, dev->fx_dsp_addr);
for (i = 0; i < sizeof (page_three_v2); i++) {
outb (page_three_v2[i], dev->fx_dsp_lsb);
if (!wavefront_fx_idle (dev)) return (-1);
}
outb (FX_AUTO_INCR|FX_LSB_TRANSFER, dev->fx_lcr);
outb (0x04, dev->fx_dsp_page);
outb (0x10, dev->fx_dsp_addr);
for (i = 0; i < sizeof (page_four_v2); i++) {
outb (page_four_v2[i], dev->fx_dsp_lsb);
if (!wavefront_fx_idle (dev)) return (-1);
}
outb (FX_LSB_TRANSFER, dev->fx_lcr);
outb (0x06, dev->fx_dsp_page);
/* Page six v.2 is algorithmic */
for (i = 0x10; i <= 0x3e; i += 2) {
outb (i, dev->fx_dsp_addr);
outb (0x00, dev->fx_dsp_msb);
outb (0x00, dev->fx_dsp_lsb);
if (!wavefront_fx_idle (dev)) return (-1);
}
outb (FX_AUTO_INCR|FX_LSB_TRANSFER, dev->fx_lcr);
outb (0x07, dev->fx_dsp_page);
outb (0x10, dev->fx_dsp_addr);
for (i = 0; i < sizeof (page_seven_v2); i += 2) {
outb (page_seven_v2[i], dev->fx_dsp_msb);
outb (page_seven_v2[i+1], dev->fx_dsp_lsb);
if (!wavefront_fx_idle (dev)) return (-1);
}
for (i = 0x00; i < sizeof(mod_v2); i += 2) {
outb (mod_v2[i], dev->fx_mod_addr);
outb (mod_v2[i+1], dev->fx_mod_data);
if (!wavefront_fx_idle (dev)) return (-1);
}
for (i = 0; i < sizeof (coefficients2); i += 4) {
outb (coefficients2[i], dev->fx_dsp_page);
outb (coefficients2[i+1], dev->fx_dsp_addr);
outb (coefficients2[i+2], dev->fx_dsp_msb);
outb (coefficients2[i+3], dev->fx_dsp_lsb);
if (!wavefront_fx_idle (dev)) return (-1);
}
for (i = 0; i < sizeof (coefficients3); i += 2) {
int x;
outb (0x07, dev->fx_dsp_page);
x = (i % 4) ? 0x4e : 0x4c;
outb (x, dev->fx_dsp_addr);
outb (coefficients3[i], dev->fx_dsp_msb);
outb (coefficients3[i+1], dev->fx_dsp_lsb);
}
outb (0x00, dev->fx_op); /* mute off */
if (!wavefront_fx_idle (dev)) return (-1);
return (0); return (0);
} }
This source diff could not be displayed because it is too large. You can view the blob instead.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment