diff options
author | greid <greid@FreeBSD.org> | 2001-08-26 19:15:28 +0000 |
---|---|---|
committer | greid <greid@FreeBSD.org> | 2001-08-26 19:15:28 +0000 |
commit | a88b1ce13d5bea3b1414e2739b83df71478e6bda (patch) | |
tree | 562bc54ee620a2c682ad6e7d3eaf6f6c1e81d3d7 /sys/dev/sound/pci | |
parent | e7df8036704a3b2b7b54471c91e3fad3a84c7863 (diff) | |
download | FreeBSD-src-a88b1ce13d5bea3b1414e2739b83df71478e6bda.zip FreeBSD-src-a88b1ce13d5bea3b1414e2739b83df71478e6bda.tar.gz |
Add support for the SiS 7018
PR: 30100
Submitted by: Ada Lim <adal@cse.unsw.edu.au>
Diffstat (limited to 'sys/dev/sound/pci')
-rw-r--r-- | sys/dev/sound/pci/t4dwave.c | 41 | ||||
-rw-r--r-- | sys/dev/sound/pci/t4dwave.h | 7 |
2 files changed, 39 insertions, 9 deletions
diff --git a/sys/dev/sound/pci/t4dwave.c b/sys/dev/sound/pci/t4dwave.c index 18672db..e41e65c 100644 --- a/sys/dev/sound/pci/t4dwave.c +++ b/sys/dev/sound/pci/t4dwave.c @@ -37,6 +37,7 @@ SND_DECLARE_FILE("$FreeBSD$"); #define TDX_PCI_ID 0x20001023 #define TNX_PCI_ID 0x20011023 +#define SPA_PCI_ID 0x70181039 #define TR_BUFFSIZE 0x1000 #define TR_TIMEOUT_CDC 0xffff @@ -156,6 +157,10 @@ tr_rdcd(kobj_t obj, void *devinfo, int regno) int i, j, treg, trw; switch (tr->type) { + case SPA_PCI_ID: + treg=SPA_REG_CODECRD; + trw=SPA_CDC_RWSTAT; + break; case TDX_PCI_ID: treg=TDX_REG_CODECRD; trw=TDX_CDC_RWSTAT; @@ -186,6 +191,10 @@ tr_wrcd(kobj_t obj, void *devinfo, int regno, u_int32_t data) int i, j, treg, trw; switch (tr->type) { + case SPA_PCI_ID: + treg=SPA_REG_CODECWR; + trw=SPA_CDC_RWSTAT; + break; case TDX_PCI_ID: treg=TDX_REG_CODECWR; trw=TDX_CDC_RWSTAT; @@ -330,6 +339,7 @@ tr_wrch(struct tr_chinfo *ch) cr[4]=(ch->gvsel<<31) | (ch->pan<<24) | (ch->vol<<16) | (ch->ctrl<<12) | (ch->ec); switch (tr->type) { + case SPA_PCI_ID: case TDX_PCI_ID: ch->cso &= 0x0000ffff; ch->eso &= 0x0000ffff; @@ -374,6 +384,7 @@ tr_rdch(struct tr_chinfo *ch) ch->ctrl= (cr[4] & 0x0000f000) >> 12; ch->ec= (cr[4] & 0x00000fff); switch(tr->type) { + case SPA_PCI_ID: case TDX_PCI_ID: ch->cso= (cr[0] & 0xffff0000) >> 16; ch->alpha= (cr[0] & 0x0000fff0) >> 4; @@ -686,9 +697,18 @@ tr_intr(void *p) static int tr_init(struct tr_info *tr) { - if (tr->type == TDX_PCI_ID) { + switch (tr->type) { + case SPA_PCI_ID: + tr_wr(tr, SPA_REG_GPIO, 0, 4); + tr_wr(tr, SPA_REG_CODECST, SPA_RST_OFF, 4); + break; + case TDX_PCI_ID: tr_wr(tr, TDX_REG_CODECST, TDX_CDC_ON, 4); - } else tr_wr(tr, TNX_REG_CODECST, TNX_CDC_ON, 4); + break; + case TNX_PCI_ID: + tr_wr(tr, TNX_REG_CODECST, TNX_CDC_ON, 4); + break; + } tr_wr(tr, TR_REG_CIR, TR_CIR_MIDENA | TR_CIR_ADDRENA, 4); tr->playchns = 0; @@ -698,13 +718,16 @@ tr_init(struct tr_info *tr) static int tr_pci_probe(device_t dev) { - if (pci_get_devid(dev) == TDX_PCI_ID) { - device_set_desc(dev, "Trident 4DWave DX"); - return 0; - } - if (pci_get_devid(dev) == TNX_PCI_ID) { - device_set_desc(dev, "Trident 4DWave NX"); - return 0; + switch (pci_get_devid(dev)) { + case SPA_PCI_ID: + device_set_desc(dev, "SiS 7018"); + return 0; + case TDX_PCI_ID: + device_set_desc(dev, "Trident 4DWave DX"); + return 0; + case TNX_PCI_ID: + device_set_desc(dev, "Trident 4DWave NX"); + return 0; } return ENXIO; diff --git a/sys/dev/sound/pci/t4dwave.h b/sys/dev/sound/pci/t4dwave.h index be8a550..893bc81 100644 --- a/sys/dev/sound/pci/t4dwave.h +++ b/sys/dev/sound/pci/t4dwave.h @@ -63,6 +63,13 @@ #define TDX_CDC_RESET 0x01 #define TDX_CDC_ON (TDX_CDC_ADCON|TDX_CDC_DACON) +#define SPA_REG_CODECRD 0x44 +#define SPA_REG_CODECWR 0x40 +#define SPA_REG_CODECST 0x48 +#define SPA_RST_OFF 0x0f0000 +#define SPA_REG_GPIO 0x48 +#define SPA_CDC_RWSTAT 0x00008000 + #define TNX_REG_CODECWR 0x44 #define TNX_REG_CODEC1RD 0x48 #define TNX_REG_CODEC2RD 0x4c |