csapcm.c (55204) | csapcm.c (55320) |
---|---|
1/*- | 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 * 9 * Redistribution and use in source and binary forms, with or without --- 12 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 * | 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 * 9 * Redistribution and use in source and binary forms, with or without --- 12 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 55204 1999-12-29 03:46:54Z cg $ | 30 * $FreeBSD: head/sys/dev/sound/pci/csapcm.c 55320 2000-01-03 02:51:16Z tanimura $ |
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> --- 11 unchanged lines hidden (view full) --- 50 int dir; 51 u_int32_t fmt; 52}; 53 54struct csa_info { 55 csa_res res; /* resource */ 56 void *ih; /* Interrupt cookie */ 57 bus_dma_tag_t parent_dmat; /* DMA tag */ | 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> --- 11 unchanged lines hidden (view full) --- 50 int dir; 51 u_int32_t fmt; 52}; 53 54struct csa_info { 55 csa_res res; /* resource */ 56 void *ih; /* Interrupt cookie */ 57 bus_dma_tag_t parent_dmat; /* DMA tag */ |
58 struct csa_bridgeinfo *binfo; /* The state of the parent. */ |
|
58 59 /* Contents of board's registers */ 60 u_long pfie; 61 u_long pctl; 62 u_long cctl; 63 struct csa_chinfo pch, rch; 64}; 65 --- 367 unchanged lines hidden (view full) --- 433 csa_res *resp; 434 u_long ul; 435 436 resp = &csa->res; 437 ul = csa_readmem(resp, BA1_PCTL); 438 csa->pctl = ul & 0xffff0000; 439 csa_writemem(resp, BA1_PCTL, ul & 0x0000ffff); 440 csa_writemem(resp, BA1_PVOL, 0xffffffff); | 59 60 /* Contents of board's registers */ 61 u_long pfie; 62 u_long pctl; 63 u_long cctl; 64 struct csa_chinfo pch, rch; 65}; 66 --- 367 unchanged lines hidden (view full) --- 434 csa_res *resp; 435 u_long ul; 436 437 resp = &csa->res; 438 ul = csa_readmem(resp, BA1_PCTL); 439 csa->pctl = ul & 0xffff0000; 440 csa_writemem(resp, BA1_PCTL, ul & 0x0000ffff); 441 csa_writemem(resp, BA1_PVOL, 0xffffffff); |
442 443 /* Clear the serial fifos. */ 444 csa_clearserialfifos(resp); |
|
441} 442 443static void 444csa_stopcapturedma(struct csa_info *csa) 445{ 446 csa_res *resp; 447 u_long ul; 448 --- 165 unchanged lines hidden (view full) --- 614 return (ch->dir == PCMDIR_PLAY)? &csa_playcaps : &csa_reccaps; 615} 616 617/* The interrupt handler */ 618static void 619csa_intr (void *p) 620{ 621 struct csa_info *csa = p; | 445} 446 447static void 448csa_stopcapturedma(struct csa_info *csa) 449{ 450 csa_res *resp; 451 u_long ul; 452 --- 165 unchanged lines hidden (view full) --- 618 return (ch->dir == PCMDIR_PLAY)? &csa_playcaps : &csa_reccaps; 619} 620 621/* The interrupt handler */ 622static void 623csa_intr (void *p) 624{ 625 struct csa_info *csa = p; |
622 csa_res *resp; 623 u_int hisr; | |
624 | 626 |
625 resp = &csa->res; 626 627 /* Is this interrupt for us? */ 628 /* XXX The parent device should handle this. */ 629 hisr = csa_readio(resp, BA0_HISR); 630 if ((hisr & ~HISR_INTENA) == 0) { 631 /* Throw an eoi. */ 632 csa_writeio(resp, BA0_HICR, HICR_IEV | HICR_CHGM); 633 return; 634 } 635 636 if ((hisr & HISR_VC0) != 0) | 627 if ((csa->binfo->hisr & HISR_VC0) != 0) |
637 chn_intr(csa->pch.channel); | 628 chn_intr(csa->pch.channel); |
638 if ((hisr & HISR_VC1) != 0) | 629 if ((csa->binfo->hisr & HISR_VC1) != 0) |
639 chn_intr(csa->rch.channel); | 630 chn_intr(csa->rch.channel); |
640 641 /* Throw an eoi. */ 642 csa_writeio(resp, BA0_HICR, HICR_IEV | HICR_CHGM); | |
643} 644 645/* -------------------------------------------------------------------- */ 646 647/* 648 * Probe and attach the card 649 */ 650 --- 100 unchanged lines hidden (view full) --- 751pcmcsa_attach(device_t dev) 752{ 753 snddev_info *devinfo; 754 struct csa_info *csa; 755 csa_res *resp; 756 int unit; 757 char status[SND_STATUSLEN]; 758 struct ac97_info *codec; | 631} 632 633/* -------------------------------------------------------------------- */ 634 635/* 636 * Probe and attach the card 637 */ 638 --- 100 unchanged lines hidden (view full) --- 739pcmcsa_attach(device_t dev) 740{ 741 snddev_info *devinfo; 742 struct csa_info *csa; 743 csa_res *resp; 744 int unit; 745 char status[SND_STATUSLEN]; 746 struct ac97_info *codec; |
747 struct sndcard_func *func; |
|
759 760 devinfo = device_get_softc(dev); 761 csa = malloc(sizeof(*csa), M_DEVBUF, M_NOWAIT); 762 if (csa == NULL) 763 return (ENOMEM); 764 bzero(csa, sizeof(*csa)); 765 unit = device_get_unit(dev); | 748 749 devinfo = device_get_softc(dev); 750 csa = malloc(sizeof(*csa), M_DEVBUF, M_NOWAIT); 751 if (csa == NULL) 752 return (ENOMEM); 753 bzero(csa, sizeof(*csa)); 754 unit = device_get_unit(dev); |
755 func = device_get_ivars(dev); 756 csa->binfo = func->varinfo; |
|
766 767 /* Allocate the resources. */ 768 resp = &csa->res; 769 resp->io_rid = CS461x_IO_OFFSET; 770 resp->mem_rid = CS461x_MEM_OFFSET; 771 resp->irq_rid = 0; 772 if (csa_allocres(csa, dev)) { 773 csa_releaseres(csa, dev); --- 11 unchanged lines hidden (view full) --- 785 786 snprintf(status, SND_STATUSLEN, "at irq %ld", rman_get_start(resp->irq)); 787 788 /* Enable interrupt. */ 789 if (bus_setup_intr(dev, resp->irq, INTR_TYPE_TTY, csa_intr, csa, &csa->ih)) { 790 csa_releaseres(csa, dev); 791 return (ENXIO); 792 } | 757 758 /* Allocate the resources. */ 759 resp = &csa->res; 760 resp->io_rid = CS461x_IO_OFFSET; 761 resp->mem_rid = CS461x_MEM_OFFSET; 762 resp->irq_rid = 0; 763 if (csa_allocres(csa, dev)) { 764 csa_releaseres(csa, dev); --- 11 unchanged lines hidden (view full) --- 776 777 snprintf(status, SND_STATUSLEN, "at irq %ld", rman_get_start(resp->irq)); 778 779 /* Enable interrupt. */ 780 if (bus_setup_intr(dev, resp->irq, INTR_TYPE_TTY, csa_intr, csa, &csa->ih)) { 781 csa_releaseres(csa, dev); 782 return (ENXIO); 783 } |
793 if ((csa_readio(resp, BA0_HISR) & HISR_INTENA) == 0) 794 csa_writeio(resp, BA0_HICR, HICR_IEV | HICR_CHGM); | |
795 csa_writemem(resp, BA1_PFIE, csa_readmem(resp, BA1_PFIE) & ~0x0000f03f); 796 csa_writemem(resp, BA1_CIE, (csa_readmem(resp, BA1_CIE) & ~0x0000003f) | 0x00000001); 797 798 if (pcm_register(dev, csa, 1, 1)) { 799 csa_releaseres(csa, dev); 800 return (ENXIO); 801 } 802 pcm_addchan(dev, PCMDIR_REC, &csa_chantemplate, csa); --- 45 unchanged lines hidden --- | 784 csa_writemem(resp, BA1_PFIE, csa_readmem(resp, BA1_PFIE) & ~0x0000f03f); 785 csa_writemem(resp, BA1_CIE, (csa_readmem(resp, BA1_CIE) & ~0x0000003f) | 0x00000001); 786 787 if (pcm_register(dev, csa, 1, 1)) { 788 csa_releaseres(csa, dev); 789 return (ENXIO); 790 } 791 pcm_addchan(dev, PCMDIR_REC, &csa_chantemplate, csa); --- 45 unchanged lines hidden --- |