162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */ 262306a36Sopenharmony_ci#ifndef __SOUND_TRIDENT_H 362306a36Sopenharmony_ci#define __SOUND_TRIDENT_H 462306a36Sopenharmony_ci 562306a36Sopenharmony_ci/* 662306a36Sopenharmony_ci * audio@tridentmicro.com 762306a36Sopenharmony_ci * Fri Feb 19 15:55:28 MST 1999 862306a36Sopenharmony_ci * Definitions for Trident 4DWave DX/NX chips 962306a36Sopenharmony_ci */ 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_ci#include <sound/pcm.h> 1262306a36Sopenharmony_ci#include <sound/mpu401.h> 1362306a36Sopenharmony_ci#include <sound/ac97_codec.h> 1462306a36Sopenharmony_ci#include <sound/util_mem.h> 1562306a36Sopenharmony_ci 1662306a36Sopenharmony_ci#define TRIDENT_DEVICE_ID_DX ((PCI_VENDOR_ID_TRIDENT<<16)|PCI_DEVICE_ID_TRIDENT_4DWAVE_DX) 1762306a36Sopenharmony_ci#define TRIDENT_DEVICE_ID_NX ((PCI_VENDOR_ID_TRIDENT<<16)|PCI_DEVICE_ID_TRIDENT_4DWAVE_NX) 1862306a36Sopenharmony_ci#define TRIDENT_DEVICE_ID_SI7018 ((PCI_VENDOR_ID_SI<<16)|PCI_DEVICE_ID_SI_7018) 1962306a36Sopenharmony_ci 2062306a36Sopenharmony_ci#define SNDRV_TRIDENT_VOICE_TYPE_PCM 0 2162306a36Sopenharmony_ci#define SNDRV_TRIDENT_VOICE_TYPE_SYNTH 1 2262306a36Sopenharmony_ci#define SNDRV_TRIDENT_VOICE_TYPE_MIDI 2 2362306a36Sopenharmony_ci 2462306a36Sopenharmony_ci#define SNDRV_TRIDENT_VFLG_RUNNING (1<<0) 2562306a36Sopenharmony_ci 2662306a36Sopenharmony_ci/* TLB code constants */ 2762306a36Sopenharmony_ci#define SNDRV_TRIDENT_PAGE_SIZE 4096 2862306a36Sopenharmony_ci#define SNDRV_TRIDENT_PAGE_SHIFT 12 2962306a36Sopenharmony_ci#define SNDRV_TRIDENT_PAGE_MASK ((1<<SNDRV_TRIDENT_PAGE_SHIFT)-1) 3062306a36Sopenharmony_ci#define SNDRV_TRIDENT_MAX_PAGES 4096 3162306a36Sopenharmony_ci 3262306a36Sopenharmony_ci/* 3362306a36Sopenharmony_ci * Direct registers 3462306a36Sopenharmony_ci */ 3562306a36Sopenharmony_ci 3662306a36Sopenharmony_ci#define TRID_REG(trident, x) ((trident)->port + (x)) 3762306a36Sopenharmony_ci 3862306a36Sopenharmony_ci#define ID_4DWAVE_DX 0x2000 3962306a36Sopenharmony_ci#define ID_4DWAVE_NX 0x2001 4062306a36Sopenharmony_ci 4162306a36Sopenharmony_ci/* Bank definitions */ 4262306a36Sopenharmony_ci 4362306a36Sopenharmony_ci#define T4D_BANK_A 0 4462306a36Sopenharmony_ci#define T4D_BANK_B 1 4562306a36Sopenharmony_ci#define T4D_NUM_BANKS 2 4662306a36Sopenharmony_ci 4762306a36Sopenharmony_ci/* Register definitions */ 4862306a36Sopenharmony_ci 4962306a36Sopenharmony_ci/* Global registers */ 5062306a36Sopenharmony_ci 5162306a36Sopenharmony_cienum global_control_bits { 5262306a36Sopenharmony_ci CHANNEL_IDX = 0x0000003f, 5362306a36Sopenharmony_ci OVERRUN_IE = 0x00000400, /* interrupt enable: capture overrun */ 5462306a36Sopenharmony_ci UNDERRUN_IE = 0x00000800, /* interrupt enable: playback underrun */ 5562306a36Sopenharmony_ci ENDLP_IE = 0x00001000, /* interrupt enable: end of buffer */ 5662306a36Sopenharmony_ci MIDLP_IE = 0x00002000, /* interrupt enable: middle buffer */ 5762306a36Sopenharmony_ci ETOG_IE = 0x00004000, /* interrupt enable: envelope toggling */ 5862306a36Sopenharmony_ci EDROP_IE = 0x00008000, /* interrupt enable: envelope drop */ 5962306a36Sopenharmony_ci BANK_B_EN = 0x00010000, /* SiS: enable bank B (64 channels) */ 6062306a36Sopenharmony_ci PCMIN_B_MIX = 0x00020000, /* SiS: PCM IN B mixing enable */ 6162306a36Sopenharmony_ci I2S_OUT_ASSIGN = 0x00040000, /* SiS: I2S Out contains surround PCM */ 6262306a36Sopenharmony_ci SPDIF_OUT_ASSIGN= 0x00080000, /* SiS: 0=S/PDIF L/R | 1=PCM Out FIFO */ 6362306a36Sopenharmony_ci MAIN_OUT_ASSIGN = 0x00100000, /* SiS: 0=PCM Out FIFO | 1=MMC Out buffer */ 6462306a36Sopenharmony_ci}; 6562306a36Sopenharmony_ci 6662306a36Sopenharmony_cienum miscint_bits { 6762306a36Sopenharmony_ci PB_UNDERRUN_IRQ = 0x00000001, REC_OVERRUN_IRQ = 0x00000002, 6862306a36Sopenharmony_ci SB_IRQ = 0x00000004, MPU401_IRQ = 0x00000008, 6962306a36Sopenharmony_ci OPL3_IRQ = 0x00000010, ADDRESS_IRQ = 0x00000020, 7062306a36Sopenharmony_ci ENVELOPE_IRQ = 0x00000040, PB_UNDERRUN = 0x00000100, 7162306a36Sopenharmony_ci REC_OVERRUN = 0x00000200, MIXER_UNDERFLOW = 0x00000400, 7262306a36Sopenharmony_ci MIXER_OVERFLOW = 0x00000800, NX_SB_IRQ_DISABLE = 0x00001000, 7362306a36Sopenharmony_ci ST_TARGET_REACHED = 0x00008000, 7462306a36Sopenharmony_ci PB_24K_MODE = 0x00010000, ST_IRQ_EN = 0x00800000, 7562306a36Sopenharmony_ci ACGPIO_IRQ = 0x01000000 7662306a36Sopenharmony_ci}; 7762306a36Sopenharmony_ci 7862306a36Sopenharmony_ci/* T2 legacy dma control registers. */ 7962306a36Sopenharmony_ci#define LEGACY_DMAR0 0x00 // ADR0 8062306a36Sopenharmony_ci#define LEGACY_DMAR4 0x04 // CNT0 8162306a36Sopenharmony_ci#define LEGACY_DMAR6 0x06 // CNT0 - High bits 8262306a36Sopenharmony_ci#define LEGACY_DMAR11 0x0b // MOD 8362306a36Sopenharmony_ci#define LEGACY_DMAR15 0x0f // MMR 8462306a36Sopenharmony_ci 8562306a36Sopenharmony_ci#define T4D_START_A 0x80 8662306a36Sopenharmony_ci#define T4D_STOP_A 0x84 8762306a36Sopenharmony_ci#define T4D_DLY_A 0x88 8862306a36Sopenharmony_ci#define T4D_SIGN_CSO_A 0x8c 8962306a36Sopenharmony_ci#define T4D_CSPF_A 0x90 9062306a36Sopenharmony_ci#define T4D_CSPF_B 0xbc 9162306a36Sopenharmony_ci#define T4D_CEBC_A 0x94 9262306a36Sopenharmony_ci#define T4D_AINT_A 0x98 9362306a36Sopenharmony_ci#define T4D_AINTEN_A 0x9c 9462306a36Sopenharmony_ci#define T4D_LFO_GC_CIR 0xa0 9562306a36Sopenharmony_ci#define T4D_MUSICVOL_WAVEVOL 0xa8 9662306a36Sopenharmony_ci#define T4D_SBDELTA_DELTA_R 0xac 9762306a36Sopenharmony_ci#define T4D_MISCINT 0xb0 9862306a36Sopenharmony_ci#define T4D_START_B 0xb4 9962306a36Sopenharmony_ci#define T4D_STOP_B 0xb8 10062306a36Sopenharmony_ci#define T4D_SBBL_SBCL 0xc0 10162306a36Sopenharmony_ci#define T4D_SBCTRL_SBE2R_SBDD 0xc4 10262306a36Sopenharmony_ci#define T4D_STIMER 0xc8 10362306a36Sopenharmony_ci#define T4D_AINT_B 0xd8 10462306a36Sopenharmony_ci#define T4D_AINTEN_B 0xdc 10562306a36Sopenharmony_ci#define T4D_RCI 0x70 10662306a36Sopenharmony_ci 10762306a36Sopenharmony_ci/* MPU-401 UART */ 10862306a36Sopenharmony_ci#define T4D_MPU401_BASE 0x20 10962306a36Sopenharmony_ci#define T4D_MPUR0 0x20 11062306a36Sopenharmony_ci#define T4D_MPUR1 0x21 11162306a36Sopenharmony_ci#define T4D_MPUR2 0x22 11262306a36Sopenharmony_ci#define T4D_MPUR3 0x23 11362306a36Sopenharmony_ci 11462306a36Sopenharmony_ci/* S/PDIF Registers */ 11562306a36Sopenharmony_ci#define NX_SPCTRL_SPCSO 0x24 11662306a36Sopenharmony_ci#define NX_SPLBA 0x28 11762306a36Sopenharmony_ci#define NX_SPESO 0x2c 11862306a36Sopenharmony_ci#define NX_SPCSTATUS 0x64 11962306a36Sopenharmony_ci 12062306a36Sopenharmony_ci/* Joystick */ 12162306a36Sopenharmony_ci#define GAMEPORT_GCR 0x30 12262306a36Sopenharmony_ci#define GAMEPORT_MODE_ADC 0x80 12362306a36Sopenharmony_ci#define GAMEPORT_LEGACY 0x31 12462306a36Sopenharmony_ci#define GAMEPORT_AXES 0x34 12562306a36Sopenharmony_ci 12662306a36Sopenharmony_ci/* NX Specific Registers */ 12762306a36Sopenharmony_ci#define NX_TLBC 0x6c 12862306a36Sopenharmony_ci 12962306a36Sopenharmony_ci/* Channel Registers */ 13062306a36Sopenharmony_ci 13162306a36Sopenharmony_ci#define CH_START 0xe0 13262306a36Sopenharmony_ci 13362306a36Sopenharmony_ci#define CH_DX_CSO_ALPHA_FMS 0xe0 13462306a36Sopenharmony_ci#define CH_DX_ESO_DELTA 0xe8 13562306a36Sopenharmony_ci#define CH_DX_FMC_RVOL_CVOL 0xec 13662306a36Sopenharmony_ci 13762306a36Sopenharmony_ci#define CH_NX_DELTA_CSO 0xe0 13862306a36Sopenharmony_ci#define CH_NX_DELTA_ESO 0xe8 13962306a36Sopenharmony_ci#define CH_NX_ALPHA_FMS_FMC_RVOL_CVOL 0xec 14062306a36Sopenharmony_ci 14162306a36Sopenharmony_ci#define CH_LBA 0xe4 14262306a36Sopenharmony_ci#define CH_GVSEL_PAN_VOL_CTRL_EC 0xf0 14362306a36Sopenharmony_ci#define CH_EBUF1 0xf4 14462306a36Sopenharmony_ci#define CH_EBUF2 0xf8 14562306a36Sopenharmony_ci 14662306a36Sopenharmony_ci/* AC-97 Registers */ 14762306a36Sopenharmony_ci 14862306a36Sopenharmony_ci#define DX_ACR0_AC97_W 0x40 14962306a36Sopenharmony_ci#define DX_ACR1_AC97_R 0x44 15062306a36Sopenharmony_ci#define DX_ACR2_AC97_COM_STAT 0x48 15162306a36Sopenharmony_ci 15262306a36Sopenharmony_ci#define NX_ACR0_AC97_COM_STAT 0x40 15362306a36Sopenharmony_ci#define NX_ACR1_AC97_W 0x44 15462306a36Sopenharmony_ci#define NX_ACR2_AC97_R_PRIMARY 0x48 15562306a36Sopenharmony_ci#define NX_ACR3_AC97_R_SECONDARY 0x4c 15662306a36Sopenharmony_ci 15762306a36Sopenharmony_ci#define SI_AC97_WRITE 0x40 15862306a36Sopenharmony_ci#define SI_AC97_READ 0x44 15962306a36Sopenharmony_ci#define SI_SERIAL_INTF_CTRL 0x48 16062306a36Sopenharmony_ci#define SI_AC97_GPIO 0x4c 16162306a36Sopenharmony_ci#define SI_ASR0 0x50 16262306a36Sopenharmony_ci#define SI_SPDIF_CS 0x70 16362306a36Sopenharmony_ci#define SI_GPIO 0x7c 16462306a36Sopenharmony_ci 16562306a36Sopenharmony_cienum trident_nx_ac97_bits { 16662306a36Sopenharmony_ci /* ACR1-3 */ 16762306a36Sopenharmony_ci NX_AC97_BUSY_WRITE = 0x0800, 16862306a36Sopenharmony_ci NX_AC97_BUSY_READ = 0x0800, 16962306a36Sopenharmony_ci NX_AC97_BUSY_DATA = 0x0400, 17062306a36Sopenharmony_ci NX_AC97_WRITE_SECONDARY = 0x0100, 17162306a36Sopenharmony_ci /* ACR0 */ 17262306a36Sopenharmony_ci NX_AC97_SECONDARY_READY = 0x0040, 17362306a36Sopenharmony_ci NX_AC97_SECONDARY_RECORD = 0x0020, 17462306a36Sopenharmony_ci NX_AC97_SURROUND_OUTPUT = 0x0010, 17562306a36Sopenharmony_ci NX_AC97_PRIMARY_READY = 0x0008, 17662306a36Sopenharmony_ci NX_AC97_PRIMARY_RECORD = 0x0004, 17762306a36Sopenharmony_ci NX_AC97_PCM_OUTPUT = 0x0002, 17862306a36Sopenharmony_ci NX_AC97_WARM_RESET = 0x0001 17962306a36Sopenharmony_ci}; 18062306a36Sopenharmony_ci 18162306a36Sopenharmony_cienum trident_dx_ac97_bits { 18262306a36Sopenharmony_ci DX_AC97_BUSY_WRITE = 0x8000, 18362306a36Sopenharmony_ci DX_AC97_BUSY_READ = 0x8000, 18462306a36Sopenharmony_ci DX_AC97_READY = 0x0010, 18562306a36Sopenharmony_ci DX_AC97_RECORD = 0x0008, 18662306a36Sopenharmony_ci DX_AC97_PLAYBACK = 0x0002 18762306a36Sopenharmony_ci}; 18862306a36Sopenharmony_ci 18962306a36Sopenharmony_cienum sis7018_ac97_bits { 19062306a36Sopenharmony_ci SI_AC97_BUSY_WRITE = 0x00008000, 19162306a36Sopenharmony_ci SI_AC97_AUDIO_BUSY = 0x00004000, 19262306a36Sopenharmony_ci SI_AC97_MODEM_BUSY = 0x00002000, 19362306a36Sopenharmony_ci SI_AC97_BUSY_READ = 0x00008000, 19462306a36Sopenharmony_ci SI_AC97_SECONDARY = 0x00000080, 19562306a36Sopenharmony_ci}; 19662306a36Sopenharmony_ci 19762306a36Sopenharmony_cienum serial_intf_ctrl_bits { 19862306a36Sopenharmony_ci WARM_RESET = 0x00000001, 19962306a36Sopenharmony_ci COLD_RESET = 0x00000002, 20062306a36Sopenharmony_ci I2S_CLOCK = 0x00000004, 20162306a36Sopenharmony_ci PCM_SEC_AC97 = 0x00000008, 20262306a36Sopenharmony_ci AC97_DBL_RATE = 0x00000010, 20362306a36Sopenharmony_ci SPDIF_EN = 0x00000020, 20462306a36Sopenharmony_ci I2S_OUTPUT_EN = 0x00000040, 20562306a36Sopenharmony_ci I2S_INPUT_EN = 0x00000080, 20662306a36Sopenharmony_ci PCMIN = 0x00000100, 20762306a36Sopenharmony_ci LINE1IN = 0x00000200, 20862306a36Sopenharmony_ci MICIN = 0x00000400, 20962306a36Sopenharmony_ci LINE2IN = 0x00000800, 21062306a36Sopenharmony_ci HEAD_SET_IN = 0x00001000, 21162306a36Sopenharmony_ci GPIOIN = 0x00002000, 21262306a36Sopenharmony_ci /* 7018 spec says id = 01 but the demo board routed to 10 21362306a36Sopenharmony_ci SECONDARY_ID= 0x00004000, */ 21462306a36Sopenharmony_ci SECONDARY_ID = 0x00004000, 21562306a36Sopenharmony_ci PCMOUT = 0x00010000, 21662306a36Sopenharmony_ci SURROUT = 0x00020000, 21762306a36Sopenharmony_ci CENTEROUT = 0x00040000, 21862306a36Sopenharmony_ci LFEOUT = 0x00080000, 21962306a36Sopenharmony_ci LINE1OUT = 0x00100000, 22062306a36Sopenharmony_ci LINE2OUT = 0x00200000, 22162306a36Sopenharmony_ci GPIOOUT = 0x00400000, 22262306a36Sopenharmony_ci SI_AC97_PRIMARY_READY = 0x01000000, 22362306a36Sopenharmony_ci SI_AC97_SECONDARY_READY = 0x02000000, 22462306a36Sopenharmony_ci SI_AC97_POWERDOWN = 0x04000000, 22562306a36Sopenharmony_ci}; 22662306a36Sopenharmony_ci 22762306a36Sopenharmony_ci/* PCM defaults */ 22862306a36Sopenharmony_ci 22962306a36Sopenharmony_ci#define T4D_DEFAULT_PCM_VOL 10 /* 0 - 255 */ 23062306a36Sopenharmony_ci#define T4D_DEFAULT_PCM_PAN 0 /* 0 - 127 */ 23162306a36Sopenharmony_ci#define T4D_DEFAULT_PCM_RVOL 127 /* 0 - 127 */ 23262306a36Sopenharmony_ci#define T4D_DEFAULT_PCM_CVOL 127 /* 0 - 127 */ 23362306a36Sopenharmony_ci 23462306a36Sopenharmony_cistruct snd_trident; 23562306a36Sopenharmony_cistruct snd_trident_voice; 23662306a36Sopenharmony_cistruct snd_trident_pcm_mixer; 23762306a36Sopenharmony_ci 23862306a36Sopenharmony_cistruct snd_trident_port { 23962306a36Sopenharmony_ci struct snd_midi_channel_set * chset; 24062306a36Sopenharmony_ci struct snd_trident * trident; 24162306a36Sopenharmony_ci int mode; /* operation mode */ 24262306a36Sopenharmony_ci int client; /* sequencer client number */ 24362306a36Sopenharmony_ci int port; /* sequencer port number */ 24462306a36Sopenharmony_ci unsigned int midi_has_voices: 1; 24562306a36Sopenharmony_ci}; 24662306a36Sopenharmony_ci 24762306a36Sopenharmony_cistruct snd_trident_memblk_arg { 24862306a36Sopenharmony_ci short first_page, last_page; 24962306a36Sopenharmony_ci}; 25062306a36Sopenharmony_ci 25162306a36Sopenharmony_cistruct snd_trident_tlb { 25262306a36Sopenharmony_ci __le32 *entries; /* 16k-aligned TLB table */ 25362306a36Sopenharmony_ci dma_addr_t entries_dmaaddr; /* 16k-aligned PCI address to TLB table */ 25462306a36Sopenharmony_ci struct snd_dma_buffer *buffer; 25562306a36Sopenharmony_ci struct snd_util_memhdr * memhdr; /* page allocation list */ 25662306a36Sopenharmony_ci struct snd_dma_buffer *silent_page; 25762306a36Sopenharmony_ci}; 25862306a36Sopenharmony_ci 25962306a36Sopenharmony_cistruct snd_trident_voice { 26062306a36Sopenharmony_ci unsigned int number; 26162306a36Sopenharmony_ci unsigned int use: 1, 26262306a36Sopenharmony_ci pcm: 1, 26362306a36Sopenharmony_ci synth:1, 26462306a36Sopenharmony_ci midi: 1; 26562306a36Sopenharmony_ci unsigned int flags; 26662306a36Sopenharmony_ci unsigned char client; 26762306a36Sopenharmony_ci unsigned char port; 26862306a36Sopenharmony_ci unsigned char index; 26962306a36Sopenharmony_ci 27062306a36Sopenharmony_ci struct snd_trident_sample_ops *sample_ops; 27162306a36Sopenharmony_ci 27262306a36Sopenharmony_ci /* channel parameters */ 27362306a36Sopenharmony_ci unsigned int CSO; /* 24 bits (16 on DX) */ 27462306a36Sopenharmony_ci unsigned int ESO; /* 24 bits (16 on DX) */ 27562306a36Sopenharmony_ci unsigned int LBA; /* 30 bits */ 27662306a36Sopenharmony_ci unsigned short EC; /* 12 bits */ 27762306a36Sopenharmony_ci unsigned short Alpha; /* 12 bits */ 27862306a36Sopenharmony_ci unsigned short Delta; /* 16 bits */ 27962306a36Sopenharmony_ci unsigned short Attribute; /* 16 bits - SiS 7018 */ 28062306a36Sopenharmony_ci unsigned short Vol; /* 12 bits (6.6) */ 28162306a36Sopenharmony_ci unsigned char Pan; /* 7 bits (1.4.2) */ 28262306a36Sopenharmony_ci unsigned char GVSel; /* 1 bit */ 28362306a36Sopenharmony_ci unsigned char RVol; /* 7 bits (5.2) */ 28462306a36Sopenharmony_ci unsigned char CVol; /* 7 bits (5.2) */ 28562306a36Sopenharmony_ci unsigned char FMC; /* 2 bits */ 28662306a36Sopenharmony_ci unsigned char CTRL; /* 4 bits */ 28762306a36Sopenharmony_ci unsigned char FMS; /* 4 bits */ 28862306a36Sopenharmony_ci unsigned char LFO; /* 8 bits */ 28962306a36Sopenharmony_ci 29062306a36Sopenharmony_ci unsigned int negCSO; /* nonzero - use negative CSO */ 29162306a36Sopenharmony_ci 29262306a36Sopenharmony_ci struct snd_util_memblk *memblk; /* memory block if TLB enabled */ 29362306a36Sopenharmony_ci 29462306a36Sopenharmony_ci /* PCM data */ 29562306a36Sopenharmony_ci 29662306a36Sopenharmony_ci struct snd_trident *trident; 29762306a36Sopenharmony_ci struct snd_pcm_substream *substream; 29862306a36Sopenharmony_ci struct snd_trident_voice *extra; /* extra PCM voice (acts as interrupt generator) */ 29962306a36Sopenharmony_ci unsigned int running: 1, 30062306a36Sopenharmony_ci capture: 1, 30162306a36Sopenharmony_ci spdif: 1, 30262306a36Sopenharmony_ci foldback: 1, 30362306a36Sopenharmony_ci isync: 1, 30462306a36Sopenharmony_ci isync2: 1, 30562306a36Sopenharmony_ci isync3: 1; 30662306a36Sopenharmony_ci int foldback_chan; /* foldback subdevice number */ 30762306a36Sopenharmony_ci unsigned int stimer; /* global sample timer (to detect spurious interrupts) */ 30862306a36Sopenharmony_ci unsigned int spurious_threshold; /* spurious threshold */ 30962306a36Sopenharmony_ci unsigned int isync_mark; 31062306a36Sopenharmony_ci unsigned int isync_max; 31162306a36Sopenharmony_ci unsigned int isync_ESO; 31262306a36Sopenharmony_ci 31362306a36Sopenharmony_ci /* --- */ 31462306a36Sopenharmony_ci 31562306a36Sopenharmony_ci void *private_data; 31662306a36Sopenharmony_ci void (*private_free)(struct snd_trident_voice *voice); 31762306a36Sopenharmony_ci}; 31862306a36Sopenharmony_ci 31962306a36Sopenharmony_cistruct snd_4dwave { 32062306a36Sopenharmony_ci int seq_client; 32162306a36Sopenharmony_ci 32262306a36Sopenharmony_ci struct snd_trident_port seq_ports[4]; 32362306a36Sopenharmony_ci struct snd_trident_voice voices[64]; 32462306a36Sopenharmony_ci 32562306a36Sopenharmony_ci int ChanSynthCount; /* number of allocated synth channels */ 32662306a36Sopenharmony_ci int max_size; /* maximum synth memory size in bytes */ 32762306a36Sopenharmony_ci int current_size; /* current allocated synth mem in bytes */ 32862306a36Sopenharmony_ci}; 32962306a36Sopenharmony_ci 33062306a36Sopenharmony_cistruct snd_trident_pcm_mixer { 33162306a36Sopenharmony_ci struct snd_trident_voice *voice; /* active voice */ 33262306a36Sopenharmony_ci unsigned short vol; /* front volume */ 33362306a36Sopenharmony_ci unsigned char pan; /* pan control */ 33462306a36Sopenharmony_ci unsigned char rvol; /* rear volume */ 33562306a36Sopenharmony_ci unsigned char cvol; /* center volume */ 33662306a36Sopenharmony_ci unsigned char pad; 33762306a36Sopenharmony_ci}; 33862306a36Sopenharmony_ci 33962306a36Sopenharmony_cistruct snd_trident { 34062306a36Sopenharmony_ci int irq; 34162306a36Sopenharmony_ci 34262306a36Sopenharmony_ci unsigned int device; /* device ID */ 34362306a36Sopenharmony_ci 34462306a36Sopenharmony_ci unsigned char bDMAStart; 34562306a36Sopenharmony_ci 34662306a36Sopenharmony_ci unsigned long port; 34762306a36Sopenharmony_ci unsigned long midi_port; 34862306a36Sopenharmony_ci 34962306a36Sopenharmony_ci unsigned int spurious_irq_count; 35062306a36Sopenharmony_ci unsigned int spurious_irq_max_delta; 35162306a36Sopenharmony_ci 35262306a36Sopenharmony_ci struct snd_trident_tlb tlb; /* TLB entries for NX cards */ 35362306a36Sopenharmony_ci 35462306a36Sopenharmony_ci unsigned char spdif_ctrl; 35562306a36Sopenharmony_ci unsigned char spdif_pcm_ctrl; 35662306a36Sopenharmony_ci unsigned int spdif_bits; 35762306a36Sopenharmony_ci unsigned int spdif_pcm_bits; 35862306a36Sopenharmony_ci struct snd_kcontrol *spdif_pcm_ctl; /* S/PDIF settings */ 35962306a36Sopenharmony_ci unsigned int ac97_ctrl; 36062306a36Sopenharmony_ci 36162306a36Sopenharmony_ci unsigned int ChanMap[2]; /* allocation map for hardware channels */ 36262306a36Sopenharmony_ci 36362306a36Sopenharmony_ci int ChanPCM; /* max number of PCM channels */ 36462306a36Sopenharmony_ci int ChanPCMcnt; /* actual number of PCM channels */ 36562306a36Sopenharmony_ci 36662306a36Sopenharmony_ci unsigned int ac97_detect: 1; /* 1 = AC97 in detection phase */ 36762306a36Sopenharmony_ci unsigned int in_suspend: 1; /* 1 during suspend/resume */ 36862306a36Sopenharmony_ci 36962306a36Sopenharmony_ci struct snd_4dwave synth; /* synth specific variables */ 37062306a36Sopenharmony_ci 37162306a36Sopenharmony_ci spinlock_t event_lock; 37262306a36Sopenharmony_ci spinlock_t voice_alloc; 37362306a36Sopenharmony_ci 37462306a36Sopenharmony_ci struct snd_dma_device dma_dev; 37562306a36Sopenharmony_ci 37662306a36Sopenharmony_ci struct pci_dev *pci; 37762306a36Sopenharmony_ci struct snd_card *card; 37862306a36Sopenharmony_ci struct snd_pcm *pcm; /* ADC/DAC PCM */ 37962306a36Sopenharmony_ci struct snd_pcm *foldback; /* Foldback PCM */ 38062306a36Sopenharmony_ci struct snd_pcm *spdif; /* SPDIF PCM */ 38162306a36Sopenharmony_ci struct snd_rawmidi *rmidi; 38262306a36Sopenharmony_ci 38362306a36Sopenharmony_ci struct snd_ac97_bus *ac97_bus; 38462306a36Sopenharmony_ci struct snd_ac97 *ac97; 38562306a36Sopenharmony_ci struct snd_ac97 *ac97_sec; 38662306a36Sopenharmony_ci 38762306a36Sopenharmony_ci unsigned int musicvol_wavevol; 38862306a36Sopenharmony_ci struct snd_trident_pcm_mixer pcm_mixer[32]; 38962306a36Sopenharmony_ci struct snd_kcontrol *ctl_vol; /* front volume */ 39062306a36Sopenharmony_ci struct snd_kcontrol *ctl_pan; /* pan */ 39162306a36Sopenharmony_ci struct snd_kcontrol *ctl_rvol; /* rear volume */ 39262306a36Sopenharmony_ci struct snd_kcontrol *ctl_cvol; /* center volume */ 39362306a36Sopenharmony_ci 39462306a36Sopenharmony_ci spinlock_t reg_lock; 39562306a36Sopenharmony_ci 39662306a36Sopenharmony_ci struct gameport *gameport; 39762306a36Sopenharmony_ci}; 39862306a36Sopenharmony_ci 39962306a36Sopenharmony_ciint snd_trident_create(struct snd_card *card, 40062306a36Sopenharmony_ci struct pci_dev *pci, 40162306a36Sopenharmony_ci int pcm_streams, 40262306a36Sopenharmony_ci int pcm_spdif_device, 40362306a36Sopenharmony_ci int max_wavetable_size); 40462306a36Sopenharmony_ciint snd_trident_create_gameport(struct snd_trident *trident); 40562306a36Sopenharmony_ci 40662306a36Sopenharmony_ciint snd_trident_pcm(struct snd_trident *trident, int device); 40762306a36Sopenharmony_ciint snd_trident_foldback_pcm(struct snd_trident *trident, int device); 40862306a36Sopenharmony_ciint snd_trident_spdif_pcm(struct snd_trident *trident, int device); 40962306a36Sopenharmony_ciint snd_trident_attach_synthesizer(struct snd_trident * trident); 41062306a36Sopenharmony_cistruct snd_trident_voice *snd_trident_alloc_voice(struct snd_trident * trident, int type, 41162306a36Sopenharmony_ci int client, int port); 41262306a36Sopenharmony_civoid snd_trident_free_voice(struct snd_trident * trident, struct snd_trident_voice *voice); 41362306a36Sopenharmony_civoid snd_trident_start_voice(struct snd_trident * trident, unsigned int voice); 41462306a36Sopenharmony_civoid snd_trident_stop_voice(struct snd_trident * trident, unsigned int voice); 41562306a36Sopenharmony_civoid snd_trident_write_voice_regs(struct snd_trident * trident, struct snd_trident_voice *voice); 41662306a36Sopenharmony_ciextern const struct dev_pm_ops snd_trident_pm; 41762306a36Sopenharmony_ci 41862306a36Sopenharmony_ci/* TLB memory allocation */ 41962306a36Sopenharmony_cistruct snd_util_memblk *snd_trident_alloc_pages(struct snd_trident *trident, 42062306a36Sopenharmony_ci struct snd_pcm_substream *substream); 42162306a36Sopenharmony_ciint snd_trident_free_pages(struct snd_trident *trident, struct snd_util_memblk *blk); 42262306a36Sopenharmony_cistruct snd_util_memblk *snd_trident_synth_alloc(struct snd_trident *trident, unsigned int size); 42362306a36Sopenharmony_ciint snd_trident_synth_free(struct snd_trident *trident, struct snd_util_memblk *blk); 42462306a36Sopenharmony_ciint snd_trident_synth_copy_from_user(struct snd_trident *trident, struct snd_util_memblk *blk, 42562306a36Sopenharmony_ci int offset, const char __user *data, int size); 42662306a36Sopenharmony_ci 42762306a36Sopenharmony_ci#endif /* __SOUND_TRIDENT_H */ 428