ymfpci.h 12 KB

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