Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   1) /* SPDX-License-Identifier: GPL-2.0-or-later */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   2) #ifndef __SOUND_SB_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   3) #define __SOUND_SB_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   4) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   5) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   6)  *  Header file for SoundBlaster cards
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   7)  *  Copyright (c) by Jaroslav Kysela <perex@perex.cz>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   8)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   9) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  10) #include <sound/pcm.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  11) #include <sound/rawmidi.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  12) #include <linux/interrupt.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  13) #include <linux/io.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  14) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  15) enum sb_hw_type {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  16) 	SB_HW_AUTO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  17) 	SB_HW_10,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  18) 	SB_HW_20,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  19) 	SB_HW_201,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  20) 	SB_HW_PRO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  21) 	SB_HW_JAZZ16,		/* Media Vision Jazz16 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  22) 	SB_HW_16,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  23) 	SB_HW_16CSP,		/* SB16 with CSP chip */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  24) 	SB_HW_ALS100,		/* Avance Logic ALS100 chip */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  25) 	SB_HW_ALS4000,		/* Avance Logic ALS4000 chip */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  26) 	SB_HW_DT019X,		/* Diamond Tech. DT-019X / Avance Logic ALS-007 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  27) 	SB_HW_CS5530,		/* Cyrix/NatSemi 5530 VSA1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  28) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  29) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  30) #define SB_OPEN_PCM			0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  31) #define SB_OPEN_MIDI_INPUT		0x02
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  32) #define SB_OPEN_MIDI_OUTPUT		0x04
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  33) #define SB_OPEN_MIDI_INPUT_TRIGGER	0x08
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  34) #define SB_OPEN_MIDI_OUTPUT_TRIGGER	0x10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  35) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  36) #define SB_MODE_HALT		0x00
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  37) #define SB_MODE_PLAYBACK_8	0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  38) #define SB_MODE_PLAYBACK_16	0x02
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  39) #define SB_MODE_PLAYBACK	(SB_MODE_PLAYBACK_8 | SB_MODE_PLAYBACK_16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  40) #define SB_MODE_CAPTURE_8	0x04
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  41) #define SB_MODE_CAPTURE_16	0x08
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  42) #define SB_MODE_CAPTURE		(SB_MODE_CAPTURE_8 | SB_MODE_CAPTURE_16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  43) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  44) #define SB_RATE_LOCK_PLAYBACK	0x10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  45) #define SB_RATE_LOCK_CAPTURE	0x20
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  46) #define SB_RATE_LOCK		(SB_RATE_LOCK_PLAYBACK | SB_RATE_LOCK_CAPTURE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  47) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  48) #define SB_MPU_INPUT		1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  49) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  50) struct snd_sb {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  51) 	unsigned long port;		/* base port of DSP chip */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  52) 	struct resource *res_port;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  53) 	unsigned long mpu_port;		/* MPU port for SB DSP 4.0+ */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  54) 	int irq;			/* IRQ number of DSP chip */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  55) 	int dma8;			/* 8-bit DMA */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  56) 	int dma16;			/* 16-bit DMA */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  57) 	unsigned short version;		/* version of DSP chip */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  58) 	enum sb_hw_type hardware;	/* see to SB_HW_XXXX */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  59) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  60) 	unsigned long alt_port;		/* alternate port (ALS4000) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  61) 	struct pci_dev *pci;		/* ALS4000 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  62) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  63) 	unsigned int open;		/* see to SB_OPEN_XXXX for sb8 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  64) 					/* also SNDRV_SB_CSP_MODE_XXX for sb16_csp */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  65) 	unsigned int mode;		/* current mode of stream */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  66) 	unsigned int force_mode16;	/* force 16-bit mode of streams */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  67) 	unsigned int locked_rate;	/* sb16 duplex */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  68) 	unsigned int playback_format;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  69) 	unsigned int capture_format;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  70) 	struct timer_list midi_timer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  71) 	unsigned int p_dma_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  72) 	unsigned int p_period_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  73) 	unsigned int c_dma_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  74) 	unsigned int c_period_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  75) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  76) 	spinlock_t mixer_lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  77) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  78) 	char name[32];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  79) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  80) 	void *csp; /* used only when CONFIG_SND_SB16_CSP is set */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  81) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  82) 	struct snd_card *card;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  83) 	struct snd_pcm *pcm;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  84) 	struct snd_pcm_substream *playback_substream;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  85) 	struct snd_pcm_substream *capture_substream;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  86) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  87) 	struct snd_rawmidi *rmidi;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  88) 	struct snd_rawmidi_substream *midi_substream_input;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  89) 	struct snd_rawmidi_substream *midi_substream_output;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  90) 	irq_handler_t rmidi_callback;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  91) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  92) 	spinlock_t reg_lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  93) 	spinlock_t open_lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  94) 	spinlock_t midi_input_lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  95) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  96) 	struct snd_info_entry *proc_entry;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  97) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  98) #ifdef CONFIG_PM
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  99) 	unsigned char saved_regs[0x20];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) /* I/O ports */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) #define SBP(chip, x)		((chip)->port + s_b_SB_##x)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) #define SBP1(port, x)		((port) + s_b_SB_##x)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) #define s_b_SB_RESET		0x6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) #define s_b_SB_READ		0xa
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) #define s_b_SB_WRITE		0xc
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) #define s_b_SB_COMMAND		0xc
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) #define s_b_SB_STATUS		0xc
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) #define s_b_SB_DATA_AVAIL	0xe
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) #define s_b_SB_DATA_AVAIL_16 	0xf
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) #define s_b_SB_MIXER_ADDR	0x4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) #define s_b_SB_MIXER_DATA	0x5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) #define s_b_SB_OPL3_LEFT	0x0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) #define s_b_SB_OPL3_RIGHT	0x2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) #define s_b_SB_OPL3_BOTH	0x8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) #define SB_DSP_OUTPUT		0x14
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) #define SB_DSP_INPUT		0x24
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) #define SB_DSP_BLOCK_SIZE	0x48
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) #define SB_DSP_HI_OUTPUT	0x91
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) #define SB_DSP_HI_INPUT		0x99
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) #define SB_DSP_LO_OUTPUT_AUTO	0x1c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) #define SB_DSP_LO_INPUT_AUTO	0x2c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) #define SB_DSP_HI_OUTPUT_AUTO	0x90
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) #define SB_DSP_HI_INPUT_AUTO	0x98
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) #define SB_DSP_IMMED_INT	0xf2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) #define SB_DSP_GET_VERSION	0xe1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) #define SB_DSP_SPEAKER_ON	0xd1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) #define SB_DSP_SPEAKER_OFF	0xd3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) #define SB_DSP_DMA8_OFF		0xd0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) #define SB_DSP_DMA8_ON		0xd4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) #define SB_DSP_DMA8_EXIT	0xda
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) #define SB_DSP_DMA16_OFF	0xd5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) #define SB_DSP_DMA16_ON		0xd6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) #define SB_DSP_DMA16_EXIT	0xd9
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) #define SB_DSP_SAMPLE_RATE	0x40
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) #define SB_DSP_SAMPLE_RATE_OUT	0x41
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) #define SB_DSP_SAMPLE_RATE_IN	0x42
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) #define SB_DSP_MONO_8BIT	0xa0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) #define SB_DSP_MONO_16BIT	0xa4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) #define SB_DSP_STEREO_8BIT	0xa8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) #define SB_DSP_STEREO_16BIT	0xac
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) #define SB_DSP_MIDI_INPUT_IRQ	0x31
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) #define SB_DSP_MIDI_UART_IRQ	0x35
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) #define SB_DSP_MIDI_OUTPUT	0x38
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) #define SB_DSP4_OUT8_AI		0xc6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) #define SB_DSP4_IN8_AI		0xce
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) #define SB_DSP4_OUT16_AI	0xb6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) #define SB_DSP4_IN16_AI		0xbe
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) #define SB_DSP4_MODE_UNS_MONO	0x00
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) #define SB_DSP4_MODE_SIGN_MONO	0x10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) #define SB_DSP4_MODE_UNS_STEREO	0x20
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) #define SB_DSP4_MODE_SIGN_STEREO 0x30
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) #define SB_DSP4_OUTPUT		0x3c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) #define SB_DSP4_INPUT_LEFT	0x3d
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) #define SB_DSP4_INPUT_RIGHT	0x3e
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) /* registers for SB 2.0 mixer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) #define SB_DSP20_MASTER_DEV	0x02
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) #define SB_DSP20_PCM_DEV	0x0A
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) #define SB_DSP20_CD_DEV		0x08
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) #define SB_DSP20_FM_DEV		0x06
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) /* registers for SB PRO mixer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) #define SB_DSP_MASTER_DEV	0x22
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) #define SB_DSP_PCM_DEV		0x04
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) #define SB_DSP_LINE_DEV		0x2e
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) #define SB_DSP_CD_DEV		0x28
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) #define SB_DSP_FM_DEV		0x26
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) #define SB_DSP_MIC_DEV		0x0a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) #define SB_DSP_CAPTURE_SOURCE	0x0c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) #define SB_DSP_CAPTURE_FILT	0x0c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) #define SB_DSP_PLAYBACK_FILT	0x0e
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) #define SB_DSP_STEREO_SW	0x0e
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) #define SB_DSP_MIXS_MIC0	0x00	/* same as MIC */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) #define SB_DSP_MIXS_CD		0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) #define SB_DSP_MIXS_MIC		0x02
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) #define SB_DSP_MIXS_LINE	0x03
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) /* registers (only for left channel) for SB 16 mixer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) #define SB_DSP4_MASTER_DEV	0x30
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) #define SB_DSP4_BASS_DEV	0x46
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) #define SB_DSP4_TREBLE_DEV	0x44
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) #define SB_DSP4_SYNTH_DEV	0x34
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) #define SB_DSP4_PCM_DEV		0x32
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) #define SB_DSP4_SPEAKER_DEV	0x3b
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) #define SB_DSP4_LINE_DEV	0x38
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) #define SB_DSP4_MIC_DEV		0x3a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) #define SB_DSP4_OUTPUT_SW	0x3c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) #define SB_DSP4_CD_DEV		0x36
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) #define SB_DSP4_IGAIN_DEV	0x3f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) #define SB_DSP4_OGAIN_DEV	0x41
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) #define SB_DSP4_MIC_AGC		0x43
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) /* additional registers for SB 16 mixer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) #define SB_DSP4_IRQSETUP	0x80
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) #define SB_DSP4_DMASETUP	0x81
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) #define SB_DSP4_IRQSTATUS	0x82
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) #define SB_DSP4_MPUSETUP	0x84
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) #define SB_DSP4_3DSE		0x90
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) /* Registers for DT-019x / ALS-007 mixer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) #define SB_DT019X_MASTER_DEV	0x62
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) #define SB_DT019X_PCM_DEV	0x64
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) #define SB_DT019X_SYNTH_DEV	0x66
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) #define SB_DT019X_CD_DEV	0x68
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) #define SB_DT019X_MIC_DEV	0x6a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) #define SB_DT019X_SPKR_DEV	0x6a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) #define SB_DT019X_LINE_DEV	0x6e
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) #define SB_DT019X_OUTPUT_SW2	0x4c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) #define SB_DT019X_CAPTURE_SW	0x6c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) #define SB_DT019X_CAP_CD	0x02
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) #define SB_DT019X_CAP_MIC	0x04
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) #define SB_DT019X_CAP_LINE	0x06
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) #define SB_DT019X_CAP_SYNTH	0x07
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) #define SB_DT019X_CAP_MAIN	0x07
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) #define SB_ALS4000_MONO_IO_CTRL	0x4b
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) #define SB_ALS4000_OUT_MIXER_CTRL_2	0x4c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) #define SB_ALS4000_MIC_IN_GAIN	0x4d
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) #define SB_ALS4000_ANALOG_REFRNC_VOLT_CTRL 0x4e
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) #define SB_ALS4000_FMDAC	0x4f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) #define SB_ALS4000_3D_SND_FX	0x50
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) #define SB_ALS4000_3D_TIME_DELAY	0x51
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) #define SB_ALS4000_3D_AUTO_MUTE	0x52
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) #define SB_ALS4000_ANALOG_BLOCK_CTRL 0x53
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) #define SB_ALS4000_3D_DELAYLINE_PATTERN 0x54
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) #define SB_ALS4000_CR3_CONFIGURATION	0xc3 /* bit 7 is Digital Loop Enable */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) #define SB_ALS4000_QSOUND	0xdb
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) /* IRQ setting bitmap */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) #define SB_IRQSETUP_IRQ9	0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) #define SB_IRQSETUP_IRQ5	0x02
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) #define SB_IRQSETUP_IRQ7	0x04
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) #define SB_IRQSETUP_IRQ10	0x08
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) /* IRQ types */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) #define SB_IRQTYPE_8BIT		0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) #define SB_IRQTYPE_16BIT	0x02
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) #define SB_IRQTYPE_MPUIN	0x04
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) #define ALS4K_IRQTYPE_CR1E_DMA	0x20
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) /* DMA setting bitmap */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) #define SB_DMASETUP_DMA0	0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) #define SB_DMASETUP_DMA1	0x02
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) #define SB_DMASETUP_DMA3	0x08
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) #define SB_DMASETUP_DMA5	0x20
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) #define SB_DMASETUP_DMA6	0x40
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) #define SB_DMASETUP_DMA7	0x80
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) static inline void snd_sb_ack_8bit(struct snd_sb *chip)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) 	inb(SBP(chip, DATA_AVAIL));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) static inline void snd_sb_ack_16bit(struct snd_sb *chip)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) 	inb(SBP(chip, DATA_AVAIL_16));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) /* sb_common.c */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) int snd_sbdsp_command(struct snd_sb *chip, unsigned char val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) int snd_sbdsp_get_byte(struct snd_sb *chip);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) int snd_sbdsp_reset(struct snd_sb *chip);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) int snd_sbdsp_create(struct snd_card *card,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) 		     unsigned long port,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) 		     int irq,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) 		     irq_handler_t irq_handler,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) 		     int dma8, int dma16,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) 		     unsigned short hardware,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) 		     struct snd_sb **r_chip);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) /* sb_mixer.c */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) void snd_sbmixer_write(struct snd_sb *chip, unsigned char reg, unsigned char data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) unsigned char snd_sbmixer_read(struct snd_sb *chip, unsigned char reg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) int snd_sbmixer_new(struct snd_sb *chip);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) #ifdef CONFIG_PM
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) void snd_sbmixer_suspend(struct snd_sb *chip);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) void snd_sbmixer_resume(struct snd_sb *chip);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) /* sb8_init.c */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) int snd_sb8dsp_pcm(struct snd_sb *chip, int device);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) /* sb8.c */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) irqreturn_t snd_sb8dsp_interrupt(struct snd_sb *chip);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) int snd_sb8_playback_open(struct snd_pcm_substream *substream);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) int snd_sb8_capture_open(struct snd_pcm_substream *substream);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) int snd_sb8_playback_close(struct snd_pcm_substream *substream);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) int snd_sb8_capture_close(struct snd_pcm_substream *substream);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) /* midi8.c */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) irqreturn_t snd_sb8dsp_midi_interrupt(struct snd_sb *chip);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) int snd_sb8dsp_midi(struct snd_sb *chip, int device);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) /* sb16_init.c */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) int snd_sb16dsp_pcm(struct snd_sb *chip, int device);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) const struct snd_pcm_ops *snd_sb16dsp_get_pcm_ops(int direction);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) int snd_sb16dsp_configure(struct snd_sb *chip);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) /* sb16.c */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) irqreturn_t snd_sb16dsp_interrupt(int irq, void *dev_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) /* exported mixer stuffs */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) enum {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) 	SB_MIX_SINGLE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) 	SB_MIX_DOUBLE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) 	SB_MIX_INPUT_SW,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) 	SB_MIX_CAPTURE_PRO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) 	SB_MIX_CAPTURE_DT019X,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) 	SB_MIX_MONO_CAPTURE_ALS4K
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) #define SB_MIXVAL_DOUBLE(left_reg, right_reg, left_shift, right_shift, mask) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325)   ((left_reg) | ((right_reg) << 8) | ((left_shift) << 16) | ((right_shift) << 19) | ((mask) << 24))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) #define SB_MIXVAL_SINGLE(reg, shift, mask) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327)   ((reg) | ((shift) << 16) | ((mask) << 24))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) #define SB_MIXVAL_INPUT_SW(reg1, reg2, left_shift, right_shift) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329)   ((reg1) | ((reg2) << 8) | ((left_shift) << 16) | ((right_shift) << 24))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) int snd_sbmixer_add_ctl(struct snd_sb *chip, const char *name, int index, int type, unsigned long value);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) /* for ease of use */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) struct sbmix_elem {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) 	const char *name;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) 	int type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) 	unsigned long private_value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) #define SB_SINGLE(xname, reg, shift, mask) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) { .name = xname, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342)   .type = SB_MIX_SINGLE, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343)   .private_value = SB_MIXVAL_SINGLE(reg, shift, mask) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) #define SB_DOUBLE(xname, left_reg, right_reg, left_shift, right_shift, mask) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) { .name = xname, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347)   .type = SB_MIX_DOUBLE, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348)   .private_value = SB_MIXVAL_DOUBLE(left_reg, right_reg, left_shift, right_shift, mask) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) #define SB16_INPUT_SW(xname, reg1, reg2, left_shift, right_shift) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) { .name = xname, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352)   .type = SB_MIX_INPUT_SW, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353)   .private_value = SB_MIXVAL_INPUT_SW(reg1, reg2, left_shift, right_shift) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) static inline int snd_sbmixer_add_ctl_elem(struct snd_sb *chip, const struct sbmix_elem *c)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) 	return snd_sbmixer_add_ctl(chip, c->name, 0, c->type, c->private_value);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) #endif /* __SOUND_SB_H */