Lines Matching refs:viadev

124 #define VIADEV_REG(viadev, x) ((viadev)->port + VIA_REG_##x)  argument
309 struct viadev { struct
368 struct viadev devs[VIA_MAX_DEVS];
410 static int build_via_table(struct viadev *dev, struct snd_pcm_substream *substream, in build_via_table()
485 static int clean_via_table(struct viadev *dev, struct snd_pcm_substream *substream, in clean_via_table()
597 static void snd_via82xx_channel_reset(struct via82xx *chip, struct viadev *viadev) in snd_via82xx_channel_reset() argument
600 VIADEV_REG(viadev, OFFSET_CONTROL)); in snd_via82xx_channel_reset()
601 inb(VIADEV_REG(viadev, OFFSET_CONTROL)); in snd_via82xx_channel_reset()
604 outb(0x00, VIADEV_REG(viadev, OFFSET_CONTROL)); in snd_via82xx_channel_reset()
606 outb(0x03, VIADEV_REG(viadev, OFFSET_STATUS)); in snd_via82xx_channel_reset()
607 outb(0x00, VIADEV_REG(viadev, OFFSET_TYPE)); /* for via686 */ in snd_via82xx_channel_reset()
609 viadev->lastpos = 0; in snd_via82xx_channel_reset()
610 viadev->hwptr_done = 0; in snd_via82xx_channel_reset()
635 struct viadev *viadev = &chip->devs[i]; in snd_via686_interrupt() local
636 unsigned char c_status = inb(VIADEV_REG(viadev, OFFSET_STATUS)); in snd_via686_interrupt()
639 if (viadev->substream && viadev->running) { in snd_via686_interrupt()
646 viadev->hwptr_done = 0; in snd_via686_interrupt()
648 viadev->hwptr_done += viadev->fragsize; in snd_via686_interrupt()
649 viadev->in_interrupt = c_status; in snd_via686_interrupt()
651 snd_pcm_period_elapsed(viadev->substream); in snd_via686_interrupt()
653 viadev->in_interrupt = 0; in snd_via686_interrupt()
655 outb(c_status, VIADEV_REG(viadev, OFFSET_STATUS)); /* ack */ in snd_via686_interrupt()
676 struct viadev *viadev = &chip->devs[i]; in snd_via8233_interrupt() local
680 shadow_status = (status >> viadev->shadow_shift) & in snd_via8233_interrupt()
687 substream = viadev->substream; in snd_via8233_interrupt()
688 if (substream && viadev->running) { in snd_via8233_interrupt()
695 viadev->hwptr_done = 0; in snd_via8233_interrupt()
697 viadev->hwptr_done += viadev->fragsize; in snd_via8233_interrupt()
698 viadev->in_interrupt = c_status; in snd_via8233_interrupt()
700 viadev->in_interrupt |= VIA_REG_STAT_ACTIVE; in snd_via8233_interrupt()
706 viadev->in_interrupt = 0; in snd_via8233_interrupt()
708 outb(c_status, VIADEV_REG(viadev, OFFSET_STATUS)); /* ack */ in snd_via8233_interrupt()
725 struct viadev *viadev = substream->runtime->private_data; in snd_via82xx_pcm_trigger() local
736 viadev->running = 1; in snd_via82xx_pcm_trigger()
741 viadev->running = 0; in snd_via82xx_pcm_trigger()
745 viadev->running = 0; in snd_via82xx_pcm_trigger()
748 viadev->running = 1; in snd_via82xx_pcm_trigger()
753 outb(val, VIADEV_REG(viadev, OFFSET_CONTROL)); in snd_via82xx_pcm_trigger()
755 snd_via82xx_channel_reset(chip, viadev); in snd_via82xx_pcm_trigger()
768 #define check_invalid_pos(viadev,pos) \ argument
769 ((pos) < viadev->lastpos && ((pos) >= viadev->bufsize2 ||\
770 viadev->lastpos < viadev->bufsize2))
773 struct viadev *viadev, in calc_linear_pos() argument
779 size = viadev->idx_table[idx].size; in calc_linear_pos()
780 base = viadev->idx_table[idx].offset; in calc_linear_pos()
782 if (res >= viadev->bufsize) in calc_linear_pos()
783 res -= viadev->bufsize; in calc_linear_pos()
790 res = viadev->lastpos; in calc_linear_pos()
797 int delta = res - viadev->lastpos; in calc_linear_pos()
799 delta += viadev->bufsize; in calc_linear_pos()
800 if ((unsigned int)delta > viadev->fragsize) in calc_linear_pos()
803 if (check_invalid_pos(viadev, res)) { in calc_linear_pos()
807 idx, viadev->tbl_entries, in calc_linear_pos()
808 viadev->lastpos, viadev->bufsize2, in calc_linear_pos()
809 viadev->idx_table[idx].offset, in calc_linear_pos()
810 viadev->idx_table[idx].size, count); in calc_linear_pos()
814 if (check_invalid_pos(viadev, res)) { in calc_linear_pos()
817 res = viadev->lastpos; in calc_linear_pos()
830 struct viadev *viadev = substream->runtime->private_data; in snd_via686_pcm_pointer() local
833 if (snd_BUG_ON(!viadev->tbl_entries)) in snd_via686_pcm_pointer()
835 if (!(inb(VIADEV_REG(viadev, OFFSET_STATUS)) & VIA_REG_STAT_ACTIVE)) in snd_via686_pcm_pointer()
839 count = inl(VIADEV_REG(viadev, OFFSET_CURR_COUNT)) & 0xffffff; in snd_via686_pcm_pointer()
843 ptr = inl(VIADEV_REG(viadev, OFFSET_CURR_PTR)); in snd_via686_pcm_pointer()
844 if (ptr <= (unsigned int)viadev->table.addr) in snd_via686_pcm_pointer()
847 idx = ((ptr - (unsigned int)viadev->table.addr) / 8 - 1) % viadev->tbl_entries; in snd_via686_pcm_pointer()
848 res = calc_linear_pos(chip, viadev, idx, count); in snd_via686_pcm_pointer()
849 viadev->lastpos = res; /* remember the last position */ in snd_via686_pcm_pointer()
861 struct viadev *viadev = substream->runtime->private_data; in snd_via8233_pcm_pointer() local
865 if (snd_BUG_ON(!viadev->tbl_entries)) in snd_via8233_pcm_pointer()
869 count = inl(VIADEV_REG(viadev, OFFSET_CURR_COUNT)); in snd_via8233_pcm_pointer()
870 status = viadev->in_interrupt; in snd_via8233_pcm_pointer()
872 status = inb(VIADEV_REG(viadev, OFFSET_STATUS)); in snd_via8233_pcm_pointer()
885 if (idx >= viadev->tbl_entries) { in snd_via8233_pcm_pointer()
889 viadev->tbl_entries); in snd_via8233_pcm_pointer()
891 res = viadev->lastpos; in snd_via8233_pcm_pointer()
894 res = calc_linear_pos(chip, viadev, idx, count); in snd_via8233_pcm_pointer()
897 res = viadev->hwptr_done; in snd_via8233_pcm_pointer()
898 if (!viadev->in_interrupt) { in snd_via8233_pcm_pointer()
903 res += viadev->fragsize; in snd_via8233_pcm_pointer()
908 viadev->lastpos = res; in snd_via8233_pcm_pointer()
923 struct viadev *viadev = substream->runtime->private_data; in snd_via82xx_hw_params() local
925 return build_via_table(viadev, substream, chip->pci, in snd_via82xx_hw_params()
937 struct viadev *viadev = substream->runtime->private_data; in snd_via82xx_hw_free() local
939 clean_via_table(viadev, substream, chip->pci); in snd_via82xx_hw_free()
947 static void snd_via82xx_set_table_ptr(struct via82xx *chip, struct viadev *viadev) in snd_via82xx_set_table_ptr() argument
950 outl((u32)viadev->table.addr, VIADEV_REG(viadev, OFFSET_TABLE_PTR)); in snd_via82xx_set_table_ptr()
958 static void via686_setup_format(struct via82xx *chip, struct viadev *viadev, in via686_setup_format() argument
961 snd_via82xx_channel_reset(chip, viadev); in via686_setup_format()
963 snd_via82xx_set_table_ptr(chip, viadev); in via686_setup_format()
967 ((viadev->reg_offset & 0x10) == 0 ? VIA_REG_TYPE_INT_LSAMPLE : 0) | in via686_setup_format()
969 VIA_REG_TYPE_INT_FLAG, VIADEV_REG(viadev, OFFSET_TYPE)); in via686_setup_format()
975 struct viadev *viadev = substream->runtime->private_data; in snd_via686_playback_prepare() local
980 via686_setup_format(chip, viadev, runtime); in snd_via686_playback_prepare()
987 struct viadev *viadev = substream->runtime->private_data; in snd_via686_capture_prepare() local
991 via686_setup_format(chip, viadev, runtime); in snd_via686_capture_prepare()
1021 struct viadev *viadev = substream->runtime->private_data; in snd_via8233_playback_prepare() local
1033 if (chip->spdif_on && viadev->reg_offset == 0x30) in snd_via8233_playback_prepare()
1042 snd_via82xx_channel_reset(chip, viadev); in snd_via8233_playback_prepare()
1043 snd_via82xx_set_table_ptr(chip, viadev); in snd_via8233_playback_prepare()
1044 outb(chip->playback_volume[viadev->reg_offset / 0x10][0], in snd_via8233_playback_prepare()
1045 VIADEV_REG(viadev, OFS_PLAYBACK_VOLUME_L)); in snd_via8233_playback_prepare()
1046 outb(chip->playback_volume[viadev->reg_offset / 0x10][1], in snd_via8233_playback_prepare()
1047 VIADEV_REG(viadev, OFS_PLAYBACK_VOLUME_R)); in snd_via8233_playback_prepare()
1052 VIADEV_REG(viadev, OFFSET_STOP_IDX)); in snd_via8233_playback_prepare()
1064 struct viadev *viadev = substream->runtime->private_data; in snd_via8233_multi_prepare() local
1075 snd_via82xx_channel_reset(chip, viadev); in snd_via8233_multi_prepare()
1076 snd_via82xx_set_table_ptr(chip, viadev); in snd_via8233_multi_prepare()
1081 outb(fmt, VIADEV_REG(viadev, OFS_MULTPLAY_FORMAT)); in snd_via8233_multi_prepare()
1101 outl(0xff000000 | slots, VIADEV_REG(viadev, OFFSET_STOP_IDX)); in snd_via8233_multi_prepare()
1113 struct viadev *viadev = substream->runtime->private_data; in snd_via8233_capture_prepare() local
1119 snd_via82xx_channel_reset(chip, viadev); in snd_via8233_capture_prepare()
1120 snd_via82xx_set_table_ptr(chip, viadev); in snd_via8233_capture_prepare()
1121 outb(VIA_REG_CAPTURE_FIFO_ENABLE, VIADEV_REG(viadev, OFS_CAPTURE_FIFO)); in snd_via8233_capture_prepare()
1125 VIADEV_REG(viadev, OFFSET_STOP_IDX)); in snd_via8233_capture_prepare()
1160 static int snd_via82xx_pcm_open(struct via82xx *chip, struct viadev *viadev, in snd_via82xx_pcm_open() argument
1171 ratep = &chip->rates[viadev->direction]; in snd_via82xx_pcm_open()
1174 if (chip->spdif_on && viadev->reg_offset == 0x30) { in snd_via82xx_pcm_open()
1178 } else if (chip->dxs_fixed && viadev->reg_offset < 0x40) { in snd_via82xx_pcm_open()
1182 } else if (chip->dxs_src && viadev->reg_offset < 0x40) { in snd_via82xx_pcm_open()
1190 int idx = viadev->direction ? AC97_RATES_ADC : AC97_RATES_FRONT_DAC; in snd_via82xx_pcm_open()
1212 runtime->private_data = viadev; in snd_via82xx_pcm_open()
1213 viadev->substream = substream; in snd_via82xx_pcm_open()
1225 struct viadev *viadev = &chip->devs[chip->playback_devno + substream->number]; in snd_via686_playback_open() local
1228 err = snd_via82xx_pcm_open(chip, viadev, substream); in snd_via686_playback_open()
1240 struct viadev *viadev; in snd_via8233_playback_open() local
1244 viadev = &chip->devs[chip->playback_devno + substream->number]; in snd_via8233_playback_open()
1245 err = snd_via82xx_pcm_open(chip, viadev, substream); in snd_via8233_playback_open()
1248 stream = viadev->reg_offset / 0x10; in snd_via8233_playback_open()
1269 struct viadev *viadev = &chip->devs[chip->multi_devno]; in snd_via8233_multi_open() local
1283 err = snd_via82xx_pcm_open(chip, viadev, substream); in snd_via8233_multi_open()
1300 struct viadev *viadev = &chip->devs[chip->capture_devno + substream->pcm->device]; in snd_via82xx_capture_open() local
1302 return snd_via82xx_pcm_open(chip, viadev, substream); in snd_via82xx_capture_open()
1311 struct viadev *viadev = substream->runtime->private_data; in snd_via82xx_pcm_close() local
1315 ratep = &chip->rates[viadev->direction]; in snd_via82xx_pcm_close()
1322 if (! viadev->direction) { in snd_via82xx_pcm_close()
1333 viadev->substream = NULL; in snd_via82xx_pcm_close()
1340 struct viadev *viadev = substream->runtime->private_data; in snd_via8233_playback_close() local
1343 stream = viadev->reg_offset / 0x10; in snd_via8233_playback_close()