Update of /cvsroot/alsa/alsa-kernel/pci
In directory sc8-pr-cvs1:/tmp/cvs-serv21850
Modified Files:
via82xx.c
Log Message:
- fixed the wrong reg offset for capture fifo.
- don't check SGD reg for via823x (temporarily).
- don't create SDX pcm volume for via8233a.
- don't set unnecessary bits for via8233a.
- check STOPPED bit in the interrupt handler, too.
Index: via82xx.c
===================================================================
RCS file: /cvsroot/alsa/alsa-kernel/pci/via82xx.c,v
retrieving revision 1.36
retrieving revision 1.37
diff -u -r1.36 -r1.37
--- via82xx.c 1 Apr 2003 13:50:29 -0000 1.36
+++ via82xx.c 3 Apr 2003 16:24:58 -0000 1.37
@@ -208,13 +208,11 @@
#define VIA8233_REG_SGD_STAT_EOL (1<<1)
#define VIA8233_REG_SGD_STAT_STOP (1<<2)
#define VIA8233_REG_SGD_STAT_ACTIVE (1<<3)
-#define VIA8233_REG_SGD_SDX0_SHIFT 0
-#define VIA8233_REG_SGD_SDX1_SHIFT 4
-#define VIA8233_REG_SGD_SDX2_SHIFT 8
-#define VIA8233_REG_SGD_SDX3_SHIFT 12
-#define VIA8233_REG_SGD_MCHAN_SHIFT 16
-#define VIA8233_REG_SGD_REC0_SHIFT 24
-#define VIA8233_REG_SGD_REC1_SHIFT 28
+#define VIA8233_INTR_MASK(chan) ((VIA8233_REG_SGD_STAT_FLAG|VIA8233_REG_SGD_STAT_EOL)
<< ((chan) * 4))
+#define VIA8233_REG_SGD_CHAN_SDX 0
+#define VIA8233_REG_SGD_CHAN_MULTI 4
+#define VIA8233_REG_SGD_CHAN_REC 6
+#define VIA8233_REG_SGD_CHAN_REC1 7
#define VIA_REG_GPI_STATUS 0x88
#define VIA_REG_GPI_INTR 0x8c
@@ -230,7 +228,7 @@
#define VIA_REG_MULTPLAY_FMT_8BIT 0x00
#define VIA_REG_MULTPLAY_FMT_16BIT 0x80
#define VIA_REG_MULTPLAY_FMT_CH_MASK 0x70 /* # channels << 4 (valid = 1,2,4,6) */
-#define VIA_REG_OFS_CAPTURE_FIFO 0x62 /* byte - bit 6 = fifo enable */
+#define VIA_REG_OFS_CAPTURE_FIFO 0x02 /* byte - bit 6 = fifo enable */
#define VIA_REG_CAPTURE_FIFO_ENABLE 0x40
#define VIA_REG_CAPTURE_CHANNEL 0x63 /* byte - input select */
@@ -582,6 +580,10 @@
unsigned int i;
spin_lock(&chip->reg_lock);
+ /* FIXME: does it work on via823x? */
+ if (chip->chip_type != TYPE_VIA686)
+ goto _skip_sgd;
+
status = inl(VIAREG(chip, SGD_SHADOW));
if (! (status & chip->intr_mask)) {
spin_unlock(&chip->reg_lock);
@@ -590,20 +592,21 @@
snd_mpu401_uart_interrupt(irq, chip->rmidi->private_data,
regs);
return;
}
+ _skip_sgd:
/* check status for each stream */
for (i = 0; i < chip->num_devs; i++) {
viadev_t *viadev = &chip->devs[i];
- unsigned char status = inb(VIADEV_REG(viadev, OFFSET_STATUS));
- status &= (VIA_REG_STAT_EOL|VIA_REG_STAT_FLAG);
- if (! status)
+ unsigned char c_status = inb(VIADEV_REG(viadev, OFFSET_STATUS));
+ c_status &= (VIA_REG_STAT_EOL|VIA_REG_STAT_FLAG|VIA_REG_STAT_STOPPED);
+ if (! c_status)
continue;
if (viadev->substream && viadev->running) {
spin_unlock(&chip->reg_lock);
snd_pcm_period_elapsed(viadev->substream);
spin_lock(&chip->reg_lock);
}
- outb(status, VIADEV_REG(viadev, OFFSET_STATUS)); /* ack */
+ outb(c_status, VIADEV_REG(viadev, OFFSET_STATUS)); /* ack */
}
spin_unlock(&chip->reg_lock);
}
@@ -872,7 +875,10 @@
snd_ac97_set_rate(chip->ac97, AC97_PCM_FRONT_DAC_RATE, runtime->rate);
snd_ac97_set_rate(chip->ac97, AC97_SPDIF, runtime->rate);
}
- rbits = (0xfffff / 48000) * runtime->rate + ((0xfffff % 48000) *
runtime->rate) / 48000;
+ if (chip->chip_type == TYPE_VIA8233A)
+ rbits = 0;
+ else
+ rbits = (0xfffff / 48000) * runtime->rate + ((0xfffff % 48000) *
runtime->rate) / 48000;
snd_assert((rbits & ~0xfffff) == 0, return -EINVAL);
snd_via82xx_channel_reset(chip, viadev);
snd_via82xx_set_table_ptr(chip, viadev);
@@ -911,16 +917,20 @@
fmt = (runtime->format == SNDRV_PCM_FORMAT_S16_LE) ?
VIA_REG_MULTPLAY_FMT_16BIT : VIA_REG_MULTPLAY_FMT_8BIT;
fmt |= runtime->channels << 4;
outb(fmt, VIADEV_REG(viadev, OFS_MULTPLAY_FORMAT));
- /* set sample number to slot 3, 4, 7, 8, 6, 9 (for VIA8233/C,8235) */
- /* corresponding to FL, FR, RL, RR, C, LFE ?? */
- switch (runtime->channels) {
- case 1: slots = (1<<0) | (1<<4); break;
- case 2: slots = (1<<0) | (2<<4); break;
- case 3: slots = (1<<0) | (2<<4) | (5<<8); break;
- case 4: slots = (1<<0) | (2<<4) | (3<<8) | (4<<12); break;
- case 5: slots = (1<<0) | (2<<4) | (3<<8) | (4<<12) | (5<<16); break;
- case 6: slots = (1<<0) | (2<<4) | (3<<8) | (4<<12) | (5<<16) | (6<<20); break;
- default: slots = 0; break;
+ if (chip->chip_type == TYPE_VIA8233A)
+ slots = 0;
+ else {
+ /* set sample number to slot 3, 4, 7, 8, 6, 9 (for VIA8233/C,8235) */
+ /* corresponding to FL, FR, RL, RR, C, LFE ?? */
+ switch (runtime->channels) {
+ case 1: slots = (1<<0) | (1<<4); break;
+ case 2: slots = (1<<0) | (2<<4); break;
+ case 3: slots = (1<<0) | (2<<4) | (5<<8); break;
+ case 4: slots = (1<<0) | (2<<4) | (3<<8) | (4<<12); break;
+ case 5: slots = (1<<0) | (2<<4) | (3<<8) | (4<<12) | (5<<16); break;
+ case 6: slots = (1<<0) | (2<<4) | (3<<8) | (4<<12) | (5<<16) |
(6<<20); break;
+ default: slots = 0; break;
+ }
}
/* STOP index is never reached */
outl(0xff000000 | slots, VIADEV_REG(viadev, OFFSET_STOP_IDX));
@@ -1533,9 +1543,11 @@
err = snd_ctl_add(chip->card, snd_ctl_new1(&snd_via8233_dxs3_spdif_control,
chip));
if (err < 0)
return err;
- err = snd_ctl_add(chip->card, snd_ctl_new1(&snd_via8233_dxs_volume_control,
chip));
- if (err < 0)
- return err;
+ if (chip->chip_type != TYPE_VIA8233A) {
+ err = snd_ctl_add(chip->card,
snd_ctl_new1(&snd_via8233_dxs_volume_control, chip));
+ if (err < 0)
+ return err;
+ }
/* select spdif data slot 10/11 */
pci_read_config_byte(chip->pci, VIA8233_SPDIF_CTRL, &val);
-------------------------------------------------------
This SF.net email is sponsored by: ValueWeb:
Dedicated Hosting for just $79/mo with 500 GB of bandwidth!
No other company gives more support or power for your dedicated server
http://click.atdmt.com/AFF/go/sdnxxaff00300020aff/direct/01/
_______________________________________________
Alsa-cvslog mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/alsa-cvslog