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 --- |