162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */
262306a36Sopenharmony_ci#ifndef __SOUND_SB_H
362306a36Sopenharmony_ci#define __SOUND_SB_H
462306a36Sopenharmony_ci
562306a36Sopenharmony_ci/*
662306a36Sopenharmony_ci *  Header file for SoundBlaster cards
762306a36Sopenharmony_ci *  Copyright (c) by Jaroslav Kysela <perex@perex.cz>
862306a36Sopenharmony_ci */
962306a36Sopenharmony_ci
1062306a36Sopenharmony_ci#include <sound/pcm.h>
1162306a36Sopenharmony_ci#include <sound/rawmidi.h>
1262306a36Sopenharmony_ci#include <linux/interrupt.h>
1362306a36Sopenharmony_ci#include <linux/io.h>
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_cienum sb_hw_type {
1662306a36Sopenharmony_ci	SB_HW_AUTO,
1762306a36Sopenharmony_ci	SB_HW_10,
1862306a36Sopenharmony_ci	SB_HW_20,
1962306a36Sopenharmony_ci	SB_HW_201,
2062306a36Sopenharmony_ci	SB_HW_PRO,
2162306a36Sopenharmony_ci	SB_HW_JAZZ16,		/* Media Vision Jazz16 */
2262306a36Sopenharmony_ci	SB_HW_16,
2362306a36Sopenharmony_ci	SB_HW_16CSP,		/* SB16 with CSP chip */
2462306a36Sopenharmony_ci	SB_HW_ALS100,		/* Avance Logic ALS100 chip */
2562306a36Sopenharmony_ci	SB_HW_ALS4000,		/* Avance Logic ALS4000 chip */
2662306a36Sopenharmony_ci	SB_HW_DT019X,		/* Diamond Tech. DT-019X / Avance Logic ALS-007 */
2762306a36Sopenharmony_ci	SB_HW_CS5530,		/* Cyrix/NatSemi 5530 VSA1 */
2862306a36Sopenharmony_ci};
2962306a36Sopenharmony_ci
3062306a36Sopenharmony_ci#define SB_OPEN_PCM			0x01
3162306a36Sopenharmony_ci#define SB_OPEN_MIDI_INPUT		0x02
3262306a36Sopenharmony_ci#define SB_OPEN_MIDI_OUTPUT		0x04
3362306a36Sopenharmony_ci#define SB_OPEN_MIDI_INPUT_TRIGGER	0x08
3462306a36Sopenharmony_ci#define SB_OPEN_MIDI_OUTPUT_TRIGGER	0x10
3562306a36Sopenharmony_ci
3662306a36Sopenharmony_ci#define SB_MODE_HALT		0x00
3762306a36Sopenharmony_ci#define SB_MODE_PLAYBACK_8	0x01
3862306a36Sopenharmony_ci#define SB_MODE_PLAYBACK_16	0x02
3962306a36Sopenharmony_ci#define SB_MODE_PLAYBACK	(SB_MODE_PLAYBACK_8 | SB_MODE_PLAYBACK_16)
4062306a36Sopenharmony_ci#define SB_MODE_CAPTURE_8	0x04
4162306a36Sopenharmony_ci#define SB_MODE_CAPTURE_16	0x08
4262306a36Sopenharmony_ci#define SB_MODE_CAPTURE		(SB_MODE_CAPTURE_8 | SB_MODE_CAPTURE_16)
4362306a36Sopenharmony_ci
4462306a36Sopenharmony_ci#define SB_RATE_LOCK_PLAYBACK	0x10
4562306a36Sopenharmony_ci#define SB_RATE_LOCK_CAPTURE	0x20
4662306a36Sopenharmony_ci#define SB_RATE_LOCK		(SB_RATE_LOCK_PLAYBACK | SB_RATE_LOCK_CAPTURE)
4762306a36Sopenharmony_ci
4862306a36Sopenharmony_ci#define SB_MPU_INPUT		1
4962306a36Sopenharmony_ci
5062306a36Sopenharmony_cistruct snd_sb {
5162306a36Sopenharmony_ci	unsigned long port;		/* base port of DSP chip */
5262306a36Sopenharmony_ci	struct resource *res_port;
5362306a36Sopenharmony_ci	unsigned long mpu_port;		/* MPU port for SB DSP 4.0+ */
5462306a36Sopenharmony_ci	int irq;			/* IRQ number of DSP chip */
5562306a36Sopenharmony_ci	int dma8;			/* 8-bit DMA */
5662306a36Sopenharmony_ci	int dma16;			/* 16-bit DMA */
5762306a36Sopenharmony_ci	unsigned short version;		/* version of DSP chip */
5862306a36Sopenharmony_ci	enum sb_hw_type hardware;	/* see to SB_HW_XXXX */
5962306a36Sopenharmony_ci
6062306a36Sopenharmony_ci	unsigned long alt_port;		/* alternate port (ALS4000) */
6162306a36Sopenharmony_ci	struct pci_dev *pci;		/* ALS4000 */
6262306a36Sopenharmony_ci
6362306a36Sopenharmony_ci	unsigned int open;		/* see to SB_OPEN_XXXX for sb8 */
6462306a36Sopenharmony_ci					/* also SNDRV_SB_CSP_MODE_XXX for sb16_csp */
6562306a36Sopenharmony_ci	unsigned int mode;		/* current mode of stream */
6662306a36Sopenharmony_ci	unsigned int force_mode16;	/* force 16-bit mode of streams */
6762306a36Sopenharmony_ci	unsigned int locked_rate;	/* sb16 duplex */
6862306a36Sopenharmony_ci	unsigned int playback_format;
6962306a36Sopenharmony_ci	unsigned int capture_format;
7062306a36Sopenharmony_ci	struct timer_list midi_timer;
7162306a36Sopenharmony_ci	unsigned int p_dma_size;
7262306a36Sopenharmony_ci	unsigned int p_period_size;
7362306a36Sopenharmony_ci	unsigned int c_dma_size;
7462306a36Sopenharmony_ci	unsigned int c_period_size;
7562306a36Sopenharmony_ci
7662306a36Sopenharmony_ci	spinlock_t mixer_lock;
7762306a36Sopenharmony_ci
7862306a36Sopenharmony_ci	char name[32];
7962306a36Sopenharmony_ci
8062306a36Sopenharmony_ci	void *csp; /* used only when CONFIG_SND_SB16_CSP is set */
8162306a36Sopenharmony_ci
8262306a36Sopenharmony_ci	struct snd_card *card;
8362306a36Sopenharmony_ci	struct snd_pcm *pcm;
8462306a36Sopenharmony_ci	struct snd_pcm_substream *playback_substream;
8562306a36Sopenharmony_ci	struct snd_pcm_substream *capture_substream;
8662306a36Sopenharmony_ci
8762306a36Sopenharmony_ci	struct snd_rawmidi *rmidi;
8862306a36Sopenharmony_ci	struct snd_rawmidi_substream *midi_substream_input;
8962306a36Sopenharmony_ci	struct snd_rawmidi_substream *midi_substream_output;
9062306a36Sopenharmony_ci	irq_handler_t rmidi_callback;
9162306a36Sopenharmony_ci
9262306a36Sopenharmony_ci	spinlock_t reg_lock;
9362306a36Sopenharmony_ci	spinlock_t open_lock;
9462306a36Sopenharmony_ci	spinlock_t midi_input_lock;
9562306a36Sopenharmony_ci
9662306a36Sopenharmony_ci	struct snd_info_entry *proc_entry;
9762306a36Sopenharmony_ci
9862306a36Sopenharmony_ci#ifdef CONFIG_PM
9962306a36Sopenharmony_ci	unsigned char saved_regs[0x20];
10062306a36Sopenharmony_ci#endif
10162306a36Sopenharmony_ci};
10262306a36Sopenharmony_ci
10362306a36Sopenharmony_ci/* I/O ports */
10462306a36Sopenharmony_ci
10562306a36Sopenharmony_ci#define SBP(chip, x)		((chip)->port + s_b_SB_##x)
10662306a36Sopenharmony_ci#define SBP1(port, x)		((port) + s_b_SB_##x)
10762306a36Sopenharmony_ci
10862306a36Sopenharmony_ci#define s_b_SB_RESET		0x6
10962306a36Sopenharmony_ci#define s_b_SB_READ		0xa
11062306a36Sopenharmony_ci#define s_b_SB_WRITE		0xc
11162306a36Sopenharmony_ci#define s_b_SB_COMMAND		0xc
11262306a36Sopenharmony_ci#define s_b_SB_STATUS		0xc
11362306a36Sopenharmony_ci#define s_b_SB_DATA_AVAIL	0xe
11462306a36Sopenharmony_ci#define s_b_SB_DATA_AVAIL_16 	0xf
11562306a36Sopenharmony_ci#define s_b_SB_MIXER_ADDR	0x4
11662306a36Sopenharmony_ci#define s_b_SB_MIXER_DATA	0x5
11762306a36Sopenharmony_ci#define s_b_SB_OPL3_LEFT	0x0
11862306a36Sopenharmony_ci#define s_b_SB_OPL3_RIGHT	0x2
11962306a36Sopenharmony_ci#define s_b_SB_OPL3_BOTH	0x8
12062306a36Sopenharmony_ci
12162306a36Sopenharmony_ci#define SB_DSP_OUTPUT		0x14
12262306a36Sopenharmony_ci#define SB_DSP_INPUT		0x24
12362306a36Sopenharmony_ci#define SB_DSP_BLOCK_SIZE	0x48
12462306a36Sopenharmony_ci#define SB_DSP_HI_OUTPUT	0x91
12562306a36Sopenharmony_ci#define SB_DSP_HI_INPUT		0x99
12662306a36Sopenharmony_ci#define SB_DSP_LO_OUTPUT_AUTO	0x1c
12762306a36Sopenharmony_ci#define SB_DSP_LO_INPUT_AUTO	0x2c
12862306a36Sopenharmony_ci#define SB_DSP_HI_OUTPUT_AUTO	0x90
12962306a36Sopenharmony_ci#define SB_DSP_HI_INPUT_AUTO	0x98
13062306a36Sopenharmony_ci#define SB_DSP_IMMED_INT	0xf2
13162306a36Sopenharmony_ci#define SB_DSP_GET_VERSION	0xe1
13262306a36Sopenharmony_ci#define SB_DSP_SPEAKER_ON	0xd1
13362306a36Sopenharmony_ci#define SB_DSP_SPEAKER_OFF	0xd3
13462306a36Sopenharmony_ci#define SB_DSP_DMA8_OFF		0xd0
13562306a36Sopenharmony_ci#define SB_DSP_DMA8_ON		0xd4
13662306a36Sopenharmony_ci#define SB_DSP_DMA8_EXIT	0xda
13762306a36Sopenharmony_ci#define SB_DSP_DMA16_OFF	0xd5
13862306a36Sopenharmony_ci#define SB_DSP_DMA16_ON		0xd6
13962306a36Sopenharmony_ci#define SB_DSP_DMA16_EXIT	0xd9
14062306a36Sopenharmony_ci#define SB_DSP_SAMPLE_RATE	0x40
14162306a36Sopenharmony_ci#define SB_DSP_SAMPLE_RATE_OUT	0x41
14262306a36Sopenharmony_ci#define SB_DSP_SAMPLE_RATE_IN	0x42
14362306a36Sopenharmony_ci#define SB_DSP_MONO_8BIT	0xa0
14462306a36Sopenharmony_ci#define SB_DSP_MONO_16BIT	0xa4
14562306a36Sopenharmony_ci#define SB_DSP_STEREO_8BIT	0xa8
14662306a36Sopenharmony_ci#define SB_DSP_STEREO_16BIT	0xac
14762306a36Sopenharmony_ci
14862306a36Sopenharmony_ci#define SB_DSP_MIDI_INPUT_IRQ	0x31
14962306a36Sopenharmony_ci#define SB_DSP_MIDI_UART_IRQ	0x35
15062306a36Sopenharmony_ci#define SB_DSP_MIDI_OUTPUT	0x38
15162306a36Sopenharmony_ci
15262306a36Sopenharmony_ci#define SB_DSP4_OUT8_AI		0xc6
15362306a36Sopenharmony_ci#define SB_DSP4_IN8_AI		0xce
15462306a36Sopenharmony_ci#define SB_DSP4_OUT16_AI	0xb6
15562306a36Sopenharmony_ci#define SB_DSP4_IN16_AI		0xbe
15662306a36Sopenharmony_ci#define SB_DSP4_MODE_UNS_MONO	0x00
15762306a36Sopenharmony_ci#define SB_DSP4_MODE_SIGN_MONO	0x10
15862306a36Sopenharmony_ci#define SB_DSP4_MODE_UNS_STEREO	0x20
15962306a36Sopenharmony_ci#define SB_DSP4_MODE_SIGN_STEREO 0x30
16062306a36Sopenharmony_ci
16162306a36Sopenharmony_ci#define SB_DSP4_OUTPUT		0x3c
16262306a36Sopenharmony_ci#define SB_DSP4_INPUT_LEFT	0x3d
16362306a36Sopenharmony_ci#define SB_DSP4_INPUT_RIGHT	0x3e
16462306a36Sopenharmony_ci
16562306a36Sopenharmony_ci/* registers for SB 2.0 mixer */
16662306a36Sopenharmony_ci#define SB_DSP20_MASTER_DEV	0x02
16762306a36Sopenharmony_ci#define SB_DSP20_PCM_DEV	0x0A
16862306a36Sopenharmony_ci#define SB_DSP20_CD_DEV		0x08
16962306a36Sopenharmony_ci#define SB_DSP20_FM_DEV		0x06
17062306a36Sopenharmony_ci
17162306a36Sopenharmony_ci/* registers for SB PRO mixer */
17262306a36Sopenharmony_ci#define SB_DSP_MASTER_DEV	0x22
17362306a36Sopenharmony_ci#define SB_DSP_PCM_DEV		0x04
17462306a36Sopenharmony_ci#define SB_DSP_LINE_DEV		0x2e
17562306a36Sopenharmony_ci#define SB_DSP_CD_DEV		0x28
17662306a36Sopenharmony_ci#define SB_DSP_FM_DEV		0x26
17762306a36Sopenharmony_ci#define SB_DSP_MIC_DEV		0x0a
17862306a36Sopenharmony_ci#define SB_DSP_CAPTURE_SOURCE	0x0c
17962306a36Sopenharmony_ci#define SB_DSP_CAPTURE_FILT	0x0c
18062306a36Sopenharmony_ci#define SB_DSP_PLAYBACK_FILT	0x0e
18162306a36Sopenharmony_ci#define SB_DSP_STEREO_SW	0x0e
18262306a36Sopenharmony_ci
18362306a36Sopenharmony_ci#define SB_DSP_MIXS_MIC0	0x00	/* same as MIC */
18462306a36Sopenharmony_ci#define SB_DSP_MIXS_CD		0x01
18562306a36Sopenharmony_ci#define SB_DSP_MIXS_MIC		0x02
18662306a36Sopenharmony_ci#define SB_DSP_MIXS_LINE	0x03
18762306a36Sopenharmony_ci
18862306a36Sopenharmony_ci/* registers (only for left channel) for SB 16 mixer */
18962306a36Sopenharmony_ci#define SB_DSP4_MASTER_DEV	0x30
19062306a36Sopenharmony_ci#define SB_DSP4_BASS_DEV	0x46
19162306a36Sopenharmony_ci#define SB_DSP4_TREBLE_DEV	0x44
19262306a36Sopenharmony_ci#define SB_DSP4_SYNTH_DEV	0x34
19362306a36Sopenharmony_ci#define SB_DSP4_PCM_DEV		0x32
19462306a36Sopenharmony_ci#define SB_DSP4_SPEAKER_DEV	0x3b
19562306a36Sopenharmony_ci#define SB_DSP4_LINE_DEV	0x38
19662306a36Sopenharmony_ci#define SB_DSP4_MIC_DEV		0x3a
19762306a36Sopenharmony_ci#define SB_DSP4_OUTPUT_SW	0x3c
19862306a36Sopenharmony_ci#define SB_DSP4_CD_DEV		0x36
19962306a36Sopenharmony_ci#define SB_DSP4_IGAIN_DEV	0x3f
20062306a36Sopenharmony_ci#define SB_DSP4_OGAIN_DEV	0x41
20162306a36Sopenharmony_ci#define SB_DSP4_MIC_AGC		0x43
20262306a36Sopenharmony_ci
20362306a36Sopenharmony_ci/* additional registers for SB 16 mixer */
20462306a36Sopenharmony_ci#define SB_DSP4_IRQSETUP	0x80
20562306a36Sopenharmony_ci#define SB_DSP4_DMASETUP	0x81
20662306a36Sopenharmony_ci#define SB_DSP4_IRQSTATUS	0x82
20762306a36Sopenharmony_ci#define SB_DSP4_MPUSETUP	0x84
20862306a36Sopenharmony_ci
20962306a36Sopenharmony_ci#define SB_DSP4_3DSE		0x90
21062306a36Sopenharmony_ci
21162306a36Sopenharmony_ci/* Registers for DT-019x / ALS-007 mixer */
21262306a36Sopenharmony_ci#define SB_DT019X_MASTER_DEV	0x62
21362306a36Sopenharmony_ci#define SB_DT019X_PCM_DEV	0x64
21462306a36Sopenharmony_ci#define SB_DT019X_SYNTH_DEV	0x66
21562306a36Sopenharmony_ci#define SB_DT019X_CD_DEV	0x68
21662306a36Sopenharmony_ci#define SB_DT019X_MIC_DEV	0x6a
21762306a36Sopenharmony_ci#define SB_DT019X_SPKR_DEV	0x6a
21862306a36Sopenharmony_ci#define SB_DT019X_LINE_DEV	0x6e
21962306a36Sopenharmony_ci#define SB_DT019X_OUTPUT_SW2	0x4c
22062306a36Sopenharmony_ci#define SB_DT019X_CAPTURE_SW	0x6c
22162306a36Sopenharmony_ci
22262306a36Sopenharmony_ci#define SB_DT019X_CAP_CD	0x02
22362306a36Sopenharmony_ci#define SB_DT019X_CAP_MIC	0x04
22462306a36Sopenharmony_ci#define SB_DT019X_CAP_LINE	0x06
22562306a36Sopenharmony_ci#define SB_DT019X_CAP_SYNTH	0x07
22662306a36Sopenharmony_ci#define SB_DT019X_CAP_MAIN	0x07
22762306a36Sopenharmony_ci
22862306a36Sopenharmony_ci#define SB_ALS4000_MONO_IO_CTRL	0x4b
22962306a36Sopenharmony_ci#define SB_ALS4000_OUT_MIXER_CTRL_2	0x4c
23062306a36Sopenharmony_ci#define SB_ALS4000_MIC_IN_GAIN	0x4d
23162306a36Sopenharmony_ci#define SB_ALS4000_ANALOG_REFRNC_VOLT_CTRL 0x4e
23262306a36Sopenharmony_ci#define SB_ALS4000_FMDAC	0x4f
23362306a36Sopenharmony_ci#define SB_ALS4000_3D_SND_FX	0x50
23462306a36Sopenharmony_ci#define SB_ALS4000_3D_TIME_DELAY	0x51
23562306a36Sopenharmony_ci#define SB_ALS4000_3D_AUTO_MUTE	0x52
23662306a36Sopenharmony_ci#define SB_ALS4000_ANALOG_BLOCK_CTRL 0x53
23762306a36Sopenharmony_ci#define SB_ALS4000_3D_DELAYLINE_PATTERN 0x54
23862306a36Sopenharmony_ci#define SB_ALS4000_CR3_CONFIGURATION	0xc3 /* bit 7 is Digital Loop Enable */
23962306a36Sopenharmony_ci#define SB_ALS4000_QSOUND	0xdb
24062306a36Sopenharmony_ci
24162306a36Sopenharmony_ci/* IRQ setting bitmap */
24262306a36Sopenharmony_ci#define SB_IRQSETUP_IRQ9	0x01
24362306a36Sopenharmony_ci#define SB_IRQSETUP_IRQ5	0x02
24462306a36Sopenharmony_ci#define SB_IRQSETUP_IRQ7	0x04
24562306a36Sopenharmony_ci#define SB_IRQSETUP_IRQ10	0x08
24662306a36Sopenharmony_ci
24762306a36Sopenharmony_ci/* IRQ types */
24862306a36Sopenharmony_ci#define SB_IRQTYPE_8BIT		0x01
24962306a36Sopenharmony_ci#define SB_IRQTYPE_16BIT	0x02
25062306a36Sopenharmony_ci#define SB_IRQTYPE_MPUIN	0x04
25162306a36Sopenharmony_ci#define ALS4K_IRQTYPE_CR1E_DMA	0x20
25262306a36Sopenharmony_ci
25362306a36Sopenharmony_ci/* DMA setting bitmap */
25462306a36Sopenharmony_ci#define SB_DMASETUP_DMA0	0x01
25562306a36Sopenharmony_ci#define SB_DMASETUP_DMA1	0x02
25662306a36Sopenharmony_ci#define SB_DMASETUP_DMA3	0x08
25762306a36Sopenharmony_ci#define SB_DMASETUP_DMA5	0x20
25862306a36Sopenharmony_ci#define SB_DMASETUP_DMA6	0x40
25962306a36Sopenharmony_ci#define SB_DMASETUP_DMA7	0x80
26062306a36Sopenharmony_ci
26162306a36Sopenharmony_ci/*
26262306a36Sopenharmony_ci *
26362306a36Sopenharmony_ci */
26462306a36Sopenharmony_ci
26562306a36Sopenharmony_cistatic inline void snd_sb_ack_8bit(struct snd_sb *chip)
26662306a36Sopenharmony_ci{
26762306a36Sopenharmony_ci	inb(SBP(chip, DATA_AVAIL));
26862306a36Sopenharmony_ci}
26962306a36Sopenharmony_ci
27062306a36Sopenharmony_cistatic inline void snd_sb_ack_16bit(struct snd_sb *chip)
27162306a36Sopenharmony_ci{
27262306a36Sopenharmony_ci	inb(SBP(chip, DATA_AVAIL_16));
27362306a36Sopenharmony_ci}
27462306a36Sopenharmony_ci
27562306a36Sopenharmony_ci/* sb_common.c */
27662306a36Sopenharmony_ciint snd_sbdsp_command(struct snd_sb *chip, unsigned char val);
27762306a36Sopenharmony_ciint snd_sbdsp_get_byte(struct snd_sb *chip);
27862306a36Sopenharmony_ciint snd_sbdsp_reset(struct snd_sb *chip);
27962306a36Sopenharmony_ciint snd_sbdsp_create(struct snd_card *card,
28062306a36Sopenharmony_ci		     unsigned long port,
28162306a36Sopenharmony_ci		     int irq,
28262306a36Sopenharmony_ci		     irq_handler_t irq_handler,
28362306a36Sopenharmony_ci		     int dma8, int dma16,
28462306a36Sopenharmony_ci		     unsigned short hardware,
28562306a36Sopenharmony_ci		     struct snd_sb **r_chip);
28662306a36Sopenharmony_ci/* sb_mixer.c */
28762306a36Sopenharmony_civoid snd_sbmixer_write(struct snd_sb *chip, unsigned char reg, unsigned char data);
28862306a36Sopenharmony_ciunsigned char snd_sbmixer_read(struct snd_sb *chip, unsigned char reg);
28962306a36Sopenharmony_ciint snd_sbmixer_new(struct snd_sb *chip);
29062306a36Sopenharmony_ci#ifdef CONFIG_PM
29162306a36Sopenharmony_civoid snd_sbmixer_suspend(struct snd_sb *chip);
29262306a36Sopenharmony_civoid snd_sbmixer_resume(struct snd_sb *chip);
29362306a36Sopenharmony_ci#endif
29462306a36Sopenharmony_ci
29562306a36Sopenharmony_ci/* sb8_init.c */
29662306a36Sopenharmony_ciint snd_sb8dsp_pcm(struct snd_sb *chip, int device);
29762306a36Sopenharmony_ci/* sb8.c */
29862306a36Sopenharmony_ciirqreturn_t snd_sb8dsp_interrupt(struct snd_sb *chip);
29962306a36Sopenharmony_ciint snd_sb8_playback_open(struct snd_pcm_substream *substream);
30062306a36Sopenharmony_ciint snd_sb8_capture_open(struct snd_pcm_substream *substream);
30162306a36Sopenharmony_ciint snd_sb8_playback_close(struct snd_pcm_substream *substream);
30262306a36Sopenharmony_ciint snd_sb8_capture_close(struct snd_pcm_substream *substream);
30362306a36Sopenharmony_ci/* midi8.c */
30462306a36Sopenharmony_ciirqreturn_t snd_sb8dsp_midi_interrupt(struct snd_sb *chip);
30562306a36Sopenharmony_ciint snd_sb8dsp_midi(struct snd_sb *chip, int device);
30662306a36Sopenharmony_ci
30762306a36Sopenharmony_ci/* sb16_init.c */
30862306a36Sopenharmony_ciint snd_sb16dsp_pcm(struct snd_sb *chip, int device);
30962306a36Sopenharmony_ciconst struct snd_pcm_ops *snd_sb16dsp_get_pcm_ops(int direction);
31062306a36Sopenharmony_ciint snd_sb16dsp_configure(struct snd_sb *chip);
31162306a36Sopenharmony_ci/* sb16.c */
31262306a36Sopenharmony_ciirqreturn_t snd_sb16dsp_interrupt(int irq, void *dev_id);
31362306a36Sopenharmony_ci
31462306a36Sopenharmony_ci/* exported mixer stuffs */
31562306a36Sopenharmony_cienum {
31662306a36Sopenharmony_ci	SB_MIX_SINGLE,
31762306a36Sopenharmony_ci	SB_MIX_DOUBLE,
31862306a36Sopenharmony_ci	SB_MIX_INPUT_SW,
31962306a36Sopenharmony_ci	SB_MIX_CAPTURE_PRO,
32062306a36Sopenharmony_ci	SB_MIX_CAPTURE_DT019X,
32162306a36Sopenharmony_ci	SB_MIX_MONO_CAPTURE_ALS4K
32262306a36Sopenharmony_ci};
32362306a36Sopenharmony_ci
32462306a36Sopenharmony_ci#define SB_MIXVAL_DOUBLE(left_reg, right_reg, left_shift, right_shift, mask) \
32562306a36Sopenharmony_ci  ((left_reg) | ((right_reg) << 8) | ((left_shift) << 16) | ((right_shift) << 19) | ((mask) << 24))
32662306a36Sopenharmony_ci#define SB_MIXVAL_SINGLE(reg, shift, mask) \
32762306a36Sopenharmony_ci  ((reg) | ((shift) << 16) | ((mask) << 24))
32862306a36Sopenharmony_ci#define SB_MIXVAL_INPUT_SW(reg1, reg2, left_shift, right_shift) \
32962306a36Sopenharmony_ci  ((reg1) | ((reg2) << 8) | ((left_shift) << 16) | ((right_shift) << 24))
33062306a36Sopenharmony_ci
33162306a36Sopenharmony_ciint snd_sbmixer_add_ctl(struct snd_sb *chip, const char *name, int index, int type, unsigned long value);
33262306a36Sopenharmony_ci
33362306a36Sopenharmony_ci/* for ease of use */
33462306a36Sopenharmony_cistruct sbmix_elem {
33562306a36Sopenharmony_ci	const char *name;
33662306a36Sopenharmony_ci	int type;
33762306a36Sopenharmony_ci	unsigned long private_value;
33862306a36Sopenharmony_ci};
33962306a36Sopenharmony_ci
34062306a36Sopenharmony_ci#define SB_SINGLE(xname, reg, shift, mask) \
34162306a36Sopenharmony_ci{ .name = xname, \
34262306a36Sopenharmony_ci  .type = SB_MIX_SINGLE, \
34362306a36Sopenharmony_ci  .private_value = SB_MIXVAL_SINGLE(reg, shift, mask) }
34462306a36Sopenharmony_ci
34562306a36Sopenharmony_ci#define SB_DOUBLE(xname, left_reg, right_reg, left_shift, right_shift, mask) \
34662306a36Sopenharmony_ci{ .name = xname, \
34762306a36Sopenharmony_ci  .type = SB_MIX_DOUBLE, \
34862306a36Sopenharmony_ci  .private_value = SB_MIXVAL_DOUBLE(left_reg, right_reg, left_shift, right_shift, mask) }
34962306a36Sopenharmony_ci
35062306a36Sopenharmony_ci#define SB16_INPUT_SW(xname, reg1, reg2, left_shift, right_shift) \
35162306a36Sopenharmony_ci{ .name = xname, \
35262306a36Sopenharmony_ci  .type = SB_MIX_INPUT_SW, \
35362306a36Sopenharmony_ci  .private_value = SB_MIXVAL_INPUT_SW(reg1, reg2, left_shift, right_shift) }
35462306a36Sopenharmony_ci
35562306a36Sopenharmony_cistatic inline int snd_sbmixer_add_ctl_elem(struct snd_sb *chip, const struct sbmix_elem *c)
35662306a36Sopenharmony_ci{
35762306a36Sopenharmony_ci	return snd_sbmixer_add_ctl(chip, c->name, 0, c->type, c->private_value);
35862306a36Sopenharmony_ci}
35962306a36Sopenharmony_ci
36062306a36Sopenharmony_ci#endif /* __SOUND_SB_H */
361