Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
riptide.c
Go to the documentation of this file.
1 /*
2  * Driver for the Conexant Riptide Soundchip
3  *
4  * Copyright (c) 2004 Peter Gruber <[email protected]>
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software
18  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19  *
20  */
21 /*
22  History:
23  - 02/15/2004 first release
24 
25  This Driver is based on the OSS Driver version from Linuxant (riptide-0.6lnxtbeta03111100)
26  credits from the original files:
27 
28  MODULE NAME: cnxt_rt.h
29  AUTHOR: K. Lazarev (Transcribed by KNL)
30  HISTORY: Major Revision Date By
31  ----------------------------- -------- -----
32  Created 02/1/2000 KNL
33 
34  MODULE NAME: int_mdl.c
35  AUTHOR: Konstantin Lazarev (Transcribed by KNL)
36  HISTORY: Major Revision Date By
37  ----------------------------- -------- -----
38  Created 10/01/99 KNL
39 
40  MODULE NAME: riptide.h
41  AUTHOR: O. Druzhinin (Transcribed by OLD)
42  HISTORY: Major Revision Date By
43  ----------------------------- -------- -----
44  Created 10/16/97 OLD
45 
46  MODULE NAME: Rp_Cmdif.cpp
47  AUTHOR: O. Druzhinin (Transcribed by OLD)
48  K. Lazarev (Transcribed by KNL)
49  HISTORY: Major Revision Date By
50  ----------------------------- -------- -----
51  Adopted from NT4 driver 6/22/99 OLD
52  Ported to Linux 9/01/99 KNL
53 
54  MODULE NAME: rt_hw.c
55  AUTHOR: O. Druzhinin (Transcribed by OLD)
56  C. Lazarev (Transcribed by CNL)
57  HISTORY: Major Revision Date By
58  ----------------------------- -------- -----
59  Created 11/18/97 OLD
60  Hardware functions for RipTide 11/24/97 CNL
61  (ES1) are coded
62  Hardware functions for RipTide 12/24/97 CNL
63  (A0) are coded
64  Hardware functions for RipTide 03/20/98 CNL
65  (A1) are coded
66  Boot loader is included 05/07/98 CNL
67  Redesigned for WDM 07/27/98 CNL
68  Redesigned for Linux 09/01/99 CNL
69 
70  MODULE NAME: rt_hw.h
71  AUTHOR: C. Lazarev (Transcribed by CNL)
72  HISTORY: Major Revision Date By
73  ----------------------------- -------- -----
74  Created 11/18/97 CNL
75 
76  MODULE NAME: rt_mdl.c
77  AUTHOR: Konstantin Lazarev (Transcribed by KNL)
78  HISTORY: Major Revision Date By
79  ----------------------------- -------- -----
80  Created 10/01/99 KNL
81 
82  MODULE NAME: mixer.h
83  AUTHOR: K. Kenney
84  HISTORY: Major Revision Date By
85  ----------------------------- -------- -----
86  Created from MS W95 Sample 11/28/95 KRS
87  RipTide 10/15/97 KRS
88  Adopted for Windows NT driver 01/20/98 CNL
89 */
90 
91 #include <linux/delay.h>
92 #include <linux/init.h>
93 #include <linux/interrupt.h>
94 #include <linux/pci.h>
95 #include <linux/slab.h>
96 #include <linux/wait.h>
97 #include <linux/gameport.h>
98 #include <linux/device.h>
99 #include <linux/firmware.h>
100 #include <linux/kernel.h>
101 #include <linux/module.h>
102 #include <asm/io.h>
103 #include <sound/core.h>
104 #include <sound/info.h>
105 #include <sound/control.h>
106 #include <sound/pcm.h>
107 #include <sound/pcm_params.h>
108 #include <sound/ac97_codec.h>
109 #include <sound/mpu401.h>
110 #include <sound/opl3.h>
111 #include <sound/initval.h>
112 
113 #if defined(CONFIG_GAMEPORT) || (defined(MODULE) && defined(CONFIG_GAMEPORT_MODULE))
114 #define SUPPORT_JOYSTICK 1
115 #endif
116 
117 MODULE_AUTHOR("Peter Gruber <[email protected]>");
118 MODULE_DESCRIPTION("riptide");
119 MODULE_LICENSE("GPL");
120 MODULE_SUPPORTED_DEVICE("{{Conexant,Riptide}}");
121 MODULE_FIRMWARE("riptide.hex");
122 
123 static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX;
124 static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR;
126 
127 #ifdef SUPPORT_JOYSTICK
128 static int joystick_port[SNDRV_CARDS] = { [0 ... (SNDRV_CARDS - 1)] = 0x200 };
129 #endif
130 static int mpu_port[SNDRV_CARDS] = { [0 ... (SNDRV_CARDS - 1)] = 0x330 };
131 static int opl3_port[SNDRV_CARDS] = { [0 ... (SNDRV_CARDS - 1)] = 0x388 };
132 
133 module_param_array(index, int, NULL, 0444);
134 MODULE_PARM_DESC(index, "Index value for Riptide soundcard.");
135 module_param_array(id, charp, NULL, 0444);
136 MODULE_PARM_DESC(id, "ID string for Riptide soundcard.");
137 module_param_array(enable, bool, NULL, 0444);
138 MODULE_PARM_DESC(enable, "Enable Riptide soundcard.");
139 #ifdef SUPPORT_JOYSTICK
140 module_param_array(joystick_port, int, NULL, 0444);
141 MODULE_PARM_DESC(joystick_port, "Joystick port # for Riptide soundcard.");
142 #endif
143 module_param_array(mpu_port, int, NULL, 0444);
144 MODULE_PARM_DESC(mpu_port, "MPU401 port # for Riptide driver.");
145 module_param_array(opl3_port, int, NULL, 0444);
146 MODULE_PARM_DESC(opl3_port, "OPL3 port # for Riptide driver.");
147 
148 /*
149  */
150 
151 #define MPU401_HW_RIPTIDE MPU401_HW_MPU401
152 #define OPL3_HW_RIPTIDE OPL3_HW_OPL3
153 
154 #define PCI_EXT_CapId 0x40
155 #define PCI_EXT_NextCapPrt 0x41
156 #define PCI_EXT_PWMC 0x42
157 #define PCI_EXT_PWSCR 0x44
158 #define PCI_EXT_Data00 0x46
159 #define PCI_EXT_PMSCR_BSE 0x47
160 #define PCI_EXT_SB_Base 0x48
161 #define PCI_EXT_FM_Base 0x4a
162 #define PCI_EXT_MPU_Base 0x4C
163 #define PCI_EXT_Game_Base 0x4E
164 #define PCI_EXT_Legacy_Mask 0x50
165 #define PCI_EXT_AsicRev 0x52
166 #define PCI_EXT_Reserved3 0x53
167 
168 #define LEGACY_ENABLE_ALL 0x8000 /* legacy device options */
169 #define LEGACY_ENABLE_SB 0x4000
170 #define LEGACY_ENABLE_FM 0x2000
171 #define LEGACY_ENABLE_MPU_INT 0x1000
172 #define LEGACY_ENABLE_MPU 0x0800
173 #define LEGACY_ENABLE_GAMEPORT 0x0400
174 
175 #define MAX_WRITE_RETRY 10 /* cmd interface limits */
176 #define MAX_ERROR_COUNT 10
177 #define CMDIF_TIMEOUT 50000
178 #define RESET_TRIES 5
179 
180 #define READ_PORT_ULONG(p) inl((unsigned long)&(p))
181 #define WRITE_PORT_ULONG(p,x) outl(x,(unsigned long)&(p))
182 
183 #define READ_AUDIO_CONTROL(p) READ_PORT_ULONG(p->audio_control)
184 #define WRITE_AUDIO_CONTROL(p,x) WRITE_PORT_ULONG(p->audio_control,x)
185 #define UMASK_AUDIO_CONTROL(p,x) WRITE_PORT_ULONG(p->audio_control,READ_PORT_ULONG(p->audio_control)|x)
186 #define MASK_AUDIO_CONTROL(p,x) WRITE_PORT_ULONG(p->audio_control,READ_PORT_ULONG(p->audio_control)&x)
187 #define READ_AUDIO_STATUS(p) READ_PORT_ULONG(p->audio_status)
188 
189 #define SET_GRESET(p) UMASK_AUDIO_CONTROL(p,0x0001) /* global reset switch */
190 #define UNSET_GRESET(p) MASK_AUDIO_CONTROL(p,~0x0001)
191 #define SET_AIE(p) UMASK_AUDIO_CONTROL(p,0x0004) /* interrupt enable */
192 #define UNSET_AIE(p) MASK_AUDIO_CONTROL(p,~0x0004)
193 #define SET_AIACK(p) UMASK_AUDIO_CONTROL(p,0x0008) /* interrupt acknowledge */
194 #define UNSET_AIACKT(p) MASKAUDIO_CONTROL(p,~0x0008)
195 #define SET_ECMDAE(p) UMASK_AUDIO_CONTROL(p,0x0010)
196 #define UNSET_ECMDAE(p) MASK_AUDIO_CONTROL(p,~0x0010)
197 #define SET_ECMDBE(p) UMASK_AUDIO_CONTROL(p,0x0020)
198 #define UNSET_ECMDBE(p) MASK_AUDIO_CONTROL(p,~0x0020)
199 #define SET_EDATAF(p) UMASK_AUDIO_CONTROL(p,0x0040)
200 #define UNSET_EDATAF(p) MASK_AUDIO_CONTROL(p,~0x0040)
201 #define SET_EDATBF(p) UMASK_AUDIO_CONTROL(p,0x0080)
202 #define UNSET_EDATBF(p) MASK_AUDIO_CONTROL(p,~0x0080)
203 #define SET_ESBIRQON(p) UMASK_AUDIO_CONTROL(p,0x0100)
204 #define UNSET_ESBIRQON(p) MASK_AUDIO_CONTROL(p,~0x0100)
205 #define SET_EMPUIRQ(p) UMASK_AUDIO_CONTROL(p,0x0200)
206 #define UNSET_EMPUIRQ(p) MASK_AUDIO_CONTROL(p,~0x0200)
207 #define IS_CMDE(a) (READ_PORT_ULONG(a->stat)&0x1) /* cmd empty */
208 #define IS_DATF(a) (READ_PORT_ULONG(a->stat)&0x2) /* data filled */
209 #define IS_READY(p) (READ_AUDIO_STATUS(p)&0x0001)
210 #define IS_DLREADY(p) (READ_AUDIO_STATUS(p)&0x0002)
211 #define IS_DLERR(p) (READ_AUDIO_STATUS(p)&0x0004)
212 #define IS_GERR(p) (READ_AUDIO_STATUS(p)&0x0008) /* error ! */
213 #define IS_CMDAEIRQ(p) (READ_AUDIO_STATUS(p)&0x0010)
214 #define IS_CMDBEIRQ(p) (READ_AUDIO_STATUS(p)&0x0020)
215 #define IS_DATAFIRQ(p) (READ_AUDIO_STATUS(p)&0x0040)
216 #define IS_DATBFIRQ(p) (READ_AUDIO_STATUS(p)&0x0080)
217 #define IS_EOBIRQ(p) (READ_AUDIO_STATUS(p)&0x0100) /* interrupt status */
218 #define IS_EOSIRQ(p) (READ_AUDIO_STATUS(p)&0x0200)
219 #define IS_EOCIRQ(p) (READ_AUDIO_STATUS(p)&0x0400)
220 #define IS_UNSLIRQ(p) (READ_AUDIO_STATUS(p)&0x0800)
221 #define IS_SBIRQ(p) (READ_AUDIO_STATUS(p)&0x1000)
222 #define IS_MPUIRQ(p) (READ_AUDIO_STATUS(p)&0x2000)
223 
224 #define RESP 0x00000001 /* command flags */
225 #define PARM 0x00000002
226 #define CMDA 0x00000004
227 #define CMDB 0x00000008
228 #define NILL 0x00000000
229 
230 #define LONG0(a) ((u32)a) /* shifts and masks */
231 #define BYTE0(a) (LONG0(a)&0xff)
232 #define BYTE1(a) (BYTE0(a)<<8)
233 #define BYTE2(a) (BYTE0(a)<<16)
234 #define BYTE3(a) (BYTE0(a)<<24)
235 #define WORD0(a) (LONG0(a)&0xffff)
236 #define WORD1(a) (WORD0(a)<<8)
237 #define WORD2(a) (WORD0(a)<<16)
238 #define TRINIB0(a) (LONG0(a)&0xffffff)
239 #define TRINIB1(a) (TRINIB0(a)<<8)
240 
241 #define RET(a) ((union cmdret *)(a))
242 
243 #define SEND_GETV(p,b) sendcmd(p,RESP,GETV,0,RET(b)) /* get version */
244 #define SEND_GETC(p,b,c) sendcmd(p,PARM|RESP,GETC,c,RET(b))
245 #define SEND_GUNS(p,b) sendcmd(p,RESP,GUNS,0,RET(b))
246 #define SEND_SCID(p,b) sendcmd(p,RESP,SCID,0,RET(b))
247 #define SEND_RMEM(p,b,c,d) sendcmd(p,PARM|RESP,RMEM|BYTE1(b),LONG0(c),RET(d)) /* memory access for firmware write */
248 #define SEND_SMEM(p,b,c) sendcmd(p,PARM,SMEM|BYTE1(b),LONG0(c),RET(0)) /* memory access for firmware write */
249 #define SEND_WMEM(p,b,c) sendcmd(p,PARM,WMEM|BYTE1(b),LONG0(c),RET(0)) /* memory access for firmware write */
250 #define SEND_SDTM(p,b,c) sendcmd(p,PARM|RESP,SDTM|TRINIB1(b),0,RET(c)) /* memory access for firmware write */
251 #define SEND_GOTO(p,b) sendcmd(p,PARM,GOTO,LONG0(b),RET(0)) /* memory access for firmware write */
252 #define SEND_SETDPLL(p) sendcmd(p,0,ARM_SETDPLL,0,RET(0))
253 #define SEND_SSTR(p,b,c) sendcmd(p,PARM,SSTR|BYTE3(b),LONG0(c),RET(0)) /* start stream */
254 #define SEND_PSTR(p,b) sendcmd(p,PARM,PSTR,BYTE3(b),RET(0)) /* pause stream */
255 #define SEND_KSTR(p,b) sendcmd(p,PARM,KSTR,BYTE3(b),RET(0)) /* stop stream */
256 #define SEND_KDMA(p) sendcmd(p,0,KDMA,0,RET(0)) /* stop all dma */
257 #define SEND_GPOS(p,b,c,d) sendcmd(p,PARM|RESP,GPOS,BYTE3(c)|BYTE2(b),RET(d)) /* get position in dma */
258 #define SEND_SETF(p,b,c,d,e,f,g) sendcmd(p,PARM,SETF|WORD1(b)|BYTE3(c),d|BYTE1(e)|BYTE2(f)|BYTE3(g),RET(0)) /* set sample format at mixer */
259 #define SEND_GSTS(p,b,c,d) sendcmd(p,PARM|RESP,GSTS,BYTE3(c)|BYTE2(b),RET(d))
260 #define SEND_NGPOS(p,b,c,d) sendcmd(p,PARM|RESP,NGPOS,BYTE3(c)|BYTE2(b),RET(d))
261 #define SEND_PSEL(p,b,c) sendcmd(p,PARM,PSEL,BYTE2(b)|BYTE3(c),RET(0)) /* activate lbus path */
262 #define SEND_PCLR(p,b,c) sendcmd(p,PARM,PCLR,BYTE2(b)|BYTE3(c),RET(0)) /* deactivate lbus path */
263 #define SEND_PLST(p,b) sendcmd(p,PARM,PLST,BYTE3(b),RET(0))
264 #define SEND_RSSV(p,b,c,d) sendcmd(p,PARM|RESP,RSSV,BYTE2(b)|BYTE3(c),RET(d))
265 #define SEND_LSEL(p,b,c,d,e,f,g,h) sendcmd(p,PARM,LSEL|BYTE1(b)|BYTE2(c)|BYTE3(d),BYTE0(e)|BYTE1(f)|BYTE2(g)|BYTE3(h),RET(0)) /* select paths for internal connections */
266 #define SEND_SSRC(p,b,c,d,e) sendcmd(p,PARM,SSRC|BYTE1(b)|WORD2(c),WORD0(d)|WORD2(e),RET(0)) /* configure source */
267 #define SEND_SLST(p,b) sendcmd(p,PARM,SLST,BYTE3(b),RET(0))
268 #define SEND_RSRC(p,b,c) sendcmd(p,RESP,RSRC|BYTE1(b),0,RET(c)) /* read source config */
269 #define SEND_SSRB(p,b,c) sendcmd(p,PARM,SSRB|BYTE1(b),WORD2(c),RET(0))
270 #define SEND_SDGV(p,b,c,d,e) sendcmd(p,PARM,SDGV|BYTE2(b)|BYTE3(c),WORD0(d)|WORD2(e),RET(0)) /* set digital mixer */
271 #define SEND_RDGV(p,b,c,d) sendcmd(p,PARM|RESP,RDGV|BYTE2(b)|BYTE3(c),0,RET(d)) /* read digital mixer */
272 #define SEND_DLST(p,b) sendcmd(p,PARM,DLST,BYTE3(b),RET(0))
273 #define SEND_SACR(p,b,c) sendcmd(p,PARM,SACR,WORD0(b)|WORD2(c),RET(0)) /* set AC97 register */
274 #define SEND_RACR(p,b,c) sendcmd(p,PARM|RESP,RACR,WORD2(b),RET(c)) /* get AC97 register */
275 #define SEND_ALST(p,b) sendcmd(p,PARM,ALST,BYTE3(b),RET(0))
276 #define SEND_TXAC(p,b,c,d,e,f) sendcmd(p,PARM,TXAC|BYTE1(b)|WORD2(c),WORD0(d)|BYTE2(e)|BYTE3(f),RET(0))
277 #define SEND_RXAC(p,b,c,d) sendcmd(p,PARM|RESP,RXAC,BYTE2(b)|BYTE3(c),RET(d))
278 #define SEND_SI2S(p,b) sendcmd(p,PARM,SI2S,WORD2(b),RET(0))
279 
280 #define EOB_STATUS 0x80000000 /* status flags : block boundary */
281 #define EOS_STATUS 0x40000000 /* : stoppped */
282 #define EOC_STATUS 0x20000000 /* : stream end */
283 #define ERR_STATUS 0x10000000
284 #define EMPTY_STATUS 0x08000000
285 
286 #define IEOB_ENABLE 0x1 /* enable interrupts for status notification above */
287 #define IEOS_ENABLE 0x2
288 #define IEOC_ENABLE 0x4
289 #define RDONCE 0x8
290 #define DESC_MAX_MASK 0xff
291 
292 #define ST_PLAY 0x1 /* stream states */
293 #define ST_STOP 0x2
294 #define ST_PAUSE 0x4
295 
296 #define I2S_INTDEC 3 /* config for I2S link */
297 #define I2S_MERGER 0
298 #define I2S_SPLITTER 0
299 #define I2S_MIXER 7
300 #define I2S_RATE 44100
301 
302 #define MODEM_INTDEC 4 /* config for modem link */
303 #define MODEM_MERGER 3
304 #define MODEM_SPLITTER 0
305 #define MODEM_MIXER 11
306 
307 #define FM_INTDEC 3 /* config for FM/OPL3 link */
308 #define FM_MERGER 0
309 #define FM_SPLITTER 0
310 #define FM_MIXER 9
311 
312 #define SPLIT_PATH 0x80 /* path splitting flag */
313 
314 enum FIRMWARE {
317 };
318 
319 enum CMDS {
320  GETV = 0x00, GETC, GUNS, SCID, RMEM =
321  0x10, SMEM, WMEM, SDTM, GOTO, SSTR =
322  0x20, PSTR, KSTR, KDMA, GPOS, SETF, GSTS, NGPOS, PSEL =
323  0x30, PCLR, PLST, RSSV, LSEL, SSRC = 0x40, SLST, RSRC, SSRB, SDGV =
324  0x50, RDGV, DLST, SACR = 0x60, RACR, ALST, TXAC, RXAC, SI2S =
325  0x70, ARM_SETDPLL = 0x72,
326 };
327 
328 enum E1SOURCE {
343 };
344 
345 enum E2SINK {
360 };
361 
362 enum LBUS_SINK {
366 };
367 
373 };
374 
376 
377 struct lbuspath {
378  unsigned char *noconv;
379  unsigned char *stereo;
380  unsigned char *mono;
381 };
382 
383 struct cmdport {
384  u32 data1; /* cmd,param */
385  u32 data2; /* param */
386  u32 stat; /* status */
387  u32 pad[5];
388 };
389 
390 struct riptideport {
391  u32 audio_control; /* status registers */
393  u32 pad[2];
394  struct cmdport port[2]; /* command ports */
395 };
396 
397 struct cmdif {
400  unsigned int cmdcnt; /* cmd statistics */
401  unsigned int cmdtime;
402  unsigned int cmdtimemax;
403  unsigned int cmdtimemin;
404  unsigned int errcnt;
405  int is_reset;
406 };
407 
413 };
414 
415 union cmdret {
419 };
420 
421 union firmware_version {
422  union cmdret ret;
424 };
425 
426 #define get_pcmhwdev(substream) (struct pcmhw *)(substream->runtime->private_data)
427 
428 #define PLAYBACK_SUBSTREAMS 3
429 struct snd_riptide {
430  struct snd_card *card;
431  struct pci_dev *pci;
432  const struct firmware *fw_entry;
433 
434  struct cmdif *cif;
435 
436  struct snd_pcm *pcm;
437  struct snd_pcm *pcm_i2s;
439  struct snd_opl3 *opl3;
440  struct snd_ac97 *ac97;
442 
445 
447 
448  int irq;
449  unsigned long port;
450  unsigned short mpuaddr;
451  unsigned short opladdr;
452 #ifdef SUPPORT_JOYSTICK
453  unsigned short gameaddr;
454 #endif
456 
457  unsigned short device_id;
458 
460 
464 
465  unsigned long received_irqs;
466  unsigned long handled_irqs;
467 #ifdef CONFIG_PM_SLEEP
468  int in_suspend;
469 #endif
470 };
471 
472 struct sgd { /* scatter gather desriptor */
477 };
478 
479 struct pcmhw { /* pcm descriptor */
480  struct lbuspath paths;
481  unsigned char *lbuspath;
482  unsigned char source;
483  unsigned char intdec[2];
484  unsigned char mixer;
485  unsigned char id;
486  unsigned char state;
487  unsigned int rate;
488  unsigned int channels;
491  struct sgd *sgdbuf;
492  unsigned int size;
493  unsigned int pages;
494  unsigned int oldpos;
495  unsigned int pointer;
496 };
497 
498 #define CMDRET_ZERO (union cmdret){{(u32)0, (u32) 0}}
499 
500 static int sendcmd(struct cmdif *cif, u32 flags, u32 cmd, u32 parm,
501  union cmdret *ret);
502 static int getsourcesink(struct cmdif *cif, unsigned char source,
503  unsigned char sink, unsigned char *a,
504  unsigned char *b);
505 static int snd_riptide_initialize(struct snd_riptide *chip);
506 static int riptide_reset(struct cmdif *cif, struct snd_riptide *chip);
507 
508 /*
509  */
510 
511 static DEFINE_PCI_DEVICE_TABLE(snd_riptide_ids) = {
512  { PCI_DEVICE(0x127a, 0x4310) },
513  { PCI_DEVICE(0x127a, 0x4320) },
514  { PCI_DEVICE(0x127a, 0x4330) },
515  { PCI_DEVICE(0x127a, 0x4340) },
516  {0,},
517 };
518 
519 #ifdef SUPPORT_JOYSTICK
520 static DEFINE_PCI_DEVICE_TABLE(snd_riptide_joystick_ids) = {
521  { PCI_DEVICE(0x127a, 0x4312) },
522  { PCI_DEVICE(0x127a, 0x4322) },
523  { PCI_DEVICE(0x127a, 0x4332) },
524  { PCI_DEVICE(0x127a, 0x4342) },
525  {0,},
526 };
527 #endif
528 
529 MODULE_DEVICE_TABLE(pci, snd_riptide_ids);
530 
531 /*
532  */
533 
534 static unsigned char lbusin2out[E2SINK_MAX + 1][2] = {
536  LS_NONE2},
538  LS_NONE2},
551  LS_NONE2},
571  LS_NONE2},
572 };
573 
574 static unsigned char lbus_play_opl3[] = {
576 };
577 static unsigned char lbus_play_modem[] = {
579 };
580 static unsigned char lbus_play_i2s[] = {
582 };
583 static unsigned char lbus_play_out[] = {
584  PDAC2ACLNK, 0xff
585 };
586 static unsigned char lbus_play_outhp[] = {
587  HNDSPK2ACLNK, 0xff
588 };
589 static unsigned char lbus_play_noconv1[] = {
590  DIGITAL_MIXER_IN0, 0xff
591 };
592 static unsigned char lbus_play_stereo1[] = {
594 };
595 static unsigned char lbus_play_mono1[] = {
597 };
598 static unsigned char lbus_play_noconv2[] = {
599  DIGITAL_MIXER_IN1, 0xff
600 };
601 static unsigned char lbus_play_stereo2[] = {
603 };
604 static unsigned char lbus_play_mono2[] = {
606 };
607 static unsigned char lbus_play_noconv3[] = {
608  DIGITAL_MIXER_IN2, 0xff
609 };
610 static unsigned char lbus_play_stereo3[] = {
612 };
613 static unsigned char lbus_play_mono3[] = {
615 };
616 static unsigned char lbus_rec_noconv1[] = {
617  LBUS2ARM_FIFO5, 0xff
618 };
619 static unsigned char lbus_rec_stereo1[] = {
621 };
622 static unsigned char lbus_rec_mono1[] = {
624 };
625 
626 static unsigned char play_ids[] = { 4, 1, 2, };
627 static unsigned char play_sources[] = {
629 };
630 static struct lbuspath lbus_play_paths[] = {
631  {
632  .noconv = lbus_play_noconv1,
633  .stereo = lbus_play_stereo1,
634  .mono = lbus_play_mono1,
635  },
636  {
637  .noconv = lbus_play_noconv2,
638  .stereo = lbus_play_stereo2,
639  .mono = lbus_play_mono2,
640  },
641  {
642  .noconv = lbus_play_noconv3,
643  .stereo = lbus_play_stereo3,
644  .mono = lbus_play_mono3,
645  },
646 };
647 static struct lbuspath lbus_rec_path = {
648  .noconv = lbus_rec_noconv1,
649  .stereo = lbus_rec_stereo1,
650  .mono = lbus_rec_mono1,
651 };
652 
653 #define FIRMWARE_VERSIONS 1
654 static union firmware_version firmware_versions[] = {
655  {
656  .firmware = {
657  .ASIC = 3,
658  .CODEC = 2,
659  .AUXDSP = 3,
660  .PROG = 773,
661  },
662  },
663 };
664 
665 static u32 atoh(const unsigned char *in, unsigned int len)
666 {
667  u32 sum = 0;
668  unsigned int mult = 1;
669  unsigned char c;
670 
671  while (len) {
672  int value;
673 
674  c = in[len - 1];
675  value = hex_to_bin(c);
676  if (value >= 0)
677  sum += mult * value;
678  mult *= 16;
679  --len;
680  }
681  return sum;
682 }
683 
684 static int senddata(struct cmdif *cif, const unsigned char *in, u32 offset)
685 {
686  u32 addr;
687  u32 data;
688  u32 i;
689  const unsigned char *p;
690 
691  i = atoh(&in[1], 2);
692  addr = offset + atoh(&in[3], 4);
693  if (SEND_SMEM(cif, 0, addr) != 0)
694  return -EACCES;
695  p = in + 9;
696  while (i) {
697  data = atoh(p, 8);
698  if (SEND_WMEM(cif, 2,
699  ((data & 0x0f0f0f0f) << 4) | ((data & 0xf0f0f0f0)
700  >> 4)))
701  return -EACCES;
702  i -= 4;
703  p += 8;
704  }
705  return 0;
706 }
707 
708 static int loadfirmware(struct cmdif *cif, const unsigned char *img,
709  unsigned int size)
710 {
711  const unsigned char *in;
712  u32 laddr, saddr, t, val;
713  int err = 0;
714 
715  laddr = saddr = 0;
716  while (size > 0 && err == 0) {
717  in = img;
718  if (in[0] == ':') {
719  t = atoh(&in[7], 2);
720  switch (t) {
721  case DATA_REC:
722  err = senddata(cif, in, laddr + saddr);
723  break;
724  case EXT_SEG_ADDR_REC:
725  saddr = atoh(&in[9], 4) << 4;
726  break;
727  case EXT_LIN_ADDR_REC:
728  laddr = atoh(&in[9], 4) << 16;
729  break;
730  case EXT_GOTO_CMD_REC:
731  val = atoh(&in[9], 8);
732  if (SEND_GOTO(cif, val) != 0)
733  err = -EACCES;
734  break;
735  case EXT_END_OF_FILE:
736  size = 0;
737  break;
738  default:
739  break;
740  }
741  while (size > 0) {
742  size--;
743  if (*img++ == '\n')
744  break;
745  }
746  }
747  }
748  snd_printdd("load firmware return %d\n", err);
749  return err;
750 }
751 
752 static void
753 alloclbuspath(struct cmdif *cif, unsigned char source,
754  unsigned char *path, unsigned char *mixer, unsigned char *s)
755 {
756  while (*path != 0xff) {
757  unsigned char sink, type;
758 
759  sink = *path & (~SPLIT_PATH);
760  if (sink != E2SINK_MAX) {
761  snd_printdd("alloc path 0x%x->0x%x\n", source, sink);
762  SEND_PSEL(cif, source, sink);
763  source = lbusin2out[sink][0];
764  type = lbusin2out[sink][1];
765  if (type == LS_MIXER_IN) {
766  if (mixer)
767  *mixer = sink - DIGITAL_MIXER_IN0;
768  }
769  if (type == LS_SRC_DECIMATORM ||
770  type == LS_SRC_DECIMATOR ||
771  type == LS_SRC_INTERPOLATORM ||
772  type == LS_SRC_INTERPOLATOR) {
773  if (s) {
774  if (s[0] != 0xff)
775  s[1] = sink;
776  else
777  s[0] = sink;
778  }
779  }
780  }
781  if (*path++ & SPLIT_PATH) {
782  unsigned char *npath = path;
783 
784  while (*npath != 0xff)
785  npath++;
786  alloclbuspath(cif, source + 1, ++npath, mixer, s);
787  }
788  }
789 }
790 
791 static void
792 freelbuspath(struct cmdif *cif, unsigned char source, unsigned char *path)
793 {
794  while (*path != 0xff) {
795  unsigned char sink;
796 
797  sink = *path & (~SPLIT_PATH);
798  if (sink != E2SINK_MAX) {
799  snd_printdd("free path 0x%x->0x%x\n", source, sink);
800  SEND_PCLR(cif, source, sink);
801  source = lbusin2out[sink][0];
802  }
803  if (*path++ & SPLIT_PATH) {
804  unsigned char *npath = path;
805 
806  while (*npath != 0xff)
807  npath++;
808  freelbuspath(cif, source + 1, ++npath);
809  }
810  }
811 }
812 
813 static int writearm(struct cmdif *cif, u32 addr, u32 data, u32 mask)
814 {
815  union cmdret rptr = CMDRET_ZERO;
816  unsigned int i = MAX_WRITE_RETRY;
817  int flag = 1;
818 
819  SEND_RMEM(cif, 0x02, addr, &rptr);
820  rptr.retlongs[0] &= (~mask);
821 
822  while (--i) {
823  SEND_SMEM(cif, 0x01, addr);
824  SEND_WMEM(cif, 0x02, (rptr.retlongs[0] | data));
825  SEND_RMEM(cif, 0x02, addr, &rptr);
826  if ((rptr.retlongs[0] & data) == data) {
827  flag = 0;
828  break;
829  } else
830  rptr.retlongs[0] &= ~mask;
831  }
832  snd_printdd("send arm 0x%x 0x%x 0x%x return %d\n", addr, data, mask,
833  flag);
834  return flag;
835 }
836 
837 static int sendcmd(struct cmdif *cif, u32 flags, u32 cmd, u32 parm,
838  union cmdret *ret)
839 {
840  int i, j;
841  int err;
842  unsigned int time = 0;
843  unsigned long irqflags;
844  struct riptideport *hwport;
845  struct cmdport *cmdport = NULL;
846 
847  if (snd_BUG_ON(!cif))
848  return -EINVAL;
849 
850  hwport = cif->hwport;
851  if (cif->errcnt > MAX_ERROR_COUNT) {
852  if (cif->is_reset) {
854  "Riptide: Too many failed cmds, reinitializing\n");
855  if (riptide_reset(cif, NULL) == 0) {
856  cif->errcnt = 0;
857  return -EIO;
858  }
859  }
860  snd_printk(KERN_ERR "Riptide: Initialization failed.\n");
861  return -EINVAL;
862  }
863  if (ret) {
864  ret->retlongs[0] = 0;
865  ret->retlongs[1] = 0;
866  }
867  i = 0;
868  spin_lock_irqsave(&cif->lock, irqflags);
869  while (i++ < CMDIF_TIMEOUT && !IS_READY(cif->hwport))
870  udelay(10);
871  if (i > CMDIF_TIMEOUT) {
872  err = -EBUSY;
873  goto errout;
874  }
875 
876  err = 0;
877  for (j = 0, time = 0; time < CMDIF_TIMEOUT; j++, time += 2) {
878  cmdport = &(hwport->port[j % 2]);
879  if (IS_DATF(cmdport)) { /* free pending data */
880  READ_PORT_ULONG(cmdport->data1);
881  READ_PORT_ULONG(cmdport->data2);
882  }
883  if (IS_CMDE(cmdport)) {
884  if (flags & PARM) /* put data */
885  WRITE_PORT_ULONG(cmdport->data2, parm);
886  WRITE_PORT_ULONG(cmdport->data1, cmd); /* write cmd */
887  if ((flags & RESP) && ret) {
888  while (!IS_DATF(cmdport) &&
889  time < CMDIF_TIMEOUT) {
890  udelay(10);
891  time++;
892  }
893  if (time < CMDIF_TIMEOUT) { /* read response */
894  ret->retlongs[0] =
895  READ_PORT_ULONG(cmdport->data1);
896  ret->retlongs[1] =
897  READ_PORT_ULONG(cmdport->data2);
898  } else {
899  err = -ENOSYS;
900  goto errout;
901  }
902  }
903  break;
904  }
905  udelay(20);
906  }
907  if (time == CMDIF_TIMEOUT) {
908  err = -ENODATA;
909  goto errout;
910  }
911  spin_unlock_irqrestore(&cif->lock, irqflags);
912 
913  cif->cmdcnt++; /* update command statistics */
914  cif->cmdtime += time;
915  if (time > cif->cmdtimemax)
916  cif->cmdtimemax = time;
917  if (time < cif->cmdtimemin)
918  cif->cmdtimemin = time;
919  if ((cif->cmdcnt) % 1000 == 0)
921  ("send cmd %d time: %d mintime: %d maxtime %d err: %d\n",
922  cif->cmdcnt, cif->cmdtime, cif->cmdtimemin,
923  cif->cmdtimemax, cif->errcnt);
924  return 0;
925 
926  errout:
927  cif->errcnt++;
928  spin_unlock_irqrestore(&cif->lock, irqflags);
930  ("send cmd %d hw: 0x%x flag: 0x%x cmd: 0x%x parm: 0x%x ret: 0x%x 0x%x CMDE: %d DATF: %d failed %d\n",
931  cif->cmdcnt, (int)((void *)&(cmdport->stat) - (void *)hwport),
932  flags, cmd, parm, ret ? ret->retlongs[0] : 0,
933  ret ? ret->retlongs[1] : 0, IS_CMDE(cmdport), IS_DATF(cmdport),
934  err);
935  return err;
936 }
937 
938 static int
939 setmixer(struct cmdif *cif, short num, unsigned short rval, unsigned short lval)
940 {
941  union cmdret rptr = CMDRET_ZERO;
942  int i = 0;
943 
944  snd_printdd("sent mixer %d: 0x%d 0x%d\n", num, rval, lval);
945  do {
946  SEND_SDGV(cif, num, num, rval, lval);
947  SEND_RDGV(cif, num, num, &rptr);
948  if (rptr.retwords[0] == lval && rptr.retwords[1] == rval)
949  return 0;
950  } while (i++ < MAX_WRITE_RETRY);
951  snd_printdd("sent mixer failed\n");
952  return -EIO;
953 }
954 
955 static int getpaths(struct cmdif *cif, unsigned char *o)
956 {
957  unsigned char src[E2SINK_MAX];
958  unsigned char sink[E2SINK_MAX];
959  int i, j = 0;
960 
961  for (i = 0; i < E2SINK_MAX; i++) {
962  getsourcesink(cif, i, i, &src[i], &sink[i]);
963  if (sink[i] < E2SINK_MAX) {
964  o[j++] = sink[i];
965  o[j++] = i;
966  }
967  }
968  return j;
969 }
970 
971 static int
972 getsourcesink(struct cmdif *cif, unsigned char source, unsigned char sink,
973  unsigned char *a, unsigned char *b)
974 {
975  union cmdret rptr = CMDRET_ZERO;
976 
977  if (SEND_RSSV(cif, source, sink, &rptr) &&
978  SEND_RSSV(cif, source, sink, &rptr))
979  return -EIO;
980  *a = rptr.retbytes[0];
981  *b = rptr.retbytes[1];
982  snd_printdd("getsourcesink 0x%x 0x%x\n", *a, *b);
983  return 0;
984 }
985 
986 static int
987 getsamplerate(struct cmdif *cif, unsigned char *intdec, unsigned int *rate)
988 {
989  unsigned char *s;
990  unsigned int p[2] = { 0, 0 };
991  int i;
992  union cmdret rptr = CMDRET_ZERO;
993 
994  s = intdec;
995  for (i = 0; i < 2; i++) {
996  if (*s != 0xff) {
997  if (SEND_RSRC(cif, *s, &rptr) &&
998  SEND_RSRC(cif, *s, &rptr))
999  return -EIO;
1000  p[i] += rptr.retwords[1];
1001  p[i] *= rptr.retwords[2];
1002  p[i] += rptr.retwords[3];
1003  p[i] /= 65536;
1004  }
1005  s++;
1006  }
1007  if (p[0]) {
1008  if (p[1] != p[0])
1009  snd_printdd("rates differ %d %d\n", p[0], p[1]);
1010  *rate = (unsigned int)p[0];
1011  } else
1012  *rate = (unsigned int)p[1];
1013  snd_printdd("getsampleformat %d %d %d\n", intdec[0], intdec[1], *rate);
1014  return 0;
1015 }
1016 
1017 static int
1018 setsampleformat(struct cmdif *cif,
1019  unsigned char mixer, unsigned char id,
1020  unsigned char channels, unsigned char format)
1021 {
1022  unsigned char w, ch, sig, order;
1023 
1024  snd_printdd
1025  ("setsampleformat mixer: %d id: %d channels: %d format: %d\n",
1026  mixer, id, channels, format);
1027  ch = channels == 1;
1028  w = snd_pcm_format_width(format) == 8;
1029  sig = snd_pcm_format_unsigned(format) != 0;
1030  order = snd_pcm_format_big_endian(format) != 0;
1031 
1032  if (SEND_SETF(cif, mixer, w, ch, order, sig, id) &&
1033  SEND_SETF(cif, mixer, w, ch, order, sig, id)) {
1034  snd_printdd("setsampleformat failed\n");
1035  return -EIO;
1036  }
1037  return 0;
1038 }
1039 
1040 static int
1041 setsamplerate(struct cmdif *cif, unsigned char *intdec, unsigned int rate)
1042 {
1043  u32 D, M, N;
1044  union cmdret rptr = CMDRET_ZERO;
1045  int i;
1046 
1047  snd_printdd("setsamplerate intdec: %d,%d rate: %d\n", intdec[0],
1048  intdec[1], rate);
1049  D = 48000;
1050  M = ((rate == 48000) ? 47999 : rate) * 65536;
1051  N = M % D;
1052  M /= D;
1053  for (i = 0; i < 2; i++) {
1054  if (*intdec != 0xff) {
1055  do {
1056  SEND_SSRC(cif, *intdec, D, M, N);
1057  SEND_RSRC(cif, *intdec, &rptr);
1058  } while (rptr.retwords[1] != D &&
1059  rptr.retwords[2] != M &&
1060  rptr.retwords[3] != N &&
1061  i++ < MAX_WRITE_RETRY);
1062  if (i > MAX_WRITE_RETRY) {
1063  snd_printdd("sent samplerate %d: %d failed\n",
1064  *intdec, rate);
1065  return -EIO;
1066  }
1067  }
1068  intdec++;
1069  }
1070  return 0;
1071 }
1072 
1073 static int
1074 getmixer(struct cmdif *cif, short num, unsigned short *rval,
1075  unsigned short *lval)
1076 {
1077  union cmdret rptr = CMDRET_ZERO;
1078 
1079  if (SEND_RDGV(cif, num, num, &rptr) && SEND_RDGV(cif, num, num, &rptr))
1080  return -EIO;
1081  *rval = rptr.retwords[0];
1082  *lval = rptr.retwords[1];
1083  snd_printdd("got mixer %d: 0x%d 0x%d\n", num, *rval, *lval);
1084  return 0;
1085 }
1086 
1087 static void riptide_handleirq(unsigned long dev_id)
1088 {
1089  struct snd_riptide *chip = (void *)dev_id;
1090  struct cmdif *cif = chip->cif;
1091  struct snd_pcm_substream *substream[PLAYBACK_SUBSTREAMS + 1];
1092  struct snd_pcm_runtime *runtime;
1093  struct pcmhw *data = NULL;
1094  unsigned int pos, period_bytes;
1095  struct sgd *c;
1096  int i, j;
1097  unsigned int flag;
1098 
1099  if (!cif)
1100  return;
1101 
1102  for (i = 0; i < PLAYBACK_SUBSTREAMS; i++)
1103  substream[i] = chip->playback_substream[i];
1104  substream[i] = chip->capture_substream;
1105  for (i = 0; i < PLAYBACK_SUBSTREAMS + 1; i++) {
1106  if (substream[i] &&
1107  (runtime = substream[i]->runtime) &&
1108  (data = runtime->private_data) && data->state != ST_STOP) {
1109  pos = 0;
1110  for (j = 0; j < data->pages; j++) {
1111  c = &data->sgdbuf[j];
1112  flag = le32_to_cpu(c->dwStat_Ctl);
1113  if (flag & EOB_STATUS)
1114  pos += le32_to_cpu(c->dwSegLen);
1115  if (flag & EOC_STATUS)
1116  pos += le32_to_cpu(c->dwSegLen);
1117  if ((flag & EOS_STATUS)
1118  && (data->state == ST_PLAY)) {
1119  data->state = ST_STOP;
1121  "Riptide: DMA stopped unexpectedly\n");
1122  }
1123  c->dwStat_Ctl =
1124  cpu_to_le32(flag &
1125  ~(EOS_STATUS | EOB_STATUS |
1126  EOC_STATUS));
1127  }
1128  data->pointer += pos;
1129  pos += data->oldpos;
1130  if (data->state != ST_STOP) {
1131  period_bytes =
1132  frames_to_bytes(runtime,
1133  runtime->period_size);
1134  snd_printdd
1135  ("interrupt 0x%x after 0x%lx of 0x%lx frames in period\n",
1136  READ_AUDIO_STATUS(cif->hwport),
1137  bytes_to_frames(runtime, pos),
1138  runtime->period_size);
1139  j = 0;
1140  if (pos >= period_bytes) {
1141  j++;
1142  while (pos >= period_bytes)
1143  pos -= period_bytes;
1144  }
1145  data->oldpos = pos;
1146  if (j > 0)
1147  snd_pcm_period_elapsed(substream[i]);
1148  }
1149  }
1150  }
1151 }
1152 
1153 #ifdef CONFIG_PM_SLEEP
1154 static int riptide_suspend(struct device *dev)
1155 {
1156  struct pci_dev *pci = to_pci_dev(dev);
1157  struct snd_card *card = dev_get_drvdata(dev);
1158  struct snd_riptide *chip = card->private_data;
1159 
1160  chip->in_suspend = 1;
1162  snd_pcm_suspend_all(chip->pcm);
1163  snd_ac97_suspend(chip->ac97);
1164  pci_disable_device(pci);
1165  pci_save_state(pci);
1167  return 0;
1168 }
1169 
1170 static int riptide_resume(struct device *dev)
1171 {
1172  struct pci_dev *pci = to_pci_dev(dev);
1173  struct snd_card *card = dev_get_drvdata(dev);
1174  struct snd_riptide *chip = card->private_data;
1175 
1177  pci_restore_state(pci);
1178  if (pci_enable_device(pci) < 0) {
1179  printk(KERN_ERR "riptide: pci_enable_device failed, "
1180  "disabling device\n");
1181  snd_card_disconnect(card);
1182  return -EIO;
1183  }
1184  pci_set_master(pci);
1185  snd_riptide_initialize(chip);
1186  snd_ac97_resume(chip->ac97);
1188  chip->in_suspend = 0;
1189  return 0;
1190 }
1191 
1192 static SIMPLE_DEV_PM_OPS(riptide_pm, riptide_suspend, riptide_resume);
1193 #define RIPTIDE_PM_OPS &riptide_pm
1194 #else
1195 #define RIPTIDE_PM_OPS NULL
1196 #endif /* CONFIG_PM_SLEEP */
1197 
1198 static int try_to_load_firmware(struct cmdif *cif, struct snd_riptide *chip)
1199 {
1200  union firmware_version firmware = { .ret = CMDRET_ZERO };
1201  int i, timeout, err;
1202 
1203  for (i = 0; i < 2; i++) {
1204  WRITE_PORT_ULONG(cif->hwport->port[i].data1, 0);
1205  WRITE_PORT_ULONG(cif->hwport->port[i].data2, 0);
1206  }
1207  SET_GRESET(cif->hwport);
1208  udelay(100);
1209  UNSET_GRESET(cif->hwport);
1210  udelay(100);
1211 
1212  for (timeout = 100000; --timeout; udelay(10)) {
1213  if (IS_READY(cif->hwport) && !IS_GERR(cif->hwport))
1214  break;
1215  }
1216  if (!timeout) {
1218  "Riptide: device not ready, audio status: 0x%x "
1219  "ready: %d gerr: %d\n",
1220  READ_AUDIO_STATUS(cif->hwport),
1221  IS_READY(cif->hwport), IS_GERR(cif->hwport));
1222  return -EIO;
1223  } else {
1224  snd_printdd
1225  ("Riptide: audio status: 0x%x ready: %d gerr: %d\n",
1226  READ_AUDIO_STATUS(cif->hwport),
1227  IS_READY(cif->hwport), IS_GERR(cif->hwport));
1228  }
1229 
1230  SEND_GETV(cif, &firmware.ret);
1231  snd_printdd("Firmware version: ASIC: %d CODEC %d AUXDSP %d PROG %d\n",
1232  firmware.firmware.ASIC, firmware.firmware.CODEC,
1233  firmware.firmware.AUXDSP, firmware.firmware.PROG);
1234 
1235  if (!chip)
1236  return 1;
1237 
1238  for (i = 0; i < FIRMWARE_VERSIONS; i++) {
1239  if (!memcmp(&firmware_versions[i], &firmware, sizeof(firmware)))
1240  return 1; /* OK */
1241 
1242  }
1243 
1244  snd_printdd("Writing Firmware\n");
1245  if (!chip->fw_entry) {
1246  err = request_firmware(&chip->fw_entry, "riptide.hex",
1247  &chip->pci->dev);
1248  if (err) {
1250  "Riptide: Firmware not available %d\n", err);
1251  return -EIO;
1252  }
1253  }
1254  err = loadfirmware(cif, chip->fw_entry->data, chip->fw_entry->size);
1255  if (err) {
1257  "Riptide: Could not load firmware %d\n", err);
1258  return err;
1259  }
1260 
1261  chip->firmware = firmware;
1262 
1263  return 1; /* OK */
1264 }
1265 
1266 static int riptide_reset(struct cmdif *cif, struct snd_riptide *chip)
1267 {
1268  union cmdret rptr = CMDRET_ZERO;
1269  int err, tries;
1270 
1271  if (!cif)
1272  return -EINVAL;
1273 
1274  cif->cmdcnt = 0;
1275  cif->cmdtime = 0;
1276  cif->cmdtimemax = 0;
1277  cif->cmdtimemin = 0xffffffff;
1278  cif->errcnt = 0;
1279  cif->is_reset = 0;
1280 
1281  tries = RESET_TRIES;
1282  do {
1283  err = try_to_load_firmware(cif, chip);
1284  if (err < 0)
1285  return err;
1286  } while (!err && --tries);
1287 
1288  SEND_SACR(cif, 0, AC97_RESET);
1289  SEND_RACR(cif, AC97_RESET, &rptr);
1290  snd_printdd("AC97: 0x%x 0x%x\n", rptr.retlongs[0], rptr.retlongs[1]);
1291 
1292  SEND_PLST(cif, 0);
1293  SEND_SLST(cif, 0);
1294  SEND_DLST(cif, 0);
1295  SEND_ALST(cif, 0);
1296  SEND_KDMA(cif);
1297 
1298  writearm(cif, 0x301F8, 1, 1);
1299  writearm(cif, 0x301F4, 1, 1);
1300 
1303  setmixer(cif, MODEM_MIXER, 0x7fff, 0x7fff);
1304  alloclbuspath(cif, ARM2LBUS_FIFO13, lbus_play_modem, NULL, NULL);
1305 
1307  FM_MIXER);
1308  setmixer(cif, FM_MIXER, 0x7fff, 0x7fff);
1309  writearm(cif, 0x30648 + FM_MIXER * 4, 0x01, 0x00000005);
1310  writearm(cif, 0x301A8, 0x02, 0x00000002);
1311  writearm(cif, 0x30264, 0x08, 0xffffffff);
1312  alloclbuspath(cif, OPL3_SAMPLE, lbus_play_opl3, NULL, NULL);
1313 
1314  SEND_SSRC(cif, I2S_INTDEC, 48000,
1315  ((u32) I2S_RATE * 65536) / 48000,
1316  ((u32) I2S_RATE * 65536) % 48000);
1318  I2S_MIXER);
1319  SEND_SI2S(cif, 1);
1320  alloclbuspath(cif, ARM2LBUS_FIFO0, lbus_play_i2s, NULL, NULL);
1321  alloclbuspath(cif, DIGITAL_MIXER_OUT0, lbus_play_out, NULL, NULL);
1322  alloclbuspath(cif, DIGITAL_MIXER_OUT0, lbus_play_outhp, NULL, NULL);
1323 
1324  SET_AIACK(cif->hwport);
1325  SET_AIE(cif->hwport);
1326  SET_AIACK(cif->hwport);
1327  cif->is_reset = 1;
1328 
1329  return 0;
1330 }
1331 
1332 static struct snd_pcm_hardware snd_riptide_playback = {
1336  .formats =
1340  .rate_min = 5500,
1341  .rate_max = 48000,
1342  .channels_min = 1,
1343  .channels_max = 2,
1344  .buffer_bytes_max = (64 * 1024),
1345  .period_bytes_min = PAGE_SIZE >> 1,
1346  .period_bytes_max = PAGE_SIZE << 8,
1347  .periods_min = 2,
1348  .periods_max = 64,
1349  .fifo_size = 0,
1350 };
1351 static struct snd_pcm_hardware snd_riptide_capture = {
1355  .formats =
1359  .rate_min = 5500,
1360  .rate_max = 48000,
1361  .channels_min = 1,
1362  .channels_max = 2,
1363  .buffer_bytes_max = (64 * 1024),
1364  .period_bytes_min = PAGE_SIZE >> 1,
1365  .period_bytes_max = PAGE_SIZE << 3,
1366  .periods_min = 2,
1367  .periods_max = 64,
1368  .fifo_size = 0,
1369 };
1370 
1371 static snd_pcm_uframes_t snd_riptide_pointer(struct snd_pcm_substream
1372  *substream)
1373 {
1374  struct snd_riptide *chip = snd_pcm_substream_chip(substream);
1375  struct snd_pcm_runtime *runtime = substream->runtime;
1376  struct pcmhw *data = get_pcmhwdev(substream);
1377  struct cmdif *cif = chip->cif;
1378  union cmdret rptr = CMDRET_ZERO;
1380 
1381  SEND_GPOS(cif, 0, data->id, &rptr);
1382  if (data->size && runtime->period_size) {
1383  snd_printdd
1384  ("pointer stream %d position 0x%x(0x%x in buffer) bytes 0x%lx(0x%lx in period) frames\n",
1385  data->id, rptr.retlongs[1], rptr.retlongs[1] % data->size,
1386  bytes_to_frames(runtime, rptr.retlongs[1]),
1387  bytes_to_frames(runtime,
1388  rptr.retlongs[1]) % runtime->period_size);
1389  if (rptr.retlongs[1] > data->pointer)
1390  ret =
1391  bytes_to_frames(runtime,
1392  rptr.retlongs[1] % data->size);
1393  else
1394  ret =
1395  bytes_to_frames(runtime,
1396  data->pointer % data->size);
1397  } else {
1398  snd_printdd("stream not started or strange parms (%d %ld)\n",
1399  data->size, runtime->period_size);
1400  ret = bytes_to_frames(runtime, 0);
1401  }
1402  return ret;
1403 }
1404 
1405 static int snd_riptide_trigger(struct snd_pcm_substream *substream, int cmd)
1406 {
1407  int i, j;
1408  struct snd_riptide *chip = snd_pcm_substream_chip(substream);
1409  struct pcmhw *data = get_pcmhwdev(substream);
1410  struct cmdif *cif = chip->cif;
1411  union cmdret rptr = CMDRET_ZERO;
1412 
1413  spin_lock(&chip->lock);
1414  switch (cmd) {
1417  if (!(data->state & ST_PLAY)) {
1418  SEND_SSTR(cif, data->id, data->sgdlist.addr);
1419  SET_AIE(cif->hwport);
1420  data->state = ST_PLAY;
1421  if (data->mixer != 0xff)
1422  setmixer(cif, data->mixer, 0x7fff, 0x7fff);
1423  chip->openstreams++;
1424  data->oldpos = 0;
1425  data->pointer = 0;
1426  }
1427  break;
1430  if (data->mixer != 0xff)
1431  setmixer(cif, data->mixer, 0, 0);
1432  setmixer(cif, data->mixer, 0, 0);
1433  SEND_KSTR(cif, data->id);
1434  data->state = ST_STOP;
1435  chip->openstreams--;
1436  j = 0;
1437  do {
1438  i = rptr.retlongs[1];
1439  SEND_GPOS(cif, 0, data->id, &rptr);
1440  udelay(1);
1441  } while (i != rptr.retlongs[1] && j++ < MAX_WRITE_RETRY);
1442  if (j > MAX_WRITE_RETRY)
1443  snd_printk(KERN_ERR "Riptide: Could not stop stream!");
1444  break;
1446  if (!(data->state & ST_PAUSE)) {
1447  SEND_PSTR(cif, data->id);
1448  data->state |= ST_PAUSE;
1449  chip->openstreams--;
1450  }
1451  break;
1453  if (data->state & ST_PAUSE) {
1454  SEND_SSTR(cif, data->id, data->sgdlist.addr);
1455  data->state &= ~ST_PAUSE;
1456  chip->openstreams++;
1457  }
1458  break;
1459  default:
1460  spin_unlock(&chip->lock);
1461  return -EINVAL;
1462  }
1463  spin_unlock(&chip->lock);
1464  return 0;
1465 }
1466 
1467 static int snd_riptide_prepare(struct snd_pcm_substream *substream)
1468 {
1469  struct snd_riptide *chip = snd_pcm_substream_chip(substream);
1470  struct snd_pcm_runtime *runtime = substream->runtime;
1471  struct pcmhw *data = get_pcmhwdev(substream);
1472  struct cmdif *cif = chip->cif;
1473  unsigned char *lbuspath = NULL;
1474  unsigned int rate, channels;
1475  int err = 0;
1477 
1478  if (snd_BUG_ON(!cif || !data))
1479  return -EINVAL;
1480 
1481  snd_printdd("prepare id %d ch: %d f:0x%x r:%d\n", data->id,
1482  runtime->channels, runtime->format, runtime->rate);
1483 
1484  spin_lock_irq(&chip->lock);
1485  channels = runtime->channels;
1486  format = runtime->format;
1487  rate = runtime->rate;
1488  switch (channels) {
1489  case 1:
1490  if (rate == 48000 && format == SNDRV_PCM_FORMAT_S16_LE)
1491  lbuspath = data->paths.noconv;
1492  else
1493  lbuspath = data->paths.mono;
1494  break;
1495  case 2:
1496  if (rate == 48000 && format == SNDRV_PCM_FORMAT_S16_LE)
1497  lbuspath = data->paths.noconv;
1498  else
1499  lbuspath = data->paths.stereo;
1500  break;
1501  }
1502  snd_printdd("use sgdlist at 0x%p\n",
1503  data->sgdlist.area);
1504  if (data->sgdlist.area) {
1505  unsigned int i, j, size, pages, f, pt, period;
1506  struct sgd *c, *p = NULL;
1507 
1508  size = frames_to_bytes(runtime, runtime->buffer_size);
1509  period = frames_to_bytes(runtime, runtime->period_size);
1510  f = PAGE_SIZE;
1511  while ((size + (f >> 1) - 1) <= (f << 7) && (f << 1) > period)
1512  f = f >> 1;
1513  pages = (size + f - 1) / f;
1514  data->size = size;
1515  data->pages = pages;
1516  snd_printdd
1517  ("create sgd size: 0x%x pages %d of size 0x%x for period 0x%x\n",
1518  size, pages, f, period);
1519  pt = 0;
1520  j = 0;
1521  for (i = 0; i < pages; i++) {
1522  unsigned int ofs, addr;
1523  c = &data->sgdbuf[i];
1524  if (p)
1525  p->dwNextLink = cpu_to_le32(data->sgdlist.addr +
1526  (i *
1527  sizeof(struct
1528  sgd)));
1529  c->dwNextLink = cpu_to_le32(data->sgdlist.addr);
1530  ofs = j << PAGE_SHIFT;
1531  addr = snd_pcm_sgbuf_get_addr(substream, ofs) + pt;
1532  c->dwSegPtrPhys = cpu_to_le32(addr);
1533  pt = (pt + f) % PAGE_SIZE;
1534  if (pt == 0)
1535  j++;
1536  c->dwSegLen = cpu_to_le32(f);
1537  c->dwStat_Ctl =
1539  IEOC_ENABLE);
1540  p = c;
1541  size -= f;
1542  }
1543  data->sgdbuf[i].dwSegLen = cpu_to_le32(size);
1544  }
1545  if (lbuspath && lbuspath != data->lbuspath) {
1546  if (data->lbuspath)
1547  freelbuspath(cif, data->source, data->lbuspath);
1548  alloclbuspath(cif, data->source, lbuspath,
1549  &data->mixer, data->intdec);
1550  data->lbuspath = lbuspath;
1551  data->rate = 0;
1552  }
1553  if (data->rate != rate || data->format != format ||
1554  data->channels != channels) {
1555  data->rate = rate;
1556  data->format = format;
1557  data->channels = channels;
1558  if (setsampleformat
1559  (cif, data->mixer, data->id, channels, format)
1560  || setsamplerate(cif, data->intdec, rate))
1561  err = -EIO;
1562  }
1563  spin_unlock_irq(&chip->lock);
1564  return err;
1565 }
1566 
1567 static int
1568 snd_riptide_hw_params(struct snd_pcm_substream *substream,
1569  struct snd_pcm_hw_params *hw_params)
1570 {
1571  struct snd_riptide *chip = snd_pcm_substream_chip(substream);
1572  struct pcmhw *data = get_pcmhwdev(substream);
1573  struct snd_dma_buffer *sgdlist = &data->sgdlist;
1574  int err;
1575 
1576  snd_printdd("hw params id %d (sgdlist: 0x%p 0x%lx %d)\n", data->id,
1577  sgdlist->area, (unsigned long)sgdlist->addr,
1578  (int)sgdlist->bytes);
1579  if (sgdlist->area)
1580  snd_dma_free_pages(sgdlist);
1582  snd_dma_pci_data(chip->pci),
1583  sizeof(struct sgd) * (DESC_MAX_MASK + 1),
1584  sgdlist)) < 0) {
1585  snd_printk(KERN_ERR "Riptide: failed to alloc %d dma bytes\n",
1586  (int)sizeof(struct sgd) * (DESC_MAX_MASK + 1));
1587  return err;
1588  }
1589  data->sgdbuf = (struct sgd *)sgdlist->area;
1590  return snd_pcm_lib_malloc_pages(substream,
1591  params_buffer_bytes(hw_params));
1592 }
1593 
1594 static int snd_riptide_hw_free(struct snd_pcm_substream *substream)
1595 {
1596  struct snd_riptide *chip = snd_pcm_substream_chip(substream);
1597  struct pcmhw *data = get_pcmhwdev(substream);
1598  struct cmdif *cif = chip->cif;
1599 
1600  if (cif && data) {
1601  if (data->lbuspath)
1602  freelbuspath(cif, data->source, data->lbuspath);
1603  data->lbuspath = NULL;
1604  data->source = 0xff;
1605  data->intdec[0] = 0xff;
1606  data->intdec[1] = 0xff;
1607 
1608  if (data->sgdlist.area) {
1609  snd_dma_free_pages(&data->sgdlist);
1610  data->sgdlist.area = NULL;
1611  }
1612  }
1613  return snd_pcm_lib_free_pages(substream);
1614 }
1615 
1616 static int snd_riptide_playback_open(struct snd_pcm_substream *substream)
1617 {
1618  struct snd_riptide *chip = snd_pcm_substream_chip(substream);
1619  struct snd_pcm_runtime *runtime = substream->runtime;
1620  struct pcmhw *data;
1621  int sub_num = substream->number;
1622 
1623  chip->playback_substream[sub_num] = substream;
1624  runtime->hw = snd_riptide_playback;
1625 
1626  data = kzalloc(sizeof(struct pcmhw), GFP_KERNEL);
1627  if (data == NULL)
1628  return -ENOMEM;
1629  data->paths = lbus_play_paths[sub_num];
1630  data->id = play_ids[sub_num];
1631  data->source = play_sources[sub_num];
1632  data->intdec[0] = 0xff;
1633  data->intdec[1] = 0xff;
1634  data->state = ST_STOP;
1635  runtime->private_data = data;
1636  return snd_pcm_hw_constraint_integer(runtime,
1638 }
1639 
1640 static int snd_riptide_capture_open(struct snd_pcm_substream *substream)
1641 {
1642  struct snd_riptide *chip = snd_pcm_substream_chip(substream);
1643  struct snd_pcm_runtime *runtime = substream->runtime;
1644  struct pcmhw *data;
1645 
1646  chip->capture_substream = substream;
1647  runtime->hw = snd_riptide_capture;
1648 
1649  data = kzalloc(sizeof(struct pcmhw), GFP_KERNEL);
1650  if (data == NULL)
1651  return -ENOMEM;
1652  data->paths = lbus_rec_path;
1653  data->id = PADC;
1654  data->source = ACLNK2PADC;
1655  data->intdec[0] = 0xff;
1656  data->intdec[1] = 0xff;
1657  data->state = ST_STOP;
1658  runtime->private_data = data;
1659  return snd_pcm_hw_constraint_integer(runtime,
1661 }
1662 
1663 static int snd_riptide_playback_close(struct snd_pcm_substream *substream)
1664 {
1665  struct snd_riptide *chip = snd_pcm_substream_chip(substream);
1666  struct pcmhw *data = get_pcmhwdev(substream);
1667  int sub_num = substream->number;
1668 
1669  substream->runtime->private_data = NULL;
1670  chip->playback_substream[sub_num] = NULL;
1671  kfree(data);
1672  return 0;
1673 }
1674 
1675 static int snd_riptide_capture_close(struct snd_pcm_substream *substream)
1676 {
1677  struct snd_riptide *chip = snd_pcm_substream_chip(substream);
1678  struct pcmhw *data = get_pcmhwdev(substream);
1679 
1680  substream->runtime->private_data = NULL;
1681  chip->capture_substream = NULL;
1682  kfree(data);
1683  return 0;
1684 }
1685 
1686 static struct snd_pcm_ops snd_riptide_playback_ops = {
1687  .open = snd_riptide_playback_open,
1688  .close = snd_riptide_playback_close,
1689  .ioctl = snd_pcm_lib_ioctl,
1690  .hw_params = snd_riptide_hw_params,
1691  .hw_free = snd_riptide_hw_free,
1692  .prepare = snd_riptide_prepare,
1693  .page = snd_pcm_sgbuf_ops_page,
1694  .trigger = snd_riptide_trigger,
1695  .pointer = snd_riptide_pointer,
1696 };
1697 static struct snd_pcm_ops snd_riptide_capture_ops = {
1698  .open = snd_riptide_capture_open,
1699  .close = snd_riptide_capture_close,
1700  .ioctl = snd_pcm_lib_ioctl,
1701  .hw_params = snd_riptide_hw_params,
1702  .hw_free = snd_riptide_hw_free,
1703  .prepare = snd_riptide_prepare,
1704  .page = snd_pcm_sgbuf_ops_page,
1705  .trigger = snd_riptide_trigger,
1706  .pointer = snd_riptide_pointer,
1707 };
1708 
1709 static int __devinit
1710 snd_riptide_pcm(struct snd_riptide *chip, int device, struct snd_pcm **rpcm)
1711 {
1712  struct snd_pcm *pcm;
1713  int err;
1714 
1715  if (rpcm)
1716  *rpcm = NULL;
1717  if ((err =
1718  snd_pcm_new(chip->card, "RIPTIDE", device, PLAYBACK_SUBSTREAMS, 1,
1719  &pcm)) < 0)
1720  return err;
1722  &snd_riptide_playback_ops);
1724  &snd_riptide_capture_ops);
1725  pcm->private_data = chip;
1726  pcm->info_flags = 0;
1727  strcpy(pcm->name, "RIPTIDE");
1728  chip->pcm = pcm;
1730  snd_dma_pci_data(chip->pci),
1731  64 * 1024, 128 * 1024);
1732  if (rpcm)
1733  *rpcm = pcm;
1734  return 0;
1735 }
1736 
1737 static irqreturn_t
1738 snd_riptide_interrupt(int irq, void *dev_id)
1739 {
1740  struct snd_riptide *chip = dev_id;
1741  struct cmdif *cif = chip->cif;
1742 
1743  if (cif) {
1744  chip->received_irqs++;
1745  if (IS_EOBIRQ(cif->hwport) || IS_EOSIRQ(cif->hwport) ||
1746  IS_EOCIRQ(cif->hwport)) {
1747  chip->handled_irqs++;
1748  tasklet_schedule(&chip->riptide_tq);
1749  }
1750  if (chip->rmidi && IS_MPUIRQ(cif->hwport)) {
1751  chip->handled_irqs++;
1753  chip->rmidi->private_data);
1754  }
1755  SET_AIACK(cif->hwport);
1756  }
1757  return IRQ_HANDLED;
1758 }
1759 
1760 static void
1761 snd_riptide_codec_write(struct snd_ac97 *ac97, unsigned short reg,
1762  unsigned short val)
1763 {
1764  struct snd_riptide *chip = ac97->private_data;
1765  struct cmdif *cif = chip->cif;
1766  union cmdret rptr = CMDRET_ZERO;
1767  int i = 0;
1768 
1769  if (snd_BUG_ON(!cif))
1770  return;
1771 
1772  snd_printdd("Write AC97 reg 0x%x 0x%x\n", reg, val);
1773  do {
1774  SEND_SACR(cif, val, reg);
1775  SEND_RACR(cif, reg, &rptr);
1776  } while (rptr.retwords[1] != val && i++ < MAX_WRITE_RETRY);
1777  if (i > MAX_WRITE_RETRY)
1778  snd_printdd("Write AC97 reg failed\n");
1779 }
1780 
1781 static unsigned short snd_riptide_codec_read(struct snd_ac97 *ac97,
1782  unsigned short reg)
1783 {
1784  struct snd_riptide *chip = ac97->private_data;
1785  struct cmdif *cif = chip->cif;
1786  union cmdret rptr = CMDRET_ZERO;
1787 
1788  if (snd_BUG_ON(!cif))
1789  return 0;
1790 
1791  if (SEND_RACR(cif, reg, &rptr) != 0)
1792  SEND_RACR(cif, reg, &rptr);
1793  snd_printdd("Read AC97 reg 0x%x got 0x%x\n", reg, rptr.retwords[1]);
1794  return rptr.retwords[1];
1795 }
1796 
1797 static int snd_riptide_initialize(struct snd_riptide *chip)
1798 {
1799  struct cmdif *cif;
1800  unsigned int device_id;
1801  int err;
1802 
1803  if (snd_BUG_ON(!chip))
1804  return -EINVAL;
1805 
1806  cif = chip->cif;
1807  if (!cif) {
1808  if ((cif = kzalloc(sizeof(struct cmdif), GFP_KERNEL)) == NULL)
1809  return -ENOMEM;
1810  cif->hwport = (struct riptideport *)chip->port;
1811  spin_lock_init(&cif->lock);
1812  chip->cif = cif;
1813  }
1814  cif->is_reset = 0;
1815  if ((err = riptide_reset(cif, chip)) != 0)
1816  return err;
1817  device_id = chip->device_id;
1818  switch (device_id) {
1819  case 0x4310:
1820  case 0x4320:
1821  case 0x4330:
1822  snd_printdd("Modem enable?\n");
1823  SEND_SETDPLL(cif);
1824  break;
1825  }
1826  snd_printdd("Enabling MPU IRQs\n");
1827  if (chip->rmidi)
1828  SET_EMPUIRQ(cif->hwport);
1829  return err;
1830 }
1831 
1832 static int snd_riptide_free(struct snd_riptide *chip)
1833 {
1834  struct cmdif *cif;
1835 
1836  if (!chip)
1837  return 0;
1838 
1839  if ((cif = chip->cif)) {
1840  SET_GRESET(cif->hwport);
1841  udelay(100);
1842  UNSET_GRESET(cif->hwport);
1843  kfree(chip->cif);
1844  }
1845  if (chip->irq >= 0)
1846  free_irq(chip->irq, chip);
1847  release_firmware(chip->fw_entry);
1849  kfree(chip);
1850  return 0;
1851 }
1852 
1853 static int snd_riptide_dev_free(struct snd_device *device)
1854 {
1855  struct snd_riptide *chip = device->device_data;
1856 
1857  return snd_riptide_free(chip);
1858 }
1859 
1860 static int __devinit
1861 snd_riptide_create(struct snd_card *card, struct pci_dev *pci,
1862  struct snd_riptide **rchip)
1863 {
1864  struct snd_riptide *chip;
1865  struct riptideport *hwport;
1866  int err;
1867  static struct snd_device_ops ops = {
1868  .dev_free = snd_riptide_dev_free,
1869  };
1870 
1871  *rchip = NULL;
1872  if ((err = pci_enable_device(pci)) < 0)
1873  return err;
1874  if (!(chip = kzalloc(sizeof(struct snd_riptide), GFP_KERNEL)))
1875  return -ENOMEM;
1876 
1877  spin_lock_init(&chip->lock);
1878  chip->card = card;
1879  chip->pci = pci;
1880  chip->irq = -1;
1881  chip->openstreams = 0;
1882  chip->port = pci_resource_start(pci, 0);
1883  chip->received_irqs = 0;
1884  chip->handled_irqs = 0;
1885  chip->cif = NULL;
1886  tasklet_init(&chip->riptide_tq, riptide_handleirq, (unsigned long)chip);
1887 
1888  if ((chip->res_port =
1889  request_region(chip->port, 64, "RIPTIDE")) == NULL) {
1891  "Riptide: unable to grab region 0x%lx-0x%lx\n",
1892  chip->port, chip->port + 64 - 1);
1893  snd_riptide_free(chip);
1894  return -EBUSY;
1895  }
1896  hwport = (struct riptideport *)chip->port;
1897  UNSET_AIE(hwport);
1898 
1899  if (request_irq(pci->irq, snd_riptide_interrupt, IRQF_SHARED,
1900  KBUILD_MODNAME, chip)) {
1901  snd_printk(KERN_ERR "Riptide: unable to grab IRQ %d\n",
1902  pci->irq);
1903  snd_riptide_free(chip);
1904  return -EBUSY;
1905  }
1906  chip->irq = pci->irq;
1907  chip->device_id = pci->device;
1908  pci_set_master(pci);
1909  if ((err = snd_riptide_initialize(chip)) < 0) {
1910  snd_riptide_free(chip);
1911  return err;
1912  }
1913 
1914  if ((err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops)) < 0) {
1915  snd_riptide_free(chip);
1916  return err;
1917  }
1918 
1919  snd_card_set_dev(card, &pci->dev);
1920 
1921  *rchip = chip;
1922  return 0;
1923 }
1924 
1925 static void
1926 snd_riptide_proc_read(struct snd_info_entry *entry,
1927  struct snd_info_buffer *buffer)
1928 {
1929  struct snd_riptide *chip = entry->private_data;
1930  struct pcmhw *data;
1931  int i;
1932  struct cmdif *cif = NULL;
1933  unsigned char p[256];
1934  unsigned short rval = 0, lval = 0;
1935  unsigned int rate;
1936 
1937  if (!chip)
1938  return;
1939 
1940  snd_iprintf(buffer, "%s\n\n", chip->card->longname);
1941  snd_iprintf(buffer, "Device ID: 0x%x\nReceived IRQs: (%ld)%ld\nPorts:",
1942  chip->device_id, chip->handled_irqs, chip->received_irqs);
1943  for (i = 0; i < 64; i += 4)
1944  snd_iprintf(buffer, "%c%02x: %08x",
1945  (i % 16) ? ' ' : '\n', i, inl(chip->port + i));
1946  if ((cif = chip->cif)) {
1947  snd_iprintf(buffer,
1948  "\nVersion: ASIC: %d CODEC: %d AUXDSP: %d PROG: %d",
1949  chip->firmware.firmware.ASIC,
1950  chip->firmware.firmware.CODEC,
1951  chip->firmware.firmware.AUXDSP,
1952  chip->firmware.firmware.PROG);
1953  snd_iprintf(buffer, "\nDigital mixer:");
1954  for (i = 0; i < 12; i++) {
1955  getmixer(cif, i, &rval, &lval);
1956  snd_iprintf(buffer, "\n %d: %d %d", i, rval, lval);
1957  }
1958  snd_iprintf(buffer,
1959  "\nARM Commands num: %d failed: %d time: %d max: %d min: %d",
1960  cif->cmdcnt, cif->errcnt,
1961  cif->cmdtime, cif->cmdtimemax, cif->cmdtimemin);
1962  }
1963  snd_iprintf(buffer, "\nOpen streams %d:\n", chip->openstreams);
1964  for (i = 0; i < PLAYBACK_SUBSTREAMS; i++) {
1965  if (chip->playback_substream[i]
1966  && chip->playback_substream[i]->runtime
1967  && (data =
1968  chip->playback_substream[i]->runtime->private_data)) {
1969  snd_iprintf(buffer,
1970  "stream: %d mixer: %d source: %d (%d,%d)\n",
1971  data->id, data->mixer, data->source,
1972  data->intdec[0], data->intdec[1]);
1973  if (!(getsamplerate(cif, data->intdec, &rate)))
1974  snd_iprintf(buffer, "rate: %d\n", rate);
1975  }
1976  }
1977  if (chip->capture_substream
1978  && chip->capture_substream->runtime
1979  && (data = chip->capture_substream->runtime->private_data)) {
1980  snd_iprintf(buffer,
1981  "stream: %d mixer: %d source: %d (%d,%d)\n",
1982  data->id, data->mixer,
1983  data->source, data->intdec[0], data->intdec[1]);
1984  if (!(getsamplerate(cif, data->intdec, &rate)))
1985  snd_iprintf(buffer, "rate: %d\n", rate);
1986  }
1987  snd_iprintf(buffer, "Paths:\n");
1988  i = getpaths(cif, p);
1989  while (i >= 2) {
1990  i -= 2;
1991  snd_iprintf(buffer, "%x->%x ", p[i], p[i + 1]);
1992  }
1993  snd_iprintf(buffer, "\n");
1994 }
1995 
1996 static void __devinit snd_riptide_proc_init(struct snd_riptide *chip)
1997 {
1998  struct snd_info_entry *entry;
1999 
2000  if (!snd_card_proc_new(chip->card, "riptide", &entry))
2001  snd_info_set_text_ops(entry, chip, snd_riptide_proc_read);
2002 }
2003 
2004 static int __devinit snd_riptide_mixer(struct snd_riptide *chip)
2005 {
2006  struct snd_ac97_bus *pbus;
2007  struct snd_ac97_template ac97;
2008  int err = 0;
2009  static struct snd_ac97_bus_ops ops = {
2010  .write = snd_riptide_codec_write,
2011  .read = snd_riptide_codec_read,
2012  };
2013 
2014  memset(&ac97, 0, sizeof(ac97));
2015  ac97.private_data = chip;
2016  ac97.scaps = AC97_SCAP_SKIP_MODEM;
2017 
2018  if ((err = snd_ac97_bus(chip->card, 0, &ops, chip, &pbus)) < 0)
2019  return err;
2020 
2021  chip->ac97_bus = pbus;
2022  ac97.pci = chip->pci;
2023  if ((err = snd_ac97_mixer(pbus, &ac97, &chip->ac97)) < 0)
2024  return err;
2025  return err;
2026 }
2027 
2028 #ifdef SUPPORT_JOYSTICK
2029 
2030 static int __devinit
2031 snd_riptide_joystick_probe(struct pci_dev *pci, const struct pci_device_id *id)
2032 {
2033  static int dev;
2034  struct gameport *gameport;
2035 
2036  if (dev >= SNDRV_CARDS)
2037  return -ENODEV;
2038  if (!enable[dev]) {
2039  dev++;
2040  return -ENOENT;
2041  }
2042 
2043  if (!joystick_port[dev++])
2044  return 0;
2045 
2046  gameport = gameport_allocate_port();
2047  if (!gameport)
2048  return -ENOMEM;
2049  if (!request_region(joystick_port[dev], 8, "Riptide gameport")) {
2051  "Riptide: cannot grab gameport 0x%x\n",
2052  joystick_port[dev]);
2053  gameport_free_port(gameport);
2054  return -EBUSY;
2055  }
2056 
2057  gameport->io = joystick_port[dev];
2058  gameport_register_port(gameport);
2059  pci_set_drvdata(pci, gameport);
2060  return 0;
2061 }
2062 
2063 static void __devexit snd_riptide_joystick_remove(struct pci_dev *pci)
2064 {
2065  struct gameport *gameport = pci_get_drvdata(pci);
2066  if (gameport) {
2067  release_region(gameport->io, 8);
2068  gameport_unregister_port(gameport);
2069  pci_set_drvdata(pci, NULL);
2070  }
2071 }
2072 #endif
2073 
2074 static int __devinit
2075 snd_card_riptide_probe(struct pci_dev *pci, const struct pci_device_id *pci_id)
2076 {
2077  static int dev;
2078  struct snd_card *card;
2079  struct snd_riptide *chip;
2080  unsigned short val;
2081  int err;
2082 
2083  if (dev >= SNDRV_CARDS)
2084  return -ENODEV;
2085  if (!enable[dev]) {
2086  dev++;
2087  return -ENOENT;
2088  }
2089 
2090  err = snd_card_create(index[dev], id[dev], THIS_MODULE, 0, &card);
2091  if (err < 0)
2092  return err;
2093  err = snd_riptide_create(card, pci, &chip);
2094  if (err < 0)
2095  goto error;
2096  card->private_data = chip;
2097  err = snd_riptide_pcm(chip, 0, NULL);
2098  if (err < 0)
2099  goto error;
2100  err = snd_riptide_mixer(chip);
2101  if (err < 0)
2102  goto error;
2103 
2104  val = LEGACY_ENABLE_ALL;
2105  if (opl3_port[dev])
2106  val |= LEGACY_ENABLE_FM;
2107 #ifdef SUPPORT_JOYSTICK
2108  if (joystick_port[dev])
2109  val |= LEGACY_ENABLE_GAMEPORT;
2110 #endif
2111  if (mpu_port[dev])
2113  val |= (chip->irq << 4) & 0xf0;
2114  pci_write_config_word(chip->pci, PCI_EXT_Legacy_Mask, val);
2115  if (mpu_port[dev]) {
2116  val = mpu_port[dev];
2117  pci_write_config_word(chip->pci, PCI_EXT_MPU_Base, val);
2118  err = snd_mpu401_uart_new(card, 0, MPU401_HW_RIPTIDE,
2119  val, MPU401_INFO_IRQ_HOOK, -1,
2120  &chip->rmidi);
2121  if (err < 0)
2123  "Riptide: Can't Allocate MPU at 0x%x\n",
2124  val);
2125  else
2126  chip->mpuaddr = val;
2127  }
2128  if (opl3_port[dev]) {
2129  val = opl3_port[dev];
2130  pci_write_config_word(chip->pci, PCI_EXT_FM_Base, val);
2131  err = snd_opl3_create(card, val, val + 2,
2132  OPL3_HW_RIPTIDE, 0, &chip->opl3);
2133  if (err < 0)
2135  "Riptide: Can't Allocate OPL3 at 0x%x\n",
2136  val);
2137  else {
2138  chip->opladdr = val;
2139  err = snd_opl3_hwdep_new(chip->opl3, 0, 1, NULL);
2140  if (err < 0)
2142  "Riptide: Can't Allocate OPL3-HWDEP\n");
2143  }
2144  }
2145 #ifdef SUPPORT_JOYSTICK
2146  if (joystick_port[dev]) {
2147  val = joystick_port[dev];
2148  pci_write_config_word(chip->pci, PCI_EXT_Game_Base, val);
2149  chip->gameaddr = val;
2150  }
2151 #endif
2152 
2153  strcpy(card->driver, "RIPTIDE");
2154  strcpy(card->shortname, "Riptide");
2155 #ifdef SUPPORT_JOYSTICK
2156  snprintf(card->longname, sizeof(card->longname),
2157  "%s at 0x%lx, irq %i mpu 0x%x opl3 0x%x gameport 0x%x",
2158  card->shortname, chip->port, chip->irq, chip->mpuaddr,
2159  chip->opladdr, chip->gameaddr);
2160 #else
2161  snprintf(card->longname, sizeof(card->longname),
2162  "%s at 0x%lx, irq %i mpu 0x%x opl3 0x%x",
2163  card->shortname, chip->port, chip->irq, chip->mpuaddr,
2164  chip->opladdr);
2165 #endif
2166  snd_riptide_proc_init(chip);
2167  err = snd_card_register(card);
2168  if (err < 0)
2169  goto error;
2170  pci_set_drvdata(pci, card);
2171  dev++;
2172  return 0;
2173 
2174  error:
2175  snd_card_free(card);
2176  return err;
2177 }
2178 
2179 static void __devexit snd_card_riptide_remove(struct pci_dev *pci)
2180 {
2181  snd_card_free(pci_get_drvdata(pci));
2182  pci_set_drvdata(pci, NULL);
2183 }
2184 
2185 static struct pci_driver driver = {
2186  .name = KBUILD_MODNAME,
2187  .id_table = snd_riptide_ids,
2188  .probe = snd_card_riptide_probe,
2189  .remove = __devexit_p(snd_card_riptide_remove),
2190  .driver = {
2191  .pm = RIPTIDE_PM_OPS,
2192  },
2193 };
2194 
2195 #ifdef SUPPORT_JOYSTICK
2196 static struct pci_driver joystick_driver = {
2197  .name = KBUILD_MODNAME "-joystick",
2198  .id_table = snd_riptide_joystick_ids,
2199  .probe = snd_riptide_joystick_probe,
2200  .remove = __devexit_p(snd_riptide_joystick_remove),
2201 };
2202 #endif
2203 
2204 static int __init alsa_card_riptide_init(void)
2205 {
2206  int err;
2207  err = pci_register_driver(&driver);
2208  if (err < 0)
2209  return err;
2210 #if defined(SUPPORT_JOYSTICK)
2211  err = pci_register_driver(&joystick_driver);
2212  /* On failure unregister formerly registered audio driver */
2213  if (err < 0)
2214  pci_unregister_driver(&driver);
2215 #endif
2216  return err;
2217 }
2218 
2219 static void __exit alsa_card_riptide_exit(void)
2220 {
2221  pci_unregister_driver(&driver);
2222 #if defined(SUPPORT_JOYSTICK)
2223  pci_unregister_driver(&joystick_driver);
2224 #endif
2225 }
2226 
2227 module_init(alsa_card_riptide_init);
2228 module_exit(alsa_card_riptide_exit);