summaryrefslogtreecommitdiffstats
path: root/sys/dev/sound/pci
diff options
context:
space:
mode:
authorgreid <greid@FreeBSD.org>2001-08-26 19:15:28 +0000
committergreid <greid@FreeBSD.org>2001-08-26 19:15:28 +0000
commita88b1ce13d5bea3b1414e2739b83df71478e6bda (patch)
tree562bc54ee620a2c682ad6e7d3eaf6f6c1e81d3d7 /sys/dev/sound/pci
parente7df8036704a3b2b7b54471c91e3fad3a84c7863 (diff)
downloadFreeBSD-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.c41
-rw-r--r--sys/dev/sound/pci/t4dwave.h7
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
OpenPOWER on IntegriCloud