162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */ 262306a36Sopenharmony_ci#ifndef __SOUND_EMU8000_H 362306a36Sopenharmony_ci#define __SOUND_EMU8000_H 462306a36Sopenharmony_ci/* 562306a36Sopenharmony_ci * Defines for the emu8000 (AWE32/64) 662306a36Sopenharmony_ci * 762306a36Sopenharmony_ci * Copyright (C) 1999 Steve Ratcliffe 862306a36Sopenharmony_ci * Copyright (C) 1999-2000 Takashi Iwai <tiwai@suse.de> 962306a36Sopenharmony_ci */ 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_ci#include <sound/emux_synth.h> 1262306a36Sopenharmony_ci#include <sound/seq_kernel.h> 1362306a36Sopenharmony_ci 1462306a36Sopenharmony_ci/* 1562306a36Sopenharmony_ci * Hardware parameters. 1662306a36Sopenharmony_ci */ 1762306a36Sopenharmony_ci#define EMU8000_MAX_DRAM (28 * 1024 * 1024) /* Max on-board mem is 28Mb ???*/ 1862306a36Sopenharmony_ci#define EMU8000_DRAM_OFFSET 0x200000 /* Beginning of on board ram */ 1962306a36Sopenharmony_ci#define EMU8000_CHANNELS 32 /* Number of hardware channels */ 2062306a36Sopenharmony_ci#define EMU8000_DRAM_VOICES 30 /* number of normal voices */ 2162306a36Sopenharmony_ci 2262306a36Sopenharmony_ci/* Flags to set a dma channel to read or write */ 2362306a36Sopenharmony_ci#define EMU8000_RAM_READ 0 2462306a36Sopenharmony_ci#define EMU8000_RAM_WRITE 1 2562306a36Sopenharmony_ci#define EMU8000_RAM_CLOSE 2 2662306a36Sopenharmony_ci#define EMU8000_RAM_MODE_MASK 0x03 2762306a36Sopenharmony_ci#define EMU8000_RAM_RIGHT 0x10 /* use 'right' DMA channel */ 2862306a36Sopenharmony_ci 2962306a36Sopenharmony_cienum { 3062306a36Sopenharmony_ci EMU8000_CONTROL_BASS = 0, 3162306a36Sopenharmony_ci EMU8000_CONTROL_TREBLE, 3262306a36Sopenharmony_ci EMU8000_CONTROL_CHORUS_MODE, 3362306a36Sopenharmony_ci EMU8000_CONTROL_REVERB_MODE, 3462306a36Sopenharmony_ci EMU8000_CONTROL_FM_CHORUS_DEPTH, 3562306a36Sopenharmony_ci EMU8000_CONTROL_FM_REVERB_DEPTH, 3662306a36Sopenharmony_ci EMU8000_NUM_CONTROLS, 3762306a36Sopenharmony_ci}; 3862306a36Sopenharmony_ci 3962306a36Sopenharmony_ci/* 4062306a36Sopenharmony_ci * Structure to hold all state information for the emu8000 driver. 4162306a36Sopenharmony_ci * 4262306a36Sopenharmony_ci * Note 1: The chip supports 32 channels in hardware this is max_channels 4362306a36Sopenharmony_ci * some of the channels may be used for other things so max_channels is 4462306a36Sopenharmony_ci * the number in use for wave voices. 4562306a36Sopenharmony_ci */ 4662306a36Sopenharmony_cistruct snd_emu8000 { 4762306a36Sopenharmony_ci 4862306a36Sopenharmony_ci struct snd_emux *emu; 4962306a36Sopenharmony_ci 5062306a36Sopenharmony_ci int index; /* sequencer client index */ 5162306a36Sopenharmony_ci int seq_ports; /* number of sequencer ports */ 5262306a36Sopenharmony_ci int fm_chorus_depth; /* FM OPL3 chorus depth */ 5362306a36Sopenharmony_ci int fm_reverb_depth; /* FM OPL3 reverb depth */ 5462306a36Sopenharmony_ci 5562306a36Sopenharmony_ci int mem_size; /* memory size */ 5662306a36Sopenharmony_ci unsigned long port1; /* Port usually base+0 */ 5762306a36Sopenharmony_ci unsigned long port2; /* Port usually at base+0x400 */ 5862306a36Sopenharmony_ci unsigned long port3; /* Port usually at base+0x800 */ 5962306a36Sopenharmony_ci unsigned short last_reg;/* Last register command */ 6062306a36Sopenharmony_ci spinlock_t reg_lock; 6162306a36Sopenharmony_ci 6262306a36Sopenharmony_ci int dram_checked; 6362306a36Sopenharmony_ci 6462306a36Sopenharmony_ci struct snd_card *card; /* The card that this belongs to */ 6562306a36Sopenharmony_ci 6662306a36Sopenharmony_ci int chorus_mode; 6762306a36Sopenharmony_ci int reverb_mode; 6862306a36Sopenharmony_ci int bass_level; 6962306a36Sopenharmony_ci int treble_level; 7062306a36Sopenharmony_ci 7162306a36Sopenharmony_ci struct snd_util_memhdr *memhdr; 7262306a36Sopenharmony_ci 7362306a36Sopenharmony_ci spinlock_t control_lock; 7462306a36Sopenharmony_ci struct snd_kcontrol *controls[EMU8000_NUM_CONTROLS]; 7562306a36Sopenharmony_ci 7662306a36Sopenharmony_ci struct snd_pcm *pcm; /* pcm on emu8000 wavetable */ 7762306a36Sopenharmony_ci 7862306a36Sopenharmony_ci}; 7962306a36Sopenharmony_ci 8062306a36Sopenharmony_ci/* sequencer device id */ 8162306a36Sopenharmony_ci#define SNDRV_SEQ_DEV_ID_EMU8000 "emu8000-synth" 8262306a36Sopenharmony_ci 8362306a36Sopenharmony_ci 8462306a36Sopenharmony_ci/* exported functions */ 8562306a36Sopenharmony_ciint snd_emu8000_new(struct snd_card *card, int device, long port, int seq_ports, 8662306a36Sopenharmony_ci struct snd_seq_device **ret); 8762306a36Sopenharmony_civoid snd_emu8000_poke(struct snd_emu8000 *emu, unsigned int port, unsigned int reg, 8862306a36Sopenharmony_ci unsigned int val); 8962306a36Sopenharmony_ciunsigned short snd_emu8000_peek(struct snd_emu8000 *emu, unsigned int port, 9062306a36Sopenharmony_ci unsigned int reg); 9162306a36Sopenharmony_civoid snd_emu8000_poke_dw(struct snd_emu8000 *emu, unsigned int port, unsigned int reg, 9262306a36Sopenharmony_ci unsigned int val); 9362306a36Sopenharmony_ciunsigned int snd_emu8000_peek_dw(struct snd_emu8000 *emu, unsigned int port, 9462306a36Sopenharmony_ci unsigned int reg); 9562306a36Sopenharmony_civoid snd_emu8000_dma_chan(struct snd_emu8000 *emu, int ch, int mode); 9662306a36Sopenharmony_ci 9762306a36Sopenharmony_civoid snd_emu8000_init_fm(struct snd_emu8000 *emu); 9862306a36Sopenharmony_ci 9962306a36Sopenharmony_civoid snd_emu8000_update_chorus_mode(struct snd_emu8000 *emu); 10062306a36Sopenharmony_civoid snd_emu8000_update_reverb_mode(struct snd_emu8000 *emu); 10162306a36Sopenharmony_civoid snd_emu8000_update_equalizer(struct snd_emu8000 *emu); 10262306a36Sopenharmony_ciint snd_emu8000_load_chorus_fx(struct snd_emu8000 *emu, int mode, const void __user *buf, long len); 10362306a36Sopenharmony_ciint snd_emu8000_load_reverb_fx(struct snd_emu8000 *emu, int mode, const void __user *buf, long len); 10462306a36Sopenharmony_ci 10562306a36Sopenharmony_ci#endif /* __SOUND_EMU8000_H */ 106