Deleted Added
full compact
csapcm.c (65644) csapcm.c (70134)
1/*
2 * Copyright (c) 1999 Seigo Tanimura
3 * All rights reserved.
4 *
5 * Portions of this source are based on cwcealdr.cpp and dhwiface.cpp in
6 * cwcealdr1.zip, the sample sources by Crystal Semiconductor.
7 * Copyright (c) 1996-1998 Crystal Semiconductor Corp.
8 *

--- 13 unchanged lines hidden (view full) ---

22 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
24 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
25 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
26 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
27 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
28 * SUCH DAMAGE.
29 *
1/*
2 * Copyright (c) 1999 Seigo Tanimura
3 * All rights reserved.
4 *
5 * Portions of this source are based on cwcealdr.cpp and dhwiface.cpp in
6 * cwcealdr1.zip, the sample sources by Crystal Semiconductor.
7 * Copyright (c) 1996-1998 Crystal Semiconductor Corp.
8 *

--- 13 unchanged lines hidden (view full) ---

22 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
24 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
25 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
26 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
27 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
28 * SUCH DAMAGE.
29 *
30 * $FreeBSD: head/sys/dev/sound/pci/csapcm.c 65644 2000-09-09 19:21:04Z cg $
30 * $FreeBSD: head/sys/dev/sound/pci/csapcm.c 70134 2000-12-18 01:36:41Z cg $
31 */
32
33#include <sys/soundcard.h>
34#include <dev/sound/pcm/sound.h>
35#include <dev/sound/pcm/ac97.h>
36#include <dev/sound/chip.h>
37#include <dev/sound/pci/csareg.h>
38#include <dev/sound/pci/csavar.h>

--- 38 unchanged lines hidden (view full) ---

77static void csa_stopplaydma(struct csa_info *csa);
78static void csa_stopcapturedma(struct csa_info *csa);
79static void csa_powerupadc(csa_res *resp);
80static void csa_powerupdac(csa_res *resp);
81static int csa_startdsp(csa_res *resp);
82static int csa_allocres(struct csa_info *scp, device_t dev);
83static void csa_releaseres(struct csa_info *scp, device_t dev);
84
31 */
32
33#include <sys/soundcard.h>
34#include <dev/sound/pcm/sound.h>
35#include <dev/sound/pcm/ac97.h>
36#include <dev/sound/chip.h>
37#include <dev/sound/pci/csareg.h>
38#include <dev/sound/pci/csavar.h>

--- 38 unchanged lines hidden (view full) ---

