Lines Matching refs:via

107 via_rd(struct via_info *via, int regno, int size)
112 return bus_space_read_1(via->st, via->sh, regno);
114 return bus_space_read_2(via->st, via->sh, regno);
116 return bus_space_read_4(via->st, via->sh, regno);
124 via_wr(struct via_info *via, int regno, u_int32_t data, int size)
129 bus_space_write_1(via->st, via->sh, regno, data);
132 bus_space_write_2(via->st, via->sh, regno, data);
135 bus_space_write_4(via->st, via->sh, regno, data);
144 via_waitready_codec(struct via_info *via)
150 (via_rd(via, VIA_CODEC_CTL, 4) & VIA_CODEC_BUSY); i++)
153 printf("via: codec busy\n");
162 via_waitvalid_codec(struct via_info *via)
168 !(via_rd(via, VIA_CODEC_CTL, 4) & VIA_CODEC_PRIVALID); i++)
171 printf("via: codec invalid\n");
182 struct via_info *via = addr;
184 if (via_waitready_codec(via)) return -1;
186 via_wr(via, VIA_CODEC_CTL, VIA_CODEC_PRIVALID | VIA_CODEC_INDEX(reg) | val, 4);
195 struct via_info *via = addr;
197 if (via_waitready_codec(via))
200 via_wr(via, VIA_CODEC_CTL, VIA_CODEC_PRIVALID | VIA_CODEC_READ | VIA_CODEC_INDEX(reg),4);
202 if (via_waitready_codec(via))
205 if (via_waitvalid_codec(via))
208 return via_rd(via, VIA_CODEC_CTL, 2);
249 struct via_info *via = devinfo;
252 snd_mtxlock(via->lock);
254 ch = &via->pch;
259 ch->sgd_addr = via->sgd_addr;
260 ch->sgd_table = &via->sgd_table[0];
262 ch = &via->rch;
267 ch->sgd_addr = via->sgd_addr + sizeof(struct via_dma_op) * SEGS_PER_CHAN;
268 ch->sgd_table = &via->sgd_table[SEGS_PER_CHAN];
271 ch->parent = via;
275 snd_mtxunlock(via->lock);
277 if (sndbuf_alloc(ch->buffer, via->parent_dmat, 0, via->bufsz) != 0)
287 struct via_info *via = ch->parent;
297 snd_mtxlock(via->lock);
298 mode = via_rd(via, ch->mode, 1);
301 via_wr(via, ch->mode, mode, 1);
302 snd_mtxunlock(via->lock);
311 struct via_info *via = ch->parent;
323 if (via->codec_caps & AC97_EXTCAP_VRA) {
325 return ac97_setrate(via->codec, reg, speed);
345 struct via_info *via = ch->parent;
355 snd_mtxlock(via->lock);
358 via_wr(via, ch->base, sgd_addr, 4);
359 via_wr(via, ch->ctrl, VIA_RPCTRL_START, 1);
361 via_wr(via, ch->ctrl, VIA_RPCTRL_TERMINATE, 1);
362 snd_mtxunlock(via->lock);
372 struct via_info *via = ch->parent;
378 snd_mtxlock(via->lock);
379 base1 = via_rd(via, ch->base, 4);
380 len = via_rd(via, ch->count, 4);
381 base = via_rd(via, ch->base, 4);
383 len = via_rd(via, ch->count, 4);
384 snd_mtxunlock(via->lock);
411 struct via_info *via = ch->parent;
413 return (via->codec_caps & AC97_EXTCAP_VRA)? &via_vracaps : &via_caps;
433 struct via_info *via = p;
437 snd_mtxlock(via->lock);
438 if (via_rd(via, VIA_PLAY_STAT, 1) & VIA_RPSTAT_INTR) {
439 via_wr(via, VIA_PLAY_STAT, VIA_RPSTAT_INTR, 1);
440 snd_mtxunlock(via->lock);
441 chn_intr(via->pch.channel);
442 snd_mtxlock(via->lock);
446 if (via_rd(via, VIA_RECORD_STAT, 1) & VIA_RPSTAT_INTR) {
447 via_wr(via, VIA_RECORD_STAT, VIA_RPSTAT_INTR, 1);
448 snd_mtxunlock(via->lock);
449 chn_intr(via->rch.channel);
452 snd_mtxunlock(via->lock);
472 struct via_info *via = (struct via_info *)p;
473 via->sgd_addr = bds->ds_addr;
480 struct via_info *via = NULL;
484 via = malloc(sizeof(*via), M_DEVBUF, M_WAITOK | M_ZERO);
485 via->lock = snd_mtxcreate(device_get_nameunit(dev),
521 via->regid = PCIR_BAR(0);
522 via->reg = bus_alloc_resource_any(dev, SYS_RES_IOPORT,
523 &via->regid, RF_ACTIVE);
524 if (!via->reg) {
528 via->st = rman_get_bustag(via->reg);
529 via->sh = rman_get_bushandle(via->reg);
531 via->bufsz = pcm_getbuffersize(dev, 4096, VIA_DEFAULT_BUFSZ, 65536);
533 via->irqid = 0;
534 via->irq = bus_alloc_resource_any(dev, SYS_RES_IRQ, &via->irqid,
536 if (!via->irq || snd_setup_intr(dev, via->irq, INTR_MPSAFE, via_intr, via, &via->ih)) {
541 via_wr(via, VIA_PLAY_MODE, VIA_RPMODE_AUTOSTART | VIA_RPMODE_INTR_FLAG | VIA_RPMODE_INTR_EOL, 1);
542 via_wr(via, VIA_RECORD_MODE, VIA_RPMODE_AUTOSTART | VIA_RPMODE_INTR_FLAG | VIA_RPMODE_INTR_EOL, 1);
544 via->codec = AC97_CREATE(dev, via, via_ac97);
545 if (!via->codec)
548 if (mixer_init(dev, ac97_getmixerclass(), via->codec))
551 via->codec_caps = ac97_getextcaps(via->codec);
552 ac97_setextmode(via->codec,
553 via->codec_caps & (AC97_EXTCAP_VRA | AC97_EXTCAP_VRM));
561 /*maxsize*/via->bufsz, /*nsegments*/1, /*maxsegz*/0x3ffff,
563 /*lockarg*/NULL, &via->parent_dmat) != 0) {
581 /*lockarg*/NULL, &via->sgd_dmat) != 0) {
586 if (bus_dmamem_alloc(via->sgd_dmat, (void **)&via->sgd_table,
587 BUS_DMA_NOWAIT, &via->sgd_dmamap) != 0)
589 if (bus_dmamap_load(via->sgd_dmat, via->sgd_dmamap, via->sgd_table,
590 NSEGS * sizeof(struct via_dma_op), dma_cb, via, 0) != 0)
594 rman_get_start(via->reg), rman_get_start(via->irq),
598 if (pcm_register(dev, via, 1, 1)) goto bad;
599 pcm_addchan(dev, PCMDIR_PLAY, &viachan_class, via);
600 pcm_addchan(dev, PCMDIR_REC, &viachan_class, via);
604 if (via->codec) ac97_destroy(via->codec);
605 if (via->reg) bus_release_resource(dev, SYS_RES_IOPORT, via->regid, via->reg);
606 if (via->ih) bus_teardown_intr(dev, via->irq, via->ih);
607 if (via->irq) bus_release_resource(dev, SYS_RES_IRQ, via->irqid, via->irq);
608 if (via->parent_dmat) bus_dma_tag_destroy(via->parent_dmat);
609 if (via->sgd_addr) bus_dmamap_unload(via->sgd_dmat, via->sgd_dmamap);
610 if (via->sgd_table) bus_dmamem_free(via->sgd_dmat, via->sgd_table, via->sgd_dmamap);
611 if (via->sgd_dmat) bus_dma_tag_destroy(via->sgd_dmat);
612 if (via->lock) snd_mtxfree(via->lock);
613 if (via) free(via, M_DEVBUF);
621 struct via_info *via = NULL;
627 via = pcm_getdevinfo(dev);
628 bus_release_resource(dev, SYS_RES_IOPORT, via->regid, via->reg);
629 bus_teardown_intr(dev, via->irq, via->ih);
630 bus_release_resource(dev, SYS_RES_IRQ, via->irqid, via->irq);
631 bus_dma_tag_destroy(via->parent_dmat);
632 bus_dmamap_unload(via->sgd_dmat, via->sgd_dmamap);
633 bus_dmamem_free(via->sgd_dmat, via->sgd_table, via->sgd_dmamap);
634 bus_dma_tag_destroy(via->sgd_dmat);
635 snd_mtxfree(via->lock);
636 free(via, M_DEVBUF);