diff options
author | cg <cg@FreeBSD.org> | 2000-12-18 01:36:41 +0000 |
---|---|---|
committer | cg <cg@FreeBSD.org> | 2000-12-18 01:36:41 +0000 |
commit | 2fae4aec24ea4529882b3ec4cda45661ccd48ea8 (patch) | |
tree | e7e32573ed48df98bed54daa386c3520e959e951 /sys/dev/sound/isa/ad1816.c | |
parent | 1fd2c926a884cc824e7da7ee1a51dad72b1dec5b (diff) | |
download | FreeBSD-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.c | 92 |
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; |