summaryrefslogtreecommitdiffstats
path: root/sys/dev/sound/pci/solo.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/dev/sound/pci/solo.c')
-rw-r--r--sys/dev/sound/pci/solo.c85
1 files changed, 34 insertions, 51 deletions
diff --git a/sys/dev/sound/pci/solo.c b/sys/dev/sound/pci/solo.c
index 672c7a0..7cb10f3 100644
--- a/sys/dev/sound/pci/solo.c
+++ b/sys/dev/sound/pci/solo.c
@@ -33,6 +33,8 @@
#include <dev/sound/isa/sb.h>
#include <dev/sound/chip.h>
+#include "mixer_if.h"
+
#define ESS_BUFFSIZE (16384)
#define ABS(x) (((x) < 0)? -(x) : (x))
@@ -42,15 +44,6 @@
/* more accurate clocks and split audio1/audio2 rates */
#define ESS18XX_NEWSPEED
-/* channel interface for ESS */
-static void *esschan_init(void *devinfo, snd_dbuf *b, pcm_channel *c, int dir);
-static int esschan_setformat(void *data, u_int32_t format);
-static int esschan_setspeed(void *data, u_int32_t speed);
-static int esschan_setblocksize(void *data, u_int32_t blocksize);
-static int esschan_trigger(void *data, int go);
-static int esschan_getptr(void *data);
-static pcmchan_caps *esschan_getcaps(void *data);
-
static u_int32_t ess_playfmt[] = {
AFMT_U8,
AFMT_STEREO | AFMT_U8,
@@ -80,25 +73,6 @@ static u_int32_t ess_recfmt[] = {
};
static pcmchan_caps ess_reccaps = {5000, 49000, ess_recfmt, 0};
-static pcm_channel ess_chantemplate = {
- esschan_init,
- NULL, /* setdir */
- esschan_setformat,
- esschan_setspeed,
- esschan_setblocksize,
- esschan_trigger,
- esschan_getptr,
- esschan_getcaps,
- NULL, /* free */
- NULL, /* nop1 */
- NULL, /* nop2 */
- NULL, /* nop3 */
- NULL, /* nop4 */
- NULL, /* nop5 */
- NULL, /* nop6 */
- NULL, /* nop7 */
-};
-
struct ess_info;
struct ess_chinfo {
@@ -141,19 +115,6 @@ static int ess_dmasetup(struct ess_info *sc, int ch, u_int32_t base, u_int16_t c
static int ess_dmapos(struct ess_info *sc, int ch);
static int ess_dmatrigger(struct ess_info *sc, int ch, int go);
-static int essmix_init(snd_mixer *m);
-static int essmix_set(snd_mixer *m, unsigned dev, unsigned left, unsigned right);
-static int essmix_setrecsrc(snd_mixer *m, u_int32_t src);
-
-static snd_mixer ess_mixer = {
- "ESS mixer",
- essmix_init,
- NULL,
- NULL,
- essmix_set,
- essmix_setrecsrc,
-};
-
static devclass_t pcm_devclass;
/*
@@ -546,9 +507,10 @@ ess_stop(struct ess_chinfo *ch)
return 0;
}
+/* -------------------------------------------------------------------- */
/* channel interface for ESS18xx */
static void *
-esschan_init(void *devinfo, snd_dbuf *b, pcm_channel *c, int dir)
+esschan_init(kobj_t obj, void *devinfo, snd_dbuf *b, pcm_channel *c, int dir)
{
struct ess_info *sc = devinfo;
struct ess_chinfo *ch = (dir == PCMDIR_PLAY)? &sc->pch : &sc->rch;
@@ -568,7 +530,7 @@ esschan_init(void *devinfo, snd_dbuf *b, pcm_channel *c, int dir)
}
static int
-esschan_setformat(void *data, u_int32_t format)
+esschan_setformat(kobj_t obj, void *data, u_int32_t format)
{
struct ess_chinfo *ch = data;
@@ -577,7 +539,7 @@ esschan_setformat(void *data, u_int32_t format)
}
static int
-esschan_setspeed(void *data, u_int32_t speed)
+esschan_setspeed(kobj_t obj, void *data, u_int32_t speed)
{
struct ess_chinfo *ch = data;
struct ess_info *sc = ch->parent;
@@ -591,13 +553,13 @@ esschan_setspeed(void *data, u_int32_t speed)
}
static int
-esschan_setblocksize(void *data, u_int32_t blocksize)
+esschan_setblocksize(kobj_t obj, void *data, u_int32_t blocksize)
{
return blocksize;
}
static int
-esschan_trigger(void *data, int go)
+esschan_trigger(kobj_t obj, void *data, int go)
{
struct ess_chinfo *ch = data;
struct ess_info *sc = ch->parent;
@@ -623,7 +585,7 @@ esschan_trigger(void *data, int go)
}
static int
-esschan_getptr(void *data)
+esschan_getptr(kobj_t obj, void *data)
{
struct ess_chinfo *ch = data;
struct ess_info *sc = ch->parent;
@@ -632,13 +594,25 @@ esschan_getptr(void *data)
}
static pcmchan_caps *
-esschan_getcaps(void *data)
+esschan_getcaps(kobj_t obj, void *data)
{
struct ess_chinfo *ch = data;
return (ch->dir == PCMDIR_PLAY)? &ess_playcaps : &ess_reccaps;
}
+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),
+ { 0, 0 }
+};
+CHANNEL_DECLARE(esschan);
+
/************************************************************/
static int
@@ -749,6 +723,14 @@ essmix_setrecsrc(snd_mixer *m, u_int32_t src)
return src;
}
+static kobj_method_t solomixer_methods[] = {
+ KOBJMETHOD(mixer_init, essmix_init),
+ KOBJMETHOD(mixer_set, essmix_set),
+ KOBJMETHOD(mixer_setrecsrc, essmix_setrecsrc),
+ { 0, 0 }
+};
+MIXER_DECLARE(solomixer);
+
/************************************************************/
static int
@@ -942,7 +924,8 @@ ess_attach(device_t dev)
if (ess_reset_dsp(sc))
goto no;
- mixer_init(dev, &ess_mixer, sc);
+ if (mixer_init(dev, &solomixer_class, sc))
+ goto no;
port_wr(sc->io, 0x7, 0xb0, 1); /* enable irqs */
#ifdef ESS18XX_DUPLEX
@@ -980,8 +963,8 @@ ess_attach(device_t dev)
if (pcm_register(dev, sc, 1, 1))
goto no;
- pcm_addchan(dev, PCMDIR_REC, &ess_chantemplate, sc);
- pcm_addchan(dev, PCMDIR_PLAY, &ess_chantemplate, sc);
+ pcm_addchan(dev, PCMDIR_REC, &esschan_class, sc);
+ pcm_addchan(dev, PCMDIR_PLAY, &esschan_class, sc);
pcm_setstatus(dev, status);
return 0;
OpenPOWER on IntegriCloud