Lines Matching +full:current +full:- +full:boost +full:- +full:limit

1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause
9 * Copyright (c) 1996-1998 Crystal Semiconductor Corp.
80 /* -------------------------------------------------------------------- */
118 /* -------------------------------------------------------------------- */
125 old = csa->active;
126 csa->active += run;
128 if ((csa->active > 1) || (csa->active < -1))
129 csa->active = 0;
130 if (csa->card->active)
131 return (csa->card->active(!(csa->active && old)));
136 /* -------------------------------------------------------------------- */
146 if (csa_readcodec(&csa->res, regno + BA0_AC97_RESET, &data))
148 csa_active(csa, -1);
159 csa_writecodec(&csa->res, regno + BA0_AC97_RESET, data);
160 csa_active(csa, -1);
188 * ulCorrectionPerGOF = floor((Fs,in * 2^26 - Fs,out * ulPhiIncr) /
190 * ulCorrectionPerSec = Fs,in * 2^26 - Fs,out * phiIncr -
201 ulTemp1 -= ulPhiIncr * ulOutRate;
206 ulTemp1 -= ulTemp2 * ulOutRate;
208 ulTemp1 -= ulCorrectionPerGOF * GOF_PER_SEC;
230 * Return an error if an attempt is made to stray outside that limit.
237 * Return an error if an attempt is made to stray outside that limit.
247 * ulCoeffIncr = -floor((Fs,out * 2^23) / Fs,in)
249 * ulCorrectionPerGOF = floor((Fs,in * 2^26 - Fs,out * ulPhiIncr) /
251 * ulCorrectionPerSec = Fs,in * 2^26 - Fs,out * phiIncr -
261 * ulInitialDelay = dividend(((24 * Fs,in) + Fs,out - 1) / Fs,out)
265 ulTemp1 -= ulCoeffIncr * ulInRate;
273 ulTemp1 -= ulPhiIncr * ulOutRate;
278 ulTemp1 -= ulTemp2 * ulOutRate;
280 ulTemp1 -= ulCorrectionPerGOF * GOF_PER_SEC;
282 ulInitialDelay = ((ulInRate * 24) + ulOutRate - 1) / ulOutRate;
338 if (!csa->pch.dma) {
339 resp = &csa->res;
342 csa_writemem(resp, BA1_PCTL, ul | csa->pctl);
344 csa->pch.dma = 1;
354 if (!csa->rch.dma) {
355 resp = &csa->res;
358 csa_writemem(resp, BA1_CCTL, ul | csa->cctl);
360 csa->rch.dma = 1;
370 if (csa->pch.dma) {
371 resp = &csa->res;
373 csa->pctl = ul & 0xffff0000;
376 csa->pch.dma = 0;
384 if (!csa->rch.dma) {
397 if (csa->rch.dma) {
398 resp = &csa->res;
400 csa->cctl = ul & 0x0000ffff;
403 csa->rch.dma = 0;
411 if (!csa->pch.dma) {
446 * Fetch the current value of the SP status register.
480 struct csa_info *csa = ch->parent;
481 csa_res *resp = &csa->res;
484 if (ch->dir == PCMDIR_PLAY) {
486 csa_writemem(resp, BA1_PBA, sndbuf_getbufaddr(ch->buffer));
489 csa->pfie = csa_readmem(resp, BA1_PFIE) & ~0x0000f03f;
490 if (!(ch->fmt & AFMT_SIGNED))
491 csa->pfie |= 0x8000;
492 if (ch->fmt & AFMT_BIGENDIAN)
493 csa->pfie |= 0x4000;
494 if (AFMT_CHANNEL(ch->fmt) < 2)
495 csa->pfie |= 0x2000;
496 if (ch->fmt & AFMT_8BIT)
497 csa->pfie |= 0x1000;
498 csa_writemem(resp, BA1_PFIE, csa->pfie);
501 if (ch->fmt & AFMT_16BIT)
503 if (AFMT_CHANNEL(ch->fmt) > 1)
505 tmp--;
512 csa_setplaysamplerate(resp, ch->spd);
513 } else if (ch->dir == PCMDIR_REC) {
515 csa_writemem(resp, BA1_CBA, sndbuf_getbufaddr(ch->buffer));
521 csa_setcapturesamplerate(resp, ch->spd);
526 /* -------------------------------------------------------------------- */
533 struct csa_chinfo *ch = (dir == PCMDIR_PLAY)? &csa->pch : &csa->rch;
535 ch->parent = csa;
536 ch->channel = c;
537 ch->buffer = b;
538 ch->dir = dir;
539 if (sndbuf_alloc(ch->buffer, csa->parent_dmat, 0, CS461x_BUFFSIZE) != 0)
549 ch->fmt = format;
558 ch->spd = speed;
559 return ch->spd; /* XXX calc real speed */
572 struct csa_info *csa = ch->parent;
580 if (ch->dir == PCMDIR_PLAY)
585 if (ch->dir == PCMDIR_PLAY)
589 csa_active(csa, -1);
598 struct csa_info *csa = ch->parent;
602 resp = &csa->res;
604 if (ch->dir == PCMDIR_PLAY) {
605 ptr = csa_readmem(resp, BA1_PBA) - sndbuf_getbufaddr(ch->buffer);
606 if ((ch->fmt & AFMT_U8) != 0 || (ch->fmt & AFMT_S8) != 0)
609 ptr = csa_readmem(resp, BA1_CBA) - sndbuf_getbufaddr(ch->buffer);
610 if ((ch->fmt & AFMT_U8) != 0 || (ch->fmt & AFMT_S8) != 0)
621 return (ch->dir == PCMDIR_PLAY)? &csa_playcaps : &csa_reccaps;
636 /* -------------------------------------------------------------------- */
643 if ((csa->binfo->hisr & HISR_VC0) != 0)
644 chn_intr(csa->pch.channel);
645 if ((csa->binfo->hisr & HISR_VC1) != 0)
646 chn_intr(csa->rch.channel);
649 /* -------------------------------------------------------------------- */
660 resp = &csa->res;
662 csa->pfie = 0;
690 resp = &csa->res;
691 if (resp->io == NULL) {
692 resp->io = bus_alloc_resource_any(dev, SYS_RES_MEMORY,
693 &resp->io_rid, RF_ACTIVE);
694 if (resp->io == NULL)
697 if (resp->mem == NULL) {
698 resp->mem = bus_alloc_resource_any(dev, SYS_RES_MEMORY,
699 &resp->mem_rid, RF_ACTIVE);
700 if (resp->mem == NULL)
703 if (resp->irq == NULL) {
704 resp->irq = bus_alloc_resource_any(dev, SYS_RES_IRQ,
705 &resp->irq_rid, RF_ACTIVE | RF_SHAREABLE);
706 if (resp->irq == NULL)
717 &csa->parent_dmat) != 0)
731 resp = &csa->res;
732 if (resp->irq != NULL) {
733 if (csa->ih)
734 bus_teardown_intr(dev, resp->irq, csa->ih);
735 bus_release_resource(dev, SYS_RES_IRQ, resp->irq_rid, resp->irq);
736 resp->irq = NULL;
738 if (resp->io != NULL) {
739 bus_release_resource(dev, SYS_RES_MEMORY, resp->io_rid, resp->io);
740 resp->io = NULL;
742 if (resp->mem != NULL) {
743 bus_release_resource(dev, SYS_RES_MEMORY, resp->mem_rid, resp->mem);
744 resp->mem = NULL;
746 if (csa->parent_dmat != NULL) {
747 bus_dma_tag_destroy(csa->parent_dmat);
748 csa->parent_dmat = NULL;
763 if (func == NULL || func->func != SCF_PCM)
783 csa->binfo = func->varinfo;
786 * PCTL and CCTL can be stored into csa->pctl and csa->cctl,
789 csa->pch.dma = csa->rch.dma = 1;
790 csa->active = 0;
791 csa->card = csa->binfo->card;
794 resp = &csa->res;
795 resp->io_rid = PCIR_BAR(0);
796 resp->mem_rid = PCIR_BAR(1);
797 resp->irq_rid = 0;
813 if (csa->card->inv_eapd)
815 if (mixer_init(dev, ac97_getmixerclass(), codec) == -1) {
822 rman_get_start(resp->irq),
826 if (snd_setup_intr(dev, resp->irq, 0, csa_intr, csa, &csa->ih)) {
833 csa_active(csa, -1);
873 csa_readcodec(&csa->res, BA0_AC97_RESET + count, &csa->ac97[i]);
876 csa_writecodec(&csa->res, BA0_AC97_MASTER_VOLUME, 0x8000);
877 csa_writecodec(&csa->res, BA0_AC97_HEADPHONE_VOLUME, 0x8000);
878 csa_writecodec(&csa->res, BA0_AC97_MASTER_VOLUME_MONO, 0x8000);
879 csa_writecodec(&csa->res, BA0_AC97_PCM_OUT_VOLUME, 0x8000);
881 csa_readcodec(&csa->res, BA0_AC97_POWERDOWN, &csa->ac97_powerdown);
882 csa_readcodec(&csa->res, BA0_AC97_GENERAL_PURPOSE,
883 &csa->ac97_general_purpose);
892 csa_readcodec(&csa->res, BA0_AC97_POWERDOWN, &tmp);
893 csa_writecodec(&csa->res, BA0_AC97_POWERDOWN,
896 csa_readcodec(&csa->res, BA0_AC97_POWERDOWN, &tmp);
897 csa_writecodec(&csa->res, BA0_AC97_POWERDOWN,
900 csa_readcodec(&csa->res, BA0_AC97_POWERDOWN, &tmp);
901 csa_writecodec(&csa->res, BA0_AC97_POWERDOWN,
913 * we restore the mic volume/boost state and mic2 was selected at
915 * is selected with the volume/boost settings for mic2, causing
918 * the mic volume/boost.
920 csa_writecodec(&csa->res, BA0_AC97_GENERAL_PURPOSE,
921 csa->ac97_general_purpose);
926 csa_writecodec(&csa->res, BA0_AC97_POWERDOWN, csa->ac97_powerdown);
935 csa_writecodec(&csa->res, BA0_AC97_RESET + count, csa->ac97[i]);
945 resp = &csa->res;
966 csa_writecodec(&csa->res, BA0_AC97_POWERDOWN, 0x300);
978 csa_active(csa, -1);
990 resp = &csa->res;
1009 csa_setupchan(&csa->pch);
1011 csa_setupchan(&csa->rch);
1014 csa_active(csa, -1);