Lines Matching defs:via

141 via_chan_active(struct via_info *via)
145 if (via == NULL)
149 ret += via->pch[i].active;
152 ret += via->rch[i].active;
160 struct via_info *via;
166 via = pcm_getdevinfo(dev);
167 snd_mtxlock(via->lock);
169 snd_mtxunlock(via->lock);
182 snd_mtxlock(via->lock);
184 snd_mtxunlock(via->lock);
192 struct via_info *via;
197 via = pcm_getdevinfo(dev);
198 snd_mtxlock(via->lock);
199 val = via->dxs_src;
200 snd_mtxunlock(via->lock);
208 snd_mtxlock(via->lock);
209 via->dxs_src = val;
210 snd_mtxunlock(via->lock);
218 struct via_info *via;
223 via = pcm_getdevinfo(dev);
224 if (via == NULL)
226 snd_mtxlock(via->lock);
227 val = via->polling;
228 snd_mtxunlock(via->lock);
236 snd_mtxlock(via->lock);
237 if (val != via->polling) {
238 if (via_chan_active(via) != 0)
241 via->polling = 0;
243 via->polling = 1;
245 snd_mtxunlock(via->lock);
255 a device specific sysctl "dev.pcm.X.yyy" via device_get_sysctl_*()
275 via_rd(struct via_info *via, int regno, int size)
279 return (bus_space_read_1(via->st, via->sh, regno));
281 return (bus_space_read_2(via->st, via->sh, regno));
283 return (bus_space_read_4(via->st, via->sh, regno));
290 via_wr(struct via_info *via, int regno, uint32_t data, int size)
295 bus_space_write_1(via->st, via->sh, regno, data);
298 bus_space_write_2(via->st, via->sh, regno, data);
301 bus_space_write_4(via->st, via->sh, regno, data);
310 via_waitready_codec(struct via_info *via)
316 if ((via_rd(via, VIA_AC97_CONTROL, 4) & VIA_AC97_BUSY) == 0)
320 device_printf(via->dev, "%s: codec busy\n", __func__);
325 via_waitvalid_codec(struct via_info *via)
331 if (via_rd(via, VIA_AC97_CONTROL, 4) & VIA_AC97_CODEC00_VALID)
335 device_printf(via->dev, "%s: codec invalid\n", __func__);
342 struct via_info *via = addr;
344 if (via_waitready_codec(via))
347 via_wr(via, VIA_AC97_CONTROL,
357 struct via_info *via = addr;
359 if (via_waitready_codec(via))
362 via_wr(via, VIA_AC97_CONTROL, VIA_AC97_CODEC00_VALID |
365 if (via_waitready_codec(via))
368 if (via_waitvalid_codec(via))
371 return (via_rd(via, VIA_AC97_CONTROL, 2));
407 struct via_info *via = ch->parent;
415 snd_mtxlock(via->lock);
416 via_wr(via, VIA_WR0_FORMAT, f, 4);
417 snd_mtxunlock(via->lock);
426 struct via_info *via = ch->parent;
430 snd_mtxlock(via->lock);
431 v = via_rd(via, r, 4);
438 via_wr(via, r, v, 4);
439 snd_mtxunlock(via->lock);
448 struct via_info *via = ch->parent;
461 snd_mtxlock(via->lock);
462 via_wr(via, VIA_MC_SLOT_SELECT, s, 4);
463 via_wr(via, VIA_MC_SGD_FORMAT, v, 1);
464 snd_mtxunlock(via->lock);
476 struct via_info *via = ch->parent;
478 if (via->codec_caps & AC97_EXTCAP_VRA)
479 return (ac97_setrate(via->codec, AC97_REGEXT_LADCRATE, speed));
488 struct via_info *via = ch->parent;
492 snd_mtxlock(via->lock);
493 v = via_rd(via, r, 4) & ~VIA8233_DXS_RATEFMT_48K;
498 via_wr(via, r, v, 4);
499 snd_mtxunlock(via->lock);
508 struct via_info *via = ch->parent;
510 if (via->codec_caps & AC97_EXTCAP_VRA)
511 return (ac97_setrate(via->codec, AC97_REGEXT_FDACRATE, speed));
523 struct via_info *via = ch->parent;
526 if (via->codec_caps & AC97_EXTCAP_VRA)
535 struct via_info *via = ch->parent;
543 if (via->dxs_src)
552 struct via_info *via = ch->parent;
555 if (via->codec_caps & AC97_EXTCAP_VRA)
568 struct via_info *via = ch->parent;
593 device_printf(via->dev, "%s: failed blksz=%u blkcnt=%u\n",
606 struct via_info *via = ch->parent;
608 via8233chan_setfragments(obj, data, blksz, via->blkcnt);
617 struct via_info *via = ch->parent;
620 snd_mtxlock(via->lock);
621 if (via->polling != 0) {
623 snd_mtxunlock(via->lock);
625 v = via_rd(via, ch->rbase + VIA_RP_CURRENT_COUNT, 4);
626 snd_mtxunlock(via->lock);
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 *
660 struct via_info *via = devinfo;
664 snd_mtxlock(via->lock);
665 num = via->rec_num++;
666 ch = &via->rch[num];
667 ch->parent = via;
671 ch->blkcnt = via->blkcnt;
673 via_wr(via, ch->rbase + VIA_WR_RP_SGD_FORMAT, WR_FIFO_ENABLE, 1);
674 snd_mtxunlock(via->lock);
676 if (sndbuf_alloc(ch->buffer, via->parent_dmat, 0, via->bufsz) != 0)
679 snd_mtxlock(via->lock);
680 via8233chan_sgdinit(via, ch, num);
681 via8233chan_reset(via, ch);
682 snd_mtxunlock(via->lock);
691 struct via_info *via = devinfo;
695 snd_mtxlock(via->lock);
696 num = via->play_num++;
697 ch = &via->pch[num];
698 ch->parent = via;
702 ch->blkcnt = via->blkcnt;
709 ch->rbase = VIA_DXS_BASE(NDXSCHANS - 1 - via->n_dxs_registered);
710 via->n_dxs_registered++;
711 snd_mtxunlock(via->lock);
713 if (sndbuf_alloc(ch->buffer, via->parent_dmat, 0, via->bufsz) != 0)
716 snd_mtxlock(via->lock);
717 via8233chan_sgdinit(via, ch, NWRCHANS + num);
718 via8233chan_reset(via, ch);
719 snd_mtxunlock(via->lock);
728 struct via_info *via = devinfo;
732 snd_mtxlock(via->lock);
733 num = via->play_num++;
734 ch = &via->pch[num];
735 ch->parent = via;
740 ch->blkcnt = via->blkcnt;
741 snd_mtxunlock(via->lock);
743 if (sndbuf_alloc(ch->buffer, via->parent_dmat, 0, via->bufsz) != 0)
746 snd_mtxlock(via->lock);
747 via8233chan_sgdinit(via, ch, NWRCHANS + num);
748 via8233chan_reset(via, ch);
749 snd_mtxunlock(via->lock);
755 via8233chan_mute(struct via_info *via, struct via_chinfo *ch, int muted)
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) &
765 device_printf(via->dev,
774 struct via_info *via;
782 via = ch->parent;
784 v = via_rd(via, ch->rbase + VIA_RP_CURRENT_COUNT, 4);
804 struct via_info *via = arg;
808 if (via == NULL)
811 snd_mtxlock(via->lock);
812 if (via->polling == 0 || via_chan_active(via) == 0) {
813 snd_mtxunlock(via->lock);
818 ptrigger |= (via_poll_channel(&via->pch[i]) != 0) ?
822 rtrigger |= (via_poll_channel(&via->rch[i]) != 0) ?
826 callout_reset(&via->poll_timer, 1/*via->poll_ticks*/,
827 via_poll_callback, via);
829 snd_mtxunlock(via->lock);
833 chn_intr(via->pch[i].channel);
837 chn_intr(via->rch[i].channel);
842 via_poll_ticks(struct via_info *via)
850 ch = &via->pch[i];
866 ch = &via->rch[i];
888 struct via_info *via = ch->parent;
894 snd_mtxlock(via->lock);
898 via8233chan_mute(via, ch, 0);
899 via_wr(via, ch->rbase + VIA_RP_TABLE_PTR, ch->sgd_addr, 4);
900 if (via->polling != 0) {
911 if (via_chan_active(via) == 0 ||
912 pollticks < via->poll_ticks) {
914 if (via_chan_active(via) == 0)
920 __func__, via->poll_ticks,
923 via->poll_ticks = pollticks;
924 callout_reset(&via->poll_timer, 1,
925 via_poll_callback, via);
928 via_wr(via, ch->rbase + VIA_RP_CONTROL,
930 ((via->polling == 0) ?
936 via_wr(via, ch->rbase + VIA_RP_CONTROL, SGD_CONTROL_STOP, 1);
937 via8233chan_mute(via, ch, 1);
938 via8233chan_reset(via, ch);
940 if (via->polling != 0) {
941 if (via_chan_active(via) == 0) {
942 callout_stop(&via->poll_timer);
943 via->poll_ticks = 1;
945 pollticks = via_poll_ticks(via);
946 if (pollticks > via->poll_ticks) {
950 __func__, via->poll_ticks,
952 via->poll_ticks = pollticks;
953 callout_reset(&via->poll_timer,
955 via);
963 snd_mtxunlock(via->lock);
1011 struct via_info *via = p;
1015 snd_mtxlock(via->lock);
1016 if (via->polling != 0) {
1017 snd_mtxunlock(via->lock);
1022 if (via->pch[i].channel == NULL || via->pch[i].active == 0)
1024 reg = via->pch[i].rbase + VIA_RP_STATUS;
1025 stat = via_rd(via, reg, 1);
1027 if (via->dma_eol_wake && ((stat & SGD_STATUS_EOL) ||
1029 via_wr(via, via->pch[i].rbase + VIA_RP_CONTROL,
1032 via_wr(via, reg, stat, 1);
1038 if (via->rch[i].channel == NULL || via->rch[i].active == 0)
1040 reg = via->rch[i].rbase + VIA_RP_STATUS;
1041 stat = via_rd(via, reg, 1);
1043 if (via->dma_eol_wake && ((stat & SGD_STATUS_EOL) ||
1045 via_wr(via, via->rch[i].rbase + VIA_RP_CONTROL,
1048 via_wr(via, reg, stat, 1);
1052 snd_mtxunlock(via->lock);
1056 chn_intr(via->pch[i].channel);
1060 chn_intr(via->rch[i].channel);
1105 struct via_info *via = (struct via_info *)p;
1106 via->sgd_addr = bds->ds_addr;
1167 struct via_info *via = 0;
1173 via = malloc(sizeof *via, M_DEVBUF, M_WAITOK | M_ZERO);
1174 via->lock = snd_mtxcreate(device_get_nameunit(dev),
1176 via->dev = dev;
1178 callout_init(&via->poll_timer, CALLOUT_MPSAFE);
1179 via->poll_ticks = 1;
1183 via->polling = 1;
1185 via->polling = 0;
1190 via->regid = PCIR_BAR(0);
1191 via->reg = bus_alloc_resource_any(dev, SYS_RES_IOPORT, &via->regid,
1193 if (!via->reg) {
1197 via->st = rman_get_bustag(via->reg);
1198 via->sh = rman_get_bushandle(via->reg);
1200 via->irqid = 0;
1201 via->irq = bus_alloc_resource_any(dev, SYS_RES_IRQ, &via->irqid,
1203 if (!via->irq ||
1204 snd_setup_intr(dev, via->irq, INTR_MPSAFE,
1205 via_intr, via, &via->ih)) {
1210 via->bufsz = pcm_getbuffersize(dev, 4096, VIA_DEFAULT_BUFSZ, 65536);
1216 via->blkcnt = via->bufsz / i;
1218 while (via->blkcnt >> i)
1220 via->blkcnt = 1 << (i - 1);
1221 if (via->blkcnt < VIA_SEGS_MIN)
1222 via->blkcnt = VIA_SEGS_MIN;
1223 else if (via->blkcnt > VIA_SEGS_MAX)
1224 via->blkcnt = VIA_SEGS_MAX;
1227 via->blkcnt = VIA_SEGS_DEFAULT;
1236 via->dma_eol_wake = 1;
1238 via->dma_eol_wake = 0;
1286 via->dxs_src = (via_dxs_src > 0) ? 1 : 0;
1288 via->dxs_src = 0;
1298 /*maxsize*/via->bufsz, /*nsegments*/1, /*maxsegz*/0x3ffff,
1300 /*lockarg*/NULL, &via->parent_dmat) != 0) {
1318 /*lockarg*/NULL, &via->sgd_dmat) != 0) {
1323 if (bus_dmamem_alloc(via->sgd_dmat, (void **)&via->sgd_table,
1324 BUS_DMA_NOWAIT, &via->sgd_dmamap) == -1)
1326 if (bus_dmamap_load(via->sgd_dmat, via->sgd_dmamap, via->sgd_table,
1327 nsegs * sizeof(struct via_dma_op), dma_cb, via, 0))
1333 via->codec = AC97_CREATE(dev, via, via_ac97);
1334 if (!via->codec)
1337 mixer_init(dev, ac97_getmixerclass(), via->codec);
1339 via->codec_caps = ac97_getextcaps(via->codec);
1342 if (via->codec_caps &
1344 uint16_t ext = ac97_getextmode(via->codec);
1345 ext |= (via->codec_caps &
1348 ac97_setextmode(via->codec, ext);
1352 rman_get_start(via->reg), rman_get_start(via->irq),
1356 if (pcm_register(dev, via, via_dxs_chnum + via_sgd_chnum, NWRCHANS))
1359 pcm_addchan(dev, PCMDIR_PLAY, &via8233dxs_class, via);
1361 pcm_addchan(dev, PCMDIR_PLAY, &via8233msgd_class, via);
1363 pcm_addchan(dev, PCMDIR_REC, &via8233wr_class, via);
1367 (via_dxs_chnum > 0) ? "En" : "Dis", (via->dxs_src) ? "(SRC)" : "",
1374 if (via->codec)
1375 ac97_destroy(via->codec);
1376 if (via->reg)
1377 bus_release_resource(dev, SYS_RES_IOPORT, via->regid, via->reg);
1378 if (via->ih)
1379 bus_teardown_intr(dev, via->irq, via->ih);
1380 if (via->irq)
1381 bus_release_resource(dev, SYS_RES_IRQ, via->irqid, via->irq);
1382 if (via->parent_dmat)
1383 bus_dma_tag_destroy(via->parent_dmat);
1384 if (via->sgd_dmamap)
1385 bus_dmamap_unload(via->sgd_dmat, via->sgd_dmamap);
1386 if (via->sgd_table)
1387 bus_dmamem_free(via->sgd_dmat, via->sgd_table, via->sgd_dmamap);
1388 if (via->sgd_dmat)
1389 bus_dma_tag_destroy(via->sgd_dmat);
1390 if (via->lock)
1391 snd_mtxfree(via->lock);
1392 if (via)
1393 free(via, M_DEVBUF);
1401 struct via_info *via;
1407 via = pcm_getdevinfo(dev);
1409 if (via != NULL && (via->play_num != 0 || via->rec_num != 0)) {
1410 snd_mtxlock(via->lock);
1411 via->polling = 0;
1412 callout_stop(&via->poll_timer);
1413 snd_mtxunlock(via->lock);
1414 callout_drain(&via->poll_timer);
1417 bus_release_resource(dev, SYS_RES_IOPORT, via->regid, via->reg);
1418 bus_teardown_intr(dev, via->irq, via->ih);
1419 bus_release_resource(dev, SYS_RES_IRQ, via->irqid, via->irq);
1420 bus_dma_tag_destroy(via->parent_dmat);
1421 bus_dmamap_unload(via->sgd_dmat, via->sgd_dmamap);
1422 bus_dmamem_free(via->sgd_dmat, via->sgd_table, via->sgd_dmamap);
1423 bus_dma_tag_destroy(via->sgd_dmat);
1424 snd_mtxfree(via->lock);
1425 free(via, M_DEVBUF);