37#include <sys/kernel.h>
39#include <sys/malloc.h>
40#include <sys/module.h>
44#include <dev/ofw/ofw_bus.h>
46#ifdef HAVE_KERNEL_OPTION_HEADERS
55#include <machine/intr_machdep.h>
56#include <machine/resource.h>
57#include <machine/bus.h>
101 name = ofw_bus_get_name(self);
105 if (strcmp(
name,
"davbus") != 0)
108 device_set_desc(self,
"Apple DAVBus Audio Controller");
185 mtx_unlock(&d->
mutex);
209 size = (
reg & 0x00FF0000) >> 16;
210 addr = (
reg & 0x0000FF00) >> 8;
250 if (
mask & (1 << 0)) {
254 if (
mask & (1 << 1)) {
279 lval = ((100 -
left) * 15 / 100) & 0xf;
280 rval = ((100 -
right) * 15 / 100) & 0xf;
281 DPRINTF((
"volume %d %d\n", lval, rval));
286 case SOUND_MIXER_VOLUME:
295 mtx_unlock(&d->
mutex);
357 mtx_unlock(&d->
mutex);
381 KASSERT(
val == (
val & 0xfff), (
"bad val"));
407 DPRINTF((
"Enabled outputs: "));
409 if (
mask & (1 << 0)) {
411 x &= ~SCREAMER_MUTE_SPEAKER;
413 if (
mask & (1 << 1)) {
415 x &= ~SCREAMER_MUTE_HEADPHONES;
421 DPRINTF((
"Enabling programmable output.\n"));
425 x &= ~SCREAMER_MUTE_SPEAKER;
442 headphones = (
status & 0x4);
448 headphones = (
status & 0x7);
452 headphones = (
status & 0x8);
467 lval = ((100 -
left) * 15 / 100) & 0xf;
468 rval = ((100 -
right) * 15 / 100) & 0xf;
469 DPRINTF((
"volume %d %d\n", lval, rval));
474 case SOUND_MIXER_VOLUME:
480 mtx_unlock(&d->
mutex);
498 struct resource *dbdma_irq, *cintr;
503 sc = malloc(
sizeof(*sc), M_DEVBUF, M_WAITOK | M_ZERO);
506 sc->
node = ofw_bus_get_node(self);
511 sc->
reg = bus_alloc_resource_any(self, SYS_RES_MEMORY, &
rid, RF_ACTIVE);
517 sc->
aoa.
sc_odma = bus_alloc_resource_any(self, SYS_RES_MEMORY,
524 dbdma_irq = bus_alloc_resource_any(self, SYS_RES_IRQ,
525 &
rid, RF_SHAREABLE | RF_ACTIVE);
526 if (dbdma_irq == NULL)
529 oirq = rman_get_start(dbdma_irq);
531 DPRINTF((
"interrupting at irq %d\n", oirq));
533 err = powerpc_config_intr(oirq, INTR_TRIGGER_EDGE, INTR_POLARITY_LOW);
542 bzero(compat,
sizeof(compat));
543 OF_getprop(sc->
soundnode,
"compatible", compat,
sizeof(compat));
546 mtx_init(&sc->
mutex,
"DAVbus", NULL, MTX_DEF);
548 device_printf(self,
"codec: <%s>\n", compat);
552 cintr = bus_alloc_resource_any(self, SYS_RES_IRQ,
553 &
rid, RF_SHAREABLE | RF_ACTIVE);
555 bus_setup_intr(self, cintr, INTR_TYPE_MISC | INTR_MPSAFE,
568 if (strcmp(compat,
"screamer") == 0)
570 else if (strcmp(compat,
"burgundy") == 0)
598 mtx_unlock(&d->
mutex);
void aoa_interrupt(void *xsc)
int aoa_attach(void *xsc)
struct pcmchan_matrix * m
static void davbus_cint(void *)
DRIVER_MODULE(pcm_davbus, macio, pcm_davbus_driver, pcm_devclass, 0, 0)
static int burgundy_uninit(struct snd_mixer *m)
static int burgundy_set(struct snd_mixer *m, unsigned dev, unsigned left, unsigned right)
MODULE_DEPEND(pcm_davbus, sound, SOUND_MINVER, SOUND_PREFVER, SOUND_MAXVER)
static int screamer_uninit(struct snd_mixer *m)
static kobj_method_t screamer_mixer_methods[]
static u_int screamer_read_status(struct davbus_softc *d, u_int status)
static int burgundy_reinit(struct snd_mixer *m)
static void screamer_set_outputs(struct davbus_softc *d, u_int mask)
static void burgundy_write_locked(struct davbus_softc *, u_int, u_int)
static int screamer_set(struct snd_mixer *m, unsigned dev, unsigned left, unsigned right)
static int davbus_attach(device_t)
static void burgundy_set_outputs(struct davbus_softc *d, u_int mask)
static device_method_t pcm_davbus_methods[]
static u_int32_t burgundy_setrecsrc(struct snd_mixer *m, u_int32_t src)
static u_int burgundy_read_status(struct davbus_softc *d, u_int status)
static driver_t pcm_davbus_driver
static u_int32_t screamer_setrecsrc(struct snd_mixer *m, u_int32_t src)
static int screamer_reinit(struct snd_mixer *m)
static int burgundy_init(struct snd_mixer *m)
static void screamer_write_locked(struct davbus_softc *, u_int, u_int)
MIXER_DECLARE(burgundy_mixer)
static kobj_method_t burgundy_mixer_methods[]
static int screamer_init(struct snd_mixer *m)
static int davbus_probe(device_t)
#define BURGUNDY_MUTE_REG
#define DAVBUS_CODEC_STATUS
#define SCREAMER_DEFAULT_CD_GAIN
#define BURGUNDY_MIX3_REG
#define BURGUNDY_MIX1_REG
#define BURGUNDY_OSS0R_REG
#define SCREAMER_CODEC_ADDR5
#define BURGUNDY_OS0_MIX2
#define BURGUNDY_CTRL_RESET
#define BURGUNDY_OSS_UNITY
#define SCREAMER_CODEC_ADDR4
#define BURGUNDY_MIX2_REG
#define BURGUNDY_MXS2R_REG
#define SCREAMER_MUTE_HEADPHONES
#define BURGUNDY_SDIN_REG
#define SCREAMER_CODEC_ADDR2
#define SCREAMER_CODEC_ADDR1
#define BURGUNDY_CTRL_WRITE
#define BURGUNDY_OSS1L_REG
#define BURGUNDY_MIX0_REG
#define SCREAMER_PROG_OUTPUT1
#define BURGUNDY_OL14_REG
#define SCREAMER_CODEC_ADDR0
#define BURGUNDY_OS1_MIX2
#define BURGUNDY_OSS0L_REG
#define BURGUNDY_OL15_REG
#define BURGUNDY_ISSAL_REG
#define SCREAMER_CODEC_ADDR6
#define DAVBUS_INPUT_SUBFRAME0
#define DAVBUS_CODEC_BUSY
#define DAVBUS_OUTPUT_SUBFRAME0
#define DAVBUS_INTR_PORTCHG
#define SCREAMER_MUTE_SPEAKER
#define BURGUNDY_MXS_UNITY
#define DAVBUS_RATE_44100
#define BURGUNDY_OSS1R_REG
#define DAVBUS_SOUND_CTRL
#define BURGUNDY_MXS2L_REG
#define BURGUNDY_OL16_REG
#define BURGUNDY_ISS_UNITY
#define BURGUNDY_ISSAR_REG
#define BURGUNDY_OL13_REG
#define SCREAMER_INPUT_CD
#define BURGUNDY_OL17_REG
#define DAVBUS_CODEC_CTRL
#define SCREAMER_CODEC_EMSEL0
#define SCREAMER_PROG_OUTPUT0
static int mixer_setrecsrc(struct snd_mixer *mixer, u_int32_t src)
int mixer_init(device_t dev, kobj_class_t cls, void *devinfo)
static int mixer_set(struct snd_mixer *m, u_int dev, u_int32_t muted, u_int lev)
int mixer_uninit(device_t dev)
void mix_setdevs(struct snd_mixer *m, u_int32_t v)
int mixer_reinit(device_t dev)
void * mix_getdevinfo(struct snd_mixer *m)
int snd_setup_intr(device_t dev, struct resource *res, int flags, driver_intr_t hand, void *param, void **cookiep)
struct resource * sc_odma
u_int(* read_status)(struct davbus_softc *, u_int)
void(* set_outputs)(struct davbus_softc *, u_int)