Lines Matching refs:ch

449 wp_rdapu(struct agg_info *ess, unsigned ch, u_int16_t reg)
451 wp_wrreg(ess, WPREG_CRAM_PTR, reg | (ch << 4));
452 if (wp_wait_data(ess, reg | (ch << 4)) != 0)
458 wp_wrapu(struct agg_info *ess, unsigned ch, u_int16_t reg, u_int16_t data)
460 wp_wrreg(ess, WPREG_CRAM_PTR, reg | (ch << 4));
461 if (wp_wait_data(ess, reg | (ch << 4)) == 0) {
550 wc_rdchctl(struct agg_info *ess, int ch)
552 return wc_rdreg(ess, ch << 3);
557 wc_wrchctl(struct agg_info *ess, int ch, u_int16_t data)
559 wc_wrreg(ess, ch << 3, data);
844 aggch_start_dac(struct agg_chinfo *ch)
852 speed = ch->speed;
853 wpwa = (ch->phys - ch->base) >> 1;
855 wcreg = (ch->phys - 16) & WAVCACHE_CHCTL_ADDRTAG_MASK;
856 size = ch->buflen;
857 apuch = (ch->num << 1) | 32;
860 if (ch->stereo) {
862 if (ch->qs16) {
871 if (ch->qs16)
878 if (ch->us)
887 agg_lock(ch->parent);
888 agg_power(ch->parent, powerstate_active);
890 wc_wrreg(ch->parent, WAVCACHE_WTBAR + wtbar,
891 ch->base >> WAVCACHE_BASEADDR_SHIFT);
892 wc_wrreg(ch->parent, WAVCACHE_WTBAR + wtbar + 1,
893 ch->base >> WAVCACHE_BASEADDR_SHIFT);
895 wc_wrreg(ch->parent, WAVCACHE_WTBAR + wtbar + 2,
896 ch->base >> WAVCACHE_BASEADDR_SHIFT);
897 wc_wrreg(ch->parent, WAVCACHE_WTBAR + wtbar + 3,
898 ch->base >> WAVCACHE_BASEADDR_SHIFT);
900 wc_wrchctl(ch->parent, apuch, wcreg);
901 wc_wrchctl(ch->parent, apuch + 1, wcreg);
903 apu_setparam(ch->parent, apuch, wpwa, size, pan, dv);
904 if (ch->stereo) {
905 if (ch->qs16)
907 apu_setparam(ch->parent, apuch + 1, wpwa, size, -pan, dv);
910 wp_wrapu(ch->parent, apuch, APUREG_APUTYPE,
912 wp_wrapu(ch->parent, apuch + 1, APUREG_APUTYPE,
916 wp_wrapu(ch->parent, apuch, APUREG_APUTYPE,
921 ch->parent->active |= (1 << ch->num);
923 set_timer(ch->parent);
924 wp_starttimer(ch->parent);
925 agg_unlock(ch->parent);
929 aggch_stop_dac(struct agg_chinfo *ch)
931 agg_lock(ch->parent);
934 ch->parent->active &= ~(1 << ch->num);
936 wp_wrapu(ch->parent, (ch->num << 1) | 32, APUREG_APUTYPE,
938 wp_wrapu(ch->parent, (ch->num << 1) | 33, APUREG_APUTYPE,
941 if (ch->parent->active) {
942 set_timer(ch->parent);
943 wp_starttimer(ch->parent);
945 wp_stoptimer(ch->parent);
946 agg_power(ch->parent, powerstate_idle);
948 agg_unlock(ch->parent);
952 aggch_start_adc(struct agg_rchinfo *ch)
960 dv = ((ch->speed << 16) + 24000) / 48000;
966 if (ch->stereo) {
967 wpwa = (ch->srcphys - ch->base) >> 1;
968 wpwa2 = (ch->srcphys + ch->parent->bufsz/2 - ch->base) >> 1;
969 wcreg = (ch->srcphys - 16) & WAVCACHE_CHCTL_ADDRTAG_MASK;
970 wcreg2 = (ch->base - 16) & WAVCACHE_CHCTL_ADDRTAG_MASK;
973 wpwa = (ch->phys - ch->base) >> 1;
974 wpwa2 = (ch->srcphys - ch->base) >> 1;
975 wcreg = (ch->phys - 16) & WAVCACHE_CHCTL_ADDRTAG_MASK;
976 wcreg2 = (ch->base - 16) & WAVCACHE_CHCTL_ADDRTAG_MASK;
980 agg_lock(ch->parent);
982 ch->hwptr = 0;
983 agg_power(ch->parent, powerstate_active);
986 wc_wrchctl(ch->parent, 0, wcreg | WAVCACHE_CHCTL_STEREO);
987 wc_wrchctl(ch->parent, 1, wcreg | WAVCACHE_CHCTL_STEREO);
988 wc_wrchctl(ch->parent, 2, wcreg2 | WAVCACHE_CHCTL_STEREO);
989 wc_wrchctl(ch->parent, 3, wcreg2 | WAVCACHE_CHCTL_STEREO);
993 apu_setparam(ch->parent, 0, WPWA_USE_SYSMEM | wpwa,
994 ch->buflen >> ch->stereo, 0, dv);
995 wp_wrapu(ch->parent, 0, APUREG_AMPLITUDE, 0);
996 wp_wrapu(ch->parent, 0, APUREG_ROUTING, 2 << APU_DATASRC_A_SHIFT);
999 apu_setparam(ch->parent, 1, WPWA_USE_SYSMEM | wpwa2,
1000 ch->buflen >> ch->stereo, 0, dv);
1001 wp_wrapu(ch->parent, 1, APUREG_AMPLITUDE, 0);
1002 wp_wrapu(ch->parent, 1, APUREG_ROUTING, 3 << APU_DATASRC_A_SHIFT);
1005 apu_setparam(ch->parent, 2, WPWA_USE_SYSMEM | 0,
1006 ch->parent->bufsz >> 2, pan, 0x10000);
1007 wp_wrapu(ch->parent, 2, APUREG_AMPLITUDE, 0);
1008 wp_wrapu(ch->parent, 2, APUREG_EFFECT_GAIN, 0xf0);
1009 wp_wrapu(ch->parent, 2, APUREG_ROUTING, 0x15 << APU_DATASRC_A_SHIFT);
1012 apu_setparam(ch->parent, 3, WPWA_USE_SYSMEM | (ch->parent->bufsz >> 2),
1013 ch->parent->bufsz >> 2, -pan, 0x10000);
1014 wp_wrapu(ch->parent, 3, APUREG_AMPLITUDE, 0);
1015 wp_wrapu(ch->parent, 3, APUREG_EFFECT_GAIN, 0xf0);
1016 wp_wrapu(ch->parent, 3, APUREG_ROUTING, 0x14 << APU_DATASRC_A_SHIFT);
1019 ch->parent->active |= (1 << ch->parent->playchns);
1023 wp_wrapu(ch->parent, 0, APUREG_APUTYPE,
1025 wp_wrapu(ch->parent, 1, APUREG_APUTYPE,
1027 wp_wrapu(ch->parent, 2, APUREG_APUTYPE,
1029 wp_wrapu(ch->parent, 3, APUREG_APUTYPE,
1033 set_timer(ch->parent);
1034 wp_starttimer(ch->parent);
1035 agg_unlock(ch->parent);
1039 aggch_stop_adc(struct agg_rchinfo *ch)
1043 agg_lock(ch->parent);
1046 ch->parent->active &= ~(1 << ch->parent->playchns);
1049 wp_wrapu(ch->parent, apuch, APUREG_APUTYPE,
1052 if (ch->parent->active) {
1053 set_timer(ch->parent);
1054 wp_starttimer(ch->parent);
1056 wp_stoptimer(ch->parent);
1057 agg_power(ch->parent, powerstate_idle);
1059 agg_unlock(ch->parent);
1081 aggch_feed_adc_stereo(struct agg_rchinfo *ch)
1086 agg_lock(ch->parent);
1087 cur = wp_rdapu(ch->parent, 0, APUREG_CURPTR);
1088 agg_unlock(ch->parent);
1089 cur -= 0xffff & ((ch->srcphys - ch->base) >> 1);
1090 last = ch->hwptr;
1091 src2 = ch->src + ch->parent->bufsz/4;
1094 interleave(ch->src + last, src2 + last,
1095 ch->sink + 2*last, ch->buflen/2 - last);
1096 interleave(ch->src, src2,
1097 ch->sink, cur);
1099 interleave(ch->src + last, src2 + last,
1100 ch->sink + 2*last, cur - last);
1101 ch->hwptr = cur;
1121 aggch_feed_adc_mono(struct agg_rchinfo *ch)
1125 agg_lock(ch->parent);
1126 cur = wp_rdapu(ch->parent, 0, APUREG_CURPTR);
1127 agg_unlock(ch->parent);
1128 cur -= 0xffff & ((ch->phys - ch->base) >> 1);
1129 last = ch->hwptr;
1132 mixdown(ch->src + last, ch->sink + last, ch->buflen - last);
1133 mixdown(ch->src, ch->sink, cur);
1135 mixdown(ch->src + last, ch->sink + last, cur - last);
1136 ch->hwptr = cur;
1146 suppress_jitter(struct agg_chinfo *ch)
1148 if (ch->stereo) {
1151 /*halfsize = (ch->qs16? ch->buflen >> 2 : ch->buflen >> 1);*/
1152 cp1 = wp_rdapu(ch->parent, (ch->num << 1) | 32, APUREG_CURPTR);
1153 cp2 = wp_rdapu(ch->parent, (ch->num << 1) | 33, APUREG_CURPTR);
1157 AGG_WR(ch->parent, PORT_DSP_DATA, cp1, 2);
1163 suppress_rec_jitter(struct agg_rchinfo *ch)
1167 /*halfsize = (ch->stereo? ch->buflen >> 2 : ch->buflen >> 1);*/
1168 cp1 = (ch->stereo? ch->parent->bufsz >> 2 : ch->parent->bufsz >> 1)
1169 + wp_rdapu(ch->parent, 0, APUREG_CURPTR);
1170 cp2 = wp_rdapu(ch->parent, 1, APUREG_CURPTR);
1174 AGG_WR(ch->parent, PORT_DSP_DATA, cp1, 2);
1180 calc_timer_div(struct agg_chinfo *ch)
1184 speed = ch->speed;
1188 ch->num);
1192 return (48000 * (ch->blklen << (!ch->qs16 + !ch->stereo))
1197 calc_timer_div_rch(struct agg_rchinfo *ch)
1201 speed = ch->speed;
1208 return (48000 * (ch->blklen << (!ch->stereo))
1287 struct agg_chinfo *ch;
1293 ch = ess->pch + ess->playchns;
1295 ch->parent = ess;
1296 ch->channel = c;
1297 ch->buffer = b;
1298 ch->num = ess->playchns;
1303 ch->phys = physaddr;
1304 ch->base = physaddr & ((~(bus_addr_t)0) << WAVCACHE_BASEADDR_SHIFT);
1307 ch->blklen = sndbuf_getblksz(b) / 2;
1308 ch->buflen = sndbuf_getsize(b) / 2;
1311 return ch;
1348 printf("ch.%d: phys 0x%llx, wpwa 0x%llx\n",
1359 struct agg_chinfo *ch = data;
1360 struct agg_info *ess = ch->parent;
1363 dma_free(ess->buf_dmat, sndbuf_getbuf(ch->buffer));
1372 struct agg_chinfo *ch = data;
1376 ch->stereo = ch->qs16 = ch->us = 0;
1378 ch->stereo = 1;
1382 ch->us = 1;
1384 ch->qs16 = 1;
1400 struct agg_chinfo *ch = data;
1404 blkcnt = (ch->speed << (ch->stereo + ch->qs16)) / (50 * blocksize);
1405 RANGE(blkcnt, 2, ch->parent->bufsz / blocksize);
1407 if (sndbuf_getsize(ch->buffer) != blkcnt * blocksize) {
1408 sndbuf_resize(ch->buffer, blkcnt, blocksize);
1409 blkcnt = sndbuf_getblkcnt(ch->buffer);
1410 blocksize = sndbuf_getblksz(ch->buffer);
1412 sndbuf_setblkcnt(ch->buffer, blkcnt);
1413 sndbuf_setblksz(ch->buffer, blocksize);
1416 ch->blklen = blocksize / 2;
1417 ch->buflen = blkcnt * blocksize / 2;
1424 struct agg_chinfo *ch = data;
1430 aggch_start_dac(ch);
1434 aggch_stop_dac(ch);
1443 struct agg_chinfo *ch = data;
1446 agg_lock(ch->parent);
1447 cp = wp_rdapu(ch->parent, (ch->num << 1) | 32, APUREG_CURPTR);
1448 agg_unlock(ch->parent);
1450 return ch->qs16 && ch->stereo
1451 ? (cp << 2) - ((0xffff << 2) & (ch->phys - ch->base))
1452 : (cp << 1) - ((0xffff << 1) & (ch->phys - ch->base));
1496 struct agg_rchinfo *ch;
1501 ch = &ess->rch;
1503 ch->parent = ess;
1504 ch->channel = c;
1505 ch->buffer = b;
1509 ch->phys = ess->phys + ess->bufsz;
1510 ch->base = ess->phys;
1511 ch->src = (int16_t *)(p + ess->bufsz);
1512 ch->srcphys = ch->phys + ess->bufsz;
1513 ch->sink = (int16_t *)p;
1516 ch->blklen = sndbuf_getblksz(b) / 2;
1517 ch->buflen = sndbuf_getsize(b) / 2;
1519 return ch;
1525 struct agg_rchinfo *ch = data;
1530 ch->stereo = 1;
1532 ch->stereo = 0;
1548 struct agg_rchinfo *ch = data;
1552 blkcnt = (ch->speed << ch->stereo) / (25 * blocksize);
1553 RANGE(blkcnt, 2, ch->parent->bufsz / blocksize);
1555 if (sndbuf_getsize(ch->buffer) != blkcnt * blocksize) {
1556 sndbuf_resize(ch->buffer, blkcnt, blocksize);
1557 blkcnt = sndbuf_getblkcnt(ch->buffer);
1558 blocksize = sndbuf_getblksz(ch->buffer);
1560 sndbuf_setblkcnt(ch->buffer, blkcnt);
1561 sndbuf_setblksz(ch->buffer, blocksize);
1564 ch->blklen = blocksize / 2;
1565 ch->buflen = blkcnt * blocksize / 2;
1572 struct agg_rchinfo *ch = sc;
1576 if (ch->stereo)
1577 aggch_feed_adc_stereo(ch);
1579 aggch_feed_adc_mono(ch);
1582 aggch_start_adc(ch);
1586 aggch_stop_adc(ch);
1595 struct agg_rchinfo *ch = sc;
1597 return ch->stereo? ch->hwptr << 2 : ch->hwptr << 1;