1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-or-later */ 2*4882a593Smuzhiyun #ifndef __SOUND_EMU8000_H 3*4882a593Smuzhiyun #define __SOUND_EMU8000_H 4*4882a593Smuzhiyun /* 5*4882a593Smuzhiyun * Defines for the emu8000 (AWE32/64) 6*4882a593Smuzhiyun * 7*4882a593Smuzhiyun * Copyright (C) 1999 Steve Ratcliffe 8*4882a593Smuzhiyun * Copyright (C) 1999-2000 Takashi Iwai <tiwai@suse.de> 9*4882a593Smuzhiyun */ 10*4882a593Smuzhiyun 11*4882a593Smuzhiyun #include <sound/emux_synth.h> 12*4882a593Smuzhiyun #include <sound/seq_kernel.h> 13*4882a593Smuzhiyun 14*4882a593Smuzhiyun /* 15*4882a593Smuzhiyun * Hardware parameters. 16*4882a593Smuzhiyun */ 17*4882a593Smuzhiyun #define EMU8000_MAX_DRAM (28 * 1024 * 1024) /* Max on-board mem is 28Mb ???*/ 18*4882a593Smuzhiyun #define EMU8000_DRAM_OFFSET 0x200000 /* Beginning of on board ram */ 19*4882a593Smuzhiyun #define EMU8000_CHANNELS 32 /* Number of hardware channels */ 20*4882a593Smuzhiyun #define EMU8000_DRAM_VOICES 30 /* number of normal voices */ 21*4882a593Smuzhiyun 22*4882a593Smuzhiyun /* Flags to set a dma channel to read or write */ 23*4882a593Smuzhiyun #define EMU8000_RAM_READ 0 24*4882a593Smuzhiyun #define EMU8000_RAM_WRITE 1 25*4882a593Smuzhiyun #define EMU8000_RAM_CLOSE 2 26*4882a593Smuzhiyun #define EMU8000_RAM_MODE_MASK 0x03 27*4882a593Smuzhiyun #define EMU8000_RAM_RIGHT 0x10 /* use 'right' DMA channel */ 28*4882a593Smuzhiyun 29*4882a593Smuzhiyun enum { 30*4882a593Smuzhiyun EMU8000_CONTROL_BASS = 0, 31*4882a593Smuzhiyun EMU8000_CONTROL_TREBLE, 32*4882a593Smuzhiyun EMU8000_CONTROL_CHORUS_MODE, 33*4882a593Smuzhiyun EMU8000_CONTROL_REVERB_MODE, 34*4882a593Smuzhiyun EMU8000_CONTROL_FM_CHORUS_DEPTH, 35*4882a593Smuzhiyun EMU8000_CONTROL_FM_REVERB_DEPTH, 36*4882a593Smuzhiyun EMU8000_NUM_CONTROLS, 37*4882a593Smuzhiyun }; 38*4882a593Smuzhiyun 39*4882a593Smuzhiyun /* 40*4882a593Smuzhiyun * Structure to hold all state information for the emu8000 driver. 41*4882a593Smuzhiyun * 42*4882a593Smuzhiyun * Note 1: The chip supports 32 channels in hardware this is max_channels 43*4882a593Smuzhiyun * some of the channels may be used for other things so max_channels is 44*4882a593Smuzhiyun * the number in use for wave voices. 45*4882a593Smuzhiyun */ 46*4882a593Smuzhiyun struct snd_emu8000 { 47*4882a593Smuzhiyun 48*4882a593Smuzhiyun struct snd_emux *emu; 49*4882a593Smuzhiyun 50*4882a593Smuzhiyun int index; /* sequencer client index */ 51*4882a593Smuzhiyun int seq_ports; /* number of sequencer ports */ 52*4882a593Smuzhiyun int fm_chorus_depth; /* FM OPL3 chorus depth */ 53*4882a593Smuzhiyun int fm_reverb_depth; /* FM OPL3 reverb depth */ 54*4882a593Smuzhiyun 55*4882a593Smuzhiyun int mem_size; /* memory size */ 56*4882a593Smuzhiyun unsigned long port1; /* Port usually base+0 */ 57*4882a593Smuzhiyun unsigned long port2; /* Port usually at base+0x400 */ 58*4882a593Smuzhiyun unsigned long port3; /* Port usually at base+0x800 */ 59*4882a593Smuzhiyun struct resource *res_port1; 60*4882a593Smuzhiyun struct resource *res_port2; 61*4882a593Smuzhiyun struct resource *res_port3; 62*4882a593Smuzhiyun unsigned short last_reg;/* Last register command */ 63*4882a593Smuzhiyun spinlock_t reg_lock; 64*4882a593Smuzhiyun 65*4882a593Smuzhiyun int dram_checked; 66*4882a593Smuzhiyun 67*4882a593Smuzhiyun struct snd_card *card; /* The card that this belongs to */ 68*4882a593Smuzhiyun 69*4882a593Smuzhiyun int chorus_mode; 70*4882a593Smuzhiyun int reverb_mode; 71*4882a593Smuzhiyun int bass_level; 72*4882a593Smuzhiyun int treble_level; 73*4882a593Smuzhiyun 74*4882a593Smuzhiyun struct snd_util_memhdr *memhdr; 75*4882a593Smuzhiyun 76*4882a593Smuzhiyun spinlock_t control_lock; 77*4882a593Smuzhiyun struct snd_kcontrol *controls[EMU8000_NUM_CONTROLS]; 78*4882a593Smuzhiyun 79*4882a593Smuzhiyun struct snd_pcm *pcm; /* pcm on emu8000 wavetable */ 80*4882a593Smuzhiyun 81*4882a593Smuzhiyun }; 82*4882a593Smuzhiyun 83*4882a593Smuzhiyun /* sequencer device id */ 84*4882a593Smuzhiyun #define SNDRV_SEQ_DEV_ID_EMU8000 "emu8000-synth" 85*4882a593Smuzhiyun 86*4882a593Smuzhiyun 87*4882a593Smuzhiyun /* exported functions */ 88*4882a593Smuzhiyun int snd_emu8000_new(struct snd_card *card, int device, long port, int seq_ports, 89*4882a593Smuzhiyun struct snd_seq_device **ret); 90*4882a593Smuzhiyun void snd_emu8000_poke(struct snd_emu8000 *emu, unsigned int port, unsigned int reg, 91*4882a593Smuzhiyun unsigned int val); 92*4882a593Smuzhiyun unsigned short snd_emu8000_peek(struct snd_emu8000 *emu, unsigned int port, 93*4882a593Smuzhiyun unsigned int reg); 94*4882a593Smuzhiyun void snd_emu8000_poke_dw(struct snd_emu8000 *emu, unsigned int port, unsigned int reg, 95*4882a593Smuzhiyun unsigned int val); 96*4882a593Smuzhiyun unsigned int snd_emu8000_peek_dw(struct snd_emu8000 *emu, unsigned int port, 97*4882a593Smuzhiyun unsigned int reg); 98*4882a593Smuzhiyun void snd_emu8000_dma_chan(struct snd_emu8000 *emu, int ch, int mode); 99*4882a593Smuzhiyun 100*4882a593Smuzhiyun void snd_emu8000_init_fm(struct snd_emu8000 *emu); 101*4882a593Smuzhiyun 102*4882a593Smuzhiyun void snd_emu8000_update_chorus_mode(struct snd_emu8000 *emu); 103*4882a593Smuzhiyun void snd_emu8000_update_reverb_mode(struct snd_emu8000 *emu); 104*4882a593Smuzhiyun void snd_emu8000_update_equalizer(struct snd_emu8000 *emu); 105*4882a593Smuzhiyun int snd_emu8000_load_chorus_fx(struct snd_emu8000 *emu, int mode, const void __user *buf, long len); 106*4882a593Smuzhiyun int snd_emu8000_load_reverb_fx(struct snd_emu8000 *emu, int mode, const void __user *buf, long len); 107*4882a593Smuzhiyun 108*4882a593Smuzhiyun #endif /* __SOUND_EMU8000_H */ 109