0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
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;
0065 static char *id = SNDRV_DEFAULT_STR1;
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
0098 static bool enable;
0099 module_param(enable, bool, 0444);
0100
0101
0102
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
0111 #define VIA_REV_PRE_8233 0x10
0112 #define VIA_REV_8233C 0x20
0113 #define VIA_REV_8233 0x30
0114 #define VIA_REV_8233A 0x40
0115 #define VIA_REV_8235 0x50
0116 #define VIA_REV_8237 0x60
0117 #define VIA_REV_8251 0x70
0118
0119
0120
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
0127 #define VIA_REG_OFFSET_STATUS 0x00
0128 #define VIA_REG_STAT_ACTIVE 0x80
0129 #define VIA8233_SHADOW_STAT_ACTIVE 0x08
0130 #define VIA_REG_STAT_PAUSED 0x40
0131 #define VIA_REG_STAT_TRIGGER_QUEUED 0x08
0132 #define VIA_REG_STAT_STOPPED 0x04
0133 #define VIA_REG_STAT_EOL 0x02
0134 #define VIA_REG_STAT_FLAG 0x01
0135 #define VIA_REG_OFFSET_CONTROL 0x01
0136 #define VIA_REG_CTRL_START 0x80
0137 #define VIA_REG_CTRL_TERMINATE 0x40
0138 #define VIA_REG_CTRL_AUTOSTART 0x20
0139 #define VIA_REG_CTRL_PAUSE 0x08
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
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
0146 #define VIA_REG_TYPE_AUTOSTART 0x80
0147 #define VIA_REG_TYPE_16BIT 0x20
0148 #define VIA_REG_TYPE_STEREO 0x10
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
0156 #define VIA_REG_OFFSET_CURR_PTR 0x04
0157 #define VIA_REG_OFFSET_STOP_IDX 0x08
0158 #define VIA8233_REG_TYPE_16BIT 0x00200000
0159 #define VIA8233_REG_TYPE_STEREO 0x00100000
0160 #define VIA_REG_OFFSET_CURR_COUNT 0x0c
0161 #define VIA_REG_OFFSET_CURR_INDEX 0x0f
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
0175 DEFINE_VIA_REGSET(PLAYBACK, 0x00);
0176 DEFINE_VIA_REGSET(CAPTURE, 0x10);
0177 DEFINE_VIA_REGSET(FM, 0x20);
0178
0179
0180 #define VIA_REG_AC97 0x80
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
0195
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
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
0223 DEFINE_VIA_REGSET(MULTPLAY, 0x40);
0224 DEFINE_VIA_REGSET(CAPTURE_8233, 0x60);
0225
0226
0227 #define VIA_REG_OFS_PLAYBACK_VOLUME_L 0x02
0228 #define VIA_REG_OFS_PLAYBACK_VOLUME_R 0x03
0229 #define VIA_REG_OFS_MULTPLAY_FORMAT 0x02
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
0233 #define VIA_REG_OFS_CAPTURE_FIFO 0x02
0234 #define VIA_REG_CAPTURE_FIFO_ENABLE 0x40
0235
0236 #define VIA_DXS_MAX_VOLUME 31
0237
0238 #define VIA_REG_CAPTURE_CHANNEL 0x63
0239 #define VIA_REG_CAPTURE_CHANNEL_MIC 0x4
0240 #define VIA_REG_CAPTURE_CHANNEL_LINE 0
0241 #define VIA_REG_CAPTURE_SELECT_CODEC 0x03
0242
0243 #define VIA_TBL_BIT_FLAG 0x40000000
0244 #define VIA_TBL_BIT_EOL 0x80000000
0245
0246
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
0251 #define VIA_ACLINK_LOWPOWER 0x02
0252 #define VIA_ACLINK_C00_READY 0x01
0253 #define VIA_ACLINK_CTRL 0x41
0254 #define VIA_ACLINK_CTRL_ENABLE 0x80
0255 #define VIA_ACLINK_CTRL_RESET 0x40
0256 #define VIA_ACLINK_CTRL_SYNC 0x20
0257 #define VIA_ACLINK_CTRL_SDO 0x10
0258 #define VIA_ACLINK_CTRL_VRA 0x08
0259 #define VIA_ACLINK_CTRL_PCM 0x04
0260 #define VIA_ACLINK_CTRL_FM 0x02
0261 #define VIA_ACLINK_CTRL_SB 0x01
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
0268 #define VIA_FUNC_MIDI_IRQMASK 0x40
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
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;
0313 struct snd_pcm_substream *substream;
0314 int running;
0315 unsigned int tbl_entries;
0316 struct snd_dma_buffer table;
0317 struct snd_via_sg_table *idx_table;
0318
0319 unsigned int lastpos;
0320 unsigned int fragsize;
0321 unsigned int bufsize;
0322 unsigned int bufsize2;
0323 int hwptr_done;
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
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];
0359 unsigned char playback_volume_c[2];
0360
0361 unsigned int intr_mask;
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];
0370 unsigned int dxs_fixed: 1;
0371 unsigned int no_vra: 1;
0372 unsigned int dxs_src: 1;
0373 unsigned int spdif_on: 1;
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;
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
0394 { PCI_VDEVICE(VIA, PCI_DEVICE_ID_VIA_82C686_5), TYPE_CARD_VIA686, },
0395
0396 { PCI_VDEVICE(VIA, PCI_DEVICE_ID_VIA_8233_5), TYPE_CARD_VIA8233, },
0397 { 0, }
0398 };
0399
0400 MODULE_DEVICE_TABLE(pci, snd_via82xx_ids);
0401
0402
0403
0404
0405
0406
0407
0408
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
0420
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
0436 idx = 0;
0437 ofs = 0;
0438 pgtbl = (__le32 *)dev->table.area;
0439 for (i = 0; i < periods; i++) {
0440 rest = fragsize;
0441
0442
0443
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;
0461 else
0462 flag = VIA_TBL_BIT_FLAG;
0463 } else
0464 flag = 0;
0465
0466
0467
0468
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
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;
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;
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
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
0604 outb(0x00, VIADEV_REG(viadev, OFFSET_CONTROL));
0605
0606 outb(0x03, VIADEV_REG(viadev, OFFSET_STATUS));
0607 outb(0x00, VIADEV_REG(viadev, OFFSET_TYPE));
0608
0609 viadev->lastpos = 0;
0610 viadev->hwptr_done = 0;
0611 }
0612
0613
0614
0615
0616
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
0628 return snd_mpu401_uart_interrupt(irq, chip->rmidi->private_data);
0629 return IRQ_NONE;
0630 }
0631
0632
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
0642
0643
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));
0656 }
0657 spin_unlock(&chip->reg_lock);
0658 return IRQ_HANDLED;
0659 }
0660
0661
0662
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
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
0691
0692
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));
0709 irqreturn = 1;
0710 }
0711 spin_unlock(&chip->reg_lock);
0712 return IRQ_RETVAL(irqreturn);
0713 }
0714
0715
0716
0717
0718
0719
0720
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
0762
0763
0764
0765
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
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
0794
0795
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
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
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
0841
0842
0843 ptr = inl(VIADEV_REG(viadev, OFFSET_CURR_PTR));
0844 if (ptr <= (unsigned int)viadev->table.addr)
0845 idx = 0;
0846 else
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;
0850 spin_unlock(&chip->reg_lock);
0851
0852 return bytes_to_frames(substream->runtime, res);
0853 }
0854
0855
0856
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
0875
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
0917
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
0932
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
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
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
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
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)
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
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) |
1049 (runtime->channels > 1 ? VIA8233_REG_TYPE_STEREO : 0) |
1050 rbits |
1051 0xff000000,
1052 VIADEV_REG(viadev, OFFSET_STOP_IDX));
1053 udelay(20);
1054 snd_via82xx_codec_ready(chip, 0);
1055 return 0;
1056 }
1057
1058
1059
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
1089
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
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
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,
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
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
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
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
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
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
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
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
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
1201
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
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
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
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
1272
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
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
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
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
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
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
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
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
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
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;
1429 chip->multi_devno = 4;
1430 chip->capture_devno = 5;
1431 chip->num_devs = 7;
1432 chip->intr_mask = 0x33033333;
1433
1434
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
1444 for (i = 0; i < 4; i++)
1445 init_viadev(chip, i, 0x10 * i, i, 0);
1446
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
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
1469 init_viadev(chip, chip->multi_devno, VIA_REG_MULTPLAY_STATUS, 4, 0);
1470
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
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;
1501
1502
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
1512 init_viadev(chip, chip->multi_devno, VIA_REG_MULTPLAY_STATUS, 4, 0);
1513
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
1528 if (! ac97_can_spdif(chip->ac97))
1529 return 0;
1530
1531
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
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
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;
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
1581
1582
1583 static int snd_via8233_capture_source_info(struct snd_kcontrol *kcontrol,
1584 struct snd_ctl_elem_info *uinfo)
1585 {
1586
1587
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
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
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,
1796 .name = "Soltek SL-75DRV5",
1797 .type = AC97_TUNE_NONE
1798 },
1799 {
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
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,
1864 },
1865 {
1866 .subvendor = 0x1297,
1867 .subdevice = 0xa232,
1868 .name = "Shuttle AK32VN",
1869 .type = AC97_TUNE_HP_ONLY
1870 },
1871 { }
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
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
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
1985
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
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
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;
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;
2032 legacy &= ~VIA_FUNC_ENABLE_GAME;
2033 if (chip->revision >= VIA_REV_686_H) {
2034 rev_h = 1;
2035 if (mpu_port >= 0x200) {
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) {
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:
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;
2065 legacy |= VIA_FUNC_ENABLE_MIDI;
2066 } else {
2067 if (rev_h)
2068 legacy &= ~VIA_FUNC_MIDI_PNP;
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;
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
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
2133 if (chip->chip_type == TYPE_VIA686)
2134
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)) {
2139
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
2146 pci_write_config_byte(chip->pci, VIA_ACLINK_CTRL, 0x00);
2147 udelay(100);
2148 #else
2149
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
2155
2156 pci_write_config_byte(chip->pci, VIA_ACLINK_CTRL, VIA_ACLINK_CTRL_INIT);
2157 udelay(100);
2158 }
2159
2160
2161
2162 pci_read_config_byte(chip->pci, VIA_ACLINK_CTRL, &pval);
2163 if ((pval & VIA_ACLINK_CTRL_INIT) != VIA_ACLINK_CTRL_INIT) {
2164
2165
2166 pci_write_config_byte(chip->pci, VIA_ACLINK_CTRL, VIA_ACLINK_CTRL_INIT);
2167 udelay(100);
2168 }
2169
2170
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)
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
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
2201
2202 __ac97_ok2:
2203 #endif
2204
2205 if (chip->chip_type == TYPE_VIA686) {
2206
2207 pci_write_config_byte(chip->pci, VIA_FM_NMI_CTRL, 0);
2208
2209 outl(0, VIAREG(chip, GPI_INTR));
2210 }
2211
2212 if (chip->chip_type != TYPE_VIA686) {
2213
2214
2215
2216 struct pci_dev *pci;
2217 pci = pci_get_device(0x1106, 0x3068, NULL);
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
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
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
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
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
2367
2368
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
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 { }
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
2448 if (revision >= VIA_REV_8235)
2449 return VIA_DXS_SRC;
2450
2451
2452
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
2497
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");
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
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
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);