Lines Matching full:via

107 via_rd(struct via_info *via, int regno, int size)  in via_rd()  argument
112 return bus_space_read_1(via->st, via->sh, regno); in via_rd()
114 return bus_space_read_2(via->st, via->sh, regno); in via_rd()
116 return bus_space_read_4(via->st, via->sh, regno); in via_rd()
123 via_wr(struct via_info *via, int regno, u_int32_t data, int size) in via_wr() argument
128 bus_space_write_1(via->st, via->sh, regno, data); in via_wr()
131 bus_space_write_2(via->st, via->sh, regno, data); in via_wr()
134 bus_space_write_4(via->st, via->sh, regno, data); in via_wr()
143 via_waitready_codec(struct via_info *via) in via_waitready_codec() argument
149 (via_rd(via, VIA_CODEC_CTL, 4) & VIA_CODEC_BUSY); i++) in via_waitready_codec()
152 printf("via: codec busy\n"); in via_waitready_codec()
160 via_waitvalid_codec(struct via_info *via) in via_waitvalid_codec() argument
166 !(via_rd(via, VIA_CODEC_CTL, 4) & VIA_CODEC_PRIVALID); i++) in via_waitvalid_codec()
169 printf("via: codec invalid\n"); in via_waitvalid_codec()
179 struct via_info *via = addr; in via_write_codec() local
181 if (via_waitready_codec(via)) return -1; in via_write_codec()
183 via_wr(via, VIA_CODEC_CTL, VIA_CODEC_PRIVALID | VIA_CODEC_INDEX(reg) | val, 4); in via_write_codec()
191 struct via_info *via = addr; in via_read_codec() local
193 if (via_waitready_codec(via)) in via_read_codec()
196 via_wr(via, VIA_CODEC_CTL, VIA_CODEC_PRIVALID | VIA_CODEC_READ | VIA_CODEC_INDEX(reg),4); in via_read_codec()
198 if (via_waitready_codec(via)) in via_read_codec()
201 if (via_waitvalid_codec(via)) in via_read_codec()
204 return via_rd(via, VIA_CODEC_CTL, 2); in via_read_codec()
245 struct via_info *via = devinfo; in viachan_init() local
248 snd_mtxlock(via->lock); in viachan_init()
250 ch = &via->pch; in viachan_init()
255 ch->sgd_addr = via->sgd_addr; in viachan_init()
256 ch->sgd_table = &via->sgd_table[0]; in viachan_init()
258 ch = &via->rch; in viachan_init()
263 ch->sgd_addr = via->sgd_addr + sizeof(struct via_dma_op) * SEGS_PER_CHAN; in viachan_init()
264 ch->sgd_table = &via->sgd_table[SEGS_PER_CHAN]; in viachan_init()
267 ch->parent = via; in viachan_init()
271 snd_mtxunlock(via->lock); in viachan_init()
273 if (sndbuf_alloc(ch->buffer, via->parent_dmat, 0, via->bufsz) != 0) in viachan_init()
283 struct via_info *via = ch->parent; in viachan_setformat() local
293 snd_mtxlock(via->lock); in viachan_setformat()
294 mode = via_rd(via, ch->mode, 1); in viachan_setformat()
297 via_wr(via, ch->mode, mode, 1); in viachan_setformat()
298 snd_mtxunlock(via->lock); in viachan_setformat()
307 struct via_info *via = ch->parent; in viachan_setspeed() local
319 if (via->codec_caps & AC97_EXTCAP_VRA) { in viachan_setspeed()
321 return ac97_setrate(via->codec, reg, speed); in viachan_setspeed()
341 struct via_info *via = ch->parent; in viachan_trigger() local
349 snd_mtxlock(via->lock); in viachan_trigger()
352 via_wr(via, ch->base, sgd_addr, 4); in viachan_trigger()
353 via_wr(via, ch->ctrl, VIA_RPCTRL_START, 1); in viachan_trigger()
355 via_wr(via, ch->ctrl, VIA_RPCTRL_TERMINATE, 1); in viachan_trigger()
356 snd_mtxunlock(via->lock); in viachan_trigger()
366 struct via_info *via = ch->parent; in viachan_getptr() local
370 snd_mtxlock(via->lock); in viachan_getptr()
371 base1 = via_rd(via, ch->base, 4); in viachan_getptr()
372 len = via_rd(via, ch->count, 4); in viachan_getptr()
373 base = via_rd(via, ch->base, 4); in viachan_getptr()
375 len = via_rd(via, ch->count, 4); in viachan_getptr()
376 snd_mtxunlock(via->lock); in viachan_getptr()
403 struct via_info *via = ch->parent; in viachan_getcaps() local
405 return (via->codec_caps & AC97_EXTCAP_VRA)? &via_vracaps : &via_caps; in viachan_getcaps()
425 struct via_info *via = p; in via_intr() local
429 snd_mtxlock(via->lock); in via_intr()
430 if (via_rd(via, VIA_PLAY_STAT, 1) & VIA_RPSTAT_INTR) { in via_intr()
431 via_wr(via, VIA_PLAY_STAT, VIA_RPSTAT_INTR, 1); in via_intr()
432 snd_mtxunlock(via->lock); in via_intr()
433 chn_intr(via->pch.channel); in via_intr()
434 snd_mtxlock(via->lock); in via_intr()
438 if (via_rd(via, VIA_RECORD_STAT, 1) & VIA_RPSTAT_INTR) { in via_intr()
439 via_wr(via, VIA_RECORD_STAT, VIA_RPSTAT_INTR, 1); in via_intr()
440 snd_mtxunlock(via->lock); in via_intr()
441 chn_intr(via->rch.channel); in via_intr()
444 snd_mtxunlock(via->lock); in via_intr()
454 device_set_desc(dev, "VIA VT82C686A"); in via_probe()
463 struct via_info *via = (struct via_info *)p; in dma_cb() local
464 via->sgd_addr = bds->ds_addr; in dma_cb()
470 struct via_info *via = NULL; in via_attach() local
474 via = malloc(sizeof(*via), M_DEVBUF, M_WAITOK | M_ZERO); in via_attach()
475 via->lock = snd_mtxcreate(device_get_nameunit(dev), in via_attach()
511 via->regid = PCIR_BAR(0); in via_attach()
512 via->reg = bus_alloc_resource_any(dev, SYS_RES_IOPORT, in via_attach()
513 &via->regid, RF_ACTIVE); in via_attach()
514 if (!via->reg) { in via_attach()
518 via->st = rman_get_bustag(via->reg); in via_attach()
519 via->sh = rman_get_bushandle(via->reg); in via_attach()
521 via->bufsz = pcm_getbuffersize(dev, 4096, VIA_DEFAULT_BUFSZ, 65536); in via_attach()
523 via->irqid = 0; in via_attach()
524 via->irq = bus_alloc_resource_any(dev, SYS_RES_IRQ, &via->irqid, in via_attach()
526 if (!via->irq || snd_setup_intr(dev, via->irq, INTR_MPSAFE, via_intr, via, &via->ih)) { in via_attach()
531 via_wr(via, VIA_PLAY_MODE, VIA_RPMODE_AUTOSTART | VIA_RPMODE_INTR_FLAG | VIA_RPMODE_INTR_EOL, 1); in via_attach()
532 via_wr(via, VIA_RECORD_MODE, VIA_RPMODE_AUTOSTART | VIA_RPMODE_INTR_FLAG | VIA_RPMODE_INTR_EOL, 1); in via_attach()
534 via->codec = AC97_CREATE(dev, via, via_ac97); in via_attach()
535 if (!via->codec) in via_attach()
538 if (mixer_init(dev, ac97_getmixerclass(), via->codec)) in via_attach()
541 via->codec_caps = ac97_getextcaps(via->codec); in via_attach()
542 ac97_setextmode(via->codec, in via_attach()
543 via->codec_caps & (AC97_EXTCAP_VRA | AC97_EXTCAP_VRM)); in via_attach()
551 /*maxsize*/via->bufsz, /*nsegments*/1, /*maxsegz*/0x3ffff, in via_attach()
553 /*lockarg*/NULL, &via->parent_dmat) != 0) { in via_attach()
571 /*lockarg*/NULL, &via->sgd_dmat) != 0) { in via_attach()
576 if (bus_dmamem_alloc(via->sgd_dmat, (void **)&via->sgd_table, in via_attach()
577 BUS_DMA_NOWAIT, &via->sgd_dmamap) != 0) in via_attach()
579 if (bus_dmamap_load(via->sgd_dmat, via->sgd_dmamap, via->sgd_table, in via_attach()
580 NSEGS * sizeof(struct via_dma_op), dma_cb, via, 0) != 0) in via_attach()
584 rman_get_start(via->reg), rman_get_start(via->irq), in via_attach()
588 pcm_init(dev, via); in via_attach()
589 pcm_addchan(dev, PCMDIR_PLAY, &viachan_class, via); in via_attach()
590 pcm_addchan(dev, PCMDIR_REC, &viachan_class, via); in via_attach()
595 if (via->codec) ac97_destroy(via->codec); in via_attach()
596 if (via->reg) bus_release_resource(dev, SYS_RES_IOPORT, via->regid, via->reg); in via_attach()
597 if (via->ih) bus_teardown_intr(dev, via->irq, via->ih); in via_attach()
598 if (via->irq) bus_release_resource(dev, SYS_RES_IRQ, via->irqid, via->irq); in via_attach()
599 if (via->parent_dmat) bus_dma_tag_destroy(via->parent_dmat); in via_attach()
600 if (via->sgd_addr) bus_dmamap_unload(via->sgd_dmat, via->sgd_dmamap); in via_attach()
601 if (via->sgd_table) bus_dmamem_free(via->sgd_dmat, via->sgd_table, via->sgd_dmamap); in via_attach()
602 if (via->sgd_dmat) bus_dma_tag_destroy(via->sgd_dmat); in via_attach()
603 if (via->lock) snd_mtxfree(via->lock); in via_attach()
604 if (via) free(via, M_DEVBUF); in via_attach()
612 struct via_info *via = NULL; in via_detach() local
618 via = pcm_getdevinfo(dev); in via_detach()
619 bus_release_resource(dev, SYS_RES_IOPORT, via->regid, via->reg); in via_detach()
620 bus_teardown_intr(dev, via->irq, via->ih); in via_detach()
621 bus_release_resource(dev, SYS_RES_IRQ, via->irqid, via->irq); in via_detach()
622 bus_dma_tag_destroy(via->parent_dmat); in via_detach()
623 bus_dmamap_unload(via->sgd_dmat, via->sgd_dmamap); in via_detach()
624 bus_dmamem_free(via->sgd_dmat, via->sgd_table, via->sgd_dmamap); in via_detach()
625 bus_dma_tag_destroy(via->sgd_dmat); in via_detach()
626 snd_mtxfree(via->lock); in via_detach()
627 free(via, M_DEVBUF); in via_detach()