Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0-or-later
0002 /*
0003  *   ALSA driver for VIA VT82xx (South Bridge)
0004  *
0005  *   VT82C686A/B/C, VT8233A/C, VT8235
0006  *
0007  *  Copyright (c) 2000 Jaroslav Kysela <perex@perex.cz>
0008  *                     Tjeerd.Mulder <Tjeerd.Mulder@fujitsu-siemens.com>
0009  *                    2002 Takashi Iwai <tiwai@suse.de>
0010  */
0011 
0012 /*
0013  * Changes:
0014  *
0015  * Dec. 19, 2002    Takashi Iwai <tiwai@suse.de>
0016  *  - use the DSX channels for the first pcm playback.
0017  *    (on VIA8233, 8233C and 8235 only)
0018  *    this will allow you play simultaneously up to 4 streams.
0019  *    multi-channel playback is assigned to the second device
0020  *    on these chips.
0021  *  - support the secondary capture (on VIA8233/C,8235)
0022  *  - SPDIF support
0023  *    the DSX3 channel can be used for SPDIF output.
0024  *    on VIA8233A, this channel is assigned to the second pcm
0025  *    playback.
0026  *    the card config of alsa-lib will assign the correct
0027  *    device for applications.
0028  *  - clean up the code, separate low-level initialization
0029  *    routines for each chipset.
0030  *
0031  * Sep. 26, 2005    Karsten Wiese <annabellesgarden@yahoo.de>
0032  *  - Optimize position calculation for the 823x chips. 
0033  */
0034 
0035 #include <linux/io.h>
0036 #include <linux/delay.h>
0037 #include <linux/interrupt.h>
0038 #include <linux/init.h>
0039 #include <linux/pci.h>
0040 #include <linux/slab.h>
0041 #include <linux/gameport.h>
0042 #include <linux/module.h>
0043 #include <sound/core.h>
0044 #include <sound/pcm.h>
0045 #include <sound/pcm_params.h>
0046 #include <sound/info.h>
0047 #include <sound/tlv.h>
0048 #include <sound/ac97_codec.h>
0049 #include <sound/mpu401.h>
0050 #include <sound/initval.h>
0051 
0052 #if 0
0053 #define POINTER_DEBUG
0054 #endif
0055 
0056 MODULE_AUTHOR("Jaroslav Kysela <perex@perex.cz>");
0057 MODULE_DESCRIPTION("VIA VT82xx audio");
0058 MODULE_LICENSE("GPL");
0059 
0060 #if IS_REACHABLE(CONFIG_GAMEPORT)
0061 #define SUPPORT_JOYSTICK 1
0062 #endif
0063 
0064 static int index = SNDRV_DEFAULT_IDX1;  /* Index 0-MAX */
0065 static char *id = SNDRV_DEFAULT_STR1;   /* ID for this card */
0066 static long mpu_port;
0067 #ifdef SUPPORT_JOYSTICK
0068 static bool joystick;
0069 #endif
0070 static int ac97_clock = 48000;
0071 static char *ac97_quirk;
0072 static int dxs_support;
0073 static int dxs_init_volume = 31;
0074 static int nodelay;
0075 
0076 module_param(index, int, 0444);
0077 MODULE_PARM_DESC(index, "Index value for VIA 82xx bridge.");
0078 module_param(id, charp, 0444);
0079 MODULE_PARM_DESC(id, "ID string for VIA 82xx bridge.");
0080 module_param_hw(mpu_port, long, ioport, 0444);
0081 MODULE_PARM_DESC(mpu_port, "MPU-401 port. (VT82C686x only)");
0082 #ifdef SUPPORT_JOYSTICK
0083 module_param(joystick, bool, 0444);
0084 MODULE_PARM_DESC(joystick, "Enable joystick. (VT82C686x only)");
0085 #endif
0086 module_param(ac97_clock, int, 0444);
0087 MODULE_PARM_DESC(ac97_clock, "AC'97 codec clock (default 48000Hz).");
0088 module_param(ac97_quirk, charp, 0444);
0089 MODULE_PARM_DESC(ac97_quirk, "AC'97 workaround for strange hardware.");
0090 module_param(dxs_support, int, 0444);
0091 MODULE_PARM_DESC(dxs_support, "Support for DXS channels (0 = auto, 1 = enable, 2 = disable, 3 = 48k only, 4 = no VRA, 5 = enable any sample rate)");
0092 module_param(dxs_init_volume, int, 0644);
0093 MODULE_PARM_DESC(dxs_init_volume, "initial DXS volume (0-31)");
0094 module_param(nodelay, int, 0444);
0095 MODULE_PARM_DESC(nodelay, "Disable 500ms init delay");
0096 
0097 /* just for backward compatibility */
0098 static bool enable;
0099 module_param(enable, bool, 0444);
0100 
0101 
0102 /* revision numbers for via686 */
0103 #define VIA_REV_686_A       0x10
0104 #define VIA_REV_686_B       0x11
0105 #define VIA_REV_686_C       0x12
0106 #define VIA_REV_686_D       0x13
0107 #define VIA_REV_686_E       0x14
0108 #define VIA_REV_686_H       0x20
0109 
0110 /* revision numbers for via8233 */
0111 #define VIA_REV_PRE_8233    0x10    /* not in market */
0112 #define VIA_REV_8233C       0x20    /* 2 rec, 4 pb, 1 multi-pb */
0113 #define VIA_REV_8233        0x30    /* 2 rec, 4 pb, 1 multi-pb, spdif */
0114 #define VIA_REV_8233A       0x40    /* 1 rec, 1 multi-pb, spdf */
0115 #define VIA_REV_8235        0x50    /* 2 rec, 4 pb, 1 multi-pb, spdif */
0116 #define VIA_REV_8237        0x60
0117 #define VIA_REV_8251        0x70
0118 
0119 /*
0120  *  Direct registers
0121  */
0122 
0123 #define VIAREG(via, x) ((via)->port + VIA_REG_##x)
0124 #define VIADEV_REG(viadev, x) ((viadev)->port + VIA_REG_##x)
0125 
0126 /* common offsets */
0127 #define VIA_REG_OFFSET_STATUS       0x00    /* byte - channel status */
0128 #define   VIA_REG_STAT_ACTIVE       0x80    /* RO */
0129 #define   VIA8233_SHADOW_STAT_ACTIVE    0x08    /* RO */
0130 #define   VIA_REG_STAT_PAUSED       0x40    /* RO */
0131 #define   VIA_REG_STAT_TRIGGER_QUEUED   0x08    /* RO */
0132 #define   VIA_REG_STAT_STOPPED      0x04    /* RWC */
0133 #define   VIA_REG_STAT_EOL      0x02    /* RWC */
0134 #define   VIA_REG_STAT_FLAG     0x01    /* RWC */
0135 #define VIA_REG_OFFSET_CONTROL      0x01    /* byte - channel control */
0136 #define   VIA_REG_CTRL_START        0x80    /* WO */
0137 #define   VIA_REG_CTRL_TERMINATE    0x40    /* WO */
0138 #define   VIA_REG_CTRL_AUTOSTART    0x20
0139 #define   VIA_REG_CTRL_PAUSE        0x08    /* RW */
0140 #define   VIA_REG_CTRL_INT_STOP     0x04        
0141 #define   VIA_REG_CTRL_INT_EOL      0x02
0142 #define   VIA_REG_CTRL_INT_FLAG     0x01
0143 #define   VIA_REG_CTRL_RESET        0x01    /* RW - probably reset? undocumented */
0144 #define   VIA_REG_CTRL_INT (VIA_REG_CTRL_INT_FLAG | VIA_REG_CTRL_INT_EOL | VIA_REG_CTRL_AUTOSTART)
0145 #define VIA_REG_OFFSET_TYPE     0x02    /* byte - channel type (686 only) */
0146 #define   VIA_REG_TYPE_AUTOSTART    0x80    /* RW - autostart at EOL */
0147 #define   VIA_REG_TYPE_16BIT        0x20    /* RW */
0148 #define   VIA_REG_TYPE_STEREO       0x10    /* RW */
0149 #define   VIA_REG_TYPE_INT_LLINE    0x00
0150 #define   VIA_REG_TYPE_INT_LSAMPLE  0x04
0151 #define   VIA_REG_TYPE_INT_LESSONE  0x08
0152 #define   VIA_REG_TYPE_INT_MASK     0x0c
0153 #define   VIA_REG_TYPE_INT_EOL      0x02
0154 #define   VIA_REG_TYPE_INT_FLAG     0x01
0155 #define VIA_REG_OFFSET_TABLE_PTR    0x04    /* dword - channel table pointer */
0156 #define VIA_REG_OFFSET_CURR_PTR     0x04    /* dword - channel current pointer */
0157 #define VIA_REG_OFFSET_STOP_IDX     0x08    /* dword - stop index, channel type, sample rate */
0158 #define   VIA8233_REG_TYPE_16BIT    0x00200000  /* RW */
0159 #define   VIA8233_REG_TYPE_STEREO   0x00100000  /* RW */
0160 #define VIA_REG_OFFSET_CURR_COUNT   0x0c    /* dword - channel current count (24 bit) */
0161 #define VIA_REG_OFFSET_CURR_INDEX   0x0f    /* byte - channel current index (for via8233 only) */
0162 
0163 #define DEFINE_VIA_REGSET(name,val) \
0164 enum {\
0165     VIA_REG_##name##_STATUS     = (val),\
0166     VIA_REG_##name##_CONTROL    = (val) + 0x01,\
0167     VIA_REG_##name##_TYPE       = (val) + 0x02,\
0168     VIA_REG_##name##_TABLE_PTR  = (val) + 0x04,\
0169     VIA_REG_##name##_CURR_PTR   = (val) + 0x04,\
0170     VIA_REG_##name##_STOP_IDX   = (val) + 0x08,\
0171     VIA_REG_##name##_CURR_COUNT = (val) + 0x0c,\
0172 }
0173 
0174 /* playback block */
0175 DEFINE_VIA_REGSET(PLAYBACK, 0x00);
0176 DEFINE_VIA_REGSET(CAPTURE, 0x10);
0177 DEFINE_VIA_REGSET(FM, 0x20);
0178 
0179 /* AC'97 */
0180 #define VIA_REG_AC97            0x80    /* dword */
0181 #define   VIA_REG_AC97_CODEC_ID_MASK    (3<<30)
0182 #define   VIA_REG_AC97_CODEC_ID_SHIFT   30
0183 #define   VIA_REG_AC97_CODEC_ID_PRIMARY 0x00
0184 #define   VIA_REG_AC97_CODEC_ID_SECONDARY 0x01
0185 #define   VIA_REG_AC97_SECONDARY_VALID  (1<<27)
0186 #define   VIA_REG_AC97_PRIMARY_VALID    (1<<25)
0187 #define   VIA_REG_AC97_BUSY     (1<<24)
0188 #define   VIA_REG_AC97_READ     (1<<23)
0189 #define   VIA_REG_AC97_CMD_SHIFT    16
0190 #define   VIA_REG_AC97_CMD_MASK     0x7e
0191 #define   VIA_REG_AC97_DATA_SHIFT   0
0192 #define   VIA_REG_AC97_DATA_MASK    0xffff
0193 
0194 #define VIA_REG_SGD_SHADOW      0x84    /* dword */
0195 /* via686 */
0196 #define   VIA_REG_SGD_STAT_PB_FLAG  (1<<0)
0197 #define   VIA_REG_SGD_STAT_CP_FLAG  (1<<1)
0198 #define   VIA_REG_SGD_STAT_FM_FLAG  (1<<2)
0199 #define   VIA_REG_SGD_STAT_PB_EOL   (1<<4)
0200 #define   VIA_REG_SGD_STAT_CP_EOL   (1<<5)
0201 #define   VIA_REG_SGD_STAT_FM_EOL   (1<<6)
0202 #define   VIA_REG_SGD_STAT_PB_STOP  (1<<8)
0203 #define   VIA_REG_SGD_STAT_CP_STOP  (1<<9)
0204 #define   VIA_REG_SGD_STAT_FM_STOP  (1<<10)
0205 #define   VIA_REG_SGD_STAT_PB_ACTIVE    (1<<12)
0206 #define   VIA_REG_SGD_STAT_CP_ACTIVE    (1<<13)
0207 #define   VIA_REG_SGD_STAT_FM_ACTIVE    (1<<14)
0208 /* via8233 */
0209 #define   VIA8233_REG_SGD_STAT_FLAG (1<<0)
0210 #define   VIA8233_REG_SGD_STAT_EOL  (1<<1)
0211 #define   VIA8233_REG_SGD_STAT_STOP (1<<2)
0212 #define   VIA8233_REG_SGD_STAT_ACTIVE   (1<<3)
0213 #define VIA8233_INTR_MASK(chan) ((VIA8233_REG_SGD_STAT_FLAG|VIA8233_REG_SGD_STAT_EOL) << ((chan) * 4))
0214 #define   VIA8233_REG_SGD_CHAN_SDX  0
0215 #define   VIA8233_REG_SGD_CHAN_MULTI    4
0216 #define   VIA8233_REG_SGD_CHAN_REC  6
0217 #define   VIA8233_REG_SGD_CHAN_REC1 7
0218 
0219 #define VIA_REG_GPI_STATUS      0x88
0220 #define VIA_REG_GPI_INTR        0x8c
0221 
0222 /* multi-channel and capture registers for via8233 */
0223 DEFINE_VIA_REGSET(MULTPLAY, 0x40);
0224 DEFINE_VIA_REGSET(CAPTURE_8233, 0x60);
0225 
0226 /* via8233-specific registers */
0227 #define VIA_REG_OFS_PLAYBACK_VOLUME_L   0x02    /* byte */
0228 #define VIA_REG_OFS_PLAYBACK_VOLUME_R   0x03    /* byte */
0229 #define VIA_REG_OFS_MULTPLAY_FORMAT 0x02    /* byte - format and channels */
0230 #define   VIA_REG_MULTPLAY_FMT_8BIT 0x00
0231 #define   VIA_REG_MULTPLAY_FMT_16BIT    0x80
0232 #define   VIA_REG_MULTPLAY_FMT_CH_MASK  0x70    /* # channels << 4 (valid = 1,2,4,6) */
0233 #define VIA_REG_OFS_CAPTURE_FIFO    0x02    /* byte - bit 6 = fifo  enable */
0234 #define   VIA_REG_CAPTURE_FIFO_ENABLE   0x40
0235 
0236 #define VIA_DXS_MAX_VOLUME      31  /* max. volume (attenuation) of reg 0x32/33 */
0237 
0238 #define VIA_REG_CAPTURE_CHANNEL     0x63    /* byte - input select */
0239 #define   VIA_REG_CAPTURE_CHANNEL_MIC   0x4
0240 #define   VIA_REG_CAPTURE_CHANNEL_LINE  0
0241 #define   VIA_REG_CAPTURE_SELECT_CODEC  0x03    /* recording source codec (0 = primary) */
0242 
0243 #define VIA_TBL_BIT_FLAG    0x40000000
0244 #define VIA_TBL_BIT_EOL     0x80000000
0245 
0246 /* pci space */
0247 #define VIA_ACLINK_STAT     0x40
0248 #define  VIA_ACLINK_C11_READY   0x20
0249 #define  VIA_ACLINK_C10_READY   0x10
0250 #define  VIA_ACLINK_C01_READY   0x04 /* secondary codec ready */
0251 #define  VIA_ACLINK_LOWPOWER    0x02 /* low-power state */
0252 #define  VIA_ACLINK_C00_READY   0x01 /* primary codec ready */
0253 #define VIA_ACLINK_CTRL     0x41
0254 #define  VIA_ACLINK_CTRL_ENABLE 0x80 /* 0: disable, 1: enable */
0255 #define  VIA_ACLINK_CTRL_RESET  0x40 /* 0: assert, 1: de-assert */
0256 #define  VIA_ACLINK_CTRL_SYNC   0x20 /* 0: release SYNC, 1: force SYNC hi */
0257 #define  VIA_ACLINK_CTRL_SDO    0x10 /* 0: release SDO, 1: force SDO hi */
0258 #define  VIA_ACLINK_CTRL_VRA    0x08 /* 0: disable VRA, 1: enable VRA */
0259 #define  VIA_ACLINK_CTRL_PCM    0x04 /* 0: disable PCM, 1: enable PCM */
0260 #define  VIA_ACLINK_CTRL_FM 0x02 /* via686 only */
0261 #define  VIA_ACLINK_CTRL_SB 0x01 /* via686 only */
0262 #define  VIA_ACLINK_CTRL_INIT   (VIA_ACLINK_CTRL_ENABLE|\
0263                  VIA_ACLINK_CTRL_RESET|\
0264                  VIA_ACLINK_CTRL_PCM|\
0265                  VIA_ACLINK_CTRL_VRA)
0266 #define VIA_FUNC_ENABLE     0x42
0267 #define  VIA_FUNC_MIDI_PNP  0x80 /* FIXME: it's 0x40 in the datasheet! */
0268 #define  VIA_FUNC_MIDI_IRQMASK  0x40 /* FIXME: not documented! */
0269 #define  VIA_FUNC_RX2C_WRITE    0x20
0270 #define  VIA_FUNC_SB_FIFO_EMPTY 0x10
0271 #define  VIA_FUNC_ENABLE_GAME   0x08
0272 #define  VIA_FUNC_ENABLE_FM 0x04
0273 #define  VIA_FUNC_ENABLE_MIDI   0x02
0274 #define  VIA_FUNC_ENABLE_SB 0x01
0275 #define VIA_PNP_CONTROL     0x43
0276 #define VIA_FM_NMI_CTRL     0x48
0277 #define VIA8233_VOLCHG_CTRL 0x48
0278 #define VIA8233_SPDIF_CTRL  0x49
0279 #define  VIA8233_SPDIF_DX3  0x08
0280 #define  VIA8233_SPDIF_SLOT_MASK    0x03
0281 #define  VIA8233_SPDIF_SLOT_1011    0x00
0282 #define  VIA8233_SPDIF_SLOT_34      0x01
0283 #define  VIA8233_SPDIF_SLOT_78      0x02
0284 #define  VIA8233_SPDIF_SLOT_69      0x03
0285 
0286 /*
0287  */
0288 
0289 #define VIA_DXS_AUTO    0
0290 #define VIA_DXS_ENABLE  1
0291 #define VIA_DXS_DISABLE 2
0292 #define VIA_DXS_48K 3
0293 #define VIA_DXS_NO_VRA  4
0294 #define VIA_DXS_SRC 5
0295 
0296 
0297 /*
0298  * pcm stream
0299  */
0300 
0301 struct snd_via_sg_table {
0302     unsigned int offset;
0303     unsigned int size;
0304 } ;
0305 
0306 #define VIA_TABLE_SIZE  255
0307 #define VIA_MAX_BUFSIZE (1<<24)
0308 
0309 struct viadev {
0310     unsigned int reg_offset;
0311     unsigned long port;
0312     int direction;  /* playback = 0, capture = 1 */
0313         struct snd_pcm_substream *substream;
0314     int running;
0315     unsigned int tbl_entries; /* # descriptors */
0316     struct snd_dma_buffer table;
0317     struct snd_via_sg_table *idx_table;
0318     /* for recovery from the unexpected pointer */
0319     unsigned int lastpos;
0320     unsigned int fragsize;
0321     unsigned int bufsize;
0322     unsigned int bufsize2;
0323     int hwptr_done;     /* processed frame position in the buffer */
0324     int in_interrupt;
0325     int shadow_shift;
0326 };
0327 
0328 
0329 enum { TYPE_CARD_VIA686 = 1, TYPE_CARD_VIA8233 };
0330 enum { TYPE_VIA686, TYPE_VIA8233, TYPE_VIA8233A };
0331 
0332 #define VIA_MAX_DEVS    7   /* 4 playback, 1 multi, 2 capture */
0333 
0334 struct via_rate_lock {
0335     spinlock_t lock;
0336     int rate;
0337     int used;
0338 };
0339 
0340 struct via82xx {
0341     int irq;
0342 
0343     unsigned long port;
0344     struct resource *mpu_res;
0345     int chip_type;
0346     unsigned char revision;
0347 
0348     unsigned char old_legacy;
0349     unsigned char old_legacy_cfg;
0350 #ifdef CONFIG_PM_SLEEP
0351     unsigned char legacy_saved;
0352     unsigned char legacy_cfg_saved;
0353     unsigned char spdif_ctrl_saved;
0354     unsigned char capture_src_saved[2];
0355     unsigned int mpu_port_saved;
0356 #endif
0357 
0358     unsigned char playback_volume[4][2]; /* for VIA8233/C/8235; default = 0 */
0359     unsigned char playback_volume_c[2]; /* for VIA8233/C/8235; default = 0 */
0360 
0361     unsigned int intr_mask; /* SGD_SHADOW mask to check interrupts */
0362 
0363     struct pci_dev *pci;
0364     struct snd_card *card;
0365 
0366     unsigned int num_devs;
0367     unsigned int playback_devno, multi_devno, capture_devno;
0368     struct viadev devs[VIA_MAX_DEVS];
0369     struct via_rate_lock rates[2]; /* playback and capture */
0370     unsigned int dxs_fixed: 1;  /* DXS channel accepts only 48kHz */
0371     unsigned int no_vra: 1;     /* no need to set VRA on DXS channels */
0372     unsigned int dxs_src: 1;    /* use full SRC capabilities of DXS */
0373     unsigned int spdif_on: 1;   /* only spdif rates work to external DACs */
0374 
0375     struct snd_pcm *pcms[2];
0376     struct snd_rawmidi *rmidi;
0377     struct snd_kcontrol *dxs_controls[4];
0378 
0379     struct snd_ac97_bus *ac97_bus;
0380     struct snd_ac97 *ac97;
0381     unsigned int ac97_clock;
0382     unsigned int ac97_secondary;    /* secondary AC'97 codec is present */
0383 
0384     spinlock_t reg_lock;
0385     struct snd_info_entry *proc_entry;
0386 
0387 #ifdef SUPPORT_JOYSTICK
0388     struct gameport *gameport;
0389 #endif
0390 };
0391 
0392 static const struct pci_device_id snd_via82xx_ids[] = {
0393     /* 0x1106, 0x3058 */
0394     { PCI_VDEVICE(VIA, PCI_DEVICE_ID_VIA_82C686_5), TYPE_CARD_VIA686, },    /* 686A */
0395     /* 0x1106, 0x3059 */
0396     { PCI_VDEVICE(VIA, PCI_DEVICE_ID_VIA_8233_5), TYPE_CARD_VIA8233, }, /* VT8233 */
0397     { 0, }
0398 };
0399 
0400 MODULE_DEVICE_TABLE(pci, snd_via82xx_ids);
0401 
0402 /*
0403  */
0404 
0405 /*
0406  * allocate and initialize the descriptor buffers
0407  * periods = number of periods
0408  * fragsize = period size in bytes
0409  */
0410 static int build_via_table(struct viadev *dev, struct snd_pcm_substream *substream,
0411                struct pci_dev *pci,
0412                unsigned int periods, unsigned int fragsize)
0413 {
0414     unsigned int i, idx, ofs, rest;
0415     struct via82xx *chip = snd_pcm_substream_chip(substream);
0416     __le32 *pgtbl;
0417 
0418     if (dev->table.area == NULL) {
0419         /* the start of each lists must be aligned to 8 bytes,
0420          * but the kernel pages are much bigger, so we don't care
0421          */
0422         if (snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV, &chip->pci->dev,
0423                     PAGE_ALIGN(VIA_TABLE_SIZE * 2 * 8),
0424                     &dev->table) < 0)
0425             return -ENOMEM;
0426     }
0427     if (! dev->idx_table) {
0428         dev->idx_table = kmalloc_array(VIA_TABLE_SIZE,
0429                            sizeof(*dev->idx_table),
0430                            GFP_KERNEL);
0431         if (! dev->idx_table)
0432             return -ENOMEM;
0433     }
0434 
0435     /* fill the entries */
0436     idx = 0;
0437     ofs = 0;
0438     pgtbl = (__le32 *)dev->table.area;
0439     for (i = 0; i < periods; i++) {
0440         rest = fragsize;
0441         /* fill descriptors for a period.
0442          * a period can be split to several descriptors if it's
0443          * over page boundary.
0444          */
0445         do {
0446             unsigned int r;
0447             unsigned int flag;
0448             unsigned int addr;
0449 
0450             if (idx >= VIA_TABLE_SIZE) {
0451                 dev_err(&pci->dev, "too much table size!\n");
0452                 return -EINVAL;
0453             }
0454             addr = snd_pcm_sgbuf_get_addr(substream, ofs);
0455             pgtbl[idx << 1] = cpu_to_le32(addr);
0456             r = snd_pcm_sgbuf_get_chunk_size(substream, ofs, rest);
0457             rest -= r;
0458             if (! rest) {
0459                 if (i == periods - 1)
0460                     flag = VIA_TBL_BIT_EOL; /* buffer boundary */
0461                 else
0462                     flag = VIA_TBL_BIT_FLAG; /* period boundary */
0463             } else
0464                 flag = 0; /* period continues to the next */
0465             /*
0466             dev_dbg(&pci->dev,
0467                 "tbl %d: at %d  size %d (rest %d)\n",
0468                 idx, ofs, r, rest);
0469             */
0470             pgtbl[(idx<<1) + 1] = cpu_to_le32(r | flag);
0471             dev->idx_table[idx].offset = ofs;
0472             dev->idx_table[idx].size = r;
0473             ofs += r;
0474             idx++;
0475         } while (rest > 0);
0476     }
0477     dev->tbl_entries = idx;
0478     dev->bufsize = periods * fragsize;
0479     dev->bufsize2 = dev->bufsize / 2;
0480     dev->fragsize = fragsize;
0481     return 0;
0482 }
0483 
0484 
0485 static int clean_via_table(struct viadev *dev, struct snd_pcm_substream *substream,
0486                struct pci_dev *pci)
0487 {
0488     if (dev->table.area) {
0489         snd_dma_free_pages(&dev->table);
0490         dev->table.area = NULL;
0491     }
0492     kfree(dev->idx_table);
0493     dev->idx_table = NULL;
0494     return 0;
0495 }
0496 
0497 /*
0498  *  Basic I/O
0499  */
0500 
0501 static inline unsigned int snd_via82xx_codec_xread(struct via82xx *chip)
0502 {
0503     return inl(VIAREG(chip, AC97));
0504 }
0505  
0506 static inline void snd_via82xx_codec_xwrite(struct via82xx *chip, unsigned int val)
0507 {
0508     outl(val, VIAREG(chip, AC97));
0509 }
0510  
0511 static int snd_via82xx_codec_ready(struct via82xx *chip, int secondary)
0512 {
0513     unsigned int timeout = 1000;    /* 1ms */
0514     unsigned int val;
0515     
0516     while (timeout-- > 0) {
0517         udelay(1);
0518         val = snd_via82xx_codec_xread(chip);
0519         if (!(val & VIA_REG_AC97_BUSY))
0520             return val & 0xffff;
0521     }
0522     dev_err(chip->card->dev, "codec_ready: codec %i is not ready [0x%x]\n",
0523            secondary, snd_via82xx_codec_xread(chip));
0524     return -EIO;
0525 }
0526  
0527 static int snd_via82xx_codec_valid(struct via82xx *chip, int secondary)
0528 {
0529     unsigned int timeout = 1000;    /* 1ms */
0530     unsigned int val, val1;
0531     unsigned int stat = !secondary ? VIA_REG_AC97_PRIMARY_VALID :
0532                      VIA_REG_AC97_SECONDARY_VALID;
0533     
0534     while (timeout-- > 0) {
0535         val = snd_via82xx_codec_xread(chip);
0536         val1 = val & (VIA_REG_AC97_BUSY | stat);
0537         if (val1 == stat)
0538             return val & 0xffff;
0539         udelay(1);
0540     }
0541     return -EIO;
0542 }
0543  
0544 static void snd_via82xx_codec_wait(struct snd_ac97 *ac97)
0545 {
0546     struct via82xx *chip = ac97->private_data;
0547     __always_unused int err;
0548     err = snd_via82xx_codec_ready(chip, ac97->num);
0549     /* here we need to wait fairly for long time.. */
0550     if (!nodelay)
0551         msleep(500);
0552 }
0553 
0554 static void snd_via82xx_codec_write(struct snd_ac97 *ac97,
0555                     unsigned short reg,
0556                     unsigned short val)
0557 {
0558     struct via82xx *chip = ac97->private_data;
0559     unsigned int xval;
0560 
0561     xval = !ac97->num ? VIA_REG_AC97_CODEC_ID_PRIMARY : VIA_REG_AC97_CODEC_ID_SECONDARY;
0562     xval <<= VIA_REG_AC97_CODEC_ID_SHIFT;
0563     xval |= reg << VIA_REG_AC97_CMD_SHIFT;
0564     xval |= val << VIA_REG_AC97_DATA_SHIFT;
0565     snd_via82xx_codec_xwrite(chip, xval);
0566     snd_via82xx_codec_ready(chip, ac97->num);
0567 }
0568 
0569 static unsigned short snd_via82xx_codec_read(struct snd_ac97 *ac97, unsigned short reg)
0570 {
0571     struct via82xx *chip = ac97->private_data;
0572     unsigned int xval, val = 0xffff;
0573     int again = 0;
0574 
0575     xval = ac97->num << VIA_REG_AC97_CODEC_ID_SHIFT;
0576     xval |= ac97->num ? VIA_REG_AC97_SECONDARY_VALID : VIA_REG_AC97_PRIMARY_VALID;
0577     xval |= VIA_REG_AC97_READ;
0578     xval |= (reg & 0x7f) << VIA_REG_AC97_CMD_SHIFT;
0579         while (1) {
0580             if (again++ > 3) {
0581             dev_err(chip->card->dev,
0582                 "codec_read: codec %i is not valid [0x%x]\n",
0583                    ac97->num, snd_via82xx_codec_xread(chip));
0584                 return 0xffff;
0585         }
0586         snd_via82xx_codec_xwrite(chip, xval);
0587         udelay (20);
0588         if (snd_via82xx_codec_valid(chip, ac97->num) >= 0) {
0589             udelay(25);
0590             val = snd_via82xx_codec_xread(chip);
0591             break;
0592         }
0593     }
0594     return val & 0xffff;
0595 }
0596 
0597 static void snd_via82xx_channel_reset(struct via82xx *chip, struct viadev *viadev)
0598 {
0599     outb(VIA_REG_CTRL_PAUSE | VIA_REG_CTRL_TERMINATE | VIA_REG_CTRL_RESET,
0600          VIADEV_REG(viadev, OFFSET_CONTROL));
0601     inb(VIADEV_REG(viadev, OFFSET_CONTROL));
0602     udelay(50);
0603     /* disable interrupts */
0604     outb(0x00, VIADEV_REG(viadev, OFFSET_CONTROL));
0605     /* clear interrupts */
0606     outb(0x03, VIADEV_REG(viadev, OFFSET_STATUS));
0607     outb(0x00, VIADEV_REG(viadev, OFFSET_TYPE)); /* for via686 */
0608     // outl(0, VIADEV_REG(viadev, OFFSET_CURR_PTR));
0609     viadev->lastpos = 0;
0610     viadev->hwptr_done = 0;
0611 }
0612 
0613 
0614 /*
0615  *  Interrupt handler
0616  *  Used for 686 and 8233A
0617  */
0618 static irqreturn_t snd_via686_interrupt(int irq, void *dev_id)
0619 {
0620     struct via82xx *chip = dev_id;
0621     unsigned int status;
0622     unsigned int i;
0623 
0624     status = inl(VIAREG(chip, SGD_SHADOW));
0625     if (! (status & chip->intr_mask)) {
0626         if (chip->rmidi)
0627             /* check mpu401 interrupt */
0628             return snd_mpu401_uart_interrupt(irq, chip->rmidi->private_data);
0629         return IRQ_NONE;
0630     }
0631 
0632     /* check status for each stream */
0633     spin_lock(&chip->reg_lock);
0634     for (i = 0; i < chip->num_devs; i++) {
0635         struct viadev *viadev = &chip->devs[i];
0636         unsigned char c_status = inb(VIADEV_REG(viadev, OFFSET_STATUS));
0637         if (! (c_status & (VIA_REG_STAT_EOL|VIA_REG_STAT_FLAG|VIA_REG_STAT_STOPPED)))
0638             continue;
0639         if (viadev->substream && viadev->running) {
0640             /*
0641              * Update hwptr_done based on 'period elapsed'
0642              * interrupts. We'll use it, when the chip returns 0 
0643              * for OFFSET_CURR_COUNT.
0644              */
0645             if (c_status & VIA_REG_STAT_EOL)
0646                 viadev->hwptr_done = 0;
0647             else
0648                 viadev->hwptr_done += viadev->fragsize;
0649             viadev->in_interrupt = c_status;
0650             spin_unlock(&chip->reg_lock);
0651             snd_pcm_period_elapsed(viadev->substream);
0652             spin_lock(&chip->reg_lock);
0653             viadev->in_interrupt = 0;
0654         }
0655         outb(c_status, VIADEV_REG(viadev, OFFSET_STATUS)); /* ack */
0656     }
0657     spin_unlock(&chip->reg_lock);
0658     return IRQ_HANDLED;
0659 }
0660 
0661 /*
0662  *  Interrupt handler
0663  */
0664 static irqreturn_t snd_via8233_interrupt(int irq, void *dev_id)
0665 {
0666     struct via82xx *chip = dev_id;
0667     unsigned int status;
0668     unsigned int i;
0669     int irqreturn = 0;
0670 
0671     /* check status for each stream */
0672     spin_lock(&chip->reg_lock);
0673     status = inl(VIAREG(chip, SGD_SHADOW));
0674 
0675     for (i = 0; i < chip->num_devs; i++) {
0676         struct viadev *viadev = &chip->devs[i];
0677         struct snd_pcm_substream *substream;
0678         unsigned char c_status, shadow_status;
0679 
0680         shadow_status = (status >> viadev->shadow_shift) &
0681             (VIA8233_SHADOW_STAT_ACTIVE|VIA_REG_STAT_EOL|
0682              VIA_REG_STAT_FLAG);
0683         c_status = shadow_status & (VIA_REG_STAT_EOL|VIA_REG_STAT_FLAG);
0684         if (!c_status)
0685             continue;
0686 
0687         substream = viadev->substream;
0688         if (substream && viadev->running) {
0689             /*
0690              * Update hwptr_done based on 'period elapsed'
0691              * interrupts. We'll use it, when the chip returns 0 
0692              * for OFFSET_CURR_COUNT.
0693              */
0694             if (c_status & VIA_REG_STAT_EOL)
0695                 viadev->hwptr_done = 0;
0696             else
0697                 viadev->hwptr_done += viadev->fragsize;
0698             viadev->in_interrupt = c_status;
0699             if (shadow_status & VIA8233_SHADOW_STAT_ACTIVE)
0700                 viadev->in_interrupt |= VIA_REG_STAT_ACTIVE;
0701             spin_unlock(&chip->reg_lock);
0702 
0703             snd_pcm_period_elapsed(substream);
0704 
0705             spin_lock(&chip->reg_lock);
0706             viadev->in_interrupt = 0;
0707         }
0708         outb(c_status, VIADEV_REG(viadev, OFFSET_STATUS)); /* ack */
0709         irqreturn = 1;
0710     }
0711     spin_unlock(&chip->reg_lock);
0712     return IRQ_RETVAL(irqreturn);
0713 }
0714 
0715 /*
0716  *  PCM callbacks
0717  */
0718 
0719 /*
0720  * trigger callback
0721  */
0722 static int snd_via82xx_pcm_trigger(struct snd_pcm_substream *substream, int cmd)
0723 {
0724     struct via82xx *chip = snd_pcm_substream_chip(substream);
0725     struct viadev *viadev = substream->runtime->private_data;
0726     unsigned char val;
0727 
0728     if (chip->chip_type != TYPE_VIA686)
0729         val = VIA_REG_CTRL_INT;
0730     else
0731         val = 0;
0732     switch (cmd) {
0733     case SNDRV_PCM_TRIGGER_START:
0734     case SNDRV_PCM_TRIGGER_RESUME:
0735         val |= VIA_REG_CTRL_START;
0736         viadev->running = 1;
0737         break;
0738     case SNDRV_PCM_TRIGGER_STOP:
0739     case SNDRV_PCM_TRIGGER_SUSPEND:
0740         val = VIA_REG_CTRL_TERMINATE;
0741         viadev->running = 0;
0742         break;
0743     case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
0744         val |= VIA_REG_CTRL_PAUSE;
0745         viadev->running = 0;
0746         break;
0747     case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
0748         viadev->running = 1;
0749         break;
0750     default:
0751         return -EINVAL;
0752     }
0753     outb(val, VIADEV_REG(viadev, OFFSET_CONTROL));
0754     if (cmd == SNDRV_PCM_TRIGGER_STOP)
0755         snd_via82xx_channel_reset(chip, viadev);
0756     return 0;
0757 }
0758 
0759 
0760 /*
0761  * pointer callbacks
0762  */
0763 
0764 /*
0765  * calculate the linear position at the given sg-buffer index and the rest count
0766  */
0767 
0768 #define check_invalid_pos(viadev,pos) \
0769     ((pos) < viadev->lastpos && ((pos) >= viadev->bufsize2 ||\
0770                      viadev->lastpos < viadev->bufsize2))
0771 
0772 static inline unsigned int calc_linear_pos(struct via82xx *chip,
0773                        struct viadev *viadev,
0774                        unsigned int idx,
0775                        unsigned int count)
0776 {
0777     unsigned int size, base, res;
0778 
0779     size = viadev->idx_table[idx].size;
0780     base = viadev->idx_table[idx].offset;
0781     res = base + size - count;
0782     if (res >= viadev->bufsize)
0783         res -= viadev->bufsize;
0784 
0785     /* check the validity of the calculated position */
0786     if (size < count) {
0787         dev_dbg(chip->card->dev,
0788             "invalid via82xx_cur_ptr (size = %d, count = %d)\n",
0789                (int)size, (int)count);
0790         res = viadev->lastpos;
0791     } else {
0792         if (! count) {
0793             /* Some mobos report count = 0 on the DMA boundary,
0794              * i.e. count = size indeed.
0795              * Let's check whether this step is above the expected size.
0796              */
0797             int delta = res - viadev->lastpos;
0798             if (delta < 0)
0799                 delta += viadev->bufsize;
0800             if ((unsigned int)delta > viadev->fragsize)
0801                 res = base;
0802         }
0803         if (check_invalid_pos(viadev, res)) {
0804 #ifdef POINTER_DEBUG
0805             dev_dbg(chip->card->dev,
0806                 "fail: idx = %i/%i, lastpos = 0x%x, bufsize2 = 0x%x, offsize = 0x%x, size = 0x%x, count = 0x%x\n",
0807                 idx, viadev->tbl_entries,
0808                    viadev->lastpos, viadev->bufsize2,
0809                    viadev->idx_table[idx].offset,
0810                    viadev->idx_table[idx].size, count);
0811 #endif
0812             /* count register returns full size when end of buffer is reached */
0813             res = base + size;
0814             if (check_invalid_pos(viadev, res)) {
0815                 dev_dbg(chip->card->dev,
0816                     "invalid via82xx_cur_ptr (2), using last valid pointer\n");
0817                 res = viadev->lastpos;
0818             }
0819         }
0820     }
0821     return res;
0822 }
0823 
0824 /*
0825  * get the current pointer on via686
0826  */
0827 static snd_pcm_uframes_t snd_via686_pcm_pointer(struct snd_pcm_substream *substream)
0828 {
0829     struct via82xx *chip = snd_pcm_substream_chip(substream);
0830     struct viadev *viadev = substream->runtime->private_data;
0831     unsigned int idx, ptr, count, res;
0832 
0833     if (snd_BUG_ON(!viadev->tbl_entries))
0834         return 0;
0835     if (!(inb(VIADEV_REG(viadev, OFFSET_STATUS)) & VIA_REG_STAT_ACTIVE))
0836         return 0;
0837 
0838     spin_lock(&chip->reg_lock);
0839     count = inl(VIADEV_REG(viadev, OFFSET_CURR_COUNT)) & 0xffffff;
0840     /* The via686a does not have the current index register,
0841      * so we need to calculate the index from CURR_PTR.
0842      */
0843     ptr = inl(VIADEV_REG(viadev, OFFSET_CURR_PTR));
0844     if (ptr <= (unsigned int)viadev->table.addr)
0845         idx = 0;
0846     else /* CURR_PTR holds the address + 8 */
0847         idx = ((ptr - (unsigned int)viadev->table.addr) / 8 - 1) % viadev->tbl_entries;
0848     res = calc_linear_pos(chip, viadev, idx, count);
0849     viadev->lastpos = res; /* remember the last position */
0850     spin_unlock(&chip->reg_lock);
0851 
0852     return bytes_to_frames(substream->runtime, res);
0853 }
0854 
0855 /*
0856  * get the current pointer on via823x
0857  */
0858 static snd_pcm_uframes_t snd_via8233_pcm_pointer(struct snd_pcm_substream *substream)
0859 {
0860     struct via82xx *chip = snd_pcm_substream_chip(substream);
0861     struct viadev *viadev = substream->runtime->private_data;
0862     unsigned int idx, count, res;
0863     int status;
0864     
0865     if (snd_BUG_ON(!viadev->tbl_entries))
0866         return 0;
0867 
0868     spin_lock(&chip->reg_lock);
0869     count = inl(VIADEV_REG(viadev, OFFSET_CURR_COUNT));
0870     status = viadev->in_interrupt;
0871     if (!status)
0872         status = inb(VIADEV_REG(viadev, OFFSET_STATUS));
0873 
0874     /* An apparent bug in the 8251 is worked around by sending a 
0875      * REG_CTRL_START. */
0876     if (chip->revision == VIA_REV_8251 && (status & VIA_REG_STAT_EOL))
0877         snd_via82xx_pcm_trigger(substream, SNDRV_PCM_TRIGGER_START);
0878 
0879     if (!(status & VIA_REG_STAT_ACTIVE)) {
0880         res = 0;
0881         goto unlock;
0882     }
0883     if (count & 0xffffff) {
0884         idx = count >> 24;
0885         if (idx >= viadev->tbl_entries) {
0886 #ifdef POINTER_DEBUG
0887             dev_dbg(chip->card->dev,
0888                 "fail: invalid idx = %i/%i\n", idx,
0889                    viadev->tbl_entries);
0890 #endif
0891             res = viadev->lastpos;
0892         } else {
0893             count &= 0xffffff;
0894             res = calc_linear_pos(chip, viadev, idx, count);
0895         }
0896     } else {
0897         res = viadev->hwptr_done;
0898         if (!viadev->in_interrupt) {
0899             if (status & VIA_REG_STAT_EOL) {
0900                 res = 0;
0901             } else
0902                 if (status & VIA_REG_STAT_FLAG) {
0903                     res += viadev->fragsize;
0904                 }
0905         }
0906     }               
0907 unlock:
0908     viadev->lastpos = res;
0909     spin_unlock(&chip->reg_lock);
0910 
0911     return bytes_to_frames(substream->runtime, res);
0912 }
0913 
0914 
0915 /*
0916  * hw_params callback:
0917  * allocate the buffer and build up the buffer description table
0918  */
0919 static int snd_via82xx_hw_params(struct snd_pcm_substream *substream,
0920                  struct snd_pcm_hw_params *hw_params)
0921 {
0922     struct via82xx *chip = snd_pcm_substream_chip(substream);
0923     struct viadev *viadev = substream->runtime->private_data;
0924 
0925     return build_via_table(viadev, substream, chip->pci,
0926                    params_periods(hw_params),
0927                    params_period_bytes(hw_params));
0928 }
0929 
0930 /*
0931  * hw_free callback:
0932  * clean up the buffer description table and release the buffer
0933  */
0934 static int snd_via82xx_hw_free(struct snd_pcm_substream *substream)
0935 {
0936     struct via82xx *chip = snd_pcm_substream_chip(substream);
0937     struct viadev *viadev = substream->runtime->private_data;
0938 
0939     clean_via_table(viadev, substream, chip->pci);
0940     return 0;
0941 }
0942 
0943 
0944 /*
0945  * set up the table pointer
0946  */
0947 static void snd_via82xx_set_table_ptr(struct via82xx *chip, struct viadev *viadev)
0948 {
0949     snd_via82xx_codec_ready(chip, 0);
0950     outl((u32)viadev->table.addr, VIADEV_REG(viadev, OFFSET_TABLE_PTR));
0951     udelay(20);
0952     snd_via82xx_codec_ready(chip, 0);
0953 }
0954 
0955 /*
0956  * prepare callback for playback and capture on via686
0957  */
0958 static void via686_setup_format(struct via82xx *chip, struct viadev *viadev,
0959                 struct snd_pcm_runtime *runtime)
0960 {
0961     snd_via82xx_channel_reset(chip, viadev);
0962     /* this must be set after channel_reset */
0963     snd_via82xx_set_table_ptr(chip, viadev);
0964     outb(VIA_REG_TYPE_AUTOSTART |
0965          (runtime->format == SNDRV_PCM_FORMAT_S16_LE ? VIA_REG_TYPE_16BIT : 0) |
0966          (runtime->channels > 1 ? VIA_REG_TYPE_STEREO : 0) |
0967          ((viadev->reg_offset & 0x10) == 0 ? VIA_REG_TYPE_INT_LSAMPLE : 0) |
0968          VIA_REG_TYPE_INT_EOL |
0969          VIA_REG_TYPE_INT_FLAG, VIADEV_REG(viadev, OFFSET_TYPE));
0970 }
0971 
0972 static int snd_via686_playback_prepare(struct snd_pcm_substream *substream)
0973 {
0974     struct via82xx *chip = snd_pcm_substream_chip(substream);
0975     struct viadev *viadev = substream->runtime->private_data;
0976     struct snd_pcm_runtime *runtime = substream->runtime;
0977 
0978     snd_ac97_set_rate(chip->ac97, AC97_PCM_FRONT_DAC_RATE, runtime->rate);
0979     snd_ac97_set_rate(chip->ac97, AC97_SPDIF, runtime->rate);
0980     via686_setup_format(chip, viadev, runtime);
0981     return 0;
0982 }
0983 
0984 static int snd_via686_capture_prepare(struct snd_pcm_substream *substream)
0985 {
0986     struct via82xx *chip = snd_pcm_substream_chip(substream);
0987     struct viadev *viadev = substream->runtime->private_data;
0988     struct snd_pcm_runtime *runtime = substream->runtime;
0989 
0990     snd_ac97_set_rate(chip->ac97, AC97_PCM_LR_ADC_RATE, runtime->rate);
0991     via686_setup_format(chip, viadev, runtime);
0992     return 0;
0993 }
0994 
0995 /*
0996  * lock the current rate
0997  */
0998 static int via_lock_rate(struct via_rate_lock *rec, int rate)
0999 {
1000     int changed = 0;
1001 
1002     spin_lock_irq(&rec->lock);
1003     if (rec->rate != rate) {
1004         if (rec->rate && rec->used > 1) /* already set */
1005             changed = -EINVAL;
1006         else {
1007             rec->rate = rate;
1008             changed = 1;
1009         }
1010     }
1011     spin_unlock_irq(&rec->lock);
1012     return changed;
1013 }
1014 
1015 /*
1016  * prepare callback for DSX playback on via823x
1017  */
1018 static int snd_via8233_playback_prepare(struct snd_pcm_substream *substream)
1019 {
1020     struct via82xx *chip = snd_pcm_substream_chip(substream);
1021     struct viadev *viadev = substream->runtime->private_data;
1022     struct snd_pcm_runtime *runtime = substream->runtime;
1023     int ac97_rate = chip->dxs_src ? 48000 : runtime->rate;
1024     int rate_changed;
1025     u32 rbits;
1026 
1027     rate_changed = via_lock_rate(&chip->rates[0], ac97_rate);
1028     if (rate_changed < 0)
1029         return rate_changed;
1030     if (rate_changed)
1031         snd_ac97_set_rate(chip->ac97, AC97_PCM_FRONT_DAC_RATE,
1032                   chip->no_vra ? 48000 : runtime->rate);
1033     if (chip->spdif_on && viadev->reg_offset == 0x30)
1034         snd_ac97_set_rate(chip->ac97, AC97_SPDIF, runtime->rate);
1035 
1036     if (runtime->rate == 48000)
1037         rbits = 0xfffff;
1038     else
1039         rbits = (0x100000 / 48000) * runtime->rate +
1040             ((0x100000 % 48000) * runtime->rate) / 48000;
1041     snd_BUG_ON(rbits & ~0xfffff);
1042     snd_via82xx_channel_reset(chip, viadev);
1043     snd_via82xx_set_table_ptr(chip, viadev);
1044     outb(chip->playback_volume[viadev->reg_offset / 0x10][0],
1045          VIADEV_REG(viadev, OFS_PLAYBACK_VOLUME_L));
1046     outb(chip->playback_volume[viadev->reg_offset / 0x10][1],
1047          VIADEV_REG(viadev, OFS_PLAYBACK_VOLUME_R));
1048     outl((runtime->format == SNDRV_PCM_FORMAT_S16_LE ? VIA8233_REG_TYPE_16BIT : 0) | /* format */
1049          (runtime->channels > 1 ? VIA8233_REG_TYPE_STEREO : 0) | /* stereo */
1050          rbits | /* rate */
1051          0xff000000,    /* STOP index is never reached */
1052          VIADEV_REG(viadev, OFFSET_STOP_IDX));
1053     udelay(20);
1054     snd_via82xx_codec_ready(chip, 0);
1055     return 0;
1056 }
1057 
1058 /*
1059  * prepare callback for multi-channel playback on via823x
1060  */
1061 static int snd_via8233_multi_prepare(struct snd_pcm_substream *substream)
1062 {
1063     struct via82xx *chip = snd_pcm_substream_chip(substream);
1064     struct viadev *viadev = substream->runtime->private_data;
1065     struct snd_pcm_runtime *runtime = substream->runtime;
1066     unsigned int slots;
1067     int fmt;
1068 
1069     if (via_lock_rate(&chip->rates[0], runtime->rate) < 0)
1070         return -EINVAL;
1071     snd_ac97_set_rate(chip->ac97, AC97_PCM_FRONT_DAC_RATE, runtime->rate);
1072     snd_ac97_set_rate(chip->ac97, AC97_PCM_SURR_DAC_RATE, runtime->rate);
1073     snd_ac97_set_rate(chip->ac97, AC97_PCM_LFE_DAC_RATE, runtime->rate);
1074     snd_ac97_set_rate(chip->ac97, AC97_SPDIF, runtime->rate);
1075     snd_via82xx_channel_reset(chip, viadev);
1076     snd_via82xx_set_table_ptr(chip, viadev);
1077 
1078     fmt = (runtime->format == SNDRV_PCM_FORMAT_S16_LE) ?
1079         VIA_REG_MULTPLAY_FMT_16BIT : VIA_REG_MULTPLAY_FMT_8BIT;
1080     fmt |= runtime->channels << 4;
1081     outb(fmt, VIADEV_REG(viadev, OFS_MULTPLAY_FORMAT));
1082 #if 0
1083     if (chip->revision == VIA_REV_8233A)
1084         slots = 0;
1085     else
1086 #endif
1087     {
1088         /* set sample number to slot 3, 4, 7, 8, 6, 9 (for VIA8233/C,8235) */
1089         /* corresponding to FL, FR, RL, RR, C, LFE ?? */
1090         switch (runtime->channels) {
1091         case 1: slots = (1<<0) | (1<<4); break;
1092         case 2: slots = (1<<0) | (2<<4); break;
1093         case 3: slots = (1<<0) | (2<<4) | (5<<8); break;
1094         case 4: slots = (1<<0) | (2<<4) | (3<<8) | (4<<12); break;
1095         case 5: slots = (1<<0) | (2<<4) | (3<<8) | (4<<12) | (5<<16); break;
1096         case 6: slots = (1<<0) | (2<<4) | (3<<8) | (4<<12) | (5<<16) | (6<<20); break;
1097         default: slots = 0; break;
1098         }
1099     }
1100     /* STOP index is never reached */
1101     outl(0xff000000 | slots, VIADEV_REG(viadev, OFFSET_STOP_IDX));
1102     udelay(20);
1103     snd_via82xx_codec_ready(chip, 0);
1104     return 0;
1105 }
1106 
1107 /*
1108  * prepare callback for capture on via823x
1109  */
1110 static int snd_via8233_capture_prepare(struct snd_pcm_substream *substream)
1111 {
1112     struct via82xx *chip = snd_pcm_substream_chip(substream);
1113     struct viadev *viadev = substream->runtime->private_data;
1114     struct snd_pcm_runtime *runtime = substream->runtime;
1115 
1116     if (via_lock_rate(&chip->rates[1], runtime->rate) < 0)
1117         return -EINVAL;
1118     snd_ac97_set_rate(chip->ac97, AC97_PCM_LR_ADC_RATE, runtime->rate);
1119     snd_via82xx_channel_reset(chip, viadev);
1120     snd_via82xx_set_table_ptr(chip, viadev);
1121     outb(VIA_REG_CAPTURE_FIFO_ENABLE, VIADEV_REG(viadev, OFS_CAPTURE_FIFO));
1122     outl((runtime->format == SNDRV_PCM_FORMAT_S16_LE ? VIA8233_REG_TYPE_16BIT : 0) |
1123          (runtime->channels > 1 ? VIA8233_REG_TYPE_STEREO : 0) |
1124          0xff000000,    /* STOP index is never reached */
1125          VIADEV_REG(viadev, OFFSET_STOP_IDX));
1126     udelay(20);
1127     snd_via82xx_codec_ready(chip, 0);
1128     return 0;
1129 }
1130 
1131 
1132 /*
1133  * pcm hardware definition, identical for both playback and capture
1134  */
1135 static const struct snd_pcm_hardware snd_via82xx_hw =
1136 {
1137     .info =         (SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_INTERLEAVED |
1138                  SNDRV_PCM_INFO_BLOCK_TRANSFER |
1139                  SNDRV_PCM_INFO_MMAP_VALID |
1140                  /* SNDRV_PCM_INFO_RESUME | */
1141                  SNDRV_PCM_INFO_PAUSE),
1142     .formats =      SNDRV_PCM_FMTBIT_U8 | SNDRV_PCM_FMTBIT_S16_LE,
1143     .rates =        SNDRV_PCM_RATE_48000,
1144     .rate_min =     48000,
1145     .rate_max =     48000,
1146     .channels_min =     1,
1147     .channels_max =     2,
1148     .buffer_bytes_max = VIA_MAX_BUFSIZE,
1149     .period_bytes_min = 32,
1150     .period_bytes_max = VIA_MAX_BUFSIZE / 2,
1151     .periods_min =      2,
1152     .periods_max =      VIA_TABLE_SIZE / 2,
1153     .fifo_size =        0,
1154 };
1155 
1156 
1157 /*
1158  * open callback skeleton
1159  */
1160 static int snd_via82xx_pcm_open(struct via82xx *chip, struct viadev *viadev,
1161                 struct snd_pcm_substream *substream)
1162 {
1163     struct snd_pcm_runtime *runtime = substream->runtime;
1164     int err;
1165     struct via_rate_lock *ratep;
1166     bool use_src = false;
1167 
1168     runtime->hw = snd_via82xx_hw;
1169     
1170     /* set the hw rate condition */
1171     ratep = &chip->rates[viadev->direction];
1172     spin_lock_irq(&ratep->lock);
1173     ratep->used++;
1174     if (chip->spdif_on && viadev->reg_offset == 0x30) {
1175         /* DXS#3 and spdif is on */
1176         runtime->hw.rates = chip->ac97->rates[AC97_RATES_SPDIF];
1177         snd_pcm_limit_hw_rates(runtime);
1178     } else if (chip->dxs_fixed && viadev->reg_offset < 0x40) {
1179         /* fixed DXS playback rate */
1180         runtime->hw.rates = SNDRV_PCM_RATE_48000;
1181         runtime->hw.rate_min = runtime->hw.rate_max = 48000;
1182     } else if (chip->dxs_src && viadev->reg_offset < 0x40) {
1183         /* use full SRC capabilities of DXS */
1184         runtime->hw.rates = (SNDRV_PCM_RATE_CONTINUOUS |
1185                      SNDRV_PCM_RATE_8000_48000);
1186         runtime->hw.rate_min = 8000;
1187         runtime->hw.rate_max = 48000;
1188         use_src = true;
1189     } else if (! ratep->rate) {
1190         int idx = viadev->direction ? AC97_RATES_ADC : AC97_RATES_FRONT_DAC;
1191         runtime->hw.rates = chip->ac97->rates[idx];
1192         snd_pcm_limit_hw_rates(runtime);
1193     } else {
1194         /* a fixed rate */
1195         runtime->hw.rates = SNDRV_PCM_RATE_KNOT;
1196         runtime->hw.rate_max = runtime->hw.rate_min = ratep->rate;
1197     }
1198     spin_unlock_irq(&ratep->lock);
1199 
1200     /* we may remove following constaint when we modify table entries
1201        in interrupt */
1202     err = snd_pcm_hw_constraint_integer(runtime, SNDRV_PCM_HW_PARAM_PERIODS);
1203     if (err < 0)
1204         return err;
1205 
1206     if (use_src) {
1207         err = snd_pcm_hw_rule_noresample(runtime, 48000);
1208         if (err < 0)
1209             return err;
1210     }
1211 
1212     runtime->private_data = viadev;
1213     viadev->substream = substream;
1214 
1215     return 0;
1216 }
1217 
1218 
1219 /*
1220  * open callback for playback on via686
1221  */
1222 static int snd_via686_playback_open(struct snd_pcm_substream *substream)
1223 {
1224     struct via82xx *chip = snd_pcm_substream_chip(substream);
1225     struct viadev *viadev = &chip->devs[chip->playback_devno + substream->number];
1226     int err;
1227 
1228     err = snd_via82xx_pcm_open(chip, viadev, substream);
1229     if (err < 0)
1230         return err;
1231     return 0;
1232 }
1233 
1234 /*
1235  * open callback for playback on via823x DXS
1236  */
1237 static int snd_via8233_playback_open(struct snd_pcm_substream *substream)
1238 {
1239     struct via82xx *chip = snd_pcm_substream_chip(substream);
1240     struct viadev *viadev;
1241     unsigned int stream;
1242     int err;
1243 
1244     viadev = &chip->devs[chip->playback_devno + substream->number];
1245     err = snd_via82xx_pcm_open(chip, viadev, substream);
1246     if (err < 0)
1247         return err;
1248     stream = viadev->reg_offset / 0x10;
1249     if (chip->dxs_controls[stream]) {
1250         chip->playback_volume[stream][0] =
1251                 VIA_DXS_MAX_VOLUME - (dxs_init_volume & 31);
1252         chip->playback_volume[stream][1] =
1253                 VIA_DXS_MAX_VOLUME - (dxs_init_volume & 31);
1254         chip->dxs_controls[stream]->vd[0].access &=
1255             ~SNDRV_CTL_ELEM_ACCESS_INACTIVE;
1256         snd_ctl_notify(chip->card, SNDRV_CTL_EVENT_MASK_VALUE |
1257                    SNDRV_CTL_EVENT_MASK_INFO,
1258                    &chip->dxs_controls[stream]->id);
1259     }
1260     return 0;
1261 }
1262 
1263 /*
1264  * open callback for playback on via823x multi-channel
1265  */
1266 static int snd_via8233_multi_open(struct snd_pcm_substream *substream)
1267 {
1268     struct via82xx *chip = snd_pcm_substream_chip(substream);
1269     struct viadev *viadev = &chip->devs[chip->multi_devno];
1270     int err;
1271     /* channels constraint for VIA8233A
1272      * 3 and 5 channels are not supported
1273      */
1274     static const unsigned int channels[] = {
1275         1, 2, 4, 6
1276     };
1277     static const struct snd_pcm_hw_constraint_list hw_constraints_channels = {
1278         .count = ARRAY_SIZE(channels),
1279         .list = channels,
1280         .mask = 0,
1281     };
1282 
1283     err = snd_via82xx_pcm_open(chip, viadev, substream);
1284     if (err < 0)
1285         return err;
1286     substream->runtime->hw.channels_max = 6;
1287     if (chip->revision == VIA_REV_8233A)
1288         snd_pcm_hw_constraint_list(substream->runtime, 0,
1289                        SNDRV_PCM_HW_PARAM_CHANNELS,
1290                        &hw_constraints_channels);
1291     return 0;
1292 }
1293 
1294 /*
1295  * open callback for capture on via686 and via823x
1296  */
1297 static int snd_via82xx_capture_open(struct snd_pcm_substream *substream)
1298 {
1299     struct via82xx *chip = snd_pcm_substream_chip(substream);
1300     struct viadev *viadev = &chip->devs[chip->capture_devno + substream->pcm->device];
1301 
1302     return snd_via82xx_pcm_open(chip, viadev, substream);
1303 }
1304 
1305 /*
1306  * close callback
1307  */
1308 static int snd_via82xx_pcm_close(struct snd_pcm_substream *substream)
1309 {
1310     struct via82xx *chip = snd_pcm_substream_chip(substream);
1311     struct viadev *viadev = substream->runtime->private_data;
1312     struct via_rate_lock *ratep;
1313 
1314     /* release the rate lock */
1315     ratep = &chip->rates[viadev->direction];
1316     spin_lock_irq(&ratep->lock);
1317     ratep->used--;
1318     if (! ratep->used)
1319         ratep->rate = 0;
1320     spin_unlock_irq(&ratep->lock);
1321     if (! ratep->rate) {
1322         if (! viadev->direction) {
1323             snd_ac97_update_power(chip->ac97,
1324                           AC97_PCM_FRONT_DAC_RATE, 0);
1325             snd_ac97_update_power(chip->ac97,
1326                           AC97_PCM_SURR_DAC_RATE, 0);
1327             snd_ac97_update_power(chip->ac97,
1328                           AC97_PCM_LFE_DAC_RATE, 0);
1329         } else
1330             snd_ac97_update_power(chip->ac97,
1331                           AC97_PCM_LR_ADC_RATE, 0);
1332     }
1333     viadev->substream = NULL;
1334     return 0;
1335 }
1336 
1337 static int snd_via8233_playback_close(struct snd_pcm_substream *substream)
1338 {
1339     struct via82xx *chip = snd_pcm_substream_chip(substream);
1340     struct viadev *viadev = substream->runtime->private_data;
1341     unsigned int stream;
1342 
1343     stream = viadev->reg_offset / 0x10;
1344     if (chip->dxs_controls[stream]) {
1345         chip->dxs_controls[stream]->vd[0].access |=
1346             SNDRV_CTL_ELEM_ACCESS_INACTIVE;
1347         snd_ctl_notify(chip->card, SNDRV_CTL_EVENT_MASK_INFO,
1348                    &chip->dxs_controls[stream]->id);
1349     }
1350     return snd_via82xx_pcm_close(substream);
1351 }
1352 
1353 
1354 /* via686 playback callbacks */
1355 static const struct snd_pcm_ops snd_via686_playback_ops = {
1356     .open =     snd_via686_playback_open,
1357     .close =    snd_via82xx_pcm_close,
1358     .hw_params =    snd_via82xx_hw_params,
1359     .hw_free =  snd_via82xx_hw_free,
1360     .prepare =  snd_via686_playback_prepare,
1361     .trigger =  snd_via82xx_pcm_trigger,
1362     .pointer =  snd_via686_pcm_pointer,
1363 };
1364 
1365 /* via686 capture callbacks */
1366 static const struct snd_pcm_ops snd_via686_capture_ops = {
1367     .open =     snd_via82xx_capture_open,
1368     .close =    snd_via82xx_pcm_close,
1369     .hw_params =    snd_via82xx_hw_params,
1370     .hw_free =  snd_via82xx_hw_free,
1371     .prepare =  snd_via686_capture_prepare,
1372     .trigger =  snd_via82xx_pcm_trigger,
1373     .pointer =  snd_via686_pcm_pointer,
1374 };
1375 
1376 /* via823x DSX playback callbacks */
1377 static const struct snd_pcm_ops snd_via8233_playback_ops = {
1378     .open =     snd_via8233_playback_open,
1379     .close =    snd_via8233_playback_close,
1380     .hw_params =    snd_via82xx_hw_params,
1381     .hw_free =  snd_via82xx_hw_free,
1382     .prepare =  snd_via8233_playback_prepare,
1383     .trigger =  snd_via82xx_pcm_trigger,
1384     .pointer =  snd_via8233_pcm_pointer,
1385 };
1386 
1387 /* via823x multi-channel playback callbacks */
1388 static const struct snd_pcm_ops snd_via8233_multi_ops = {
1389     .open =     snd_via8233_multi_open,
1390     .close =    snd_via82xx_pcm_close,
1391     .hw_params =    snd_via82xx_hw_params,
1392     .hw_free =  snd_via82xx_hw_free,
1393     .prepare =  snd_via8233_multi_prepare,
1394     .trigger =  snd_via82xx_pcm_trigger,
1395     .pointer =  snd_via8233_pcm_pointer,
1396 };
1397 
1398 /* via823x capture callbacks */
1399 static const struct snd_pcm_ops snd_via8233_capture_ops = {
1400     .open =     snd_via82xx_capture_open,
1401     .close =    snd_via82xx_pcm_close,
1402     .hw_params =    snd_via82xx_hw_params,
1403     .hw_free =  snd_via82xx_hw_free,
1404     .prepare =  snd_via8233_capture_prepare,
1405     .trigger =  snd_via82xx_pcm_trigger,
1406     .pointer =  snd_via8233_pcm_pointer,
1407 };
1408 
1409 
1410 static void init_viadev(struct via82xx *chip, int idx, unsigned int reg_offset,
1411             int shadow_pos, int direction)
1412 {
1413     chip->devs[idx].reg_offset = reg_offset;
1414     chip->devs[idx].shadow_shift = shadow_pos * 4;
1415     chip->devs[idx].direction = direction;
1416     chip->devs[idx].port = chip->port + reg_offset;
1417 }
1418 
1419 /*
1420  * create pcm instances for VIA8233, 8233C and 8235 (not 8233A)
1421  */
1422 static int snd_via8233_pcm_new(struct via82xx *chip)
1423 {
1424     struct snd_pcm *pcm;
1425     struct snd_pcm_chmap *chmap;
1426     int i, err;
1427 
1428     chip->playback_devno = 0;   /* x 4 */
1429     chip->multi_devno = 4;      /* x 1 */
1430     chip->capture_devno = 5;    /* x 2 */
1431     chip->num_devs = 7;
1432     chip->intr_mask = 0x33033333; /* FLAG|EOL for rec0-1, mc, sdx0-3 */
1433 
1434     /* PCM #0:  4 DSX playbacks and 1 capture */
1435     err = snd_pcm_new(chip->card, chip->card->shortname, 0, 4, 1, &pcm);
1436     if (err < 0)
1437         return err;
1438     snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &snd_via8233_playback_ops);
1439     snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &snd_via8233_capture_ops);
1440     pcm->private_data = chip;
1441     strcpy(pcm->name, chip->card->shortname);
1442     chip->pcms[0] = pcm;
1443     /* set up playbacks */
1444     for (i = 0; i < 4; i++)
1445         init_viadev(chip, i, 0x10 * i, i, 0);
1446     /* capture */
1447     init_viadev(chip, chip->capture_devno, VIA_REG_CAPTURE_8233_STATUS, 6, 1);
1448 
1449     snd_pcm_set_managed_buffer_all(pcm, SNDRV_DMA_TYPE_DEV_SG,
1450                        &chip->pci->dev,
1451                        64*1024, VIA_MAX_BUFSIZE);
1452 
1453     err = snd_pcm_add_chmap_ctls(pcm, SNDRV_PCM_STREAM_PLAYBACK,
1454                      snd_pcm_std_chmaps, 2, 0,
1455                      &chmap);
1456     if (err < 0)
1457         return err;
1458 
1459     /* PCM #1:  multi-channel playback and 2nd capture */
1460     err = snd_pcm_new(chip->card, chip->card->shortname, 1, 1, 1, &pcm);
1461     if (err < 0)
1462         return err;
1463     snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &snd_via8233_multi_ops);
1464     snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &snd_via8233_capture_ops);
1465     pcm->private_data = chip;
1466     strcpy(pcm->name, chip->card->shortname);
1467     chip->pcms[1] = pcm;
1468     /* set up playback */
1469     init_viadev(chip, chip->multi_devno, VIA_REG_MULTPLAY_STATUS, 4, 0);
1470     /* set up capture */
1471     init_viadev(chip, chip->capture_devno + 1, VIA_REG_CAPTURE_8233_STATUS + 0x10, 7, 1);
1472 
1473     snd_pcm_set_managed_buffer_all(pcm, SNDRV_DMA_TYPE_DEV_SG,
1474                        &chip->pci->dev,
1475                        64*1024, VIA_MAX_BUFSIZE);
1476 
1477     err = snd_pcm_add_chmap_ctls(pcm, SNDRV_PCM_STREAM_PLAYBACK,
1478                      snd_pcm_alt_chmaps, 6, 0,
1479                      &chmap);
1480     if (err < 0)
1481         return err;
1482     chip->ac97->chmaps[SNDRV_PCM_STREAM_PLAYBACK] = chmap;
1483 
1484     return 0;
1485 }
1486 
1487 /*
1488  * create pcm instances for VIA8233A
1489  */
1490 static int snd_via8233a_pcm_new(struct via82xx *chip)
1491 {
1492     struct snd_pcm *pcm;
1493     struct snd_pcm_chmap *chmap;
1494     int err;
1495 
1496     chip->multi_devno = 0;
1497     chip->playback_devno = 1;
1498     chip->capture_devno = 2;
1499     chip->num_devs = 3;
1500     chip->intr_mask = 0x03033000; /* FLAG|EOL for rec0, mc, sdx3 */
1501 
1502     /* PCM #0:  multi-channel playback and capture */
1503     err = snd_pcm_new(chip->card, chip->card->shortname, 0, 1, 1, &pcm);
1504     if (err < 0)
1505         return err;
1506     snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &snd_via8233_multi_ops);
1507     snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &snd_via8233_capture_ops);
1508     pcm->private_data = chip;
1509     strcpy(pcm->name, chip->card->shortname);
1510     chip->pcms[0] = pcm;
1511     /* set up playback */
1512     init_viadev(chip, chip->multi_devno, VIA_REG_MULTPLAY_STATUS, 4, 0);
1513     /* capture */
1514     init_viadev(chip, chip->capture_devno, VIA_REG_CAPTURE_8233_STATUS, 6, 1);
1515 
1516     snd_pcm_set_managed_buffer_all(pcm, SNDRV_DMA_TYPE_DEV_SG,
1517                        &chip->pci->dev,
1518                        64*1024, VIA_MAX_BUFSIZE);
1519 
1520     err = snd_pcm_add_chmap_ctls(pcm, SNDRV_PCM_STREAM_PLAYBACK,
1521                      snd_pcm_alt_chmaps, 6, 0,
1522                      &chmap);
1523     if (err < 0)
1524         return err;
1525     chip->ac97->chmaps[SNDRV_PCM_STREAM_PLAYBACK] = chmap;
1526 
1527     /* SPDIF supported? */
1528     if (! ac97_can_spdif(chip->ac97))
1529         return 0;
1530 
1531     /* PCM #1:  DXS3 playback (for spdif) */
1532     err = snd_pcm_new(chip->card, chip->card->shortname, 1, 1, 0, &pcm);
1533     if (err < 0)
1534         return err;
1535     snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &snd_via8233_playback_ops);
1536     pcm->private_data = chip;
1537     strcpy(pcm->name, chip->card->shortname);
1538     chip->pcms[1] = pcm;
1539     /* set up playback */
1540     init_viadev(chip, chip->playback_devno, 0x30, 3, 0);
1541 
1542     snd_pcm_set_managed_buffer_all(pcm, SNDRV_DMA_TYPE_DEV_SG,
1543                        &chip->pci->dev,
1544                        64*1024, VIA_MAX_BUFSIZE);
1545     return 0;
1546 }
1547 
1548 /*
1549  * create a pcm instance for via686a/b
1550  */
1551 static int snd_via686_pcm_new(struct via82xx *chip)
1552 {
1553     struct snd_pcm *pcm;
1554     int err;
1555 
1556     chip->playback_devno = 0;
1557     chip->capture_devno = 1;
1558     chip->num_devs = 2;
1559     chip->intr_mask = 0x77; /* FLAG | EOL for PB, CP, FM */
1560 
1561     err = snd_pcm_new(chip->card, chip->card->shortname, 0, 1, 1, &pcm);
1562     if (err < 0)
1563         return err;
1564     snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &snd_via686_playback_ops);
1565     snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &snd_via686_capture_ops);
1566     pcm->private_data = chip;
1567     strcpy(pcm->name, chip->card->shortname);
1568     chip->pcms[0] = pcm;
1569     init_viadev(chip, 0, VIA_REG_PLAYBACK_STATUS, 0, 0);
1570     init_viadev(chip, 1, VIA_REG_CAPTURE_STATUS, 0, 1);
1571 
1572     snd_pcm_set_managed_buffer_all(pcm, SNDRV_DMA_TYPE_DEV_SG,
1573                        &chip->pci->dev,
1574                        64*1024, VIA_MAX_BUFSIZE);
1575     return 0;
1576 }
1577 
1578 
1579 /*
1580  *  Mixer part
1581  */
1582 
1583 static int snd_via8233_capture_source_info(struct snd_kcontrol *kcontrol,
1584                        struct snd_ctl_elem_info *uinfo)
1585 {
1586     /* formerly they were "Line" and "Mic", but it looks like that they
1587      * have nothing to do with the actual physical connections...
1588      */
1589     static const char * const texts[2] = {
1590         "Input1", "Input2"
1591     };
1592     return snd_ctl_enum_info(uinfo, 1, 2, texts);
1593 }
1594 
1595 static int snd_via8233_capture_source_get(struct snd_kcontrol *kcontrol,
1596                       struct snd_ctl_elem_value *ucontrol)
1597 {
1598     struct via82xx *chip = snd_kcontrol_chip(kcontrol);
1599     unsigned long port = chip->port + (kcontrol->id.index ? (VIA_REG_CAPTURE_CHANNEL + 0x10) : VIA_REG_CAPTURE_CHANNEL);
1600     ucontrol->value.enumerated.item[0] = inb(port) & VIA_REG_CAPTURE_CHANNEL_MIC ? 1 : 0;
1601     return 0;
1602 }
1603 
1604 static int snd_via8233_capture_source_put(struct snd_kcontrol *kcontrol,
1605                       struct snd_ctl_elem_value *ucontrol)
1606 {
1607     struct via82xx *chip = snd_kcontrol_chip(kcontrol);
1608     unsigned long port = chip->port + (kcontrol->id.index ? (VIA_REG_CAPTURE_CHANNEL + 0x10) : VIA_REG_CAPTURE_CHANNEL);
1609     u8 val, oval;
1610 
1611     spin_lock_irq(&chip->reg_lock);
1612     oval = inb(port);
1613     val = oval & ~VIA_REG_CAPTURE_CHANNEL_MIC;
1614     if (ucontrol->value.enumerated.item[0])
1615         val |= VIA_REG_CAPTURE_CHANNEL_MIC;
1616     if (val != oval)
1617         outb(val, port);
1618     spin_unlock_irq(&chip->reg_lock);
1619     return val != oval;
1620 }
1621 
1622 static struct snd_kcontrol_new snd_via8233_capture_source = {
1623     .name = "Input Source Select",
1624     .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
1625     .info = snd_via8233_capture_source_info,
1626     .get = snd_via8233_capture_source_get,
1627     .put = snd_via8233_capture_source_put,
1628 };
1629 
1630 #define snd_via8233_dxs3_spdif_info snd_ctl_boolean_mono_info
1631 
1632 static int snd_via8233_dxs3_spdif_get(struct snd_kcontrol *kcontrol,
1633                       struct snd_ctl_elem_value *ucontrol)
1634 {
1635     struct via82xx *chip = snd_kcontrol_chip(kcontrol);
1636     u8 val;
1637 
1638     pci_read_config_byte(chip->pci, VIA8233_SPDIF_CTRL, &val);
1639     ucontrol->value.integer.value[0] = (val & VIA8233_SPDIF_DX3) ? 1 : 0;
1640     return 0;
1641 }
1642 
1643 static int snd_via8233_dxs3_spdif_put(struct snd_kcontrol *kcontrol,
1644                       struct snd_ctl_elem_value *ucontrol)
1645 {
1646     struct via82xx *chip = snd_kcontrol_chip(kcontrol);
1647     u8 val, oval;
1648 
1649     pci_read_config_byte(chip->pci, VIA8233_SPDIF_CTRL, &oval);
1650     val = oval & ~VIA8233_SPDIF_DX3;
1651     if (ucontrol->value.integer.value[0])
1652         val |= VIA8233_SPDIF_DX3;
1653     /* save the spdif flag for rate filtering */
1654     chip->spdif_on = ucontrol->value.integer.value[0] ? 1 : 0;
1655     if (val != oval) {
1656         pci_write_config_byte(chip->pci, VIA8233_SPDIF_CTRL, val);
1657         return 1;
1658     }
1659     return 0;
1660 }
1661 
1662 static const struct snd_kcontrol_new snd_via8233_dxs3_spdif_control = {
1663     .name = SNDRV_CTL_NAME_IEC958("Output ",NONE,SWITCH),
1664     .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
1665     .info = snd_via8233_dxs3_spdif_info,
1666     .get = snd_via8233_dxs3_spdif_get,
1667     .put = snd_via8233_dxs3_spdif_put,
1668 };
1669 
1670 static int snd_via8233_dxs_volume_info(struct snd_kcontrol *kcontrol,
1671                        struct snd_ctl_elem_info *uinfo)
1672 {
1673     uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
1674     uinfo->count = 2;
1675     uinfo->value.integer.min = 0;
1676     uinfo->value.integer.max = VIA_DXS_MAX_VOLUME;
1677     return 0;
1678 }
1679 
1680 static int snd_via8233_dxs_volume_get(struct snd_kcontrol *kcontrol,
1681                       struct snd_ctl_elem_value *ucontrol)
1682 {
1683     struct via82xx *chip = snd_kcontrol_chip(kcontrol);
1684     unsigned int idx = kcontrol->id.subdevice;
1685 
1686     ucontrol->value.integer.value[0] = VIA_DXS_MAX_VOLUME - chip->playback_volume[idx][0];
1687     ucontrol->value.integer.value[1] = VIA_DXS_MAX_VOLUME - chip->playback_volume[idx][1];
1688     return 0;
1689 }
1690 
1691 static int snd_via8233_pcmdxs_volume_get(struct snd_kcontrol *kcontrol,
1692                      struct snd_ctl_elem_value *ucontrol)
1693 {
1694     struct via82xx *chip = snd_kcontrol_chip(kcontrol);
1695     ucontrol->value.integer.value[0] = VIA_DXS_MAX_VOLUME - chip->playback_volume_c[0];
1696     ucontrol->value.integer.value[1] = VIA_DXS_MAX_VOLUME - chip->playback_volume_c[1];
1697     return 0;
1698 }
1699 
1700 static int snd_via8233_dxs_volume_put(struct snd_kcontrol *kcontrol,
1701                       struct snd_ctl_elem_value *ucontrol)
1702 {
1703     struct via82xx *chip = snd_kcontrol_chip(kcontrol);
1704     unsigned int idx = kcontrol->id.subdevice;
1705     unsigned long port = chip->port + 0x10 * idx;
1706     unsigned char val;
1707     int i, change = 0;
1708 
1709     for (i = 0; i < 2; i++) {
1710         val = ucontrol->value.integer.value[i];
1711         if (val > VIA_DXS_MAX_VOLUME)
1712             val = VIA_DXS_MAX_VOLUME;
1713         val = VIA_DXS_MAX_VOLUME - val;
1714         change |= val != chip->playback_volume[idx][i];
1715         if (change) {
1716             chip->playback_volume[idx][i] = val;
1717             outb(val, port + VIA_REG_OFS_PLAYBACK_VOLUME_L + i);
1718         }
1719     }
1720     return change;
1721 }
1722 
1723 static int snd_via8233_pcmdxs_volume_put(struct snd_kcontrol *kcontrol,
1724                      struct snd_ctl_elem_value *ucontrol)
1725 {
1726     struct via82xx *chip = snd_kcontrol_chip(kcontrol);
1727     unsigned int idx;
1728     unsigned char val;
1729     int i, change = 0;
1730 
1731     for (i = 0; i < 2; i++) {
1732         val = ucontrol->value.integer.value[i];
1733         if (val > VIA_DXS_MAX_VOLUME)
1734             val = VIA_DXS_MAX_VOLUME;
1735         val = VIA_DXS_MAX_VOLUME - val;
1736         if (val != chip->playback_volume_c[i]) {
1737             change = 1;
1738             chip->playback_volume_c[i] = val;
1739             for (idx = 0; idx < 4; idx++) {
1740                 unsigned long port = chip->port + 0x10 * idx;
1741                 chip->playback_volume[idx][i] = val;
1742                 outb(val, port + VIA_REG_OFS_PLAYBACK_VOLUME_L + i);
1743             }
1744         }
1745     }
1746     return change;
1747 }
1748 
1749 static const DECLARE_TLV_DB_SCALE(db_scale_dxs, -4650, 150, 1);
1750 
1751 static const struct snd_kcontrol_new snd_via8233_pcmdxs_volume_control = {
1752     .name = "PCM Playback Volume",
1753     .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
1754     .access = (SNDRV_CTL_ELEM_ACCESS_READWRITE |
1755            SNDRV_CTL_ELEM_ACCESS_TLV_READ),
1756     .info = snd_via8233_dxs_volume_info,
1757     .get = snd_via8233_pcmdxs_volume_get,
1758     .put = snd_via8233_pcmdxs_volume_put,
1759     .tlv = { .p = db_scale_dxs }
1760 };
1761 
1762 static const struct snd_kcontrol_new snd_via8233_dxs_volume_control = {
1763     .iface = SNDRV_CTL_ELEM_IFACE_PCM,
1764     .device = 0,
1765     /* .subdevice set later */
1766     .name = "PCM Playback Volume",
1767     .access = SNDRV_CTL_ELEM_ACCESS_READWRITE |
1768           SNDRV_CTL_ELEM_ACCESS_TLV_READ |
1769           SNDRV_CTL_ELEM_ACCESS_INACTIVE,
1770     .info = snd_via8233_dxs_volume_info,
1771     .get = snd_via8233_dxs_volume_get,
1772     .put = snd_via8233_dxs_volume_put,
1773     .tlv = { .p = db_scale_dxs }
1774 };
1775 
1776 /*
1777  */
1778 
1779 static void snd_via82xx_mixer_free_ac97_bus(struct snd_ac97_bus *bus)
1780 {
1781     struct via82xx *chip = bus->private_data;
1782     chip->ac97_bus = NULL;
1783 }
1784 
1785 static void snd_via82xx_mixer_free_ac97(struct snd_ac97 *ac97)
1786 {
1787     struct via82xx *chip = ac97->private_data;
1788     chip->ac97 = NULL;
1789 }
1790 
1791 static const struct ac97_quirk ac97_quirks[] = {
1792     {
1793         .subvendor = 0x1106,
1794         .subdevice = 0x4161,
1795         .codec_id = 0x56494161, /* VT1612A */
1796         .name = "Soltek SL-75DRV5",
1797         .type = AC97_TUNE_NONE
1798     },
1799     {   /* FIXME: which codec? */
1800         .subvendor = 0x1106,
1801         .subdevice = 0x4161,
1802         .name = "ASRock K7VT2",
1803         .type = AC97_TUNE_HP_ONLY
1804     },
1805     {
1806         .subvendor = 0x110a,
1807         .subdevice = 0x0079,
1808         .name = "Fujitsu Siemens D1289",
1809         .type = AC97_TUNE_HP_ONLY
1810     },
1811     {
1812         .subvendor = 0x1019,
1813         .subdevice = 0x0a81,
1814         .name = "ECS K7VTA3",
1815         .type = AC97_TUNE_HP_ONLY
1816     },
1817     {
1818         .subvendor = 0x1019,
1819         .subdevice = 0x0a85,
1820         .name = "ECS L7VMM2",
1821         .type = AC97_TUNE_HP_ONLY
1822     },
1823     {
1824         .subvendor = 0x1019,
1825         .subdevice = 0x1841,
1826         .name = "ECS K7VTA3",
1827         .type = AC97_TUNE_HP_ONLY
1828     },
1829     {
1830         .subvendor = 0x1849,
1831         .subdevice = 0x3059,
1832         .name = "ASRock K7VM2",
1833         .type = AC97_TUNE_HP_ONLY   /* VT1616 */
1834     },
1835     {
1836         .subvendor = 0x14cd,
1837         .subdevice = 0x7002,
1838         .name = "Unknown",
1839         .type = AC97_TUNE_ALC_JACK
1840     },
1841     {
1842         .subvendor = 0x1071,
1843         .subdevice = 0x8590,
1844         .name = "Mitac Mobo",
1845         .type = AC97_TUNE_ALC_JACK
1846     },
1847     {
1848         .subvendor = 0x161f,
1849         .subdevice = 0x202b,
1850         .name = "Arima Notebook",
1851         .type = AC97_TUNE_HP_ONLY,
1852     },
1853     {
1854         .subvendor = 0x161f,
1855         .subdevice = 0x2032,
1856         .name = "Targa Traveller 811",
1857         .type = AC97_TUNE_HP_ONLY,
1858     },
1859     {
1860         .subvendor = 0x161f,
1861         .subdevice = 0x2032,
1862         .name = "m680x",
1863         .type = AC97_TUNE_HP_ONLY, /* http://launchpad.net/bugs/38546 */
1864     },
1865     {
1866         .subvendor = 0x1297,
1867         .subdevice = 0xa232,
1868         .name = "Shuttle AK32VN",
1869         .type = AC97_TUNE_HP_ONLY
1870     },
1871     { } /* terminator */
1872 };
1873 
1874 static int snd_via82xx_mixer_new(struct via82xx *chip, const char *quirk_override)
1875 {
1876     struct snd_ac97_template ac97;
1877     int err;
1878     static const struct snd_ac97_bus_ops ops = {
1879         .write = snd_via82xx_codec_write,
1880         .read = snd_via82xx_codec_read,
1881         .wait = snd_via82xx_codec_wait,
1882     };
1883 
1884     err = snd_ac97_bus(chip->card, 0, &ops, chip, &chip->ac97_bus);
1885     if (err < 0)
1886         return err;
1887     chip->ac97_bus->private_free = snd_via82xx_mixer_free_ac97_bus;
1888     chip->ac97_bus->clock = chip->ac97_clock;
1889 
1890     memset(&ac97, 0, sizeof(ac97));
1891     ac97.private_data = chip;
1892     ac97.private_free = snd_via82xx_mixer_free_ac97;
1893     ac97.pci = chip->pci;
1894     ac97.scaps = AC97_SCAP_SKIP_MODEM | AC97_SCAP_POWER_SAVE;
1895     err = snd_ac97_mixer(chip->ac97_bus, &ac97, &chip->ac97);
1896     if (err < 0)
1897         return err;
1898 
1899     snd_ac97_tune_hardware(chip->ac97, ac97_quirks, quirk_override);
1900 
1901     if (chip->chip_type != TYPE_VIA686) {
1902         /* use slot 10/11 */
1903         snd_ac97_update_bits(chip->ac97, AC97_EXTENDED_STATUS, 0x03 << 4, 0x03 << 4);
1904     }
1905 
1906     return 0;
1907 }
1908 
1909 #ifdef SUPPORT_JOYSTICK
1910 #define JOYSTICK_ADDR   0x200
1911 static int snd_via686_create_gameport(struct via82xx *chip, unsigned char *legacy)
1912 {
1913     struct gameport *gp;
1914 
1915     if (!joystick)
1916         return -ENODEV;
1917 
1918     if (!devm_request_region(chip->card->dev, JOYSTICK_ADDR, 8,
1919                  "VIA686 gameport")) {
1920         dev_warn(chip->card->dev, "cannot reserve joystick port %#x\n",
1921                JOYSTICK_ADDR);
1922         return -EBUSY;
1923     }
1924 
1925     chip->gameport = gp = gameport_allocate_port();
1926     if (!gp) {
1927         dev_err(chip->card->dev,
1928             "cannot allocate memory for gameport\n");
1929         return -ENOMEM;
1930     }
1931 
1932     gameport_set_name(gp, "VIA686 Gameport");
1933     gameport_set_phys(gp, "pci%s/gameport0", pci_name(chip->pci));
1934     gameport_set_dev_parent(gp, &chip->pci->dev);
1935     gp->io = JOYSTICK_ADDR;
1936 
1937     /* Enable legacy joystick port */
1938     *legacy |= VIA_FUNC_ENABLE_GAME;
1939     pci_write_config_byte(chip->pci, VIA_FUNC_ENABLE, *legacy);
1940 
1941     gameport_register_port(chip->gameport);
1942 
1943     return 0;
1944 }
1945 
1946 static void snd_via686_free_gameport(struct via82xx *chip)
1947 {
1948     if (chip->gameport) {
1949         gameport_unregister_port(chip->gameport);
1950         chip->gameport = NULL;
1951     }
1952 }
1953 #else
1954 static inline int snd_via686_create_gameport(struct via82xx *chip, unsigned char *legacy)
1955 {
1956     return -ENOSYS;
1957 }
1958 static inline void snd_via686_free_gameport(struct via82xx *chip) { }
1959 #endif
1960 
1961 
1962 /*
1963  *
1964  */
1965 
1966 static int snd_via8233_init_misc(struct via82xx *chip)
1967 {
1968     int i, err, caps;
1969     unsigned char val;
1970 
1971     caps = chip->chip_type == TYPE_VIA8233A ? 1 : 2;
1972     for (i = 0; i < caps; i++) {
1973         snd_via8233_capture_source.index = i;
1974         err = snd_ctl_add(chip->card, snd_ctl_new1(&snd_via8233_capture_source, chip));
1975         if (err < 0)
1976             return err;
1977     }
1978     if (ac97_can_spdif(chip->ac97)) {
1979         err = snd_ctl_add(chip->card, snd_ctl_new1(&snd_via8233_dxs3_spdif_control, chip));
1980         if (err < 0)
1981             return err;
1982     }
1983     if (chip->chip_type != TYPE_VIA8233A) {
1984         /* when no h/w PCM volume control is found, use DXS volume control
1985          * as the PCM vol control
1986          */
1987         struct snd_ctl_elem_id sid;
1988         memset(&sid, 0, sizeof(sid));
1989         strcpy(sid.name, "PCM Playback Volume");
1990         sid.iface = SNDRV_CTL_ELEM_IFACE_MIXER;
1991         if (! snd_ctl_find_id(chip->card, &sid)) {
1992             dev_info(chip->card->dev,
1993                  "Using DXS as PCM Playback\n");
1994             err = snd_ctl_add(chip->card, snd_ctl_new1(&snd_via8233_pcmdxs_volume_control, chip));
1995             if (err < 0)
1996                 return err;
1997         }
1998         else /* Using DXS when PCM emulation is enabled is really weird */
1999         {
2000             for (i = 0; i < 4; ++i) {
2001                 struct snd_kcontrol *kctl;
2002 
2003                 kctl = snd_ctl_new1(
2004                     &snd_via8233_dxs_volume_control, chip);
2005                 if (!kctl)
2006                     return -ENOMEM;
2007                 kctl->id.subdevice = i;
2008                 err = snd_ctl_add(chip->card, kctl);
2009                 if (err < 0)
2010                     return err;
2011                 chip->dxs_controls[i] = kctl;
2012             }
2013         }
2014     }
2015     /* select spdif data slot 10/11 */
2016     pci_read_config_byte(chip->pci, VIA8233_SPDIF_CTRL, &val);
2017     val = (val & ~VIA8233_SPDIF_SLOT_MASK) | VIA8233_SPDIF_SLOT_1011;
2018     val &= ~VIA8233_SPDIF_DX3; /* SPDIF off as default */
2019     pci_write_config_byte(chip->pci, VIA8233_SPDIF_CTRL, val);
2020 
2021     return 0;
2022 }
2023 
2024 static int snd_via686_init_misc(struct via82xx *chip)
2025 {
2026     unsigned char legacy, legacy_cfg;
2027     int rev_h = 0;
2028 
2029     legacy = chip->old_legacy;
2030     legacy_cfg = chip->old_legacy_cfg;
2031     legacy |= VIA_FUNC_MIDI_IRQMASK;    /* FIXME: correct? (disable MIDI) */
2032     legacy &= ~VIA_FUNC_ENABLE_GAME;    /* disable joystick */
2033     if (chip->revision >= VIA_REV_686_H) {
2034         rev_h = 1;
2035         if (mpu_port >= 0x200) {    /* force MIDI */
2036             mpu_port &= 0xfffc;
2037             pci_write_config_dword(chip->pci, 0x18, mpu_port | 0x01);
2038 #ifdef CONFIG_PM_SLEEP
2039             chip->mpu_port_saved = mpu_port;
2040 #endif
2041         } else {
2042             mpu_port = pci_resource_start(chip->pci, 2);
2043         }
2044     } else {
2045         switch (mpu_port) { /* force MIDI */
2046         case 0x300:
2047         case 0x310:
2048         case 0x320:
2049         case 0x330:
2050             legacy_cfg &= ~(3 << 2);
2051             legacy_cfg |= (mpu_port & 0x0030) >> 2;
2052             break;
2053         default:            /* no, use BIOS settings */
2054             if (legacy & VIA_FUNC_ENABLE_MIDI)
2055                 mpu_port = 0x300 + ((legacy_cfg & 0x000c) << 2);
2056             break;
2057         }
2058     }
2059     if (mpu_port >= 0x200)
2060         chip->mpu_res = devm_request_region(&chip->pci->dev, mpu_port,
2061                             2, "VIA82xx MPU401");
2062     if (chip->mpu_res) {
2063         if (rev_h)
2064             legacy |= VIA_FUNC_MIDI_PNP;    /* enable PCI I/O 2 */
2065         legacy |= VIA_FUNC_ENABLE_MIDI;
2066     } else {
2067         if (rev_h)
2068             legacy &= ~VIA_FUNC_MIDI_PNP;   /* disable PCI I/O 2 */
2069         legacy &= ~VIA_FUNC_ENABLE_MIDI;
2070         mpu_port = 0;
2071     }
2072 
2073     pci_write_config_byte(chip->pci, VIA_FUNC_ENABLE, legacy);
2074     pci_write_config_byte(chip->pci, VIA_PNP_CONTROL, legacy_cfg);
2075     if (chip->mpu_res) {
2076         if (snd_mpu401_uart_new(chip->card, 0, MPU401_HW_VIA686A,
2077                     mpu_port, MPU401_INFO_INTEGRATED |
2078                     MPU401_INFO_IRQ_HOOK, -1,
2079                     &chip->rmidi) < 0) {
2080             dev_warn(chip->card->dev,
2081                  "unable to initialize MPU-401 at 0x%lx, skipping\n",
2082                  mpu_port);
2083             legacy &= ~VIA_FUNC_ENABLE_MIDI;
2084         } else {
2085             legacy &= ~VIA_FUNC_MIDI_IRQMASK;   /* enable MIDI interrupt */
2086         }
2087         pci_write_config_byte(chip->pci, VIA_FUNC_ENABLE, legacy);
2088     }
2089 
2090     snd_via686_create_gameport(chip, &legacy);
2091 
2092 #ifdef CONFIG_PM_SLEEP
2093     chip->legacy_saved = legacy;
2094     chip->legacy_cfg_saved = legacy_cfg;
2095 #endif
2096 
2097     return 0;
2098 }
2099 
2100 
2101 /*
2102  * proc interface
2103  */
2104 static void snd_via82xx_proc_read(struct snd_info_entry *entry,
2105                   struct snd_info_buffer *buffer)
2106 {
2107     struct via82xx *chip = entry->private_data;
2108     int i;
2109     
2110     snd_iprintf(buffer, "%s\n\n", chip->card->longname);
2111     for (i = 0; i < 0xa0; i += 4) {
2112         snd_iprintf(buffer, "%02x: %08x\n", i, inl(chip->port + i));
2113     }
2114 }
2115 
2116 static void snd_via82xx_proc_init(struct via82xx *chip)
2117 {
2118     snd_card_ro_proc_new(chip->card, "via82xx", chip,
2119                  snd_via82xx_proc_read);
2120 }
2121 
2122 /*
2123  *
2124  */
2125 
2126 static int snd_via82xx_chip_init(struct via82xx *chip)
2127 {
2128     unsigned int val;
2129     unsigned long end_time;
2130     unsigned char pval;
2131 
2132 #if 0 /* broken on K7M? */
2133     if (chip->chip_type == TYPE_VIA686)
2134         /* disable all legacy ports */
2135         pci_write_config_byte(chip->pci, VIA_FUNC_ENABLE, 0);
2136 #endif
2137     pci_read_config_byte(chip->pci, VIA_ACLINK_STAT, &pval);
2138     if (! (pval & VIA_ACLINK_C00_READY)) { /* codec not ready? */
2139         /* deassert ACLink reset, force SYNC */
2140         pci_write_config_byte(chip->pci, VIA_ACLINK_CTRL,
2141                       VIA_ACLINK_CTRL_ENABLE |
2142                       VIA_ACLINK_CTRL_RESET |
2143                       VIA_ACLINK_CTRL_SYNC);
2144         udelay(100);
2145 #if 1 /* FIXME: should we do full reset here for all chip models? */
2146         pci_write_config_byte(chip->pci, VIA_ACLINK_CTRL, 0x00);
2147         udelay(100);
2148 #else
2149         /* deassert ACLink reset, force SYNC (warm AC'97 reset) */
2150         pci_write_config_byte(chip->pci, VIA_ACLINK_CTRL,
2151                       VIA_ACLINK_CTRL_RESET|VIA_ACLINK_CTRL_SYNC);
2152         udelay(2);
2153 #endif
2154         /* ACLink on, deassert ACLink reset, VSR, SGD data out */
2155         /* note - FM data out has trouble with non VRA codecs !! */
2156         pci_write_config_byte(chip->pci, VIA_ACLINK_CTRL, VIA_ACLINK_CTRL_INIT);
2157         udelay(100);
2158     }
2159     
2160     /* Make sure VRA is enabled, in case we didn't do a
2161      * complete codec reset, above */
2162     pci_read_config_byte(chip->pci, VIA_ACLINK_CTRL, &pval);
2163     if ((pval & VIA_ACLINK_CTRL_INIT) != VIA_ACLINK_CTRL_INIT) {
2164         /* ACLink on, deassert ACLink reset, VSR, SGD data out */
2165         /* note - FM data out has trouble with non VRA codecs !! */
2166         pci_write_config_byte(chip->pci, VIA_ACLINK_CTRL, VIA_ACLINK_CTRL_INIT);
2167         udelay(100);
2168     }
2169 
2170     /* wait until codec ready */
2171     end_time = jiffies + msecs_to_jiffies(750);
2172     do {
2173         pci_read_config_byte(chip->pci, VIA_ACLINK_STAT, &pval);
2174         if (pval & VIA_ACLINK_C00_READY) /* primary codec ready */
2175             break;
2176         schedule_timeout_uninterruptible(1);
2177     } while (time_before(jiffies, end_time));
2178 
2179     val = snd_via82xx_codec_xread(chip);
2180     if (val & VIA_REG_AC97_BUSY)
2181         dev_err(chip->card->dev,
2182             "AC'97 codec is not ready [0x%x]\n", val);
2183 
2184 #if 0 /* FIXME: we don't support the second codec yet so skip the detection now.. */
2185     snd_via82xx_codec_xwrite(chip, VIA_REG_AC97_READ |
2186                  VIA_REG_AC97_SECONDARY_VALID |
2187                  (VIA_REG_AC97_CODEC_ID_SECONDARY << VIA_REG_AC97_CODEC_ID_SHIFT));
2188     end_time = jiffies + msecs_to_jiffies(750);
2189     snd_via82xx_codec_xwrite(chip, VIA_REG_AC97_READ |
2190                  VIA_REG_AC97_SECONDARY_VALID |
2191                  (VIA_REG_AC97_CODEC_ID_SECONDARY << VIA_REG_AC97_CODEC_ID_SHIFT));
2192     do {
2193         val = snd_via82xx_codec_xread(chip);
2194         if (val & VIA_REG_AC97_SECONDARY_VALID) {
2195             chip->ac97_secondary = 1;
2196             goto __ac97_ok2;
2197         }
2198         schedule_timeout_uninterruptible(1);
2199     } while (time_before(jiffies, end_time));
2200     /* This is ok, the most of motherboards have only one codec */
2201 
2202       __ac97_ok2:
2203 #endif
2204 
2205     if (chip->chip_type == TYPE_VIA686) {
2206         /* route FM trap to IRQ, disable FM trap */
2207         pci_write_config_byte(chip->pci, VIA_FM_NMI_CTRL, 0);
2208         /* disable all GPI interrupts */
2209         outl(0, VIAREG(chip, GPI_INTR));
2210     }
2211 
2212     if (chip->chip_type != TYPE_VIA686) {
2213         /* Workaround for Award BIOS bug:
2214          * DXS channels don't work properly with VRA if MC97 is disabled.
2215          */
2216         struct pci_dev *pci;
2217         pci = pci_get_device(0x1106, 0x3068, NULL); /* MC97 */
2218         if (pci) {
2219             unsigned char data;
2220             pci_read_config_byte(pci, 0x44, &data);
2221             pci_write_config_byte(pci, 0x44, data | 0x40);
2222             pci_dev_put(pci);
2223         }
2224     }
2225 
2226     if (chip->chip_type != TYPE_VIA8233A) {
2227         int i, idx;
2228         for (idx = 0; idx < 4; idx++) {
2229             unsigned long port = chip->port + 0x10 * idx;
2230             for (i = 0; i < 2; i++) {
2231                 chip->playback_volume[idx][i]=chip->playback_volume_c[i];
2232                 outb(chip->playback_volume_c[i],
2233                      port + VIA_REG_OFS_PLAYBACK_VOLUME_L + i);
2234             }
2235         }
2236     }
2237 
2238     return 0;
2239 }
2240 
2241 #ifdef CONFIG_PM_SLEEP
2242 /*
2243  * power management
2244  */
2245 static int snd_via82xx_suspend(struct device *dev)
2246 {
2247     struct snd_card *card = dev_get_drvdata(dev);
2248     struct via82xx *chip = card->private_data;
2249     int i;
2250 
2251     snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
2252     for (i = 0; i < chip->num_devs; i++)
2253         snd_via82xx_channel_reset(chip, &chip->devs[i]);
2254     snd_ac97_suspend(chip->ac97);
2255 
2256     /* save misc values */
2257     if (chip->chip_type != TYPE_VIA686) {
2258         pci_read_config_byte(chip->pci, VIA8233_SPDIF_CTRL, &chip->spdif_ctrl_saved);
2259         chip->capture_src_saved[0] = inb(chip->port + VIA_REG_CAPTURE_CHANNEL);
2260         chip->capture_src_saved[1] = inb(chip->port + VIA_REG_CAPTURE_CHANNEL + 0x10);
2261     }
2262 
2263     return 0;
2264 }
2265 
2266 static int snd_via82xx_resume(struct device *dev)
2267 {
2268     struct snd_card *card = dev_get_drvdata(dev);
2269     struct via82xx *chip = card->private_data;
2270     int i;
2271 
2272     snd_via82xx_chip_init(chip);
2273 
2274     if (chip->chip_type == TYPE_VIA686) {
2275         if (chip->mpu_port_saved)
2276             pci_write_config_dword(chip->pci, 0x18, chip->mpu_port_saved | 0x01);
2277         pci_write_config_byte(chip->pci, VIA_FUNC_ENABLE, chip->legacy_saved);
2278         pci_write_config_byte(chip->pci, VIA_PNP_CONTROL, chip->legacy_cfg_saved);
2279     } else {
2280         pci_write_config_byte(chip->pci, VIA8233_SPDIF_CTRL, chip->spdif_ctrl_saved);
2281         outb(chip->capture_src_saved[0], chip->port + VIA_REG_CAPTURE_CHANNEL);
2282         outb(chip->capture_src_saved[1], chip->port + VIA_REG_CAPTURE_CHANNEL + 0x10);
2283     }
2284 
2285     snd_ac97_resume(chip->ac97);
2286 
2287     for (i = 0; i < chip->num_devs; i++)
2288         snd_via82xx_channel_reset(chip, &chip->devs[i]);
2289 
2290     snd_power_change_state(card, SNDRV_CTL_POWER_D0);
2291     return 0;
2292 }
2293 
2294 static SIMPLE_DEV_PM_OPS(snd_via82xx_pm, snd_via82xx_suspend, snd_via82xx_resume);
2295 #define SND_VIA82XX_PM_OPS  &snd_via82xx_pm
2296 #else
2297 #define SND_VIA82XX_PM_OPS  NULL
2298 #endif /* CONFIG_PM_SLEEP */
2299 
2300 static void snd_via82xx_free(struct snd_card *card)
2301 {
2302     struct via82xx *chip = card->private_data;
2303     unsigned int i;
2304 
2305     /* disable interrupts */
2306     for (i = 0; i < chip->num_devs; i++)
2307         snd_via82xx_channel_reset(chip, &chip->devs[i]);
2308 
2309     if (chip->chip_type == TYPE_VIA686) {
2310         snd_via686_free_gameport(chip);
2311         pci_write_config_byte(chip->pci, VIA_FUNC_ENABLE, chip->old_legacy);
2312         pci_write_config_byte(chip->pci, VIA_PNP_CONTROL, chip->old_legacy_cfg);
2313     }
2314 }
2315 
2316 static int snd_via82xx_create(struct snd_card *card,
2317                   struct pci_dev *pci,
2318                   int chip_type,
2319                   int revision,
2320                   unsigned int ac97_clock)
2321 {
2322     struct via82xx *chip = card->private_data;
2323     int err;
2324 
2325     err = pcim_enable_device(pci);
2326     if (err < 0)
2327         return err;
2328 
2329     chip->chip_type = chip_type;
2330     chip->revision = revision;
2331 
2332     spin_lock_init(&chip->reg_lock);
2333     spin_lock_init(&chip->rates[0].lock);
2334     spin_lock_init(&chip->rates[1].lock);
2335     chip->card = card;
2336     chip->pci = pci;
2337     chip->irq = -1;
2338 
2339     pci_read_config_byte(pci, VIA_FUNC_ENABLE, &chip->old_legacy);
2340     pci_read_config_byte(pci, VIA_PNP_CONTROL, &chip->old_legacy_cfg);
2341     pci_write_config_byte(chip->pci, VIA_FUNC_ENABLE,
2342                   chip->old_legacy & ~(VIA_FUNC_ENABLE_SB|VIA_FUNC_ENABLE_FM));
2343 
2344     err = pci_request_regions(pci, card->driver);
2345     if (err < 0)
2346         return err;
2347     chip->port = pci_resource_start(pci, 0);
2348     if (devm_request_irq(&pci->dev, pci->irq,
2349                  chip_type == TYPE_VIA8233 ?
2350                  snd_via8233_interrupt : snd_via686_interrupt,
2351                  IRQF_SHARED,
2352                  KBUILD_MODNAME, chip)) {
2353         dev_err(card->dev, "unable to grab IRQ %d\n", pci->irq);
2354         return -EBUSY;
2355     }
2356     chip->irq = pci->irq;
2357     card->sync_irq = chip->irq;
2358     card->private_free = snd_via82xx_free;
2359     if (ac97_clock >= 8000 && ac97_clock <= 48000)
2360         chip->ac97_clock = ac97_clock;
2361 
2362     err = snd_via82xx_chip_init(chip);
2363     if (err < 0)
2364         return err;
2365 
2366     /* The 8233 ac97 controller does not implement the master bit
2367      * in the pci command register. IMHO this is a violation of the PCI spec.
2368      * We call pci_set_master here because it does not hurt. */
2369     pci_set_master(pci);
2370     return 0;
2371 }
2372 
2373 struct via823x_info {
2374     int revision;
2375     char *name;
2376     int type;
2377 };
2378 static const struct via823x_info via823x_cards[] = {
2379     { VIA_REV_PRE_8233, "VIA 8233-Pre", TYPE_VIA8233 },
2380     { VIA_REV_8233C, "VIA 8233C", TYPE_VIA8233 },
2381     { VIA_REV_8233, "VIA 8233", TYPE_VIA8233 },
2382     { VIA_REV_8233A, "VIA 8233A", TYPE_VIA8233A },
2383     { VIA_REV_8235, "VIA 8235", TYPE_VIA8233 },
2384     { VIA_REV_8237, "VIA 8237", TYPE_VIA8233 },
2385     { VIA_REV_8251, "VIA 8251", TYPE_VIA8233 },
2386 };
2387 
2388 /*
2389  * auto detection of DXS channel supports.
2390  */
2391 
2392 static const struct snd_pci_quirk dxs_allowlist[] = {
2393     SND_PCI_QUIRK(0x1005, 0x4710, "Avance Logic Mobo", VIA_DXS_ENABLE),
2394     SND_PCI_QUIRK(0x1019, 0x0996, "ESC Mobo", VIA_DXS_48K),
2395     SND_PCI_QUIRK(0x1019, 0x0a81, "ECS K7VTA3 v8.0", VIA_DXS_NO_VRA),
2396     SND_PCI_QUIRK(0x1019, 0x0a85, "ECS L7VMM2", VIA_DXS_NO_VRA),
2397     SND_PCI_QUIRK_VENDOR(0x1019, "ESC K8", VIA_DXS_SRC),
2398     SND_PCI_QUIRK(0x1019, 0xaa01, "ESC K8T890-A", VIA_DXS_SRC),
2399     SND_PCI_QUIRK(0x1025, 0x0033, "Acer Inspire 1353LM", VIA_DXS_NO_VRA),
2400     SND_PCI_QUIRK(0x1025, 0x0046, "Acer Aspire 1524 WLMi", VIA_DXS_SRC),
2401     SND_PCI_QUIRK_VENDOR(0x1043, "ASUS A7/A8", VIA_DXS_NO_VRA),
2402     SND_PCI_QUIRK_VENDOR(0x1071, "Diverse Notebook", VIA_DXS_NO_VRA),
2403     SND_PCI_QUIRK(0x10cf, 0x118e, "FSC Laptop", VIA_DXS_ENABLE),
2404     SND_PCI_QUIRK_VENDOR(0x1106, "ASRock", VIA_DXS_SRC),
2405     SND_PCI_QUIRK(0x1297, 0xa231, "Shuttle AK31v2", VIA_DXS_SRC),
2406     SND_PCI_QUIRK(0x1297, 0xa232, "Shuttle", VIA_DXS_SRC),
2407     SND_PCI_QUIRK(0x1297, 0xc160, "Shuttle Sk41G", VIA_DXS_SRC),
2408     SND_PCI_QUIRK(0x1458, 0xa002, "Gigabyte GA-7VAXP", VIA_DXS_ENABLE),
2409     SND_PCI_QUIRK(0x1462, 0x3800, "MSI KT266", VIA_DXS_ENABLE),
2410     SND_PCI_QUIRK(0x1462, 0x7120, "MSI KT4V", VIA_DXS_ENABLE),
2411     SND_PCI_QUIRK(0x1462, 0x7142, "MSI K8MM-V", VIA_DXS_ENABLE),
2412     SND_PCI_QUIRK_VENDOR(0x1462, "MSI Mobo", VIA_DXS_SRC),
2413     SND_PCI_QUIRK(0x147b, 0x1401, "ABIT KD7(-RAID)", VIA_DXS_ENABLE),
2414     SND_PCI_QUIRK(0x147b, 0x1411, "ABIT VA-20", VIA_DXS_ENABLE),
2415     SND_PCI_QUIRK(0x147b, 0x1413, "ABIT KV8 Pro", VIA_DXS_ENABLE),
2416     SND_PCI_QUIRK(0x147b, 0x1415, "ABIT AV8", VIA_DXS_NO_VRA),
2417     SND_PCI_QUIRK(0x14ff, 0x0403, "Twinhead mobo", VIA_DXS_ENABLE),
2418     SND_PCI_QUIRK(0x14ff, 0x0408, "Twinhead laptop", VIA_DXS_SRC),
2419     SND_PCI_QUIRK(0x1558, 0x4701, "Clevo D470", VIA_DXS_SRC),
2420     SND_PCI_QUIRK(0x1584, 0x8120, "Diverse Laptop", VIA_DXS_ENABLE),
2421     SND_PCI_QUIRK(0x1584, 0x8123, "Targa/Uniwill", VIA_DXS_NO_VRA),
2422     SND_PCI_QUIRK(0x161f, 0x202b, "Amira Notebook", VIA_DXS_NO_VRA),
2423     SND_PCI_QUIRK(0x161f, 0x2032, "m680x machines", VIA_DXS_48K),
2424     SND_PCI_QUIRK(0x1631, 0xe004, "PB EasyNote 3174", VIA_DXS_ENABLE),
2425     SND_PCI_QUIRK(0x1695, 0x3005, "EPoX EP-8K9A", VIA_DXS_ENABLE),
2426     SND_PCI_QUIRK_VENDOR(0x1695, "EPoX mobo", VIA_DXS_SRC),
2427     SND_PCI_QUIRK_VENDOR(0x16f3, "Jetway K8", VIA_DXS_SRC),
2428     SND_PCI_QUIRK_VENDOR(0x1734, "FSC Laptop", VIA_DXS_SRC),
2429     SND_PCI_QUIRK(0x1849, 0x3059, "ASRock K7VM2", VIA_DXS_NO_VRA),
2430     SND_PCI_QUIRK_VENDOR(0x1849, "ASRock mobo", VIA_DXS_SRC),
2431     SND_PCI_QUIRK(0x1919, 0x200a, "Soltek SL-K8",  VIA_DXS_NO_VRA),
2432     SND_PCI_QUIRK(0x4005, 0x4710, "MSI K7T266", VIA_DXS_SRC),
2433     { } /* terminator */
2434 };
2435 
2436 static int check_dxs_list(struct pci_dev *pci, int revision)
2437 {
2438     const struct snd_pci_quirk *w;
2439 
2440     w = snd_pci_quirk_lookup(pci, dxs_allowlist);
2441     if (w) {
2442         dev_dbg(&pci->dev, "DXS allow list for %s found\n",
2443                 snd_pci_quirk_name(w));
2444         return w->value;
2445     }
2446 
2447     /* for newer revision, default to DXS_SRC */
2448     if (revision >= VIA_REV_8235)
2449         return VIA_DXS_SRC;
2450 
2451     /*
2452      * not detected, try 48k rate only to be sure.
2453      */
2454     dev_info(&pci->dev, "Assuming DXS channels with 48k fixed sample rate.\n");
2455     dev_info(&pci->dev, "         Please try dxs_support=5 option\n");
2456     dev_info(&pci->dev, "         and report if it works on your machine.\n");
2457     dev_info(&pci->dev, "         For more details, read ALSA-Configuration.txt.\n");
2458     return VIA_DXS_48K;
2459 };
2460 
2461 static int __snd_via82xx_probe(struct pci_dev *pci,
2462                    const struct pci_device_id *pci_id)
2463 {
2464     struct snd_card *card;
2465     struct via82xx *chip;
2466     int chip_type = 0, card_type;
2467     unsigned int i;
2468     int err;
2469 
2470     err = snd_devm_card_new(&pci->dev, index, id, THIS_MODULE,
2471                 sizeof(*chip), &card);
2472     if (err < 0)
2473         return err;
2474     chip = card->private_data;
2475 
2476     card_type = pci_id->driver_data;
2477     switch (card_type) {
2478     case TYPE_CARD_VIA686:
2479         strcpy(card->driver, "VIA686A");
2480         sprintf(card->shortname, "VIA 82C686A/B rev%x", pci->revision);
2481         chip_type = TYPE_VIA686;
2482         break;
2483     case TYPE_CARD_VIA8233:
2484         chip_type = TYPE_VIA8233;
2485         sprintf(card->shortname, "VIA 823x rev%x", pci->revision);
2486         for (i = 0; i < ARRAY_SIZE(via823x_cards); i++) {
2487             if (pci->revision == via823x_cards[i].revision) {
2488                 chip_type = via823x_cards[i].type;
2489                 strcpy(card->shortname, via823x_cards[i].name);
2490                 break;
2491             }
2492         }
2493         if (chip_type != TYPE_VIA8233A) {
2494             if (dxs_support == VIA_DXS_AUTO)
2495                 dxs_support = check_dxs_list(pci, pci->revision);
2496             /* force to use VIA8233 or 8233A model according to
2497              * dxs_support module option
2498              */
2499             if (dxs_support == VIA_DXS_DISABLE)
2500                 chip_type = TYPE_VIA8233A;
2501             else
2502                 chip_type = TYPE_VIA8233;
2503         }
2504         if (chip_type == TYPE_VIA8233A)
2505             strcpy(card->driver, "VIA8233A");
2506         else if (pci->revision >= VIA_REV_8237)
2507             strcpy(card->driver, "VIA8237"); /* no slog assignment */
2508         else
2509             strcpy(card->driver, "VIA8233");
2510         break;
2511     default:
2512         dev_err(card->dev, "invalid card type %d\n", card_type);
2513         return -EINVAL;
2514     }
2515         
2516     err = snd_via82xx_create(card, pci, chip_type, pci->revision,
2517                  ac97_clock);
2518     if (err < 0)
2519         return err;
2520     err = snd_via82xx_mixer_new(chip, ac97_quirk);
2521     if (err < 0)
2522         return err;
2523 
2524     if (chip_type == TYPE_VIA686) {
2525         err = snd_via686_pcm_new(chip);
2526         if (err < 0)
2527             return err;
2528         err = snd_via686_init_misc(chip);
2529         if (err < 0)
2530             return err;
2531     } else {
2532         if (chip_type == TYPE_VIA8233A) {
2533             err = snd_via8233a_pcm_new(chip);
2534             if (err < 0)
2535                 return err;
2536             // chip->dxs_fixed = 1; /* FIXME: use 48k for DXS #3? */
2537         } else {
2538             err = snd_via8233_pcm_new(chip);
2539             if (err < 0)
2540                 return err;
2541             if (dxs_support == VIA_DXS_48K)
2542                 chip->dxs_fixed = 1;
2543             else if (dxs_support == VIA_DXS_NO_VRA)
2544                 chip->no_vra = 1;
2545             else if (dxs_support == VIA_DXS_SRC) {
2546                 chip->no_vra = 1;
2547                 chip->dxs_src = 1;
2548             }
2549         }
2550         err = snd_via8233_init_misc(chip);
2551         if (err < 0)
2552             return err;
2553     }
2554 
2555     /* disable interrupts */
2556     for (i = 0; i < chip->num_devs; i++)
2557         snd_via82xx_channel_reset(chip, &chip->devs[i]);
2558 
2559     snprintf(card->longname, sizeof(card->longname),
2560          "%s with %s at %#lx, irq %d", card->shortname,
2561          snd_ac97_get_short_name(chip->ac97), chip->port, chip->irq);
2562 
2563     snd_via82xx_proc_init(chip);
2564 
2565     err = snd_card_register(card);
2566     if (err < 0)
2567         return err;
2568     pci_set_drvdata(pci, card);
2569     return 0;
2570 }
2571 
2572 static int snd_via82xx_probe(struct pci_dev *pci,
2573                  const struct pci_device_id *pci_id)
2574 {
2575     return snd_card_free_on_error(&pci->dev, __snd_via82xx_probe(pci, pci_id));
2576 }
2577 
2578 static struct pci_driver via82xx_driver = {
2579     .name = KBUILD_MODNAME,
2580     .id_table = snd_via82xx_ids,
2581     .probe = snd_via82xx_probe,
2582     .driver = {
2583         .pm = SND_VIA82XX_PM_OPS,
2584     },
2585 };
2586 
2587 module_pci_driver(via82xx_driver);