Deleted Added
full compact
30c30
< * $FreeBSD: head/sys/dev/sound/pci/csapcm.c 65644 2000-09-09 19:21:04Z cg $
---
> * $FreeBSD: head/sys/dev/sound/pci/csapcm.c 70134 2000-12-18 01:36:41Z cg $
85,98d84
< /* talk to the codec - called from ac97.c */
< static u_int32_t csa_rdcd(void *, int);
< static void csa_wrcd(void *, int, u_int32_t);
<
< /* channel interface */
< static void *csachan_init(void *devinfo, snd_dbuf *b, pcm_channel *c, int dir);
< static int csachan_setdir(void *data, int dir);
< static int csachan_setformat(void *data, u_int32_t format);
< static int csachan_setspeed(void *data, u_int32_t speed);
< static int csachan_setblocksize(void *data, u_int32_t blocksize);
< static int csachan_trigger(void *data, int go);
< static int csachan_getptr(void *data);
< static pcmchan_caps *csachan_getcaps(void *data);
<
119,137d104
< static pcm_channel csa_chantemplate = {
< csachan_init,
< csachan_setdir,
< csachan_setformat,
< csachan_setspeed,
< csachan_setblocksize,
< csachan_trigger,
< csachan_getptr,
< csachan_getcaps,
< NULL, /* free */
< NULL, /* nop1 */
< NULL, /* nop2 */
< NULL, /* nop3 */
< NULL, /* nop4 */
< NULL, /* nop5 */
< NULL, /* nop6 */
< NULL, /* nop7 */
< };
<
138a106
> /* ac97 codec */
140,154d107
< /* channel interface */
< static void *
< csachan_init(void *devinfo, snd_dbuf *b, pcm_channel *c, int dir)
< {
< struct csa_info *csa = devinfo;
< struct csa_chinfo *ch = (dir == PCMDIR_PLAY)? &csa->pch : &csa->rch;
<
< ch->parent = csa;
< ch->channel = c;
< ch->buffer = b;
< ch->buffer->bufsize = CS461x_BUFFSIZE;
< if (chn_allocbuf(ch->buffer, csa->parent_dmat) == -1) return NULL;
< return ch;
< }
<
156c109
< csachan_setdir(void *data, int dir)
---
> csa_rdcd(kobj_t obj, void *devinfo, int regno)
158,160c111,112
< struct csa_chinfo *ch = data;
< struct csa_info *csa = ch->parent;
< csa_res *resp;
---
> u_int32_t data;
> struct csa_info *csa = (struct csa_info *)devinfo;
162c114,115
< resp = &csa->res;
---
> if (csa_readcodec(&csa->res, regno + BA0_AC97_RESET, &data))
> data = 0;
164,169c117
< if (dir == PCMDIR_PLAY)
< csa_writemem(resp, BA1_PBA, vtophys(ch->buffer->buf));
< else
< csa_writemem(resp, BA1_CBA, vtophys(ch->buffer->buf));
< ch->dir = dir;
< return 0;
---
> return data;
173c121
< csachan_setformat(void *data, u_int32_t format)
---
> csa_wrcd(kobj_t obj, void *devinfo, int regno, u_int32_t data)
175,178c123
< struct csa_chinfo *ch = data;
< struct csa_info *csa = ch->parent;
< u_long pdtc;
< csa_res *resp;
---
> struct csa_info *csa = (struct csa_info *)devinfo;
180c125
< resp = &csa->res;
---
> csa_writecodec(&csa->res, regno + BA0_AC97_RESET, data);
182,204d126
< if (ch->dir == PCMDIR_REC)
< csa_writemem(resp, BA1_CIE, (csa_readmem(resp, BA1_CIE) & ~0x0000003f) | 0x00000001);
< else {
< csa->pfie = csa_readmem(resp, BA1_PFIE) & ~0x0000f03f;
< if (format & AFMT_U8 || format & AFMT_U16_LE || format & AFMT_U16_BE)
< csa->pfie |= 0x8000;
< if (format & AFMT_S16_BE || format & AFMT_U16_BE)
< csa->pfie |= 0x4000;
< if (!(format & AFMT_STEREO))
< csa->pfie |= 0x2000;
< if (format & AFMT_U8 || format & AFMT_S8)
< csa->pfie |= 0x1000;
< csa_writemem(resp, BA1_PFIE, csa->pfie);
< pdtc = csa_readmem(resp, BA1_PDTC) & ~0x000003ff;
< if ((format & AFMT_S16_BE || format & AFMT_U16_BE || format & AFMT_S16_LE || format & AFMT_U16_LE) && (format & AFMT_STEREO))
< pdtc |= 0x00f;
< else if ((format & AFMT_S16_BE || format & AFMT_U16_BE || format & AFMT_S16_LE || format & AFMT_U16_LE) || (format & AFMT_STEREO))
< pdtc |= 0x007;
< else
< pdtc |= 0x003;
< csa_writemem(resp, BA1_PDTC, pdtc);
< }
< ch->fmt = format;
208,213c130,135
< static int
< csachan_setspeed(void *data, u_int32_t speed)
< {
< struct csa_chinfo *ch = data;
< struct csa_info *csa = ch->parent;
< csa_res *resp;
---
> static kobj_method_t csa_ac97_methods[] = {
> KOBJMETHOD(ac97_read, csa_rdcd),
> KOBJMETHOD(ac97_write, csa_wrcd),
> { 0, 0 }
> };
> AC97_DECLARE(csa_ac97);
215,229d136
< resp = &csa->res;
<
< if (ch->dir == PCMDIR_PLAY)
< csa_setplaysamplerate(resp, speed);
< else if (ch->dir == PCMDIR_REC)
< csa_setcapturesamplerate(resp, speed);
<
< /* rec/play speeds locked together - should indicate in flags */
< #if 0
< if (ch->direction == PCMDIR_PLAY) d->rec[0].speed = speed;
< else d->play[0].speed = speed;
< #endif
< return speed; /* XXX calc real speed */
< }
<
390,423d296
< static int
< csachan_setblocksize(void *data, u_int32_t blocksize)
< {
< #if notdef
< return blocksize;
< #else
< struct csa_chinfo *ch = data;
< return ch->buffer->bufsize / 2;
< #endif /* notdef */
< }
<
< static int
< csachan_trigger(void *data, int go)
< {
< struct csa_chinfo *ch = data;
< struct csa_info *csa = ch->parent;
<
< if (go == PCMTRIG_EMLDMAWR || go == PCMTRIG_EMLDMARD)
< return 0;
<
< if (ch->dir == PCMDIR_PLAY) {
< if (go == PCMTRIG_START)
< csa_startplaydma(csa);
< else
< csa_stopplaydma(csa);
< } else {
< if (go == PCMTRIG_START)
< csa_startcapturedma(csa);
< else
< csa_stopcapturedma(csa);
< }
< return 0;
< }
<
640a514,530
> /* -------------------------------------------------------------------- */
> /* channel interface */
>
> static void *
> csachan_init(kobj_t obj, void *devinfo, snd_dbuf *b, pcm_channel *c, int dir)
> {
> struct csa_info *csa = devinfo;
> struct csa_chinfo *ch = (dir == PCMDIR_PLAY)? &csa->pch : &csa->rch;
>
> ch->parent = csa;
> ch->channel = c;
> ch->buffer = b;
> ch->buffer->bufsize = CS461x_BUFFSIZE;
> if (chn_allocbuf(ch->buffer, csa->parent_dmat) == -1) return NULL;
> return ch;
> }
>
642c532
< csachan_getptr(void *data)
---
> csachan_setdir(kobj_t obj, void *data, int dir)
646a537,645
>
> resp = &csa->res;
>
> if (dir == PCMDIR_PLAY)
> csa_writemem(resp, BA1_PBA, vtophys(ch->buffer->buf));
> else
> csa_writemem(resp, BA1_CBA, vtophys(ch->buffer->buf));
> ch->dir = dir;
> return 0;
> }
>
> static int
> csachan_setformat(kobj_t obj, void *data, u_int32_t format)
> {
> struct csa_chinfo *ch = data;
> struct csa_info *csa = ch->parent;
> u_long pdtc;
> csa_res *resp;
>
> resp = &csa->res;
>
> if (ch->dir == PCMDIR_REC)
> csa_writemem(resp, BA1_CIE, (csa_readmem(resp, BA1_CIE) & ~0x0000003f) | 0x00000001);
> else {
> csa->pfie = csa_readmem(resp, BA1_PFIE) & ~0x0000f03f;
> if (format & AFMT_U8 || format & AFMT_U16_LE || format & AFMT_U16_BE)
> csa->pfie |= 0x8000;
> if (format & AFMT_S16_BE || format & AFMT_U16_BE)
> csa->pfie |= 0x4000;
> if (!(format & AFMT_STEREO))
> csa->pfie |= 0x2000;
> if (format & AFMT_U8 || format & AFMT_S8)
> csa->pfie |= 0x1000;
> csa_writemem(resp, BA1_PFIE, csa->pfie);
> pdtc = csa_readmem(resp, BA1_PDTC) & ~0x000003ff;
> if ((format & AFMT_S16_BE || format & AFMT_U16_BE || format & AFMT_S16_LE || format & AFMT_U16_LE) && (format & AFMT_STEREO))
> pdtc |= 0x00f;
> else if ((format & AFMT_S16_BE || format & AFMT_U16_BE || format & AFMT_S16_LE || format & AFMT_U16_LE) || (format & AFMT_STEREO))
> pdtc |= 0x007;
> else
> pdtc |= 0x003;
> csa_writemem(resp, BA1_PDTC, pdtc);
> }
> ch->fmt = format;
> return 0;
> }
>
> static int
> csachan_setspeed(kobj_t obj, void *data, u_int32_t speed)
> {
> struct csa_chinfo *ch = data;
> struct csa_info *csa = ch->parent;
> csa_res *resp;
>
> resp = &csa->res;
>
> if (ch->dir == PCMDIR_PLAY)
> csa_setplaysamplerate(resp, speed);
> else if (ch->dir == PCMDIR_REC)
> csa_setcapturesamplerate(resp, speed);
>
> /* rec/play speeds locked together - should indicate in flags */
> #if 0
> if (ch->direction == PCMDIR_PLAY) d->rec[0].speed = speed;
> else d->play[0].speed = speed;
> #endif
> return speed; /* XXX calc real speed */
> }
>
> static int
> csachan_setblocksize(kobj_t obj, void *data, u_int32_t blocksize)
> {
> #if notdef
> return blocksize;
> #else
> struct csa_chinfo *ch = data;
> return ch->buffer->bufsize / 2;
> #endif /* notdef */
> }
>
> static int
> csachan_trigger(kobj_t obj, void *data, int go)
> {
> struct csa_chinfo *ch = data;
> struct csa_info *csa = ch->parent;
>
> if (go == PCMTRIG_EMLDMAWR || go == PCMTRIG_EMLDMARD)
> return 0;
>
> if (ch->dir == PCMDIR_PLAY) {
> if (go == PCMTRIG_START)
> csa_startplaydma(csa);
> else
> csa_stopplaydma(csa);
> } else {
> if (go == PCMTRIG_START)
> csa_startcapturedma(csa);
> else
> csa_stopcapturedma(csa);
> }
> return 0;
> }
>
> static int
> csachan_getptr(kobj_t obj, void *data)
> {
> struct csa_chinfo *ch = data;
> struct csa_info *csa = ch->parent;
> csa_res *resp;
665c664
< csachan_getcaps(void *data)
---
> csachan_getcaps(kobj_t obj, void *data)
670a670,683
> static kobj_method_t csachan_methods[] = {
> KOBJMETHOD(channel_init, csachan_init),
> KOBJMETHOD(channel_setdir, csachan_setdir),
> KOBJMETHOD(channel_setformat, csachan_setformat),
> KOBJMETHOD(channel_setspeed, csachan_setspeed),
> KOBJMETHOD(channel_setblocksize, csachan_setblocksize),
> KOBJMETHOD(channel_trigger, csachan_trigger),
> KOBJMETHOD(channel_getptr, csachan_getptr),
> KOBJMETHOD(channel_getcaps, csachan_getcaps),
> { 0, 0 }
> };
> CHANNEL_DECLARE(csachan);
>
> /* -------------------------------------------------------------------- */
836c849
< codec = ac97_create(dev, csa, NULL, csa_rdcd, csa_wrcd);
---
> codec = AC97_CREATE(dev, csa, csa_ac97);
841c854
< if (mixer_init(dev, &ac97_mixer, codec) == -1) {
---
> if (mixer_init(dev, ac97_getmixerclass(), codec) == -1) {
863,864c876,877
< pcm_addchan(dev, PCMDIR_REC, &csa_chantemplate, csa);
< pcm_addchan(dev, PCMDIR_PLAY, &csa_chantemplate, csa);
---
> pcm_addchan(dev, PCMDIR_REC, &csachan_class, csa);
> pcm_addchan(dev, PCMDIR_PLAY, &csachan_class, csa);
886,907d898
< /* ac97 codec */
<
< static u_int32_t
< csa_rdcd(void *devinfo, int regno)
< {
< u_int32_t data;
< struct csa_info *csa = (struct csa_info *)devinfo;
<
< if (csa_readcodec(&csa->res, regno + BA0_AC97_RESET, &data))
< data = 0;
<
< return data;
< }
<
< static void
< csa_wrcd(void *devinfo, int regno, u_int32_t data)
< {
< struct csa_info *csa = (struct csa_info *)devinfo;
<
< csa_writecodec(&csa->res, regno + BA0_AC97_RESET, data);
< }
<