162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */ 262306a36Sopenharmony_ci/********************************************************************* 362306a36Sopenharmony_ci * 462306a36Sopenharmony_ci * msnd.h 562306a36Sopenharmony_ci * 662306a36Sopenharmony_ci * Turtle Beach MultiSound Sound Card Driver for Linux 762306a36Sopenharmony_ci * 862306a36Sopenharmony_ci * Some parts of this header file were derived from the Turtle Beach 962306a36Sopenharmony_ci * MultiSound Driver Development Kit. 1062306a36Sopenharmony_ci * 1162306a36Sopenharmony_ci * Copyright (C) 1998 Andrew Veliath 1262306a36Sopenharmony_ci * Copyright (C) 1993 Turtle Beach Systems, Inc. 1362306a36Sopenharmony_ci * 1462306a36Sopenharmony_ci ********************************************************************/ 1562306a36Sopenharmony_ci#ifndef __MSND_H 1662306a36Sopenharmony_ci#define __MSND_H 1762306a36Sopenharmony_ci 1862306a36Sopenharmony_ci#define DEFSAMPLERATE 44100 1962306a36Sopenharmony_ci#define DEFSAMPLESIZE SNDRV_PCM_FORMAT_S16 2062306a36Sopenharmony_ci#define DEFCHANNELS 1 2162306a36Sopenharmony_ci 2262306a36Sopenharmony_ci#define SRAM_BANK_SIZE 0x8000 2362306a36Sopenharmony_ci#define SRAM_CNTL_START 0x7F00 2462306a36Sopenharmony_ci#define SMA_STRUCT_START 0x7F40 2562306a36Sopenharmony_ci 2662306a36Sopenharmony_ci#define DSP_BASE_ADDR 0x4000 2762306a36Sopenharmony_ci#define DSP_BANK_BASE 0x4000 2862306a36Sopenharmony_ci 2962306a36Sopenharmony_ci#define AGND 0x01 3062306a36Sopenharmony_ci#define SIGNAL 0x02 3162306a36Sopenharmony_ci 3262306a36Sopenharmony_ci#define EXT_DSP_BIT_DCAL 0x0001 3362306a36Sopenharmony_ci#define EXT_DSP_BIT_MIDI_CON 0x0002 3462306a36Sopenharmony_ci 3562306a36Sopenharmony_ci#define BUFFSIZE 0x8000 3662306a36Sopenharmony_ci#define HOSTQ_SIZE 0x40 3762306a36Sopenharmony_ci 3862306a36Sopenharmony_ci#define DAP_BUFF_SIZE 0x2400 3962306a36Sopenharmony_ci 4062306a36Sopenharmony_ci#define DAPQ_STRUCT_SIZE 0x10 4162306a36Sopenharmony_ci#define DARQ_STRUCT_SIZE 0x10 4262306a36Sopenharmony_ci#define DAPQ_BUFF_SIZE (3 * 0x10) 4362306a36Sopenharmony_ci#define DARQ_BUFF_SIZE (3 * 0x10) 4462306a36Sopenharmony_ci#define MODQ_BUFF_SIZE 0x400 4562306a36Sopenharmony_ci 4662306a36Sopenharmony_ci#define DAPQ_DATA_BUFF 0x6C00 4762306a36Sopenharmony_ci#define DARQ_DATA_BUFF 0x6C30 4862306a36Sopenharmony_ci#define MODQ_DATA_BUFF 0x6C60 4962306a36Sopenharmony_ci#define MIDQ_DATA_BUFF 0x7060 5062306a36Sopenharmony_ci 5162306a36Sopenharmony_ci#define DAPQ_OFFSET SRAM_CNTL_START 5262306a36Sopenharmony_ci#define DARQ_OFFSET (SRAM_CNTL_START + 0x08) 5362306a36Sopenharmony_ci#define MODQ_OFFSET (SRAM_CNTL_START + 0x10) 5462306a36Sopenharmony_ci#define MIDQ_OFFSET (SRAM_CNTL_START + 0x18) 5562306a36Sopenharmony_ci#define DSPQ_OFFSET (SRAM_CNTL_START + 0x20) 5662306a36Sopenharmony_ci 5762306a36Sopenharmony_ci#define HP_ICR 0x00 5862306a36Sopenharmony_ci#define HP_CVR 0x01 5962306a36Sopenharmony_ci#define HP_ISR 0x02 6062306a36Sopenharmony_ci#define HP_IVR 0x03 6162306a36Sopenharmony_ci#define HP_NU 0x04 6262306a36Sopenharmony_ci#define HP_INFO 0x04 6362306a36Sopenharmony_ci#define HP_TXH 0x05 6462306a36Sopenharmony_ci#define HP_RXH 0x05 6562306a36Sopenharmony_ci#define HP_TXM 0x06 6662306a36Sopenharmony_ci#define HP_RXM 0x06 6762306a36Sopenharmony_ci#define HP_TXL 0x07 6862306a36Sopenharmony_ci#define HP_RXL 0x07 6962306a36Sopenharmony_ci 7062306a36Sopenharmony_ci#define HP_ICR_DEF 0x00 7162306a36Sopenharmony_ci#define HP_CVR_DEF 0x12 7262306a36Sopenharmony_ci#define HP_ISR_DEF 0x06 7362306a36Sopenharmony_ci#define HP_IVR_DEF 0x0f 7462306a36Sopenharmony_ci#define HP_NU_DEF 0x00 7562306a36Sopenharmony_ci 7662306a36Sopenharmony_ci#define HP_IRQM 0x09 7762306a36Sopenharmony_ci 7862306a36Sopenharmony_ci#define HPR_BLRC 0x08 7962306a36Sopenharmony_ci#define HPR_SPR1 0x09 8062306a36Sopenharmony_ci#define HPR_SPR2 0x0A 8162306a36Sopenharmony_ci#define HPR_TCL0 0x0B 8262306a36Sopenharmony_ci#define HPR_TCL1 0x0C 8362306a36Sopenharmony_ci#define HPR_TCL2 0x0D 8462306a36Sopenharmony_ci#define HPR_TCL3 0x0E 8562306a36Sopenharmony_ci#define HPR_TCL4 0x0F 8662306a36Sopenharmony_ci 8762306a36Sopenharmony_ci#define HPICR_INIT 0x80 8862306a36Sopenharmony_ci#define HPICR_HM1 0x40 8962306a36Sopenharmony_ci#define HPICR_HM0 0x20 9062306a36Sopenharmony_ci#define HPICR_HF1 0x10 9162306a36Sopenharmony_ci#define HPICR_HF0 0x08 9262306a36Sopenharmony_ci#define HPICR_TREQ 0x02 9362306a36Sopenharmony_ci#define HPICR_RREQ 0x01 9462306a36Sopenharmony_ci 9562306a36Sopenharmony_ci#define HPCVR_HC 0x80 9662306a36Sopenharmony_ci 9762306a36Sopenharmony_ci#define HPISR_HREQ 0x80 9862306a36Sopenharmony_ci#define HPISR_DMA 0x40 9962306a36Sopenharmony_ci#define HPISR_HF3 0x10 10062306a36Sopenharmony_ci#define HPISR_HF2 0x08 10162306a36Sopenharmony_ci#define HPISR_TRDY 0x04 10262306a36Sopenharmony_ci#define HPISR_TXDE 0x02 10362306a36Sopenharmony_ci#define HPISR_RXDF 0x01 10462306a36Sopenharmony_ci 10562306a36Sopenharmony_ci#define HPIO_290 0 10662306a36Sopenharmony_ci#define HPIO_260 1 10762306a36Sopenharmony_ci#define HPIO_250 2 10862306a36Sopenharmony_ci#define HPIO_240 3 10962306a36Sopenharmony_ci#define HPIO_230 4 11062306a36Sopenharmony_ci#define HPIO_220 5 11162306a36Sopenharmony_ci#define HPIO_210 6 11262306a36Sopenharmony_ci#define HPIO_3E0 7 11362306a36Sopenharmony_ci 11462306a36Sopenharmony_ci#define HPMEM_NONE 0 11562306a36Sopenharmony_ci#define HPMEM_B000 1 11662306a36Sopenharmony_ci#define HPMEM_C800 2 11762306a36Sopenharmony_ci#define HPMEM_D000 3 11862306a36Sopenharmony_ci#define HPMEM_D400 4 11962306a36Sopenharmony_ci#define HPMEM_D800 5 12062306a36Sopenharmony_ci#define HPMEM_E000 6 12162306a36Sopenharmony_ci#define HPMEM_E800 7 12262306a36Sopenharmony_ci 12362306a36Sopenharmony_ci#define HPIRQ_NONE 0 12462306a36Sopenharmony_ci#define HPIRQ_5 1 12562306a36Sopenharmony_ci#define HPIRQ_7 2 12662306a36Sopenharmony_ci#define HPIRQ_9 3 12762306a36Sopenharmony_ci#define HPIRQ_10 4 12862306a36Sopenharmony_ci#define HPIRQ_11 5 12962306a36Sopenharmony_ci#define HPIRQ_12 6 13062306a36Sopenharmony_ci#define HPIRQ_15 7 13162306a36Sopenharmony_ci 13262306a36Sopenharmony_ci#define HIMT_PLAY_DONE 0x00 13362306a36Sopenharmony_ci#define HIMT_RECORD_DONE 0x01 13462306a36Sopenharmony_ci#define HIMT_MIDI_EOS 0x02 13562306a36Sopenharmony_ci#define HIMT_MIDI_OUT 0x03 13662306a36Sopenharmony_ci 13762306a36Sopenharmony_ci#define HIMT_MIDI_IN_UCHAR 0x0E 13862306a36Sopenharmony_ci#define HIMT_DSP 0x0F 13962306a36Sopenharmony_ci 14062306a36Sopenharmony_ci#define HDEX_BASE 0x92 14162306a36Sopenharmony_ci#define HDEX_PLAY_START (0 + HDEX_BASE) 14262306a36Sopenharmony_ci#define HDEX_PLAY_STOP (1 + HDEX_BASE) 14362306a36Sopenharmony_ci#define HDEX_PLAY_PAUSE (2 + HDEX_BASE) 14462306a36Sopenharmony_ci#define HDEX_PLAY_RESUME (3 + HDEX_BASE) 14562306a36Sopenharmony_ci#define HDEX_RECORD_START (4 + HDEX_BASE) 14662306a36Sopenharmony_ci#define HDEX_RECORD_STOP (5 + HDEX_BASE) 14762306a36Sopenharmony_ci#define HDEX_MIDI_IN_START (6 + HDEX_BASE) 14862306a36Sopenharmony_ci#define HDEX_MIDI_IN_STOP (7 + HDEX_BASE) 14962306a36Sopenharmony_ci#define HDEX_MIDI_OUT_START (8 + HDEX_BASE) 15062306a36Sopenharmony_ci#define HDEX_MIDI_OUT_STOP (9 + HDEX_BASE) 15162306a36Sopenharmony_ci#define HDEX_AUX_REQ (10 + HDEX_BASE) 15262306a36Sopenharmony_ci 15362306a36Sopenharmony_ci#define HDEXAR_CLEAR_PEAKS 1 15462306a36Sopenharmony_ci#define HDEXAR_IN_SET_POTS 2 15562306a36Sopenharmony_ci#define HDEXAR_AUX_SET_POTS 3 15662306a36Sopenharmony_ci#define HDEXAR_CAL_A_TO_D 4 15762306a36Sopenharmony_ci#define HDEXAR_RD_EXT_DSP_BITS 5 15862306a36Sopenharmony_ci 15962306a36Sopenharmony_ci/* Pinnacle only HDEXAR defs */ 16062306a36Sopenharmony_ci#define HDEXAR_SET_ANA_IN 0 16162306a36Sopenharmony_ci#define HDEXAR_SET_SYNTH_IN 4 16262306a36Sopenharmony_ci#define HDEXAR_READ_DAT_IN 5 16362306a36Sopenharmony_ci#define HDEXAR_MIC_SET_POTS 6 16462306a36Sopenharmony_ci#define HDEXAR_SET_DAT_IN 7 16562306a36Sopenharmony_ci 16662306a36Sopenharmony_ci#define HDEXAR_SET_SYNTH_48 8 16762306a36Sopenharmony_ci#define HDEXAR_SET_SYNTH_44 9 16862306a36Sopenharmony_ci 16962306a36Sopenharmony_ci#define HIWORD(l) ((u16)((((u32)(l)) >> 16) & 0xFFFF)) 17062306a36Sopenharmony_ci#define LOWORD(l) ((u16)(u32)(l)) 17162306a36Sopenharmony_ci#define HIBYTE(w) ((u8)(((u16)(w) >> 8) & 0xFF)) 17262306a36Sopenharmony_ci#define LOBYTE(w) ((u8)(w)) 17362306a36Sopenharmony_ci#define MAKELONG(low, hi) ((long)(((u16)(low))|(((u32)((u16)(hi)))<<16))) 17462306a36Sopenharmony_ci#define MAKEWORD(low, hi) ((u16)(((u8)(low))|(((u16)((u8)(hi)))<<8))) 17562306a36Sopenharmony_ci 17662306a36Sopenharmony_ci#define PCTODSP_OFFSET(w) (u16)((w)/2) 17762306a36Sopenharmony_ci#define PCTODSP_BASED(w) (u16)(((w)/2) + DSP_BASE_ADDR) 17862306a36Sopenharmony_ci#define DSPTOPC_BASED(w) (((w) - DSP_BASE_ADDR) * 2) 17962306a36Sopenharmony_ci 18062306a36Sopenharmony_ci#ifdef SLOWIO 18162306a36Sopenharmony_ci# undef outb 18262306a36Sopenharmony_ci# undef inb 18362306a36Sopenharmony_ci# define outb outb_p 18462306a36Sopenharmony_ci# define inb inb_p 18562306a36Sopenharmony_ci#endif 18662306a36Sopenharmony_ci 18762306a36Sopenharmony_ci/* JobQueueStruct */ 18862306a36Sopenharmony_ci#define JQS_wStart 0x00 18962306a36Sopenharmony_ci#define JQS_wSize 0x02 19062306a36Sopenharmony_ci#define JQS_wHead 0x04 19162306a36Sopenharmony_ci#define JQS_wTail 0x06 19262306a36Sopenharmony_ci#define JQS__size 0x08 19362306a36Sopenharmony_ci 19462306a36Sopenharmony_ci/* DAQueueDataStruct */ 19562306a36Sopenharmony_ci#define DAQDS_wStart 0x00 19662306a36Sopenharmony_ci#define DAQDS_wSize 0x02 19762306a36Sopenharmony_ci#define DAQDS_wFormat 0x04 19862306a36Sopenharmony_ci#define DAQDS_wSampleSize 0x06 19962306a36Sopenharmony_ci#define DAQDS_wChannels 0x08 20062306a36Sopenharmony_ci#define DAQDS_wSampleRate 0x0A 20162306a36Sopenharmony_ci#define DAQDS_wIntMsg 0x0C 20262306a36Sopenharmony_ci#define DAQDS_wFlags 0x0E 20362306a36Sopenharmony_ci#define DAQDS__size 0x10 20462306a36Sopenharmony_ci 20562306a36Sopenharmony_ci#include <sound/pcm.h> 20662306a36Sopenharmony_ci 20762306a36Sopenharmony_cistruct snd_msnd { 20862306a36Sopenharmony_ci void __iomem *mappedbase; 20962306a36Sopenharmony_ci int play_period_bytes; 21062306a36Sopenharmony_ci int playLimit; 21162306a36Sopenharmony_ci int playPeriods; 21262306a36Sopenharmony_ci int playDMAPos; 21362306a36Sopenharmony_ci int banksPlayed; 21462306a36Sopenharmony_ci int captureDMAPos; 21562306a36Sopenharmony_ci int capturePeriodBytes; 21662306a36Sopenharmony_ci int captureLimit; 21762306a36Sopenharmony_ci int capturePeriods; 21862306a36Sopenharmony_ci struct snd_card *card; 21962306a36Sopenharmony_ci void *msndmidi_mpu; 22062306a36Sopenharmony_ci struct snd_rawmidi *rmidi; 22162306a36Sopenharmony_ci 22262306a36Sopenharmony_ci /* Hardware resources */ 22362306a36Sopenharmony_ci long io; 22462306a36Sopenharmony_ci int memid, irqid; 22562306a36Sopenharmony_ci int irq, irq_ref; 22662306a36Sopenharmony_ci unsigned long base; 22762306a36Sopenharmony_ci 22862306a36Sopenharmony_ci /* Motorola 56k DSP SMA */ 22962306a36Sopenharmony_ci void __iomem *SMA; 23062306a36Sopenharmony_ci void __iomem *DAPQ; 23162306a36Sopenharmony_ci void __iomem *DARQ; 23262306a36Sopenharmony_ci void __iomem *MODQ; 23362306a36Sopenharmony_ci void __iomem *MIDQ; 23462306a36Sopenharmony_ci void __iomem *DSPQ; 23562306a36Sopenharmony_ci int dspq_data_buff, dspq_buff_size; 23662306a36Sopenharmony_ci 23762306a36Sopenharmony_ci /* State variables */ 23862306a36Sopenharmony_ci enum { msndClassic, msndPinnacle } type; 23962306a36Sopenharmony_ci fmode_t mode; 24062306a36Sopenharmony_ci unsigned long flags; 24162306a36Sopenharmony_ci#define F_RESETTING 0 24262306a36Sopenharmony_ci#define F_HAVEDIGITAL 1 24362306a36Sopenharmony_ci#define F_AUDIO_WRITE_INUSE 2 24462306a36Sopenharmony_ci#define F_WRITING 3 24562306a36Sopenharmony_ci#define F_WRITEBLOCK 4 24662306a36Sopenharmony_ci#define F_WRITEFLUSH 5 24762306a36Sopenharmony_ci#define F_AUDIO_READ_INUSE 6 24862306a36Sopenharmony_ci#define F_READING 7 24962306a36Sopenharmony_ci#define F_READBLOCK 8 25062306a36Sopenharmony_ci#define F_EXT_MIDI_INUSE 9 25162306a36Sopenharmony_ci#define F_HDR_MIDI_INUSE 10 25262306a36Sopenharmony_ci#define F_DISABLE_WRITE_NDELAY 11 25362306a36Sopenharmony_ci spinlock_t lock; 25462306a36Sopenharmony_ci spinlock_t mixer_lock; 25562306a36Sopenharmony_ci int nresets; 25662306a36Sopenharmony_ci unsigned recsrc; 25762306a36Sopenharmony_ci#define LEVEL_ENTRIES 32 25862306a36Sopenharmony_ci int left_levels[LEVEL_ENTRIES]; 25962306a36Sopenharmony_ci int right_levels[LEVEL_ENTRIES]; 26062306a36Sopenharmony_ci int calibrate_signal; 26162306a36Sopenharmony_ci int play_sample_size, play_sample_rate, play_channels; 26262306a36Sopenharmony_ci int play_ndelay; 26362306a36Sopenharmony_ci int capture_sample_size, capture_sample_rate, capture_channels; 26462306a36Sopenharmony_ci int capture_ndelay; 26562306a36Sopenharmony_ci u8 bCurrentMidiPatch; 26662306a36Sopenharmony_ci 26762306a36Sopenharmony_ci int last_playbank, last_recbank; 26862306a36Sopenharmony_ci struct snd_pcm_substream *playback_substream; 26962306a36Sopenharmony_ci struct snd_pcm_substream *capture_substream; 27062306a36Sopenharmony_ci 27162306a36Sopenharmony_ci}; 27262306a36Sopenharmony_ci 27362306a36Sopenharmony_civoid snd_msnd_init_queue(void __iomem *base, int start, int size); 27462306a36Sopenharmony_ci 27562306a36Sopenharmony_ciint snd_msnd_send_dsp_cmd(struct snd_msnd *chip, u8 cmd); 27662306a36Sopenharmony_ciint snd_msnd_send_word(struct snd_msnd *chip, 27762306a36Sopenharmony_ci unsigned char high, 27862306a36Sopenharmony_ci unsigned char mid, 27962306a36Sopenharmony_ci unsigned char low); 28062306a36Sopenharmony_ciint snd_msnd_upload_host(struct snd_msnd *chip, 28162306a36Sopenharmony_ci const u8 *bin, int len); 28262306a36Sopenharmony_ciint snd_msnd_enable_irq(struct snd_msnd *chip); 28362306a36Sopenharmony_ciint snd_msnd_disable_irq(struct snd_msnd *chip); 28462306a36Sopenharmony_civoid snd_msnd_dsp_halt(struct snd_msnd *chip, struct file *file); 28562306a36Sopenharmony_ciint snd_msnd_DAPQ(struct snd_msnd *chip, int start); 28662306a36Sopenharmony_ciint snd_msnd_DARQ(struct snd_msnd *chip, int start); 28762306a36Sopenharmony_ciint snd_msnd_pcm(struct snd_card *card, int device); 28862306a36Sopenharmony_ci 28962306a36Sopenharmony_ciint snd_msndmidi_new(struct snd_card *card, int device); 29062306a36Sopenharmony_civoid snd_msndmidi_input_read(void *mpu); 29162306a36Sopenharmony_ci 29262306a36Sopenharmony_civoid snd_msndmix_setup(struct snd_msnd *chip); 29362306a36Sopenharmony_ciint snd_msndmix_new(struct snd_card *card); 29462306a36Sopenharmony_ciint snd_msndmix_force_recsrc(struct snd_msnd *chip, int recsrc); 29562306a36Sopenharmony_ci#endif /* __MSND_H */ 296