xref: /openbmc/linux/sound/pci/ymfpci/ymfpci.h (revision 1ac731c529cd4d6adbce134754b51ff7d822b145)
11a59d1b8SThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-or-later */
281fcb170STakashi Iwai #ifndef __SOUND_YMFPCI_H
381fcb170STakashi Iwai #define __SOUND_YMFPCI_H
481fcb170STakashi Iwai 
581fcb170STakashi Iwai /*
681fcb170STakashi Iwai  *  Copyright (c) by Jaroslav Kysela <perex@perex.cz>
781fcb170STakashi Iwai  *  Definitions for Yahama YMF724/740/744/754 chips
881fcb170STakashi Iwai  */
981fcb170STakashi Iwai 
1081fcb170STakashi Iwai #include <sound/pcm.h>
1181fcb170STakashi Iwai #include <sound/rawmidi.h>
1281fcb170STakashi Iwai #include <sound/ac97_codec.h>
1381fcb170STakashi Iwai #include <sound/timer.h>
1481fcb170STakashi Iwai #include <linux/gameport.h>
1581fcb170STakashi Iwai 
1681fcb170STakashi Iwai /*
1781fcb170STakashi Iwai  *  Direct registers
1881fcb170STakashi Iwai  */
1981fcb170STakashi Iwai 
2081fcb170STakashi Iwai #define YMFREG(chip, reg)		(chip->port + YDSXGR_##reg)
2181fcb170STakashi Iwai 
2281fcb170STakashi Iwai #define	YDSXGR_INTFLAG			0x0004
2381fcb170STakashi Iwai #define	YDSXGR_ACTIVITY			0x0006
2481fcb170STakashi Iwai #define	YDSXGR_GLOBALCTRL		0x0008
2581fcb170STakashi Iwai #define	YDSXGR_ZVCTRL			0x000A
2681fcb170STakashi Iwai #define	YDSXGR_TIMERCTRL		0x0010
2781fcb170STakashi Iwai #define	YDSXGR_TIMERCOUNT		0x0012
2881fcb170STakashi Iwai #define	YDSXGR_SPDIFOUTCTRL		0x0018
2981fcb170STakashi Iwai #define	YDSXGR_SPDIFOUTSTATUS		0x001C
3081fcb170STakashi Iwai #define	YDSXGR_EEPROMCTRL		0x0020
3181fcb170STakashi Iwai #define	YDSXGR_SPDIFINCTRL		0x0034
3281fcb170STakashi Iwai #define	YDSXGR_SPDIFINSTATUS		0x0038
3381fcb170STakashi Iwai #define	YDSXGR_DSPPROGRAMDL		0x0048
3481fcb170STakashi Iwai #define	YDSXGR_DLCNTRL			0x004C
3581fcb170STakashi Iwai #define	YDSXGR_GPIOININTFLAG		0x0050
3681fcb170STakashi Iwai #define	YDSXGR_GPIOININTENABLE		0x0052
3781fcb170STakashi Iwai #define	YDSXGR_GPIOINSTATUS		0x0054
3881fcb170STakashi Iwai #define	YDSXGR_GPIOOUTCTRL		0x0056
3981fcb170STakashi Iwai #define	YDSXGR_GPIOFUNCENABLE		0x0058
4081fcb170STakashi Iwai #define	YDSXGR_GPIOTYPECONFIG		0x005A
4181fcb170STakashi Iwai #define	YDSXGR_AC97CMDDATA		0x0060
4281fcb170STakashi Iwai #define	YDSXGR_AC97CMDADR		0x0062
4381fcb170STakashi Iwai #define	YDSXGR_PRISTATUSDATA		0x0064
4481fcb170STakashi Iwai #define	YDSXGR_PRISTATUSADR		0x0066
4581fcb170STakashi Iwai #define	YDSXGR_SECSTATUSDATA		0x0068
4681fcb170STakashi Iwai #define	YDSXGR_SECSTATUSADR		0x006A
4781fcb170STakashi Iwai #define	YDSXGR_SECCONFIG		0x0070
4881fcb170STakashi Iwai #define	YDSXGR_LEGACYOUTVOL		0x0080
4981fcb170STakashi Iwai #define	YDSXGR_LEGACYOUTVOLL		0x0080
5081fcb170STakashi Iwai #define	YDSXGR_LEGACYOUTVOLR		0x0082
5181fcb170STakashi Iwai #define	YDSXGR_NATIVEDACOUTVOL		0x0084
5281fcb170STakashi Iwai #define	YDSXGR_NATIVEDACOUTVOLL		0x0084
5381fcb170STakashi Iwai #define	YDSXGR_NATIVEDACOUTVOLR		0x0086
5481fcb170STakashi Iwai #define	YDSXGR_ZVOUTVOL			0x0088
5581fcb170STakashi Iwai #define	YDSXGR_ZVOUTVOLL		0x0088
5681fcb170STakashi Iwai #define	YDSXGR_ZVOUTVOLR		0x008A
5781fcb170STakashi Iwai #define	YDSXGR_SECADCOUTVOL		0x008C
5881fcb170STakashi Iwai #define	YDSXGR_SECADCOUTVOLL		0x008C
5981fcb170STakashi Iwai #define	YDSXGR_SECADCOUTVOLR		0x008E
6081fcb170STakashi Iwai #define	YDSXGR_PRIADCOUTVOL		0x0090
6181fcb170STakashi Iwai #define	YDSXGR_PRIADCOUTVOLL		0x0090
6281fcb170STakashi Iwai #define	YDSXGR_PRIADCOUTVOLR		0x0092
6381fcb170STakashi Iwai #define	YDSXGR_LEGACYLOOPVOL		0x0094
6481fcb170STakashi Iwai #define	YDSXGR_LEGACYLOOPVOLL		0x0094
6581fcb170STakashi Iwai #define	YDSXGR_LEGACYLOOPVOLR		0x0096
6681fcb170STakashi Iwai #define	YDSXGR_NATIVEDACLOOPVOL		0x0098
6781fcb170STakashi Iwai #define	YDSXGR_NATIVEDACLOOPVOLL	0x0098
6881fcb170STakashi Iwai #define	YDSXGR_NATIVEDACLOOPVOLR	0x009A
6981fcb170STakashi Iwai #define	YDSXGR_ZVLOOPVOL		0x009C
7081fcb170STakashi Iwai #define	YDSXGR_ZVLOOPVOLL		0x009E
7181fcb170STakashi Iwai #define	YDSXGR_ZVLOOPVOLR		0x009E
7281fcb170STakashi Iwai #define	YDSXGR_SECADCLOOPVOL		0x00A0
7381fcb170STakashi Iwai #define	YDSXGR_SECADCLOOPVOLL		0x00A0
7481fcb170STakashi Iwai #define	YDSXGR_SECADCLOOPVOLR		0x00A2
7581fcb170STakashi Iwai #define	YDSXGR_PRIADCLOOPVOL		0x00A4
7681fcb170STakashi Iwai #define	YDSXGR_PRIADCLOOPVOLL		0x00A4
7781fcb170STakashi Iwai #define	YDSXGR_PRIADCLOOPVOLR		0x00A6
7881fcb170STakashi Iwai #define	YDSXGR_NATIVEADCINVOL		0x00A8
7981fcb170STakashi Iwai #define	YDSXGR_NATIVEADCINVOLL		0x00A8
8081fcb170STakashi Iwai #define	YDSXGR_NATIVEADCINVOLR		0x00AA
8181fcb170STakashi Iwai #define	YDSXGR_NATIVEDACINVOL		0x00AC
8281fcb170STakashi Iwai #define	YDSXGR_NATIVEDACINVOLL		0x00AC
8381fcb170STakashi Iwai #define	YDSXGR_NATIVEDACINVOLR		0x00AE
8481fcb170STakashi Iwai #define	YDSXGR_BUF441OUTVOL		0x00B0
8581fcb170STakashi Iwai #define	YDSXGR_BUF441OUTVOLL		0x00B0
8681fcb170STakashi Iwai #define	YDSXGR_BUF441OUTVOLR		0x00B2
8781fcb170STakashi Iwai #define	YDSXGR_BUF441LOOPVOL		0x00B4
8881fcb170STakashi Iwai #define	YDSXGR_BUF441LOOPVOLL		0x00B4
8981fcb170STakashi Iwai #define	YDSXGR_BUF441LOOPVOLR		0x00B6
9081fcb170STakashi Iwai #define	YDSXGR_SPDIFOUTVOL		0x00B8
9181fcb170STakashi Iwai #define	YDSXGR_SPDIFOUTVOLL		0x00B8
9281fcb170STakashi Iwai #define	YDSXGR_SPDIFOUTVOLR		0x00BA
9381fcb170STakashi Iwai #define	YDSXGR_SPDIFLOOPVOL		0x00BC
9481fcb170STakashi Iwai #define	YDSXGR_SPDIFLOOPVOLL		0x00BC
9581fcb170STakashi Iwai #define	YDSXGR_SPDIFLOOPVOLR		0x00BE
9681fcb170STakashi Iwai #define	YDSXGR_ADCSLOTSR		0x00C0
9781fcb170STakashi Iwai #define	YDSXGR_RECSLOTSR		0x00C4
9881fcb170STakashi Iwai #define	YDSXGR_ADCFORMAT		0x00C8
9981fcb170STakashi Iwai #define	YDSXGR_RECFORMAT		0x00CC
10081fcb170STakashi Iwai #define	YDSXGR_P44SLOTSR		0x00D0
10181fcb170STakashi Iwai #define	YDSXGR_STATUS			0x0100
10281fcb170STakashi Iwai #define	YDSXGR_CTRLSELECT		0x0104
10381fcb170STakashi Iwai #define	YDSXGR_MODE			0x0108
10481fcb170STakashi Iwai #define	YDSXGR_SAMPLECOUNT		0x010C
10581fcb170STakashi Iwai #define	YDSXGR_NUMOFSAMPLES		0x0110
10681fcb170STakashi Iwai #define	YDSXGR_CONFIG			0x0114
10781fcb170STakashi Iwai #define	YDSXGR_PLAYCTRLSIZE		0x0140
10881fcb170STakashi Iwai #define	YDSXGR_RECCTRLSIZE		0x0144
10981fcb170STakashi Iwai #define	YDSXGR_EFFCTRLSIZE		0x0148
11081fcb170STakashi Iwai #define	YDSXGR_WORKSIZE			0x014C
11181fcb170STakashi Iwai #define	YDSXGR_MAPOFREC			0x0150
11281fcb170STakashi Iwai #define	YDSXGR_MAPOFEFFECT		0x0154
11381fcb170STakashi Iwai #define	YDSXGR_PLAYCTRLBASE		0x0158
11481fcb170STakashi Iwai #define	YDSXGR_RECCTRLBASE		0x015C
11581fcb170STakashi Iwai #define	YDSXGR_EFFCTRLBASE		0x0160
11681fcb170STakashi Iwai #define	YDSXGR_WORKBASE			0x0164
11781fcb170STakashi Iwai #define	YDSXGR_DSPINSTRAM		0x1000
11881fcb170STakashi Iwai #define	YDSXGR_CTRLINSTRAM		0x4000
11981fcb170STakashi Iwai 
12081fcb170STakashi Iwai #define YDSXG_AC97READCMD		0x8000
12181fcb170STakashi Iwai #define YDSXG_AC97WRITECMD		0x0000
12281fcb170STakashi Iwai 
12381fcb170STakashi Iwai #define PCIR_DSXG_LEGACY		0x40
12481fcb170STakashi Iwai #define PCIR_DSXG_ELEGACY		0x42
12581fcb170STakashi Iwai #define PCIR_DSXG_CTRL			0x48
12681fcb170STakashi Iwai #define PCIR_DSXG_PWRCTRL1		0x4a
12781fcb170STakashi Iwai #define PCIR_DSXG_PWRCTRL2		0x4e
12881fcb170STakashi Iwai #define PCIR_DSXG_FMBASE		0x60
12981fcb170STakashi Iwai #define PCIR_DSXG_SBBASE		0x62
13081fcb170STakashi Iwai #define PCIR_DSXG_MPU401BASE		0x64
13181fcb170STakashi Iwai #define PCIR_DSXG_JOYBASE		0x66
13281fcb170STakashi Iwai 
13381fcb170STakashi Iwai #define YDSXG_DSPLENGTH			0x0080
13481fcb170STakashi Iwai #define YDSXG_CTRLLENGTH		0x3000
13581fcb170STakashi Iwai 
13681fcb170STakashi Iwai #define YDSXG_DEFAULT_WORK_SIZE		0x0400
13781fcb170STakashi Iwai 
13881fcb170STakashi Iwai #define YDSXG_PLAYBACK_VOICES		64
13981fcb170STakashi Iwai #define YDSXG_CAPTURE_VOICES		2
14081fcb170STakashi Iwai #define YDSXG_EFFECT_VOICES		5
14181fcb170STakashi Iwai 
14281fcb170STakashi Iwai #define YMFPCI_LEGACY_SBEN	(1 << 0)	/* soundblaster enable */
14381fcb170STakashi Iwai #define YMFPCI_LEGACY_FMEN	(1 << 1)	/* OPL3 enable */
14481fcb170STakashi Iwai #define YMFPCI_LEGACY_JPEN	(1 << 2)	/* joystick enable */
14581fcb170STakashi Iwai #define YMFPCI_LEGACY_MEN	(1 << 3)	/* MPU401 enable */
14681fcb170STakashi Iwai #define YMFPCI_LEGACY_MIEN	(1 << 4)	/* MPU RX irq enable */
14781fcb170STakashi Iwai #define YMFPCI_LEGACY_IOBITS	(1 << 5)	/* i/o bits range, 0 = 16bit, 1 =10bit */
14881fcb170STakashi Iwai #define YMFPCI_LEGACY_SDMA	(3 << 6)	/* SB DMA select */
14981fcb170STakashi Iwai #define YMFPCI_LEGACY_SBIRQ	(7 << 8)	/* SB IRQ select */
15081fcb170STakashi Iwai #define YMFPCI_LEGACY_MPUIRQ	(7 << 11)	/* MPU IRQ select */
15181fcb170STakashi Iwai #define YMFPCI_LEGACY_SIEN	(1 << 14)	/* serialized IRQ */
15281fcb170STakashi Iwai #define YMFPCI_LEGACY_LAD	(1 << 15)	/* legacy audio disable */
15381fcb170STakashi Iwai 
15481fcb170STakashi Iwai #define YMFPCI_LEGACY2_FMIO	(3 << 0)	/* OPL3 i/o address (724/740) */
15581fcb170STakashi Iwai #define YMFPCI_LEGACY2_SBIO	(3 << 2)	/* SB i/o address (724/740) */
15681fcb170STakashi Iwai #define YMFPCI_LEGACY2_MPUIO	(3 << 4)	/* MPU401 i/o address (724/740) */
15781fcb170STakashi Iwai #define YMFPCI_LEGACY2_JSIO	(3 << 6)	/* joystick i/o address (724/740) */
15881fcb170STakashi Iwai #define YMFPCI_LEGACY2_MAIM	(1 << 8)	/* MPU401 ack intr mask */
15981fcb170STakashi Iwai #define YMFPCI_LEGACY2_SMOD	(3 << 11)	/* SB DMA mode */
16081fcb170STakashi Iwai #define YMFPCI_LEGACY2_SBVER	(3 << 13)	/* SB version select */
16181fcb170STakashi Iwai #define YMFPCI_LEGACY2_IMOD	(1 << 15)	/* legacy IRQ mode */
16281fcb170STakashi Iwai /* SIEN:IMOD 0:0 = legacy irq, 0:1 = INTA, 1:0 = serialized IRQ */
16381fcb170STakashi Iwai 
164b2fac073SFabian Frederick #if IS_REACHABLE(CONFIG_GAMEPORT)
16581fcb170STakashi Iwai #define SUPPORT_JOYSTICK
16681fcb170STakashi Iwai #endif
16781fcb170STakashi Iwai 
16881fcb170STakashi Iwai /*
16981fcb170STakashi Iwai  *
17081fcb170STakashi Iwai  */
17181fcb170STakashi Iwai 
17281fcb170STakashi Iwai struct snd_ymfpci_playback_bank {
173d3c63763STakashi Iwai 	__le32 format;
174d3c63763STakashi Iwai 	__le32 loop_default;
175d3c63763STakashi Iwai 	__le32 base;			/* 32-bit address */
176d3c63763STakashi Iwai 	__le32 loop_start;		/* 32-bit offset */
177d3c63763STakashi Iwai 	__le32 loop_end;		/* 32-bit offset */
178d3c63763STakashi Iwai 	__le32 loop_frac;		/* 8-bit fraction - loop_start */
179d3c63763STakashi Iwai 	__le32 delta_end;		/* pitch delta end */
180d3c63763STakashi Iwai 	__le32 lpfK_end;
181d3c63763STakashi Iwai 	__le32 eg_gain_end;
182d3c63763STakashi Iwai 	__le32 left_gain_end;
183d3c63763STakashi Iwai 	__le32 right_gain_end;
184d3c63763STakashi Iwai 	__le32 eff1_gain_end;
185d3c63763STakashi Iwai 	__le32 eff2_gain_end;
186d3c63763STakashi Iwai 	__le32 eff3_gain_end;
187d3c63763STakashi Iwai 	__le32 lpfQ;
188d3c63763STakashi Iwai 	__le32 status;
189d3c63763STakashi Iwai 	__le32 num_of_frames;
190d3c63763STakashi Iwai 	__le32 loop_count;
191d3c63763STakashi Iwai 	__le32 start;
192d3c63763STakashi Iwai 	__le32 start_frac;
193d3c63763STakashi Iwai 	__le32 delta;
194d3c63763STakashi Iwai 	__le32 lpfK;
195d3c63763STakashi Iwai 	__le32 eg_gain;
196d3c63763STakashi Iwai 	__le32 left_gain;
197d3c63763STakashi Iwai 	__le32 right_gain;
198d3c63763STakashi Iwai 	__le32 eff1_gain;
199d3c63763STakashi Iwai 	__le32 eff2_gain;
200d3c63763STakashi Iwai 	__le32 eff3_gain;
201d3c63763STakashi Iwai 	__le32 lpfD1;
202d3c63763STakashi Iwai 	__le32 lpfD2;
20381fcb170STakashi Iwai  };
20481fcb170STakashi Iwai 
20581fcb170STakashi Iwai struct snd_ymfpci_capture_bank {
206d3c63763STakashi Iwai 	__le32 base;			/* 32-bit address */
207d3c63763STakashi Iwai 	__le32 loop_end;		/* 32-bit offset */
208d3c63763STakashi Iwai 	__le32 start;			/* 32-bit offset */
209d3c63763STakashi Iwai 	__le32 num_of_loops;		/* counter */
21081fcb170STakashi Iwai };
21181fcb170STakashi Iwai 
21281fcb170STakashi Iwai struct snd_ymfpci_effect_bank {
213d3c63763STakashi Iwai 	__le32 base;			/* 32-bit address */
214d3c63763STakashi Iwai 	__le32 loop_end;		/* 32-bit offset */
215d3c63763STakashi Iwai 	__le32 start;			/* 32-bit offset */
216d3c63763STakashi Iwai 	__le32 temp;
21781fcb170STakashi Iwai };
21881fcb170STakashi Iwai 
21981fcb170STakashi Iwai struct snd_ymfpci_pcm;
22081fcb170STakashi Iwai struct snd_ymfpci;
22181fcb170STakashi Iwai 
22281fcb170STakashi Iwai enum snd_ymfpci_voice_type {
22381fcb170STakashi Iwai 	YMFPCI_PCM,
22481fcb170STakashi Iwai 	YMFPCI_SYNTH,
22581fcb170STakashi Iwai 	YMFPCI_MIDI
22681fcb170STakashi Iwai };
22781fcb170STakashi Iwai 
22881fcb170STakashi Iwai struct snd_ymfpci_voice {
22981fcb170STakashi Iwai 	struct snd_ymfpci *chip;
23081fcb170STakashi Iwai 	int number;
23181fcb170STakashi Iwai 	unsigned int use: 1,
23281fcb170STakashi Iwai 	    pcm: 1,
23381fcb170STakashi Iwai 	    synth: 1,
23481fcb170STakashi Iwai 	    midi: 1;
23581fcb170STakashi Iwai 	struct snd_ymfpci_playback_bank *bank;
23681fcb170STakashi Iwai 	dma_addr_t bank_addr;
23781fcb170STakashi Iwai 	void (*interrupt)(struct snd_ymfpci *chip, struct snd_ymfpci_voice *voice);
23881fcb170STakashi Iwai 	struct snd_ymfpci_pcm *ypcm;
23981fcb170STakashi Iwai };
24081fcb170STakashi Iwai 
24181fcb170STakashi Iwai enum snd_ymfpci_pcm_type {
24281fcb170STakashi Iwai 	PLAYBACK_VOICE,
24381fcb170STakashi Iwai 	CAPTURE_REC,
24481fcb170STakashi Iwai 	CAPTURE_AC97,
24581fcb170STakashi Iwai 	EFFECT_DRY_LEFT,
24681fcb170STakashi Iwai 	EFFECT_DRY_RIGHT,
24781fcb170STakashi Iwai 	EFFECT_EFF1,
24881fcb170STakashi Iwai 	EFFECT_EFF2,
24981fcb170STakashi Iwai 	EFFECT_EFF3
25081fcb170STakashi Iwai };
25181fcb170STakashi Iwai 
25281fcb170STakashi Iwai struct snd_ymfpci_pcm {
25381fcb170STakashi Iwai 	struct snd_ymfpci *chip;
25481fcb170STakashi Iwai 	enum snd_ymfpci_pcm_type type;
25581fcb170STakashi Iwai 	struct snd_pcm_substream *substream;
25681fcb170STakashi Iwai 	struct snd_ymfpci_voice *voices[2];	/* playback only */
25781fcb170STakashi Iwai 	unsigned int running: 1,
25881fcb170STakashi Iwai 		     use_441_slot: 1,
25981fcb170STakashi Iwai 	             output_front: 1,
26081fcb170STakashi Iwai 	             output_rear: 1,
26181fcb170STakashi Iwai 	             swap_rear: 1;
26281fcb170STakashi Iwai 	unsigned int update_pcm_vol;
26381fcb170STakashi Iwai 	u32 period_size;		/* cached from runtime->period_size */
26481fcb170STakashi Iwai 	u32 buffer_size;		/* cached from runtime->buffer_size */
26581fcb170STakashi Iwai 	u32 period_pos;
26681fcb170STakashi Iwai 	u32 last_pos;
26781fcb170STakashi Iwai 	u32 capture_bank_number;
26881fcb170STakashi Iwai 	u32 shift;
26981fcb170STakashi Iwai };
27081fcb170STakashi Iwai 
27169a6c1baSTasos Sahanidis static const int saved_regs_index[] = {
27269a6c1baSTasos Sahanidis 	/* spdif */
27369a6c1baSTasos Sahanidis 	YDSXGR_SPDIFOUTCTRL,
27469a6c1baSTasos Sahanidis 	YDSXGR_SPDIFOUTSTATUS,
27569a6c1baSTasos Sahanidis 	YDSXGR_SPDIFINCTRL,
27669a6c1baSTasos Sahanidis 	/* volumes */
27769a6c1baSTasos Sahanidis 	YDSXGR_PRIADCLOOPVOL,
27869a6c1baSTasos Sahanidis 	YDSXGR_NATIVEDACINVOL,
27969a6c1baSTasos Sahanidis 	YDSXGR_NATIVEDACOUTVOL,
28069a6c1baSTasos Sahanidis 	YDSXGR_BUF441OUTVOL,
28169a6c1baSTasos Sahanidis 	YDSXGR_NATIVEADCINVOL,
28269a6c1baSTasos Sahanidis 	YDSXGR_SPDIFLOOPVOL,
28369a6c1baSTasos Sahanidis 	YDSXGR_SPDIFOUTVOL,
28469a6c1baSTasos Sahanidis 	YDSXGR_ZVOUTVOL,
28569a6c1baSTasos Sahanidis 	YDSXGR_LEGACYOUTVOL,
28669a6c1baSTasos Sahanidis 	/* address bases */
28769a6c1baSTasos Sahanidis 	YDSXGR_PLAYCTRLBASE,
28869a6c1baSTasos Sahanidis 	YDSXGR_RECCTRLBASE,
28969a6c1baSTasos Sahanidis 	YDSXGR_EFFCTRLBASE,
29069a6c1baSTasos Sahanidis 	YDSXGR_WORKBASE,
29169a6c1baSTasos Sahanidis 	/* capture set up */
29269a6c1baSTasos Sahanidis 	YDSXGR_MAPOFREC,
29369a6c1baSTasos Sahanidis 	YDSXGR_RECFORMAT,
29469a6c1baSTasos Sahanidis 	YDSXGR_RECSLOTSR,
29569a6c1baSTasos Sahanidis 	YDSXGR_ADCFORMAT,
29669a6c1baSTasos Sahanidis 	YDSXGR_ADCSLOTSR,
29769a6c1baSTasos Sahanidis };
29869a6c1baSTasos Sahanidis #define YDSXGR_NUM_SAVED_REGS	ARRAY_SIZE(saved_regs_index)
29969a6c1baSTasos Sahanidis 
30039fef76cSTasos Sahanidis static const int pci_saved_regs_index[] = {
3014fa4a147STasos Sahanidis 	/* All Chips */
30239fef76cSTasos Sahanidis 	PCIR_DSXG_LEGACY,
30339fef76cSTasos Sahanidis 	PCIR_DSXG_ELEGACY,
3044fa4a147STasos Sahanidis 	/* YMF 744/754 */
3054fa4a147STasos Sahanidis 	PCIR_DSXG_FMBASE,
3064fa4a147STasos Sahanidis 	PCIR_DSXG_SBBASE,
3074fa4a147STasos Sahanidis 	PCIR_DSXG_MPU401BASE,
3084fa4a147STasos Sahanidis 	PCIR_DSXG_JOYBASE,
30939fef76cSTasos Sahanidis };
31039fef76cSTasos Sahanidis #define DSXG_PCI_NUM_SAVED_REGS	ARRAY_SIZE(pci_saved_regs_index)
3114fa4a147STasos Sahanidis #define DSXG_PCI_NUM_SAVED_LEGACY_REGS	2
3124fa4a147STasos Sahanidis static_assert(DSXG_PCI_NUM_SAVED_LEGACY_REGS <= DSXG_PCI_NUM_SAVED_REGS);
31339fef76cSTasos Sahanidis 
31481fcb170STakashi Iwai struct snd_ymfpci {
31581fcb170STakashi Iwai 	int irq;
31681fcb170STakashi Iwai 
31781fcb170STakashi Iwai 	unsigned int device_id;	/* PCI device ID */
31881fcb170STakashi Iwai 	unsigned char rev;	/* PCI revision */
31981fcb170STakashi Iwai 	unsigned long reg_area_phys;
32081fcb170STakashi Iwai 	void __iomem *reg_area_virt;
32181fcb170STakashi Iwai 
322*a8752868STasos Sahanidis 	u16 old_legacy_ctrl;
32381fcb170STakashi Iwai #ifdef SUPPORT_JOYSTICK
32481fcb170STakashi Iwai 	struct gameport *gameport;
32581fcb170STakashi Iwai #endif
32681fcb170STakashi Iwai 
327c6e6bb5eSTakashi Iwai 	struct snd_dma_buffer *work_ptr;
32881fcb170STakashi Iwai 
32981fcb170STakashi Iwai 	unsigned int bank_size_playback;
33081fcb170STakashi Iwai 	unsigned int bank_size_capture;
33181fcb170STakashi Iwai 	unsigned int bank_size_effect;
33281fcb170STakashi Iwai 	unsigned int work_size;
33381fcb170STakashi Iwai 
33481fcb170STakashi Iwai 	void *bank_base_playback;
33581fcb170STakashi Iwai 	void *bank_base_capture;
33681fcb170STakashi Iwai 	void *bank_base_effect;
33781fcb170STakashi Iwai 	void *work_base;
33881fcb170STakashi Iwai 	dma_addr_t bank_base_playback_addr;
33981fcb170STakashi Iwai 	dma_addr_t bank_base_capture_addr;
34081fcb170STakashi Iwai 	dma_addr_t bank_base_effect_addr;
34181fcb170STakashi Iwai 	dma_addr_t work_base_addr;
34281fcb170STakashi Iwai 	struct snd_dma_buffer ac3_tmp_base;
34381fcb170STakashi Iwai 
344d3c63763STakashi Iwai 	__le32 *ctrl_playback;
34581fcb170STakashi Iwai 	struct snd_ymfpci_playback_bank *bank_playback[YDSXG_PLAYBACK_VOICES][2];
34681fcb170STakashi Iwai 	struct snd_ymfpci_capture_bank *bank_capture[YDSXG_CAPTURE_VOICES][2];
34781fcb170STakashi Iwai 	struct snd_ymfpci_effect_bank *bank_effect[YDSXG_EFFECT_VOICES][2];
34881fcb170STakashi Iwai 
34981fcb170STakashi Iwai 	int start_count;
35081fcb170STakashi Iwai 
35181fcb170STakashi Iwai 	u32 active_bank;
35281fcb170STakashi Iwai 	struct snd_ymfpci_voice voices[64];
35381fcb170STakashi Iwai 	int src441_used;
35481fcb170STakashi Iwai 
35581fcb170STakashi Iwai 	struct snd_ac97_bus *ac97_bus;
35681fcb170STakashi Iwai 	struct snd_ac97 *ac97;
35781fcb170STakashi Iwai 	struct snd_rawmidi *rawmidi;
35881fcb170STakashi Iwai 	struct snd_timer *timer;
35981fcb170STakashi Iwai 	unsigned int timer_ticks;
36081fcb170STakashi Iwai 
36181fcb170STakashi Iwai 	struct pci_dev *pci;
36281fcb170STakashi Iwai 	struct snd_card *card;
36381fcb170STakashi Iwai 	struct snd_pcm *pcm;
36481fcb170STakashi Iwai 	struct snd_pcm *pcm2;
36581fcb170STakashi Iwai 	struct snd_pcm *pcm_spdif;
36681fcb170STakashi Iwai 	struct snd_pcm *pcm_4ch;
36781fcb170STakashi Iwai 	struct snd_pcm_substream *capture_substream[YDSXG_CAPTURE_VOICES];
36881fcb170STakashi Iwai 	struct snd_pcm_substream *effect_substream[YDSXG_EFFECT_VOICES];
36981fcb170STakashi Iwai 	struct snd_kcontrol *ctl_vol_recsrc;
37081fcb170STakashi Iwai 	struct snd_kcontrol *ctl_vol_adcrec;
37181fcb170STakashi Iwai 	struct snd_kcontrol *ctl_vol_spdifrec;
37281fcb170STakashi Iwai 	unsigned short spdif_bits, spdif_pcm_bits;
37381fcb170STakashi Iwai 	struct snd_kcontrol *spdif_pcm_ctl;
37481fcb170STakashi Iwai 	int mode_dup4ch;
37581fcb170STakashi Iwai 	int rear_opened;
37681fcb170STakashi Iwai 	int spdif_opened;
37781fcb170STakashi Iwai 	struct snd_ymfpci_pcm_mixer {
37881fcb170STakashi Iwai 		u16 left;
37981fcb170STakashi Iwai 		u16 right;
38081fcb170STakashi Iwai 		struct snd_kcontrol *ctl;
38181fcb170STakashi Iwai 	} pcm_mixer[32];
38281fcb170STakashi Iwai 
38381fcb170STakashi Iwai 	spinlock_t reg_lock;
38481fcb170STakashi Iwai 	spinlock_t voice_lock;
38581fcb170STakashi Iwai 	wait_queue_head_t interrupt_sleep;
38681fcb170STakashi Iwai 	atomic_t interrupt_sleep_count;
38781fcb170STakashi Iwai 	struct snd_info_entry *proc_entry;
38881fcb170STakashi Iwai 	const struct firmware *dsp_microcode;
38981fcb170STakashi Iwai 	const struct firmware *controller_microcode;
39081fcb170STakashi Iwai 
39169a6c1baSTasos Sahanidis 	u32 saved_regs[YDSXGR_NUM_SAVED_REGS];
39281fcb170STakashi Iwai 	u32 saved_ydsxgr_mode;
39339fef76cSTasos Sahanidis 	u16 saved_dsxg_pci_regs[DSXG_PCI_NUM_SAVED_REGS];
39481fcb170STakashi Iwai };
39581fcb170STakashi Iwai 
39681fcb170STakashi Iwai int snd_ymfpci_create(struct snd_card *card,
39781fcb170STakashi Iwai 		      struct pci_dev *pci,
398*a8752868STasos Sahanidis 		      u16 old_legacy_ctrl);
39981fcb170STakashi Iwai void snd_ymfpci_free_gameport(struct snd_ymfpci *chip);
40081fcb170STakashi Iwai 
40181fcb170STakashi Iwai extern const struct dev_pm_ops snd_ymfpci_pm;
40281fcb170STakashi Iwai 
40338c47181SLars-Peter Clausen int snd_ymfpci_pcm(struct snd_ymfpci *chip, int device);
40438c47181SLars-Peter Clausen int snd_ymfpci_pcm2(struct snd_ymfpci *chip, int device);
40538c47181SLars-Peter Clausen int snd_ymfpci_pcm_spdif(struct snd_ymfpci *chip, int device);
40638c47181SLars-Peter Clausen int snd_ymfpci_pcm_4ch(struct snd_ymfpci *chip, int device);
40781fcb170STakashi Iwai int snd_ymfpci_mixer(struct snd_ymfpci *chip, int rear_switch);
40881fcb170STakashi Iwai int snd_ymfpci_timer(struct snd_ymfpci *chip, int device);
40981fcb170STakashi Iwai 
41081fcb170STakashi Iwai #endif /* __SOUND_YMFPCI_H */
411