summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authororion <orion@FreeBSD.org>2001-12-17 01:39:36 +0000
committerorion <orion@FreeBSD.org>2001-12-17 01:39:36 +0000
commit1ce1fbf5b80ab001dc60fac9abdd9cafd20e5442 (patch)
tree40c1e01787e4467ee3822cd015305ed34752818e
parentf53606c2624bff3cd0bd6252fc64acf432576b03 (diff)
downloadFreeBSD-src-1ce1fbf5b80ab001dc60fac9abdd9cafd20e5442.zip
FreeBSD-src-1ce1fbf5b80ab001dc60fac9abdd9cafd20e5442.tar.gz
Addition of sysctl variable to enable spdif. By default spdif is disabled.
MFC after: 3 days
-rw-r--r--sys/dev/sound/pci/cmi.c28
1 files changed, 26 insertions, 2 deletions
diff --git a/sys/dev/sound/pci/cmi.c b/sys/dev/sound/pci/cmi.c
index 9529b86..62cfac2 100644
--- a/sys/dev/sound/pci/cmi.c
+++ b/sys/dev/sound/pci/cmi.c
@@ -109,6 +109,7 @@ struct sc_info {
void *ih;
void *lock;
+ int spdif_enabled;
unsigned int bufsz;
struct sc_chinfo pch, rch;
};
@@ -408,15 +409,19 @@ cmichan_setspeed(kobj_t obj, void *data, u_int32_t speed)
r = cmpci_rate_to_regvalue(speed);
snd_mtxlock(sc->lock);
if (ch->dir == PCMDIR_PLAY) {
- if (speed < 44100) /* disable if req before rate change */
+ if (speed < 44100) {
+ /* disable if req before rate change */
cmi_spdif_speed(ch->parent, speed);
+ }
cmi_partial_wr4(ch->parent,
CMPCI_REG_FUNC_1,
CMPCI_REG_DAC_FS_SHIFT,
CMPCI_REG_DAC_FS_MASK,
r);
- if (speed >= 44100) /* enable if req after rate change */
+ if (speed >= 44100 && ch->parent->spdif_enabled) {
+ /* enable if req after rate change */
cmi_spdif_speed(ch->parent, speed);
+ }
rsp = cmi_rd(ch->parent, CMPCI_REG_FUNC_1, 4);
rsp >>= CMPCI_REG_DAC_FS_SHIFT;
rsp &= CMPCI_REG_DAC_FS_MASK;
@@ -718,6 +723,22 @@ cmimix_setrecsrc(struct snd_mixer *m, u_int32_t src)
return src;
}
+/* Optional SPDIF support. */
+
+static int
+cmi_initsys(struct sc_info* sc)
+{
+#ifdef SND_DYNSYSCTL
+ SYSCTL_ADD_INT(snd_sysctl_tree(sc->dev),
+ SYSCTL_CHILDREN(snd_sysctl_tree_top(sc->dev)),
+ OID_AUTO, "spdif_enabled", CTLFLAG_RW,
+ &sc->spdif_enabled, 0,
+ "enable SPDIF output at 44.1 kHz and above");
+#endif /* SND_DYNSYSCTL */
+ return 0;
+}
+
+/* ------------------------------------------------------------------------- */
static kobj_method_t cmi_mixer_methods[] = {
KOBJMETHOD(mixer_init, cmimix_init),
KOBJMETHOD(mixer_set, cmimix_set),
@@ -827,6 +848,7 @@ cmi_attach(device_t dev)
pci_write_config(dev, PCIR_COMMAND, data, 2);
data = pci_read_config(dev, PCIR_COMMAND, 2);
+ sc->dev = dev;
sc->regid = PCIR_MAPS;
sc->reg = bus_alloc_resource(dev, SYS_RES_IOPORT, &sc->regid,
0, BUS_SPACE_UNRESTRICTED, 1, RF_ACTIVE);
@@ -869,6 +891,8 @@ cmi_attach(device_t dev)
if (pcm_register(dev, sc, 1, 1))
goto bad;
+ cmi_initsys(sc);
+
pcm_addchan(dev, PCMDIR_PLAY, &cmichan_class, sc);
pcm_addchan(dev, PCMDIR_REC, &cmichan_class, sc);
OpenPOWER on IntegriCloud