77static void csa_stopplaydma(struct csa_info *csa);
78static void csa_stopcapturedma(struct csa_info *csa);
79static void csa_powerupadc(csa_res *resp);
80static void csa_powerupdac(csa_res *resp);
81static int csa_startdsp(csa_res *resp);
82static int csa_allocres(struct csa_info *scp, device_t dev);
83static void csa_releaseres(struct csa_info *scp, device_t dev);
84
85/* talk to the codec - called from ac97.c */
86static u_int32_t csa_rdcd(void *, int);
87static void csa_wrcd(void *, int, u_int32_t);
88
89/* channel interface */
90static void *csachan_init(void *devinfo, snd_dbuf *b, pcm_channel *c, int dir);
91static int csachan_setdir(void *data, int dir);
92static int csachan_setformat(void *data, u_int32_t format);
93static int csachan_setspeed(void *data, u_int32_t speed);
94static int csachan_setblocksize(void *data, u_int32_t blocksize);
95static int csachan_trigger(void *data, int go);
96static int csachan_getptr(void *data);
97static pcmchan_caps *csachan_getcaps(void *data);
98
99static u_int32_t csa_playfmt[] = {
100 AFMT_U8,
101 AFMT_STEREO | AFMT_U8,
102 AFMT_S8,
103 AFMT_STEREO | AFMT_S8,
104 AFMT_S16_LE,
105 AFMT_STEREO | AFMT_S16_LE,
106 AFMT_S16_BE,

--- 4 unchanged lines hidden (view full) ---

111
112static u_int32_t csa_recfmt[] = {
113 AFMT_S16_LE,
114 AFMT_STEREO | AFMT_S16_LE,
115 0
116};
117static pcmchan_caps csa_reccaps = {11025, 48000, csa_recfmt, 0};
118
85static u_int32_t csa_playfmt[] = {
86 AFMT_U8,
87 AFMT_STEREO | AFMT_U8,
88 AFMT_S8,
89 AFMT_STEREO | AFMT_S8,
90 AFMT_S16_LE,
91 AFMT_STEREO | AFMT_S16_LE,
92 AFMT_S16_BE,

--- 4 unchanged lines hidden (view full) ---

97
98static u_int32_t csa_recfmt[] = {
99 AFMT_S16_LE,
100 AFMT_STEREO | AFMT_S16_LE,
101 0
102};
103static pcmchan_caps csa_reccaps = {11025, 48000, csa_recfmt, 0};
104
119static pcm_channel csa_chantemplate = {
120 csachan_init,
121 csachan_setdir,
122 csachan_setformat,
123 csachan_setspeed,
124 csachan_setblocksize,
125 csachan_trigger,
126 csachan_getptr,
127 csachan_getcaps,
128 NULL, /* free */
129 NULL, /* nop1 */
130 NULL, /* nop2 */
131 NULL, /* nop3 */
132 NULL, /* nop4 */
133 NULL, /* nop5 */
134 NULL, /* nop6 */
135 NULL, /* nop7 */
136};
137
138/* -------------------------------------------------------------------- */
105/* -------------------------------------------------------------------- */
106/* ac97 codec */
139
107
140/* channel interface */
141static void *
142csachan_init(void *devinfo, snd_dbuf *b, pcm_channel *c, int dir)
143{
144 struct csa_info *csa = devinfo;
145 struct csa_chinfo *ch = (dir == PCMDIR_PLAY)? &csa->pch : &csa->rch;
146
147 ch->parent = csa;
148 ch->channel = c;
149 ch->buffer = b;
150 ch->buffer->bufsize = CS461x_BUFFSIZE;
151 if (chn_allocbuf(ch->buffer, csa->parent_dmat) == -1) return NULL;
152 return ch;
153}
154
155static int
108static int
156csachan_setdir(void *data, int dir)
109csa_rdcd(kobj_t obj, void *devinfo, int regno)
157{
110{
158 struct csa_chinfo *ch = data;
159 struct csa_info *csa = ch->parent;
160 csa_res *resp;
111 u_int32_t data;
112 struct csa_info *csa = (struct csa_info *)devinfo;
161
113
162 resp = &csa->res;
114 if (csa_readcodec(&csa->res, regno + BA0_AC97_RESET, &data))
115 data = 0;
163
116
164 if (dir == PCMDIR_PLAY)
165 csa_writemem(resp, BA1_PBA, vtophys(ch->buffer->buf));
166 else
167 csa_writemem(resp, BA1_CBA, vtophys(ch->buffer->buf));
168 ch->dir = dir;
169 return 0;
117 return data;
170}
171
172static int
118}
119
120static int
173csachan_setformat(void *data, u_int32_t format)
121csa_wrcd(kobj_t obj, void *devinfo, int regno, u_int32_t data)
174{
122{
175 struct csa_chinfo *ch = data;
176 struct csa_info *csa = ch->parent;
177 u_long pdtc;
178 csa_res *resp;
123 struct csa_info *csa = (struct csa_info *)devinfo;
179
124
180 resp = &csa->res;
125 csa_writecodec(&csa->res, regno + BA0_AC97_RESET, data);
181
126
182 if (ch->dir == PCMDIR_REC)
183 csa_writemem(resp, BA1_CIE, (csa_readmem(resp, BA1_CIE) & ~0x0000003f) | 0x00000001);
184 else {
185 csa->pfie = csa_readmem(resp, BA1_PFIE) & ~0x0000f03f;
186 if (format & AFMT_U8 || format & AFMT_U16_LE || format & AFMT_U16_BE)
187 csa->pfie |= 0x8000;
188 if (format & AFMT_S16_BE || format & AFMT_U16_BE)
189 csa->pfie |= 0x4000;
190 if (!(format & AFMT_STEREO))
191 csa->pfie |= 0x2000;
192 if (format & AFMT_U8 || format & AFMT_S8)
193 csa->pfie |= 0x1000;
194 csa_writemem(resp, BA1_PFIE, csa->pfie);
195 pdtc = csa_readmem(resp, BA1_PDTC) & ~0x000003ff;
196 if ((format & AFMT_S16_BE || format & AFMT_U16_BE || format & AFMT_S16_LE || format & AFMT_U16_LE) && (format & AFMT_STEREO))
197 pdtc |= 0x00f;
198 else if ((format & AFMT_S16_BE || format & AFMT_U16_BE || format & AFMT_S16_LE || format & AFMT_U16_LE) || (format & AFMT_STEREO))
199 pdtc |= 0x007;
200 else
201 pdtc |= 0x003;
202 csa_writemem(resp, BA1_PDTC, pdtc);
203 }
204 ch->fmt = format;
205 return 0;
206}
207
127 return 0;
128}
129
208static int
209csachan_setspeed(void *data, u_int32_t speed)
210{
211 struct csa_chinfo *ch = data;
212 struct csa_info *csa = ch->parent;
213 csa_res *resp;
130static kobj_method_t csa_ac97_methods[] = {
131 KOBJMETHOD(ac97_read, csa_rdcd),
132 KOBJMETHOD(ac97_write, csa_wrcd),
133 { 0, 0 }
134};
135AC97_DECLARE(csa_ac97);
214
136
215 resp = &csa->res;
216
217 if (ch->dir == PCMDIR_PLAY)
218 csa_setplaysamplerate(resp, speed);
219 else if (ch->dir == PCMDIR_REC)
220 csa_setcapturesamplerate(resp, speed);
221
222 /* rec/play speeds locked together - should indicate in flags */
223#if 0
224 if (ch->direction == PCMDIR_PLAY) d->rec[0].speed = speed;
225 else d->play[0].speed = speed;
226#endif
227 return speed; /* XXX calc real speed */
228}
229
230static void
231csa_setplaysamplerate(csa_res *resp, u_long ulInRate)
232{
233 u_long ulTemp1, ulTemp2;
234 u_long ulPhiIncr;
235 u_long ulCorrectionPerGOF, ulCorrectionPerSec;
236 u_long ulOutRate;
237

--- 144 unchanged lines hidden (view full) ---

382 */
383 csa_writemem(resp, BA1_CFG1, dwFrameGroupLength);
384 csa_writemem(resp, BA1_CFG2, (0x00800000 | dwFrameGroupLength));
385 csa_writemem(resp, BA1_CCST, 0x0000FFFF);
386 csa_writemem(resp, BA1_CSPB, ((65536 * ulOutRate) / 24000));
387 csa_writemem(resp, (BA1_CSPB + 4), 0x0000FFFF);
388}
389
137static void
138csa_setplaysamplerate(csa_res *resp, u_long ulInRate)
139{
140 u_long ulTemp1, ulTemp2;
141 u_long ulPhiIncr;
142 u_long ulCorrectionPerGOF, ulCorrectionPerSec;
143 u_long ulOutRate;
144

--- 144 unchanged lines hidden (view full) ---

289 */
290 csa_writemem(resp, BA1_CFG1, dwFrameGroupLength);
291 csa_writemem(resp, BA1_CFG2, (0x00800000 | dwFrameGroupLength));
292 csa_writemem(resp, BA1_CCST, 0x0000FFFF);
293 csa_writemem(resp, BA1_CSPB, ((65536 * ulOutRate) / 24000));
294 csa_writemem(resp, (BA1_CSPB + 4), 0x0000FFFF);
295}
296
390static int
391csachan_setblocksize(void *data, u_int32_t blocksize)
392{
393#if notdef
394 return blocksize;
395#else
396 struct csa_chinfo *ch = data;
397 return ch->buffer->bufsize / 2;
398#endif /* notdef */
399}
400
401static int
402csachan_trigger(void *data, int go)
403{
404 struct csa_chinfo *ch = data;
405 struct csa_info *csa = ch->parent;
406
407 if (go == PCMTRIG_EMLDMAWR || go == PCMTRIG_EMLDMARD)
408 return 0;
409
410 if (ch->dir == PCMDIR_PLAY) {
411 if (go == PCMTRIG_START)
412 csa_startplaydma(csa);
413 else
414 csa_stopplaydma(csa);
415 } else {
416 if (go == PCMTRIG_START)
417 csa_startcapturedma(csa);
418 else
419 csa_stopcapturedma(csa);
420 }
421 return 0;
422}
423
424static void
425csa_startplaydma(struct csa_info *csa)
426{
427 csa_res *resp;
428 u_long ul;
429
430 if (!csa->pch.dma) {
431 resp = &csa->res;

--- 201 unchanged lines hidden (view full) ---

633 * If the run at frame bit never reset, then return an error.
634 */
635 if((ul & SPCR_RUNFR) != 0)
636 return (EAGAIN);
637
638 return (0);
639}
640
297static void
298csa_startplaydma(struct csa_info *csa)
299{
300 csa_res *resp;
301 u_long ul;
302
303 if (!csa->pch.dma) {
304 resp = &csa->res;

--- 201 unchanged lines hidden (view full) ---

506 * If the run at frame bit never reset, then return an error.
507 */
508 if((ul & SPCR_RUNFR) != 0)
509 return (EAGAIN);
510
511 return (0);
512}
513
514/* -------------------------------------------------------------------- */
515/* channel interface */
516
517static void *
518csachan_init(kobj_t obj, void *devinfo, snd_dbuf *b, pcm_channel *c, int dir)
519{
520 struct csa_info *csa = devinfo;
521 struct csa_chinfo *ch = (dir == PCMDIR_PLAY)? &csa->pch : &csa->rch;
522
523 ch->parent = csa;
524 ch->channel = c;
525 ch->buffer = b;
526 ch->buffer->bufsize = CS461x_BUFFSIZE;
527 if (chn_allocbuf(ch->buffer, csa->parent_dmat) == -1) return NULL;
528 return ch;
529}
530
641static int
531static int
642csachan_getptr(void *data)
532csachan_setdir(kobj_t obj, void *data, int dir)
643{
644 struct csa_chinfo *ch = data;
645 struct csa_info *csa = ch->parent;
646 csa_res *resp;
533{
534 struct csa_chinfo *ch = data;
535 struct csa_info *csa = ch->parent;
536 csa_res *resp;
537
538 resp = &csa->res;
539
540 if (dir == PCMDIR_PLAY)
541 csa_writemem(resp, BA1_PBA, vtophys(ch->buffer->buf));
542 else
543 csa_writemem(resp, BA1_CBA, vtophys(ch->buffer->buf));
544 ch->dir = dir;
545 return 0;
546}
547
548static int
549csachan_setformat(kobj_t obj, void *data, u_int32_t format)
550{
551 struct csa_chinfo *ch = data;
552 struct csa_info *csa = ch->parent;
553 u_long pdtc;
554 csa_res *resp;
555
556 resp = &csa->res;
557
558 if (ch->dir == PCMDIR_REC)
559 csa_writemem(resp, BA1_CIE, (csa_readmem(resp, BA1_CIE) & ~0x0000003f) | 0x00000001);
560 else {
561 csa->pfie = csa_readmem(resp, BA1_PFIE) & ~0x0000f03f;
562 if (format & AFMT_U8 || format & AFMT_U16_LE || format & AFMT_U16_BE)
563 csa->pfie |= 0x8000;
564 if (format & AFMT_S16_BE || format & AFMT_U16_BE)
565 csa->pfie |= 0x4000;
566 if (!(format & AFMT_STEREO))
567 csa->pfie |= 0x2000;
568 if (format & AFMT_U8 || format & AFMT_S8)
569 csa->pfie |= 0x1000;
570 csa_writemem(resp, BA1_PFIE, csa->pfie);
571 pdtc = csa_readmem(resp, BA1_PDTC) & ~0x000003ff;
572 if ((format & AFMT_S16_BE || format & AFMT_U16_BE || format & AFMT_S16_LE || format & AFMT_U16_LE) && (format & AFMT_STEREO))
573 pdtc |= 0x00f;
574 else if ((format & AFMT_S16_BE || format & AFMT_U16_BE || format & AFMT_S16_LE || format & AFMT_U16_LE) || (format & AFMT_STEREO))
575 pdtc |= 0x007;
576 else
577 pdtc |= 0x003;
578 csa_writemem(resp, BA1_PDTC, pdtc);
579 }
580 ch->fmt = format;
581 return 0;
582}
583
584static int
585csachan_setspeed(kobj_t obj, void *data, u_int32_t speed)
586{
587 struct csa_chinfo *ch = data;
588 struct csa_info *csa = ch->parent;
589 csa_res *resp;
590
591 resp = &csa->res;
592
593 if (ch->dir == PCMDIR_PLAY)
594 csa_setplaysamplerate(resp, speed);
595 else if (ch->dir == PCMDIR_REC)
596 csa_setcapturesamplerate(resp, speed);
597
598 /* rec/play speeds locked together - should indicate in flags */
599#if 0
600 if (ch->direction == PCMDIR_PLAY) d->rec[0].speed = speed;
601 else d->play[0].speed = speed;
602#endif
603 return speed; /* XXX calc real speed */
604}
605
606static int
607csachan_setblocksize(kobj_t obj, void *data, u_int32_t blocksize)
608{
609#if notdef
610 return blocksize;
611#else
612 struct csa_chinfo *ch = data;
613 return ch->buffer->bufsize / 2;
614#endif /* notdef */
615}
616
617static int
618csachan_trigger(kobj_t obj, void *data, int go)
619{
620 struct csa_chinfo *ch = data;
621 struct csa_info *csa = ch->parent;
622
623 if (go == PCMTRIG_EMLDMAWR || go == PCMTRIG_EMLDMARD)
624 return 0;
625
626 if (ch->dir == PCMDIR_PLAY) {
627 if (go == PCMTRIG_START)
628 csa_startplaydma(csa);
629 else
630 csa_stopplaydma(csa);
631 } else {
632 if (go == PCMTRIG_START)
633 csa_startcapturedma(csa);
634 else
635 csa_stopcapturedma(csa);
636 }
637 return 0;
638}
639
640static int
641csachan_getptr(kobj_t obj, void *data)
642{
643 struct csa_chinfo *ch = data;
644 struct csa_info *csa = ch->parent;
645 csa_res *resp;
647 int ptr;
648
649 resp = &csa->res;
650
651 if (ch->dir == PCMDIR_PLAY) {
652 ptr = csa_readmem(resp, BA1_PBA) - vtophys(ch->buffer->buf);
653 if ((ch->fmt & AFMT_U8) != 0 || (ch->fmt & AFMT_S8) != 0)
654 ptr >>= 1;
655 } else {
656 ptr = csa_readmem(resp, BA1_CBA) - vtophys(ch->buffer->buf);
657 if ((ch->fmt & AFMT_U8) != 0 || (ch->fmt & AFMT_S8) != 0)
658 ptr >>= 1;
659 }
660
661 return (ptr);
662}
663
664static pcmchan_caps *
646 int ptr;
647
648 resp = &csa->res;
649
650 if (ch->dir == PCMDIR_PLAY) {
651 ptr = csa_readmem(resp, BA1_PBA) - vtophys(ch->buffer->buf);
652 if ((ch->fmt & AFMT_U8) != 0 || (ch->fmt & AFMT_S8) != 0)
653 ptr >>= 1;
654 } else {
655 ptr = csa_readmem(resp, BA1_CBA) - vtophys(ch->buffer->buf);
656 if ((ch->fmt & AFMT_U8) != 0 || (ch->fmt & AFMT_S8) != 0)
657 ptr >>= 1;
658 }
659
660 return (ptr);
661}
662
663static pcmchan_caps *
665csachan_getcaps(void *data)
664csachan_getcaps(kobj_t obj, void *data)
666{
667 struct csa_chinfo *ch = data;
668 return (ch->dir == PCMDIR_PLAY)? &csa_playcaps : &csa_reccaps;
669}
670
665{
666 struct csa_chinfo *ch = data;
667 return (ch->dir == PCMDIR_PLAY)? &csa_playcaps : &csa_reccaps;
668}
669
670static kobj_method_t csachan_methods[] = {
671 KOBJMETHOD(channel_init, csachan_init),
672 KOBJMETHOD(channel_setdir, csachan_setdir),
673 KOBJMETHOD(channel_setformat, csachan_setformat),
674 KOBJMETHOD(channel_setspeed, csachan_setspeed),
675 KOBJMETHOD(channel_setblocksize, csachan_setblocksize),
676 KOBJMETHOD(channel_trigger, csachan_trigger),
677 KOBJMETHOD(channel_getptr, csachan_getptr),
678 KOBJMETHOD(channel_getcaps, csachan_getcaps),
679 { 0, 0 }
680};
681CHANNEL_DECLARE(csachan);
682
683/* -------------------------------------------------------------------- */
671/* The interrupt handler */
672static void
673csa_intr (void *p)
674{
675 struct csa_info *csa = p;
676
677 if ((csa->binfo->hisr & HISR_VC0) != 0)
678 chn_intr(csa->pch.channel);

--- 149 unchanged lines hidden (view full) ---

828 csa_releaseres(csa, dev);
829 return (ENXIO);
830 }
831
832 if (csa_init(csa)) {
833 csa_releaseres(csa, dev);
834 return (ENXIO);
835 }
684/* The interrupt handler */
685static void
686csa_intr (void *p)
687{
688 struct csa_info *csa = p;
689
690 if ((csa->binfo->hisr & HISR_VC0) != 0)
691 chn_intr(csa->pch.channel);

--- 149 unchanged lines hidden (view full) ---

841 csa_releaseres(csa, dev);
842 return (ENXIO);
843 }
844
845 if (csa_init(csa)) {
846 csa_releaseres(csa, dev);
847 return (ENXIO);
848 }
836 codec = ac97_create(dev, csa, NULL, csa_rdcd, csa_wrcd);
849 codec = AC97_CREATE(dev, csa, csa_ac97);
837 if (codec == NULL) {
838 csa_releaseres(csa, dev);
839 return (ENXIO);
840 }
850 if (codec == NULL) {
851 csa_releaseres(csa, dev);
852 return (ENXIO);
853 }
841 if (mixer_init(dev, &ac97_mixer, codec) == -1) {
854 if (mixer_init(dev, ac97_getmixerclass(), codec) == -1) {
842 ac97_destroy(codec);
843 csa_releaseres(csa, dev);
844 return (ENXIO);
845 }
846
847 snprintf(status, SND_STATUSLEN, "at irq %ld", rman_get_start(resp->irq));
848
849 /* Enable interrupt. */

--- 5 unchanged lines hidden (view full) ---

855 csa_writemem(resp, BA1_PFIE, csa_readmem(resp, BA1_PFIE) & ~0x0000f03f);
856 csa_writemem(resp, BA1_CIE, (csa_readmem(resp, BA1_CIE) & ~0x0000003f) | 0x00000001);
857
858 if (pcm_register(dev, csa, 1, 1)) {
859 ac97_destroy(codec);
860 csa_releaseres(csa, dev);
861 return (ENXIO);
862 }
855 ac97_destroy(codec);
856 csa_releaseres(csa, dev);
857 return (ENXIO);
858 }
859
860 snprintf(status, SND_STATUSLEN, "at irq %ld", rman_get_start(resp->irq));
861
862 /* Enable interrupt. */

--- 5 unchanged lines hidden (view full) ---

868 csa_writemem(resp, BA1_PFIE, csa_readmem(resp, BA1_PFIE) & ~0x0000f03f);
869 csa_writemem(resp, BA1_CIE, (csa_readmem(resp, BA1_CIE) & ~0x0000003f) | 0x00000001);
870
871 if (pcm_register(dev, csa, 1, 1)) {
872 ac97_destroy(codec);
873 csa_releaseres(csa, dev);
874 return (ENXIO);
875 }
863 pcm_addchan(dev, PCMDIR_REC, &csa_chantemplate, csa);
864 pcm_addchan(dev, PCMDIR_PLAY, &csa_chantemplate, csa);
876 pcm_addchan(dev, PCMDIR_REC, &csachan_class, csa);
877 pcm_addchan(dev, PCMDIR_PLAY, &csachan_class, csa);
865 pcm_setstatus(dev, status);
866
867 return (0);
868}
869
870static int
871pcmcsa_detach(device_t dev)
872{

--- 5 unchanged lines hidden (view full) ---

878 return r;
879
880 csa = pcm_getdevinfo(dev);
881 csa_releaseres(csa, dev);
882
883 return 0;
884}
885
878 pcm_setstatus(dev, status);
879
880 return (0);
881}
882
883static int
884pcmcsa_detach(device_t dev)
885{

--- 5 unchanged lines hidden (view full) ---

891 return r;
892
893 csa = pcm_getdevinfo(dev);
894 csa_releaseres(csa, dev);
895
896 return 0;
897}
898
886/* ac97 codec */
887
888static u_int32_t
889csa_rdcd(void *devinfo, int regno)
890{
891 u_int32_t data;
892 struct csa_info *csa = (struct csa_info *)devinfo;
893
894 if (csa_readcodec(&csa->res, regno + BA0_AC97_RESET, &data))
895 data = 0;
896
897 return data;
898}
899
900static void
901csa_wrcd(void *devinfo, int regno, u_int32_t data)
902{
903 struct csa_info *csa = (struct csa_info *)devinfo;
904
905 csa_writecodec(&csa->res, regno + BA0_AC97_RESET, data);
906}
907
908static device_method_t pcmcsa_methods[] = {
909 /* Device interface */
910 DEVMETHOD(device_probe , pcmcsa_probe ),
911 DEVMETHOD(device_attach, pcmcsa_attach),
912 DEVMETHOD(device_detach, pcmcsa_detach),
913
914 { 0, 0 },
915};

--- 13 unchanged lines hidden ---
899static device_method_t pcmcsa_methods[] = {
900 /* Device interface */
901 DEVMETHOD(device_probe , pcmcsa_probe ),
902 DEVMETHOD(device_attach, pcmcsa_attach),
903 DEVMETHOD(device_detach, pcmcsa_detach),
904
905 { 0, 0 },
906};

--- 13 unchanged lines hidden ---