cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

riptide.c (62976B)


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