aboutsummaryrefslogtreecommitdiff
path: root/sys/dev
diff options
context:
space:
mode:
authorAriff Abdullah <ariff@FreeBSD.org>2007-11-10 04:32:50 +0000
committerAriff Abdullah <ariff@FreeBSD.org>2007-11-10 04:32:50 +0000
commit8b18769048f8d58ff91f36f5ce63142496000fb5 (patch)
treec846c54df0c39e0b932e81011e861d1f01777bca /sys/dev
parent6361ff6de9c9c729c9c8c5ba0d6e9f806e25f449 (diff)
Notes
Diffstat (limited to 'sys/dev')
-rw-r--r--sys/dev/sound/pci/t4dwave.c26
1 files changed, 23 insertions, 3 deletions
diff --git a/sys/dev/sound/pci/t4dwave.c b/sys/dev/sound/pci/t4dwave.c
index 8b5ca6b192e9..39ce02e81561 100644
--- a/sys/dev/sound/pci/t4dwave.c
+++ b/sys/dev/sound/pci/t4dwave.c
@@ -811,7 +811,7 @@ tr_pci_attach(device_t dev)
u_int32_t data;
struct tr_info *tr;
struct ac97_info *codec = 0;
- int i;
+ int i, dacn;
char status[SND_STATUSLEN];
tr = malloc(sizeof(*tr), M_DEVBUF, M_WAITOK | M_ZERO);
@@ -819,6 +819,25 @@ tr_pci_attach(device_t dev)
tr->rev = pci_get_revid(dev);
tr->lock = snd_mtxcreate(device_get_nameunit(dev), "snd_t4dwave softc");
+ if (resource_int_value(device_get_name(dev), device_get_unit(dev),
+ "dac", &i) == 0) {
+ if (i < 1)
+ dacn = 1;
+ else if (i > TR_MAXPLAYCH)
+ dacn = TR_MAXPLAYCH;
+ else
+ dacn = i;
+ } else {
+ switch (tr->type) {
+ case ALI_PCI_ID:
+ dacn = 1;
+ break;
+ default:
+ dacn = TR_MAXPLAYCH;
+ break;
+ }
+ }
+
data = pci_read_config(dev, PCIR_COMMAND, 2);
data |= (PCIM_CMD_PORTEN|PCIM_CMD_MEMEN|PCIM_CMD_BUSMASTEREN);
pci_write_config(dev, PCIR_COMMAND, data, 2);
@@ -871,9 +890,10 @@ tr_pci_attach(device_t dev)
snprintf(status, 64, "at io 0x%lx irq %ld %s",
rman_get_start(tr->reg), rman_get_start(tr->irq),PCM_KLDSTRING(snd_t4dwave));
- if (pcm_register(dev, tr, TR_MAXPLAYCH, 1)) goto bad;
+ if (pcm_register(dev, tr, dacn, 1))
+ goto bad;
pcm_addchan(dev, PCMDIR_REC, &trrchan_class, tr);
- for (i = 0; i < TR_MAXPLAYCH; i++)
+ for (i = 0; i < dacn; i++)
pcm_addchan(dev, PCMDIR_PLAY, &trpchan_class, tr);
pcm_setstatus(dev, status);