Deleted Added
full compact
31c31
< * $FreeBSD: head/sys/dev/sound/isa/ess.c 67652 2000-10-26 20:46:58Z cg $
---
> * $FreeBSD: head/sys/dev/sound/isa/ess.c 70134 2000-12-18 01:36:41Z cg $
38a39,40
> #include "mixer_if.h"
>
48,56d49
< /* 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);
<
85,103d77
< 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 */
< };
<
110c84
< int dir, hwch, stopping;
---
> int dir, hwch, stopping, run;
145,157d118
< 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,
< };
<
380,467d340
< static int
< ess_doattach(device_t dev, struct ess_info *sc)
< {
< char status[SND_STATUSLEN], buf[64];
< int ver;
<
< if (ess_alloc_resources(sc, dev))
< goto no;
< if (ess_reset_dsp(sc))
< goto no;
< mixer_init(dev, &ess_mixer, sc);
<
< sc->duplex = 0;
< sc->newspeed = 0;
< ver = (ess_getmixer(sc, 0x40) << 8) | ess_rd(sc, SB_MIX_DATA);
< snprintf(buf, sizeof buf, "ESS %x DSP", ver);
< device_set_desc_copy(dev, buf);
< if (bootverbose)
< device_printf(dev, "ESS%x detected", ver);
<
< switch (ver) {
< case 0x1869:
< case 0x1879:
< #ifdef ESS18XX_DUPLEX
< sc->duplex = sc->drq2? 1 : 0;
< #endif
< #ifdef ESS18XX_NEWSPEED
< sc->newspeed = 1;
< #endif
< break;
< }
< if (bootverbose)
< printf("%s%s\n", sc->duplex? ", duplex" : "",
< sc->newspeed? ", newspeed" : "");
<
< if (sc->newspeed)
< ess_setmixer(sc, 0x71, 0x22);
<
< bus_setup_intr(dev, sc->irq, INTR_TYPE_TTY, ess_intr, sc, &sc->ih);
< if (!sc->duplex)
< pcm_setflags(dev, pcm_getflags(dev) | SD_F_SIMPLEX);
<
< if (bus_dma_tag_create(/*parent*/NULL, /*alignment*/2, /*boundary*/0,
< /*lowaddr*/BUS_SPACE_MAXADDR_24BIT,
< /*highaddr*/BUS_SPACE_MAXADDR,
< /*filter*/NULL, /*filterarg*/NULL,
< /*maxsize*/ESS_BUFFSIZE, /*nsegments*/1,
< /*maxsegz*/0x3ffff,
< /*flags*/0, &sc->parent_dmat) != 0) {
< device_printf(dev, "unable to create dma tag\n");
< goto no;
< }
<
< snprintf(status, SND_STATUSLEN, "at io 0x%lx irq %ld drq %ld",
< rman_get_start(sc->io_base), rman_get_start(sc->irq),
< rman_get_start(sc->drq1));
< if (sc->drq2)
< snprintf(status + strlen(status), SND_STATUSLEN - strlen(status),
< ":%ld", rman_get_start(sc->drq2));
<
< 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_setstatus(dev, status);
<
< return 0;
<
< no:
< ess_release_resources(sc, dev);
< return ENXIO;
< }
<
< static int
< ess_detach(device_t dev)
< {
< int r;
< struct ess_info *sc;
<
< r = pcm_unregister(dev);
< if (r)
< return r;
<
< sc = pcm_getdevinfo(dev);
< ess_release_resources(sc, dev);
< return 0;
< }
<
483a357,358
> if (!sc->pch.run)
> printf("ess: play intr while not running\n");
484a360
> sc->pch.run = 0;
495a372,373
> if (!sc->rch.run)
> printf("ess: record intr while not running\n");
496a375
> sc->rch.run = 0;
659a539
> /* -------------------------------------------------------------------- */
662c542
< 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)
682c562
< esschan_setformat(void *data, u_int32_t format)
---
> esschan_setformat(kobj_t obj, void *data, u_int32_t format)
691c571
< esschan_setspeed(void *data, u_int32_t speed)
---
> esschan_setspeed(kobj_t obj, void *data, u_int32_t speed)
705c585
< esschan_setblocksize(void *data, u_int32_t blocksize)
---
> esschan_setblocksize(kobj_t obj, void *data, u_int32_t blocksize)
711c591
< esschan_trigger(void *data, int go)
---
> esschan_trigger(kobj_t obj, void *data, int go)
719a600
> ch->run = 1;
734c615
< esschan_getptr(void *data)
---
> esschan_getptr(kobj_t obj, void *data)
742c623
< esschan_getcaps(void *data)
---
> esschan_getcaps(kobj_t obj, void *data)
748a630,641
> 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);
>
858a752,761
> static kobj_method_t essmixer_methods[] = {
> KOBJMETHOD(mixer_init, essmix_init),
> KOBJMETHOD(mixer_set, essmix_set),
> KOBJMETHOD(mixer_setrecsrc, essmix_setrecsrc),
> { 0, 0 }
> };
> MIXER_DECLARE(essmixer);
>
> /************************************************************/
>
882a786,787
> char status[SND_STATUSLEN], buf[64];
> int ver;
889c794,859
< return ess_doattach(dev, sc);
---
> if (ess_alloc_resources(sc, dev))
> goto no;
> if (ess_reset_dsp(sc))
> goto no;
> if (mixer_init(dev, &essmixer_class, sc))
> goto no;
>
> sc->duplex = 0;
> sc->newspeed = 0;
> ver = (ess_getmixer(sc, 0x40) << 8) | ess_rd(sc, SB_MIX_DATA);
> snprintf(buf, sizeof buf, "ESS %x DSP", ver);
> device_set_desc_copy(dev, buf);
> if (bootverbose)
> device_printf(dev, "ESS%x detected", ver);
>
> switch (ver) {
> case 0x1869:
> case 0x1879:
> #ifdef ESS18XX_DUPLEX
> sc->duplex = sc->drq2? 1 : 0;
> #endif
> #ifdef ESS18XX_NEWSPEED
> sc->newspeed = 1;
> #endif
> break;
> }
> if (bootverbose)
> printf("%s%s\n", sc->duplex? ", duplex" : "",
> sc->newspeed? ", newspeed" : "");
>
> if (sc->newspeed)
> ess_setmixer(sc, 0x71, 0x22);
>
> bus_setup_intr(dev, sc->irq, INTR_TYPE_TTY, ess_intr, sc, &sc->ih);
> if (!sc->duplex)
> pcm_setflags(dev, pcm_getflags(dev) | SD_F_SIMPLEX);
>
> if (bus_dma_tag_create(/*parent*/NULL, /*alignment*/2, /*boundary*/0,
> /*lowaddr*/BUS_SPACE_MAXADDR_24BIT,
> /*highaddr*/BUS_SPACE_MAXADDR,
> /*filter*/NULL, /*filterarg*/NULL,
> /*maxsize*/ESS_BUFFSIZE, /*nsegments*/1,
> /*maxsegz*/0x3ffff,
> /*flags*/0, &sc->parent_dmat) != 0) {
> device_printf(dev, "unable to create dma tag\n");
> goto no;
> }
>
> snprintf(status, SND_STATUSLEN, "at io 0x%lx irq %ld drq %ld",
> rman_get_start(sc->io_base), rman_get_start(sc->irq),
> rman_get_start(sc->drq1));
> if (sc->drq2)
> snprintf(status + strlen(status), SND_STATUSLEN - strlen(status),
> ":%ld", rman_get_start(sc->drq2));
>
> if (pcm_register(dev, sc, 1, 1))
> goto no;
> pcm_addchan(dev, PCMDIR_REC, &esschan_class, sc);
> pcm_addchan(dev, PCMDIR_PLAY, &esschan_class, sc);
> pcm_setstatus(dev, status);
>
> return 0;
>
> no:
> ess_release_resources(sc, dev);
> return ENXIO;
891a862,876
> static int
> ess_detach(device_t dev)
> {
> int r;
> struct ess_info *sc;
>
> r = pcm_unregister(dev);
> if (r)
> return r;
>
> sc = pcm_getdevinfo(dev);
> ess_release_resources(sc, dev);
> return 0;
> }
>
910a896
> /************************************************************/