From 1ce1fbf5b80ab001dc60fac9abdd9cafd20e5442 Mon Sep 17 00:00:00 2001 From: orion Date: Mon, 17 Dec 2001 01:39:36 +0000 Subject: Addition of sysctl variable to enable spdif. By default spdif is disabled. MFC after: 3 days --- sys/dev/sound/pci/cmi.c | 28 ++++++++++++++++++++++++++-- 1 file 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); -- cgit v1.1