mirror of
https://github.com/freebsd/freebsd-src.git
synced 2026-11-07 04:36:52 -10:00
sound: Whitespace cleanup
In advance of additional sound(4) work, remove EOL whitespace and mixed tab/space. Reviewed by: christos Differential Revision: https://reviews.freebsd.org/D60442
This commit is contained in:
1 parent
8eb863097f
commit
dd51cef583
59 files changed
+862
-862
No files matched your search
@@ -51,7 +51,7 @@ struct audio_soc_aux_node {
|
||||
|
||||
struct audio_soc_channel {
|
||||
struct audio_soc_softc *sc; /* parent device's softc */
|
||||
struct pcm_channel *pcm; /* PCM channel */
|
||||
struct pcm_channel *pcm; /* PCM channel */
|
||||
struct snd_dbuf *buf; /* PCM buffer */
|
||||
int dir; /* direction */
|
||||
};
|
||||
@@ -69,8 +69,8 @@ struct audio_soc_softc {
|
||||
device_t codec_dev;
|
||||
SLIST_HEAD(, audio_soc_aux_node) aux_devs;
|
||||
unsigned int mclk_fs;
|
||||
struct audio_soc_channel play_channel;
|
||||
struct audio_soc_channel rec_channel;
|
||||
struct audio_soc_channel play_channel;
|
||||
struct audio_soc_channel rec_channel;
|
||||
/*
|
||||
* The format is from the CPU node, for CODEC node clock roles
|
||||
* need to be reversed.
|
||||
@@ -268,10 +268,10 @@ audio_soc_chan_getcaps(kobj_t obj, void *data)
|
||||
}
|
||||
|
||||
static kobj_method_t audio_soc_chan_methods[] = {
|
||||
KOBJMETHOD(channel_init, audio_soc_chan_init),
|
||||
KOBJMETHOD(channel_free, audio_soc_chan_free),
|
||||
KOBJMETHOD(channel_setformat, audio_soc_chan_setformat),
|
||||
KOBJMETHOD(channel_setspeed, audio_soc_chan_setspeed),
|
||||
KOBJMETHOD(channel_init, audio_soc_chan_init),
|
||||
KOBJMETHOD(channel_free, audio_soc_chan_free),
|
||||
KOBJMETHOD(channel_setformat, audio_soc_chan_setformat),
|
||||
KOBJMETHOD(channel_setspeed, audio_soc_chan_setspeed),
|
||||
KOBJMETHOD(channel_setblocksize,audio_soc_chan_setblocksize),
|
||||
KOBJMETHOD(channel_trigger, audio_soc_chan_trigger),
|
||||
KOBJMETHOD(channel_getptr, audio_soc_chan_getptr),
|
||||
|
||||
+38
-38
@@ -54,24 +54,24 @@
|
||||
#include "mixer_if.h"
|
||||
|
||||
struct aoa_dma {
|
||||
struct mtx mutex;
|
||||
struct resource *reg; /* DBDMA registers */
|
||||
dbdma_channel_t *channel; /* DBDMA channel */
|
||||
bus_dma_tag_t tag; /* bus_dma tag */
|
||||
struct pcm_channel *pcm; /* PCM channel */
|
||||
struct snd_dbuf *buf; /* PCM buffer */
|
||||
unsigned int slots; /* # of slots */
|
||||
unsigned int slot; /* current slot */
|
||||
unsigned int bufsz; /* buffer size */
|
||||
unsigned int blksz; /* block size */
|
||||
int running;
|
||||
struct mtx mutex;
|
||||
struct resource *reg; /* DBDMA registers */
|
||||
dbdma_channel_t *channel; /* DBDMA channel */
|
||||
bus_dma_tag_t tag; /* bus_dma tag */
|
||||
struct pcm_channel *pcm; /* PCM channel */
|
||||
struct snd_dbuf *buf; /* PCM buffer */
|
||||
unsigned int slots; /* # of slots */
|
||||
unsigned int slot; /* current slot */
|
||||
unsigned int bufsz; /* buffer size */
|
||||
unsigned int blksz; /* block size */
|
||||
int running;
|
||||
};
|
||||
|
||||
static void
|
||||
aoa_dma_set_program(struct aoa_dma *dma)
|
||||
{
|
||||
uint32_t addr;
|
||||
int i;
|
||||
uint32_t addr;
|
||||
int i;
|
||||
|
||||
addr = (uint32_t)dma->buf->buf_addr;
|
||||
KASSERT(dma->bufsz == dma->buf->bufsize, ("bad size"));
|
||||
@@ -79,7 +79,7 @@ aoa_dma_set_program(struct aoa_dma *dma)
|
||||
dma->slots = dma->bufsz / dma->blksz;
|
||||
|
||||
for (i = 0; i < dma->slots; ++i) {
|
||||
dbdma_insert_command(dma->channel,
|
||||
dbdma_insert_command(dma->channel,
|
||||
i, /* slot */
|
||||
DBDMA_OUTPUT_MORE, /* command */
|
||||
0, /* stream */
|
||||
@@ -109,19 +109,19 @@ aoa_dma_set_program(struct aoa_dma *dma)
|
||||
|
||||
#define AOA_BUFFER_SIZE 65536
|
||||
|
||||
static struct aoa_dma *
|
||||
static struct aoa_dma *
|
||||
aoa_dma_create(struct aoa_softc *sc)
|
||||
{
|
||||
struct aoa_dma *dma;
|
||||
bus_dma_tag_t tag;
|
||||
int err;
|
||||
bus_dma_tag_t tag;
|
||||
int err;
|
||||
device_t self;
|
||||
|
||||
self = sc->sc_dev;
|
||||
err = bus_dma_tag_create(bus_get_dma_tag(self),
|
||||
4, 0, BUS_SPACE_MAXADDR_32BIT, BUS_SPACE_MAXADDR, NULL, NULL,
|
||||
err = bus_dma_tag_create(bus_get_dma_tag(self),
|
||||
4, 0, BUS_SPACE_MAXADDR_32BIT, BUS_SPACE_MAXADDR, NULL, NULL,
|
||||
AOA_BUFFER_SIZE, 1, AOA_BUFFER_SIZE, 0, NULL, NULL, &tag);
|
||||
if (err != 0)
|
||||
if (err != 0)
|
||||
return (NULL);
|
||||
|
||||
dma = malloc(sizeof(*dma), M_DEVBUF, M_WAITOK | M_ZERO);
|
||||
@@ -147,10 +147,10 @@ aoa_dma_delete(struct aoa_dma *dma)
|
||||
static uint32_t
|
||||
aoa_chan_setblocksize(kobj_t obj, void *data, uint32_t blocksz)
|
||||
{
|
||||
struct aoa_dma *dma = data;
|
||||
int err, lz;
|
||||
struct aoa_dma *dma = data;
|
||||
int err, lz;
|
||||
|
||||
DPRINTF(("aoa_chan_setblocksize: blocksz = %u, dma->blksz = %u\n",
|
||||
DPRINTF(("aoa_chan_setblocksize: blocksz = %u, dma->blksz = %u\n",
|
||||
blocksz, dma->blksz));
|
||||
KASSERT(!dma->running, ("dma is running"));
|
||||
KASSERT(blocksz > 0, ("bad blocksz"));
|
||||
@@ -209,7 +209,7 @@ aoa_chan_setspeed(kobj_t obj, void *data, uint32_t speed)
|
||||
static uint32_t
|
||||
aoa_chan_getptr(kobj_t obj, void *data)
|
||||
{
|
||||
struct aoa_dma *dma = data;
|
||||
struct aoa_dma *dma = data;
|
||||
|
||||
if (!dma->running)
|
||||
return (0);
|
||||
@@ -218,12 +218,12 @@ aoa_chan_getptr(kobj_t obj, void *data)
|
||||
}
|
||||
|
||||
static void *
|
||||
aoa_chan_init(kobj_t obj, void *devinfo, struct snd_dbuf *b,
|
||||
aoa_chan_init(kobj_t obj, void *devinfo, struct snd_dbuf *b,
|
||||
struct pcm_channel *c, int dir)
|
||||
{
|
||||
struct aoa_softc *sc = devinfo;
|
||||
struct aoa_softc *sc = devinfo;
|
||||
struct aoa_dma *dma;
|
||||
int max_slots, err;
|
||||
int max_slots, err;
|
||||
|
||||
KASSERT(dir == PCMDIR_PLAY, ("bad dir"));
|
||||
|
||||
@@ -257,15 +257,15 @@ aoa_chan_init(kobj_t obj, void *devinfo, struct snd_dbuf *b,
|
||||
static int
|
||||
aoa_chan_trigger(kobj_t obj, void *data, int go)
|
||||
{
|
||||
struct aoa_dma *dma = data;
|
||||
int i;
|
||||
struct aoa_dma *dma = data;
|
||||
int i;
|
||||
|
||||
switch (go) {
|
||||
case PCMTRIG_START:
|
||||
|
||||
/* Start the DMA. */
|
||||
dma->running = 1;
|
||||
|
||||
|
||||
dma->slot = 0;
|
||||
dbdma_set_current_cmd(dma->channel, dma->slot);
|
||||
|
||||
@@ -275,7 +275,7 @@ aoa_chan_trigger(kobj_t obj, void *data, int go)
|
||||
|
||||
case PCMTRIG_STOP:
|
||||
case PCMTRIG_ABORT:
|
||||
|
||||
|
||||
mtx_lock(&dma->mutex);
|
||||
|
||||
dma->running = 0;
|
||||
@@ -304,7 +304,7 @@ aoa_chan_trigger(kobj_t obj, void *data, int go)
|
||||
static int
|
||||
aoa_chan_free(kobj_t obj, void *data)
|
||||
{
|
||||
struct aoa_dma *dma = data;
|
||||
struct aoa_dma *dma = data;
|
||||
|
||||
sndbuf_free(dma->buf);
|
||||
dbdma_free_channel(dma->channel);
|
||||
@@ -313,7 +313,7 @@ aoa_chan_free(kobj_t obj, void *data)
|
||||
return (0);
|
||||
}
|
||||
|
||||
void
|
||||
void
|
||||
aoa_interrupt(void *xsc)
|
||||
{
|
||||
struct aoa_softc *sc = xsc;
|
||||
@@ -349,10 +349,10 @@ aoa_chan_getcaps(kobj_t obj, void *data)
|
||||
}
|
||||
|
||||
static kobj_method_t aoa_chan_methods[] = {
|
||||
KOBJMETHOD(channel_init, aoa_chan_init),
|
||||
KOBJMETHOD(channel_free, aoa_chan_free),
|
||||
KOBJMETHOD(channel_setformat, aoa_chan_setformat),
|
||||
KOBJMETHOD(channel_setspeed, aoa_chan_setspeed),
|
||||
KOBJMETHOD(channel_init, aoa_chan_init),
|
||||
KOBJMETHOD(channel_free, aoa_chan_free),
|
||||
KOBJMETHOD(channel_setformat, aoa_chan_setformat),
|
||||
KOBJMETHOD(channel_setspeed, aoa_chan_setspeed),
|
||||
KOBJMETHOD(channel_setblocksize,aoa_chan_setblocksize),
|
||||
KOBJMETHOD(channel_trigger, aoa_chan_trigger),
|
||||
KOBJMETHOD(channel_getptr, aoa_chan_getptr),
|
||||
@@ -384,7 +384,7 @@ aoa_attach(void *xsc, kobj_class_t mixer_class, void *mixer_devinfo)
|
||||
|
||||
pcm_addchan(self, PCMDIR_PLAY, &aoa_chan_class, sc);
|
||||
|
||||
snprintf(status, sizeof(status), "at %s", ofw_bus_get_name(self));
|
||||
snprintf(status, sizeof(status), "at %s", ofw_bus_get_name(self));
|
||||
|
||||
return (pcm_register(self, status));
|
||||
}
|
||||
@@ -35,7 +35,7 @@
|
||||
#endif
|
||||
|
||||
struct aoa_softc {
|
||||
device_t sc_dev;
|
||||
device_t sc_dev;
|
||||
void *sc_intrp;
|
||||
struct resource *sc_odma;
|
||||
};
|
||||
|
||||
@@ -57,25 +57,25 @@
|
||||
#include "mixer_if.h"
|
||||
|
||||
struct davbus_softc {
|
||||
struct aoa_softc aoa;
|
||||
phandle_t node;
|
||||
phandle_t soundnode;
|
||||
struct resource *reg;
|
||||
struct mtx mutex;
|
||||
int device_id;
|
||||
unsigned int output_mask;
|
||||
unsigned int (*read_status)(struct davbus_softc *, unsigned int);
|
||||
struct aoa_softc aoa;
|
||||
phandle_t node;
|
||||
phandle_t soundnode;
|
||||
struct resource *reg;
|
||||
struct mtx mutex;
|
||||
int device_id;
|
||||
unsigned int output_mask;
|
||||
unsigned int (*read_status)(struct davbus_softc *, unsigned int);
|
||||
void (*set_outputs)(struct davbus_softc *, unsigned int);
|
||||
};
|
||||
|
||||
static int davbus_probe(device_t);
|
||||
static int davbus_attach(device_t);
|
||||
static int davbus_probe(device_t);
|
||||
static int davbus_attach(device_t);
|
||||
static void davbus_cint(void *);
|
||||
|
||||
static device_method_t pcm_davbus_methods[] = {
|
||||
/* Device interface. */
|
||||
DEVMETHOD(device_probe, davbus_probe),
|
||||
DEVMETHOD(device_attach, davbus_attach),
|
||||
DEVMETHOD(device_attach, davbus_attach),
|
||||
DEVMETHOD_END
|
||||
};
|
||||
|
||||
@@ -94,7 +94,7 @@ MODULE_DEPEND(pcm_davbus, sound, 1, 1, 1);
|
||||
static int
|
||||
davbus_probe(device_t self)
|
||||
{
|
||||
const char *name;
|
||||
const char *name;
|
||||
|
||||
name = ofw_bus_get_name(self);
|
||||
if (!name)
|
||||
@@ -115,7 +115,7 @@ davbus_probe(device_t self)
|
||||
static int burgundy_init(struct snd_mixer *m);
|
||||
static int burgundy_uninit(struct snd_mixer *m);
|
||||
static int burgundy_reinit(struct snd_mixer *m);
|
||||
static void burgundy_write_locked(struct davbus_softc *, unsigned int, unsigned int);
|
||||
static void burgundy_write_locked(struct davbus_softc *, unsigned int, unsigned int);
|
||||
static void burgundy_set_outputs(struct davbus_softc *d, unsigned int mask);
|
||||
static unsigned int burgundy_read_status(struct davbus_softc *d, unsigned int status);
|
||||
static int burgundy_set(struct snd_mixer *m, unsigned dev, unsigned left,
|
||||
@@ -123,10 +123,10 @@ static int burgundy_set(struct snd_mixer *m, unsigned dev, unsigned left,
|
||||
static uint32_t burgundy_setrecsrc(struct snd_mixer *m, uint32_t src);
|
||||
|
||||
static kobj_method_t burgundy_mixer_methods[] = {
|
||||
KOBJMETHOD(mixer_init, burgundy_init),
|
||||
KOBJMETHOD(mixer_uninit, burgundy_uninit),
|
||||
KOBJMETHOD(mixer_reinit, burgundy_reinit),
|
||||
KOBJMETHOD(mixer_set, burgundy_set),
|
||||
KOBJMETHOD(mixer_init, burgundy_init),
|
||||
KOBJMETHOD(mixer_uninit, burgundy_uninit),
|
||||
KOBJMETHOD(mixer_reinit, burgundy_reinit),
|
||||
KOBJMETHOD(mixer_set, burgundy_set),
|
||||
KOBJMETHOD(mixer_setrecsrc, burgundy_setrecsrc),
|
||||
KOBJMETHOD_END
|
||||
};
|
||||
@@ -146,7 +146,7 @@ burgundy_init(struct snd_mixer *m)
|
||||
/*
|
||||
* We configure the Burgundy codec as follows:
|
||||
*
|
||||
* o Input subframe 0 is connected to input digital
|
||||
* o Input subframe 0 is connected to input digital
|
||||
* stream A (ISA).
|
||||
* o Stream A (ISA) is mixed in mixer 2 (MIX2).
|
||||
* o Output of mixer 2 (MIX2) is routed to output sources
|
||||
@@ -157,12 +157,12 @@ burgundy_init(struct snd_mixer *m)
|
||||
|
||||
burgundy_write_locked(d, 0x16700, 0x40);
|
||||
|
||||
burgundy_write_locked(d, BURGUNDY_MIX0_REG, 0);
|
||||
burgundy_write_locked(d, BURGUNDY_MIX0_REG, 0);
|
||||
burgundy_write_locked(d, BURGUNDY_MIX1_REG, 0);
|
||||
burgundy_write_locked(d, BURGUNDY_MIX2_REG, BURGUNDY_MIX_ISA);
|
||||
burgundy_write_locked(d, BURGUNDY_MIX3_REG, 0);
|
||||
|
||||
burgundy_write_locked(d, BURGUNDY_OS_REG, BURGUNDY_OS0_MIX2 |
|
||||
burgundy_write_locked(d, BURGUNDY_OS_REG, BURGUNDY_OS0_MIX2 |
|
||||
BURGUNDY_OS1_MIX2);
|
||||
|
||||
burgundy_write_locked(d, BURGUNDY_SDIN_REG, BURGUNDY_ISA_SF0);
|
||||
@@ -177,7 +177,7 @@ burgundy_init(struct snd_mixer *m)
|
||||
burgundy_write_locked(d, BURGUNDY_ISSAL_REG, BURGUNDY_ISS_UNITY);
|
||||
burgundy_write_locked(d, BURGUNDY_ISSAR_REG, BURGUNDY_ISS_UNITY);
|
||||
|
||||
burgundy_set_outputs(d, burgundy_read_status(d,
|
||||
burgundy_set_outputs(d, burgundy_read_status(d,
|
||||
bus_read_4(d->reg, DAVBUS_CODEC_STATUS)));
|
||||
|
||||
mtx_unlock(&d->mutex);
|
||||
@@ -209,7 +209,7 @@ burgundy_write_locked(struct davbus_softc *d, unsigned int reg, unsigned int val
|
||||
offset = reg & 0xFF;
|
||||
|
||||
for (i = offset; i < offset + size; ++i) {
|
||||
data = BURGUNDY_CTRL_WRITE | (addr << 12) |
|
||||
data = BURGUNDY_CTRL_WRITE | (addr << 12) |
|
||||
((size + offset - 1) << 10) | (i << 8) | (val & 0xFF);
|
||||
if (i == offset)
|
||||
data |= BURGUNDY_CTRL_RESET;
|
||||
@@ -219,9 +219,9 @@ burgundy_write_locked(struct davbus_softc *d, unsigned int reg, unsigned int val
|
||||
while (bus_read_4(d->reg, DAVBUS_CODEC_CTRL) &
|
||||
DAVBUS_CODEC_BUSY)
|
||||
DELAY(1);
|
||||
|
||||
|
||||
val >>= 8; /* next byte. */
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Must be called with d->mutex held. */
|
||||
@@ -251,7 +251,7 @@ burgundy_set_outputs(struct davbus_softc *d, unsigned int mask)
|
||||
}
|
||||
if (mask & (1 << 1)) {
|
||||
DPRINTF((" HEADPHONES"));
|
||||
x |= BURGUNDY_P14L_EN | BURGUNDY_P14R_EN;
|
||||
x |= BURGUNDY_P14L_EN | BURGUNDY_P14R_EN;
|
||||
}
|
||||
DPRINTF(("\n"));
|
||||
|
||||
@@ -311,7 +311,7 @@ burgundy_setrecsrc(struct snd_mixer *m, uint32_t src)
|
||||
static int screamer_init(struct snd_mixer *m);
|
||||
static int screamer_uninit(struct snd_mixer *m);
|
||||
static int screamer_reinit(struct snd_mixer *m);
|
||||
static void screamer_write_locked(struct davbus_softc *, unsigned int, unsigned int);
|
||||
static void screamer_write_locked(struct davbus_softc *, unsigned int, unsigned int);
|
||||
static void screamer_set_outputs(struct davbus_softc *d, unsigned int mask);
|
||||
static unsigned int screamer_read_status(struct davbus_softc *d, unsigned int status);
|
||||
static int screamer_set(struct snd_mixer *m, unsigned dev, unsigned left,
|
||||
@@ -319,10 +319,10 @@ static int screamer_set(struct snd_mixer *m, unsigned dev, unsigned left,
|
||||
static uint32_t screamer_setrecsrc(struct snd_mixer *m, uint32_t src);
|
||||
|
||||
static kobj_method_t screamer_mixer_methods[] = {
|
||||
KOBJMETHOD(mixer_init, screamer_init),
|
||||
KOBJMETHOD(mixer_uninit, screamer_uninit),
|
||||
KOBJMETHOD(mixer_reinit, screamer_reinit),
|
||||
KOBJMETHOD(mixer_set, screamer_set),
|
||||
KOBJMETHOD(mixer_init, screamer_init),
|
||||
KOBJMETHOD(mixer_uninit, screamer_uninit),
|
||||
KOBJMETHOD(mixer_reinit, screamer_reinit),
|
||||
KOBJMETHOD(mixer_set, screamer_set),
|
||||
KOBJMETHOD(mixer_setrecsrc, screamer_setrecsrc),
|
||||
KOBJMETHOD_END
|
||||
};
|
||||
@@ -341,10 +341,10 @@ screamer_init(struct snd_mixer *m)
|
||||
|
||||
mtx_lock(&d->mutex);
|
||||
|
||||
screamer_write_locked(d, SCREAMER_CODEC_ADDR0, SCREAMER_INPUT_CD |
|
||||
screamer_write_locked(d, SCREAMER_CODEC_ADDR0, SCREAMER_INPUT_CD |
|
||||
SCREAMER_DEFAULT_CD_GAIN);
|
||||
|
||||
screamer_set_outputs(d, screamer_read_status(d,
|
||||
screamer_set_outputs(d, screamer_read_status(d,
|
||||
bus_read_4(d->reg, DAVBUS_CODEC_STATUS)));
|
||||
|
||||
screamer_write_locked(d, SCREAMER_CODEC_ADDR2, 0);
|
||||
@@ -374,7 +374,7 @@ screamer_reinit(struct snd_mixer *m)
|
||||
static void
|
||||
screamer_write_locked(struct davbus_softc *d, unsigned int reg, unsigned int val)
|
||||
{
|
||||
unsigned int x;
|
||||
unsigned int x;
|
||||
|
||||
KASSERT(val == (val & 0xfff), ("bad val"));
|
||||
|
||||
@@ -394,7 +394,7 @@ screamer_write_locked(struct davbus_softc *d, unsigned int reg, unsigned int val
|
||||
static void
|
||||
screamer_set_outputs(struct davbus_softc *d, unsigned int mask)
|
||||
{
|
||||
unsigned int x;
|
||||
unsigned int x;
|
||||
|
||||
if (mask == d->output_mask) {
|
||||
return;
|
||||
@@ -433,7 +433,7 @@ screamer_set_outputs(struct davbus_softc *d, unsigned int mask)
|
||||
static unsigned int
|
||||
screamer_read_status(struct davbus_softc *d, unsigned int status)
|
||||
{
|
||||
int headphones;
|
||||
int headphones;
|
||||
|
||||
switch (d->device_id) {
|
||||
case 5: /* Sawtooth */
|
||||
@@ -473,7 +473,7 @@ screamer_set(struct snd_mixer *m, unsigned dev, unsigned left, unsigned right)
|
||||
mtx_lock(&d->mutex);
|
||||
screamer_write_locked(d, SCREAMER_CODEC_ADDR2, (lval << 6) |
|
||||
rval);
|
||||
screamer_write_locked(d, SCREAMER_CODEC_ADDR4, (lval << 6) |
|
||||
screamer_write_locked(d, SCREAMER_CODEC_ADDR4, (lval << 6) |
|
||||
rval);
|
||||
mtx_unlock(&d->mutex);
|
||||
|
||||
@@ -492,12 +492,12 @@ screamer_setrecsrc(struct snd_mixer *m, uint32_t src)
|
||||
static int
|
||||
davbus_attach(device_t self)
|
||||
{
|
||||
struct davbus_softc *sc;
|
||||
struct resource *dbdma_irq, *cintr;
|
||||
void *cookie;
|
||||
struct davbus_softc *sc;
|
||||
struct resource *dbdma_irq, *cintr;
|
||||
void *cookie;
|
||||
kobj_class_t mixer_class;
|
||||
char compat[64];
|
||||
int rid, oirq, err;
|
||||
int rid, oirq, err;
|
||||
|
||||
sc = malloc(sizeof(*sc), M_DEVBUF, M_WAITOK | M_ZERO);
|
||||
|
||||
@@ -508,19 +508,19 @@ davbus_attach(device_t self)
|
||||
/* Map the controller register space. */
|
||||
rid = 0;
|
||||
sc->reg = bus_alloc_resource_any(self, SYS_RES_MEMORY, &rid, RF_ACTIVE);
|
||||
if (sc->reg == NULL)
|
||||
if (sc->reg == NULL)
|
||||
return (ENXIO);
|
||||
|
||||
/* Map the DBDMA channel register space. */
|
||||
rid = 1;
|
||||
sc->aoa.sc_odma = bus_alloc_resource_any(self, SYS_RES_MEMORY,
|
||||
sc->aoa.sc_odma = bus_alloc_resource_any(self, SYS_RES_MEMORY,
|
||||
&rid, RF_ACTIVE);
|
||||
if (sc->aoa.sc_odma == NULL)
|
||||
return (ENXIO);
|
||||
|
||||
/* Establish the DBDMA channel edge-triggered interrupt. */
|
||||
rid = 1;
|
||||
dbdma_irq = bus_alloc_resource_any(self, SYS_RES_IRQ,
|
||||
dbdma_irq = bus_alloc_resource_any(self, SYS_RES_IRQ,
|
||||
&rid, RF_SHAREABLE | RF_ACTIVE);
|
||||
if (dbdma_irq == NULL)
|
||||
return (ENXIO);
|
||||
@@ -532,7 +532,7 @@ davbus_attach(device_t self)
|
||||
err = powerpc_config_intr(oirq, INTR_TRIGGER_EDGE, INTR_POLARITY_LOW);
|
||||
if (err != 0)
|
||||
return (err);
|
||||
|
||||
|
||||
snd_setup_intr(self, dbdma_irq, INTR_MPSAFE, aoa_interrupt,
|
||||
sc, &cookie);
|
||||
|
||||
@@ -548,14 +548,14 @@ davbus_attach(device_t self)
|
||||
|
||||
/* Setup the control interrupt. */
|
||||
rid = 0;
|
||||
cintr = bus_alloc_resource_any(self, SYS_RES_IRQ,
|
||||
cintr = bus_alloc_resource_any(self, SYS_RES_IRQ,
|
||||
&rid, RF_SHAREABLE | RF_ACTIVE);
|
||||
if (cintr != NULL)
|
||||
if (cintr != NULL)
|
||||
bus_setup_intr(self, cintr, INTR_TYPE_MISC | INTR_MPSAFE,
|
||||
NULL, davbus_cint, sc, &cookie);
|
||||
|
||||
/* Initialize controller registers. */
|
||||
bus_write_4(sc->reg, DAVBUS_SOUND_CTRL, DAVBUS_INPUT_SUBFRAME0 |
|
||||
bus_write_4(sc->reg, DAVBUS_SOUND_CTRL, DAVBUS_INPUT_SUBFRAME0 |
|
||||
DAVBUS_OUTPUT_SUBFRAME0 | DAVBUS_RATE_44100 | DAVBUS_INTR_PORTCHG);
|
||||
|
||||
/* Pick the codec module */
|
||||
@@ -574,7 +574,7 @@ davbus_attach(device_t self)
|
||||
return (0);
|
||||
}
|
||||
|
||||
static void
|
||||
static void
|
||||
davbus_cint(void *ptr)
|
||||
{
|
||||
struct davbus_softc *d = ptr;
|
||||
@@ -584,9 +584,9 @@ davbus_cint(void *ptr)
|
||||
|
||||
reg = bus_read_4(d->reg, DAVBUS_SOUND_CTRL);
|
||||
if (reg & DAVBUS_PORTCHG) {
|
||||
|
||||
|
||||
status = bus_read_4(d->reg, DAVBUS_CODEC_STATUS);
|
||||
|
||||
|
||||
if (d->read_status && d->set_outputs) {
|
||||
mask = (*d->read_status)(d, status);
|
||||
(*d->set_outputs)(d, mask);
|
||||
|
||||
@@ -152,7 +152,7 @@
|
||||
#define BURGUNDY_OS3_MIX2 0x00000080
|
||||
#define BURGUNDY_OS3_MIX3 0x000000C0
|
||||
#define BURGUNDY_OSA_MIX0 0x00000000
|
||||
#define BURGUNDY_OSA_MIX1 0x00010000
|
||||
#define BURGUNDY_OSA_MIX1 0x00010000
|
||||
#define BURGUNDY_OSA_MIX2 0x00020000
|
||||
#define BURGUNDY_OSA_MIX3 0x00030000
|
||||
#define BURGUNDY_OSB_MIX0 0x00000000
|
||||
@@ -195,8 +195,8 @@
|
||||
#define BURGUNDY_OSS3R_REG 0x13103
|
||||
#define BURGUNDY_OSS_UNITY 0xDF
|
||||
|
||||
/* Digital input streams ISA-ISC. A stream may be derived from data coming
|
||||
from the controller in subframes 0 to 3 as well as from internal
|
||||
/* Digital input streams ISA-ISC. A stream may be derived from data coming
|
||||
from the controller in subframes 0 to 3 as well as from internal
|
||||
output sources OSA-OSD. */
|
||||
#define BURGUNDY_SDIN_REG 0x17800
|
||||
#define BURGUNDY_ISA_SF0 0x00
|
||||
@@ -214,7 +214,7 @@
|
||||
#define BURGUNDY_ISS_UNITY 0xDF
|
||||
|
||||
/*
|
||||
* Screamer codec control bits
|
||||
* Screamer codec control bits
|
||||
* This codec has the following 12-bit control registers:
|
||||
* cc0 cc1 cc2 cc4 cc5 cc6 cc7
|
||||
*/
|
||||
@@ -237,7 +237,7 @@
|
||||
* Bits 7-4 specify the left ADC input gain;
|
||||
* bits 3-0 specify the right ADC input gain.
|
||||
*
|
||||
* The gain is a 4-bit value expressed in units of 1.5 dB,
|
||||
* The gain is a 4-bit value expressed in units of 1.5 dB,
|
||||
* ranging from 0 dB (0) to +22.5 dB (15).
|
||||
*/
|
||||
#define SCREAMER_DEFAULT_CD_GAIN 0x000000bb /* +16.5 dB */
|
||||
@@ -251,8 +251,8 @@
|
||||
#define SCREAMER_MUTE_SPEAKER 0x00000080
|
||||
#define SCREAMER_MUTE_HEADPHONES 0x00000200
|
||||
#define SCREAMER_PARALLEL_OUTPUT 0x00000c00
|
||||
#define SCREAMER_PROG_OUTPUT0 0x00000400
|
||||
#define SCREAMER_PROG_OUTPUT1 0x00000800
|
||||
#define SCREAMER_PROG_OUTPUT0 0x00000400
|
||||
#define SCREAMER_PROG_OUTPUT1 0x00000800
|
||||
|
||||
/* cc2: headphones/external port attenuation */
|
||||
/* cc4: internal speaker attenuation */
|
||||
@@ -265,12 +265,12 @@
|
||||
*/
|
||||
|
||||
/* screamer codec status bits. */
|
||||
#define SCREAMER_STATUS_MASK 0x00FFFFFF
|
||||
#define SCREAMER_STATUS_SENSEMASK 0x0000000F
|
||||
#define SCREAMER_STATUS_SENSE0 0x00000008
|
||||
#define SCREAMER_STATUS_SENSE1 0x00000004
|
||||
#define SCREAMER_STATUS_SENSE2 0x00000002
|
||||
#define SCREAMER_STATUS_SENSE3 0x00000001
|
||||
#define SCREAMER_STATUS_MASK 0x00FFFFFF
|
||||
#define SCREAMER_STATUS_SENSEMASK 0x0000000F
|
||||
#define SCREAMER_STATUS_SENSE0 0x00000008
|
||||
#define SCREAMER_STATUS_SENSE1 0x00000004
|
||||
#define SCREAMER_STATUS_SENSE2 0x00000002
|
||||
#define SCREAMER_STATUS_SENSE3 0x00000001
|
||||
#define SCREAMER_STATUS_PARTMASK 0x00000300
|
||||
#define SCREAMER_STATUS_PARTSHFT 8
|
||||
#define SCREAMER_PART_CRYSTAL 0x00000100
|
||||
|
||||
+63
-63
@@ -49,8 +49,8 @@
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* NetBSD: snapper.c,v 1.28 2008/05/16 03:49:54 macallan Exp
|
||||
* Id: snapper.c,v 1.11 2002/10/31 17:42:13 tsubai Exp
|
||||
* NetBSD: snapper.c,v 1.28 2008/05/16 03:49:54 macallan Exp
|
||||
* Id: snapper.c,v 1.11 2002/10/31 17:42:13 tsubai Exp
|
||||
*/
|
||||
|
||||
/*
|
||||
@@ -83,24 +83,24 @@
|
||||
#include <powerpc/powermac/macgpiovar.h>
|
||||
|
||||
struct i2s_softc {
|
||||
struct aoa_softc aoa;
|
||||
phandle_t node;
|
||||
struct aoa_softc aoa;
|
||||
phandle_t node;
|
||||
phandle_t soundnode;
|
||||
struct resource *reg;
|
||||
unsigned int output_mask;
|
||||
struct mtx port_mtx;
|
||||
struct resource *reg;
|
||||
unsigned int output_mask;
|
||||
struct mtx port_mtx;
|
||||
};
|
||||
|
||||
static int i2s_probe(device_t);
|
||||
static int i2s_attach(device_t);
|
||||
static void i2s_postattach(void *);
|
||||
static int i2s_setup(struct i2s_softc *, unsigned int, unsigned int, unsigned int);
|
||||
static int i2s_probe(device_t);
|
||||
static int i2s_attach(device_t);
|
||||
static void i2s_postattach(void *);
|
||||
static int i2s_setup(struct i2s_softc *, unsigned int, unsigned int, unsigned int);
|
||||
static void i2s_mute_headphone (struct i2s_softc *, int);
|
||||
static void i2s_mute_lineout (struct i2s_softc *, int);
|
||||
static void i2s_mute_speaker (struct i2s_softc *, int);
|
||||
static void i2s_set_outputs(void *, unsigned int);
|
||||
static void i2s_set_outputs(void *, unsigned int);
|
||||
|
||||
static struct intr_config_hook *i2s_delayed_attach = NULL;
|
||||
static struct intr_config_hook *i2s_delayed_attach = NULL;
|
||||
|
||||
kobj_class_t i2s_mixer_class = NULL;
|
||||
device_t i2s_mixer = NULL;
|
||||
@@ -108,7 +108,7 @@ device_t i2s_mixer = NULL;
|
||||
static device_method_t pcm_i2s_methods[] = {
|
||||
/* Device interface. */
|
||||
DEVMETHOD(device_probe, i2s_probe),
|
||||
DEVMETHOD(device_attach, i2s_attach),
|
||||
DEVMETHOD(device_attach, i2s_attach),
|
||||
DEVMETHOD_END
|
||||
};
|
||||
|
||||
@@ -122,7 +122,7 @@ DRIVER_MODULE(pcm_i2s, macio, pcm_i2s_driver, 0, 0);
|
||||
MODULE_DEPEND(pcm_i2s, sound, 1, 1, 1);
|
||||
|
||||
static int aoagpio_probe(device_t);
|
||||
static int aoagpio_attach(device_t);
|
||||
static int aoagpio_attach(device_t);
|
||||
|
||||
static device_method_t aoagpio_methods[] = {
|
||||
/* Device interface. */
|
||||
@@ -132,8 +132,8 @@ static device_method_t aoagpio_methods[] = {
|
||||
};
|
||||
|
||||
struct aoagpio_softc {
|
||||
device_t dev;
|
||||
int ctrl;
|
||||
device_t dev;
|
||||
int ctrl;
|
||||
int detect_active; /* for extint-gpio */
|
||||
int level; /* for extint-gpio */
|
||||
struct i2s_softc *i2s; /* for extint-gpio */
|
||||
@@ -153,7 +153,7 @@ DRIVER_MODULE(aoagpio, macgpio, aoagpio_driver, 0, 0);
|
||||
static int
|
||||
i2s_probe(device_t self)
|
||||
{
|
||||
const char *name;
|
||||
const char *name;
|
||||
phandle_t subchild;
|
||||
char subchildname[255];
|
||||
|
||||
@@ -184,11 +184,11 @@ static phandle_t of_find_firstchild_byname(phandle_t, const char *);
|
||||
static int
|
||||
i2s_attach(device_t self)
|
||||
{
|
||||
struct i2s_softc *sc;
|
||||
struct resource *dbdma_irq;
|
||||
struct i2s_softc *sc;
|
||||
struct resource *dbdma_irq;
|
||||
void *dbdma_ih;
|
||||
int rid, oirq, err;
|
||||
phandle_t port;
|
||||
int rid, oirq, err;
|
||||
phandle_t port;
|
||||
|
||||
sc = malloc(sizeof(*sc), M_DEVBUF, M_WAITOK | M_ZERO);
|
||||
|
||||
@@ -212,14 +212,14 @@ i2s_attach(device_t self)
|
||||
|
||||
/* Map the DBDMA channel register space. */
|
||||
rid = 1;
|
||||
sc->aoa.sc_odma = bus_alloc_resource_any(self, SYS_RES_MEMORY, &rid,
|
||||
sc->aoa.sc_odma = bus_alloc_resource_any(self, SYS_RES_MEMORY, &rid,
|
||||
RF_ACTIVE);
|
||||
if (sc->aoa.sc_odma == NULL)
|
||||
return ENXIO;
|
||||
|
||||
/* Establish the DBDMA channel edge-triggered interrupt. */
|
||||
rid = 1;
|
||||
dbdma_irq = bus_alloc_resource_any(self, SYS_RES_IRQ,
|
||||
dbdma_irq = bus_alloc_resource_any(self, SYS_RES_IRQ,
|
||||
&rid, RF_SHAREABLE | RF_ACTIVE);
|
||||
if (dbdma_irq == NULL)
|
||||
return (ENXIO);
|
||||
@@ -270,7 +270,7 @@ enum gpio_ctrl {
|
||||
((1 << HEADPHONE_DETECT) | \
|
||||
(1 << LINEOUT_DETECT))
|
||||
|
||||
static struct aoagpio_softc *gpio_ctrls[GPIO_CTRL_NUM] =
|
||||
static struct aoagpio_softc *gpio_ctrls[GPIO_CTRL_NUM] =
|
||||
{NULL, NULL, NULL, NULL, NULL, NULL};
|
||||
|
||||
static struct gpio_match {
|
||||
@@ -279,21 +279,21 @@ static struct gpio_match {
|
||||
} gpio_controls[] = {
|
||||
{"headphone-mute", HEADPHONE_MUTE},
|
||||
{"lineout-mute", LINEOUT_MUTE},
|
||||
{"amp-mute", AMP_MUTE},
|
||||
{"amp-mute", AMP_MUTE},
|
||||
{"headphone-detect", HEADPHONE_DETECT},
|
||||
{"lineout-detect", LINEOUT_DETECT},
|
||||
{"line-output-detect", LINEOUT_DETECT},
|
||||
{"audio-hw-reset", AUDIO_HW_RESET},
|
||||
{"hw-reset", AUDIO_HW_RESET},
|
||||
{NULL, GPIO_CTRL_NUM}
|
||||
{"hw-reset", AUDIO_HW_RESET},
|
||||
{NULL, GPIO_CTRL_NUM}
|
||||
};
|
||||
|
||||
static void i2s_cint(struct i2s_softc *);
|
||||
static void i2s_cint(struct i2s_softc *);
|
||||
|
||||
static void
|
||||
aoagpio_int(void *cookie)
|
||||
{
|
||||
device_t self = cookie;
|
||||
device_t self = cookie;
|
||||
struct aoagpio_softc *sc;
|
||||
|
||||
sc = device_get_softc(self);
|
||||
@@ -310,9 +310,9 @@ aoagpio_int(void *cookie)
|
||||
static int
|
||||
aoagpio_probe(device_t gpio)
|
||||
{
|
||||
phandle_t node;
|
||||
phandle_t node;
|
||||
char bname[32];
|
||||
const char *name;
|
||||
const char *name;
|
||||
struct gpio_match *m;
|
||||
struct aoagpio_softc *sc;
|
||||
|
||||
@@ -337,7 +337,7 @@ aoagpio_probe(device_t gpio)
|
||||
sc->detect_active = 0;
|
||||
sc->i2s = NULL;
|
||||
|
||||
OF_getprop(node, "audio-gpio-active-state",
|
||||
OF_getprop(node, "audio-gpio-active-state",
|
||||
&sc->detect_active, sizeof(sc->detect_active));
|
||||
|
||||
if ((1 << m->ctrl) & GPIO_CTRL_EXTINT_SET)
|
||||
@@ -352,7 +352,7 @@ aoagpio_probe(device_t gpio)
|
||||
return (ENXIO);
|
||||
}
|
||||
|
||||
static int
|
||||
static int
|
||||
aoagpio_attach(device_t gpio)
|
||||
{
|
||||
struct aoagpio_softc *sc;
|
||||
@@ -370,8 +370,8 @@ aoagpio_attach(device_t gpio)
|
||||
irq = rman_get_start(r);
|
||||
DPRINTF(("interrupting at irq %d\n", irq));
|
||||
|
||||
if (powerpc_config_intr(irq, INTR_TRIGGER_EDGE,
|
||||
INTR_POLARITY_LOW) != 0)
|
||||
if (powerpc_config_intr(irq, INTR_TRIGGER_EDGE,
|
||||
INTR_POLARITY_LOW) != 0)
|
||||
return (ENXIO);
|
||||
|
||||
bus_setup_intr(gpio, r, INTR_TYPE_MISC | INTR_MPSAFE |
|
||||
@@ -418,7 +418,7 @@ aoagpio_attach(device_t gpio)
|
||||
#define OUTPUT_16BIT (0 << 0)
|
||||
#define OUTPUT_24BIT (3 << 0)
|
||||
|
||||
/* Master clock, needed by some codecs. We hardcode this
|
||||
/* Master clock, needed by some codecs. We hardcode this
|
||||
to 256 * fs as this is valid for most codecs. */
|
||||
#define MCLK_FS 256
|
||||
|
||||
@@ -436,7 +436,7 @@ static const struct i2s_clksrc {
|
||||
/* Configure the I2S controller for the required settings.
|
||||
'rate' is the frame rate.
|
||||
'wordsize' is the sample size (usually 16 bits).
|
||||
'sclk_fs' is the SCLK/framerate ratio, which needs to be equal
|
||||
'sclk_fs' is the SCLK/framerate ratio, which needs to be equal
|
||||
or greater to the number of bits per frame. */
|
||||
|
||||
static int
|
||||
@@ -487,7 +487,7 @@ i2s_setup(struct i2s_softc *sc, unsigned int rate, unsigned int wordsize, unsign
|
||||
break;
|
||||
}
|
||||
reg |= (x << 24) & MCLK_DIV_MASK;
|
||||
|
||||
|
||||
switch (sdiv) {
|
||||
case 1:
|
||||
x = 8;
|
||||
@@ -502,8 +502,8 @@ i2s_setup(struct i2s_softc *sc, unsigned int rate, unsigned int wordsize, unsign
|
||||
reg |= (x << 20) & SCLK_DIV_MASK;
|
||||
|
||||
/*
|
||||
* XXX use master mode for now. This needs to be
|
||||
* revisited if we want to add recording from SPDIF some day.
|
||||
* XXX use master mode for now. This needs to be
|
||||
* revisited if we want to add recording from SPDIF some day.
|
||||
*/
|
||||
reg |= SCLK_MASTER;
|
||||
|
||||
@@ -537,8 +537,8 @@ i2s_setup(struct i2s_softc *sc, unsigned int rate, unsigned int wordsize, unsign
|
||||
x = bus_read_4(sc->reg, I2S_FORMAT);
|
||||
if (x != reg) {
|
||||
/*
|
||||
* XXX to change the format we need to stop the clock
|
||||
* via the FCR registers. For now, rely on the firmware
|
||||
* XXX to change the format we need to stop the clock
|
||||
* via the FCR registers. For now, rely on the firmware
|
||||
* to set sane defaults (44100).
|
||||
*/
|
||||
printf("i2s_setup: changing format not supported yet.\n");
|
||||
@@ -546,17 +546,17 @@ i2s_setup(struct i2s_softc *sc, unsigned int rate, unsigned int wordsize, unsign
|
||||
|
||||
#ifdef notyet
|
||||
if (obio_fcr_isset(OBIO_FCR1, I2S0CLKEN)) {
|
||||
|
||||
bus_space_write_4(sc->sc_tag, sc->sc_bsh, I2S_INT,
|
||||
|
||||
bus_space_write_4(sc->sc_tag, sc->sc_bsh, I2S_INT,
|
||||
I2S_INT_CLKSTOPPEND);
|
||||
|
||||
|
||||
obio_fcr_clear(OBIO_FCR1, I2S0CLKEN);
|
||||
|
||||
for (timo = 1000; timo > 0; timo--) {
|
||||
if (bus_space_read_4(sc->sc_tag, sc->sc_bsh,
|
||||
I2S_INT) & I2S_INT_CLKSTOPPEND)
|
||||
break;
|
||||
|
||||
|
||||
DELAY(10);
|
||||
}
|
||||
|
||||
@@ -566,7 +566,7 @@ i2s_setup(struct i2s_softc *sc, unsigned int rate, unsigned int wordsize, unsign
|
||||
}
|
||||
|
||||
bus_space_write_4(sc->sc_tag, sc->sc_bsh, I2S_FORMAT, reg);
|
||||
|
||||
|
||||
obio_fcr_set(OBIO_FCR1, I2S0CLKEN);
|
||||
#endif
|
||||
}
|
||||
@@ -578,8 +578,8 @@ i2s_setup(struct i2s_softc *sc, unsigned int rate, unsigned int wordsize, unsign
|
||||
static phandle_t
|
||||
of_find_firstchild_byname(phandle_t node, const char *req_name)
|
||||
{
|
||||
char name[32]; /* max name len per OF spec. */
|
||||
phandle_t n;
|
||||
char name[32]; /* max name len per OF spec. */
|
||||
phandle_t n;
|
||||
|
||||
for (n = OF_child(node); n != -1; n = OF_peer(n)) {
|
||||
bzero(name, sizeof(name));
|
||||
@@ -606,8 +606,8 @@ gpio_read(enum gpio_ctrl ctrl)
|
||||
static void
|
||||
gpio_write(enum gpio_ctrl ctrl, unsigned int x)
|
||||
{
|
||||
struct aoagpio_softc *sc;
|
||||
unsigned int reg;
|
||||
struct aoagpio_softc *sc;
|
||||
unsigned int reg;
|
||||
|
||||
if ((sc = gpio_ctrls[ctrl]) == NULL)
|
||||
return;
|
||||
@@ -619,16 +619,16 @@ gpio_write(enum gpio_ctrl ctrl, unsigned int x)
|
||||
macgpio_write(sc->dev, reg);
|
||||
}
|
||||
|
||||
static void
|
||||
static void
|
||||
i2s_cint(struct i2s_softc *sc)
|
||||
{
|
||||
unsigned int mask = 0;
|
||||
|
||||
if (gpio_ctrls[HEADPHONE_DETECT] &&
|
||||
if (gpio_ctrls[HEADPHONE_DETECT] &&
|
||||
gpio_ctrls[HEADPHONE_DETECT]->level)
|
||||
mask |= 1 << 1;
|
||||
|
||||
if (gpio_ctrls[LINEOUT_DETECT] &&
|
||||
if (gpio_ctrls[LINEOUT_DETECT] &&
|
||||
gpio_ctrls[LINEOUT_DETECT]->level)
|
||||
mask |= 1 << 2;
|
||||
|
||||
@@ -670,10 +670,10 @@ i2s_audio_hw_reset(struct i2s_softc *sc)
|
||||
#define LINEOUT_ACTIVE 0 /* XXX OF */
|
||||
|
||||
#define MUTE_CONTROL(xxx, yyy) \
|
||||
static void \
|
||||
static void \
|
||||
i2s_mute_##xxx(struct i2s_softc *sc, int mute) \
|
||||
{ \
|
||||
int x; \
|
||||
int x; \
|
||||
\
|
||||
if (gpio_ctrls[yyy##_MUTE] == NULL) \
|
||||
return; \
|
||||
@@ -693,7 +693,7 @@ MUTE_CONTROL(lineout, LINEOUT)
|
||||
static void
|
||||
i2s_set_outputs(void *ptr, unsigned int mask)
|
||||
{
|
||||
struct i2s_softc *sc = ptr;
|
||||
struct i2s_softc *sc = ptr;
|
||||
|
||||
if (mask == sc->output_mask)
|
||||
return;
|
||||
@@ -709,7 +709,7 @@ i2s_set_outputs(void *ptr, unsigned int mask)
|
||||
if (mask & (1 << 0)) {
|
||||
DPRINTF(("SPEAKER "));
|
||||
i2s_mute_speaker(sc, 0);
|
||||
}
|
||||
}
|
||||
if (mask & (1 << 1)) {
|
||||
DPRINTF(("HEADPHONE "));
|
||||
i2s_mute_headphone(sc, 0);
|
||||
@@ -728,9 +728,9 @@ i2s_set_outputs(void *ptr, unsigned int mask)
|
||||
static void
|
||||
i2s_postattach(void *xsc)
|
||||
{
|
||||
struct i2s_softc *sc = xsc;
|
||||
device_t self;
|
||||
int i;
|
||||
struct i2s_softc *sc = xsc;
|
||||
device_t self;
|
||||
int i;
|
||||
|
||||
self = sc->aoa.sc_dev;
|
||||
|
||||
@@ -748,7 +748,7 @@ i2s_postattach(void *xsc)
|
||||
/* Read initial port status. */
|
||||
i2s_cint(sc);
|
||||
|
||||
/* Enable GPIO interrupt callback. */
|
||||
/* Enable GPIO interrupt callback. */
|
||||
for (i = 0; i < GPIO_CTRL_NUM; i++)
|
||||
if (gpio_ctrls[i])
|
||||
gpio_ctrls[i]->i2s = sc;
|
||||
|
||||
@@ -49,8 +49,8 @@
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* NetBSD: snapper.c,v 1.28 2008/05/16 03:49:54 macallan Exp
|
||||
* Id: snapper.c,v 1.11 2002/10/31 17:42:13 tsubai Exp
|
||||
* NetBSD: snapper.c,v 1.28 2008/05/16 03:49:54 macallan Exp
|
||||
* Id: snapper.c,v 1.11 2002/10/31 17:42:13 tsubai Exp
|
||||
*/
|
||||
|
||||
/*
|
||||
@@ -98,7 +98,7 @@ struct snapper_softc
|
||||
};
|
||||
|
||||
static int snapper_probe(device_t);
|
||||
static int snapper_attach(device_t);
|
||||
static int snapper_attach(device_t);
|
||||
static int snapper_init(struct snd_mixer *m);
|
||||
static int snapper_uninit(struct snd_mixer *m);
|
||||
static int snapper_reinit(struct snd_mixer *m);
|
||||
@@ -124,11 +124,11 @@ MODULE_VERSION(snapper, 1);
|
||||
MODULE_DEPEND(snapper, iicbus, 1, 1, 1);
|
||||
|
||||
static kobj_method_t snapper_mixer_methods[] = {
|
||||
KOBJMETHOD(mixer_init, snapper_init),
|
||||
KOBJMETHOD(mixer_uninit, snapper_uninit),
|
||||
KOBJMETHOD(mixer_reinit, snapper_reinit),
|
||||
KOBJMETHOD(mixer_set, snapper_set),
|
||||
KOBJMETHOD(mixer_setrecsrc, snapper_setrecsrc),
|
||||
KOBJMETHOD(mixer_init, snapper_init),
|
||||
KOBJMETHOD(mixer_uninit, snapper_uninit),
|
||||
KOBJMETHOD(mixer_reinit, snapper_reinit),
|
||||
KOBJMETHOD(mixer_set, snapper_set),
|
||||
KOBJMETHOD(mixer_setrecsrc, snapper_setrecsrc),
|
||||
KOBJMETHOD_END
|
||||
};
|
||||
|
||||
@@ -221,8 +221,8 @@ struct snapper_reg {
|
||||
};
|
||||
|
||||
static const struct snapper_reg snapper_initdata = {
|
||||
{ SNAPPER_MCR1_SC_64 | SNAPPER_MCR1_SM_I2S |
|
||||
SNAPPER_MCR1_W_16 }, /* MCR1 */
|
||||
{ SNAPPER_MCR1_SC_64 | SNAPPER_MCR1_SM_I2S |
|
||||
SNAPPER_MCR1_W_16 }, /* MCR1 */
|
||||
{ 1, 0, 0, 0, 0, 0 }, /* DRC */
|
||||
{ 0, 0, 0, 0, 0, 0 }, /* VOLUME */
|
||||
{ 0x72 }, /* TREBLE */
|
||||
@@ -293,7 +293,7 @@ static const char snapper_regsize[] = {
|
||||
};
|
||||
|
||||
/* dB = 20 * log (x) table. */
|
||||
static unsigned int snapper_volume_table[100] = {
|
||||
static unsigned int snapper_volume_table[100] = {
|
||||
0x00000148, 0x0000015C, 0x00000171, 0x00000186, // -46.0, -45.5, -45.0, -44.5,
|
||||
0x0000019E, 0x000001B6, 0x000001D0, 0x000001EB, // -44.0, -43.5, -43.0, -42.5,
|
||||
0x00000209, 0x00000227, 0x00000248, 0x0000026B, // -42.0, -41.5, -41.0, -40.5,
|
||||
@@ -330,7 +330,7 @@ snapper_write(struct snapper_softc *sc, uint8_t reg, const void *data)
|
||||
struct iic_msg msg[] = {
|
||||
{ sc->sc_addr, IIC_M_WR, 0, buf }
|
||||
};
|
||||
|
||||
|
||||
KASSERT(reg < sizeof(snapper_regsize), ("bad reg"));
|
||||
size = snapper_regsize[reg];
|
||||
msg[0].len = size + 1;
|
||||
@@ -388,7 +388,7 @@ static int
|
||||
snapper_attach(device_t dev)
|
||||
{
|
||||
struct snapper_softc *sc;
|
||||
|
||||
|
||||
sc = device_get_softc(dev);
|
||||
sc->sc_dev = dev;
|
||||
sc->sc_addr = iicbus_get_addr(dev);
|
||||
|
||||
@@ -49,8 +49,8 @@
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* NetBSD: tumbler.c,v 1.28 2008/05/16 03:49:54 macallan Exp
|
||||
* Id: tumbler.c,v 1.11 2002/10/31 17:42:13 tsubai Exp
|
||||
* NetBSD: tumbler.c,v 1.28 2008/05/16 03:49:54 macallan Exp
|
||||
* Id: tumbler.c,v 1.11 2002/10/31 17:42:13 tsubai Exp
|
||||
*/
|
||||
|
||||
/*
|
||||
@@ -98,7 +98,7 @@ struct tumbler_softc
|
||||
};
|
||||
|
||||
static int tumbler_probe(device_t);
|
||||
static int tumbler_attach(device_t);
|
||||
static int tumbler_attach(device_t);
|
||||
static int tumbler_init(struct snd_mixer *m);
|
||||
static int tumbler_uninit(struct snd_mixer *m);
|
||||
static int tumbler_reinit(struct snd_mixer *m);
|
||||
@@ -124,11 +124,11 @@ MODULE_VERSION(tumbler, 1);
|
||||
MODULE_DEPEND(tumbler, iicbus, 1, 1, 1);
|
||||
|
||||
static kobj_method_t tumbler_mixer_methods[] = {
|
||||
KOBJMETHOD(mixer_init, tumbler_init),
|
||||
KOBJMETHOD(mixer_uninit, tumbler_uninit),
|
||||
KOBJMETHOD(mixer_reinit, tumbler_reinit),
|
||||
KOBJMETHOD(mixer_set, tumbler_set),
|
||||
KOBJMETHOD(mixer_setrecsrc, tumbler_setrecsrc),
|
||||
KOBJMETHOD(mixer_init, tumbler_init),
|
||||
KOBJMETHOD(mixer_uninit, tumbler_uninit),
|
||||
KOBJMETHOD(mixer_reinit, tumbler_reinit),
|
||||
KOBJMETHOD(mixer_set, tumbler_set),
|
||||
KOBJMETHOD(mixer_setrecsrc, tumbler_setrecsrc),
|
||||
KOBJMETHOD_END
|
||||
};
|
||||
|
||||
@@ -138,7 +138,7 @@ MIXER_DECLARE(tumbler_mixer);
|
||||
|
||||
/* Tumbler (Texas Instruments TAS3001) registers. */
|
||||
#define TUMBLER_MCR 0x01 /* Main control register (1byte) */
|
||||
#define TUMBLER_DRC 0x02 /* Dynamic Range Compression (2bytes) */
|
||||
#define TUMBLER_DRC 0x02 /* Dynamic Range Compression (2bytes) */
|
||||
#define TUMBLER_VOLUME 0x04 /* Volume (6bytes) */
|
||||
#define TUMBLER_TREBLE 0x05 /* Treble control (1byte) */
|
||||
#define TUMBLER_BASS 0x06 /* Bass control (1byte) */
|
||||
@@ -203,14 +203,14 @@ struct tumbler_reg {
|
||||
};
|
||||
|
||||
const struct tumbler_reg tumbler_initdata = {
|
||||
{ TUMBLER_MCR_SC_64 | TUMBLER_MCR_SM_I2S |
|
||||
{ TUMBLER_MCR_SC_64 | TUMBLER_MCR_SM_I2S |
|
||||
TUMBLER_MCR_ISM_I2S | TUMBLER_MCR_W_16 }, /* MCR */
|
||||
{ TUMBLER_DRC_COMP_31, TUMBLER_DRC_DEFL_TH }, /* DRC */
|
||||
{ 0, 0, 0, 0, 0, 0 }, /* VOLUME */
|
||||
{ 0x72 }, /* TREBLE */
|
||||
{ 0x3e }, /* BASS */
|
||||
{ 0x10, 0x00, 0x00 }, /* MIXER1 */
|
||||
{ 0x00, 0x00, 0x00 }, /* MIXER2 */
|
||||
{ 0x10, 0x00, 0x00 }, /* MIXER1 */
|
||||
{ 0x00, 0x00, 0x00 }, /* MIXER2 */
|
||||
{ 0x10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, /* BIQUAD */
|
||||
{ 0x10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, /* BIQUAD */
|
||||
{ 0x10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, /* BIQUAD */
|
||||
@@ -233,7 +233,7 @@ const char tumbler_regsize[] = {
|
||||
sizeof tumbler_initdata.VOLUME, /* 0x04 */
|
||||
sizeof tumbler_initdata.TREBLE, /* 0x05 */
|
||||
sizeof tumbler_initdata.BASS, /* 0x06 */
|
||||
sizeof tumbler_initdata.MIXER1, /* 0x07 */
|
||||
sizeof tumbler_initdata.MIXER1, /* 0x07 */
|
||||
sizeof tumbler_initdata.MIXER2, /* 0x08 */
|
||||
0, /* 0x09 */
|
||||
sizeof tumbler_initdata.LB0, /* 0x0a */
|
||||
@@ -254,7 +254,7 @@ const char tumbler_regsize[] = {
|
||||
};
|
||||
|
||||
/* dB = 20 * log (x) table. */
|
||||
static unsigned int tumbler_volume_table[100] = {
|
||||
static unsigned int tumbler_volume_table[100] = {
|
||||
0x00000148, 0x0000015C, 0x00000171, 0x00000186, // -46.0, -45.5, -45.0, -44.5,
|
||||
0x0000019E, 0x000001B6, 0x000001D0, 0x000001EB, // -44.0, -43.5, -43.0, -42.5,
|
||||
0x00000209, 0x00000227, 0x00000248, 0x0000026B, // -42.0, -41.5, -41.0, -40.5,
|
||||
@@ -291,7 +291,7 @@ tumbler_write(struct tumbler_softc *sc, uint8_t reg, const void *data)
|
||||
struct iic_msg msg[] = {
|
||||
{ sc->sc_addr, IIC_M_WR, 0, buf }
|
||||
};
|
||||
|
||||
|
||||
KASSERT(reg < sizeof(tumbler_regsize), ("bad reg"));
|
||||
size = tumbler_regsize[reg];
|
||||
msg[0].len = size + 1;
|
||||
@@ -330,7 +330,7 @@ tumbler_probe(device_t dev)
|
||||
if (name == NULL)
|
||||
return (ENXIO);
|
||||
|
||||
if (strcmp(name, "deq") == 0 && iicbus_get_addr(dev) ==
|
||||
if (strcmp(name, "deq") == 0 && iicbus_get_addr(dev) ==
|
||||
TUMBLER_IICADDR) {
|
||||
device_set_desc(dev, "Texas Instruments TAS3001 Audio Codec");
|
||||
return (0);
|
||||
@@ -343,7 +343,7 @@ static int
|
||||
tumbler_attach(device_t dev)
|
||||
{
|
||||
struct tumbler_softc *sc;
|
||||
|
||||
|
||||
sc = device_get_softc(dev);
|
||||
sc->sc_dev = dev;
|
||||
sc->sc_addr = iicbus_get_addr(dev);
|
||||
@@ -426,7 +426,7 @@ tumbler_set(struct snd_mixer *m, unsigned dev, unsigned left, unsigned right)
|
||||
|
||||
l = (left == 0 ? 0 : tumbler_volume_table[left - 1]);
|
||||
r = (right == 0 ? 0 : tumbler_volume_table[right - 1]);
|
||||
|
||||
|
||||
reg[0] = (l & 0xff0000) >> 16;
|
||||
reg[1] = (l & 0x00ff00) >> 8;
|
||||
reg[2] = l & 0x0000ff;
|
||||
|
||||
@@ -71,11 +71,11 @@ uint16_t gaw_kernel_vect_code[] = {
|
||||
0x7A80, 0x0063, 0xB811, 0x660A, 0x6209, 0xE304, 0x007A, 0x0C0B, 0x4005,
|
||||
0x100A, 0xBA01, 0x9012, 0x0C12, 0x4002, 0x7980, 0x00AF, 0x7A80, 0x006B,
|
||||
0xBE02, 0x620E, 0x660D, 0xBA10, 0xE344, 0x007A, 0x0C10, 0x4005, 0x100E,
|
||||
0xBA01, 0x9012, 0x0C12, 0x4002, 0x1003, 0xBA02, 0x9012, 0x0C12, 0x4000,
|
||||
0xBA01, 0x9012, 0x0C12, 0x4002, 0x1003, 0xBA02, 0x9012, 0x0C12, 0x4000,
|
||||
0x1003, 0xE388, 0x00BA, 0x1004, 0x7980, 0x00BC, 0x1004, 0xBA01, 0x9012,
|
||||
0x0C12, 0x4001, 0x0C05, 0x4003, 0x0C06, 0x4004, 0x1011, 0xBFB0, 0x01FF,
|
||||
0x9012, 0x0C12, 0x4006, 0xBC20, 0xEF00, 0xAE26, 0x1028, 0x6970, 0xBFD0,
|
||||
0x0001, 0x9070, 0xE388, 0x007A, 0xAE28, 0x0000, 0xEF00, 0xAE70, 0x0300,
|
||||
0x0001, 0x9070, 0xE388, 0x007A, 0xAE28, 0x0000, 0xEF00, 0xAE70, 0x0300,
|
||||
0x0C70, 0xB00C, 0xAE5A, 0x0000, 0xEF00, 0x7A80, 0x038A, 0x697F, 0xB801,
|
||||
0x907F, 0x0056, 0x8B88, 0x0CA0, 0xB008, 0xAF71, 0xB000, 0x4E71, 0xE200,
|
||||
0x00F3, 0xAE56, 0x1057, 0x0056, 0x0CA0, 0xB008, 0x8056, 0x7980, 0x03A1,
|
||||
@@ -107,7 +107,7 @@ uint16_t gaw_kernel_vect_code[] = {
|
||||
0x0380, 0x734C, 0x7A80, 0x0380, 0xBC21, 0xAE1C, 0x1090, 0x8B8A, 0xBF0A,
|
||||
0x0560, 0xE500, 0x7C40, 0x0812, 0xB804, 0x8813, 0x8B8D, 0xBF0D, 0x056C,
|
||||
0xE500, 0x7C40, 0x0815, 0xB804, 0x8811, 0x7A80, 0x034A, 0x8B8A, 0xBF0A,
|
||||
0x0560, 0xE500, 0x7C40, 0x731F, 0xB903, 0x8809, 0xBEC6, 0x01F9, 0x548A,
|
||||
0x0560, 0xE500, 0x7C40, 0x731F, 0xB903, 0x8809, 0xBEC6, 0x01F9, 0x548A,
|
||||
0xBE03, 0x98A0, 0x7320, 0xB903, 0x8809, 0xBEC6, 0x0201, 0x548A, 0xBE03,
|
||||
0x98A0, 0x1F20, 0x2F1F, 0x9826, 0xBC20, 0x6935, 0xE388, 0x03A1, 0x6933,
|
||||
0xB801, 0x9033, 0xBFA0, 0x02EE, 0xE308, 0x03A1, 0x9033, 0xBF00, 0x6951,
|
||||
@@ -204,7 +204,7 @@ uint16_t gaw_minisrc_code_0400[] = {
|
||||
0x732E, 0x5415, 0xBE03, 0x9880, 0x692F, 0xE388, 0x054F, 0xBE59, 0xBB07,
|
||||
0x6180, 0x9880, 0x8BA0, 0x6918, 0xEF08, 0x7325, 0x5416, 0xBE03, 0x98A0,
|
||||
0x732E, 0x5417, 0xBE03, 0x98A0, 0xEF00, 0x8BA0, 0xBEC6, 0x056B, 0xBE59,
|
||||
0xBB04, 0xAA90, 0xBE04, 0xBE1E, 0x99E0, 0x8BE0, 0x69A0, 0x90D0, 0x69A0,
|
||||
0xBB04, 0xAA90, 0xBE04, 0xBE1E, 0x99E0, 0x8BE0, 0x69A0, 0x90D0, 0x69A0,
|
||||
0x90D0, 0x081F, 0xB805, 0x881F, 0x8B90, 0x69A0, 0x90D0, 0x69A0, 0x9090,
|
||||
0x8BD0, 0x8BD8, 0xBE1F, 0xEF00, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||
|
||||
@@ -536,7 +536,7 @@
|
||||
#define KDATA_ADC1_XFER0 (KDATA_BASE_ADDR + 0x003B)
|
||||
#define KDATA_ADC1_XFER_ENDMARK (KDATA_BASE_ADDR + 0x003C)
|
||||
#define KDATA_ADC1_LEFT_VOLUME (KDATA_BASE_ADDR + 0x003D)
|
||||
#define KDATA_ADC1_RIGHT_VOLUME (KDATA_BASE_ADDR + 0x003E)
|
||||
#define KDATA_ADC1_RIGHT_VOLUME (KDATA_BASE_ADDR + 0x003E)
|
||||
#define KDATA_ADC1_LEFT_SUR_VOL (KDATA_BASE_ADDR + 0x003F)
|
||||
#define KDATA_ADC1_RIGHT_SUR_VOL (KDATA_BASE_ADDR + 0x0040)
|
||||
|
||||
|
||||
@@ -26,7 +26,7 @@
|
||||
* SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#define ALS_PCI_ID0 0x40004005
|
||||
#define ALS_PCI_ID0 0x40004005
|
||||
#define ALS_PCI_POWERREG 0xe0
|
||||
|
||||
#define ALS_CONFIG_SPACE_BYTES 128
|
||||
|
||||
@@ -747,7 +747,7 @@ atiixp_chan_trigger(kobj_t obj, void *data, int go)
|
||||
pollticks = 1;
|
||||
if (atiixp_chan_active(sc) == 0 ||
|
||||
pollticks < sc->poll_ticks) {
|
||||
if (bootverbose) {
|
||||
if (bootverbose) {
|
||||
if (atiixp_chan_active(sc) == 0)
|
||||
device_printf(sc->dev,
|
||||
"%s: pollticks=%d\n",
|
||||
|
||||
@@ -55,7 +55,7 @@
|
||||
|
||||
#define ATI_IXP_BASE_RATE 48000
|
||||
|
||||
/*
|
||||
/*
|
||||
* Register definitions for ATI IXP
|
||||
*
|
||||
* References: ALSA snd-atiixp.c , OpenBSD/NetBSD auixp-*.h
|
||||
|
||||
+26
-26
@@ -115,12 +115,12 @@ struct sc_info {
|
||||
bus_dma_tag_t parent_dmat;
|
||||
struct resource *reg, *irq;
|
||||
int regid, irqid;
|
||||
void *ih;
|
||||
void *ih;
|
||||
struct mtx lock;
|
||||
|
||||
int spdif_enabled;
|
||||
unsigned int bufsz;
|
||||
struct sc_chinfo pch, rch;
|
||||
struct sc_chinfo pch, rch;
|
||||
|
||||
struct mpu401 *mpu;
|
||||
mpu401_intr_t *mpu_intr;
|
||||
@@ -439,7 +439,7 @@ cmichan_setspeed(kobj_t obj, void *data, uint32_t speed)
|
||||
}
|
||||
rsp = cmi_rd(ch->parent, CMPCI_REG_FUNC_1, 4);
|
||||
rsp >>= CMPCI_REG_DAC_FS_SHIFT;
|
||||
rsp &= CMPCI_REG_DAC_FS_MASK;
|
||||
rsp &= CMPCI_REG_DAC_FS_MASK;
|
||||
} else {
|
||||
cmi_partial_wr4(ch->parent,
|
||||
CMPCI_REG_FUNC_1,
|
||||
@@ -448,7 +448,7 @@ cmichan_setspeed(kobj_t obj, void *data, uint32_t speed)
|
||||
r);
|
||||
rsp = cmi_rd(ch->parent, CMPCI_REG_FUNC_1, 4);
|
||||
rsp >>= CMPCI_REG_ADC_FS_SHIFT;
|
||||
rsp &= CMPCI_REG_ADC_FS_MASK;
|
||||
rsp &= CMPCI_REG_ADC_FS_MASK;
|
||||
}
|
||||
mtx_unlock(&sc->lock);
|
||||
ch->spd = cmpci_regvalue_to_rate(r);
|
||||
@@ -583,13 +583,13 @@ cmichan_getcaps(kobj_t obj, void *data)
|
||||
}
|
||||
|
||||
static kobj_method_t cmichan_methods[] = {
|
||||
KOBJMETHOD(channel_init, cmichan_init),
|
||||
KOBJMETHOD(channel_setformat, cmichan_setformat),
|
||||
KOBJMETHOD(channel_setspeed, cmichan_setspeed),
|
||||
KOBJMETHOD(channel_setblocksize, cmichan_setblocksize),
|
||||
KOBJMETHOD(channel_trigger, cmichan_trigger),
|
||||
KOBJMETHOD(channel_getptr, cmichan_getptr),
|
||||
KOBJMETHOD(channel_getcaps, cmichan_getcaps),
|
||||
KOBJMETHOD(channel_init, cmichan_init),
|
||||
KOBJMETHOD(channel_setformat, cmichan_setformat),
|
||||
KOBJMETHOD(channel_setspeed, cmichan_setspeed),
|
||||
KOBJMETHOD(channel_setblocksize, cmichan_setblocksize),
|
||||
KOBJMETHOD(channel_trigger, cmichan_trigger),
|
||||
KOBJMETHOD(channel_getptr, cmichan_getptr),
|
||||
KOBJMETHOD(channel_getcaps, cmichan_getcaps),
|
||||
KOBJMETHOD_END
|
||||
};
|
||||
CHANNEL_DECLARE(cmichan);
|
||||
@@ -754,10 +754,10 @@ cmi_initsys(struct sc_info* sc)
|
||||
to a device specific sysctl "dev.pcm.X.yyy" via
|
||||
device_get_sysctl_*() as discussed on multimedia@ in msg-id
|
||||
<861wujij2q.fsf@xps.des.no> */
|
||||
SYSCTL_ADD_INT(device_get_sysctl_ctx(sc->dev),
|
||||
SYSCTL_ADD_INT(device_get_sysctl_ctx(sc->dev),
|
||||
SYSCTL_CHILDREN(device_get_sysctl_tree(sc->dev)),
|
||||
OID_AUTO, "spdif_enabled", CTLFLAG_RW,
|
||||
&sc->spdif_enabled, 0,
|
||||
OID_AUTO, "spdif_enabled", CTLFLAG_RW,
|
||||
&sc->spdif_enabled, 0,
|
||||
"enable SPDIF output at 44.1 kHz and above");
|
||||
|
||||
return 0;
|
||||
@@ -778,10 +778,10 @@ MIXER_DECLARE(cmi_mixer);
|
||||
|
||||
static unsigned char
|
||||
cmi_mread(struct mpu401 *arg, void *sc, int reg)
|
||||
{
|
||||
{
|
||||
unsigned int d;
|
||||
|
||||
d = bus_space_read_1(0,0, 0x330 + reg);
|
||||
d = bus_space_read_1(0,0, 0x330 + reg);
|
||||
/* printf("cmi_mread: reg %x %x\n",reg, d);
|
||||
*/
|
||||
return d;
|
||||
@@ -808,9 +808,9 @@ cmi_muninit(struct mpu401 *arg, void *cookie)
|
||||
}
|
||||
|
||||
static kobj_method_t cmi_mpu_methods[] = {
|
||||
KOBJMETHOD(mpufoi_read, cmi_mread),
|
||||
KOBJMETHOD(mpufoi_write, cmi_mwrite),
|
||||
KOBJMETHOD(mpufoi_uninit, cmi_muninit),
|
||||
KOBJMETHOD(mpufoi_read, cmi_mread),
|
||||
KOBJMETHOD(mpufoi_write, cmi_mwrite),
|
||||
KOBJMETHOD(mpufoi_uninit, cmi_muninit),
|
||||
KOBJMETHOD_END
|
||||
};
|
||||
|
||||
@@ -821,19 +821,19 @@ cmi_midiattach(struct sc_info *sc) {
|
||||
/*
|
||||
const struct {
|
||||
int port,bits;
|
||||
} *p, ports[] = {
|
||||
{0x330,0},
|
||||
{0x320,1},
|
||||
{0x310,2},
|
||||
{0x300,3},
|
||||
} *p, ports[] = {
|
||||
{0x330,0},
|
||||
{0x320,1},
|
||||
{0x310,2},
|
||||
{0x300,3},
|
||||
{0,0} } ;
|
||||
Notes, CMPCI_REG_VMPUSEL sets the io port for the mpu. Does
|
||||
anyone know how to bus_space tag?
|
||||
*/
|
||||
cmi_clr4(sc, CMPCI_REG_FUNC_1, CMPCI_REG_UART_ENABLE);
|
||||
cmi_clr4(sc, CMPCI_REG_LEGACY_CTRL,
|
||||
cmi_clr4(sc, CMPCI_REG_LEGACY_CTRL,
|
||||
CMPCI_REG_VMPUSEL_MASK << CMPCI_REG_VMPUSEL_SHIFT);
|
||||
cmi_set4(sc, CMPCI_REG_LEGACY_CTRL,
|
||||
cmi_set4(sc, CMPCI_REG_LEGACY_CTRL,
|
||||
0 << CMPCI_REG_VMPUSEL_SHIFT );
|
||||
cmi_set4(sc, CMPCI_REG_FUNC_1, CMPCI_REG_UART_ENABLE);
|
||||
sc->mpu = mpu401_init(&cmi_mpu_class, sc, cmi_intr, &sc->mpu_intr);
|
||||
|
||||
+11
-11
@@ -112,7 +112,7 @@ static int cs4281_init(struct sc_info *);
|
||||
|
||||
/* talk to the card */
|
||||
static uint32_t cs4281_rd(struct sc_info *, int);
|
||||
static void cs4281_wr(struct sc_info *, int, uint32_t);
|
||||
static void cs4281_wr(struct sc_info *, int, uint32_t);
|
||||
|
||||
/* misc */
|
||||
static uint8_t cs4281_rate_to_rv(uint32_t);
|
||||
@@ -449,13 +449,13 @@ cs4281chan_getcaps(kobj_t obj, void *data)
|
||||
}
|
||||
|
||||
static kobj_method_t cs4281chan_methods[] = {
|
||||
KOBJMETHOD(channel_init, cs4281chan_init),
|
||||
KOBJMETHOD(channel_setformat, cs4281chan_setformat),
|
||||
KOBJMETHOD(channel_setspeed, cs4281chan_setspeed),
|
||||
KOBJMETHOD(channel_setblocksize, cs4281chan_setblocksize),
|
||||
KOBJMETHOD(channel_trigger, cs4281chan_trigger),
|
||||
KOBJMETHOD(channel_getptr, cs4281chan_getptr),
|
||||
KOBJMETHOD(channel_getcaps, cs4281chan_getcaps),
|
||||
KOBJMETHOD(channel_init, cs4281chan_init),
|
||||
KOBJMETHOD(channel_setformat, cs4281chan_setformat),
|
||||
KOBJMETHOD(channel_setspeed, cs4281chan_setspeed),
|
||||
KOBJMETHOD(channel_setblocksize, cs4281chan_setblocksize),
|
||||
KOBJMETHOD(channel_trigger, cs4281chan_trigger),
|
||||
KOBJMETHOD(channel_getptr, cs4281chan_getptr),
|
||||
KOBJMETHOD(channel_getcaps, cs4281chan_getcaps),
|
||||
KOBJMETHOD_END
|
||||
};
|
||||
CHANNEL_DECLARE(cs4281chan);
|
||||
@@ -543,9 +543,9 @@ cs4281_power(struct sc_info *sc, int state)
|
||||
cs4281_clr4(sc, CS4281PCI_EPPMC, CS4281PCI_EPPMC_FPDN);
|
||||
break;
|
||||
case 3:
|
||||
/* Power off card and codec */
|
||||
cs4281_set4(sc, CS4281PCI_EPPMC, CS4281PCI_EPPMC_FPDN);
|
||||
cs4281_clr4(sc, CS4281PCI_SPMC, CS4281PCI_SPMC_RSTN);
|
||||
/* Power off card and codec */
|
||||
cs4281_set4(sc, CS4281PCI_EPPMC, CS4281PCI_EPPMC_FPDN);
|
||||
cs4281_clr4(sc, CS4281PCI_SPMC, CS4281PCI_SPMC_RSTN);
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
@@ -29,10 +29,10 @@
|
||||
#ifndef _CS4281_H_
|
||||
#define _CS4281_H_
|
||||
|
||||
#define CS4281_PCI_ID 0x60051013
|
||||
#define CS4281_PCI_ID 0x60051013
|
||||
|
||||
/* Ball Parks */
|
||||
#define CS4281PCI_BA0_SIZE 4096
|
||||
#define CS4281PCI_BA0_SIZE 4096
|
||||
#define CS4281PCI_BA1_SIZE 65536
|
||||
|
||||
/* Register values */
|
||||
|
||||
@@ -236,7 +236,7 @@ csa_attach(device_t dev)
|
||||
scp->binfo.card = scp->card;
|
||||
printf("csa: card is %s\n", scp->card->name);
|
||||
resp->io_rid = PCIR_BAR(0);
|
||||
resp->io = bus_alloc_resource_any(dev, SYS_RES_MEMORY,
|
||||
resp->io = bus_alloc_resource_any(dev, SYS_RES_MEMORY,
|
||||
&resp->io_rid, RF_ACTIVE);
|
||||
if (resp->io == NULL)
|
||||
return (ENXIO);
|
||||
|
||||
+10
-10
@@ -164,8 +164,8 @@ csa_wrcd(kobj_t obj, void *devinfo, int regno, uint32_t data)
|
||||
}
|
||||
|
||||
static kobj_method_t csa_ac97_methods[] = {
|
||||
KOBJMETHOD(ac97_read, csa_rdcd),
|
||||
KOBJMETHOD(ac97_write, csa_wrcd),
|
||||
KOBJMETHOD(ac97_read, csa_rdcd),
|
||||
KOBJMETHOD(ac97_write, csa_wrcd),
|
||||
KOBJMETHOD_END
|
||||
};
|
||||
AC97_DECLARE(csa_ac97);
|
||||
@@ -623,13 +623,13 @@ csachan_getcaps(kobj_t obj, void *data)
|
||||
}
|
||||
|
||||
static kobj_method_t csachan_methods[] = {
|
||||
KOBJMETHOD(channel_init, csachan_init),
|
||||
KOBJMETHOD(channel_setformat, csachan_setformat),
|
||||
KOBJMETHOD(channel_setspeed, csachan_setspeed),
|
||||
KOBJMETHOD(channel_setblocksize, csachan_setblocksize),
|
||||
KOBJMETHOD(channel_trigger, csachan_trigger),
|
||||
KOBJMETHOD(channel_getptr, csachan_getptr),
|
||||
KOBJMETHOD(channel_getcaps, csachan_getcaps),
|
||||
KOBJMETHOD(channel_init, csachan_init),
|
||||
KOBJMETHOD(channel_setformat, csachan_setformat),
|
||||
KOBJMETHOD(channel_setspeed, csachan_setspeed),
|
||||
KOBJMETHOD(channel_setblocksize, csachan_setblocksize),
|
||||
KOBJMETHOD(channel_trigger, csachan_trigger),
|
||||
KOBJMETHOD(channel_getptr, csachan_getptr),
|
||||
KOBJMETHOD(channel_getcaps, csachan_getcaps),
|
||||
KOBJMETHOD_END
|
||||
};
|
||||
CHANNEL_DECLARE(csachan);
|
||||
@@ -676,7 +676,7 @@ csa_init(struct csa_info *csa)
|
||||
/* Power up amplifier */
|
||||
csa_writeio(resp, BA0_EGPIODR, csa_readio(resp, BA0_EGPIODR) |
|
||||
EGPIODR_GPOE2);
|
||||
csa_writeio(resp, BA0_EGPIOPTR, csa_readio(resp, BA0_EGPIOPTR) |
|
||||
csa_writeio(resp, BA0_EGPIOPTR, csa_readio(resp, BA0_EGPIOPTR) |
|
||||
EGPIOPTR_GPPT2);
|
||||
|
||||
return 0;
|
||||
|
||||
@@ -1949,8 +1949,8 @@
|
||||
#define CS_AC97_POWER_CONTROL_MIXVON_ON 0x0004
|
||||
#define CS_AC97_POWER_CONTROL_MIXVOFF_ON 0x0008
|
||||
|
||||
/*
|
||||
* this is 3*1024 for parameter, 3.5*1024 for sample and 2*3.5*1024
|
||||
/*
|
||||
* this is 3*1024 for parameter, 3.5*1024 for sample and 2*3.5*1024
|
||||
* for code since each instruction is 40 bits and takes two dwords
|
||||
*/
|
||||
|
||||
|
||||
@@ -50,8 +50,8 @@
|
||||
#define EMUPAGESIZE 4096 /* don't change */
|
||||
#define EMUMAXPAGES (WAVEOUT_MAXBUFSIZE * NUM_G / EMUPAGESIZE)
|
||||
#define EMU10K1_PCI_ID 0x00021102 /* 1102 => Creative Labs Vendor ID */
|
||||
#define EMU10K2_PCI_ID 0x00041102
|
||||
#define EMU10K3_PCI_ID 0x00081102
|
||||
#define EMU10K2_PCI_ID 0x00041102
|
||||
#define EMU10K3_PCI_ID 0x00081102
|
||||
#define EMU_DEFAULT_BUFSZ 4096
|
||||
#define EMU_MAX_CHANS 8
|
||||
#define EMU_CHANS 4
|
||||
@@ -1152,10 +1152,10 @@ CHANNEL_DECLARE(emurchan);
|
||||
|
||||
static unsigned char
|
||||
emu_mread(struct mpu401 *arg, void *sc, int reg)
|
||||
{
|
||||
{
|
||||
unsigned int d;
|
||||
|
||||
d = emu_rd((struct sc_info *)sc, 0x18 + reg, 1);
|
||||
d = emu_rd((struct sc_info *)sc, 0x18 + reg, 1);
|
||||
return d;
|
||||
}
|
||||
|
||||
@@ -1179,9 +1179,9 @@ emu_muninit(struct mpu401 *arg, void *cookie)
|
||||
}
|
||||
|
||||
static kobj_method_t emu_mpu_methods[] = {
|
||||
KOBJMETHOD(mpufoi_read, emu_mread),
|
||||
KOBJMETHOD(mpufoi_write, emu_mwrite),
|
||||
KOBJMETHOD(mpufoi_uninit, emu_muninit),
|
||||
KOBJMETHOD(mpufoi_read, emu_mread),
|
||||
KOBJMETHOD(mpufoi_write, emu_mwrite),
|
||||
KOBJMETHOD(mpufoi_uninit, emu_muninit),
|
||||
KOBJMETHOD_END
|
||||
};
|
||||
|
||||
@@ -1957,7 +1957,7 @@ emu_init(struct sc_info *sc)
|
||||
}
|
||||
} else {
|
||||
/* EMU10K1 initialization code */
|
||||
tmp = EMU_HCFG_AUDIOENABLE | EMU_HCFG_LOCKTANKCACHE_MASK
|
||||
tmp = EMU_HCFG_AUDIOENABLE | EMU_HCFG_LOCKTANKCACHE_MASK
|
||||
| EMU_HCFG_AUTOMUTE;
|
||||
if (sc->rev >= 6)
|
||||
tmp |= EMU_HCFG_JOYENABLE;
|
||||
|
||||
@@ -69,13 +69,13 @@ struct emu_pcm_rchinfo {
|
||||
int fmt;
|
||||
unsigned int blksz;
|
||||
int run;
|
||||
uint32_t idxreg;
|
||||
uint32_t idxreg;
|
||||
uint32_t basereg;
|
||||
uint32_t sizereg;
|
||||
uint32_t setupreg;
|
||||
uint32_t irqmask;
|
||||
uint32_t iprmask;
|
||||
int ihandle;
|
||||
int ihandle;
|
||||
struct snd_dbuf *buffer;
|
||||
struct pcm_channel *channel;
|
||||
struct emu_pcm_info *pcm;
|
||||
@@ -92,7 +92,7 @@ struct emu_pcm_rchinfo {
|
||||
struct emu_pcm_info {
|
||||
struct mtx lock;
|
||||
device_t dev; /* device information */
|
||||
struct emu_sc_info *card;
|
||||
struct emu_sc_info *card;
|
||||
struct emu_pcm_pchinfo pch[MAX_CHANNELS]; /* hardware channels */
|
||||
int pnum; /* next free channel number */
|
||||
struct emu_pcm_rchinfo rch_adc;
|
||||
@@ -104,7 +104,7 @@ struct emu_pcm_info {
|
||||
unsigned int bufsz;
|
||||
int is_emu10k1;
|
||||
struct ac97_info *codec;
|
||||
uint32_t ac97_state[0x7F];
|
||||
uint32_t ac97_state[0x7F];
|
||||
kobj_class_t ac97_mixerclass;
|
||||
uint32_t ac97_recdevs;
|
||||
uint32_t ac97_playdevs;
|
||||
@@ -1468,7 +1468,7 @@ emu_pcm_attach(device_t dev)
|
||||
goto bad;
|
||||
}
|
||||
|
||||
/*
|
||||
/*
|
||||
* We don't register interrupt handler with snd_setup_intr
|
||||
* in pcm device. Mark pcm device as MPSAFE manually.
|
||||
*/
|
||||
@@ -1511,7 +1511,7 @@ emu_pcm_detach(device_t dev)
|
||||
|
||||
r = pcm_unregister(dev);
|
||||
|
||||
if (r) return (r);
|
||||
if (r) return (r);
|
||||
|
||||
emu_pcm_uninit(sc);
|
||||
|
||||
|
||||
+33
-33
@@ -112,14 +112,14 @@
|
||||
#define DSP_CCR DSP_CONST(0x17)
|
||||
|
||||
/* Live! Inputs */
|
||||
#define IN_AC97_L 0x00
|
||||
#define IN_AC97_R 0x01
|
||||
#define IN_AC97_L 0x00
|
||||
#define IN_AC97_R 0x01
|
||||
#define IN_AC97 IN_AC97_L
|
||||
#define IN_SPDIF_CD_L 0x02
|
||||
#define IN_SPDIF_CD_R 0x03
|
||||
#define IN_SPDIF_CD IN_SPDIF_CD_L
|
||||
#define IN_ZOOM_L 0x04
|
||||
#define IN_ZOOM_R 0x05
|
||||
#define IN_ZOOM_L 0x04
|
||||
#define IN_ZOOM_R 0x05
|
||||
#define IN_ZOOM IN_ZOOM_L
|
||||
#define IN_TOSLINK_L 0x06
|
||||
#define IN_TOSLINK_R 0x07
|
||||
@@ -141,8 +141,8 @@
|
||||
#define OUT_AC97_R 0x01
|
||||
#define OUT_AC97 OUT_AC97_L
|
||||
#define OUT_A_FRONT OUT_AC97
|
||||
#define OUT_TOSLINK_L 0x02
|
||||
#define OUT_TOSLINK_R 0x03
|
||||
#define OUT_TOSLINK_L 0x02
|
||||
#define OUT_TOSLINK_R 0x03
|
||||
#define OUT_TOSLINK OUT_TOSLINK_L
|
||||
#define OUT_D_CENTER 0x04
|
||||
#define OUT_D_SUB 0x05
|
||||
@@ -152,7 +152,7 @@
|
||||
#define OUT_REAR_L 0x08
|
||||
#define OUT_REAR_R 0x09
|
||||
#define OUT_REAR OUT_REAR_L
|
||||
#define OUT_ADC_REC_L 0x0a
|
||||
#define OUT_ADC_REC_L 0x0a
|
||||
#define OUT_ADC_REC_R 0x0b
|
||||
#define OUT_ADC_REC OUT_ADC_REC_L
|
||||
#define OUT_MIC_CAP 0x0c
|
||||
@@ -295,7 +295,7 @@ struct emu_rm {
|
||||
signed int allocmap[EMU_MAX_GPR];
|
||||
int num_gprs;
|
||||
int last_free_gpr;
|
||||
int num_used;
|
||||
int num_used;
|
||||
};
|
||||
|
||||
struct emu_intr_handler {
|
||||
@@ -328,7 +328,7 @@ struct emu_sc_info {
|
||||
/* Resources */
|
||||
struct resource *reg;
|
||||
struct resource *irq;
|
||||
void *ih;
|
||||
void *ih;
|
||||
|
||||
/* IRQ handlers */
|
||||
struct emu_intr_handler ihandler[EMU_MAX_IRQ_CONSUMERS];
|
||||
@@ -347,22 +347,22 @@ struct emu_sc_info {
|
||||
unsigned int opcode_shift;
|
||||
unsigned int high_operand_shift;
|
||||
unsigned int address_mask;
|
||||
uint32_t is_emu10k1:1, is_emu10k2, is_ca0102, is_ca0108:1,
|
||||
uint32_t is_emu10k1:1, is_emu10k2, is_ca0102, is_ca0108:1,
|
||||
has_ac97:1, has_51:1, has_71:1,
|
||||
enable_ir:1,
|
||||
broken_digital:1, is_cardbus:1;
|
||||
|
||||
signed int mch_disabled, mch_rec, dbg_level;
|
||||
signed int num_inputs;
|
||||
unsigned int num_outputs;
|
||||
unsigned int num_fxbuses;
|
||||
unsigned int routing_code_start;
|
||||
signed int num_inputs;
|
||||
unsigned int num_outputs;
|
||||
unsigned int num_fxbuses;
|
||||
unsigned int routing_code_start;
|
||||
unsigned int routing_code_end;
|
||||
|
||||
/* HW resources */
|
||||
struct emu_voice voice[NUM_G]; /* Hardware voices */
|
||||
uint32_t irq_mask[EMU_MAX_IRQ_CONSUMERS]; /* IRQ manager data */
|
||||
int timer[EMU_MAX_IRQ_CONSUMERS]; /* timer */
|
||||
int timer[EMU_MAX_IRQ_CONSUMERS]; /* timer */
|
||||
int timerinterval;
|
||||
struct emu_rm *rm;
|
||||
struct emu_mem mem; /* memory */
|
||||
@@ -426,20 +426,20 @@ static int emu_modevent(module_t mod __unused, int cmd, void *data __unused);
|
||||
|
||||
#ifdef SND_EMU10KX_DEBUG
|
||||
|
||||
#define EMU_MTX_DEBUG() do { \
|
||||
#define EMU_MTX_DEBUG() do { \
|
||||
if (mtx_owned(&sc->rw)) { \
|
||||
printf("RW owned in %s line %d for %s\n", __func__, \
|
||||
__LINE__ , device_get_nameunit(sc->dev)); \
|
||||
printf("rw lock owned: %d\n", mtx_owned(&sc->rw)); \
|
||||
printf("rw lock: value %x thread %x\n", \
|
||||
((&sc->rw)->mtx_lock & ~MTX_FLAGMASK), \
|
||||
((&sc->rw)->mtx_lock & ~MTX_FLAGMASK), \
|
||||
(uintptr_t)curthread); \
|
||||
printf("rw lock: recursed %d\n", mtx_recursed(&sc->rw));\
|
||||
db_show_mtx(&sc->rw); \
|
||||
} \
|
||||
} while (0)
|
||||
#else
|
||||
#define EMU_MTX_DEBUG() do { \
|
||||
#define EMU_MTX_DEBUG() do { \
|
||||
} while (0)
|
||||
#endif
|
||||
|
||||
@@ -1580,7 +1580,7 @@ sysctl_emu_digitalswitch_control(SYSCTL_HANDLER_ARGS)
|
||||
|
||||
sc = arg1;
|
||||
|
||||
new_val = (sc->mode == MODE_DIGITAL) ? 1 : 0;
|
||||
new_val = (sc->mode == MODE_DIGITAL) ? 1 : 0;
|
||||
err = sysctl_handle_int(oidp, &new_val, 0, req);
|
||||
|
||||
if (err || req->newptr == NULL)
|
||||
@@ -1617,20 +1617,20 @@ emu_digitalswitch(struct emu_sc_info *sc)
|
||||
*/
|
||||
#define EFX_CACHE(CACHE_IDX) do { \
|
||||
sc->cache_gpr[CACHE_IDX] = emu_rm_gpr_alloc(sc->rm, 1); \
|
||||
emu_addefxop(sc, ACC3, \
|
||||
GPR(sc->cache_gpr[CACHE_IDX]), \
|
||||
DSP_CONST(0), \
|
||||
DSP_CONST(0), \
|
||||
DSP_CONST(0), \
|
||||
emu_addefxop(sc, ACC3, \
|
||||
GPR(sc->cache_gpr[CACHE_IDX]), \
|
||||
DSP_CONST(0), \
|
||||
DSP_CONST(0), \
|
||||
DSP_CONST(0), \
|
||||
&pc); \
|
||||
} while (0)
|
||||
|
||||
/* Allocate GPR for volume control and route sound: OUT = OUT + IN * VOL */
|
||||
#define EFX_ROUTE(TITLE, INP_NR, IN_GPR_IDX, OUT_CACHE_IDX, DEF) do { \
|
||||
#define EFX_ROUTE(TITLE, INP_NR, IN_GPR_IDX, OUT_CACHE_IDX, DEF) do { \
|
||||
sc->mixer_gpr[IN_GPR_IDX] = emu_addefxmixer(sc, TITLE, IN_GPR_IDX, DEF); \
|
||||
sc->mixer_volcache[IN_GPR_IDX] = DEF; \
|
||||
emu_addefxop(sc, MACS, \
|
||||
GPR(sc->cache_gpr[OUT_CACHE_IDX]), \
|
||||
sc->mixer_volcache[IN_GPR_IDX] = DEF; \
|
||||
emu_addefxop(sc, MACS, \
|
||||
GPR(sc->cache_gpr[OUT_CACHE_IDX]), \
|
||||
GPR(sc->cache_gpr[OUT_CACHE_IDX]), \
|
||||
INP_NR, \
|
||||
GPR(sc->mixer_gpr[IN_GPR_IDX]), \
|
||||
@@ -1754,7 +1754,7 @@ emu_initefx(struct emu_sc_info *sc)
|
||||
EFX_ROUTE(NULL, INP(IN_SPDIF_CD_R), M_IN1_FRONT_R, C_FRONT_R, 0);
|
||||
EFX_ROUTE(NULL, INP(IN_SPDIF_CD_L), M_IN1_REC_L, C_REC_L, 0);
|
||||
EFX_ROUTE(NULL, INP(IN_SPDIF_CD_R), M_IN1_REC_R, C_REC_R, 0);
|
||||
|
||||
|
||||
if (sc->dbg_level > 0) {
|
||||
/* in2, ZoomVide (???) */
|
||||
EFX_ROUTE("zoom_front_l", INP(IN_ZOOM_L), M_IN2_FRONT_L, C_FRONT_L, 0);
|
||||
@@ -2170,11 +2170,11 @@ static d_close_t emu10kx_close;
|
||||
static d_read_t emu10kx_read;
|
||||
|
||||
static struct cdevsw emu10kx_cdevsw = {
|
||||
.d_open = emu10kx_open,
|
||||
.d_open = emu10kx_open,
|
||||
.d_close = emu10kx_close,
|
||||
.d_read = emu10kx_read,
|
||||
.d_name = "emu10kx",
|
||||
.d_version = D_VERSION,
|
||||
.d_read = emu10kx_read,
|
||||
.d_name = "emu10kx",
|
||||
.d_version = D_VERSION,
|
||||
};
|
||||
|
||||
static int
|
||||
|
||||
@@ -170,7 +170,7 @@ struct emu_route {
|
||||
};
|
||||
|
||||
struct emu_voice* emu_valloc(struct emu_sc_info *sc);
|
||||
void emu_vfree(struct emu_sc_info *sc, struct emu_voice *v);
|
||||
void emu_vfree(struct emu_sc_info *sc, struct emu_voice *v);
|
||||
int emu_vinit(struct emu_sc_info *sc, struct emu_voice *m, struct emu_voice *s,
|
||||
uint32_t sz, struct snd_dbuf *b);
|
||||
void emu_vroute(struct emu_sc_info *sc, struct emu_route *rt, struct emu_voice *v);
|
||||
|
||||
@@ -295,8 +295,8 @@ static struct cfg_info cfg_table[] = {
|
||||
0xc0, 0xff, 0x7f,
|
||||
0x10, 0x20, 0x01, 0x01, 0x00,
|
||||
0x00,
|
||||
&delta_codec,
|
||||
},
|
||||
&delta_codec,
|
||||
},
|
||||
{
|
||||
"Envy24 audio (M Audio Audiophile 2496)",
|
||||
0x1412, 0xd634,
|
||||
@@ -304,8 +304,8 @@ static struct cfg_info cfg_table[] = {
|
||||
0x04, 0xfe, 0xfb,
|
||||
0x08, 0x02, 0x20, 0x00, 0x01,
|
||||
0x00,
|
||||
&delta_codec,
|
||||
},
|
||||
&delta_codec,
|
||||
},
|
||||
{
|
||||
"Envy24 audio (M Audio Delta 66)",
|
||||
0x1412, 0xd632,
|
||||
@@ -1024,7 +1024,7 @@ envy24_delta_ak4524_init(void *codec)
|
||||
/* 6fire rear input init test, set ptr->num to 1 for test */
|
||||
if (ptr->parent->cfg->subvendor == 0x153b && \
|
||||
ptr->parent->cfg->subdevice == 0x1138 && ptr->num == 100) {
|
||||
ptr->cs = 0x02;
|
||||
ptr->cs = 0x02;
|
||||
spicds_init(ptr->info);
|
||||
device_printf(ptr->parent->dev, "6fire rear input init\n");
|
||||
i2c_wr(ptr, envy24_gpio_i2c_ctl, \
|
||||
@@ -2072,7 +2072,7 @@ envy24_intr(void *p)
|
||||
device_printf(sc->dev, "envy24_intr(): ptr = %d-->", ptr);
|
||||
#endif
|
||||
ptr -= ptr % sc->blk[0];
|
||||
feed = (ptr + dsize - sc->intr[0]) % dsize;
|
||||
feed = (ptr + dsize - sc->intr[0]) % dsize;
|
||||
#if(0)
|
||||
printf("%d intr = %d feed = %d\n", ptr, sc->intr[0], feed);
|
||||
#endif
|
||||
@@ -2098,7 +2098,7 @@ envy24_intr(void *p)
|
||||
dsize = sc->rsize / 4;
|
||||
ptr = dsize - envy24_rdmt(sc, ENVY24_MT_RCNT, 2) - 1;
|
||||
ptr -= ptr % sc->blk[1];
|
||||
feed = (ptr + dsize - sc->intr[1]) % dsize;
|
||||
feed = (ptr + dsize - sc->intr[1]) % dsize;
|
||||
for (i = ENVY24_CHAN_REC_ADC1; i <= ENVY24_CHAN_REC_SPDIF; i++) {
|
||||
ch = &sc->chan[i];
|
||||
if (ch->run && ch->blk <= feed) {
|
||||
@@ -2534,8 +2534,8 @@ envy24_alloc_resource(struct sc_info *sc)
|
||||
static int
|
||||
envy24_pci_attach(device_t dev)
|
||||
{
|
||||
struct sc_info *sc;
|
||||
char status[SND_STATUSLEN];
|
||||
struct sc_info *sc;
|
||||
char status[SND_STATUSLEN];
|
||||
int err = 0;
|
||||
int i;
|
||||
|
||||
|
||||
@@ -44,7 +44,7 @@
|
||||
#define PCIM_LAC_SBDMA0 0x0000 /* SB DMA Channel Select: 0 */
|
||||
#define PCIM_LAC_SBDMA1 0x0040 /* SB DMA Channel Select: 1 */
|
||||
#define PCIM_LAC_SBDMA3 0x00c0 /* SB DMA Channel Select: 3 */
|
||||
#define PCIM_LAC_IOADDR10 0x0020 /* I/O Address Alias Control */
|
||||
#define PCIM_LAC_IOADDR10 0x0020 /* I/O Address Alias Control */
|
||||
#define PCIM_LAC_MPU401 0x0008 /* MPU-401 I/O enable */
|
||||
#define PCIM_LAC_GAME 0x0004 /* Game Port enable (200h) */
|
||||
#define PCIM_LAC_FM 0x0002 /* FM I/O enable (AdLib 388h base) */
|
||||
|
||||
@@ -334,16 +334,16 @@ static struct cfg_info cfg_table[] = {
|
||||
},
|
||||
{
|
||||
"Envy24HT audio (AudioTrak Prodigy 7.1 LT)",
|
||||
0x3132, 0x4154,
|
||||
0x3132, 0x4154,
|
||||
0x4b, 0x80, 0xfc, 0xc3,
|
||||
0x7ff8ff, 0x7fffff, 0x700,
|
||||
0x400, 0x200, 0x100, 0x00, 0x02,
|
||||
0,
|
||||
&spi_codec,
|
||||
&spi_codec,
|
||||
},
|
||||
{
|
||||
"Envy24HT audio (AudioTrak Prodigy 7.1 XT)",
|
||||
0x3136, 0x4154,
|
||||
0x3136, 0x4154,
|
||||
0x4b, 0x80, 0xfc, 0xc3,
|
||||
0x7ff8ff, 0x7fffff, 0x700,
|
||||
0x400, 0x200, 0x100, 0x00, 0x02,
|
||||
@@ -826,7 +826,7 @@ AC97_DECLARE(envy24ht_ac97);
|
||||
static uint32_t
|
||||
envy24ht_gpiord(struct sc_info *sc)
|
||||
{
|
||||
if (sc->cfg->subvendor == 0x153b && sc->cfg->subdevice == 0x1150)
|
||||
if (sc->cfg->subvendor == 0x153b && sc->cfg->subdevice == 0x1150)
|
||||
return envy24ht_rdcs(sc, ENVY24HT_CCS_GPIO_LDATA, 2);
|
||||
else
|
||||
return (envy24ht_rdcs(sc, ENVY24HT_CCS_GPIO_HDATA, 1) << 16 | envy24ht_rdcs(sc, ENVY24HT_CCS_GPIO_LDATA, 2));
|
||||
@@ -875,7 +875,7 @@ envy24ht_gpiosetdir(struct sc_info *sc, uint32_t dir)
|
||||
{
|
||||
if (sc->cfg->subvendor == 0x153b && sc->cfg->subdevice == 0x1150)
|
||||
envy24ht_wrcs(sc, ENVY24HT_CCS_GPIO_CTLDIR, dir, 2);
|
||||
else
|
||||
else
|
||||
envy24ht_wrcs(sc, ENVY24HT_CCS_GPIO_CTLDIR, dir, 4);
|
||||
return;
|
||||
}
|
||||
@@ -1224,7 +1224,7 @@ envy24ht_checkintr(struct sc_info *sc, int dir)
|
||||
if ((rtn = intr & ENVY24HT_MT_INT_PSTAT) != 0) {
|
||||
mask = ~ENVY24HT_MT_INT_RSTAT;
|
||||
envy24ht_wrmt(sc, 0x1a, 0x01, 1);
|
||||
envy24ht_wrmt(sc, ENVY24HT_MT_INT_STAT, (intr & mask) | ENVY24HT_MT_INT_PSTAT | 0x08, 1);
|
||||
envy24ht_wrmt(sc, ENVY24HT_MT_INT_STAT, (intr & mask) | ENVY24HT_MT_INT_PSTAT | 0x08, 1);
|
||||
stat = envy24ht_rdmt(sc, ENVY24HT_MT_INT_MASK, 1);
|
||||
envy24ht_wrmt(sc, ENVY24HT_MT_INT_MASK, stat | ENVY24HT_MT_INT_PMASK, 1);
|
||||
}
|
||||
@@ -1986,7 +1986,7 @@ envy24ht_intr(void *p)
|
||||
device_printf(sc->dev, "envy24ht_intr(): ptr = %d-->", ptr);
|
||||
#endif
|
||||
ptr -= ptr % sc->blk[0];
|
||||
feed = (ptr + dsize - sc->intr[0]) % dsize;
|
||||
feed = (ptr + dsize - sc->intr[0]) % dsize;
|
||||
#if(0)
|
||||
printf("%d intr = %d feed = %d\n", ptr, sc->intr[0], feed);
|
||||
#endif
|
||||
@@ -2012,7 +2012,7 @@ envy24ht_intr(void *p)
|
||||
dsize = sc->rsize / 4;
|
||||
ptr = dsize - envy24ht_rdmt(sc, ENVY24HT_MT_RCNT, 2) - 1;
|
||||
ptr -= ptr % sc->blk[1];
|
||||
feed = (ptr + dsize - sc->intr[1]) % dsize;
|
||||
feed = (ptr + dsize - sc->intr[1]) % dsize;
|
||||
for (i = ENVY24HT_CHAN_REC_ADC1; i <= ENVY24HT_CHAN_REC_SPDIF; i++) {
|
||||
ch = &sc->chan[i];
|
||||
if (ch->run && ch->blk <= feed) {
|
||||
@@ -2438,8 +2438,8 @@ envy24ht_alloc_resource(struct sc_info *sc)
|
||||
static int
|
||||
envy24ht_pci_attach(device_t dev)
|
||||
{
|
||||
struct sc_info *sc;
|
||||
char status[SND_STATUSLEN];
|
||||
struct sc_info *sc;
|
||||
char status[SND_STATUSLEN];
|
||||
int err = 0;
|
||||
int i;
|
||||
|
||||
|
||||
@@ -34,7 +34,7 @@
|
||||
#define PCID_ENVY24HT 0x1724
|
||||
|
||||
#define PCIR_CCS 0x10 /* Controller I/O Base Address */
|
||||
#define ENVY24HT_PCIR_MT 0x14 /* Multi-Track I/O Base Address */
|
||||
#define ENVY24HT_PCIR_MT 0x14 /* Multi-Track I/O Base Address */
|
||||
|
||||
/* Controller Registers */
|
||||
|
||||
@@ -44,12 +44,12 @@
|
||||
#define ENVY24HT_CCS_IMASK 0x01 /* Interrupt Mask Register */
|
||||
#define ENVY24HT_CCS_IMASK_PMT 0x10 /* Professional Multi-track */
|
||||
|
||||
#define ENVY24HT_CCS_I2CDEV 0x10 /* I2C Port Device Address Register */
|
||||
#define ENVY24HT_CCS_I2CDEV 0x10 /* I2C Port Device Address Register */
|
||||
#define ENVY24HT_CCS_I2CDEV_ADDR 0xfe /* I2C device address */
|
||||
#define ENVY24HT_CCS_I2CDEV_ROM 0xa0 /* reserved for the external I2C E2PROM */
|
||||
#define ENVY24HT_CCS_I2CDEV_WR 0x01 /* write */
|
||||
#define ENVY24HT_CCS_I2CDEV_RD 0x00 /* read */
|
||||
|
||||
|
||||
#define ENVY24HT_CCS_I2CADDR 0x11 /* I2C Port Byte Address Register */
|
||||
#define ENVY24HT_CCS_I2CDATA 0x12 /* I2C Port Read/Write Data Register */
|
||||
|
||||
@@ -59,9 +59,9 @@
|
||||
|
||||
#define ENVY24HT_CCS_SCFG 0x04 /* System Configuration Register */
|
||||
#define ENVY24HT_CCSM_SCFG_XIN2 0xc0 /* XIN2 Clock Source Configuration */
|
||||
/* 00: 24.576MHz(96kHz*256) */
|
||||
/* 01: 49.152MHz(192kHz*256) */
|
||||
/* 1x: Reserved */
|
||||
/* 00: 24.576MHz(96kHz*256) */
|
||||
/* 01: 49.152MHz(192kHz*256) */
|
||||
/* 1x: Reserved */
|
||||
#define ENVY24HT_CCSM_SCFG_MPU 0x20 /* 0(not implemented)/1(1) MPU-401 UART */
|
||||
#define ENVY24HT_CCSM_SCFG_ADC 0x0c /* 1-2 stereo ADC connected, S/PDIF receiver connected */
|
||||
#define ENVY24HT_CCSM_SCFG_DAC 0x03 /* 1-4 stereo DAC connected */
|
||||
@@ -90,14 +90,14 @@
|
||||
|
||||
/* Professional Multi-Track Control Registers */
|
||||
|
||||
#define ENVY24HT_MT_INT_STAT 0x00 /* DMA Interrupt Mask and Status Register */
|
||||
#define ENVY24HT_MT_INT_STAT 0x00 /* DMA Interrupt Mask and Status Register */
|
||||
#define ENVY24HT_MT_INT_RSTAT 0x02 /* Multi-track record interrupt status */
|
||||
#define ENVY24HT_MT_INT_PSTAT 0x01 /* Multi-track playback interrupt status */
|
||||
#define ENVY24HT_MT_INT_MASK 0x03
|
||||
#define ENVY24HT_MT_INT_RMASK 0x02 /* Multi-track record interrupt mask */
|
||||
#define ENVY24HT_MT_INT_PMASK 0x01 /* Multi-track playback interrupt mask */
|
||||
|
||||
#define ENVY24HT_MT_RATE 0x01 /* Sampling Rate Select Register */
|
||||
#define ENVY24HT_MT_RATE 0x01 /* Sampling Rate Select Register */
|
||||
#define ENVY24HT_MT_RATE_SPDIF 0x10 /* S/PDIF input clock as the master */
|
||||
#define ENVY24HT_MT_RATE_48000 0x00
|
||||
#define ENVY24HT_MT_RATE_24000 0x01
|
||||
|
||||
+70
-70
@@ -262,7 +262,7 @@ static const struct {
|
||||
unsigned avail:1;
|
||||
} mixtable[SOUND_MIXER_NRDEVICES] = {
|
||||
[SOUND_MIXER_VOLUME] = { 0, 0x0, 0x1, 1, 0x1f7f, 1 },
|
||||
[SOUND_MIXER_PCM] = { 1, 0x2, 0x3, 1, 0x0400, 1 },
|
||||
[SOUND_MIXER_PCM] = { 1, 0x2, 0x3, 1, 0x0400, 1 },
|
||||
[SOUND_MIXER_SYNTH] = { 2, 0x4, 0x5, 1, 0x0060, 1 },
|
||||
[SOUND_MIXER_CD] = { 3, 0x6, 0x7, 1, 0x0006, 1 },
|
||||
[SOUND_MIXER_LINE] = { 4, 0x8, 0x9, 1, 0x0018, 1 },
|
||||
@@ -612,16 +612,16 @@ eschan1370_setspeed(kobj_t obj, void *data, uint32_t speed)
|
||||
static uint32_t
|
||||
eschan1371_setspeed(kobj_t obj, void *data, uint32_t speed)
|
||||
{
|
||||
struct es_chinfo *ch = data;
|
||||
struct es_info *es = ch->parent;
|
||||
struct es_chinfo *ch = data;
|
||||
struct es_info *es = ch->parent;
|
||||
uint32_t i;
|
||||
int delta;
|
||||
|
||||
ES_LOCK(es);
|
||||
if (ch->dir == PCMDIR_PLAY)
|
||||
i = es1371_dac_rate(es, speed, ch->index); /* play */
|
||||
i = es1371_dac_rate(es, speed, ch->index); /* play */
|
||||
else
|
||||
i = es1371_adc_rate(es, speed, ch->index); /* record */
|
||||
i = es1371_adc_rate(es, speed, ch->index); /* record */
|
||||
ES_UNLOCK(es);
|
||||
delta = (speed > i) ? (speed - i) : (i - speed);
|
||||
if (delta < 2)
|
||||
@@ -632,8 +632,8 @@ eschan1371_setspeed(kobj_t obj, void *data, uint32_t speed)
|
||||
static int
|
||||
eschan_setfragments(kobj_t obj, void *data, uint32_t blksz, uint32_t blkcnt)
|
||||
{
|
||||
struct es_chinfo *ch = data;
|
||||
struct es_info *es = ch->parent;
|
||||
struct es_chinfo *ch = data;
|
||||
struct es_info *es = ch->parent;
|
||||
|
||||
blksz &= ES_BLK_ALIGN;
|
||||
|
||||
@@ -671,8 +671,8 @@ eschan_setfragments(kobj_t obj, void *data, uint32_t blksz, uint32_t blkcnt)
|
||||
static uint32_t
|
||||
eschan_setblocksize(kobj_t obj, void *data, uint32_t blksz)
|
||||
{
|
||||
struct es_chinfo *ch = data;
|
||||
struct es_info *es = ch->parent;
|
||||
struct es_chinfo *ch = data;
|
||||
struct es_info *es = ch->parent;
|
||||
|
||||
eschan_setfragments(obj, data, blksz, es->blkcnt);
|
||||
|
||||
@@ -1113,23 +1113,23 @@ es1371_wrcd(kobj_t obj, void *s, int addr, uint32_t data)
|
||||
struct es_info *es = (struct es_info*)s;
|
||||
|
||||
for (t = 0; t < 0x1000; t++) {
|
||||
if (!es_rd(es, ES1371_REG_CODEC & CODEC_WIP, 4))
|
||||
if (!es_rd(es, ES1371_REG_CODEC & CODEC_WIP, 4))
|
||||
break;
|
||||
}
|
||||
/* save the current state for later */
|
||||
x = orig = es_rd(es, ES1371_REG_SMPRATE, 4);
|
||||
x = orig = es_rd(es, ES1371_REG_SMPRATE, 4);
|
||||
/* enable SRC state data in SRC mux */
|
||||
es_wr(es, ES1371_REG_SMPRATE, (x & (ES1371_DIS_SRC | ES1371_DIS_P1 |
|
||||
ES1371_DIS_P2 | ES1371_DIS_R1)) | 0x00010000, 4);
|
||||
/* busy wait */
|
||||
for (t = 0; t < 0x1000; t++) {
|
||||
if ((es_rd(es, ES1371_REG_SMPRATE, 4) & 0x00870000) ==
|
||||
if ((es_rd(es, ES1371_REG_SMPRATE, 4) & 0x00870000) ==
|
||||
0x00000000)
|
||||
break;
|
||||
}
|
||||
/* wait for a SAFE time to write addr/data and then do it, dammit */
|
||||
for (t = 0; t < 0x1000; t++) {
|
||||
if ((es_rd(es, ES1371_REG_SMPRATE, 4) & 0x00870000) ==
|
||||
if ((es_rd(es, ES1371_REG_SMPRATE, 4) & 0x00870000) ==
|
||||
0x00010000)
|
||||
break;
|
||||
}
|
||||
@@ -1147,46 +1147,46 @@ es1371_wrcd(kobj_t obj, void *s, int addr, uint32_t data)
|
||||
static int
|
||||
es1371_rdcd(kobj_t obj, void *s, int addr)
|
||||
{
|
||||
uint32_t t, x, orig;
|
||||
struct es_info *es = (struct es_info *)s;
|
||||
uint32_t t, x, orig;
|
||||
struct es_info *es = (struct es_info *)s;
|
||||
|
||||
for (t = 0; t < 0x1000; t++) {
|
||||
for (t = 0; t < 0x1000; t++) {
|
||||
if (!(x = es_rd(es, ES1371_REG_CODEC, 4) & CODEC_WIP))
|
||||
break;
|
||||
break;
|
||||
}
|
||||
|
||||
/* save the current state for later */
|
||||
x = orig = es_rd(es, ES1371_REG_SMPRATE, 4);
|
||||
/* enable SRC state data in SRC mux */
|
||||
es_wr(es, ES1371_REG_SMPRATE, (x & (ES1371_DIS_SRC | ES1371_DIS_P1 |
|
||||
/* save the current state for later */
|
||||
x = orig = es_rd(es, ES1371_REG_SMPRATE, 4);
|
||||
/* enable SRC state data in SRC mux */
|
||||
es_wr(es, ES1371_REG_SMPRATE, (x & (ES1371_DIS_SRC | ES1371_DIS_P1 |
|
||||
ES1371_DIS_P2 | ES1371_DIS_R1)) | 0x00010000, 4);
|
||||
/* busy wait */
|
||||
for (t = 0; t < 0x1000; t++) {
|
||||
for (t = 0; t < 0x1000; t++) {
|
||||
if ((x = es_rd(es, ES1371_REG_SMPRATE, 4) & 0x00870000) ==
|
||||
0x00000000)
|
||||
break;
|
||||
break;
|
||||
}
|
||||
/* wait for a SAFE time to write addr/data and then do it, dammit */
|
||||
for (t = 0; t < 0x1000; t++) {
|
||||
/* wait for a SAFE time to write addr/data and then do it, dammit */
|
||||
for (t = 0; t < 0x1000; t++) {
|
||||
if ((x = es_rd(es, ES1371_REG_SMPRATE, 4) & 0x00870000) ==
|
||||
0x00010000)
|
||||
break;
|
||||
break;
|
||||
}
|
||||
|
||||
es_wr(es, ES1371_REG_CODEC, ((addr << CODEC_POADD_SHIFT) &
|
||||
es_wr(es, ES1371_REG_CODEC, ((addr << CODEC_POADD_SHIFT) &
|
||||
CODEC_POADD_MASK) | CODEC_PORD, 4);
|
||||
|
||||
/* restore SRC reg */
|
||||
es1371_wait_src_ready(s);
|
||||
es_wr(es, ES1371_REG_SMPRATE, orig, 4);
|
||||
/* restore SRC reg */
|
||||
es1371_wait_src_ready(s);
|
||||
es_wr(es, ES1371_REG_SMPRATE, orig, 4);
|
||||
|
||||
/* now wait for the stinkin' data (RDY) */
|
||||
for (t = 0; t < 0x1000; t++) {
|
||||
/* now wait for the stinkin' data (RDY) */
|
||||
for (t = 0; t < 0x1000; t++) {
|
||||
if ((x = es_rd(es, ES1371_REG_CODEC, 4)) & CODEC_RDY)
|
||||
break;
|
||||
break;
|
||||
}
|
||||
|
||||
return ((x & CODEC_PIDAT_MASK) >> CODEC_PIDAT_SHIFT);
|
||||
return ((x & CODEC_PIDAT_MASK) >> CODEC_PIDAT_SHIFT);
|
||||
}
|
||||
|
||||
static kobj_method_t es1371_ac97_methods[] = {
|
||||
@@ -1201,13 +1201,13 @@ AC97_DECLARE(es1371_ac97);
|
||||
static unsigned int
|
||||
es1371_src_read(struct es_info *es, unsigned short reg)
|
||||
{
|
||||
uint32_t r;
|
||||
uint32_t r;
|
||||
|
||||
r = es1371_wait_src_ready(es) & (ES1371_DIS_SRC | ES1371_DIS_P1 |
|
||||
r = es1371_wait_src_ready(es) & (ES1371_DIS_SRC | ES1371_DIS_P1 |
|
||||
ES1371_DIS_P2 | ES1371_DIS_R1);
|
||||
r |= ES1371_SRC_RAM_ADDRO(reg);
|
||||
es_wr(es, ES1371_REG_SMPRATE, r, 4);
|
||||
return (ES1371_SRC_RAM_DATAI(es1371_wait_src_ready(es)));
|
||||
r |= ES1371_SRC_RAM_ADDRO(reg);
|
||||
es_wr(es, ES1371_REG_SMPRATE, r, 4);
|
||||
return (ES1371_SRC_RAM_DATAI(es1371_wait_src_ready(es)));
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -1224,30 +1224,30 @@ es1371_src_write(struct es_info *es, unsigned short reg, unsigned short data)
|
||||
static unsigned int
|
||||
es1371_adc_rate(struct es_info *es, unsigned int rate, int set)
|
||||
{
|
||||
unsigned int n, truncm, freq, result;
|
||||
unsigned int n, truncm, freq, result;
|
||||
|
||||
ES_LOCK_ASSERT(es);
|
||||
|
||||
if (rate > 48000)
|
||||
if (rate > 48000)
|
||||
rate = 48000;
|
||||
if (rate < 4000)
|
||||
if (rate < 4000)
|
||||
rate = 4000;
|
||||
n = rate / 3000;
|
||||
if ((1 << n) & ((1 << 15) | (1 << 13) | (1 << 11) | (1 << 9)))
|
||||
n = rate / 3000;
|
||||
if ((1 << n) & ((1 << 15) | (1 << 13) | (1 << 11) | (1 << 9)))
|
||||
n--;
|
||||
truncm = (21 * n - 1) | 1;
|
||||
freq = ((48000UL << 15) / rate) * n;
|
||||
result = (48000UL << 15) / (freq / n);
|
||||
if (set) {
|
||||
truncm = (21 * n - 1) | 1;
|
||||
freq = ((48000UL << 15) / rate) * n;
|
||||
result = (48000UL << 15) / (freq / n);
|
||||
if (set) {
|
||||
if (rate >= 24000) {
|
||||
if (truncm > 239)
|
||||
if (truncm > 239)
|
||||
truncm = 239;
|
||||
es1371_src_write(es, ES_SMPREG_ADC + ES_SMPREG_TRUNC_N,
|
||||
es1371_src_write(es, ES_SMPREG_ADC + ES_SMPREG_TRUNC_N,
|
||||
(((239 - truncm) >> 1) << 9) | (n << 4));
|
||||
} else {
|
||||
if (truncm > 119)
|
||||
if (truncm > 119)
|
||||
truncm = 119;
|
||||
es1371_src_write(es, ES_SMPREG_ADC + ES_SMPREG_TRUNC_N,
|
||||
es1371_src_write(es, ES_SMPREG_ADC + ES_SMPREG_TRUNC_N,
|
||||
0x8000 | (((119 - truncm) >> 1) << 9) | (n << 4));
|
||||
}
|
||||
es1371_src_write(es, ES_SMPREG_ADC + ES_SMPREG_INT_REGS,
|
||||
@@ -1264,16 +1264,16 @@ es1371_adc_rate(struct es_info *es, unsigned int rate, int set)
|
||||
static unsigned int
|
||||
es1371_dac_rate(struct es_info *es, unsigned int rate, int set)
|
||||
{
|
||||
unsigned int freq, r, result, dac, dis;
|
||||
unsigned int freq, r, result, dac, dis;
|
||||
|
||||
ES_LOCK_ASSERT(es);
|
||||
|
||||
if (rate > 48000)
|
||||
if (rate > 48000)
|
||||
rate = 48000;
|
||||
if (rate < 4000)
|
||||
if (rate < 4000)
|
||||
rate = 4000;
|
||||
freq = ((rate << 15) + 1500) / 3000;
|
||||
result = (freq * 3000) >> 15;
|
||||
freq = ((rate << 15) + 1500) / 3000;
|
||||
result = (freq * 3000) >> 15;
|
||||
|
||||
dac = (set == ES_DAC1) ? ES_SMPREG_DAC1 : ES_SMPREG_DAC2;
|
||||
dis = (set == ES_DAC1) ? ES1371_DIS_P2 : ES1371_DIS_P1;
|
||||
@@ -1287,23 +1287,23 @@ es1371_dac_rate(struct es_info *es, unsigned int rate, int set)
|
||||
r = (es1371_wait_src_ready(es) &
|
||||
(ES1371_DIS_SRC | dis | ES1371_DIS_R1));
|
||||
es_wr(es, ES1371_REG_SMPRATE, r, 4);
|
||||
return (result);
|
||||
return (result);
|
||||
}
|
||||
|
||||
static uint32_t
|
||||
es1371_wait_src_ready(struct es_info *es)
|
||||
{
|
||||
uint32_t t, r;
|
||||
uint32_t t, r;
|
||||
|
||||
for (t = 0; t < 0x1000; t++) {
|
||||
for (t = 0; t < 0x1000; t++) {
|
||||
if (!((r = es_rd(es, ES1371_REG_SMPRATE, 4)) &
|
||||
ES1371_SRC_RAM_BUSY))
|
||||
return (r);
|
||||
return (r);
|
||||
DELAY(1);
|
||||
}
|
||||
}
|
||||
device_printf(es->dev, "%s: timed out 0x%x [0x%x]\n", __func__,
|
||||
ES1371_REG_SMPRATE, r);
|
||||
return (0);
|
||||
return (0);
|
||||
}
|
||||
|
||||
/* -------------------------------------------------------------------- */
|
||||
@@ -1805,25 +1805,25 @@ es_pci_attach(device_t dev)
|
||||
case CT4730_PCI_ID:
|
||||
es1371_init(es);
|
||||
codec = AC97_CREATE(dev, es, es1371_ac97);
|
||||
if (codec == NULL)
|
||||
if (codec == NULL)
|
||||
goto bad;
|
||||
/* our init routine does everything for us */
|
||||
/* set to NULL; flag mixer_init not to run the ac97_init */
|
||||
/* ac97_mixer.init = NULL; */
|
||||
/* our init routine does everything for us */
|
||||
/* set to NULL; flag mixer_init not to run the ac97_init */
|
||||
/* ac97_mixer.init = NULL; */
|
||||
if (mixer_init(dev, ac97_getmixerclass(), codec))
|
||||
goto bad;
|
||||
ct = &eschan1371_class;
|
||||
break;
|
||||
case ES1370_PCI_ID:
|
||||
es1370_init(es);
|
||||
/*
|
||||
es1370_init(es);
|
||||
/*
|
||||
* Disable fixed rate operation if DAC2 disabled.
|
||||
* This is a special case for es1370 only, where the
|
||||
* speed of both ADC and DAC2 locked together.
|
||||
*/
|
||||
if (!ES_DAC2_ENABLED(es->escfg))
|
||||
es->escfg = ES_SET_FIXED_RATE(es->escfg, 0);
|
||||
if (mixer_init(dev, &es1370_mixer_class, es))
|
||||
if (mixer_init(dev, &es1370_mixer_class, es))
|
||||
goto bad;
|
||||
ct = &eschan1370_class;
|
||||
break;
|
||||
|
||||
+17
-17
@@ -272,8 +272,8 @@ fm801_wrcd(kobj_t obj, void *devinfo, int regno, uint32_t data)
|
||||
}
|
||||
|
||||
static kobj_method_t fm801_ac97_methods[] = {
|
||||
KOBJMETHOD(ac97_read, fm801_rdcd),
|
||||
KOBJMETHOD(ac97_write, fm801_wrcd),
|
||||
KOBJMETHOD(ac97_read, fm801_rdcd),
|
||||
KOBJMETHOD(ac97_write, fm801_wrcd),
|
||||
DEVMETHOD_END
|
||||
};
|
||||
AC97_DECLARE(fm801_ac97);
|
||||
@@ -286,8 +286,8 @@ AC97_DECLARE(fm801_ac97);
|
||||
static void
|
||||
fm801_intr(void *p)
|
||||
{
|
||||
struct fm801_info *fm801 = (struct fm801_info *)p;
|
||||
uint32_t intsrc = fm801_rd(fm801, FM_INTSTATUS, 2);
|
||||
struct fm801_info *fm801 = (struct fm801_info *)p;
|
||||
uint32_t intsrc = fm801_rd(fm801, FM_INTSTATUS, 2);
|
||||
|
||||
DPRINT("\nfm801_intr intsrc 0x%x ", intsrc);
|
||||
|
||||
@@ -519,13 +519,13 @@ fm801ch_getcaps(kobj_t obj, void *data)
|
||||
}
|
||||
|
||||
static kobj_method_t fm801ch_methods[] = {
|
||||
KOBJMETHOD(channel_init, fm801ch_init),
|
||||
KOBJMETHOD(channel_setformat, fm801ch_setformat),
|
||||
KOBJMETHOD(channel_setspeed, fm801ch_setspeed),
|
||||
KOBJMETHOD(channel_setblocksize, fm801ch_setblocksize),
|
||||
KOBJMETHOD(channel_trigger, fm801ch_trigger),
|
||||
KOBJMETHOD(channel_getptr, fm801ch_getptr),
|
||||
KOBJMETHOD(channel_getcaps, fm801ch_getcaps),
|
||||
KOBJMETHOD(channel_init, fm801ch_init),
|
||||
KOBJMETHOD(channel_setformat, fm801ch_setformat),
|
||||
KOBJMETHOD(channel_setspeed, fm801ch_setspeed),
|
||||
KOBJMETHOD(channel_setblocksize, fm801ch_setblocksize),
|
||||
KOBJMETHOD(channel_trigger, fm801ch_trigger),
|
||||
KOBJMETHOD(channel_getptr, fm801ch_getptr),
|
||||
KOBJMETHOD(channel_getcaps, fm801ch_getcaps),
|
||||
DEVMETHOD_END
|
||||
};
|
||||
CHANNEL_DECLARE(fm801ch);
|
||||
@@ -569,11 +569,11 @@ fm801_init(struct fm801_info *fm801)
|
||||
static int
|
||||
fm801_pci_attach(device_t dev)
|
||||
{
|
||||
struct ac97_info *codec = NULL;
|
||||
struct fm801_info *fm801;
|
||||
int i;
|
||||
int mapped = 0;
|
||||
char status[SND_STATUSLEN];
|
||||
struct ac97_info *codec = NULL;
|
||||
struct fm801_info *fm801;
|
||||
int i;
|
||||
int mapped = 0;
|
||||
char status[SND_STATUSLEN];
|
||||
|
||||
fm801 = malloc(sizeof(*fm801), M_DEVBUF, M_WAITOK | M_ZERO);
|
||||
fm801->type = pci_get_devid(dev);
|
||||
@@ -588,7 +588,7 @@ fm801_pci_attach(device_t dev)
|
||||
if(!fm801->reg)
|
||||
{
|
||||
fm801->regtype = SYS_RES_IOPORT;
|
||||
fm801->reg = bus_alloc_resource_any(dev,
|
||||
fm801->reg = bus_alloc_resource_any(dev,
|
||||
fm801->regtype,
|
||||
&fm801->regid,
|
||||
RF_ACTIVE);
|
||||
|
||||
+11
-11
@@ -351,7 +351,7 @@ ich_resetchan(struct sc_info *sc, int num)
|
||||
return (0);
|
||||
#if 0
|
||||
else if (sc->vendor == NVIDIA_VENDORID) {
|
||||
sc->flags |= ICH_IGNORE_RESET;
|
||||
sc->flags |= ICH_IGNORE_RESET;
|
||||
device_printf(sc->dev, "ignoring reset failure!\n");
|
||||
return (0);
|
||||
}
|
||||
@@ -544,7 +544,7 @@ ichchan_getptr(kobj_t obj, void *data)
|
||||
{
|
||||
struct sc_chinfo *ch = data;
|
||||
struct sc_info *sc = ch->parent;
|
||||
uint32_t pos;
|
||||
uint32_t pos;
|
||||
|
||||
ICH_DEBUG(
|
||||
if (!(sc->flags & ICH_CALIBRATE_DONE))
|
||||
@@ -802,7 +802,7 @@ ich_calibrate(void *arg)
|
||||
device_printf(sc->dev, "measured ac97 link rate at %d Hz", actual_48k_rate);
|
||||
if (sc->ac97rate != actual_48k_rate)
|
||||
printf(", will use %d Hz", sc->ac97rate);
|
||||
printf("\n");
|
||||
printf("\n");
|
||||
}
|
||||
sc->flags |= ICH_CALIBRATE_DONE;
|
||||
ICH_UNLOCK(sc);
|
||||
@@ -884,7 +884,7 @@ ich_pci_attach(device_t dev)
|
||||
uint32_t subdev;
|
||||
uint16_t extcaps;
|
||||
uint16_t devid, vendor;
|
||||
struct sc_info *sc;
|
||||
struct sc_info *sc;
|
||||
int i;
|
||||
|
||||
sc = malloc(sizeof(*sc), M_DEVBUF, M_WAITOK | M_ZERO);
|
||||
@@ -927,7 +927,7 @@ ich_pci_attach(device_t dev)
|
||||
* read-only. Need to enable "legacy support", by poking into
|
||||
* pci config space. The driver should use MMBAR and MBBAR,
|
||||
* but doing so will mess things up here. ich4 has enough new
|
||||
* features it warrants it's own driver.
|
||||
* features it warrants it's own driver.
|
||||
*/
|
||||
if (vendor == INTEL_VENDORID && (devid == INTEL_82801DB ||
|
||||
devid == INTEL_82801EB || devid == INTEL_6300ESB ||
|
||||
@@ -942,9 +942,9 @@ ich_pci_attach(device_t dev)
|
||||
sc->regtype = SYS_RES_IOPORT;
|
||||
}
|
||||
|
||||
sc->nambar = bus_alloc_resource_any(dev, sc->regtype,
|
||||
sc->nambar = bus_alloc_resource_any(dev, sc->regtype,
|
||||
&sc->nambarid, RF_ACTIVE);
|
||||
sc->nabmbar = bus_alloc_resource_any(dev, sc->regtype,
|
||||
sc->nabmbar = bus_alloc_resource_any(dev, sc->regtype,
|
||||
&sc->nabmbarid, RF_ACTIVE);
|
||||
|
||||
if (!sc->nambar || !sc->nabmbar) {
|
||||
@@ -1147,14 +1147,14 @@ ich_pci_codec_reset(struct sc_info *sc)
|
||||
int i;
|
||||
uint32_t control;
|
||||
|
||||
control = ich_rd(sc, ICH_REG_GLOB_CNT, 4);
|
||||
control = ich_rd(sc, ICH_REG_GLOB_CNT, 4);
|
||||
control &= ~(ICH_GLOB_CTL_SHUT);
|
||||
control |= (control & ICH_GLOB_CTL_COLD) ?
|
||||
ICH_GLOB_CTL_WARM : ICH_GLOB_CTL_COLD;
|
||||
ich_wr(sc, ICH_REG_GLOB_CNT, control, 4);
|
||||
|
||||
for (i = 500000; i; i--) {
|
||||
if (ich_rd(sc, ICH_REG_GLOB_STA, 4) & ICH_GLOB_STA_PCR)
|
||||
if (ich_rd(sc, ICH_REG_GLOB_STA, 4) & ICH_GLOB_STA_PCR)
|
||||
break; /* or ICH_SCR? */
|
||||
DELAY(1);
|
||||
}
|
||||
@@ -1203,7 +1203,7 @@ ich_pci_resume(device_t dev)
|
||||
ich_pci_codec_reset(sc);
|
||||
ICH_UNLOCK(sc);
|
||||
ac97_setextmode(sc->codec, sc->hasvra | sc->hasvrm);
|
||||
if (mixer_reinit(dev) == -1) {
|
||||
if (mixer_reinit(dev) == -1) {
|
||||
device_printf(dev, "unable to reinitialize the mixer\n");
|
||||
return (ENXIO);
|
||||
}
|
||||
@@ -1224,7 +1224,7 @@ static device_method_t ich_methods[] = {
|
||||
DEVMETHOD(device_probe, ich_pci_probe),
|
||||
DEVMETHOD(device_attach, ich_pci_attach),
|
||||
DEVMETHOD(device_detach, ich_pci_detach),
|
||||
DEVMETHOD(device_suspend, ich_pci_suspend),
|
||||
DEVMETHOD(device_suspend, ich_pci_suspend),
|
||||
DEVMETHOD(device_resume, ich_pci_resume),
|
||||
DEVMETHOD_END
|
||||
};
|
||||
|
||||
@@ -194,7 +194,7 @@ static int m3_chan_active(struct sc_info *);
|
||||
/* talk to the codec - called from ac97.c */
|
||||
static uint32_t m3_initcd(kobj_t, void *);
|
||||
static int m3_rdcd(kobj_t, void *, int);
|
||||
static int m3_wrcd(kobj_t, void *, int, uint32_t);
|
||||
static int m3_wrcd(kobj_t, void *, int, uint32_t);
|
||||
|
||||
/* stuff */
|
||||
static void m3_intr(void *);
|
||||
@@ -661,9 +661,9 @@ m3_pchan_trigger_locked(kobj_t kobj, void *chdata, int go)
|
||||
/*[[inc_timer_users]]*/
|
||||
if (m3_chan_active(sc) == 1) {
|
||||
m3_wr_assp_data(sc, KDATA_TIMER_COUNT_RELOAD, 240);
|
||||
m3_wr_assp_data(sc, KDATA_TIMER_COUNT_CURRENT, 240);
|
||||
m3_wr_assp_data(sc, KDATA_TIMER_COUNT_CURRENT, 240);
|
||||
data = m3_rd_2(sc, HOST_INT_CTRL);
|
||||
m3_wr_2(sc, HOST_INT_CTRL, data | CLKRUN_GEN_ENABLE);
|
||||
m3_wr_2(sc, HOST_INT_CTRL, data | CLKRUN_GEN_ENABLE);
|
||||
}
|
||||
|
||||
m3_wr_assp_data(sc, ch->dac_data + CDATA_INSTANCE_READY, 1);
|
||||
@@ -683,8 +683,8 @@ m3_pchan_trigger_locked(kobj_t kobj, void *chdata, int go)
|
||||
/*[[dec_timer_users]]*/
|
||||
if (m3_chan_active(sc) == 0) {
|
||||
m3_wr_assp_data(sc, KDATA_TIMER_COUNT_RELOAD, 0);
|
||||
m3_wr_assp_data(sc, KDATA_TIMER_COUNT_CURRENT, 0);
|
||||
data = m3_rd_2(sc, HOST_INT_CTRL);
|
||||
m3_wr_assp_data(sc, KDATA_TIMER_COUNT_CURRENT, 0);
|
||||
data = m3_rd_2(sc, HOST_INT_CTRL);
|
||||
m3_wr_2(sc, HOST_INT_CTRL, data & ~CLKRUN_GEN_ENABLE);
|
||||
}
|
||||
|
||||
@@ -755,7 +755,7 @@ m3_rchan_init(kobj_t kobj, void *devinfo, struct snd_dbuf *b, struct pcm_channel
|
||||
uint32_t bus_addr, i;
|
||||
|
||||
int idx, data_bytes, adc_data;
|
||||
int dsp_in_size, dsp_out_size, dsp_in_buf, dsp_out_buf;
|
||||
int dsp_in_size, dsp_out_size, dsp_in_buf, dsp_out_buf;
|
||||
|
||||
struct data_word {
|
||||
uint16_t addr, val;
|
||||
@@ -1017,8 +1017,8 @@ m3_rchan_trigger_locked(kobj_t kobj, void *chdata, int go)
|
||||
/*[[inc_timer_users]]*/
|
||||
if (m3_chan_active(sc) == 1) {
|
||||
m3_wr_assp_data(sc, KDATA_TIMER_COUNT_RELOAD, 240);
|
||||
m3_wr_assp_data(sc, KDATA_TIMER_COUNT_CURRENT, 240);
|
||||
data = m3_rd_2(sc, HOST_INT_CTRL);
|
||||
m3_wr_assp_data(sc, KDATA_TIMER_COUNT_CURRENT, 240);
|
||||
data = m3_rd_2(sc, HOST_INT_CTRL);
|
||||
m3_wr_2(sc, HOST_INT_CTRL, data | CLKRUN_GEN_ENABLE);
|
||||
}
|
||||
|
||||
@@ -1036,8 +1036,8 @@ m3_rchan_trigger_locked(kobj_t kobj, void *chdata, int go)
|
||||
/*[[dec_timer_users]]*/
|
||||
if (m3_chan_active(sc) == 0) {
|
||||
m3_wr_assp_data(sc, KDATA_TIMER_COUNT_RELOAD, 0);
|
||||
m3_wr_assp_data(sc, KDATA_TIMER_COUNT_CURRENT, 0);
|
||||
data = m3_rd_2(sc, HOST_INT_CTRL);
|
||||
m3_wr_assp_data(sc, KDATA_TIMER_COUNT_CURRENT, 0);
|
||||
data = m3_rd_2(sc, HOST_INT_CTRL);
|
||||
m3_wr_2(sc, HOST_INT_CTRL, data & ~CLKRUN_GEN_ENABLE);
|
||||
}
|
||||
|
||||
@@ -1338,7 +1338,7 @@ m3_pci_attach(device_t dev)
|
||||
|
||||
if (resource_int_value(device_get_name(dev), device_get_unit(dev),
|
||||
"dac", &i) == 0) {
|
||||
if (i < 1)
|
||||
if (i < 1)
|
||||
dacn = 1;
|
||||
else if (i > M3_PCHANS)
|
||||
dacn = M3_PCHANS;
|
||||
|
||||
@@ -44,8 +44,8 @@
|
||||
|
||||
#define NM_BUFFSIZE 16384
|
||||
|
||||
#define NM256AV_PCI_ID 0x800510c8
|
||||
#define NM256ZX_PCI_ID 0x800610c8
|
||||
#define NM256AV_PCI_ID 0x800510c8
|
||||
#define NM256ZX_PCI_ID 0x800610c8
|
||||
|
||||
struct sc_info;
|
||||
|
||||
@@ -61,13 +61,13 @@ struct sc_chinfo {
|
||||
/* device private data */
|
||||
struct sc_info {
|
||||
device_t dev;
|
||||
uint32_t type;
|
||||
uint32_t type;
|
||||
|
||||
struct resource *reg, *irq, *buf;
|
||||
int regid, irqid, bufid;
|
||||
void *ih;
|
||||
|
||||
uint32_t ac97_base, ac97_status, ac97_busy;
|
||||
uint32_t ac97_base, ac97_status, ac97_busy;
|
||||
uint32_t buftop, pbuf, rbuf, cbuf, acbuf;
|
||||
uint32_t playint, recint, misc1int, misc2int;
|
||||
uint32_t irsz, badintr;
|
||||
@@ -82,16 +82,16 @@ struct sc_info {
|
||||
*/
|
||||
|
||||
/* stuff */
|
||||
static int nm_loadcoeff(struct sc_info *sc, int dir, int num);
|
||||
static int nm_loadcoeff(struct sc_info *sc, int dir, int num);
|
||||
static int nm_setch(struct sc_chinfo *ch);
|
||||
static int nm_init(struct sc_info *);
|
||||
static void nm_intr(void *);
|
||||
|
||||
/* talk to the card */
|
||||
static uint32_t nm_rd(struct sc_info *, int, int);
|
||||
static void nm_wr(struct sc_info *, int, uint32_t, int);
|
||||
static void nm_wr(struct sc_info *, int, uint32_t, int);
|
||||
static uint32_t nm_rdbuf(struct sc_info *, int, int);
|
||||
static void nm_wrbuf(struct sc_info *, int, uint32_t, int);
|
||||
static void nm_wrbuf(struct sc_info *, int, uint32_t, int);
|
||||
|
||||
static uint32_t badcards[] = {
|
||||
0x0007103c,
|
||||
@@ -278,9 +278,9 @@ nm_wrcd(kobj_t obj, void *devinfo, int regno, uint32_t data)
|
||||
}
|
||||
|
||||
static kobj_method_t nm_ac97_methods[] = {
|
||||
KOBJMETHOD(ac97_init, nm_initcd),
|
||||
KOBJMETHOD(ac97_read, nm_rdcd),
|
||||
KOBJMETHOD(ac97_write, nm_wrcd),
|
||||
KOBJMETHOD(ac97_init, nm_initcd),
|
||||
KOBJMETHOD(ac97_read, nm_rdcd),
|
||||
KOBJMETHOD(ac97_write, nm_wrcd),
|
||||
KOBJMETHOD_END
|
||||
};
|
||||
AC97_DECLARE(nm_ac97);
|
||||
@@ -470,14 +470,14 @@ nmchan_getcaps(kobj_t obj, void *data)
|
||||
}
|
||||
|
||||
static kobj_method_t nmchan_methods[] = {
|
||||
KOBJMETHOD(channel_init, nmchan_init),
|
||||
KOBJMETHOD(channel_free, nmchan_free),
|
||||
KOBJMETHOD(channel_setformat, nmchan_setformat),
|
||||
KOBJMETHOD(channel_setspeed, nmchan_setspeed),
|
||||
KOBJMETHOD(channel_setblocksize, nmchan_setblocksize),
|
||||
KOBJMETHOD(channel_trigger, nmchan_trigger),
|
||||
KOBJMETHOD(channel_getptr, nmchan_getptr),
|
||||
KOBJMETHOD(channel_getcaps, nmchan_getcaps),
|
||||
KOBJMETHOD(channel_init, nmchan_init),
|
||||
KOBJMETHOD(channel_free, nmchan_free),
|
||||
KOBJMETHOD(channel_setformat, nmchan_setformat),
|
||||
KOBJMETHOD(channel_setspeed, nmchan_setspeed),
|
||||
KOBJMETHOD(channel_setblocksize, nmchan_setblocksize),
|
||||
KOBJMETHOD(channel_trigger, nmchan_trigger),
|
||||
KOBJMETHOD(channel_getptr, nmchan_getptr),
|
||||
KOBJMETHOD(channel_getcaps, nmchan_getcaps),
|
||||
KOBJMETHOD_END
|
||||
};
|
||||
CHANNEL_DECLARE(nmchan);
|
||||
@@ -516,18 +516,18 @@ nm_intr(void *p)
|
||||
nm_ackint(sc, sc->misc1int);
|
||||
x = nm_rd(sc, 0x400, 1);
|
||||
nm_wr(sc, 0x400, x | 2, 1);
|
||||
device_printf(sc->dev, "misc int 1\n");
|
||||
device_printf(sc->dev, "misc int 1\n");
|
||||
}
|
||||
if (status & sc->misc2int) {
|
||||
status &= ~sc->misc2int;
|
||||
nm_ackint(sc, sc->misc2int);
|
||||
x = nm_rd(sc, 0x400, 1);
|
||||
nm_wr(sc, 0x400, x & ~2, 1);
|
||||
device_printf(sc->dev, "misc int 2\n");
|
||||
device_printf(sc->dev, "misc int 2\n");
|
||||
}
|
||||
if (status) {
|
||||
nm_ackint(sc, status);
|
||||
device_printf(sc->dev, "unknown int\n");
|
||||
device_printf(sc->dev, "unknown int\n");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -573,7 +573,7 @@ nm_init(struct sc_info *sc)
|
||||
|
||||
if (bootverbose)
|
||||
device_printf(sc->dev, "buftop is 0x%08x\n", sc->buftop);
|
||||
if ((nm_rdbuf(sc, ofs, 4) & NM_SIG_MASK) == NM_SIGNATURE) {
|
||||
if ((nm_rdbuf(sc, ofs, 4) & NM_SIG_MASK) == NM_SIGNATURE) {
|
||||
i = nm_rdbuf(sc, ofs + 4, 4);
|
||||
if (i != 0 && i != 0xffffffff) {
|
||||
if (bootverbose)
|
||||
@@ -665,7 +665,7 @@ nm_pci_attach(device_t dev)
|
||||
{
|
||||
struct sc_info *sc;
|
||||
struct ac97_info *codec = NULL;
|
||||
char status[SND_STATUSLEN];
|
||||
char status[SND_STATUSLEN];
|
||||
|
||||
sc = malloc(sizeof(*sc), M_DEVBUF, M_WAITOK | M_ZERO);
|
||||
sc->dev = dev;
|
||||
@@ -783,7 +783,7 @@ nm_pci_resume(device_t dev)
|
||||
nm_wr(sc, 0x214, 0, 2);
|
||||
|
||||
/* Reinit mixer */
|
||||
if (mixer_reinit(dev) == -1) {
|
||||
if (mixer_reinit(dev) == -1) {
|
||||
device_printf(dev, "unable to reinitialize the mixer\n");
|
||||
return ENXIO;
|
||||
}
|
||||
|
||||
+100
-100
@@ -87,16 +87,16 @@ struct ess_chinfo {
|
||||
};
|
||||
|
||||
struct ess_info {
|
||||
struct resource *io, *sb, *vc, *mpu, *gp; /* I/O address for the board */
|
||||
struct resource *irq;
|
||||
struct resource *io, *sb, *vc, *mpu, *gp; /* I/O address for the board */
|
||||
struct resource *irq;
|
||||
void *ih;
|
||||
bus_dma_tag_t parent_dmat;
|
||||
bus_dma_tag_t parent_dmat;
|
||||
|
||||
int simplex_dir, type, dmasz[2];
|
||||
int simplex_dir, type, dmasz[2];
|
||||
unsigned int duplex:1, newspeed:1;
|
||||
unsigned int bufsz;
|
||||
|
||||
struct ess_chinfo pch, rch;
|
||||
struct ess_chinfo pch, rch;
|
||||
struct mtx lock;
|
||||
};
|
||||
|
||||
@@ -196,106 +196,106 @@ ess_dspready(struct ess_info *sc)
|
||||
static int
|
||||
ess_dspwr(struct ess_info *sc, uint8_t val)
|
||||
{
|
||||
int i;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < 1000; i++) {
|
||||
for (i = 0; i < 1000; i++) {
|
||||
if (ess_dspready(sc)) {
|
||||
ess_wr(sc, SBDSP_CMD, val);
|
||||
return 1;
|
||||
ess_wr(sc, SBDSP_CMD, val);
|
||||
return 1;
|
||||
}
|
||||
if (i > 10) DELAY((i > 100)? 1000 : 10);
|
||||
}
|
||||
printf("ess_dspwr(0x%02x) timed out.\n", val);
|
||||
return 0;
|
||||
}
|
||||
printf("ess_dspwr(0x%02x) timed out.\n", val);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
ess_cmd(struct ess_info *sc, uint8_t val)
|
||||
{
|
||||
DEB(printf("ess_cmd: %x\n", val));
|
||||
return ess_dspwr(sc, val);
|
||||
return ess_dspwr(sc, val);
|
||||
}
|
||||
|
||||
static int
|
||||
ess_cmd1(struct ess_info *sc, uint8_t cmd, int val)
|
||||
{
|
||||
DEB(printf("ess_cmd1: %x, %x\n", cmd, val));
|
||||
if (ess_dspwr(sc, cmd)) {
|
||||
DEB(printf("ess_cmd1: %x, %x\n", cmd, val));
|
||||
if (ess_dspwr(sc, cmd)) {
|
||||
return ess_dspwr(sc, val & 0xff);
|
||||
} else return 0;
|
||||
} else return 0;
|
||||
}
|
||||
|
||||
static void
|
||||
ess_setmixer(struct ess_info *sc, unsigned int port, unsigned int value)
|
||||
{
|
||||
DEB(printf("ess_setmixer: reg=%x, val=%x\n", port, value);)
|
||||
ess_wr(sc, SB_MIX_ADDR, (uint8_t) (port & 0xff)); /* Select register */
|
||||
DELAY(10);
|
||||
ess_wr(sc, SB_MIX_DATA, (uint8_t) (value & 0xff));
|
||||
DELAY(10);
|
||||
ess_wr(sc, SB_MIX_ADDR, (uint8_t) (port & 0xff)); /* Select register */
|
||||
DELAY(10);
|
||||
ess_wr(sc, SB_MIX_DATA, (uint8_t) (value & 0xff));
|
||||
DELAY(10);
|
||||
}
|
||||
|
||||
static int
|
||||
ess_getmixer(struct ess_info *sc, unsigned int port)
|
||||
{
|
||||
int val;
|
||||
int val;
|
||||
|
||||
ess_wr(sc, SB_MIX_ADDR, (uint8_t) (port & 0xff)); /* Select register */
|
||||
DELAY(10);
|
||||
val = ess_rd(sc, SB_MIX_DATA);
|
||||
DELAY(10);
|
||||
ess_wr(sc, SB_MIX_ADDR, (uint8_t) (port & 0xff)); /* Select register */
|
||||
DELAY(10);
|
||||
val = ess_rd(sc, SB_MIX_DATA);
|
||||
DELAY(10);
|
||||
|
||||
return val;
|
||||
return val;
|
||||
}
|
||||
|
||||
static int
|
||||
ess_get_byte(struct ess_info *sc)
|
||||
{
|
||||
int i;
|
||||
int i;
|
||||
|
||||
for (i = 1000; i > 0; i--) {
|
||||
for (i = 1000; i > 0; i--) {
|
||||
if (ess_rd(sc, 0xc) & 0x40)
|
||||
return ess_rd(sc, DSP_READ);
|
||||
else
|
||||
DELAY(20);
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
static int
|
||||
ess_write(struct ess_info *sc, uint8_t reg, int val)
|
||||
{
|
||||
return ess_cmd1(sc, reg, val);
|
||||
return ess_cmd1(sc, reg, val);
|
||||
}
|
||||
|
||||
static int
|
||||
ess_read(struct ess_info *sc, uint8_t reg)
|
||||
{
|
||||
return (ess_cmd(sc, 0xc0) && ess_cmd(sc, reg))? ess_get_byte(sc) : -1;
|
||||
return (ess_cmd(sc, 0xc0) && ess_cmd(sc, reg))? ess_get_byte(sc) : -1;
|
||||
}
|
||||
|
||||
static int
|
||||
ess_reset_dsp(struct ess_info *sc)
|
||||
{
|
||||
DEB(printf("ess_reset_dsp\n"));
|
||||
ess_wr(sc, SBDSP_RST, 3);
|
||||
DELAY(100);
|
||||
ess_wr(sc, SBDSP_RST, 0);
|
||||
if (ess_get_byte(sc) != 0xAA) {
|
||||
DEB(printf("ess_reset_dsp failed\n"));
|
||||
ess_wr(sc, SBDSP_RST, 3);
|
||||
DELAY(100);
|
||||
ess_wr(sc, SBDSP_RST, 0);
|
||||
if (ess_get_byte(sc) != 0xAA) {
|
||||
DEB(printf("ess_reset_dsp failed\n"));
|
||||
/*
|
||||
rman_get_start(d->io_base)));
|
||||
*/
|
||||
return ENXIO; /* Sorry */
|
||||
}
|
||||
ess_cmd(sc, 0xc6);
|
||||
return 0;
|
||||
}
|
||||
ess_cmd(sc, 0xc6);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void
|
||||
ess_intr(void *arg)
|
||||
{
|
||||
struct ess_info *sc = (struct ess_info *)arg;
|
||||
struct ess_info *sc = (struct ess_info *)arg;
|
||||
int src, pirq = 0, rirq = 0;
|
||||
|
||||
ess_lock(sc);
|
||||
@@ -353,7 +353,7 @@ ess_intr(void *arg)
|
||||
if (src & 2)
|
||||
ess_setmixer(sc, 0x7a, ess_getmixer(sc, 0x7a) & ~0x80);
|
||||
if (src & 1)
|
||||
ess_rd(sc, DSP_DATA_AVAIL);
|
||||
ess_rd(sc, DSP_DATA_AVAIL);
|
||||
|
||||
ess_unlock(sc);
|
||||
}
|
||||
@@ -439,7 +439,7 @@ ess_setupch(struct ess_info *sc, int ch, int dir, int spd, uint32_t fmt, int len
|
||||
/* demand mode, 4 bytes/xfer */
|
||||
ess_write(sc, 0xb9, 0x02);
|
||||
/* sample rate */
|
||||
ess_write(sc, 0xa1, spdval);
|
||||
ess_write(sc, 0xa1, spdval);
|
||||
/* filter cutoff */
|
||||
ess_write(sc, 0xa2, ess_calcfilter(spd));
|
||||
/* setup dac/adc */
|
||||
@@ -622,13 +622,13 @@ esschan_getcaps(kobj_t obj, void *data)
|
||||
}
|
||||
|
||||
static kobj_method_t esschan_methods[] = {
|
||||
KOBJMETHOD(channel_init, esschan_init),
|
||||
KOBJMETHOD(channel_setformat, esschan_setformat),
|
||||
KOBJMETHOD(channel_setspeed, esschan_setspeed),
|
||||
KOBJMETHOD(channel_setblocksize, esschan_setblocksize),
|
||||
KOBJMETHOD(channel_trigger, esschan_trigger),
|
||||
KOBJMETHOD(channel_getptr, esschan_getptr),
|
||||
KOBJMETHOD(channel_getcaps, esschan_getcaps),
|
||||
KOBJMETHOD(channel_init, esschan_init),
|
||||
KOBJMETHOD(channel_setformat, esschan_setformat),
|
||||
KOBJMETHOD(channel_setspeed, esschan_setspeed),
|
||||
KOBJMETHOD(channel_setblocksize, esschan_setblocksize),
|
||||
KOBJMETHOD(channel_trigger, esschan_trigger),
|
||||
KOBJMETHOD(channel_getptr, esschan_getptr),
|
||||
KOBJMETHOD(channel_getcaps, esschan_getcaps),
|
||||
KOBJMETHOD_END
|
||||
};
|
||||
CHANNEL_DECLARE(esschan);
|
||||
@@ -638,7 +638,7 @@ CHANNEL_DECLARE(esschan);
|
||||
static int
|
||||
essmix_init(struct snd_mixer *m)
|
||||
{
|
||||
struct ess_info *sc = mix_getdevinfo(m);
|
||||
struct ess_info *sc = mix_getdevinfo(m);
|
||||
|
||||
mix_setrecdevs(m, SOUND_MASK_CD | SOUND_MASK_MIC | SOUND_MASK_LINE |
|
||||
SOUND_MASK_IMIX);
|
||||
@@ -655,8 +655,8 @@ essmix_init(struct snd_mixer *m)
|
||||
static int
|
||||
essmix_set(struct snd_mixer *m, unsigned dev, unsigned left, unsigned right)
|
||||
{
|
||||
struct ess_info *sc = mix_getdevinfo(m);
|
||||
int preg = 0, rreg = 0, l, r;
|
||||
struct ess_info *sc = mix_getdevinfo(m);
|
||||
int preg = 0, rreg = 0, l, r;
|
||||
|
||||
l = (left * 15) / 100;
|
||||
r = (right * 15) / 100;
|
||||
@@ -698,7 +698,7 @@ essmix_set(struct snd_mixer *m, unsigned dev, unsigned left, unsigned right)
|
||||
ess_setmixer(sc, 0x62, r);
|
||||
left = (l == 64)? 0 : (l * 100) / 63;
|
||||
right = (r == 64)? 0 : (r * 100) / 63;
|
||||
return left | (right << 8);
|
||||
return left | (right << 8);
|
||||
}
|
||||
|
||||
if (preg)
|
||||
@@ -709,16 +709,16 @@ essmix_set(struct snd_mixer *m, unsigned dev, unsigned left, unsigned right)
|
||||
left = (l * 100) / 15;
|
||||
right = (r * 100) / 15;
|
||||
|
||||
return left | (right << 8);
|
||||
return left | (right << 8);
|
||||
}
|
||||
|
||||
static uint32_t
|
||||
essmix_setrecsrc(struct snd_mixer *m, uint32_t src)
|
||||
{
|
||||
struct ess_info *sc = mix_getdevinfo(m);
|
||||
uint8_t recdev;
|
||||
struct ess_info *sc = mix_getdevinfo(m);
|
||||
uint8_t recdev;
|
||||
|
||||
switch (src) {
|
||||
switch (src) {
|
||||
case SOUND_MASK_CD:
|
||||
recdev = 0x02;
|
||||
break;
|
||||
@@ -744,9 +744,9 @@ essmix_setrecsrc(struct snd_mixer *m, uint32_t src)
|
||||
}
|
||||
|
||||
static kobj_method_t solomixer_methods[] = {
|
||||
KOBJMETHOD(mixer_init, essmix_init),
|
||||
KOBJMETHOD(mixer_set, essmix_set),
|
||||
KOBJMETHOD(mixer_setrecsrc, essmix_setrecsrc),
|
||||
KOBJMETHOD(mixer_init, essmix_init),
|
||||
KOBJMETHOD(mixer_set, essmix_set),
|
||||
KOBJMETHOD(mixer_setrecsrc, essmix_setrecsrc),
|
||||
KOBJMETHOD_END
|
||||
};
|
||||
MIXER_DECLARE(solomixer);
|
||||
@@ -819,45 +819,45 @@ ess_dmatrigger(struct ess_info *sc, int ch, int go)
|
||||
static void
|
||||
ess_release_resources(struct ess_info *sc, device_t dev)
|
||||
{
|
||||
if (sc->irq) {
|
||||
if (sc->irq) {
|
||||
if (sc->ih)
|
||||
bus_teardown_intr(dev, sc->irq, sc->ih);
|
||||
bus_release_resource(dev, SYS_RES_IRQ, 0, sc->irq);
|
||||
sc->irq = NULL;
|
||||
}
|
||||
if (sc->io) {
|
||||
}
|
||||
if (sc->io) {
|
||||
bus_release_resource(dev, SYS_RES_IOPORT, PCIR_BAR(0), sc->io);
|
||||
sc->io = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
if (sc->sb) {
|
||||
if (sc->sb) {
|
||||
bus_release_resource(dev, SYS_RES_IOPORT, PCIR_BAR(1), sc->sb);
|
||||
sc->sb = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
if (sc->vc) {
|
||||
if (sc->vc) {
|
||||
bus_release_resource(dev, SYS_RES_IOPORT, PCIR_BAR(2), sc->vc);
|
||||
sc->vc = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
if (sc->mpu) {
|
||||
if (sc->mpu) {
|
||||
bus_release_resource(dev, SYS_RES_IOPORT, PCIR_BAR(3), sc->mpu);
|
||||
sc->mpu = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
if (sc->gp) {
|
||||
if (sc->gp) {
|
||||
bus_release_resource(dev, SYS_RES_IOPORT, PCIR_BAR(4), sc->gp);
|
||||
sc->gp = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
if (sc->parent_dmat) {
|
||||
bus_dma_tag_destroy(sc->parent_dmat);
|
||||
sc->parent_dmat = 0;
|
||||
}
|
||||
}
|
||||
|
||||
mtx_destroy(&sc->lock);
|
||||
|
||||
free(sc, M_DEVBUF);
|
||||
free(sc, M_DEVBUF);
|
||||
}
|
||||
|
||||
static int
|
||||
@@ -866,19 +866,19 @@ ess_alloc_resources(struct ess_info *sc, device_t dev)
|
||||
int rid;
|
||||
|
||||
rid = PCIR_BAR(0);
|
||||
sc->io = bus_alloc_resource_any(dev, SYS_RES_IOPORT, &rid, RF_ACTIVE);
|
||||
sc->io = bus_alloc_resource_any(dev, SYS_RES_IOPORT, &rid, RF_ACTIVE);
|
||||
|
||||
rid = PCIR_BAR(1);
|
||||
sc->sb = bus_alloc_resource_any(dev, SYS_RES_IOPORT, &rid, RF_ACTIVE);
|
||||
sc->sb = bus_alloc_resource_any(dev, SYS_RES_IOPORT, &rid, RF_ACTIVE);
|
||||
|
||||
rid = PCIR_BAR(2);
|
||||
sc->vc = bus_alloc_resource_any(dev, SYS_RES_IOPORT, &rid, RF_ACTIVE);
|
||||
sc->vc = bus_alloc_resource_any(dev, SYS_RES_IOPORT, &rid, RF_ACTIVE);
|
||||
|
||||
rid = PCIR_BAR(3);
|
||||
sc->mpu = bus_alloc_resource_any(dev, SYS_RES_IOPORT, &rid, RF_ACTIVE);
|
||||
sc->mpu = bus_alloc_resource_any(dev, SYS_RES_IOPORT, &rid, RF_ACTIVE);
|
||||
|
||||
rid = PCIR_BAR(4);
|
||||
sc->gp = bus_alloc_resource_any(dev, SYS_RES_IOPORT, &rid, RF_ACTIVE);
|
||||
sc->gp = bus_alloc_resource_any(dev, SYS_RES_IOPORT, &rid, RF_ACTIVE);
|
||||
|
||||
rid = 0;
|
||||
sc->irq = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid,
|
||||
@@ -916,15 +916,15 @@ ess_probe(device_t dev)
|
||||
|
||||
#define ESS_PCI_LEGACYCONTROL 0x40
|
||||
#define ESS_PCI_CONFIG 0x50
|
||||
#define ESS_PCI_DDMACONTROL 0x60
|
||||
#define ESS_PCI_DDMACONTROL 0x60
|
||||
|
||||
static int
|
||||
static int
|
||||
ess_suspend(device_t dev)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
static int
|
||||
ess_resume(device_t dev)
|
||||
{
|
||||
uint16_t ddma;
|
||||
@@ -936,12 +936,12 @@ ess_resume(device_t dev)
|
||||
pci_write_config(dev, ESS_PCI_DDMACONTROL, ddma, 2);
|
||||
pci_write_config(dev, ESS_PCI_CONFIG, 0, 2);
|
||||
|
||||
if (ess_reset_dsp(sc)) {
|
||||
if (ess_reset_dsp(sc)) {
|
||||
ess_unlock(sc);
|
||||
goto no;
|
||||
}
|
||||
ess_unlock(sc);
|
||||
if (mixer_reinit(dev))
|
||||
if (mixer_reinit(dev))
|
||||
goto no;
|
||||
ess_lock(sc);
|
||||
if (sc->newspeed)
|
||||
@@ -958,14 +958,14 @@ ess_resume(device_t dev)
|
||||
static int
|
||||
ess_attach(device_t dev)
|
||||
{
|
||||
struct ess_info *sc;
|
||||
char status[SND_STATUSLEN];
|
||||
struct ess_info *sc;
|
||||
char status[SND_STATUSLEN];
|
||||
uint16_t ddma;
|
||||
|
||||
sc = malloc(sizeof(*sc), M_DEVBUF, M_WAITOK | M_ZERO);
|
||||
pci_enable_busmaster(dev);
|
||||
|
||||
if (ess_alloc_resources(sc, dev))
|
||||
if (ess_alloc_resources(sc, dev))
|
||||
goto no;
|
||||
|
||||
sc->bufsz = pcm_getbuffersize(dev, 4096, SOLO_DEFAULT_BUFSZ, 65536);
|
||||
@@ -992,13 +992,13 @@ ess_attach(device_t dev)
|
||||
goto no;
|
||||
}
|
||||
|
||||
if (!sc->duplex)
|
||||
if (!sc->duplex)
|
||||
pcm_setflags(dev, pcm_getflags(dev) | SD_F_SIMPLEX);
|
||||
|
||||
#if 0
|
||||
if (bus_dma_tag_create(/*parent*/bus_get_dma_tag(dev), /*alignment*/65536, /*boundary*/0,
|
||||
if (bus_dma_tag_create(/*parent*/bus_get_dma_tag(dev), /*alignment*/65536, /*boundary*/0,
|
||||
#endif
|
||||
if (bus_dma_tag_create(/*parent*/bus_get_dma_tag(dev), /*alignment*/2, /*boundary*/0,
|
||||
if (bus_dma_tag_create(/*parent*/bus_get_dma_tag(dev), /*alignment*/2, /*boundary*/0,
|
||||
/*lowaddr*/BUS_SPACE_MAXADDR_24BIT,
|
||||
/*highaddr*/BUS_SPACE_MAXADDR,
|
||||
/*filter*/NULL, /*filterarg*/NULL,
|
||||
@@ -1009,9 +1009,9 @@ ess_attach(device_t dev)
|
||||
&sc->parent_dmat) != 0) {
|
||||
device_printf(dev, "unable to create dma tag\n");
|
||||
goto no;
|
||||
}
|
||||
}
|
||||
|
||||
if (ess_reset_dsp(sc))
|
||||
if (ess_reset_dsp(sc))
|
||||
goto no;
|
||||
|
||||
if (sc->newspeed)
|
||||
@@ -1019,24 +1019,24 @@ ess_attach(device_t dev)
|
||||
|
||||
pcm_init(dev, sc);
|
||||
|
||||
if (mixer_init(dev, &solomixer_class, sc))
|
||||
if (mixer_init(dev, &solomixer_class, sc))
|
||||
goto no;
|
||||
|
||||
snprintf(status, SND_STATUSLEN, "port 0x%jx,0x%jx,0x%jx irq %jd on %s",
|
||||
rman_get_start(sc->io), rman_get_start(sc->sb), rman_get_start(sc->vc),
|
||||
rman_get_start(sc->io), rman_get_start(sc->sb), rman_get_start(sc->vc),
|
||||
rman_get_start(sc->irq),
|
||||
device_get_nameunit(device_get_parent(dev)));
|
||||
|
||||
pcm_addchan(dev, PCMDIR_REC, &esschan_class, sc);
|
||||
pcm_addchan(dev, PCMDIR_REC, &esschan_class, sc);
|
||||
pcm_addchan(dev, PCMDIR_PLAY, &esschan_class, sc);
|
||||
if (pcm_register(dev, status))
|
||||
goto no;
|
||||
|
||||
return 0;
|
||||
return 0;
|
||||
|
||||
no:
|
||||
ess_release_resources(sc, dev);
|
||||
return ENXIO;
|
||||
ess_release_resources(sc, dev);
|
||||
return ENXIO;
|
||||
}
|
||||
|
||||
static int
|
||||
@@ -1050,7 +1050,7 @@ ess_detach(device_t dev)
|
||||
return r;
|
||||
|
||||
sc = pcm_getdevinfo(dev);
|
||||
ess_release_resources(sc, dev);
|
||||
ess_release_resources(sc, dev);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -95,7 +95,7 @@
|
||||
|
||||
/* AK4358 control registers */
|
||||
#define AK4358_LO1ATT 0x04
|
||||
#define AK4358_RO1ATT 0x05
|
||||
#define AK4358_RO1ATT 0x05
|
||||
#define AK4358_OATT_ENABLE 0x80
|
||||
|
||||
/* AK4381 control registers */
|
||||
|
||||
+29
-29
@@ -39,12 +39,12 @@
|
||||
|
||||
/* -------------------------------------------------------------------- */
|
||||
|
||||
#define TDX_PCI_ID 0x20001023
|
||||
#define TNX_PCI_ID 0x20011023
|
||||
#define TDX_PCI_ID 0x20001023
|
||||
#define TNX_PCI_ID 0x20011023
|
||||
#define ALI_PCI_ID 0x545110b9
|
||||
#define SPA_PCI_ID 0x70181039
|
||||
|
||||
#define TR_DEFAULT_BUFSZ 0x1000
|
||||
#define TR_DEFAULT_BUFSZ 0x1000
|
||||
/* For ALi M5451 the DMA transfer size appears to be fixed to 64k. */
|
||||
#define ALI_BUFSZ 0x10000
|
||||
#define TR_BUFALGN 0x8
|
||||
@@ -227,7 +227,7 @@ tr_rdcd(kobj_t obj, void *devinfo, int regno)
|
||||
tr_wr(tr, treg, regno | trw, 4);
|
||||
j=trw;
|
||||
for (i=TR_TIMEOUT_CDC; (i > 0) && (j & trw); i--)
|
||||
j=tr_rd(tr, treg, 4);
|
||||
j=tr_rd(tr, treg, 4);
|
||||
}
|
||||
mtx_unlock(&tr->lock);
|
||||
if (i == 0) printf("codec timeout during read of register %x\n", regno);
|
||||
@@ -284,7 +284,7 @@ tr_wrcd(kobj_t obj, void *devinfo, int regno, uint32_t data)
|
||||
for (i=TR_TIMEOUT_CDC; (i>0) && (j & trw); i--)
|
||||
j=tr_rd(tr, treg, 4);
|
||||
if (tr->type == ALI_PCI_ID && tr->rev > 0x01)
|
||||
trw |= 0x0100;
|
||||
trw |= 0x0100;
|
||||
tr_wr(tr, treg, (data << TR_CDC_DATA) | regno | trw, 4);
|
||||
}
|
||||
#if 0
|
||||
@@ -296,8 +296,8 @@ tr_wrcd(kobj_t obj, void *devinfo, int regno, uint32_t data)
|
||||
}
|
||||
|
||||
static kobj_method_t tr_ac97_methods[] = {
|
||||
KOBJMETHOD(ac97_read, tr_rdcd),
|
||||
KOBJMETHOD(ac97_write, tr_wrcd),
|
||||
KOBJMETHOD(ac97_read, tr_rdcd),
|
||||
KOBJMETHOD(ac97_write, tr_wrcd),
|
||||
KOBJMETHOD_END
|
||||
};
|
||||
AC97_DECLARE(tr_ac97);
|
||||
@@ -333,7 +333,7 @@ static void
|
||||
tr_enaint(struct tr_chinfo *ch, int enable)
|
||||
{
|
||||
struct tr_info *tr = ch->parent;
|
||||
uint32_t i, reg;
|
||||
uint32_t i, reg;
|
||||
int bank, chan;
|
||||
|
||||
mtx_lock(&tr->lock);
|
||||
@@ -392,13 +392,13 @@ tr_wrch(struct tr_chinfo *ch)
|
||||
struct tr_info *tr = ch->parent;
|
||||
uint32_t cr[TR_CHN_REGS], i;
|
||||
|
||||
ch->gvsel &= 0x00000001;
|
||||
ch->gvsel &= 0x00000001;
|
||||
ch->fmc &= 0x00000003;
|
||||
ch->fms &= 0x0000000f;
|
||||
ch->ctrl &= 0x0000000f;
|
||||
ch->pan &= 0x0000007f;
|
||||
ch->pan &= 0x0000007f;
|
||||
ch->rvol &= 0x0000007f;
|
||||
ch->cvol &= 0x0000007f;
|
||||
ch->cvol &= 0x0000007f;
|
||||
ch->vol &= 0x000000ff;
|
||||
ch->ec &= 0x00000fff;
|
||||
ch->alpha &= 0x00000fff;
|
||||
@@ -563,7 +563,7 @@ trpchan_trigger(kobj_t obj, void *data, int go)
|
||||
ch->pan = 0;
|
||||
ch->vol = 0;
|
||||
ch->bufhalf = 0;
|
||||
tr_wrch(ch);
|
||||
tr_wrch(ch);
|
||||
tr_enaint(ch, 1);
|
||||
tr_startch(ch);
|
||||
ch->active = 1;
|
||||
@@ -591,13 +591,13 @@ trpchan_getcaps(kobj_t obj, void *data)
|
||||
}
|
||||
|
||||
static kobj_method_t trpchan_methods[] = {
|
||||
KOBJMETHOD(channel_init, trpchan_init),
|
||||
KOBJMETHOD(channel_setformat, trpchan_setformat),
|
||||
KOBJMETHOD(channel_setspeed, trpchan_setspeed),
|
||||
KOBJMETHOD(channel_setblocksize, trpchan_setblocksize),
|
||||
KOBJMETHOD(channel_trigger, trpchan_trigger),
|
||||
KOBJMETHOD(channel_getptr, trpchan_getptr),
|
||||
KOBJMETHOD(channel_getcaps, trpchan_getcaps),
|
||||
KOBJMETHOD(channel_init, trpchan_init),
|
||||
KOBJMETHOD(channel_setformat, trpchan_setformat),
|
||||
KOBJMETHOD(channel_setspeed, trpchan_setspeed),
|
||||
KOBJMETHOD(channel_setblocksize, trpchan_setblocksize),
|
||||
KOBJMETHOD(channel_trigger, trpchan_trigger),
|
||||
KOBJMETHOD(channel_getptr, trpchan_getptr),
|
||||
KOBJMETHOD(channel_getcaps, trpchan_getcaps),
|
||||
KOBJMETHOD_END
|
||||
};
|
||||
CHANNEL_DECLARE(trpchan);
|
||||
@@ -699,7 +699,7 @@ trrchan_trigger(kobj_t obj, void *data, int go)
|
||||
static uint32_t
|
||||
trrchan_getptr(kobj_t obj, void *data)
|
||||
{
|
||||
struct tr_rchinfo *ch = data;
|
||||
struct tr_rchinfo *ch = data;
|
||||
struct tr_info *tr = ch->parent;
|
||||
|
||||
/* return current byte offset of channel */
|
||||
@@ -713,13 +713,13 @@ trrchan_getcaps(kobj_t obj, void *data)
|
||||
}
|
||||
|
||||
static kobj_method_t trrchan_methods[] = {
|
||||
KOBJMETHOD(channel_init, trrchan_init),
|
||||
KOBJMETHOD(channel_setformat, trrchan_setformat),
|
||||
KOBJMETHOD(channel_setspeed, trrchan_setspeed),
|
||||
KOBJMETHOD(channel_setblocksize, trrchan_setblocksize),
|
||||
KOBJMETHOD(channel_trigger, trrchan_trigger),
|
||||
KOBJMETHOD(channel_getptr, trrchan_getptr),
|
||||
KOBJMETHOD(channel_getcaps, trrchan_getcaps),
|
||||
KOBJMETHOD(channel_init, trrchan_init),
|
||||
KOBJMETHOD(channel_setformat, trrchan_setformat),
|
||||
KOBJMETHOD(channel_setspeed, trrchan_setspeed),
|
||||
KOBJMETHOD(channel_setblocksize, trrchan_setblocksize),
|
||||
KOBJMETHOD(channel_trigger, trrchan_trigger),
|
||||
KOBJMETHOD(channel_getptr, trrchan_getptr),
|
||||
KOBJMETHOD(channel_getcaps, trrchan_getcaps),
|
||||
KOBJMETHOD_END
|
||||
};
|
||||
CHANNEL_DECLARE(trrchan);
|
||||
@@ -825,7 +825,7 @@ tr_pci_attach(device_t dev)
|
||||
struct ac97_info *codec = NULL;
|
||||
bus_addr_t lowaddr;
|
||||
int i, dacn;
|
||||
char status[SND_STATUSLEN];
|
||||
char status[SND_STATUSLEN];
|
||||
|
||||
tr = malloc(sizeof(*tr), M_DEVBUF, M_WAITOK | M_ZERO);
|
||||
tr->type = pci_get_devid(dev);
|
||||
@@ -835,7 +835,7 @@ tr_pci_attach(device_t dev)
|
||||
|
||||
if (resource_int_value(device_get_name(dev), device_get_unit(dev),
|
||||
"dac", &i) == 0) {
|
||||
if (i < 1)
|
||||
if (i < 1)
|
||||
dacn = 1;
|
||||
else if (i > TR_MAXPLAYCH)
|
||||
dacn = TR_MAXPLAYCH;
|
||||
|
||||
@@ -30,7 +30,7 @@
|
||||
#define _T4DWAVE_REG_H
|
||||
|
||||
#define TR_REG_CIR 0xa0
|
||||
#define TR_CIR_MASK 0x0000003f
|
||||
#define TR_CIR_MASK 0x0000003f
|
||||
#define TR_CIR_ADDRENA 0x00001000
|
||||
#define TR_CIR_MIDENA 0x00002000
|
||||
#define TR_REG_MISCINT 0xb0
|
||||
@@ -43,7 +43,7 @@
|
||||
#define TR_REG_DMAR15 0x0f
|
||||
#define TR_REG_SBR4 0x14
|
||||
#define TR_REG_SBR5 0x15
|
||||
#define TR_SB_INTSTATUS 0x82
|
||||
#define TR_SB_INTSTATUS 0x82
|
||||
#define TR_REG_SBR9 0x1e
|
||||
#define TR_REG_SBR10 0x1f
|
||||
#define TR_REG_SBBL 0xc0
|
||||
@@ -53,7 +53,7 @@
|
||||
#define TR_CDC_DATA 16
|
||||
#define TDX_REG_CODECWR 0x40
|
||||
#define TDX_REG_CODECRD 0x44
|
||||
#define TDX_CDC_RWSTAT 0x00008000
|
||||
#define TDX_CDC_RWSTAT 0x00008000
|
||||
#define TDX_REG_CODECST 0x48
|
||||
#define TDX_CDC_SBCTRL 0x40
|
||||
#define TDX_CDC_ACTIVE 0x20
|
||||
@@ -73,7 +73,7 @@
|
||||
#define TNX_REG_CODECWR 0x44
|
||||
#define TNX_REG_CODEC1RD 0x48
|
||||
#define TNX_REG_CODEC2RD 0x4c
|
||||
#define TNX_CDC_RWSTAT 0x00000c00
|
||||
#define TNX_CDC_RWSTAT 0x00000c00
|
||||
#define TNX_CDC_SEC 0x00000100
|
||||
#define TNX_REG_CODECST 0x40
|
||||
#define TNX_CDC_READY2 0x40
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* Copyright (c) 2002 Orion Hodson <orion@freebsd.org>
|
||||
* Portions of this code derived from via82c686.c:
|
||||
* Copyright (c) 2000 David Jones <dej@ox.org>
|
||||
* Copyright (c) 2000 David Jones <dej@ox.org>
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
@@ -907,7 +907,7 @@ via8233chan_trigger(kobj_t obj, void* data, int go)
|
||||
pollticks = 1;
|
||||
if (via_chan_active(via) == 0 ||
|
||||
pollticks < via->poll_ticks) {
|
||||
if (bootverbose) {
|
||||
if (bootverbose) {
|
||||
if (via_chan_active(via) == 0)
|
||||
printf("%s: pollticks=%d\n",
|
||||
__func__, pollticks);
|
||||
|
||||
@@ -51,10 +51,10 @@
|
||||
|
||||
#define VIA8233_RP_DXS_LVOL 0x02
|
||||
#define VIA8233_RP_DXS_RVOL 0x03
|
||||
#define VIA8233_DXS_MUTE 0x3f
|
||||
#define VIA8233_DXS_MUTE 0x3f
|
||||
#define VIA8233_RP_DXS_RATEFMT 0x08
|
||||
#define VIA8233_DXS_STOP_INDEX 0xff000000
|
||||
#define VIA8233_DXS_RATEFMT_48K 0x000fffff
|
||||
#define VIA8233_DXS_RATEFMT_48K 0x000fffff
|
||||
#define VIA8233_DXS_RATEFMT_STEREO 0x00100000
|
||||
#define VIA8233_DXS_RATEFMT_16BIT 0x00200000
|
||||
|
||||
@@ -72,9 +72,9 @@
|
||||
# define VIA_PCI_ACLINK_SERIAL 0x10
|
||||
# define VIA_PCI_ACLINK_VRATE 0x08
|
||||
# define VIA_PCI_ACLINK_SGD 0x04
|
||||
# define VIA_PCI_ACLINK_DESIRED (VIA_PCI_ACLINK_EN | \
|
||||
# define VIA_PCI_ACLINK_DESIRED (VIA_PCI_ACLINK_EN | \
|
||||
VIA_PCI_ACLINK_NRST | \
|
||||
VIA_PCI_ACLINK_VRATE | \
|
||||
VIA_PCI_ACLINK_VRATE | \
|
||||
VIA_PCI_ACLINK_SGD)
|
||||
|
||||
#define VIA_MC_SGD_STATUS 0x40
|
||||
|
||||
@@ -205,8 +205,8 @@ via_read_codec(kobj_t obj, void *addr, int reg)
|
||||
}
|
||||
|
||||
static kobj_method_t via_ac97_methods[] = {
|
||||
KOBJMETHOD(ac97_read, via_read_codec),
|
||||
KOBJMETHOD(ac97_write, via_write_codec),
|
||||
KOBJMETHOD(ac97_read, via_read_codec),
|
||||
KOBJMETHOD(ac97_write, via_write_codec),
|
||||
KOBJMETHOD_END
|
||||
};
|
||||
AC97_DECLARE(via_ac97);
|
||||
@@ -371,7 +371,7 @@ viachan_getptr(kobj_t obj, void *data)
|
||||
base1 = via_rd(via, ch->base, 4);
|
||||
len = via_rd(via, ch->count, 4);
|
||||
base = via_rd(via, ch->base, 4);
|
||||
if (base != base1) /* Avoid race hazard */
|
||||
if (base != base1) /* Avoid race hazard */
|
||||
len = via_rd(via, ch->count, 4);
|
||||
mtx_unlock(&via->lock);
|
||||
|
||||
@@ -406,13 +406,13 @@ viachan_getcaps(kobj_t obj, void *data)
|
||||
}
|
||||
|
||||
static kobj_method_t viachan_methods[] = {
|
||||
KOBJMETHOD(channel_init, viachan_init),
|
||||
KOBJMETHOD(channel_setformat, viachan_setformat),
|
||||
KOBJMETHOD(channel_setspeed, viachan_setspeed),
|
||||
KOBJMETHOD(channel_setblocksize, viachan_setblocksize),
|
||||
KOBJMETHOD(channel_trigger, viachan_trigger),
|
||||
KOBJMETHOD(channel_getptr, viachan_getptr),
|
||||
KOBJMETHOD(channel_getcaps, viachan_getcaps),
|
||||
KOBJMETHOD(channel_init, viachan_init),
|
||||
KOBJMETHOD(channel_setformat, viachan_setformat),
|
||||
KOBJMETHOD(channel_setspeed, viachan_setspeed),
|
||||
KOBJMETHOD(channel_setblocksize, viachan_setblocksize),
|
||||
KOBJMETHOD(channel_trigger, viachan_trigger),
|
||||
KOBJMETHOD(channel_getptr, viachan_getptr),
|
||||
KOBJMETHOD(channel_getcaps, viachan_getcaps),
|
||||
KOBJMETHOD_END
|
||||
};
|
||||
CHANNEL_DECLARE(viachan);
|
||||
@@ -498,12 +498,12 @@ via_attach(device_t dev)
|
||||
}
|
||||
|
||||
/* Power everything up */
|
||||
pci_write_config(dev, VIA_ACLINKCTRL, VIA_ACLINK_DESIRED, 1);
|
||||
pci_write_config(dev, VIA_ACLINKCTRL, VIA_ACLINK_DESIRED, 1);
|
||||
|
||||
/* Wait for codec to become ready (largest reported delay here 310ms) */
|
||||
for (cnt = 0; cnt < 2000; cnt++) {
|
||||
data = pci_read_config(dev, VIA_AC97STATUS, 1);
|
||||
if (data & VIA_AC97STATUS_RDY)
|
||||
if (data & VIA_AC97STATUS_RDY)
|
||||
break;
|
||||
DELAY(5000);
|
||||
}
|
||||
@@ -540,7 +540,7 @@ via_attach(device_t dev)
|
||||
goto bad;
|
||||
|
||||
via->codec_caps = ac97_getextcaps(via->codec);
|
||||
ac97_setextmode(via->codec,
|
||||
ac97_setextmode(via->codec,
|
||||
via->codec_caps & (AC97_EXTCAP_VRA | AC97_EXTCAP_VRM));
|
||||
|
||||
/* DMA tag for buffers */
|
||||
|
||||
@@ -77,7 +77,7 @@ struct sc_info {
|
||||
bus_dma_tag_t parent_dmat;
|
||||
|
||||
/* Enhanced register resources */
|
||||
struct resource *enh_reg;
|
||||
struct resource *enh_reg;
|
||||
bus_space_tag_t enh_st;
|
||||
bus_space_handle_t enh_sh;
|
||||
int enh_type;
|
||||
@@ -91,7 +91,7 @@ struct sc_info {
|
||||
int dmaa_rid, dmac_rid;
|
||||
|
||||
/* Interrupt resources */
|
||||
struct resource *irq;
|
||||
struct resource *irq;
|
||||
int irqid;
|
||||
void *ih;
|
||||
|
||||
@@ -313,7 +313,7 @@ static int
|
||||
svrchan_trigger(kobj_t obj, void *data, int go)
|
||||
{
|
||||
struct sc_chinfo *ch = data;
|
||||
struct sc_info *sc = ch->parent;
|
||||
struct sc_info *sc = ch->parent;
|
||||
uint32_t count, enable;
|
||||
uint8_t v;
|
||||
|
||||
@@ -357,7 +357,7 @@ static uint32_t
|
||||
svrchan_getptr(kobj_t obj, void *data)
|
||||
{
|
||||
struct sc_chinfo *ch = data;
|
||||
struct sc_info *sc = ch->parent;
|
||||
struct sc_info *sc = ch->parent;
|
||||
uint32_t sz, remain;
|
||||
|
||||
sz = ch->buffer->bufsize;
|
||||
@@ -434,7 +434,7 @@ static uint32_t
|
||||
svpchan_getptr(kobj_t obj, void *data)
|
||||
{
|
||||
struct sc_chinfo *ch = data;
|
||||
struct sc_info *sc = ch->parent;
|
||||
struct sc_info *sc = ch->parent;
|
||||
uint32_t sz, remain;
|
||||
|
||||
sz = ch->buffer->bufsize;
|
||||
@@ -520,7 +520,7 @@ sv_mix_mute_all(struct sc_info *sc)
|
||||
static int
|
||||
sv_mix_init(struct snd_mixer *m)
|
||||
{
|
||||
uint32_t i, v;
|
||||
uint32_t i, v;
|
||||
|
||||
for(i = v = 0; i < SOUND_MIXER_NRDEVICES; i++) {
|
||||
if (mt[i].max) v |= (1 << i);
|
||||
|
||||
+11
-11
@@ -54,7 +54,7 @@
|
||||
#define SV_DMA_COUNT 0x04
|
||||
|
||||
#define SV_DMA_MODE 0x0B
|
||||
#define SV_DMA_MODE_AUTO 0x10
|
||||
#define SV_DMA_MODE_AUTO 0x10
|
||||
#define SV_DMA_MODE_RD 0x04
|
||||
#define SV_DMA_MODE_WR 0x08
|
||||
|
||||
@@ -91,17 +91,17 @@
|
||||
#define SV_CM_DATA 0x05
|
||||
|
||||
/* ------------------------------------------------------------------------- */
|
||||
/* Indexed Codec/Mixer Registers (left channels were applicable) */
|
||||
/* Indexed Codec/Mixer Registers (left channels were applicable) */
|
||||
|
||||
#define SV_REG_ADC_INPUT 0x00
|
||||
#define SV_INPUT_GAIN_MASK 0x0f
|
||||
#define SV_INPUT_GAIN_MASK 0x0f
|
||||
#define SV_INPUT_MICGAIN 0x10
|
||||
#define SV_INPUT_CD 0x20
|
||||
#define SV_INPUT_DAC 0x40
|
||||
#define SV_INPUT_AUX2 0x60
|
||||
#define SV_INPUT_LINE 0x80
|
||||
#define SV_INPUT_AUX1 0xa0
|
||||
#define SV_INPUT_MIC 0xc0
|
||||
#define SV_INPUT_DAC 0x40
|
||||
#define SV_INPUT_AUX2 0x60
|
||||
#define SV_INPUT_LINE 0x80
|
||||
#define SV_INPUT_AUX1 0xa0
|
||||
#define SV_INPUT_MIC 0xc0
|
||||
#define SV_INPUT_MIXOUT 0xe0
|
||||
|
||||
#define SV_REG_AUX1 0x02
|
||||
@@ -152,7 +152,7 @@
|
||||
#define SV_REG_SYN_SAMPLING_HI 0x21
|
||||
|
||||
#define SV_REG_CLOCK_SOURCE 0x22
|
||||
#define SV_CLOCK_ALTERNATE 0x10
|
||||
#define SV_CLOCK_ALTERNATE 0x10
|
||||
#define SV_REG_ALT_RATE 0x23
|
||||
|
||||
#define SV_REG_ADC_PLLM 0x24
|
||||
@@ -192,12 +192,12 @@
|
||||
#define SV_REG_DIGITAL_PWR 0x31
|
||||
#define SV_DIGITAL_OFF_SYN 0x01
|
||||
#define SV_DIGITAL_OFF_MU 0x02
|
||||
#define SV_DIGITAL_OFF_GP 0x04
|
||||
#define SV_DIGITAL_OFF_GP 0x04
|
||||
#define SV_DIGITAL_OFF_BI 0x08
|
||||
#define SV_DIGITAL_OFF 0x0f
|
||||
|
||||
/* ------------------------------------------------------------------------- */
|
||||
/* ADC PLL constants */
|
||||
/* ADC PLL constants */
|
||||
|
||||
#define SV_F_SCALE 512
|
||||
#define SV_F_REF 24576000
|
||||
+33
-33
@@ -77,28 +77,28 @@ struct ac97_codecid {
|
||||
uint32_t id;
|
||||
uint8_t stepmask;
|
||||
uint8_t noext:1;
|
||||
char *name;
|
||||
char *name;
|
||||
ac97_patch patch;
|
||||
};
|
||||
|
||||
static const struct ac97mixtable_entry ac97mixtable_default[AC97_MIXER_SIZE] = {
|
||||
/* [offset] reg bits of st mu re mk en */
|
||||
[SOUND_MIXER_VOLUME] = { AC97_MIX_MASTER, 5, 0, 1, 1, 6, 0, 1 },
|
||||
[SOUND_MIXER_OGAIN] = { AC97_MIX_AUXOUT, 5, 0, 1, 1, 0, 0, 0 },
|
||||
[SOUND_MIXER_PHONEOUT] = { AC97_MIX_MONO, 5, 0, 0, 1, 7, 0, 0 },
|
||||
[SOUND_MIXER_BASS] = { AC97_MIX_TONE, 4, 8, 0, 0, 0, 1, 0 },
|
||||
[SOUND_MIXER_TREBLE] = { AC97_MIX_TONE, 4, 0, 0, 0, 0, 1, 0 },
|
||||
[SOUND_MIXER_PCM] = { AC97_MIX_PCM, 5, 0, 1, 1, 0, 0, 1 },
|
||||
[SOUND_MIXER_SPEAKER] = { AC97_MIX_BEEP, 4, 1, 0, 1, 0, 0, 0 },
|
||||
[SOUND_MIXER_LINE] = { AC97_MIX_LINE, 5, 0, 1, 1, 5, 0, 1 },
|
||||
[SOUND_MIXER_PHONEIN] = { AC97_MIX_PHONE, 5, 0, 0, 1, 8, 0, 0 },
|
||||
[SOUND_MIXER_MIC] = { AC97_MIX_MIC, 5, 0, 0, 1, 1, 1, 1 },
|
||||
[SOUND_MIXER_VOLUME] = { AC97_MIX_MASTER, 5, 0, 1, 1, 6, 0, 1 },
|
||||
[SOUND_MIXER_OGAIN] = { AC97_MIX_AUXOUT, 5, 0, 1, 1, 0, 0, 0 },
|
||||
[SOUND_MIXER_PHONEOUT] = { AC97_MIX_MONO, 5, 0, 0, 1, 7, 0, 0 },
|
||||
[SOUND_MIXER_BASS] = { AC97_MIX_TONE, 4, 8, 0, 0, 0, 1, 0 },
|
||||
[SOUND_MIXER_TREBLE] = { AC97_MIX_TONE, 4, 0, 0, 0, 0, 1, 0 },
|
||||
[SOUND_MIXER_PCM] = { AC97_MIX_PCM, 5, 0, 1, 1, 0, 0, 1 },
|
||||
[SOUND_MIXER_SPEAKER] = { AC97_MIX_BEEP, 4, 1, 0, 1, 0, 0, 0 },
|
||||
[SOUND_MIXER_LINE] = { AC97_MIX_LINE, 5, 0, 1, 1, 5, 0, 1 },
|
||||
[SOUND_MIXER_PHONEIN] = { AC97_MIX_PHONE, 5, 0, 0, 1, 8, 0, 0 },
|
||||
[SOUND_MIXER_MIC] = { AC97_MIX_MIC, 5, 0, 0, 1, 1, 1, 1 },
|
||||
/* use igain for the mic 20dB boost */
|
||||
[SOUND_MIXER_IGAIN] = { -AC97_MIX_MIC, 1, 6, 0, 0, 0, 1, 1 },
|
||||
[SOUND_MIXER_CD] = { AC97_MIX_CD, 5, 0, 1, 1, 2, 0, 1 },
|
||||
[SOUND_MIXER_LINE1] = { AC97_MIX_AUX, 5, 0, 1, 1, 4, 0, 0 },
|
||||
[SOUND_MIXER_VIDEO] = { AC97_MIX_VIDEO, 5, 0, 1, 1, 3, 0, 0 },
|
||||
[SOUND_MIXER_RECLEV] = { -AC97_MIX_RGAIN, 4, 0, 1, 1, 0, 0, 1 }
|
||||
[SOUND_MIXER_IGAIN] = { -AC97_MIX_MIC, 1, 6, 0, 0, 0, 1, 1 },
|
||||
[SOUND_MIXER_CD] = { AC97_MIX_CD, 5, 0, 1, 1, 2, 0, 1 },
|
||||
[SOUND_MIXER_LINE1] = { AC97_MIX_AUX, 5, 0, 1, 1, 4, 0, 0 },
|
||||
[SOUND_MIXER_VIDEO] = { AC97_MIX_VIDEO, 5, 0, 1, 1, 3, 0, 0 },
|
||||
[SOUND_MIXER_RECLEV] = { -AC97_MIX_RGAIN, 4, 0, 1, 1, 0, 0, 1 }
|
||||
};
|
||||
|
||||
static const struct ac97_vendorid ac97vendorid[] = {
|
||||
@@ -140,32 +140,32 @@ static struct ac97_codecid ac97codecid[] = {
|
||||
{ 0x41445340, 0x00, 0, "AD1881", 0 },
|
||||
{ 0x41445348, 0x00, 0, "AD1881A", 0 },
|
||||
{ 0x41445360, 0x00, 0, "AD1885", 0 },
|
||||
{ 0x41445361, 0x00, 0, "AD1886", ad1886_patch },
|
||||
{ 0x41445362, 0x00, 0, "AD1887", 0 },
|
||||
{ 0x41445363, 0x00, 0, "AD1886A", 0 },
|
||||
{ 0x41445368, 0x00, 0, "AD1888", ad198x_patch },
|
||||
{ 0x41445361, 0x00, 0, "AD1886", ad1886_patch },
|
||||
{ 0x41445362, 0x00, 0, "AD1887", 0 },
|
||||
{ 0x41445363, 0x00, 0, "AD1886A", 0 },
|
||||
{ 0x41445368, 0x00, 0, "AD1888", ad198x_patch },
|
||||
{ 0x41445370, 0x00, 0, "AD1980", ad198x_patch },
|
||||
{ 0x41445372, 0x00, 0, "AD1981A", 0 },
|
||||
{ 0x41445374, 0x00, 0, "AD1981B", ad1981b_patch },
|
||||
{ 0x41445375, 0x00, 0, "AD1985", ad198x_patch },
|
||||
{ 0x41445378, 0x00, 0, "AD1986", ad198x_patch },
|
||||
{ 0x414b4d00, 0x00, 1, "AK4540", 0 },
|
||||
{ 0x414b4d01, 0x00, 1, "AK4542", 0 },
|
||||
{ 0x414b4d02, 0x00, 1, "AK4543", 0 },
|
||||
{ 0x414b4d00, 0x00, 1, "AK4540", 0 },
|
||||
{ 0x414b4d01, 0x00, 1, "AK4542", 0 },
|
||||
{ 0x414b4d02, 0x00, 1, "AK4543", 0 },
|
||||
{ 0x414b4d06, 0x00, 0, "AK4544A", 0 },
|
||||
{ 0x454b4d07, 0x00, 0, "AK4545", 0 },
|
||||
{ 0x414c4320, 0x0f, 0, "ALC100", 0 },
|
||||
{ 0x414c4730, 0x0f, 0, "ALC101", 0 },
|
||||
{ 0x414c4710, 0x0f, 0, "ALC200", 0 },
|
||||
{ 0x414c4740, 0x0f, 0, "ALC202", 0 },
|
||||
{ 0x414c4720, 0x0f, 0, "ALC650", 0 },
|
||||
{ 0x414c4710, 0x0f, 0, "ALC200", 0 },
|
||||
{ 0x414c4740, 0x0f, 0, "ALC202", 0 },
|
||||
{ 0x414c4720, 0x0f, 0, "ALC650", 0 },
|
||||
{ 0x414c4752, 0x0f, 0, "ALC250", 0 },
|
||||
{ 0x414c4760, 0x0f, 0, "ALC655", alc655_patch },
|
||||
{ 0x414c4770, 0x0f, 0, "ALC203", 0 },
|
||||
{ 0x414c4780, 0x0f, 0, "ALC658", 0 },
|
||||
{ 0x414c4790, 0x0f, 0, "ALC850", 0 },
|
||||
{ 0x43525900, 0x07, 0, "CS4297", 0 },
|
||||
{ 0x43525910, 0x07, 0, "CS4297A", 0 },
|
||||
{ 0x43525900, 0x07, 0, "CS4297", 0 },
|
||||
{ 0x43525910, 0x07, 0, "CS4297A", 0 },
|
||||
{ 0x43525920, 0x07, 0, "CS4294/98", 0 },
|
||||
{ 0x4352592d, 0x07, 0, "CS4294", 0 },
|
||||
{ 0x43525930, 0x07, 0, "CS4299", 0 },
|
||||
@@ -1132,11 +1132,11 @@ ac97mix_setrecsrc(struct snd_mixer *m, uint32_t src)
|
||||
}
|
||||
|
||||
static kobj_method_t ac97mixer_methods[] = {
|
||||
KOBJMETHOD(mixer_init, ac97mix_init),
|
||||
KOBJMETHOD(mixer_uninit, ac97mix_uninit),
|
||||
KOBJMETHOD(mixer_reinit, ac97mix_reinit),
|
||||
KOBJMETHOD(mixer_set, ac97mix_set),
|
||||
KOBJMETHOD(mixer_setrecsrc, ac97mix_setrecsrc),
|
||||
KOBJMETHOD(mixer_init, ac97mix_init),
|
||||
KOBJMETHOD(mixer_uninit, ac97mix_uninit),
|
||||
KOBJMETHOD(mixer_reinit, ac97mix_reinit),
|
||||
KOBJMETHOD(mixer_set, ac97mix_set),
|
||||
KOBJMETHOD(mixer_setrecsrc, ac97mix_setrecsrc),
|
||||
KOBJMETHOD_END
|
||||
};
|
||||
MIXER_DECLARE(ac97mixer);
|
||||
|
||||
@@ -40,7 +40,7 @@
|
||||
#define AC97_CAP_ADC_20 (1 << 9)
|
||||
#define AC97_MIX_MASTER 0x02
|
||||
#define AC97_MIX_AUXOUT 0x04
|
||||
#define AC97_MIX_MONO 0x06
|
||||
#define AC97_MIX_MONO 0x06
|
||||
#define AC97_MIX_TONE 0x08
|
||||
#define AC97_MIX_BEEP 0x0a
|
||||
#define AC97_MIX_PHONE 0x0c
|
||||
@@ -63,9 +63,9 @@
|
||||
#define AC97_POWER_STATUS (AC97_POWER_ADC | AC97_POWER_DAC | \
|
||||
AC97_POWER_REF | AC97_POWER_ANL )
|
||||
#define AC97_REGEXT_ID 0x28
|
||||
#define AC97_EXTCAP_VRA (1 << 0)
|
||||
#define AC97_EXTCAP_DRA (1 << 1)
|
||||
#define AC97_EXTCAP_VRM (1 << 3)
|
||||
#define AC97_EXTCAP_VRA (1 << 0)
|
||||
#define AC97_EXTCAP_DRA (1 << 1)
|
||||
#define AC97_EXTCAP_VRM (1 << 3)
|
||||
#define AC97_EXTCAPS (AC97_EXTCAP_VRA | AC97_EXTCAP_DRA | AC97_EXTCAP_VRM)
|
||||
#define AC97_EXTCAP_SDAC (1 << 7)
|
||||
|
||||
|
||||
@@ -509,7 +509,7 @@ sndbuf_acquire(struct snd_dbuf *b, uint8_t *from, unsigned int count)
|
||||
* @brief Dispose samples from channel buffer, increasing size of ready area
|
||||
*
|
||||
* This function discards samples from the supplied buffer by advancing the
|
||||
* ready area start pointer and decrementing the ready area length. If
|
||||
* ready area start pointer and decrementing the ready area length. If
|
||||
* @c to is not NULL, then the discard samples will be copied to the location
|
||||
* it points to.
|
||||
*
|
||||
|
||||
+32
-32
@@ -393,8 +393,8 @@ chn_dmaupdate(struct pcm_channel *c)
|
||||
static void
|
||||
chn_wrfeed(struct pcm_channel *c)
|
||||
{
|
||||
struct snd_dbuf *b = c->bufhard;
|
||||
struct snd_dbuf *bs = c->bufsoft;
|
||||
struct snd_dbuf *b = c->bufhard;
|
||||
struct snd_dbuf *bs = c->bufsoft;
|
||||
unsigned int amt, want, wasfree;
|
||||
|
||||
CHN_LOCKASSERT(c);
|
||||
@@ -471,17 +471,17 @@ chn_write(struct pcm_channel *c, struct uio *buf)
|
||||
} else if (c->flags & (CHN_F_NBIO | CHN_F_NOTRIGGER)) {
|
||||
/**
|
||||
* @todo Evaluate whether EAGAIN is truly desirable.
|
||||
* 4Front drivers behave like this, but I'm
|
||||
* not sure if it at all violates the "write
|
||||
* should be allowed to block" model.
|
||||
* 4Front drivers behave like this, but I'm
|
||||
* not sure if it at all violates the "write
|
||||
* should be allowed to block" model.
|
||||
*
|
||||
* The idea is that, while set with CHN_F_NOTRIGGER,
|
||||
* a channel isn't playing, *but* without this we
|
||||
* end up with interrupt timeout.
|
||||
* The idea is that, while set with CHN_F_NOTRIGGER,
|
||||
* a channel isn't playing, *but* without this we
|
||||
* end up with interrupt timeout.
|
||||
*/
|
||||
ret = EAGAIN;
|
||||
} else {
|
||||
ret = chn_sleep(c, timeout);
|
||||
ret = chn_sleep(c, timeout);
|
||||
if (ret == ERESTART || ret == EINTR)
|
||||
c->flags |= CHN_F_ABORTING;
|
||||
}
|
||||
@@ -496,8 +496,8 @@ chn_write(struct pcm_channel *c, struct uio *buf)
|
||||
static void
|
||||
chn_rdfeed(struct pcm_channel *c)
|
||||
{
|
||||
struct snd_dbuf *b = c->bufhard;
|
||||
struct snd_dbuf *bs = c->bufsoft;
|
||||
struct snd_dbuf *b = c->bufhard;
|
||||
struct snd_dbuf *bs = c->bufsoft;
|
||||
unsigned int amt;
|
||||
|
||||
CHN_LOCKASSERT(c);
|
||||
@@ -575,7 +575,7 @@ chn_read(struct pcm_channel *c, struct uio *buf)
|
||||
} else if (c->flags & (CHN_F_NBIO | CHN_F_NOTRIGGER))
|
||||
ret = EAGAIN;
|
||||
else {
|
||||
ret = chn_sleep(c, timeout);
|
||||
ret = chn_sleep(c, timeout);
|
||||
if (ret == ERESTART || ret == EINTR)
|
||||
c->flags |= CHN_F_ABORTING;
|
||||
}
|
||||
@@ -691,7 +691,7 @@ chn_resetbuf(struct pcm_channel *c)
|
||||
int
|
||||
chn_sync(struct pcm_channel *c, int threshold)
|
||||
{
|
||||
struct snd_dbuf *b, *bs;
|
||||
struct snd_dbuf *b, *bs;
|
||||
int ret, count, hcount, minflush, resid, residp, syncdelay, blksz;
|
||||
uint32_t cflag;
|
||||
|
||||
@@ -769,7 +769,7 @@ chn_sync(struct pcm_channel *c, int threshold)
|
||||
c->flags |= CHN_F_CLOSING;
|
||||
while (count > 0 && (resid > 0 || minflush > 0)) {
|
||||
ret = chn_sleep(c, c->timeout);
|
||||
if (ret == ERESTART || ret == EINTR) {
|
||||
if (ret == ERESTART || ret == EINTR) {
|
||||
c->flags |= CHN_F_ABORTING;
|
||||
break;
|
||||
} else if (ret == 0 || ret == EAGAIN) {
|
||||
@@ -815,7 +815,7 @@ chn_sync(struct pcm_channel *c, int threshold)
|
||||
__func__, c->timeout, count, hcount, resid, residp,
|
||||
minflush, ret);
|
||||
|
||||
return (0);
|
||||
return (0);
|
||||
}
|
||||
|
||||
/* called externally, handle locking */
|
||||
@@ -827,7 +827,7 @@ chn_poll(struct pcm_channel *c, int ev, struct thread *td)
|
||||
|
||||
CHN_LOCKASSERT(c);
|
||||
|
||||
if (!(c->flags & (CHN_F_MMAP | CHN_F_TRIGGERED))) {
|
||||
if (!(c->flags & (CHN_F_MMAP | CHN_F_TRIGGERED))) {
|
||||
ret = chn_start(c, 1);
|
||||
if (ret != 0)
|
||||
return (0);
|
||||
@@ -852,9 +852,9 @@ chn_poll(struct pcm_channel *c, int ev, struct thread *td)
|
||||
int
|
||||
chn_abort(struct pcm_channel *c)
|
||||
{
|
||||
int missing = 0;
|
||||
struct snd_dbuf *b = c->bufhard;
|
||||
struct snd_dbuf *bs = c->bufsoft;
|
||||
int missing = 0;
|
||||
struct snd_dbuf *b = c->bufhard;
|
||||
struct snd_dbuf *bs = c->bufsoft;
|
||||
|
||||
CHN_LOCKASSERT(c);
|
||||
if (CHN_STOPPED(c))
|
||||
@@ -867,7 +867,7 @@ chn_abort(struct pcm_channel *c)
|
||||
sndbuf_setrun(b, 0);
|
||||
if (!(c->flags & CHN_F_VIRTUAL))
|
||||
chn_dmaupdate(c);
|
||||
missing = sndbuf_getready(bs);
|
||||
missing = sndbuf_getready(bs);
|
||||
|
||||
c->flags &= ~CHN_F_ABORTING;
|
||||
return missing;
|
||||
@@ -887,11 +887,11 @@ chn_abort(struct pcm_channel *c)
|
||||
int
|
||||
chn_flush(struct pcm_channel *c)
|
||||
{
|
||||
struct snd_dbuf *b = c->bufhard;
|
||||
struct snd_dbuf *b = c->bufhard;
|
||||
|
||||
CHN_LOCKASSERT(c);
|
||||
KASSERT(c->direction == PCMDIR_PLAY, ("chn_flush on bad channel"));
|
||||
DEB(printf("chn_flush: c->flags 0x%08x\n", c->flags));
|
||||
DEB(printf("chn_flush: c->flags 0x%08x\n", c->flags));
|
||||
|
||||
c->flags |= CHN_F_CLOSING;
|
||||
chn_sync(c, 0);
|
||||
@@ -900,8 +900,8 @@ chn_flush(struct pcm_channel *c)
|
||||
chn_trigger(c, PCMTRIG_ABORT);
|
||||
sndbuf_setrun(b, 0);
|
||||
|
||||
c->flags &= ~CHN_F_CLOSING;
|
||||
return 0;
|
||||
c->flags &= ~CHN_F_CLOSING;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
@@ -1024,7 +1024,7 @@ snd_str2afmt(const char *req)
|
||||
}
|
||||
}
|
||||
/* found a match */
|
||||
return (SND_FORMAT(afmt_tab[i].afmt, ch + ext, ext));
|
||||
return (SND_FORMAT(afmt_tab[i].afmt, ch + ext, ext));
|
||||
}
|
||||
/* not a valid format */
|
||||
return (0);
|
||||
@@ -1250,8 +1250,8 @@ chn_init(struct snddev_info *d, struct pcm_channel *parent, kobj_class_t cls,
|
||||
|
||||
/**
|
||||
* @todo Should this be moved somewhere else? The primary buffer
|
||||
* is allocated by the driver or via DMA map setup, and tmpbuf
|
||||
* seems to only come into existence in sndbuf_resize().
|
||||
* is allocated by the driver or via DMA map setup, and tmpbuf
|
||||
* seems to only come into existence in sndbuf_resize().
|
||||
*/
|
||||
if (c->direction == PCMDIR_PLAY) {
|
||||
bs->sl = bs->maxsize;
|
||||
@@ -2309,8 +2309,8 @@ chn_trigger(struct pcm_channel *c, int go)
|
||||
* running in 16 bit stereo mode would require 4 bytes per sample, so a
|
||||
* hwptr value ranging from 32-35 would be returned as 32.)
|
||||
*
|
||||
* @param c PCM channel context
|
||||
* @returns sample-aligned hardware buffer pointer index
|
||||
* @param c PCM channel context
|
||||
* @returns sample-aligned hardware buffer pointer index
|
||||
*/
|
||||
int
|
||||
chn_getptr(struct pcm_channel *c)
|
||||
@@ -2564,9 +2564,9 @@ chn_getrates(struct pcm_channel *c, int **rates)
|
||||
*
|
||||
* @param c channel device to be started or closed
|
||||
* @returns If this channel was the only member of a group, the group ID
|
||||
* is returned to the caller so that the caller can release it
|
||||
* via free_unr() after giving up the syncgroup lock. Else it
|
||||
* returns 0.
|
||||
* is returned to the caller so that the caller can release it
|
||||
* via free_unr() after giving up the syncgroup lock. Else it
|
||||
* returns 0.
|
||||
*/
|
||||
int
|
||||
chn_syncdestroy(struct pcm_channel *c)
|
||||
|
||||
@@ -172,10 +172,10 @@ struct pcm_channel {
|
||||
} channels;
|
||||
|
||||
struct pcmchan_matrix matrix;
|
||||
struct pcmchan_matrix matrix_scratch;
|
||||
struct pcmchan_matrix matrix_scratch;
|
||||
|
||||
int16_t volume[SND_VOL_C_MAX][SND_CHN_T_VOL_MAX];
|
||||
int8_t muted[SND_VOL_C_MAX][SND_CHN_T_VOL_MAX];
|
||||
int8_t muted[SND_VOL_C_MAX][SND_CHN_T_VOL_MAX];
|
||||
};
|
||||
|
||||
#define CHN_HEAD(x, y) &(x)->y.head
|
||||
@@ -202,7 +202,7 @@ struct pcm_channel {
|
||||
CHN_FOREACH(t, x, z) { \
|
||||
if (t == y) \
|
||||
break; \
|
||||
} \
|
||||
} \
|
||||
if (t != y) \
|
||||
CHN_INSERT_HEAD(x, y, z); \
|
||||
} while (0)
|
||||
@@ -212,7 +212,7 @@ struct pcm_channel {
|
||||
CHN_FOREACH(t, w, z) { \
|
||||
if (t == y) \
|
||||
break; \
|
||||
} \
|
||||
} \
|
||||
if (t != y) \
|
||||
CHN_INSERT_AFTER(x, y, z); \
|
||||
} while (0)
|
||||
@@ -358,7 +358,7 @@ enum {
|
||||
#define CHN_F_NBIO 0x00000040 /* do non-blocking i/o */
|
||||
#define CHN_F_MMAP 0x00000080 /* has been mmap()ed */
|
||||
|
||||
#define CHN_F_BUSY 0x00000100 /* has been opened */
|
||||
#define CHN_F_BUSY 0x00000100 /* has been opened */
|
||||
#define CHN_F_DIRTY 0x00000200 /* need re-config */
|
||||
#define CHN_F_DEAD 0x00000400 /* too many errors, dead, mdk */
|
||||
/* unused 0x00000800 */
|
||||
@@ -404,7 +404,7 @@ enum {
|
||||
|
||||
#define CHN_F_MMAP_INVALID (CHN_F_DEAD | CHN_F_RUNNING)
|
||||
|
||||
|
||||
|
||||
|
||||
#define CHN_N_BLOCKSIZE 0x00000001
|
||||
#define CHN_N_TRIGGER 0x00000002
|
||||
|
||||
+116
-116
@@ -704,7 +704,7 @@ dsp_ioctl(struct cdev *i_dev, unsigned long cmd, caddr_t arg, int mode,
|
||||
struct thread *td)
|
||||
{
|
||||
struct dsp_cdevpriv *priv;
|
||||
struct pcm_channel *chn, *rdch, *wrch;
|
||||
struct pcm_channel *chn, *rdch, *wrch;
|
||||
struct snddev_info *d;
|
||||
unsigned long xcmd;
|
||||
int *arg_i, ret, tmp, err;
|
||||
@@ -795,8 +795,8 @@ dsp_ioctl(struct cdev *i_dev, unsigned long cmd, caddr_t arg, int mode,
|
||||
return (EINVAL);
|
||||
}
|
||||
|
||||
switch(cmd) {
|
||||
case AIONWRITE: /* how many bytes can write ? */
|
||||
switch(cmd) {
|
||||
case AIONWRITE: /* how many bytes can write ? */
|
||||
if (wrch) {
|
||||
CHN_LOCK(wrch);
|
||||
*arg_i = sndbuf_getfree(wrch->bufsoft);
|
||||
@@ -807,20 +807,20 @@ dsp_ioctl(struct cdev *i_dev, unsigned long cmd, caddr_t arg, int mode,
|
||||
}
|
||||
break;
|
||||
|
||||
case AIOSSIZE: /* set the current blocksize */
|
||||
case AIOSSIZE: /* set the current blocksize */
|
||||
{
|
||||
struct snd_size *p = (struct snd_size *)arg;
|
||||
struct snd_size *p = (struct snd_size *)arg;
|
||||
|
||||
p->play_size = 0;
|
||||
p->rec_size = 0;
|
||||
PCM_ACQUIRE_QUICK(d);
|
||||
if (wrch) {
|
||||
if (wrch) {
|
||||
CHN_LOCK(wrch);
|
||||
chn_setblocksize(wrch, 2, p->play_size);
|
||||
p->play_size = wrch->bufsoft->blksz;
|
||||
CHN_UNLOCK(wrch);
|
||||
}
|
||||
if (rdch) {
|
||||
if (rdch) {
|
||||
CHN_LOCK(rdch);
|
||||
chn_setblocksize(rdch, 2, p->rec_size);
|
||||
p->rec_size = rdch->bufsoft->blksz;
|
||||
@@ -829,16 +829,16 @@ dsp_ioctl(struct cdev *i_dev, unsigned long cmd, caddr_t arg, int mode,
|
||||
PCM_RELEASE_QUICK(d);
|
||||
}
|
||||
break;
|
||||
case AIOGSIZE: /* get the current blocksize */
|
||||
case AIOGSIZE: /* get the current blocksize */
|
||||
{
|
||||
struct snd_size *p = (struct snd_size *)arg;
|
||||
struct snd_size *p = (struct snd_size *)arg;
|
||||
|
||||
if (wrch) {
|
||||
if (wrch) {
|
||||
CHN_LOCK(wrch);
|
||||
p->play_size = wrch->bufsoft->blksz;
|
||||
CHN_UNLOCK(wrch);
|
||||
}
|
||||
if (rdch) {
|
||||
if (rdch) {
|
||||
CHN_LOCK(rdch);
|
||||
p->rec_size = rdch->bufsoft->blksz;
|
||||
CHN_UNLOCK(rdch);
|
||||
@@ -846,14 +846,14 @@ dsp_ioctl(struct cdev *i_dev, unsigned long cmd, caddr_t arg, int mode,
|
||||
}
|
||||
break;
|
||||
|
||||
case AIOSFMT:
|
||||
case AIOGFMT:
|
||||
case AIOSFMT:
|
||||
case AIOGFMT:
|
||||
#ifdef COMPAT_FREEBSD32
|
||||
case AIOSFMT32:
|
||||
case AIOGFMT32:
|
||||
#endif
|
||||
{
|
||||
snd_chan_param *p = (snd_chan_param *)arg;
|
||||
snd_chan_param *p = (snd_chan_param *)arg;
|
||||
|
||||
#ifdef COMPAT_FREEBSD32
|
||||
snd_chan_param32 *p32 = (snd_chan_param32 *)arg;
|
||||
@@ -874,7 +874,7 @@ dsp_ioctl(struct cdev *i_dev, unsigned long cmd, caddr_t arg, int mode,
|
||||
break;
|
||||
}
|
||||
PCM_ACQUIRE_QUICK(d);
|
||||
if (wrch) {
|
||||
if (wrch) {
|
||||
CHN_LOCK(wrch);
|
||||
if (cmd == AIOSFMT && p->play_format != 0) {
|
||||
chn_setformat(wrch,
|
||||
@@ -883,14 +883,14 @@ dsp_ioctl(struct cdev *i_dev, unsigned long cmd, caddr_t arg, int mode,
|
||||
AFMT_EXTCHANNEL(wrch->format)));
|
||||
chn_setspeed(wrch, p->play_rate);
|
||||
}
|
||||
p->play_rate = wrch->speed;
|
||||
p->play_format = AFMT_ENCODING(wrch->format);
|
||||
p->play_rate = wrch->speed;
|
||||
p->play_format = AFMT_ENCODING(wrch->format);
|
||||
CHN_UNLOCK(wrch);
|
||||
} else {
|
||||
p->play_rate = 0;
|
||||
p->play_format = 0;
|
||||
}
|
||||
if (rdch) {
|
||||
p->play_rate = 0;
|
||||
p->play_format = 0;
|
||||
}
|
||||
if (rdch) {
|
||||
CHN_LOCK(rdch);
|
||||
if (cmd == AIOSFMT && p->rec_format != 0) {
|
||||
chn_setformat(rdch,
|
||||
@@ -903,9 +903,9 @@ dsp_ioctl(struct cdev *i_dev, unsigned long cmd, caddr_t arg, int mode,
|
||||
p->rec_format = AFMT_ENCODING(rdch->format);
|
||||
CHN_UNLOCK(rdch);
|
||||
} else {
|
||||
p->rec_rate = 0;
|
||||
p->rec_format = 0;
|
||||
}
|
||||
p->rec_rate = 0;
|
||||
p->rec_format = 0;
|
||||
}
|
||||
PCM_RELEASE_QUICK(d);
|
||||
#ifdef COMPAT_FREEBSD32
|
||||
if (cmd == AIOSFMT32 || cmd == AIOGFMT32) {
|
||||
@@ -918,12 +918,12 @@ dsp_ioctl(struct cdev *i_dev, unsigned long cmd, caddr_t arg, int mode,
|
||||
}
|
||||
break;
|
||||
|
||||
case AIOGCAP: /* get capabilities */
|
||||
case AIOGCAP: /* get capabilities */
|
||||
#ifdef COMPAT_FREEBSD32
|
||||
case AIOGCAP32:
|
||||
#endif
|
||||
{
|
||||
snd_capabilities *p = (snd_capabilities *)arg;
|
||||
snd_capabilities *p = (snd_capabilities *)arg;
|
||||
struct pcmchan_caps *pcaps = NULL, *rcaps = NULL;
|
||||
#ifdef COMPAT_FREEBSD32
|
||||
snd_capabilities32 *p32 = (snd_capabilities32 *)arg;
|
||||
@@ -950,23 +950,23 @@ dsp_ioctl(struct cdev *i_dev, unsigned long cmd, caddr_t arg, int mode,
|
||||
CHN_LOCK(wrch);
|
||||
pcaps = chn_getcaps(wrch);
|
||||
}
|
||||
p->rate_min = max(rcaps? rcaps->minspeed : 0,
|
||||
pcaps? pcaps->minspeed : 0);
|
||||
p->rate_max = min(rcaps? rcaps->maxspeed : 1000000,
|
||||
pcaps? pcaps->maxspeed : 1000000);
|
||||
p->rate_min = max(rcaps? rcaps->minspeed : 0,
|
||||
pcaps? pcaps->minspeed : 0);
|
||||
p->rate_max = min(rcaps? rcaps->maxspeed : 1000000,
|
||||
pcaps? pcaps->maxspeed : 1000000);
|
||||
p->bufsize = min(rdch? rdch->bufsoft->bufsize : 1000000,
|
||||
wrch? wrch->bufsoft->bufsize : 1000000);
|
||||
/* XXX bad on sb16 */
|
||||
p->formats = (rdch? chn_getformats(rdch) : 0xffffffff) &
|
||||
(wrch? chn_getformats(wrch) : 0xffffffff);
|
||||
p->formats = (rdch? chn_getformats(rdch) : 0xffffffff) &
|
||||
(wrch? chn_getformats(wrch) : 0xffffffff);
|
||||
if (rdch && wrch) {
|
||||
p->formats |=
|
||||
(pcm_getflags(d->dev) & SD_F_SIMPLEX) ? 0 :
|
||||
AFMT_FULLDUPLEX;
|
||||
}
|
||||
p->mixers = 1; /* default: one mixer */
|
||||
p->mixers = 1; /* default: one mixer */
|
||||
p->inputs = d->mixer ? mix_getdevs(d->mixer) : 0;
|
||||
p->left = p->right = 100;
|
||||
p->left = p->right = 100;
|
||||
if (wrch)
|
||||
CHN_UNLOCK(wrch);
|
||||
if (rdch)
|
||||
@@ -987,7 +987,7 @@ dsp_ioctl(struct cdev *i_dev, unsigned long cmd, caddr_t arg, int mode,
|
||||
}
|
||||
break;
|
||||
|
||||
case AIOSTOP:
|
||||
case AIOSTOP:
|
||||
if (*arg_i == AIOSYNC_PLAY && wrch) {
|
||||
CHN_LOCK(wrch);
|
||||
*arg_i = chn_abort(wrch);
|
||||
@@ -997,16 +997,16 @@ dsp_ioctl(struct cdev *i_dev, unsigned long cmd, caddr_t arg, int mode,
|
||||
*arg_i = chn_abort(rdch);
|
||||
CHN_UNLOCK(rdch);
|
||||
} else {
|
||||
printf("AIOSTOP: bad channel 0x%x\n", *arg_i);
|
||||
*arg_i = 0;
|
||||
printf("AIOSTOP: bad channel 0x%x\n", *arg_i);
|
||||
*arg_i = 0;
|
||||
}
|
||||
break;
|
||||
|
||||
case AIOSYNC:
|
||||
case AIOSYNC:
|
||||
printf("AIOSYNC chan 0x%03lx pos %lu unimplemented\n",
|
||||
((snd_sync_parm *)arg)->chan, ((snd_sync_parm *)arg)->pos);
|
||||
((snd_sync_parm *)arg)->chan, ((snd_sync_parm *)arg)->pos);
|
||||
break;
|
||||
case FIONREAD: /* get # bytes to read */
|
||||
case FIONREAD: /* get # bytes to read */
|
||||
if (rdch) {
|
||||
CHN_LOCK(rdch);
|
||||
*arg_i = sndbuf_getready(rdch->bufsoft);
|
||||
@@ -1017,12 +1017,12 @@ dsp_ioctl(struct cdev *i_dev, unsigned long cmd, caddr_t arg, int mode,
|
||||
}
|
||||
break;
|
||||
|
||||
case FIOASYNC: /*set/clear async i/o */
|
||||
case FIOASYNC: /*set/clear async i/o */
|
||||
DEB( printf("FIOASYNC\n") ; )
|
||||
break;
|
||||
|
||||
case SNDCTL_DSP_NONBLOCK: /* set non-blocking i/o */
|
||||
case FIONBIO: /* set/clear non-blocking i/o */
|
||||
case SNDCTL_DSP_NONBLOCK: /* set non-blocking i/o */
|
||||
case FIONBIO: /* set/clear non-blocking i/o */
|
||||
if (rdch) {
|
||||
CHN_LOCK(rdch);
|
||||
if (cmd == SNDCTL_DSP_NONBLOCK || *arg_i)
|
||||
@@ -1041,7 +1041,7 @@ dsp_ioctl(struct cdev *i_dev, unsigned long cmd, caddr_t arg, int mode,
|
||||
}
|
||||
break;
|
||||
|
||||
case SNDCTL_DSP_GETBLKSIZE:
|
||||
case SNDCTL_DSP_GETBLKSIZE:
|
||||
chn = wrch ? wrch : rdch;
|
||||
if (chn) {
|
||||
CHN_LOCK(chn);
|
||||
@@ -1053,7 +1053,7 @@ dsp_ioctl(struct cdev *i_dev, unsigned long cmd, caddr_t arg, int mode,
|
||||
}
|
||||
break;
|
||||
|
||||
case SNDCTL_DSP_SETBLKSIZE:
|
||||
case SNDCTL_DSP_SETBLKSIZE:
|
||||
RANGE(*arg_i, 16, 65536);
|
||||
PCM_ACQUIRE_QUICK(d);
|
||||
if (wrch) {
|
||||
@@ -1069,7 +1069,7 @@ dsp_ioctl(struct cdev *i_dev, unsigned long cmd, caddr_t arg, int mode,
|
||||
PCM_RELEASE_QUICK(d);
|
||||
break;
|
||||
|
||||
case SNDCTL_DSP_RESET:
|
||||
case SNDCTL_DSP_RESET:
|
||||
DEB(printf("dsp reset\n"));
|
||||
if (wrch) {
|
||||
CHN_LOCK(wrch);
|
||||
@@ -1085,7 +1085,7 @@ dsp_ioctl(struct cdev *i_dev, unsigned long cmd, caddr_t arg, int mode,
|
||||
}
|
||||
break;
|
||||
|
||||
case SNDCTL_DSP_SYNC:
|
||||
case SNDCTL_DSP_SYNC:
|
||||
DEB(printf("dsp sync\n"));
|
||||
/* chn_sync may sleep */
|
||||
if (wrch) {
|
||||
@@ -1095,7 +1095,7 @@ dsp_ioctl(struct cdev *i_dev, unsigned long cmd, caddr_t arg, int mode,
|
||||
}
|
||||
break;
|
||||
|
||||
case SNDCTL_DSP_SPEED:
|
||||
case SNDCTL_DSP_SPEED:
|
||||
/* chn_setspeed may sleep */
|
||||
tmp = 0;
|
||||
PCM_ACQUIRE_QUICK(d);
|
||||
@@ -1116,7 +1116,7 @@ dsp_ioctl(struct cdev *i_dev, unsigned long cmd, caddr_t arg, int mode,
|
||||
*arg_i = tmp;
|
||||
break;
|
||||
|
||||
case SOUND_PCM_READ_RATE:
|
||||
case SOUND_PCM_READ_RATE:
|
||||
chn = wrch ? wrch : rdch;
|
||||
if (chn) {
|
||||
CHN_LOCK(chn);
|
||||
@@ -1128,7 +1128,7 @@ dsp_ioctl(struct cdev *i_dev, unsigned long cmd, caddr_t arg, int mode,
|
||||
}
|
||||
break;
|
||||
|
||||
case SNDCTL_DSP_STEREO:
|
||||
case SNDCTL_DSP_STEREO:
|
||||
tmp = -1;
|
||||
*arg_i = (*arg_i)? 2 : 1;
|
||||
PCM_ACQUIRE_QUICK(d);
|
||||
@@ -1151,7 +1151,7 @@ dsp_ioctl(struct cdev *i_dev, unsigned long cmd, caddr_t arg, int mode,
|
||||
*arg_i = tmp;
|
||||
break;
|
||||
|
||||
case SOUND_PCM_WRITE_CHANNELS:
|
||||
case SOUND_PCM_WRITE_CHANNELS:
|
||||
/* case SNDCTL_DSP_CHANNELS: ( == SOUND_PCM_WRITE_CHANNELS) */
|
||||
if (*arg_i < 0 || *arg_i > AFMT_CHANNEL_MAX) {
|
||||
*arg_i = 0;
|
||||
@@ -1180,7 +1180,7 @@ dsp_ioctl(struct cdev *i_dev, unsigned long cmd, caddr_t arg, int mode,
|
||||
}
|
||||
|
||||
PCM_ACQUIRE_QUICK(d);
|
||||
if (wrch) {
|
||||
if (wrch) {
|
||||
CHN_LOCK(wrch);
|
||||
ret = chn_setformat(wrch,
|
||||
SND_FORMAT(wrch->format, *arg_i, ext));
|
||||
@@ -1205,7 +1205,7 @@ dsp_ioctl(struct cdev *i_dev, unsigned long cmd, caddr_t arg, int mode,
|
||||
}
|
||||
break;
|
||||
|
||||
case SOUND_PCM_READ_CHANNELS:
|
||||
case SOUND_PCM_READ_CHANNELS:
|
||||
chn = wrch ? wrch : rdch;
|
||||
if (chn) {
|
||||
CHN_LOCK(chn);
|
||||
@@ -1217,7 +1217,7 @@ dsp_ioctl(struct cdev *i_dev, unsigned long cmd, caddr_t arg, int mode,
|
||||
}
|
||||
break;
|
||||
|
||||
case SNDCTL_DSP_GETFMTS: /* returns a mask of supported fmts */
|
||||
case SNDCTL_DSP_GETFMTS: /* returns a mask of supported fmts */
|
||||
chn = wrch ? wrch : rdch;
|
||||
if (chn) {
|
||||
CHN_LOCK(chn);
|
||||
@@ -1229,7 +1229,7 @@ dsp_ioctl(struct cdev *i_dev, unsigned long cmd, caddr_t arg, int mode,
|
||||
}
|
||||
break;
|
||||
|
||||
case SNDCTL_DSP_SETFMT: /* sets _one_ format */
|
||||
case SNDCTL_DSP_SETFMT: /* sets _one_ format */
|
||||
if (*arg_i != AFMT_QUERY) {
|
||||
tmp = 0;
|
||||
PCM_ACQUIRE_QUICK(d);
|
||||
@@ -1260,7 +1260,7 @@ dsp_ioctl(struct cdev *i_dev, unsigned long cmd, caddr_t arg, int mode,
|
||||
}
|
||||
break;
|
||||
|
||||
case SNDCTL_DSP_SETFRAGMENT:
|
||||
case SNDCTL_DSP_SETFRAGMENT:
|
||||
DEB(printf("SNDCTL_DSP_SETFRAGMENT 0x%08x\n", *(int *)arg));
|
||||
{
|
||||
uint32_t fragln = (*arg_i) & 0x0000ffff;
|
||||
@@ -1273,7 +1273,7 @@ dsp_ioctl(struct cdev *i_dev, unsigned long cmd, caddr_t arg, int mode,
|
||||
|
||||
DEB(printf("SNDCTL_DSP_SETFRAGMENT %d frags, %d sz\n", maxfrags, fragsz));
|
||||
PCM_ACQUIRE_QUICK(d);
|
||||
if (rdch) {
|
||||
if (rdch) {
|
||||
CHN_LOCK(rdch);
|
||||
ret = chn_setblocksize(rdch,
|
||||
dsp_clamp_fragments(maxfrags, fragsz,
|
||||
@@ -1285,7 +1285,7 @@ dsp_ioctl(struct cdev *i_dev, unsigned long cmd, caddr_t arg, int mode,
|
||||
r_maxfrags = maxfrags;
|
||||
r_fragsz = fragsz;
|
||||
}
|
||||
if (wrch && ret == 0) {
|
||||
if (wrch && ret == 0) {
|
||||
CHN_LOCK(wrch);
|
||||
ret = chn_setblocksize(wrch,
|
||||
dsp_clamp_fragments(maxfrags, fragsz,
|
||||
@@ -1304,16 +1304,16 @@ dsp_ioctl(struct cdev *i_dev, unsigned long cmd, caddr_t arg, int mode,
|
||||
fragln++;
|
||||
fragsz >>= 1;
|
||||
}
|
||||
*arg_i = (maxfrags << 16) | fragln;
|
||||
*arg_i = (maxfrags << 16) | fragln;
|
||||
}
|
||||
break;
|
||||
|
||||
case SNDCTL_DSP_GETISPACE:
|
||||
case SNDCTL_DSP_GETISPACE:
|
||||
/* return the size of data available in the input queue */
|
||||
{
|
||||
audio_buf_info *a = (audio_buf_info *)arg;
|
||||
if (rdch) {
|
||||
struct snd_dbuf *bs = rdch->bufsoft;
|
||||
audio_buf_info *a = (audio_buf_info *)arg;
|
||||
if (rdch) {
|
||||
struct snd_dbuf *bs = rdch->bufsoft;
|
||||
|
||||
CHN_LOCK(rdch);
|
||||
a->bytes = sndbuf_getready(bs);
|
||||
@@ -1321,17 +1321,17 @@ dsp_ioctl(struct cdev *i_dev, unsigned long cmd, caddr_t arg, int mode,
|
||||
a->fragstotal = bs->blkcnt;
|
||||
a->fragsize = bs->blksz;
|
||||
CHN_UNLOCK(rdch);
|
||||
} else
|
||||
} else
|
||||
ret = EINVAL;
|
||||
}
|
||||
break;
|
||||
|
||||
case SNDCTL_DSP_GETOSPACE:
|
||||
case SNDCTL_DSP_GETOSPACE:
|
||||
/* return space available in the output queue */
|
||||
{
|
||||
audio_buf_info *a = (audio_buf_info *)arg;
|
||||
if (wrch) {
|
||||
struct snd_dbuf *bs = wrch->bufsoft;
|
||||
audio_buf_info *a = (audio_buf_info *)arg;
|
||||
if (wrch) {
|
||||
struct snd_dbuf *bs = wrch->bufsoft;
|
||||
|
||||
CHN_LOCK(wrch);
|
||||
a->bytes = sndbuf_getfree(bs);
|
||||
@@ -1339,16 +1339,16 @@ dsp_ioctl(struct cdev *i_dev, unsigned long cmd, caddr_t arg, int mode,
|
||||
a->fragstotal = bs->blkcnt;
|
||||
a->fragsize = bs->blksz;
|
||||
CHN_UNLOCK(wrch);
|
||||
} else
|
||||
} else
|
||||
ret = EINVAL;
|
||||
}
|
||||
break;
|
||||
|
||||
case SNDCTL_DSP_GETIPTR:
|
||||
case SNDCTL_DSP_GETIPTR:
|
||||
{
|
||||
count_info *a = (count_info *)arg;
|
||||
if (rdch) {
|
||||
struct snd_dbuf *bs = rdch->bufsoft;
|
||||
count_info *a = (count_info *)arg;
|
||||
if (rdch) {
|
||||
struct snd_dbuf *bs = rdch->bufsoft;
|
||||
|
||||
CHN_LOCK(rdch);
|
||||
a->bytes = bs->total;
|
||||
@@ -1356,16 +1356,16 @@ dsp_ioctl(struct cdev *i_dev, unsigned long cmd, caddr_t arg, int mode,
|
||||
a->ptr = sndbuf_getfreeptr(bs);
|
||||
rdch->blocks = sndbuf_getblocks(bs);
|
||||
CHN_UNLOCK(rdch);
|
||||
} else
|
||||
} else
|
||||
ret = EINVAL;
|
||||
}
|
||||
break;
|
||||
|
||||
case SNDCTL_DSP_GETOPTR:
|
||||
case SNDCTL_DSP_GETOPTR:
|
||||
{
|
||||
count_info *a = (count_info *)arg;
|
||||
if (wrch) {
|
||||
struct snd_dbuf *bs = wrch->bufsoft;
|
||||
count_info *a = (count_info *)arg;
|
||||
if (wrch) {
|
||||
struct snd_dbuf *bs = wrch->bufsoft;
|
||||
|
||||
CHN_LOCK(wrch);
|
||||
a->bytes = bs->total;
|
||||
@@ -1373,12 +1373,12 @@ dsp_ioctl(struct cdev *i_dev, unsigned long cmd, caddr_t arg, int mode,
|
||||
a->ptr = sndbuf_getreadyptr(bs);
|
||||
wrch->blocks = sndbuf_getblocks(bs);
|
||||
CHN_UNLOCK(wrch);
|
||||
} else
|
||||
} else
|
||||
ret = EINVAL;
|
||||
}
|
||||
break;
|
||||
|
||||
case SNDCTL_DSP_GETCAPS:
|
||||
case SNDCTL_DSP_GETCAPS:
|
||||
PCM_LOCK(d);
|
||||
*arg_i = PCM_CAP_REALTIME | PCM_CAP_MMAP | PCM_CAP_TRIGGER;
|
||||
if (rdch && wrch && !(pcm_getflags(d->dev) & SD_F_SIMPLEX))
|
||||
@@ -1390,7 +1390,7 @@ dsp_ioctl(struct cdev *i_dev, unsigned long cmd, caddr_t arg, int mode,
|
||||
PCM_UNLOCK(d);
|
||||
break;
|
||||
|
||||
case SOUND_PCM_READ_BITS:
|
||||
case SOUND_PCM_READ_BITS:
|
||||
chn = wrch ? wrch : rdch;
|
||||
if (chn) {
|
||||
CHN_LOCK(chn);
|
||||
@@ -1411,11 +1411,11 @@ dsp_ioctl(struct cdev *i_dev, unsigned long cmd, caddr_t arg, int mode,
|
||||
}
|
||||
break;
|
||||
|
||||
case SNDCTL_DSP_SETTRIGGER:
|
||||
case SNDCTL_DSP_SETTRIGGER:
|
||||
if (rdch) {
|
||||
CHN_LOCK(rdch);
|
||||
rdch->flags &= ~CHN_F_NOTRIGGER;
|
||||
if (*arg_i & PCM_ENABLE_INPUT)
|
||||
if (*arg_i & PCM_ENABLE_INPUT)
|
||||
chn_start(rdch, 1);
|
||||
else {
|
||||
chn_abort(rdch);
|
||||
@@ -1427,7 +1427,7 @@ dsp_ioctl(struct cdev *i_dev, unsigned long cmd, caddr_t arg, int mode,
|
||||
if (wrch) {
|
||||
CHN_LOCK(wrch);
|
||||
wrch->flags &= ~CHN_F_NOTRIGGER;
|
||||
if (*arg_i & PCM_ENABLE_OUTPUT)
|
||||
if (*arg_i & PCM_ENABLE_OUTPUT)
|
||||
chn_start(wrch, 1);
|
||||
else {
|
||||
chn_abort(wrch);
|
||||
@@ -1438,7 +1438,7 @@ dsp_ioctl(struct cdev *i_dev, unsigned long cmd, caddr_t arg, int mode,
|
||||
}
|
||||
break;
|
||||
|
||||
case SNDCTL_DSP_GETTRIGGER:
|
||||
case SNDCTL_DSP_GETTRIGGER:
|
||||
*arg_i = 0;
|
||||
if (wrch) {
|
||||
CHN_LOCK(wrch);
|
||||
@@ -1456,7 +1456,7 @@ dsp_ioctl(struct cdev *i_dev, unsigned long cmd, caddr_t arg, int mode,
|
||||
|
||||
case SNDCTL_DSP_GETODELAY:
|
||||
if (wrch) {
|
||||
struct snd_dbuf *bs = wrch->bufsoft;
|
||||
struct snd_dbuf *bs = wrch->bufsoft;
|
||||
|
||||
CHN_LOCK(wrch);
|
||||
*arg_i = sndbuf_getready(bs);
|
||||
@@ -1465,7 +1465,7 @@ dsp_ioctl(struct cdev *i_dev, unsigned long cmd, caddr_t arg, int mode,
|
||||
ret = EINVAL;
|
||||
break;
|
||||
|
||||
case SNDCTL_DSP_POST:
|
||||
case SNDCTL_DSP_POST:
|
||||
if (wrch) {
|
||||
CHN_LOCK(wrch);
|
||||
wrch->flags &= ~CHN_F_NOTRIGGER;
|
||||
@@ -1632,18 +1632,18 @@ dsp_ioctl(struct cdev *i_dev, unsigned long cmd, caddr_t arg, int mode,
|
||||
case SNDCTL_DSP_CURRENT_IPTR:
|
||||
/**
|
||||
* @note Changing formats resets the buffer counters, which differs
|
||||
* from the 4Front drivers. However, I don't expect this to be
|
||||
* much of a problem.
|
||||
* from the 4Front drivers. However, I don't expect this to be
|
||||
* much of a problem.
|
||||
*
|
||||
* @note In a test where @c CURRENT_OPTR is called immediately after write
|
||||
* returns, this driver is about 32K samples behind whereas
|
||||
* 4Front's is about 8K samples behind. Should determine source
|
||||
* of discrepancy, even if only out of curiosity.
|
||||
* returns, this driver is about 32K samples behind whereas
|
||||
* 4Front's is about 8K samples behind. Should determine source
|
||||
* of discrepancy, even if only out of curiosity.
|
||||
*
|
||||
* @todo Actually test SNDCTL_DSP_CURRENT_IPTR.
|
||||
*/
|
||||
chn = (cmd == SNDCTL_DSP_CURRENT_OPTR) ? wrch : rdch;
|
||||
if (chn == NULL)
|
||||
if (chn == NULL)
|
||||
ret = EINVAL;
|
||||
else {
|
||||
struct snd_dbuf *bs;
|
||||
@@ -1829,25 +1829,25 @@ dsp_ioctl(struct cdev *i_dev, unsigned long cmd, caddr_t arg, int mode,
|
||||
ret = dsp_oss_setname(wrch, rdch, (oss_longname_t *)arg);
|
||||
break;
|
||||
#endif /* !OSSV4_EXPERIMENT */
|
||||
case SNDCTL_DSP_MAPINBUF:
|
||||
case SNDCTL_DSP_MAPOUTBUF:
|
||||
case SNDCTL_DSP_SETSYNCRO:
|
||||
case SNDCTL_DSP_MAPINBUF:
|
||||
case SNDCTL_DSP_MAPOUTBUF:
|
||||
case SNDCTL_DSP_SETSYNCRO:
|
||||
/* undocumented */
|
||||
|
||||
case SNDCTL_DSP_SUBDIVIDE:
|
||||
case SOUND_PCM_WRITE_FILTER:
|
||||
case SOUND_PCM_READ_FILTER:
|
||||
case SNDCTL_DSP_SUBDIVIDE:
|
||||
case SOUND_PCM_WRITE_FILTER:
|
||||
case SOUND_PCM_READ_FILTER:
|
||||
/* dunno what these do, don't sound important */
|
||||
|
||||
default:
|
||||
default:
|
||||
DEB(printf("default ioctl fn 0x%08lx fail\n", cmd));
|
||||
ret = EINVAL;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
PCM_GIANT_LEAVE(d);
|
||||
|
||||
return (ret);
|
||||
return (ret);
|
||||
}
|
||||
|
||||
static int
|
||||
@@ -2313,7 +2313,7 @@ dsp_oss_engineinfo_cb(void *data, void *arg)
|
||||
*
|
||||
* @note
|
||||
* Calling threads must not hold any snddev_info or pcm_channel locks.
|
||||
*
|
||||
*
|
||||
* @param dev device on which the ioctl was issued
|
||||
* @param ai ioctl request data container
|
||||
*
|
||||
@@ -2343,7 +2343,7 @@ dsp_oss_engineinfo(struct cdev *i_dev, oss_audioinfo *ai)
|
||||
/*
|
||||
* Search for the requested audio device (channel). Start by
|
||||
* iterating over pcm devices.
|
||||
*/
|
||||
*/
|
||||
bus_topo_lock();
|
||||
for (unit = 0; pcm_devclass != NULL &&
|
||||
unit < devclass_get_maxunit(pcm_devclass); unit++) {
|
||||
@@ -2518,8 +2518,8 @@ dsp_oss_engineinfo(struct cdev *i_dev, oss_audioinfo *ai)
|
||||
* the group specified.
|
||||
*
|
||||
* @todo As far as memory allocation, should we assume that things are
|
||||
* okay and allocate with M_WAITOK before acquiring channel locks,
|
||||
* freeing later if not?
|
||||
* okay and allocate with M_WAITOK before acquiring channel locks,
|
||||
* freeing later if not?
|
||||
*
|
||||
* @param wrch output channel associated w/ device (if any)
|
||||
* @param rdch input channel associated w/ device (if any)
|
||||
@@ -2551,7 +2551,7 @@ dsp_oss_syncgroup(struct pcm_channel *wrch, struct pcm_channel *rdch, oss_syncgr
|
||||
/*
|
||||
* - Insert channel(s) into group's member list.
|
||||
* - Set CHN_F_NOTRIGGER on channel(s).
|
||||
* - Stop channel(s).
|
||||
* - Stop channel(s).
|
||||
*/
|
||||
|
||||
/*
|
||||
@@ -2720,7 +2720,7 @@ dsp_oss_syncstart(int sg_id)
|
||||
*/
|
||||
SLIST_FOREACH(sm, &sg->members, link) {
|
||||
if (CHN_TRYLOCK(sm->ch) == 0) {
|
||||
int timo = hz * 5/1000;
|
||||
int timo = hz * 5/1000;
|
||||
if (timo < 1)
|
||||
timo = 1;
|
||||
|
||||
@@ -2806,7 +2806,7 @@ dsp_oss_syncstart(int sg_id)
|
||||
* more information.
|
||||
*
|
||||
* @todo When SNDCTL_DSP_COOKEDMODE is supported, it'll be necessary to
|
||||
* work with hardware drivers directly.
|
||||
* work with hardware drivers directly.
|
||||
*
|
||||
* @note PCM channel arguments must not be locked by caller.
|
||||
*
|
||||
@@ -2913,7 +2913,7 @@ dsp_oss_cookedmode(struct pcm_channel *wrch, struct pcm_channel *rdch, int enabl
|
||||
* for more details.
|
||||
*
|
||||
* @note As the ioctl definition is still under construction, FreeBSD
|
||||
* does not currently support SNDCTL_DSP_GET_CHNORDER.
|
||||
* does not currently support SNDCTL_DSP_GET_CHNORDER.
|
||||
*
|
||||
* @param wrch playback channel (optional; may be NULL)
|
||||
* @param rdch recording channel (optional; may be NULL)
|
||||
@@ -2944,7 +2944,7 @@ dsp_oss_getchnorder(struct pcm_channel *wrch, struct pcm_channel *rdch, unsigned
|
||||
* This is the handler for @c SNDCTL_DSP_SET_CHNORDER.
|
||||
*
|
||||
* @note As the ioctl definition is still under construction, FreeBSD
|
||||
* does not currently support @c SNDCTL_DSP_SET_CHNORDER.
|
||||
* does not currently support @c SNDCTL_DSP_SET_CHNORDER.
|
||||
*
|
||||
* @param wrch playback channel (optional; may be NULL)
|
||||
* @param rdch recording channel (optional; may be NULL)
|
||||
@@ -3115,7 +3115,7 @@ dsp_kqfilter(struct cdev *dev, struct knote *kn)
|
||||
* applications may change the labels themselves."
|
||||
*
|
||||
* @note As the ioctl definition is still under construction, FreeBSD
|
||||
* does not currently support @c SNDCTL_GETLABEL.
|
||||
* does not currently support @c SNDCTL_GETLABEL.
|
||||
*
|
||||
* @param wrch playback channel (optional; may be NULL)
|
||||
* @param rdch recording channel (optional; may be NULL)
|
||||
@@ -3139,7 +3139,7 @@ dsp_oss_getlabel(struct pcm_channel *wrch, struct pcm_channel *rdch, oss_label_t
|
||||
* for more details.
|
||||
*
|
||||
* @note As the ioctl definition is still under construction, FreeBSD
|
||||
* does not currently support SNDCTL_SETLABEL.
|
||||
* does not currently support SNDCTL_SETLABEL.
|
||||
*
|
||||
* @param wrch playback channel (optional; may be NULL)
|
||||
* @param rdch recording channel (optional; may be NULL)
|
||||
@@ -3164,7 +3164,7 @@ dsp_oss_setlabel(struct pcm_channel *wrch, struct pcm_channel *rdch, oss_label_t
|
||||
* for more details.
|
||||
*
|
||||
* @note As the ioctl definition is still under construction, FreeBSD
|
||||
* does not currently support SNDCTL_GETSONG.
|
||||
* does not currently support SNDCTL_GETSONG.
|
||||
*
|
||||
* @param wrch playback channel (optional; may be NULL)
|
||||
* @param rdch recording channel (optional; may be NULL)
|
||||
@@ -3189,7 +3189,7 @@ dsp_oss_getsong(struct pcm_channel *wrch, struct pcm_channel *rdch, oss_longname
|
||||
* for more details.
|
||||
*
|
||||
* @note As the ioctl definition is still under construction, FreeBSD
|
||||
* does not currently support SNDCTL_SETSONG.
|
||||
* does not currently support SNDCTL_SETSONG.
|
||||
*
|
||||
* @param wrch playback channel (optional; may be NULL)
|
||||
* @param rdch recording channel (optional; may be NULL)
|
||||
@@ -3218,7 +3218,7 @@ dsp_oss_setsong(struct pcm_channel *wrch, struct pcm_channel *rdch, oss_longname
|
||||
* synth' or 'VoIP link to London')."
|
||||
*
|
||||
* @note As the ioctl definition is still under construction, FreeBSD
|
||||
* does not currently support SNDCTL_SETNAME.
|
||||
* does not currently support SNDCTL_SETNAME.
|
||||
*
|
||||
* @param wrch playback channel (optional; may be NULL)
|
||||
* @param rdch recording channel (optional; may be NULL)
|
||||
|
||||
@@ -353,7 +353,7 @@ feed_root(struct pcm_feeder *feeder, struct pcm_channel *ch, uint8_t *buffer, ui
|
||||
}
|
||||
|
||||
static kobj_method_t feeder_root_methods[] = {
|
||||
KOBJMETHOD(feeder_feed, feed_root),
|
||||
KOBJMETHOD(feeder_feed, feed_root),
|
||||
KOBJMETHOD_END
|
||||
};
|
||||
static struct feeder_class feeder_root_class = {
|
||||
|
||||
@@ -53,7 +53,7 @@ struct feeder_class {
|
||||
};
|
||||
|
||||
struct pcm_feeder {
|
||||
KOBJ_FIELDS;
|
||||
KOBJ_FIELDS;
|
||||
struct pcm_feederdesc desc;
|
||||
void *data;
|
||||
struct feeder_class *class;
|
||||
|
||||
@@ -650,7 +650,7 @@ feeder_chain(struct pcm_channel *c)
|
||||
softmatrix = feeder_matrix_format_map(softfmt);
|
||||
if (softmatrix == NULL) {
|
||||
/* setup a default matrix */
|
||||
softmatrix = &c->matrix;
|
||||
softmatrix = &c->matrix;
|
||||
feeder_default_matrix(softmatrix, softfmt,
|
||||
SND_CHN_MATRIX_PCMCHANNEL);
|
||||
} else {
|
||||
|
||||
@@ -568,7 +568,7 @@ feeder_matrix_compare(struct pcmchan_matrix *m_in, struct pcmchan_matrix *m_out)
|
||||
|
||||
/*
|
||||
* XXX 4front interpretation of "surround" is ambigous and sort of
|
||||
* conflicting with "rear"/"back". Map it to "side". Well..
|
||||
* conflicting with "rear"/"back". Map it to "side". Well..
|
||||
* who cares?
|
||||
*/
|
||||
static int snd_chn_to_oss[SND_CHN_T_MAX] = {
|
||||
|
||||
@@ -504,7 +504,7 @@ z_feed_linear_##SIGN##BIT##ENDIAN(struct z_info *info, uint8_t *dst) \
|
||||
z += info->z_dy; \
|
||||
p adv##= info->channels * PCM_##BIT##_BPS
|
||||
|
||||
/*
|
||||
/*
|
||||
* XXX GCC4 optimization is such a !@#$%, need manual unrolling.
|
||||
*/
|
||||
#if defined(__GNUC__) && __GNUC__ >= 4
|
||||
@@ -544,13 +544,13 @@ z_feed_sinc_##SIGN##BIT##ENDIAN(struct z_info *info, uint8_t *dst) \
|
||||
c = 0; \
|
||||
p = info->z_delay + (z_next(info, center, 1) * \
|
||||
info->channels * PCM_##BIT##_BPS) + ch; \
|
||||
for (i = info->z_size; i != 0; i -= Z_SINC_ACCUMULATE_DECR) \
|
||||
for (i = info->z_size; i != 0; i -= Z_SINC_ACCUMULATE_DECR) \
|
||||
Z_SINC_ACCUMULATE(SIGN, BIT, ENDIAN, +); \
|
||||
z = info->z_dy - (info->z_alpha * info->z_dx); \
|
||||
c = 0; \
|
||||
p = info->z_delay + (center * info->channels * \
|
||||
PCM_##BIT##_BPS) + ch; \
|
||||
for (i = info->z_size; i != 0; i -= Z_SINC_ACCUMULATE_DECR) \
|
||||
for (i = info->z_size; i != 0; i -= Z_SINC_ACCUMULATE_DECR) \
|
||||
Z_SINC_ACCUMULATE(SIGN, BIT, ENDIAN, -); \
|
||||
if (info->z_scale != Z_ONE) \
|
||||
v = Z_SCALE_##BIT(v, info->z_scale); \
|
||||
|
||||
@@ -122,7 +122,7 @@
|
||||
|
||||
/* 2 @ Stereo 2.0 */
|
||||
#define SND_CHN_MATRIX_2_0 1
|
||||
#define SND_CHN_MATRIX_2 SND_CHN_MATRIX_2_0
|
||||
#define SND_CHN_MATRIX_2 SND_CHN_MATRIX_2_0
|
||||
|
||||
/* 3 @ 2.1 (lfe), 3.0 (rear center, DEFAULT) */
|
||||
#define SND_CHN_MATRIX_2_1 2
|
||||
|
||||
@@ -49,7 +49,7 @@ static uint16_t snd_mixerdefaults[SOUND_MIXER_NRDEVICES] = {
|
||||
[SOUND_MIXER_PCM] = 75,
|
||||
[SOUND_MIXER_SPEAKER] = 75,
|
||||
[SOUND_MIXER_LINE] = 75,
|
||||
[SOUND_MIXER_MIC] = 25,
|
||||
[SOUND_MIXER_MIC] = 25,
|
||||
[SOUND_MIXER_CD] = 75,
|
||||
[SOUND_MIXER_IGAIN] = 0,
|
||||
[SOUND_MIXER_LINE1] = 75,
|
||||
@@ -334,7 +334,7 @@ mixer_get_recroute(struct snd_mixer *m, int *route)
|
||||
*
|
||||
* This function sets a recording source based on a recording device's
|
||||
* routing number. Said number is translated to an old school recdev
|
||||
* mask and passed over mixer_setrecsrc.
|
||||
* mask and passed over mixer_setrecsrc.
|
||||
*
|
||||
* @param m mixer context container thing
|
||||
*
|
||||
@@ -925,10 +925,10 @@ mixer_ioctl_cmd(struct cdev *i_dev, unsigned long cmd, caddr_t arg, int mode,
|
||||
return (0);
|
||||
case SNDCTL_CARDINFO:
|
||||
return (sound_oss_card_info((oss_card_info *)arg));
|
||||
case SNDCTL_AUDIOINFO:
|
||||
case SNDCTL_AUDIOINFO:
|
||||
return (dsp_oss_audioinfo(i_dev, (oss_audioinfo *)arg,
|
||||
false));
|
||||
case SNDCTL_AUDIOINFO_EX:
|
||||
case SNDCTL_AUDIOINFO_EX:
|
||||
return (dsp_oss_audioinfo(i_dev, (oss_audioinfo *)arg,
|
||||
true));
|
||||
case SNDCTL_ENGINEINFO:
|
||||
|
||||
@@ -515,7 +515,7 @@ pcm_unregister(device_t dev)
|
||||
* @brief Handle OSSv4 SNDCTL_SYSINFO ioctl.
|
||||
*
|
||||
* @param si Pointer to oss_sysinfo struct where information about the
|
||||
* sound subsystem will be written/copied.
|
||||
* sound subsystem will be written/copied.
|
||||
*
|
||||
* This routine returns information about the sound system, such as the
|
||||
* current OSS version, number of audio, MIDI, and mixer drivers, etc.
|
||||
|
||||
@@ -207,7 +207,7 @@ vchan_getcaps(kobj_t obj, void *data)
|
||||
}
|
||||
if (c->format & AFMT_PASSTHROUGH)
|
||||
info->caps.minspeed = c->speed;
|
||||
else
|
||||
else
|
||||
info->caps.minspeed = pspeed;
|
||||
info->caps.maxspeed = info->caps.minspeed;
|
||||
} else {
|
||||
@@ -393,7 +393,7 @@ sysctl_dev_pcm_vchanmode(SYSCTL_HANDLER_ARGS)
|
||||
return (ret);
|
||||
}
|
||||
|
||||
/*
|
||||
/*
|
||||
* On the fly vchan rate/format settings
|
||||
*/
|
||||
|
||||
|
||||
@@ -102,7 +102,7 @@ struct sndstat_file {
|
||||
size_t devs_nbytes; /* (l) */
|
||||
TAILQ_HEAD(, sndstat_userdev) userdev_list; /* (l) */
|
||||
int out_offset;
|
||||
int in_offset;
|
||||
int in_offset;
|
||||
int fflags;
|
||||
};
|
||||
|
||||
@@ -884,7 +884,7 @@ sndstat_dsp_nvlist_is_sane(const nvlist_t *nvlist)
|
||||
nvlist_exists_number(nvlist, "rfmts")))
|
||||
return (false);
|
||||
}
|
||||
|
||||
|
||||
return (true);
|
||||
|
||||
}
|
||||
@@ -1368,7 +1368,7 @@ sndstat_prepare(struct sndstat_file *pf_self)
|
||||
struct sndstat_entry *ent;
|
||||
struct snddev_info *d;
|
||||
struct sndstat_file *pf;
|
||||
int k;
|
||||
int k;
|
||||
|
||||
/* make sure buffer is reset */
|
||||
sbuf_clear(s);
|
||||
@@ -1429,7 +1429,7 @@ sndstat_prepare(struct sndstat_file *pf_self)
|
||||
sbuf_printf(s, "No devices installed from userspace.\n");
|
||||
|
||||
sbuf_finish(s);
|
||||
return (sbuf_len(s));
|
||||
return (sbuf_len(s));
|
||||
}
|
||||
|
||||
static void
|
||||
|
||||
@@ -725,7 +725,7 @@ static const STRUCT_USB_HOST_ID uaudio_vendor_audio[] = {
|
||||
{ USB_VPI(USB_VENDOR_ROLAND, USB_PRODUCT_ROLAND_UA33, 0) },
|
||||
};
|
||||
|
||||
/* The following table is derived from Linux's quirks-table.h */
|
||||
/* The following table is derived from Linux's quirks-table.h */
|
||||
static const STRUCT_USB_HOST_ID uaudio_vendor_midi[] = {
|
||||
{ USB_VPI(USB_VENDOR_YAMAHA, USB_PRODUCT_YAMAHA_UX256, 0) },
|
||||
{ USB_VPI(USB_VENDOR_YAMAHA, USB_PRODUCT_YAMAHA_MU1000, 0) },
|
||||
@@ -1492,7 +1492,7 @@ uaudio_configure_msg_sub(struct uaudio_softc *sc,
|
||||
/* FALLTHROUGH */
|
||||
} else if (sc->sc_audio_rev >= UAUDIO_VERSION_20) {
|
||||
unsigned int x;
|
||||
|
||||
|
||||
for (x = 0; x != 256; x++) {
|
||||
if (dir == PCMDIR_PLAY) {
|
||||
if (!(sc->sc_mixer_clocks.bit_output[x / 8] &
|
||||
@@ -2520,7 +2520,7 @@ tr_setup:
|
||||
/* reset receive jitter counters */
|
||||
ch_rec->jitter_curr = 0;
|
||||
ch_rec->jitter_rem = 0;
|
||||
|
||||
|
||||
/* compute exact number of transmit jitter samples */
|
||||
rx_rate = ch_rec->usb_alt[rec_alt].sample_rate;
|
||||
ch->jitter_curr += tx_jitter / rx_rate;
|
||||
@@ -3589,7 +3589,7 @@ uaudio_mixer_check_selectors(struct uaudio_softc *sc)
|
||||
uint16_t j;
|
||||
uint16_t k;
|
||||
|
||||
/* remove existing selector types from the reserve */
|
||||
/* remove existing selector types from the reserve */
|
||||
for (i = 0; i < MIX(sc).maxval; i++) {
|
||||
if (MIX(sc).slctrtype[i] == SOUND_MIXER_NRDEVICES)
|
||||
continue;
|
||||
@@ -3930,7 +3930,7 @@ uaudio20_mixer_add_feature(struct uaudio_softc *sc,
|
||||
MIX(sc).name = "mute";
|
||||
what = MUTE_CONTROL;
|
||||
break;
|
||||
case (3 << 2):
|
||||
case (3 << 2):
|
||||
MIX(sc).type = MIX_SIGNED_16;
|
||||
MIX(sc).ctl = mixernumber;
|
||||
MIX(sc).name = "vol";
|
||||
@@ -5600,7 +5600,7 @@ uaudio_mixer_init_sub(struct uaudio_softc *sc, struct snd_mixer *m)
|
||||
int
|
||||
uaudio_mixer_uninit_sub(struct uaudio_softc *sc, struct snd_mixer *m)
|
||||
{
|
||||
unsigned index = uaudio_get_child_index_by_dev(sc, mix_get_dev(m));
|
||||
unsigned index = uaudio_get_child_index_by_dev(sc, mix_get_dev(m));
|
||||
|
||||
DPRINTF("child=%u\n", index);
|
||||
|
||||
@@ -5616,7 +5616,7 @@ void
|
||||
uaudio_mixer_set(struct uaudio_softc *sc, struct snd_mixer *m,
|
||||
unsigned type, unsigned left, unsigned right)
|
||||
{
|
||||
unsigned index = uaudio_get_child_index_by_dev(sc, mix_get_dev(m));
|
||||
unsigned index = uaudio_get_child_index_by_dev(sc, mix_get_dev(m));
|
||||
struct uaudio_mixer_node *mc;
|
||||
int chan;
|
||||
|
||||
@@ -5635,7 +5635,7 @@ uaudio_mixer_set(struct uaudio_softc *sc, struct snd_mixer *m,
|
||||
uint32_t
|
||||
uaudio_mixer_setrecsrc(struct uaudio_softc *sc, struct snd_mixer *m, uint32_t src)
|
||||
{
|
||||
unsigned index = uaudio_get_child_index_by_dev(sc, mix_get_dev(m));
|
||||
unsigned index = uaudio_get_child_index_by_dev(sc, mix_get_dev(m));
|
||||
struct uaudio_mixer_node *mc;
|
||||
uint32_t mask;
|
||||
uint32_t temp;
|
||||
|
||||
@@ -781,7 +781,7 @@ struct usb_audio20_cluster {
|
||||
#define UA20_TF_OTHER 0xFF
|
||||
|
||||
#define UA20_CS_SAM_FREQ_CONTROL 0x01
|
||||
#define UA20_CS_CLOCK_VALID_CONTROL 0x02
|
||||
#define UA20_CS_CLOCK_VALID_CONTROL 0x02
|
||||
|
||||
#define UA20_TE_COPY_PROTECT_CONTROL 0x01
|
||||
#define UA20_TE_CONNECTOR_CONTROL 0x02
|
||||
|
||||
Reference in new issue
Block a user