Lines Matching refs:viadev

125 #define VIADEV_REG(viadev, x) ((viadev)->port + VIA_REG_##x)
310 struct viadev {
369 struct viadev devs[VIA_MAX_DEVS];
411 static int build_via_table(struct viadev *dev, struct snd_pcm_substream *substream,
486 static int clean_via_table(struct viadev *dev, struct snd_pcm_substream *substream,
597 static void snd_via82xx_channel_reset(struct via82xx *chip, struct viadev *viadev)
600 VIADEV_REG(viadev, OFFSET_CONTROL));
601 inb(VIADEV_REG(viadev, OFFSET_CONTROL));
604 outb(0x00, VIADEV_REG(viadev, OFFSET_CONTROL));
606 outb(0x03, VIADEV_REG(viadev, OFFSET_STATUS));
607 outb(0x00, VIADEV_REG(viadev, OFFSET_TYPE)); /* for via686 */
608 // outl(0, VIADEV_REG(viadev, OFFSET_CURR_PTR));
609 viadev->lastpos = 0;
610 viadev->hwptr_done = 0;
635 struct viadev *viadev = &chip->devs[i];
636 unsigned char c_status = inb(VIADEV_REG(viadev, OFFSET_STATUS));
639 if (viadev->substream && viadev->running) {
646 viadev->hwptr_done = 0;
648 viadev->hwptr_done += viadev->fragsize;
649 viadev->in_interrupt = c_status;
651 snd_pcm_period_elapsed(viadev->substream);
653 viadev->in_interrupt = 0;
655 outb(c_status, VIADEV_REG(viadev, OFFSET_STATUS)); /* ack */
676 struct viadev *viadev = &chip->devs[i];
680 shadow_status = (status >> viadev->shadow_shift) &
687 substream = viadev->substream;
688 if (substream && viadev->running) {
695 viadev->hwptr_done = 0;
697 viadev->hwptr_done += viadev->fragsize;
698 viadev->in_interrupt = c_status;
700 viadev->in_interrupt |= VIA_REG_STAT_ACTIVE;
706 viadev->in_interrupt = 0;
708 outb(c_status, VIADEV_REG(viadev, OFFSET_STATUS)); /* ack */
725 struct viadev *viadev = substream->runtime->private_data;
736 viadev->running = 1;
741 viadev->running = 0;
745 viadev->running = 0;
748 viadev->running = 1;
753 outb(val, VIADEV_REG(viadev, OFFSET_CONTROL));
755 snd_via82xx_channel_reset(chip, viadev);
768 #define check_invalid_pos(viadev,pos) \
769 ((pos) < viadev->lastpos && ((pos) >= viadev->bufsize2 ||\
770 viadev->lastpos < viadev->bufsize2))
773 struct viadev *viadev,
779 size = viadev->idx_table[idx].size;
780 base = viadev->idx_table[idx].offset;
782 if (res >= viadev->bufsize)
783 res -= viadev->bufsize;
790 res = viadev->lastpos;
797 int delta = res - viadev->lastpos;
799 delta += viadev->bufsize;
800 if ((unsigned int)delta > viadev->fragsize)
803 if (check_invalid_pos(viadev, res)) {
807 idx, viadev->tbl_entries,
808 viadev->lastpos, viadev->bufsize2,
809 viadev->idx_table[idx].offset,
810 viadev->idx_table[idx].size, count);
814 if (check_invalid_pos(viadev, res)) {
817 res = viadev->lastpos;
830 struct viadev *viadev = substream->runtime->private_data;
833 if (snd_BUG_ON(!viadev->tbl_entries))
835 if (!(inb(VIADEV_REG(viadev, OFFSET_STATUS)) & VIA_REG_STAT_ACTIVE))
839 count = inl(VIADEV_REG(viadev, OFFSET_CURR_COUNT)) & 0xffffff;
843 ptr = inl(VIADEV_REG(viadev, OFFSET_CURR_PTR));
844 if (ptr <= (unsigned int)viadev->table.addr)
847 idx = ((ptr - (unsigned int)viadev->table.addr) / 8 - 1) % viadev->tbl_entries;
848 res = calc_linear_pos(chip, viadev, idx, count);
849 viadev->lastpos = res; /* remember the last position */
861 struct viadev *viadev = substream->runtime->private_data;
865 if (snd_BUG_ON(!viadev->tbl_entries))
869 count = inl(VIADEV_REG(viadev, OFFSET_CURR_COUNT));
870 status = viadev->in_interrupt;
872 status = inb(VIADEV_REG(viadev, OFFSET_STATUS));
885 if (idx >= viadev->tbl_entries) {
889 viadev->tbl_entries);
891 res = viadev->lastpos;
894 res = calc_linear_pos(chip, viadev, idx, count);
897 res = viadev->hwptr_done;
898 if (!viadev->in_interrupt) {
903 res += viadev->fragsize;
908 viadev->lastpos = res;
923 struct viadev *viadev = substream->runtime->private_data;
925 return build_via_table(viadev, substream, chip->pci,
937 struct viadev *viadev = substream->runtime->private_data;
939 clean_via_table(viadev, substream, chip->pci);
947 static void snd_via82xx_set_table_ptr(struct via82xx *chip, struct viadev *viadev)
950 outl((u32)viadev->table.addr, VIADEV_REG(viadev, OFFSET_TABLE_PTR));
958 static void via686_setup_format(struct via82xx *chip, struct viadev *viadev,
961 snd_via82xx_channel_reset(chip, viadev);
963 snd_via82xx_set_table_ptr(chip, viadev);
967 ((viadev->reg_offset & 0x10) == 0 ? VIA_REG_TYPE_INT_LSAMPLE : 0) |
969 VIA_REG_TYPE_INT_FLAG, VIADEV_REG(viadev, OFFSET_TYPE));
975 struct viadev *viadev = substream->runtime->private_data;
980 via686_setup_format(chip, viadev, runtime);
987 struct viadev *viadev = substream->runtime->private_data;
991 via686_setup_format(chip, viadev, runtime);
1021 struct viadev *viadev = substream->runtime->private_data;
1032 if (chip->spdif_on && viadev->reg_offset == 0x30)
1041 snd_via82xx_channel_reset(chip, viadev);
1042 snd_via82xx_set_table_ptr(chip, viadev);
1043 outb(chip->playback_volume[viadev->reg_offset / 0x10][0],
1044 VIADEV_REG(viadev, OFS_PLAYBACK_VOLUME_L));
1045 outb(chip->playback_volume[viadev->reg_offset / 0x10][1],
1046 VIADEV_REG(viadev, OFS_PLAYBACK_VOLUME_R));
1051 VIADEV_REG(viadev, OFFSET_STOP_IDX));
1063 struct viadev *viadev = substream->runtime->private_data;
1074 snd_via82xx_channel_reset(chip, viadev);
1075 snd_via82xx_set_table_ptr(chip, viadev);
1080 outb(fmt, VIADEV_REG(viadev, OFS_MULTPLAY_FORMAT));
1100 outl(0xff000000 | slots, VIADEV_REG(viadev, OFFSET_STOP_IDX));
1112 struct viadev *viadev = substream->runtime->private_data;
1118 snd_via82xx_channel_reset(chip, viadev);
1119 snd_via82xx_set_table_ptr(chip, viadev);
1120 outb(VIA_REG_CAPTURE_FIFO_ENABLE, VIADEV_REG(viadev, OFS_CAPTURE_FIFO));
1124 VIADEV_REG(viadev, OFFSET_STOP_IDX));
1159 static int snd_via82xx_pcm_open(struct via82xx *chip, struct viadev *viadev,
1170 ratep = &chip->rates[viadev->direction];
1173 if (chip->spdif_on && viadev->reg_offset == 0x30) {
1177 } else if (chip->dxs_fixed && viadev->reg_offset < 0x40) {
1181 } else if (chip->dxs_src && viadev->reg_offset < 0x40) {
1189 int idx = viadev->direction ? AC97_RATES_ADC : AC97_RATES_FRONT_DAC;
1210 runtime->private_data = viadev;
1211 viadev->substream = substream;
1223 struct viadev *viadev = &chip->devs[chip->playback_devno + substream->number];
1226 if ((err = snd_via82xx_pcm_open(chip, viadev, substream)) < 0)
1237 struct viadev *viadev;
1241 viadev = &chip->devs[chip->playback_devno + substream->number];
1242 if ((err = snd_via82xx_pcm_open(chip, viadev, substream)) < 0)
1244 stream = viadev->reg_offset / 0x10;
1265 struct viadev *viadev = &chip->devs[chip->multi_devno];
1279 if ((err = snd_via82xx_pcm_open(chip, viadev, substream)) < 0)
1295 struct viadev *viadev = &chip->devs[chip->capture_devno + substream->pcm->device];
1297 return snd_via82xx_pcm_open(chip, viadev, substream);
1306 struct viadev *viadev = substream->runtime->private_data;
1310 ratep = &chip->rates[viadev->direction];
1317 if (! viadev->direction) {
1328 viadev->substream = NULL;
1335 struct viadev *viadev = substream->runtime->private_data;
1338 stream = viadev->reg_offset / 0x10;