xref: /OK3568_Linux_fs/kernel/sound/pci/ymfpci/ymfpci.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-or-later */
2*4882a593Smuzhiyun #ifndef __SOUND_YMFPCI_H
3*4882a593Smuzhiyun #define __SOUND_YMFPCI_H
4*4882a593Smuzhiyun 
5*4882a593Smuzhiyun /*
6*4882a593Smuzhiyun  *  Copyright (c) by Jaroslav Kysela <perex@perex.cz>
7*4882a593Smuzhiyun  *  Definitions for Yahama YMF724/740/744/754 chips
8*4882a593Smuzhiyun  */
9*4882a593Smuzhiyun 
10*4882a593Smuzhiyun #include <sound/pcm.h>
11*4882a593Smuzhiyun #include <sound/rawmidi.h>
12*4882a593Smuzhiyun #include <sound/ac97_codec.h>
13*4882a593Smuzhiyun #include <sound/timer.h>
14*4882a593Smuzhiyun #include <linux/gameport.h>
15*4882a593Smuzhiyun 
16*4882a593Smuzhiyun /*
17*4882a593Smuzhiyun  *  Direct registers
18*4882a593Smuzhiyun  */
19*4882a593Smuzhiyun 
20*4882a593Smuzhiyun #define YMFREG(chip, reg)		(chip->port + YDSXGR_##reg)
21*4882a593Smuzhiyun 
22*4882a593Smuzhiyun #define	YDSXGR_INTFLAG			0x0004
23*4882a593Smuzhiyun #define	YDSXGR_ACTIVITY			0x0006
24*4882a593Smuzhiyun #define	YDSXGR_GLOBALCTRL		0x0008
25*4882a593Smuzhiyun #define	YDSXGR_ZVCTRL			0x000A
26*4882a593Smuzhiyun #define	YDSXGR_TIMERCTRL		0x0010
27*4882a593Smuzhiyun #define	YDSXGR_TIMERCOUNT		0x0012
28*4882a593Smuzhiyun #define	YDSXGR_SPDIFOUTCTRL		0x0018
29*4882a593Smuzhiyun #define	YDSXGR_SPDIFOUTSTATUS		0x001C
30*4882a593Smuzhiyun #define	YDSXGR_EEPROMCTRL		0x0020
31*4882a593Smuzhiyun #define	YDSXGR_SPDIFINCTRL		0x0034
32*4882a593Smuzhiyun #define	YDSXGR_SPDIFINSTATUS		0x0038
33*4882a593Smuzhiyun #define	YDSXGR_DSPPROGRAMDL		0x0048
34*4882a593Smuzhiyun #define	YDSXGR_DLCNTRL			0x004C
35*4882a593Smuzhiyun #define	YDSXGR_GPIOININTFLAG		0x0050
36*4882a593Smuzhiyun #define	YDSXGR_GPIOININTENABLE		0x0052
37*4882a593Smuzhiyun #define	YDSXGR_GPIOINSTATUS		0x0054
38*4882a593Smuzhiyun #define	YDSXGR_GPIOOUTCTRL		0x0056
39*4882a593Smuzhiyun #define	YDSXGR_GPIOFUNCENABLE		0x0058
40*4882a593Smuzhiyun #define	YDSXGR_GPIOTYPECONFIG		0x005A
41*4882a593Smuzhiyun #define	YDSXGR_AC97CMDDATA		0x0060
42*4882a593Smuzhiyun #define	YDSXGR_AC97CMDADR		0x0062
43*4882a593Smuzhiyun #define	YDSXGR_PRISTATUSDATA		0x0064
44*4882a593Smuzhiyun #define	YDSXGR_PRISTATUSADR		0x0066
45*4882a593Smuzhiyun #define	YDSXGR_SECSTATUSDATA		0x0068
46*4882a593Smuzhiyun #define	YDSXGR_SECSTATUSADR		0x006A
47*4882a593Smuzhiyun #define	YDSXGR_SECCONFIG		0x0070
48*4882a593Smuzhiyun #define	YDSXGR_LEGACYOUTVOL		0x0080
49*4882a593Smuzhiyun #define	YDSXGR_LEGACYOUTVOLL		0x0080
50*4882a593Smuzhiyun #define	YDSXGR_LEGACYOUTVOLR		0x0082
51*4882a593Smuzhiyun #define	YDSXGR_NATIVEDACOUTVOL		0x0084
52*4882a593Smuzhiyun #define	YDSXGR_NATIVEDACOUTVOLL		0x0084
53*4882a593Smuzhiyun #define	YDSXGR_NATIVEDACOUTVOLR		0x0086
54*4882a593Smuzhiyun #define	YDSXGR_ZVOUTVOL			0x0088
55*4882a593Smuzhiyun #define	YDSXGR_ZVOUTVOLL		0x0088
56*4882a593Smuzhiyun #define	YDSXGR_ZVOUTVOLR		0x008A
57*4882a593Smuzhiyun #define	YDSXGR_SECADCOUTVOL		0x008C
58*4882a593Smuzhiyun #define	YDSXGR_SECADCOUTVOLL		0x008C
59*4882a593Smuzhiyun #define	YDSXGR_SECADCOUTVOLR		0x008E
60*4882a593Smuzhiyun #define	YDSXGR_PRIADCOUTVOL		0x0090
61*4882a593Smuzhiyun #define	YDSXGR_PRIADCOUTVOLL		0x0090
62*4882a593Smuzhiyun #define	YDSXGR_PRIADCOUTVOLR		0x0092
63*4882a593Smuzhiyun #define	YDSXGR_LEGACYLOOPVOL		0x0094
64*4882a593Smuzhiyun #define	YDSXGR_LEGACYLOOPVOLL		0x0094
65*4882a593Smuzhiyun #define	YDSXGR_LEGACYLOOPVOLR		0x0096
66*4882a593Smuzhiyun #define	YDSXGR_NATIVEDACLOOPVOL		0x0098
67*4882a593Smuzhiyun #define	YDSXGR_NATIVEDACLOOPVOLL	0x0098
68*4882a593Smuzhiyun #define	YDSXGR_NATIVEDACLOOPVOLR	0x009A
69*4882a593Smuzhiyun #define	YDSXGR_ZVLOOPVOL		0x009C
70*4882a593Smuzhiyun #define	YDSXGR_ZVLOOPVOLL		0x009E
71*4882a593Smuzhiyun #define	YDSXGR_ZVLOOPVOLR		0x009E
72*4882a593Smuzhiyun #define	YDSXGR_SECADCLOOPVOL		0x00A0
73*4882a593Smuzhiyun #define	YDSXGR_SECADCLOOPVOLL		0x00A0
74*4882a593Smuzhiyun #define	YDSXGR_SECADCLOOPVOLR		0x00A2
75*4882a593Smuzhiyun #define	YDSXGR_PRIADCLOOPVOL		0x00A4
76*4882a593Smuzhiyun #define	YDSXGR_PRIADCLOOPVOLL		0x00A4
77*4882a593Smuzhiyun #define	YDSXGR_PRIADCLOOPVOLR		0x00A6
78*4882a593Smuzhiyun #define	YDSXGR_NATIVEADCINVOL		0x00A8
79*4882a593Smuzhiyun #define	YDSXGR_NATIVEADCINVOLL		0x00A8
80*4882a593Smuzhiyun #define	YDSXGR_NATIVEADCINVOLR		0x00AA
81*4882a593Smuzhiyun #define	YDSXGR_NATIVEDACINVOL		0x00AC
82*4882a593Smuzhiyun #define	YDSXGR_NATIVEDACINVOLL		0x00AC
83*4882a593Smuzhiyun #define	YDSXGR_NATIVEDACINVOLR		0x00AE
84*4882a593Smuzhiyun #define	YDSXGR_BUF441OUTVOL		0x00B0
85*4882a593Smuzhiyun #define	YDSXGR_BUF441OUTVOLL		0x00B0
86*4882a593Smuzhiyun #define	YDSXGR_BUF441OUTVOLR		0x00B2
87*4882a593Smuzhiyun #define	YDSXGR_BUF441LOOPVOL		0x00B4
88*4882a593Smuzhiyun #define	YDSXGR_BUF441LOOPVOLL		0x00B4
89*4882a593Smuzhiyun #define	YDSXGR_BUF441LOOPVOLR		0x00B6
90*4882a593Smuzhiyun #define	YDSXGR_SPDIFOUTVOL		0x00B8
91*4882a593Smuzhiyun #define	YDSXGR_SPDIFOUTVOLL		0x00B8
92*4882a593Smuzhiyun #define	YDSXGR_SPDIFOUTVOLR		0x00BA
93*4882a593Smuzhiyun #define	YDSXGR_SPDIFLOOPVOL		0x00BC
94*4882a593Smuzhiyun #define	YDSXGR_SPDIFLOOPVOLL		0x00BC
95*4882a593Smuzhiyun #define	YDSXGR_SPDIFLOOPVOLR		0x00BE
96*4882a593Smuzhiyun #define	YDSXGR_ADCSLOTSR		0x00C0
97*4882a593Smuzhiyun #define	YDSXGR_RECSLOTSR		0x00C4
98*4882a593Smuzhiyun #define	YDSXGR_ADCFORMAT		0x00C8
99*4882a593Smuzhiyun #define	YDSXGR_RECFORMAT		0x00CC
100*4882a593Smuzhiyun #define	YDSXGR_P44SLOTSR		0x00D0
101*4882a593Smuzhiyun #define	YDSXGR_STATUS			0x0100
102*4882a593Smuzhiyun #define	YDSXGR_CTRLSELECT		0x0104
103*4882a593Smuzhiyun #define	YDSXGR_MODE			0x0108
104*4882a593Smuzhiyun #define	YDSXGR_SAMPLECOUNT		0x010C
105*4882a593Smuzhiyun #define	YDSXGR_NUMOFSAMPLES		0x0110
106*4882a593Smuzhiyun #define	YDSXGR_CONFIG			0x0114
107*4882a593Smuzhiyun #define	YDSXGR_PLAYCTRLSIZE		0x0140
108*4882a593Smuzhiyun #define	YDSXGR_RECCTRLSIZE		0x0144
109*4882a593Smuzhiyun #define	YDSXGR_EFFCTRLSIZE		0x0148
110*4882a593Smuzhiyun #define	YDSXGR_WORKSIZE			0x014C
111*4882a593Smuzhiyun #define	YDSXGR_MAPOFREC			0x0150
112*4882a593Smuzhiyun #define	YDSXGR_MAPOFEFFECT		0x0154
113*4882a593Smuzhiyun #define	YDSXGR_PLAYCTRLBASE		0x0158
114*4882a593Smuzhiyun #define	YDSXGR_RECCTRLBASE		0x015C
115*4882a593Smuzhiyun #define	YDSXGR_EFFCTRLBASE		0x0160
116*4882a593Smuzhiyun #define	YDSXGR_WORKBASE			0x0164
117*4882a593Smuzhiyun #define	YDSXGR_DSPINSTRAM		0x1000
118*4882a593Smuzhiyun #define	YDSXGR_CTRLINSTRAM		0x4000
119*4882a593Smuzhiyun 
120*4882a593Smuzhiyun #define YDSXG_AC97READCMD		0x8000
121*4882a593Smuzhiyun #define YDSXG_AC97WRITECMD		0x0000
122*4882a593Smuzhiyun 
123*4882a593Smuzhiyun #define PCIR_DSXG_LEGACY		0x40
124*4882a593Smuzhiyun #define PCIR_DSXG_ELEGACY		0x42
125*4882a593Smuzhiyun #define PCIR_DSXG_CTRL			0x48
126*4882a593Smuzhiyun #define PCIR_DSXG_PWRCTRL1		0x4a
127*4882a593Smuzhiyun #define PCIR_DSXG_PWRCTRL2		0x4e
128*4882a593Smuzhiyun #define PCIR_DSXG_FMBASE		0x60
129*4882a593Smuzhiyun #define PCIR_DSXG_SBBASE		0x62
130*4882a593Smuzhiyun #define PCIR_DSXG_MPU401BASE		0x64
131*4882a593Smuzhiyun #define PCIR_DSXG_JOYBASE		0x66
132*4882a593Smuzhiyun 
133*4882a593Smuzhiyun #define YDSXG_DSPLENGTH			0x0080
134*4882a593Smuzhiyun #define YDSXG_CTRLLENGTH		0x3000
135*4882a593Smuzhiyun 
136*4882a593Smuzhiyun #define YDSXG_DEFAULT_WORK_SIZE		0x0400
137*4882a593Smuzhiyun 
138*4882a593Smuzhiyun #define YDSXG_PLAYBACK_VOICES		64
139*4882a593Smuzhiyun #define YDSXG_CAPTURE_VOICES		2
140*4882a593Smuzhiyun #define YDSXG_EFFECT_VOICES		5
141*4882a593Smuzhiyun 
142*4882a593Smuzhiyun #define YMFPCI_LEGACY_SBEN	(1 << 0)	/* soundblaster enable */
143*4882a593Smuzhiyun #define YMFPCI_LEGACY_FMEN	(1 << 1)	/* OPL3 enable */
144*4882a593Smuzhiyun #define YMFPCI_LEGACY_JPEN	(1 << 2)	/* joystick enable */
145*4882a593Smuzhiyun #define YMFPCI_LEGACY_MEN	(1 << 3)	/* MPU401 enable */
146*4882a593Smuzhiyun #define YMFPCI_LEGACY_MIEN	(1 << 4)	/* MPU RX irq enable */
147*4882a593Smuzhiyun #define YMFPCI_LEGACY_IOBITS	(1 << 5)	/* i/o bits range, 0 = 16bit, 1 =10bit */
148*4882a593Smuzhiyun #define YMFPCI_LEGACY_SDMA	(3 << 6)	/* SB DMA select */
149*4882a593Smuzhiyun #define YMFPCI_LEGACY_SBIRQ	(7 << 8)	/* SB IRQ select */
150*4882a593Smuzhiyun #define YMFPCI_LEGACY_MPUIRQ	(7 << 11)	/* MPU IRQ select */
151*4882a593Smuzhiyun #define YMFPCI_LEGACY_SIEN	(1 << 14)	/* serialized IRQ */
152*4882a593Smuzhiyun #define YMFPCI_LEGACY_LAD	(1 << 15)	/* legacy audio disable */
153*4882a593Smuzhiyun 
154*4882a593Smuzhiyun #define YMFPCI_LEGACY2_FMIO	(3 << 0)	/* OPL3 i/o address (724/740) */
155*4882a593Smuzhiyun #define YMFPCI_LEGACY2_SBIO	(3 << 2)	/* SB i/o address (724/740) */
156*4882a593Smuzhiyun #define YMFPCI_LEGACY2_MPUIO	(3 << 4)	/* MPU401 i/o address (724/740) */
157*4882a593Smuzhiyun #define YMFPCI_LEGACY2_JSIO	(3 << 6)	/* joystick i/o address (724/740) */
158*4882a593Smuzhiyun #define YMFPCI_LEGACY2_MAIM	(1 << 8)	/* MPU401 ack intr mask */
159*4882a593Smuzhiyun #define YMFPCI_LEGACY2_SMOD	(3 << 11)	/* SB DMA mode */
160*4882a593Smuzhiyun #define YMFPCI_LEGACY2_SBVER	(3 << 13)	/* SB version select */
161*4882a593Smuzhiyun #define YMFPCI_LEGACY2_IMOD	(1 << 15)	/* legacy IRQ mode */
162*4882a593Smuzhiyun /* SIEN:IMOD 0:0 = legacy irq, 0:1 = INTA, 1:0 = serialized IRQ */
163*4882a593Smuzhiyun 
164*4882a593Smuzhiyun #if IS_REACHABLE(CONFIG_GAMEPORT)
165*4882a593Smuzhiyun #define SUPPORT_JOYSTICK
166*4882a593Smuzhiyun #endif
167*4882a593Smuzhiyun 
168*4882a593Smuzhiyun /*
169*4882a593Smuzhiyun  *
170*4882a593Smuzhiyun  */
171*4882a593Smuzhiyun 
172*4882a593Smuzhiyun struct snd_ymfpci_playback_bank {
173*4882a593Smuzhiyun 	__le32 format;
174*4882a593Smuzhiyun 	__le32 loop_default;
175*4882a593Smuzhiyun 	__le32 base;			/* 32-bit address */
176*4882a593Smuzhiyun 	__le32 loop_start;		/* 32-bit offset */
177*4882a593Smuzhiyun 	__le32 loop_end;		/* 32-bit offset */
178*4882a593Smuzhiyun 	__le32 loop_frac;		/* 8-bit fraction - loop_start */
179*4882a593Smuzhiyun 	__le32 delta_end;		/* pitch delta end */
180*4882a593Smuzhiyun 	__le32 lpfK_end;
181*4882a593Smuzhiyun 	__le32 eg_gain_end;
182*4882a593Smuzhiyun 	__le32 left_gain_end;
183*4882a593Smuzhiyun 	__le32 right_gain_end;
184*4882a593Smuzhiyun 	__le32 eff1_gain_end;
185*4882a593Smuzhiyun 	__le32 eff2_gain_end;
186*4882a593Smuzhiyun 	__le32 eff3_gain_end;
187*4882a593Smuzhiyun 	__le32 lpfQ;
188*4882a593Smuzhiyun 	__le32 status;
189*4882a593Smuzhiyun 	__le32 num_of_frames;
190*4882a593Smuzhiyun 	__le32 loop_count;
191*4882a593Smuzhiyun 	__le32 start;
192*4882a593Smuzhiyun 	__le32 start_frac;
193*4882a593Smuzhiyun 	__le32 delta;
194*4882a593Smuzhiyun 	__le32 lpfK;
195*4882a593Smuzhiyun 	__le32 eg_gain;
196*4882a593Smuzhiyun 	__le32 left_gain;
197*4882a593Smuzhiyun 	__le32 right_gain;
198*4882a593Smuzhiyun 	__le32 eff1_gain;
199*4882a593Smuzhiyun 	__le32 eff2_gain;
200*4882a593Smuzhiyun 	__le32 eff3_gain;
201*4882a593Smuzhiyun 	__le32 lpfD1;
202*4882a593Smuzhiyun 	__le32 lpfD2;
203*4882a593Smuzhiyun  };
204*4882a593Smuzhiyun 
205*4882a593Smuzhiyun struct snd_ymfpci_capture_bank {
206*4882a593Smuzhiyun 	__le32 base;			/* 32-bit address */
207*4882a593Smuzhiyun 	__le32 loop_end;		/* 32-bit offset */
208*4882a593Smuzhiyun 	__le32 start;			/* 32-bit offset */
209*4882a593Smuzhiyun 	__le32 num_of_loops;		/* counter */
210*4882a593Smuzhiyun };
211*4882a593Smuzhiyun 
212*4882a593Smuzhiyun struct snd_ymfpci_effect_bank {
213*4882a593Smuzhiyun 	__le32 base;			/* 32-bit address */
214*4882a593Smuzhiyun 	__le32 loop_end;		/* 32-bit offset */
215*4882a593Smuzhiyun 	__le32 start;			/* 32-bit offset */
216*4882a593Smuzhiyun 	__le32 temp;
217*4882a593Smuzhiyun };
218*4882a593Smuzhiyun 
219*4882a593Smuzhiyun struct snd_ymfpci_pcm;
220*4882a593Smuzhiyun struct snd_ymfpci;
221*4882a593Smuzhiyun 
222*4882a593Smuzhiyun enum snd_ymfpci_voice_type {
223*4882a593Smuzhiyun 	YMFPCI_PCM,
224*4882a593Smuzhiyun 	YMFPCI_SYNTH,
225*4882a593Smuzhiyun 	YMFPCI_MIDI
226*4882a593Smuzhiyun };
227*4882a593Smuzhiyun 
228*4882a593Smuzhiyun struct snd_ymfpci_voice {
229*4882a593Smuzhiyun 	struct snd_ymfpci *chip;
230*4882a593Smuzhiyun 	int number;
231*4882a593Smuzhiyun 	unsigned int use: 1,
232*4882a593Smuzhiyun 	    pcm: 1,
233*4882a593Smuzhiyun 	    synth: 1,
234*4882a593Smuzhiyun 	    midi: 1;
235*4882a593Smuzhiyun 	struct snd_ymfpci_playback_bank *bank;
236*4882a593Smuzhiyun 	dma_addr_t bank_addr;
237*4882a593Smuzhiyun 	void (*interrupt)(struct snd_ymfpci *chip, struct snd_ymfpci_voice *voice);
238*4882a593Smuzhiyun 	struct snd_ymfpci_pcm *ypcm;
239*4882a593Smuzhiyun };
240*4882a593Smuzhiyun 
241*4882a593Smuzhiyun enum snd_ymfpci_pcm_type {
242*4882a593Smuzhiyun 	PLAYBACK_VOICE,
243*4882a593Smuzhiyun 	CAPTURE_REC,
244*4882a593Smuzhiyun 	CAPTURE_AC97,
245*4882a593Smuzhiyun 	EFFECT_DRY_LEFT,
246*4882a593Smuzhiyun 	EFFECT_DRY_RIGHT,
247*4882a593Smuzhiyun 	EFFECT_EFF1,
248*4882a593Smuzhiyun 	EFFECT_EFF2,
249*4882a593Smuzhiyun 	EFFECT_EFF3
250*4882a593Smuzhiyun };
251*4882a593Smuzhiyun 
252*4882a593Smuzhiyun struct snd_ymfpci_pcm {
253*4882a593Smuzhiyun 	struct snd_ymfpci *chip;
254*4882a593Smuzhiyun 	enum snd_ymfpci_pcm_type type;
255*4882a593Smuzhiyun 	struct snd_pcm_substream *substream;
256*4882a593Smuzhiyun 	struct snd_ymfpci_voice *voices[2];	/* playback only */
257*4882a593Smuzhiyun 	unsigned int running: 1,
258*4882a593Smuzhiyun 		     use_441_slot: 1,
259*4882a593Smuzhiyun 	             output_front: 1,
260*4882a593Smuzhiyun 	             output_rear: 1,
261*4882a593Smuzhiyun 	             swap_rear: 1;
262*4882a593Smuzhiyun 	unsigned int update_pcm_vol;
263*4882a593Smuzhiyun 	u32 period_size;		/* cached from runtime->period_size */
264*4882a593Smuzhiyun 	u32 buffer_size;		/* cached from runtime->buffer_size */
265*4882a593Smuzhiyun 	u32 period_pos;
266*4882a593Smuzhiyun 	u32 last_pos;
267*4882a593Smuzhiyun 	u32 capture_bank_number;
268*4882a593Smuzhiyun 	u32 shift;
269*4882a593Smuzhiyun };
270*4882a593Smuzhiyun 
271*4882a593Smuzhiyun struct snd_ymfpci {
272*4882a593Smuzhiyun 	int irq;
273*4882a593Smuzhiyun 
274*4882a593Smuzhiyun 	unsigned int device_id;	/* PCI device ID */
275*4882a593Smuzhiyun 	unsigned char rev;	/* PCI revision */
276*4882a593Smuzhiyun 	unsigned long reg_area_phys;
277*4882a593Smuzhiyun 	void __iomem *reg_area_virt;
278*4882a593Smuzhiyun 	struct resource *res_reg_area;
279*4882a593Smuzhiyun 	struct resource *fm_res;
280*4882a593Smuzhiyun 	struct resource *mpu_res;
281*4882a593Smuzhiyun 
282*4882a593Smuzhiyun 	unsigned short old_legacy_ctrl;
283*4882a593Smuzhiyun #ifdef SUPPORT_JOYSTICK
284*4882a593Smuzhiyun 	struct gameport *gameport;
285*4882a593Smuzhiyun #endif
286*4882a593Smuzhiyun 
287*4882a593Smuzhiyun 	struct snd_dma_buffer work_ptr;
288*4882a593Smuzhiyun 
289*4882a593Smuzhiyun 	unsigned int bank_size_playback;
290*4882a593Smuzhiyun 	unsigned int bank_size_capture;
291*4882a593Smuzhiyun 	unsigned int bank_size_effect;
292*4882a593Smuzhiyun 	unsigned int work_size;
293*4882a593Smuzhiyun 
294*4882a593Smuzhiyun 	void *bank_base_playback;
295*4882a593Smuzhiyun 	void *bank_base_capture;
296*4882a593Smuzhiyun 	void *bank_base_effect;
297*4882a593Smuzhiyun 	void *work_base;
298*4882a593Smuzhiyun 	dma_addr_t bank_base_playback_addr;
299*4882a593Smuzhiyun 	dma_addr_t bank_base_capture_addr;
300*4882a593Smuzhiyun 	dma_addr_t bank_base_effect_addr;
301*4882a593Smuzhiyun 	dma_addr_t work_base_addr;
302*4882a593Smuzhiyun 	struct snd_dma_buffer ac3_tmp_base;
303*4882a593Smuzhiyun 
304*4882a593Smuzhiyun 	__le32 *ctrl_playback;
305*4882a593Smuzhiyun 	struct snd_ymfpci_playback_bank *bank_playback[YDSXG_PLAYBACK_VOICES][2];
306*4882a593Smuzhiyun 	struct snd_ymfpci_capture_bank *bank_capture[YDSXG_CAPTURE_VOICES][2];
307*4882a593Smuzhiyun 	struct snd_ymfpci_effect_bank *bank_effect[YDSXG_EFFECT_VOICES][2];
308*4882a593Smuzhiyun 
309*4882a593Smuzhiyun 	int start_count;
310*4882a593Smuzhiyun 
311*4882a593Smuzhiyun 	u32 active_bank;
312*4882a593Smuzhiyun 	struct snd_ymfpci_voice voices[64];
313*4882a593Smuzhiyun 	int src441_used;
314*4882a593Smuzhiyun 
315*4882a593Smuzhiyun 	struct snd_ac97_bus *ac97_bus;
316*4882a593Smuzhiyun 	struct snd_ac97 *ac97;
317*4882a593Smuzhiyun 	struct snd_rawmidi *rawmidi;
318*4882a593Smuzhiyun 	struct snd_timer *timer;
319*4882a593Smuzhiyun 	unsigned int timer_ticks;
320*4882a593Smuzhiyun 
321*4882a593Smuzhiyun 	struct pci_dev *pci;
322*4882a593Smuzhiyun 	struct snd_card *card;
323*4882a593Smuzhiyun 	struct snd_pcm *pcm;
324*4882a593Smuzhiyun 	struct snd_pcm *pcm2;
325*4882a593Smuzhiyun 	struct snd_pcm *pcm_spdif;
326*4882a593Smuzhiyun 	struct snd_pcm *pcm_4ch;
327*4882a593Smuzhiyun 	struct snd_pcm_substream *capture_substream[YDSXG_CAPTURE_VOICES];
328*4882a593Smuzhiyun 	struct snd_pcm_substream *effect_substream[YDSXG_EFFECT_VOICES];
329*4882a593Smuzhiyun 	struct snd_kcontrol *ctl_vol_recsrc;
330*4882a593Smuzhiyun 	struct snd_kcontrol *ctl_vol_adcrec;
331*4882a593Smuzhiyun 	struct snd_kcontrol *ctl_vol_spdifrec;
332*4882a593Smuzhiyun 	unsigned short spdif_bits, spdif_pcm_bits;
333*4882a593Smuzhiyun 	struct snd_kcontrol *spdif_pcm_ctl;
334*4882a593Smuzhiyun 	int mode_dup4ch;
335*4882a593Smuzhiyun 	int rear_opened;
336*4882a593Smuzhiyun 	int spdif_opened;
337*4882a593Smuzhiyun 	struct snd_ymfpci_pcm_mixer {
338*4882a593Smuzhiyun 		u16 left;
339*4882a593Smuzhiyun 		u16 right;
340*4882a593Smuzhiyun 		struct snd_kcontrol *ctl;
341*4882a593Smuzhiyun 	} pcm_mixer[32];
342*4882a593Smuzhiyun 
343*4882a593Smuzhiyun 	spinlock_t reg_lock;
344*4882a593Smuzhiyun 	spinlock_t voice_lock;
345*4882a593Smuzhiyun 	wait_queue_head_t interrupt_sleep;
346*4882a593Smuzhiyun 	atomic_t interrupt_sleep_count;
347*4882a593Smuzhiyun 	struct snd_info_entry *proc_entry;
348*4882a593Smuzhiyun 	const struct firmware *dsp_microcode;
349*4882a593Smuzhiyun 	const struct firmware *controller_microcode;
350*4882a593Smuzhiyun 
351*4882a593Smuzhiyun #ifdef CONFIG_PM_SLEEP
352*4882a593Smuzhiyun 	u32 *saved_regs;
353*4882a593Smuzhiyun 	u32 saved_ydsxgr_mode;
354*4882a593Smuzhiyun 	u16 saved_dsxg_legacy;
355*4882a593Smuzhiyun 	u16 saved_dsxg_elegacy;
356*4882a593Smuzhiyun #endif
357*4882a593Smuzhiyun };
358*4882a593Smuzhiyun 
359*4882a593Smuzhiyun int snd_ymfpci_create(struct snd_card *card,
360*4882a593Smuzhiyun 		      struct pci_dev *pci,
361*4882a593Smuzhiyun 		      unsigned short old_legacy_ctrl,
362*4882a593Smuzhiyun 		      struct snd_ymfpci ** rcodec);
363*4882a593Smuzhiyun void snd_ymfpci_free_gameport(struct snd_ymfpci *chip);
364*4882a593Smuzhiyun 
365*4882a593Smuzhiyun extern const struct dev_pm_ops snd_ymfpci_pm;
366*4882a593Smuzhiyun 
367*4882a593Smuzhiyun int snd_ymfpci_pcm(struct snd_ymfpci *chip, int device);
368*4882a593Smuzhiyun int snd_ymfpci_pcm2(struct snd_ymfpci *chip, int device);
369*4882a593Smuzhiyun int snd_ymfpci_pcm_spdif(struct snd_ymfpci *chip, int device);
370*4882a593Smuzhiyun int snd_ymfpci_pcm_4ch(struct snd_ymfpci *chip, int device);
371*4882a593Smuzhiyun int snd_ymfpci_mixer(struct snd_ymfpci *chip, int rear_switch);
372*4882a593Smuzhiyun int snd_ymfpci_timer(struct snd_ymfpci *chip, int device);
373*4882a593Smuzhiyun 
374*4882a593Smuzhiyun #endif /* __SOUND_YMFPCI_H */
375