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