Lines Matching refs:ch

384 via_buildsgdt(struct via_chinfo *ch)
389 phys_addr = sndbuf_getbufaddr(ch->buffer);
391 for (i = 0; i < ch->blkcnt; i++) {
392 flag = (i == ch->blkcnt - 1) ? VIA_DMAOP_EOL : VIA_DMAOP_FLAG;
393 ch->sgd_table[i].ptr = phys_addr + (i * ch->blksz);
394 ch->sgd_table[i].flags = flag | ch->blksz;
406 struct via_chinfo *ch = data;
407 struct via_info *via = ch->parent;
425 struct via_chinfo *ch = data;
426 struct via_info *via = ch->parent;
429 r = ch->rbase + VIA8233_RP_DXS_RATEFMT;
447 struct via_chinfo *ch = data;
448 struct via_info *via = ch->parent;
475 struct via_chinfo *ch = data;
476 struct via_info *via = ch->parent;
487 struct via_chinfo *ch = data;
488 struct via_info *via = ch->parent;
491 r = ch->rbase + VIA8233_RP_DXS_RATEFMT;
507 struct via_chinfo *ch = data;
508 struct via_info *via = ch->parent;
522 struct via_chinfo *ch = data;
523 struct via_info *via = ch->parent;
534 struct via_chinfo *ch = data;
535 struct via_info *via = ch->parent;
551 struct via_chinfo *ch = data;
552 struct via_info *via = ch->parent;
567 struct via_chinfo *ch = data;
568 struct via_info *via = ch->parent;
572 if (blksz > (sndbuf_getmaxsize(ch->buffer) / VIA_SEGS_MIN))
573 blksz = sndbuf_getmaxsize(ch->buffer) / VIA_SEGS_MIN;
581 while ((blksz * blkcnt) > sndbuf_getmaxsize(ch->buffer)) {
590 if ((sndbuf_getblksz(ch->buffer) != blksz ||
591 sndbuf_getblkcnt(ch->buffer) != blkcnt) &&
592 sndbuf_resize(ch->buffer, blkcnt, blksz) != 0)
596 ch->blksz = sndbuf_getblksz(ch->buffer);
597 ch->blkcnt = sndbuf_getblkcnt(ch->buffer);
605 struct via_chinfo *ch = data;
606 struct via_info *via = ch->parent;
610 return (ch->blksz);
616 struct via_chinfo *ch = data;
617 struct via_info *via = ch->parent;
622 ptr = ch->ptr;
625 v = via_rd(via, ch->rbase + VIA_RP_CURRENT_COUNT, 4);
629 ptr = (index + 1) * ch->blksz - count;
630 ptr %= ch->blkcnt * ch->blksz; /* Wrap to available space */
637 via8233chan_reset(struct via_info *via, struct via_chinfo *ch)
639 via_wr(via, ch->rbase + VIA_RP_CONTROL, SGD_CONTROL_STOP, 1);
640 via_wr(via, ch->rbase + VIA_RP_CONTROL, 0x00, 1);
641 via_wr(via, ch->rbase + VIA_RP_STATUS,
649 via8233chan_sgdinit(struct via_info *via, struct via_chinfo *ch, int chnum)
651 ch->sgd_table = &via->sgd_table[chnum * VIA_SEGS_MAX];
652 ch->sgd_addr = via->sgd_addr + chnum * VIA_SEGS_MAX *
661 struct via_chinfo *ch;
666 ch = &via->rch[num];
667 ch->parent = via;
668 ch->channel = c;
669 ch->buffer = b;
670 ch->dir = dir;
671 ch->blkcnt = via->blkcnt;
672 ch->rbase = VIA_WR_BASE(num);
673 via_wr(via, ch->rbase + VIA_WR_RP_SGD_FORMAT, WR_FIFO_ENABLE, 1);
676 if (sndbuf_alloc(ch->buffer, via->parent_dmat, 0, via->bufsz) != 0)
680 via8233chan_sgdinit(via, ch, num);
681 via8233chan_reset(via, ch);
684 return (ch);
692 struct via_chinfo *ch;
697 ch = &via->pch[num];
698 ch->parent = via;
699 ch->channel = c;
700 ch->buffer = b;
701 ch->dir = dir;
702 ch->blkcnt = via->blkcnt;
709 ch->rbase = VIA_DXS_BASE(NDXSCHANS - 1 - via->n_dxs_registered);
713 if (sndbuf_alloc(ch->buffer, via->parent_dmat, 0, via->bufsz) != 0)
717 via8233chan_sgdinit(via, ch, NWRCHANS + num);
718 via8233chan_reset(via, ch);
721 return (ch);
729 struct via_chinfo *ch;
734 ch = &via->pch[num];
735 ch->parent = via;
736 ch->channel = c;
737 ch->buffer = b;
738 ch->dir = dir;
739 ch->rbase = VIA_MC_SGD_STATUS;
740 ch->blkcnt = via->blkcnt;
743 if (sndbuf_alloc(ch->buffer, via->parent_dmat, 0, via->bufsz) != 0)
747 via8233chan_sgdinit(via, ch, NWRCHANS + num);
748 via8233chan_reset(via, ch);
751 return (ch);
755 via8233chan_mute(struct via_info *via, struct via_chinfo *ch, int muted)
757 if (BASE_IS_VIA_DXS_REG(ch->rbase)) {
760 via_wr(via, ch->rbase + VIA8233_RP_DXS_LVOL, muted, 1);
761 via_wr(via, ch->rbase + VIA8233_RP_DXS_RVOL, muted, 1);
762 r = via_rd(via, ch->rbase + VIA8233_RP_DXS_LVOL, 1) &
767 "(dxs base 0x%02x).\n", __func__, ch->rbase);
772 via_poll_channel(struct via_chinfo *ch)
779 if (ch == NULL || ch->channel == NULL || ch->active == 0)
782 via = ch->parent;
783 sz = ch->blksz * ch->blkcnt;
784 v = via_rd(via, ch->rbase + VIA_RP_CURRENT_COUNT, 4);
787 ptr = ((index + 1) * ch->blksz) - count;
789 ptr &= ~(ch->blksz - 1);
790 ch->ptr = ptr;
791 delta = (sz + ptr - ch->prevptr) % sz;
793 if (delta < ch->blksz)
796 ch->prevptr = ptr;
844 struct via_chinfo *ch;
850 ch = &via->pch[i];
851 if (ch->channel == NULL || ch->active == 0)
853 pollticks = ((uint64_t)hz * ch->blksz) /
854 ((uint64_t)sndbuf_getalign(ch->buffer) *
855 sndbuf_getspd(ch->buffer));
866 ch = &via->rch[i];
867 if (ch->channel == NULL || ch->active == 0)
869 pollticks = ((uint64_t)hz * ch->blksz) /
870 ((uint64_t)sndbuf_getalign(ch->buffer) *
871 sndbuf_getspd(ch->buffer));
887 struct via_chinfo *ch = data;
888 struct via_info *via = ch->parent;
897 via_buildsgdt(ch);
898 via8233chan_mute(via, ch, 0);
899 via_wr(via, ch->rbase + VIA_RP_TABLE_PTR, ch->sgd_addr, 4);
901 ch->ptr = 0;
902 ch->prevptr = 0;
903 pollticks = ((uint64_t)hz * ch->blksz) /
904 ((uint64_t)sndbuf_getalign(ch->buffer) *
905 sndbuf_getspd(ch->buffer));
928 via_wr(via, ch->rbase + VIA_RP_CONTROL,
932 ch->active = 1;
936 via_wr(via, ch->rbase + VIA_RP_CONTROL, SGD_CONTROL_STOP, 1);
937 via8233chan_mute(via, ch, 1);
938 via8233chan_reset(via, ch);
939 ch->active = 0;