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