Lines Matching +full:4 +full:- +full:ch
1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause
38 #include <dev/sound/pci/neomagic-coeff.h>
43 /* -------------------------------------------------------------------- */
78 /* -------------------------------------------------------------------- */
86 static int nm_setch(struct sc_chinfo *ch);
117 /* -------------------------------------------------------------------- */
128 /* -------------------------------------------------------------------- */
134 bus_space_tag_t st = rman_get_bustag(sc->reg); in nm_rd()
135 bus_space_handle_t sh = rman_get_bushandle(sc->reg); in nm_rd()
142 case 4: in nm_rd()
152 bus_space_tag_t st = rman_get_bustag(sc->reg); in nm_wr()
153 bus_space_handle_t sh = rman_get_bushandle(sc->reg); in nm_wr()
162 case 4: in nm_wr()
171 bus_space_tag_t st = rman_get_bustag(sc->buf); in nm_rdbuf()
172 bus_space_handle_t sh = rman_get_bushandle(sc->buf); in nm_rdbuf()
179 case 4: in nm_rdbuf()
189 bus_space_tag_t st = rman_get_bustag(sc->buf); in nm_wrbuf()
190 bus_space_handle_t sh = rman_get_bushandle(sc->buf); in nm_wrbuf()
199 case 4: in nm_wrbuf()
205 /* -------------------------------------------------------------------- */
213 while (cnt-- > 0) { in nm_waitcd()
214 if (nm_rd(sc, sc->ac97_status, 2) & sc->ac97_busy) { in nm_waitcd()
232 * The following code-line may cause a hang for some chipsets, see in nm_initcd()
235 * conditionize the code-line based upon the specific version of in nm_initcd()
252 x = nm_rd(sc, sc->ac97_base + regno, 2); in nm_rdcd()
256 device_printf(sc->dev, "ac97 codec not ready\n"); in nm_rdcd()
257 return -1; in nm_rdcd()
268 while (cnt-- > 0) { in nm_wrcd()
269 nm_wr(sc, sc->ac97_base + regno, data, 2); in nm_wrcd()
276 device_printf(sc->dev, "ac97 codec not ready\n"); in nm_wrcd()
277 return -1; in nm_wrcd()
288 /* -------------------------------------------------------------------- */
293 if (sc->type == NM256AV_PCI_ID) { in nm_ackint()
295 } else if (sc->type == NM256ZX_PCI_ID) { in nm_ackint()
296 nm_wr(sc, NM_INT_REG, num, 4); in nm_ackint()
311 while (num-- > 0) in nm_loadcoeff()
314 nm_wrbuf(sc, sc->cbuf + i, coefficients[ofs + i], 1); in nm_loadcoeff()
315 nm_wr(sc, addr, sc->cbuf, 4); in nm_loadcoeff()
317 sz--; in nm_loadcoeff()
318 nm_wr(sc, addr + 4, sc->cbuf + sz, 4); in nm_loadcoeff()
323 nm_setch(struct sc_chinfo *ch) in nm_setch() argument
325 struct sc_info *sc = ch->parent; in nm_setch()
330 if (ch->spd < (samplerates[x] + samplerates[x + 1]) / 2) in nm_setch()
335 ch->spd = samplerates[x]; in nm_setch()
336 nm_loadcoeff(sc, ch->dir, x); in nm_setch()
338 x <<= 4; in nm_setch()
340 if (ch->fmt & AFMT_16BIT) x |= NM_RATE_BITS_16; in nm_setch()
341 if (AFMT_CHANNEL(ch->fmt) > 1) x |= NM_RATE_STEREO; in nm_setch()
343 base = (ch->dir == PCMDIR_PLAY)? NM_PLAYBACK_REG_OFFSET : NM_RECORD_REG_OFFSET; in nm_setch()
353 struct sc_chinfo *ch; in nmchan_init() local
356 chnbuf = (dir == PCMDIR_PLAY)? sc->pbuf : sc->rbuf; in nmchan_init()
357 ch = (dir == PCMDIR_PLAY)? &sc->pch : &sc->rch; in nmchan_init()
358 ch->active = 0; in nmchan_init()
359 ch->blksize = 0; in nmchan_init()
360 ch->wmark = 0; in nmchan_init()
361 ch->buffer = b; in nmchan_init()
362 sndbuf_setup(ch->buffer, (u_int8_t *)rman_get_virtual(sc->buf) + chnbuf, NM_BUFFSIZE); in nmchan_init()
364 device_printf(sc->dev, "%s buf %p\n", (dir == PCMDIR_PLAY)? in nmchan_init()
365 "play" : "rec", sndbuf_getbuf(ch->buffer)); in nmchan_init()
366 ch->parent = sc; in nmchan_init()
367 ch->channel = c; in nmchan_init()
368 ch->dir = dir; in nmchan_init()
369 return ch; in nmchan_init()
381 struct sc_chinfo *ch = data; in nmchan_setformat() local
383 ch->fmt = format; in nmchan_setformat()
384 return nm_setch(ch); in nmchan_setformat()
390 struct sc_chinfo *ch = data; in nmchan_setspeed() local
392 ch->spd = speed; in nmchan_setspeed()
393 return nm_setch(ch)? 0 : ch->spd; in nmchan_setspeed()
399 struct sc_chinfo *ch = data; in nmchan_setblocksize() local
401 ch->blksize = blocksize; in nmchan_setblocksize()
409 struct sc_chinfo *ch = data; in nmchan_trigger() local
410 struct sc_info *sc = ch->parent; in nmchan_trigger()
416 ssz = (ch->fmt & AFMT_16BIT)? 2 : 1; in nmchan_trigger()
417 if (AFMT_CHANNEL(ch->fmt) > 1) in nmchan_trigger()
420 if (ch->dir == PCMDIR_PLAY) { in nmchan_trigger()
422 ch->active = 1; in nmchan_trigger()
423 ch->wmark = ch->blksize; in nmchan_trigger()
424 nm_wr(sc, NM_PBUFFER_START, sc->pbuf, 4); in nmchan_trigger()
425 nm_wr(sc, NM_PBUFFER_END, sc->pbuf + NM_BUFFSIZE - ssz, 4); in nmchan_trigger()
426 nm_wr(sc, NM_PBUFFER_CURRP, sc->pbuf, 4); in nmchan_trigger()
427 nm_wr(sc, NM_PBUFFER_WMARK, sc->pbuf + ch->wmark, 4); in nmchan_trigger()
432 ch->active = 0; in nmchan_trigger()
438 ch->active = 1; in nmchan_trigger()
439 ch->wmark = ch->blksize; in nmchan_trigger()
442 nm_wr(sc, NM_RBUFFER_START, sc->rbuf, 4); in nmchan_trigger()
443 nm_wr(sc, NM_RBUFFER_END, sc->rbuf + NM_BUFFSIZE, 4); in nmchan_trigger()
444 nm_wr(sc, NM_RBUFFER_CURRP, sc->rbuf, 4); in nmchan_trigger()
445 nm_wr(sc, NM_RBUFFER_WMARK, sc->rbuf + ch->wmark, 4); in nmchan_trigger()
447 ch->active = 0; in nmchan_trigger()
457 struct sc_chinfo *ch = data; in nmchan_getptr() local
458 struct sc_info *sc = ch->parent; in nmchan_getptr()
460 if (ch->dir == PCMDIR_PLAY) in nmchan_getptr()
461 return nm_rd(sc, NM_PBUFFER_CURRP, 4) - sc->pbuf; in nmchan_getptr()
463 return nm_rd(sc, NM_RBUFFER_CURRP, 4) - sc->rbuf; in nmchan_getptr()
492 status = nm_rd(sc, NM_INT_REG, sc->irsz); in nm_intr()
496 if (status & sc->playint) { in nm_intr()
497 status &= ~sc->playint; in nm_intr()
498 sc->pch.wmark += sc->pch.blksize; in nm_intr()
499 sc->pch.wmark %= NM_BUFFSIZE; in nm_intr()
500 nm_wr(sc, NM_PBUFFER_WMARK, sc->pbuf + sc->pch.wmark, 4); in nm_intr()
502 nm_ackint(sc, sc->playint); in nm_intr()
503 chn_intr(sc->pch.channel); in nm_intr()
505 if (status & sc->recint) { in nm_intr()
506 status &= ~sc->recint; in nm_intr()
507 sc->rch.wmark += sc->rch.blksize; in nm_intr()
508 sc->rch.wmark %= NM_BUFFSIZE; in nm_intr()
509 nm_wr(sc, NM_RBUFFER_WMARK, sc->rbuf + sc->rch.wmark, 4); in nm_intr()
511 nm_ackint(sc, sc->recint); in nm_intr()
512 chn_intr(sc->rch.channel); in nm_intr()
514 if (status & sc->misc1int) { in nm_intr()
515 status &= ~sc->misc1int; in nm_intr()
516 nm_ackint(sc, sc->misc1int); in nm_intr()
519 device_printf(sc->dev, "misc int 1\n"); in nm_intr()
521 if (status & sc->misc2int) { in nm_intr()
522 status &= ~sc->misc2int; in nm_intr()
523 nm_ackint(sc, sc->misc2int); in nm_intr()
526 device_printf(sc->dev, "misc int 2\n"); in nm_intr()
530 device_printf(sc->dev, "unknown int\n"); in nm_intr()
534 /* -------------------------------------------------------------------- */
545 if (sc->type == NM256AV_PCI_ID) { in nm_init()
546 sc->ac97_base = NM_MIXER_OFFSET; in nm_init()
547 sc->ac97_status = NM_MIXER_STATUS_OFFSET; in nm_init()
548 sc->ac97_busy = NM_MIXER_READY_MASK; in nm_init()
550 sc->buftop = 2560 * 1024; in nm_init()
552 sc->irsz = 2; in nm_init()
553 sc->playint = NM_PLAYBACK_INT; in nm_init()
554 sc->recint = NM_RECORD_INT; in nm_init()
555 sc->misc1int = NM_MISC_INT_1; in nm_init()
556 sc->misc2int = NM_MISC_INT_2; in nm_init()
557 } else if (sc->type == NM256ZX_PCI_ID) { in nm_init()
558 sc->ac97_base = NM_MIXER_OFFSET; in nm_init()
559 sc->ac97_status = NM2_MIXER_STATUS_OFFSET; in nm_init()
560 sc->ac97_busy = NM2_MIXER_READY_MASK; in nm_init()
562 sc->buftop = (nm_rd(sc, 0xa0b, 2)? 6144 : 4096) * 1024; in nm_init()
564 sc->irsz = 4; in nm_init()
565 sc->playint = NM2_PLAYBACK_INT; in nm_init()
566 sc->recint = NM2_RECORD_INT; in nm_init()
567 sc->misc1int = NM2_MISC_INT_1; in nm_init()
568 sc->misc2int = NM2_MISC_INT_2; in nm_init()
569 } else return -1; in nm_init()
570 sc->badintr = 0; in nm_init()
571 ofs = sc->buftop - 0x0400; in nm_init()
572 sc->buftop -= 0x1400; in nm_init()
575 device_printf(sc->dev, "buftop is 0x%08x\n", sc->buftop); in nm_init()
576 if ((nm_rdbuf(sc, ofs, 4) & NM_SIG_MASK) == NM_SIGNATURE) { in nm_init()
577 i = nm_rdbuf(sc, ofs + 4, 4); in nm_init()
580 device_printf(sc->dev, "buftop is changed to 0x%08x\n", i); in nm_init()
581 sc->buftop = i; in nm_init()
585 sc->cbuf = sc->buftop - NM_MAX_COEFFICIENT; in nm_init()
586 sc->rbuf = sc->cbuf - NM_BUFFSIZE; in nm_init()
587 sc->pbuf = sc->rbuf - NM_BUFFSIZE; in nm_init()
588 sc->acbuf = sc->pbuf - (NM_TOTAL_COEFF_COUNT * 4); in nm_init()
611 /* Try to catch other non-ac97 cards */ in nm_pci_probe()
619 sc->regid = PCIR_BAR(1); in nm_pci_probe()
620 sc->reg = bus_alloc_resource_any(dev, SYS_RES_MEMORY, in nm_pci_probe()
621 &sc->regid, in nm_pci_probe()
624 if (!sc->reg) { in nm_pci_probe()
631 * My Panasonic CF-M2EV needs resetting device in nm_pci_probe()
638 i = 0; /* non-ac97 card, but not listed */ in nm_pci_probe()
639 DEB(device_printf(dev, "subdev = 0x%x - badcard?\n", in nm_pci_probe()
642 bus_release_resource(dev, SYS_RES_MEMORY, sc->regid, in nm_pci_probe()
643 sc->reg); in nm_pci_probe()
650 DEB(device_printf(dev, "this is a non-ac97 NM256AV, not attaching\n")); in nm_pci_probe()
671 sc->dev = dev; in nm_pci_attach()
672 sc->type = pci_get_devid(dev); in nm_pci_attach()
676 sc->bufid = PCIR_BAR(0); in nm_pci_attach()
677 sc->buf = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &sc->bufid, in nm_pci_attach()
679 sc->regid = PCIR_BAR(1); in nm_pci_attach()
680 sc->reg = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &sc->regid, in nm_pci_attach()
683 if (!sc->buf || !sc->reg) { in nm_pci_attach()
688 if (nm_init(sc) == -1) { in nm_pci_attach()
695 if (mixer_init(dev, ac97_getmixerclass(), codec) == -1) goto bad; in nm_pci_attach()
697 sc->irqid = 0; in nm_pci_attach()
698 sc->irq = bus_alloc_resource_any(dev, SYS_RES_IRQ, &sc->irqid, in nm_pci_attach()
700 if (!sc->irq || snd_setup_intr(dev, sc->irq, 0, nm_intr, sc, &sc->ih)) { in nm_pci_attach()
706 rman_get_start(sc->buf), rman_get_start(sc->reg), in nm_pci_attach()
707 rman_get_start(sc->irq), in nm_pci_attach()
720 if (sc->buf) bus_release_resource(dev, SYS_RES_MEMORY, sc->bufid, sc->buf); in nm_pci_attach()
721 if (sc->reg) bus_release_resource(dev, SYS_RES_MEMORY, sc->regid, sc->reg); in nm_pci_attach()
722 if (sc->ih) bus_teardown_intr(dev, sc->irq, sc->ih); in nm_pci_attach()
723 if (sc->irq) bus_release_resource(dev, SYS_RES_IRQ, sc->irqid, sc->irq); in nm_pci_attach()
739 bus_release_resource(dev, SYS_RES_MEMORY, sc->bufid, sc->buf); in nm_pci_detach()
740 bus_release_resource(dev, SYS_RES_MEMORY, sc->regid, sc->reg); in nm_pci_detach()
741 bus_teardown_intr(dev, sc->irq, sc->ih); in nm_pci_detach()
742 bus_release_resource(dev, SYS_RES_IRQ, sc->irqid, sc->irq); in nm_pci_detach()
756 if (sc->pch.active) { in nm_pci_suspend()
761 if (sc->rch.active) { in nm_pci_suspend()
786 if (mixer_reinit(dev) == -1) { in nm_pci_resume()
791 if (sc->pch.active) { in nm_pci_resume()
797 if (sc->rch.active) { in nm_pci_resume()