summaryrefslogtreecommitdiffstats
path: root/sys/dev/sound/isa/ad1816.c
diff options
context:
space:
mode:
authorcg <cg@FreeBSD.org>2000-12-18 01:36:41 +0000
committercg <cg@FreeBSD.org>2000-12-18 01:36:41 +0000
commit2fae4aec24ea4529882b3ec4cda45661ccd48ea8 (patch)
treee7e32573ed48df98bed54daa386c3520e959e951 /sys/dev/sound/isa/ad1816.c
parent1fd2c926a884cc824e7da7ee1a51dad72b1dec5b (diff)
downloadFreeBSD-src-2fae4aec24ea4529882b3ec4cda45661ccd48ea8.zip
FreeBSD-src-2fae4aec24ea4529882b3ec4cda45661ccd48ea8.tar.gz
kobjify.
this gives us several benefits, including: * easier extensibility- new optional methods can be added to ac97/mixer/channel classes without having to fixup every driver. * forward compatibility for drivers, provided no new mandatory methods are added.
Diffstat (limited to 'sys/dev/sound/isa/ad1816.c')
-rw-r--r--sys/dev/sound/isa/ad1816.c92
1 files changed, 40 insertions, 52 deletions
diff --git a/sys/dev/sound/isa/ad1816.c b/sys/dev/sound/isa/ad1816.c
index 3184dd8..d6e1dd7 100644
--- a/sys/dev/sound/isa/ad1816.c
+++ b/sys/dev/sound/isa/ad1816.c
@@ -31,6 +31,8 @@
#include <dev/sound/pcm/sound.h>
#include <dev/sound/isa/ad1816.h>
+#include "mixer_if.h"
+
struct ad1816_info;
struct ad1816_chinfo {
@@ -64,30 +66,8 @@ static int ad1816_wait_init(struct ad1816_info *ad1816, int x);
static u_short ad1816_read(struct ad1816_info *ad1816, u_int reg);
static void ad1816_write(struct ad1816_info *ad1816, u_int reg, u_short data);
-static int ad1816mix_init(snd_mixer *m);
-static int ad1816mix_set(snd_mixer *m, unsigned dev, unsigned left, unsigned right);
-static int ad1816mix_setrecsrc(snd_mixer *m, u_int32_t src);
-static snd_mixer ad1816_mixer = {
- "ad1816 mixer",
- ad1816mix_init,
- NULL,
- NULL,
- ad1816mix_set,
- ad1816mix_setrecsrc,
-};
-
static devclass_t pcm_devclass;
-/* channel interface */
-static void *ad1816chan_init(void *devinfo, snd_dbuf *b, pcm_channel *c, int dir);
-static int ad1816chan_setdir(void *data, int dir);
-static int ad1816chan_setformat(void *data, u_int32_t format);
-static int ad1816chan_setspeed(void *data, u_int32_t speed);
-static int ad1816chan_setblocksize(void *data, u_int32_t blocksize);
-static int ad1816chan_trigger(void *data, int go);
-static int ad1816chan_getptr(void *data);
-static pcmchan_caps *ad1816chan_getcaps(void *data);
-
static u_int32_t ad1816_fmt[] = {
AFMT_U8,
AFMT_STEREO | AFMT_U8,
@@ -102,25 +82,6 @@ static u_int32_t ad1816_fmt[] = {
static pcmchan_caps ad1816_caps = {4000, 55200, ad1816_fmt, 0};
-static pcm_channel ad1816_chantemplate = {
- ad1816chan_init,
- ad1816chan_setdir,
- ad1816chan_setformat,
- ad1816chan_setspeed,
- ad1816chan_setblocksize,
- ad1816chan_trigger,
- ad1816chan_getptr,
- ad1816chan_getcaps,
- NULL, /* free */
- NULL, /* nop1 */
- NULL, /* nop2 */
- NULL, /* nop3 */
- NULL, /* nop4 */
- NULL, /* nop5 */
- NULL, /* nop6 */
- NULL, /* nop7 */
-};
-
#define AD1816_MUTE 31 /* value for mute */
static int
@@ -232,6 +193,8 @@ ad1816_write(struct ad1816_info *ad1816, unsigned int reg, unsigned short data)
splx(flags);
}
+/* -------------------------------------------------------------------- */
+
static int
ad1816mix_init(snd_mixer *m)
{
@@ -329,9 +292,18 @@ ad1816mix_setrecsrc(snd_mixer *m, u_int32_t src)
return src;
}
+static kobj_method_t ad1816mixer_methods[] = {
+ KOBJMETHOD(mixer_init, ad1816mix_init),
+ KOBJMETHOD(mixer_set, ad1816mix_set),
+ KOBJMETHOD(mixer_setrecsrc, ad1816mix_setrecsrc),
+ { 0, 0 }
+};
+MIXER_DECLARE(ad1816mixer);
+
+/* -------------------------------------------------------------------- */
/* channel interface */
static void *
-ad1816chan_init(void *devinfo, snd_dbuf *b, pcm_channel *c, int dir)
+ad1816chan_init(kobj_t obj, void *devinfo, snd_dbuf *b, pcm_channel *c, int dir)
{
struct ad1816_info *ad1816 = devinfo;
struct ad1816_chinfo *ch = (dir == PCMDIR_PLAY)? &ad1816->pch : &ad1816->rch;
@@ -345,7 +317,7 @@ ad1816chan_init(void *devinfo, snd_dbuf *b, pcm_channel *c, int dir)
}
static int
-ad1816chan_setdir(void *data, int dir)
+ad1816chan_setdir(kobj_t obj, void *data, int dir)
{
struct ad1816_chinfo *ch = data;
struct ad1816_info *ad1816 = ch->parent;
@@ -357,7 +329,7 @@ ad1816chan_setdir(void *data, int dir)
}
static int
-ad1816chan_setformat(void *data, u_int32_t format)
+ad1816chan_setformat(kobj_t obj, void *data, u_int32_t format)
{
struct ad1816_chinfo *ch = data;
struct ad1816_info *ad1816 = ch->parent;
@@ -399,7 +371,7 @@ ad1816chan_setformat(void *data, u_int32_t format)
}
static int
-ad1816chan_setspeed(void *data, u_int32_t speed)
+ad1816chan_setspeed(kobj_t obj, void *data, u_int32_t speed)
{
struct ad1816_chinfo *ch = data;
struct ad1816_info *ad1816 = ch->parent;
@@ -410,13 +382,13 @@ ad1816chan_setspeed(void *data, u_int32_t speed)
}
static int
-ad1816chan_setblocksize(void *data, u_int32_t blocksize)
+ad1816chan_setblocksize(kobj_t obj, void *data, u_int32_t blocksize)
{
return blocksize;
}
static int
-ad1816chan_trigger(void *data, int go)
+ad1816chan_trigger(kobj_t obj, void *data, int go)
{
struct ad1816_chinfo *ch = data;
struct ad1816_info *ad1816 = ch->parent;
@@ -466,18 +438,33 @@ ad1816chan_trigger(void *data, int go)
}
static int
-ad1816chan_getptr(void *data)
+ad1816chan_getptr(kobj_t obj, void *data)
{
struct ad1816_chinfo *ch = data;
return buf_isadmaptr(ch->buffer);
}
static pcmchan_caps *
-ad1816chan_getcaps(void *data)
+ad1816chan_getcaps(kobj_t obj, void *data)
{
return &ad1816_caps;
}
+static kobj_method_t ad1816chan_methods[] = {
+ KOBJMETHOD(channel_init, ad1816chan_init),
+ KOBJMETHOD(channel_setdir, ad1816chan_setdir),
+ KOBJMETHOD(channel_setformat, ad1816chan_setformat),
+ KOBJMETHOD(channel_setspeed, ad1816chan_setspeed),
+ KOBJMETHOD(channel_setblocksize, ad1816chan_setblocksize),
+ KOBJMETHOD(channel_trigger, ad1816chan_trigger),
+ KOBJMETHOD(channel_getptr, ad1816chan_getptr),
+ KOBJMETHOD(channel_getcaps, ad1816chan_getcaps),
+ { 0, 0 }
+};
+CHANNEL_DECLARE(ad1816chan);
+
+/* -------------------------------------------------------------------- */
+
static void
ad1816_release_resources(struct ad1816_info *ad1816, device_t dev)
{
@@ -596,7 +583,8 @@ ad1816_attach(device_t dev)
if (!ad1816_alloc_resources(ad1816, dev)) goto no;
ad1816_init(ad1816, dev);
- mixer_init(dev, &ad1816_mixer, ad1816);
+ if (mixer_init(dev, &ad1816mixer_class, ad1816)) goto no;
+
bus_setup_intr(dev, ad1816->irq, INTR_TYPE_TTY, ad1816_intr, ad1816, &ad1816->ih);
if (bus_dma_tag_create(/*parent*/NULL, /*alignment*/2, /*boundary*/0,
/*lowaddr*/BUS_SPACE_MAXADDR_24BIT,
@@ -617,8 +605,8 @@ ad1816_attach(device_t dev)
rman_get_start(ad1816->drq2));
if (pcm_register(dev, ad1816, 1, 1)) goto no;
- pcm_addchan(dev, PCMDIR_REC, &ad1816_chantemplate, ad1816);
- pcm_addchan(dev, PCMDIR_PLAY, &ad1816_chantemplate, ad1816);
+ pcm_addchan(dev, PCMDIR_REC, &ad1816chan_class, ad1816);
+ pcm_addchan(dev, PCMDIR_PLAY, &ad1816chan_class, ad1816);
pcm_setstatus(dev, status);
return 0;
OpenPOWER on IntegriCloud