Lines Matching refs:ch

447 wp_rdapu(struct agg_info *ess, unsigned ch, u_int16_t reg)
449 wp_wrreg(ess, WPREG_CRAM_PTR, reg | (ch << 4));
450 if (wp_wait_data(ess, reg | (ch << 4)) != 0)
456 wp_wrapu(struct agg_info *ess, unsigned ch, u_int16_t reg, u_int16_t data)
458 wp_wrreg(ess, WPREG_CRAM_PTR, reg | (ch << 4));
459 if (wp_wait_data(ess, reg | (ch << 4)) == 0) {
548 wc_rdchctl(struct agg_info *ess, int ch)
550 return wc_rdreg(ess, ch << 3);
555 wc_wrchctl(struct agg_info *ess, int ch, u_int16_t data)
557 wc_wrreg(ess, ch << 3, data);
842 aggch_start_dac(struct agg_chinfo *ch)
850 speed = ch->speed;
851 wpwa = (ch->phys - ch->base) >> 1;
853 wcreg = (ch->phys - 16) & WAVCACHE_CHCTL_ADDRTAG_MASK;
854 size = ch->buflen;
855 apuch = (ch->num << 1) | 32;
858 if (ch->stereo) {
860 if (ch->qs16) {
869 if (ch->qs16)
876 if (ch->us)
885 agg_lock(ch->parent);
886 agg_power(ch->parent, powerstate_active);
888 wc_wrreg(ch->parent, WAVCACHE_WTBAR + wtbar,
889 ch->base >> WAVCACHE_BASEADDR_SHIFT);
890 wc_wrreg(ch->parent, WAVCACHE_WTBAR + wtbar + 1,
891 ch->base >> WAVCACHE_BASEADDR_SHIFT);
893 wc_wrreg(ch->parent, WAVCACHE_WTBAR + wtbar + 2,
894 ch->base >> WAVCACHE_BASEADDR_SHIFT);
895 wc_wrreg(ch->parent, WAVCACHE_WTBAR + wtbar + 3,
896 ch->base >> WAVCACHE_BASEADDR_SHIFT);
898 wc_wrchctl(ch->parent, apuch, wcreg);
899 wc_wrchctl(ch->parent, apuch + 1, wcreg);
901 apu_setparam(ch->parent, apuch, wpwa, size, pan, dv);
902 if (ch->stereo) {
903 if (ch->qs16)
905 apu_setparam(ch->parent, apuch + 1, wpwa, size, -pan, dv);
908 wp_wrapu(ch->parent, apuch, APUREG_APUTYPE,
910 wp_wrapu(ch->parent, apuch + 1, APUREG_APUTYPE,
914 wp_wrapu(ch->parent, apuch, APUREG_APUTYPE,
919 ch->parent->active |= (1 << ch->num);
921 set_timer(ch->parent);
922 wp_starttimer(ch->parent);
923 agg_unlock(ch->parent);
927 aggch_stop_dac(struct agg_chinfo *ch)
929 agg_lock(ch->parent);
932 ch->parent->active &= ~(1 << ch->num);
934 wp_wrapu(ch->parent, (ch->num << 1) | 32, APUREG_APUTYPE,
936 wp_wrapu(ch->parent, (ch->num << 1) | 33, APUREG_APUTYPE,
939 if (ch->parent->active) {
940 set_timer(ch->parent);
941 wp_starttimer(ch->parent);
943 wp_stoptimer(ch->parent);
944 agg_power(ch->parent, powerstate_idle);
946 agg_unlock(ch->parent);
950 aggch_start_adc(struct agg_rchinfo *ch)
958 dv = ((ch->speed << 16) + 24000) / 48000;
964 if (ch->stereo) {
965 wpwa = (ch->srcphys - ch->base) >> 1;
966 wpwa2 = (ch->srcphys + ch->parent->bufsz/2 - ch->base) >> 1;
967 wcreg = (ch->srcphys - 16) & WAVCACHE_CHCTL_ADDRTAG_MASK;
968 wcreg2 = (ch->base - 16) & WAVCACHE_CHCTL_ADDRTAG_MASK;
971 wpwa = (ch->phys - ch->base) >> 1;
972 wpwa2 = (ch->srcphys - ch->base) >> 1;
973 wcreg = (ch->phys - 16) & WAVCACHE_CHCTL_ADDRTAG_MASK;
974 wcreg2 = (ch->base - 16) & WAVCACHE_CHCTL_ADDRTAG_MASK;
978 agg_lock(ch->parent);
980 ch->hwptr = 0;
981 agg_power(ch->parent, powerstate_active);
984 wc_wrchctl(ch->parent, 0, wcreg | WAVCACHE_CHCTL_STEREO);
985 wc_wrchctl(ch->parent, 1, wcreg | WAVCACHE_CHCTL_STEREO);
986 wc_wrchctl(ch->parent, 2, wcreg2 | WAVCACHE_CHCTL_STEREO);
987 wc_wrchctl(ch->parent, 3, wcreg2 | WAVCACHE_CHCTL_STEREO);
991 apu_setparam(ch->parent, 0, WPWA_USE_SYSMEM | wpwa,
992 ch->buflen >> ch->stereo, 0, dv);
993 wp_wrapu(ch->parent, 0, APUREG_AMPLITUDE, 0);
994 wp_wrapu(ch->parent, 0, APUREG_ROUTING, 2 << APU_DATASRC_A_SHIFT);
997 apu_setparam(ch->parent, 1, WPWA_USE_SYSMEM | wpwa2,
998 ch->buflen >> ch->stereo, 0, dv);
999 wp_wrapu(ch->parent, 1, APUREG_AMPLITUDE, 0);
1000 wp_wrapu(ch->parent, 1, APUREG_ROUTING, 3 << APU_DATASRC_A_SHIFT);
1003 apu_setparam(ch->parent, 2, WPWA_USE_SYSMEM | 0,
1004 ch->parent->bufsz >> 2, pan, 0x10000);
1005 wp_wrapu(ch->parent, 2, APUREG_AMPLITUDE, 0);
1006 wp_wrapu(ch->parent, 2, APUREG_EFFECT_GAIN, 0xf0);
1007 wp_wrapu(ch->parent, 2, APUREG_ROUTING, 0x15 << APU_DATASRC_A_SHIFT);
1010 apu_setparam(ch->parent, 3, WPWA_USE_SYSMEM | (ch->parent->bufsz >> 2),
1011 ch->parent->bufsz >> 2, -pan, 0x10000);
1012 wp_wrapu(ch->parent, 3, APUREG_AMPLITUDE, 0);
1013 wp_wrapu(ch->parent, 3, APUREG_EFFECT_GAIN, 0xf0);
1014 wp_wrapu(ch->parent, 3, APUREG_ROUTING, 0x14 << APU_DATASRC_A_SHIFT);
1017 ch->parent->active |= (1 << ch->parent->playchns);
1021 wp_wrapu(ch->parent, 0, APUREG_APUTYPE,
1023 wp_wrapu(ch->parent, 1, APUREG_APUTYPE,
1025 wp_wrapu(ch->parent, 2, APUREG_APUTYPE,
1027 wp_wrapu(ch->parent, 3, APUREG_APUTYPE,
1031 set_timer(ch->parent);
1032 wp_starttimer(ch->parent);
1033 agg_unlock(ch->parent);
1037 aggch_stop_adc(struct agg_rchinfo *ch)
1041 agg_lock(ch->parent);
1044 ch->parent->active &= ~(1 << ch->parent->playchns);
1047 wp_wrapu(ch->parent, apuch, APUREG_APUTYPE,
1050 if (ch->parent->active) {
1051 set_timer(ch->parent);
1052 wp_starttimer(ch->parent);
1054 wp_stoptimer(ch->parent);
1055 agg_power(ch->parent, powerstate_idle);
1057 agg_unlock(ch->parent);
1079 aggch_feed_adc_stereo(struct agg_rchinfo *ch)
1084 agg_lock(ch->parent);
1085 cur = wp_rdapu(ch->parent, 0, APUREG_CURPTR);
1086 agg_unlock(ch->parent);
1087 cur -= 0xffff & ((ch->srcphys - ch->base) >> 1);
1088 last = ch->hwptr;
1089 src2 = ch->src + ch->parent->bufsz/4;
1092 interleave(ch->src + last, src2 + last,
1093 ch->sink + 2*last, ch->buflen/2 - last);
1094 interleave(ch->src, src2,
1095 ch->sink, cur);
1097 interleave(ch->src + last, src2 + last,
1098 ch->sink + 2*last, cur - last);
1099 ch->hwptr = cur;
1119 aggch_feed_adc_mono(struct agg_rchinfo *ch)
1123 agg_lock(ch->parent);
1124 cur = wp_rdapu(ch->parent, 0, APUREG_CURPTR);
1125 agg_unlock(ch->parent);
1126 cur -= 0xffff & ((ch->phys - ch->base) >> 1);
1127 last = ch->hwptr;
1130 mixdown(ch->src + last, ch->sink + last, ch->buflen - last);
1131 mixdown(ch->src, ch->sink, cur);
1133 mixdown(ch->src + last, ch->sink + last, cur - last);
1134 ch->hwptr = cur;
1144 suppress_jitter(struct agg_chinfo *ch)
1146 if (ch->stereo) {
1149 /*halfsize = (ch->qs16? ch->buflen >> 2 : ch->buflen >> 1);*/
1150 cp1 = wp_rdapu(ch->parent, (ch->num << 1) | 32, APUREG_CURPTR);
1151 cp2 = wp_rdapu(ch->parent, (ch->num << 1) | 33, APUREG_CURPTR);
1155 AGG_WR(ch->parent, PORT_DSP_DATA, cp1, 2);
1161 suppress_rec_jitter(struct agg_rchinfo *ch)
1165 /*halfsize = (ch->stereo? ch->buflen >> 2 : ch->buflen >> 1);*/
1166 cp1 = (ch->stereo? ch->parent->bufsz >> 2 : ch->parent->bufsz >> 1)
1167 + wp_rdapu(ch->parent, 0, APUREG_CURPTR);
1168 cp2 = wp_rdapu(ch->parent, 1, APUREG_CURPTR);
1172 AGG_WR(ch->parent, PORT_DSP_DATA, cp1, 2);
1178 calc_timer_div(struct agg_chinfo *ch)
1182 speed = ch->speed;
1186 ch->num);
1190 return (48000 * (ch->blklen << (!ch->qs16 + !ch->stereo))
1195 calc_timer_div_rch(struct agg_rchinfo *ch)
1199 speed = ch->speed;
1206 return (48000 * (ch->blklen << (!ch->stereo))
1285 struct agg_chinfo *ch;
1291 ch = ess->pch + ess->playchns;
1293 ch->parent = ess;
1294 ch->channel = c;
1295 ch->buffer = b;
1296 ch->num = ess->playchns;
1298 p = dma_malloc(ess->buf_dmat, ess->bufsz, &physaddr, &ch->map);
1301 ch->phys = physaddr;
1302 ch->base = physaddr & ((~(bus_addr_t)0) << WAVCACHE_BASEADDR_SHIFT);
1305 ch->blklen = sndbuf_getblksz(b) / 2;
1306 ch->buflen = sndbuf_getsize(b) / 2;
1309 return ch;
1346 printf("ch.%d: phys 0x%llx, wpwa 0x%llx\n",
1357 struct agg_chinfo *ch = data;
1358 struct agg_info *ess = ch->parent;
1361 dma_free(ess->buf_dmat, sndbuf_getbuf(ch->buffer), ch->map);
1370 struct agg_chinfo *ch = data;
1374 ch->stereo = ch->qs16 = ch->us = 0;
1376 ch->stereo = 1;
1380 ch->us = 1;
1382 ch->qs16 = 1;
1398 struct agg_chinfo *ch = data;
1402 blkcnt = (ch->speed << (ch->stereo + ch->qs16)) / (50 * blocksize);
1403 RANGE(blkcnt, 2, ch->parent->bufsz / blocksize);
1405 if (sndbuf_getsize(ch->buffer) != blkcnt * blocksize) {
1406 sndbuf_resize(ch->buffer, blkcnt, blocksize);
1407 blkcnt = sndbuf_getblkcnt(ch->buffer);
1408 blocksize = sndbuf_getblksz(ch->buffer);
1410 sndbuf_setblkcnt(ch->buffer, blkcnt);
1411 sndbuf_setblksz(ch->buffer, blocksize);
1414 ch->blklen = blocksize / 2;
1415 ch->buflen = blkcnt * blocksize / 2;
1422 struct agg_chinfo *ch = data;
1428 aggch_start_dac(ch);
1432 aggch_stop_dac(ch);
1441 struct agg_chinfo *ch = data;
1444 agg_lock(ch->parent);
1445 cp = wp_rdapu(ch->parent, (ch->num << 1) | 32, APUREG_CURPTR);
1446 agg_unlock(ch->parent);
1448 return ch->qs16 && ch->stereo
1449 ? (cp << 2) - ((0xffff << 2) & (ch->phys - ch->base))
1450 : (cp << 1) - ((0xffff << 1) & (ch->phys - ch->base));
1494 struct agg_rchinfo *ch;
1499 ch = &ess->rch;
1501 ch->parent = ess;
1502 ch->channel = c;
1503 ch->buffer = b;
1507 ch->phys = ess->phys + ess->bufsz;
1508 ch->base = ess->phys;
1509 ch->src = (int16_t *)(p + ess->bufsz);
1510 ch->srcphys = ch->phys + ess->bufsz;
1511 ch->sink = (int16_t *)p;
1514 ch->blklen = sndbuf_getblksz(b) / 2;
1515 ch->buflen = sndbuf_getsize(b) / 2;
1517 return ch;
1523 struct agg_rchinfo *ch = data;
1528 ch->stereo = 1;
1530 ch->stereo = 0;
1546 struct agg_rchinfo *ch = data;
1550 blkcnt = (ch->speed << ch->stereo) / (25 * blocksize);
1551 RANGE(blkcnt, 2, ch->parent->bufsz / blocksize);
1553 if (sndbuf_getsize(ch->buffer) != blkcnt * blocksize) {
1554 sndbuf_resize(ch->buffer, blkcnt, blocksize);
1555 blkcnt = sndbuf_getblkcnt(ch->buffer);
1556 blocksize = sndbuf_getblksz(ch->buffer);
1558 sndbuf_setblkcnt(ch->buffer, blkcnt);
1559 sndbuf_setblksz(ch->buffer, blocksize);
1562 ch->blklen = blocksize / 2;
1563 ch->buflen = blkcnt * blocksize / 2;
1570 struct agg_rchinfo *ch = sc;
1574 if (ch->stereo)
1575 aggch_feed_adc_stereo(ch);
1577 aggch_feed_adc_mono(ch);
1580 aggch_start_adc(ch);
1584 aggch_stop_adc(ch);
1593 struct agg_rchinfo *ch = sc;
1595 return ch->stereo? ch->hwptr << 2 : ch->hwptr << 1;