summaryrefslogtreecommitdiffstats
path: root/sound/oss/sb.h
blob: bb1d18709b3649008203828cc22c2f793ce3be9f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
/* SPDX-License-Identifier: GPL-2.0 */
#define DSP_RESET	(devc->base + 0x6)
#define DSP_READ	(devc->base + 0xA)
#define DSP_WRITE	(devc->base + 0xC)
#define DSP_COMMAND	(devc->base + 0xC)
#define DSP_STATUS	(devc->base + 0xC)
#define DSP_DATA_AVAIL	(devc->base + 0xE)
#define DSP_DATA_AVL16	(devc->base + 0xF)
#define MIXER_ADDR	(devc->base + 0x4)
#define MIXER_DATA	(devc->base + 0x5)
#define OPL3_LEFT	(devc->base + 0x0)
#define OPL3_RIGHT	(devc->base + 0x2)
#define OPL3_BOTH	(devc->base + 0x8)
/* DSP Commands */

#define DSP_CMD_SPKON		0xD1
#define DSP_CMD_SPKOFF		0xD3
#define DSP_CMD_DMAON		0xD0
#define DSP_CMD_DMAOFF		0xD4

#define IMODE_NONE		0
#define IMODE_OUTPUT		PCM_ENABLE_OUTPUT
#define IMODE_INPUT		PCM_ENABLE_INPUT
#define IMODE_INIT		3
#define IMODE_MIDI		4

#define NORMAL_MIDI	0
#define UART_MIDI	1


/*
 * Device models
 */
#define MDL_NONE	0
#define MDL_SB1		1	/* SB1.0 or 1.5 */
#define MDL_SB2		2	/* SB2.0 */
#define MDL_SB201	3	/* SB2.01 */
#define MDL_SBPRO	4	/* SB Pro */
#define MDL_SB16	5	/* SB16/32/AWE */
#define MDL_SBPNP 	6	/* SB16/32/AWE PnP */
#define MDL_JAZZ	10	/* Media Vision Jazz16 */
#define MDL_SMW		11	/* Logitech SoundMan Wave (Jazz16) */
#define MDL_ESS		12	/* ESS ES688 and ES1688 */
#define MDL_AZTECH	13	/* Aztech Sound Galaxy family */
#define MDL_ES1868MIDI	14	/* MIDI port of ESS1868 */
#define MDL_AEDSP	15	/* Audio Excel DSP 16 */
#define MDL_ESSPCI	16	/* ESS PCI card */
#define MDL_YMPCI	17	/* Yamaha PCI sb in emulation */

#define SUBMDL_ALS007	42	/* ALS-007 differs from SB16 only in mixer */
				/* register assignment */
#define SUBMDL_ALS100	43	/* ALS-100 allows sampling rates of up */
				/* to 48kHz */
				
/*
 * Config flags
 */
#define SB_NO_MIDI	0x00000001
#define SB_NO_MIXER	0x00000002
#define SB_NO_AUDIO	0x00000004
#define SB_NO_RECORDING	0x00000008 /* No audio recording */
#define SB_MIDI_ONLY	(SB_NO_AUDIO|SB_NO_MIXER)
#define SB_PCI_IRQ	0x00000010 /* PCI shared IRQ */

struct mixer_def {
	unsigned int regno: 8;
	unsigned int bitoffs:4;
	unsigned int nbits:4;
};

typedef struct mixer_def mixer_tab[32][2];
typedef struct mixer_def mixer_ent;

struct sb_module_options
{
	int  esstype;	/* ESS chip type */
	int  acer;	/* Do acer notebook init? */
	int  sm_games;	/* Logitech soundman games? */
};

typedef struct sb_devc {
	   int dev;

	/* Hardware parameters */
	   int *osp;
	   int minor, major;
	   int type;
	   int model, submodel;
	   int caps;
#	define SBCAP_STEREO	0x00000001
#	define SBCAP_16BITS	0x00000002

	/* Hardware resources */
	   int base;
	   int irq;
	   int dma8, dma16;
	   
	   int pcibase;		/* For ESS Maestro etc */

	/* State variables */
 	   int opened;
	/* new audio fields for full duplex support */
	   int fullduplex;
	   int duplex;
	   int speed, bits, channels;
	   volatile int irq_ok;
	   volatile int intr_active, irq_mode;
	/* duplicate audio fields for full duplex support */
	   volatile int intr_active_16, irq_mode_16;

	/* Mixer fields */
	   int *levels;
	   mixer_tab *iomap;
	   size_t iomap_sz; /* number or records in the iomap table */
	   int mixer_caps, recmask, outmask, supported_devices;
	   int supported_rec_devices, supported_out_devices;
	   int my_mixerdev;
	   int sbmixnum;

	/* Audio fields */
	   unsigned long trg_buf;
	   int      trigger_bits;
	   int      trg_bytes;
	   int      trg_intrflag;
	   int      trg_restart;
	/* duplicate audio fields for full duplex support */
	   unsigned long trg_buf_16;
	   int      trigger_bits_16;
	   int      trg_bytes_16;
	   int      trg_intrflag_16;
	   int      trg_restart_16;

	   unsigned char tconst;
	
	/* MIDI fields */
	   int my_mididev;
	   int input_opened;
	   int midi_broken;
	   void (*midi_input_intr) (int dev, unsigned char data);
	   void *midi_irq_cookie;		/* IRQ cookie for the midi */

	   spinlock_t lock;

	   struct sb_module_options sbmo;	/* Module options */

	} sb_devc;
	
/*
 *	PCI card types
 */

#define	SB_PCI_ESSMAESTRO	1	/* ESS Maestro Legacy */
#define	SB_PCI_YAMAHA		2	/* Yamaha Legacy */

/* 
 *	Functions
 */
 
int sb_dsp_command (sb_devc *devc, unsigned char val);
int sb_dsp_get_byte(sb_devc * devc);
int sb_dsp_reset (sb_devc *devc);
void sb_setmixer (sb_devc *devc, unsigned int port, unsigned int value);
unsigned int sb_getmixer (sb_devc *devc, unsigned int port);
int sb_dsp_detect (struct address_info *hw_config, int pci, int pciio, struct sb_module_options *sbmo);
int sb_dsp_init (struct address_info *hw_config, struct module *owner);
void sb_dsp_unload(struct address_info *hw_config, int sbmpu);
int sb_mixer_init(sb_devc *devc, struct module *owner);
void sb_mixer_unload(sb_devc *devc);
void sb_mixer_set_stereo (sb_devc *devc, int mode);
void smw_mixer_init(sb_devc *devc);
void sb_dsp_midi_init (sb_devc *devc, struct module *owner);
void sb_audio_init (sb_devc *devc, char *name, struct module *owner);
void sb_midi_interrupt (sb_devc *devc);
void sb_chgmixer (sb_devc * devc, unsigned int reg, unsigned int mask, unsigned int val);
int sb_common_mixer_set(sb_devc * devc, int dev, int left, int right);

int sb_audio_open(int dev, int mode);
void sb_audio_close(int dev);

/*	From sb_common.c */
void sb_dsp_disable_midi(int port);
int probe_sbmpu (struct address_info *hw_config, struct module *owner);
void unload_sbmpu (struct address_info *hw_config);

void unload_sb16(struct address_info *hw_info);
void unload_sb16midi(struct address_info *hw_info);