summaryrefslogtreecommitdiffstats
path: root/sys/dev/sound/pci/t4dwave.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/dev/sound/pci/t4dwave.c')
-rw-r--r--sys/dev/sound/pci/t4dwave.c96
1 files changed, 44 insertions, 52 deletions
diff --git a/sys/dev/sound/pci/t4dwave.c b/sys/dev/sound/pci/t4dwave.c
index df11fb9..dee0f9f 100644
--- a/sys/dev/sound/pci/t4dwave.c
+++ b/sys/dev/sound/pci/t4dwave.c
@@ -81,20 +81,6 @@ struct tr_info {
* prototypes
*/
-/* channel interface */
-static void *trchan_init(void *devinfo, snd_dbuf *b, pcm_channel *c, int dir);
-static int trchan_setdir(void *data, int dir);
-static int trchan_setformat(void *data, u_int32_t format);
-static int trchan_setspeed(void *data, u_int32_t speed);
-static int trchan_setblocksize(void *data, u_int32_t blocksize);
-static int trchan_trigger(void *data, int go);
-static int trchan_getptr(void *data);
-static pcmchan_caps *trchan_getcaps(void *data);
-
-/* talk to the codec - called from ac97.c */
-static u_int32_t tr_rdcd(void *, int);
-static void tr_wrcd(void *, int, u_int32_t);
-
/* stuff */
static int tr_init(struct tr_info *);
static void tr_intr(void *);
@@ -141,25 +127,6 @@ static u_int32_t tr_playfmt[] = {
};
static pcmchan_caps tr_playcaps = {4000, 48000, tr_playfmt, 0};
-static pcm_channel tr_chantemplate = {
- trchan_init,
- trchan_setdir,
- trchan_setformat,
- trchan_setspeed,
- trchan_setblocksize,
- trchan_trigger,
- trchan_getptr,
- trchan_getcaps,
- NULL, /* free */
- NULL, /* nop1 */
- NULL, /* nop2 */
- NULL, /* nop3 */
- NULL, /* nop4 */
- NULL, /* nop5 */
- NULL, /* nop6 */
- NULL, /* nop7 */
-};
-
/* -------------------------------------------------------------------- */
static u_int32_t
@@ -205,10 +172,11 @@ tr_wr(struct tr_info *tr, int regno, u_int32_t data, int size)
}
}
+/* -------------------------------------------------------------------- */
/* ac97 codec */
-static u_int32_t
-tr_rdcd(void *devinfo, int regno)
+static int
+tr_rdcd(kobj_t obj, void *devinfo, int regno)
{
struct tr_info *tr = (struct tr_info *)devinfo;
int i, j, treg, trw;
@@ -224,7 +192,7 @@ tr_rdcd(void *devinfo, int regno)
break;
default:
printf("!!! tr_rdcd defaulted !!!\n");
- return 0xffffffff;
+ return -1;
}
regno &= 0x7f;
@@ -235,8 +203,8 @@ tr_rdcd(void *devinfo, int regno)
return (j >> TR_CDC_DATA) & 0xffff;
}
-static void
-tr_wrcd(void *devinfo, int regno, u_int32_t data)
+static int
+tr_wrcd(kobj_t obj, void *devinfo, int regno, u_int32_t data)
{
struct tr_info *tr = (struct tr_info *)devinfo;
int i, j, treg, trw;
@@ -252,7 +220,7 @@ tr_wrcd(void *devinfo, int regno, u_int32_t data)
break;
default:
printf("!!! tr_wrcd defaulted !!!");
- return;
+ return -1;
}
regno &= 0x7f;
@@ -266,8 +234,17 @@ tr_wrcd(void *devinfo, int regno, u_int32_t data)
printf(" - wrote %x, now %x\n", data, tr_rdcd(devinfo, regno));
#endif
if (i==0) printf("codec timeout writing %x, data %x\n", regno, data);
+ return (i > 0)? 0 : -1;
}
+static kobj_method_t tr_ac97_methods[] = {
+ KOBJMETHOD(ac97_read, tr_rdcd),
+ KOBJMETHOD(ac97_write, tr_wrcd),
+ { 0, 0 }
+};
+AC97_DECLARE(tr_ac97);
+
+/* -------------------------------------------------------------------- */
/* playback channel interrupts */
static u_int32_t
@@ -398,10 +375,11 @@ tr_rdch(struct tr_info *tr, char channel, struct tr_chinfo *ch)
}
}
+/* -------------------------------------------------------------------- */
/* channel interface */
-void *
-trchan_init(void *devinfo, snd_dbuf *b, pcm_channel *c, int dir)
+static void *
+trchan_init(kobj_t obj, void *devinfo, snd_dbuf *b, pcm_channel *c, int dir)
{
struct tr_info *tr = devinfo;
struct tr_chinfo *ch;
@@ -421,7 +399,7 @@ trchan_init(void *devinfo, snd_dbuf *b, pcm_channel *c, int dir)
}
static int
-trchan_setdir(void *data, int dir)
+trchan_setdir(kobj_t obj, void *data, int dir)
{
struct tr_chinfo *ch = data;
struct tr_info *tr = ch->parent;
@@ -454,7 +432,7 @@ trchan_setdir(void *data, int dir)
}
static int
-trchan_setformat(void *data, u_int32_t format)
+trchan_setformat(kobj_t obj, void *data, u_int32_t format)
{
struct tr_chinfo *ch = data;
struct tr_info *tr = ch->parent;
@@ -481,7 +459,7 @@ trchan_setformat(void *data, u_int32_t format)
}
static int
-trchan_setspeed(void *data, u_int32_t speed)
+trchan_setspeed(kobj_t obj, void *data, u_int32_t speed)
{
struct tr_chinfo *ch = data;
struct tr_info *tr = ch->parent;
@@ -501,14 +479,14 @@ trchan_setspeed(void *data, u_int32_t speed)
}
static int
-trchan_setblocksize(void *data, u_int32_t blocksize)
+trchan_setblocksize(kobj_t obj, void *data, u_int32_t blocksize)
{
struct tr_chinfo *ch = data;
return ch->buffer->bufsize / 2;
}
static int
-trchan_trigger(void *data, int go)
+trchan_trigger(kobj_t obj, void *data, int go)
{
struct tr_chinfo *ch = data;
struct tr_info *tr = ch->parent;
@@ -531,7 +509,7 @@ trchan_trigger(void *data, int go)
}
static int
-trchan_getptr(void *data)
+trchan_getptr(kobj_t obj, void *data)
{
struct tr_chinfo *ch = data;
struct tr_info *tr = ch->parent;
@@ -543,12 +521,26 @@ trchan_getptr(void *data)
}
static pcmchan_caps *
-trchan_getcaps(void *data)
+trchan_getcaps(kobj_t obj, void *data)
{
struct tr_chinfo *ch = data;
return (ch->index >= 0)? &tr_playcaps : &tr_reccaps;
}
+static kobj_method_t trchan_methods[] = {
+ KOBJMETHOD(channel_init, trchan_init),
+ KOBJMETHOD(channel_setdir, trchan_setdir),
+ KOBJMETHOD(channel_setformat, trchan_setformat),
+ KOBJMETHOD(channel_setspeed, trchan_setspeed),
+ KOBJMETHOD(channel_setblocksize, trchan_setblocksize),
+ KOBJMETHOD(channel_trigger, trchan_trigger),
+ KOBJMETHOD(channel_getptr, trchan_getptr),
+ KOBJMETHOD(channel_getcaps, trchan_getcaps),
+ { 0, 0 }
+};
+CHANNEL_DECLARE(trchan);
+
+/* -------------------------------------------------------------------- */
/* The interrupt handler */
static void
@@ -659,9 +651,9 @@ tr_pci_attach(device_t dev)
goto bad;
}
- codec = ac97_create(dev, tr, NULL, tr_rdcd, tr_wrcd);
+ codec = AC97_CREATE(dev, tr, tr_ac97);
if (codec == NULL) goto bad;
- if (mixer_init(dev, &ac97_mixer, codec) == -1) goto bad;
+ if (mixer_init(dev, ac97_getmixerclass(), codec) == -1) goto bad;
tr->irqid = 0;
tr->irq = bus_alloc_resource(dev, SYS_RES_IRQ, &tr->irqid,
@@ -687,9 +679,9 @@ tr_pci_attach(device_t dev)
rman_get_start(tr->reg), rman_get_start(tr->irq));
if (pcm_register(dev, tr, TR_MAXPLAYCH, 1)) goto bad;
- pcm_addchan(dev, PCMDIR_REC, &tr_chantemplate, tr);
+ pcm_addchan(dev, PCMDIR_REC, &trchan_class, tr);
for (i = 0; i < TR_MAXPLAYCH; i++)
- pcm_addchan(dev, PCMDIR_PLAY, &tr_chantemplate, tr);
+ pcm_addchan(dev, PCMDIR_PLAY, &trchan_class, tr);
pcm_setstatus(dev, status);
return 0;
OpenPOWER on IntegriCloud