Deleted Added
full compact
31c31
< * $FreeBSD: head/sys/dev/sound/isa/sb16.c 54237 1999-12-07 01:53:24Z billf $
---
> * $FreeBSD: head/sys/dev/sound/isa/sb16.c 54462 1999-12-12 02:30:19Z cg $
62a63
>
87c88
< static pcmchan_caps sb16_playcaps = {
---
> static pcmchan_caps sb16_hcaps = {
93c94
< static pcmchan_caps sb16_reccaps = {
---
> static pcmchan_caps sb16_lcaps = {
98a100,105
> static pcmchan_caps sb16x_caps = {
> 5000, 49000,
> AFMT_STEREO | AFMT_U8 /* | AFMT_S16_LE */,
> AFMT_STEREO | AFMT_U8 /* AFMT_S16_LE */
> };
>
147d153
< int io_rid;
149,153c155,156
< int irq_rid;
< struct resource *drq1; /* play */
< int drq1_rid;
< struct resource *drq2; /* rec */
< int drq2_rid;
---
> struct resource *drq1;
> struct resource *drq2;
156d158
< int dma16, dma8;
169,175d170
< static int ess_write(struct sb_info *sb, u_char reg, int val);
< static int ess_read(struct sb_info *sb, u_char reg);
<
< /*
< * in the SB, there is a set of indirect "mixer" registers with
< * address at offset 4, data at offset 5
< */
178,181d172
<
< static void sb_intr(void *arg);
< static void ess_intr(void *arg);
< static int sb_init(device_t dev, struct sb_info *sb);
183a175
> static void sb_intr(void *arg);
188a181,183
> static int ess_write(struct sb_info *sb, u_char reg, int val);
> static int ess_read(struct sb_info *sb, u_char reg);
> static void ess_intr(void *arg);
193a189
>
380c376
< bus_release_resource(dev, SYS_RES_IRQ, sb->irq_rid, sb->irq);
---
> bus_release_resource(dev, SYS_RES_IRQ, 0, sb->irq);
384c380
< bus_release_resource(dev, SYS_RES_DRQ, sb->drq1_rid, sb->drq1);
---
> bus_release_resource(dev, SYS_RES_DRQ, 0, sb->drq1);
388c384
< bus_release_resource(dev, SYS_RES_DRQ, sb->drq2_rid, sb->drq2);
---
> bus_release_resource(dev, SYS_RES_DRQ, 1, sb->drq2);
392,393c388
< bus_release_resource(dev, SYS_RES_IOPORT, sb->io_rid,
< sb->io_base);
---
> bus_release_resource(dev, SYS_RES_IOPORT, 0, sb->io_base);
401a397,399
> int rid;
>
> rid = 0;
404c402
< &sb->io_rid, 0, ~0, 1,
---
> &rid, 0, ~0, 1,
405a404
> rid = 0;
408c407
< &sb->irq_rid, 0, ~0, 1,
---
> &rid, 0, ~0, 1,
409a409
> rid = 0;
412c412
< &sb->drq1_rid, 0, ~0, 1,
---
> &rid, 0, ~0, 1,
414c414,415
< if (!sb->drq2 && sb->drq2_rid > 0)
---
> rid = 1;
> if (!sb->drq2)
416c417
< &sb->drq2_rid, 0, ~0, 1,
---
> &rid, 0, ~0, 1,
420,422c421,422
< sb->dma8 = rman_get_start(sb->drq1);
< isa_dma_acquire(sb->dma8);
< isa_dmainit(sb->dma8, DSP_BUFFSIZE);
---
> isa_dma_acquire(rman_get_start(sb->drq1));
> isa_dmainit(rman_get_start(sb->drq1), DSP_BUFFSIZE);
425,433c425,426
< sb->dma16 = rman_get_start(sb->drq2);
< isa_dma_acquire(sb->dma16);
< isa_dmainit(sb->dma16, DSP_BUFFSIZE);
< } else sb->dma16 = sb->dma8;
<
< if (sb->dma8 > sb->dma16) {
< int tmp = sb->dma16;
< sb->dma16 = sb->dma8;
< sb->dma8 = tmp;
---
> isa_dma_acquire(rman_get_start(sb->drq2));
> isa_dmainit(rman_get_start(sb->drq2), DSP_BUFFSIZE);
434a428
>
439,440c433,434
< static int
< sb_identify_board(device_t dev, struct sb_info *sb)
---
> static void
> sb16_swap(void *v, int dir)
442,444c436,441
< char *fmt = NULL;
< static char buf[64];
< int essver = 0;
---
> struct sb_info *sb = v;
> int pb = sb->pch.buffer->dl;
> int rb = sb->rch.buffer->dl;
> int pc = sb->pch.buffer->chan;
> int rc = sb->rch.buffer->chan;
> int swp = 0;
446,447c443,448
< sb_cmd(sb, DSP_CMD_GETVER); /* Get version */
< sb->bd_id = (sb_get_byte(sb) << 8) | sb_get_byte(sb);
---
> if (!pb && !rb) {
> if (dir == PCMDIR_PLAY && pc < 4) swp = 1;
> else if (dir == PCMDIR_REC && rc < 4) swp = 1;
> if (sb->bd_flags & BD_F_SB16X) swp = !swp;
> if (swp) {
> int t;
449,474c450,454
< switch (sb->bd_id >> 8) {
< case 1: /* old sound blaster has nothing... */
< case 2:
< fmt = "SoundBlaster %d.%d" ; /* default */
< break;
<
< case 3:
< fmt = "SoundBlaster Pro %d.%d";
< if (sb->bd_id == 0x301) {
< int rev;
<
< /* Try to detect ESS chips. */
< sb_cmd(sb, DSP_CMD_GETID); /* Return ident. bytes. */
< essver = (sb_get_byte(sb) << 8) | sb_get_byte(sb);
< rev = essver & 0x000f;
< essver &= 0xfff0;
< if (essver == 0x4880) {
< /* the ESS488 can be treated as an SBPRO */
< fmt = "SoundBlaster Pro (ESS488 rev %d)";
< } else if (essver == 0x6880) {
< if (rev < 8) fmt = "ESS688 rev %d";
< else fmt = "ESS1868 rev %d";
< sb->bd_flags |= BD_F_ESS;
< } else return ENXIO;
< sb->bd_id &= 0xff00;
< sb->bd_id |= ((essver & 0xf000) >> 8) | rev;
---
> t = sb->pch.buffer->chan;
> sb->pch.buffer->chan = sb->rch.buffer->chan;
> sb->rch.buffer->chan = t;
> sb->pch.buffer->dir = B_WRITE;
> sb->rch.buffer->dir = B_READ;
476,492c456
< break;
<
< case 4:
< sb->bd_flags |= BD_F_SB16;
< if (sb->bd_flags & BD_F_SB16X) fmt = "SB16 ViBRA16X %d.%d";
< else fmt = "SoundBlaster 16 %d.%d";
< break;
<
< default:
< device_printf(dev, "failed to get SB version (%x)\n",
< sb->bd_id);
< return ENXIO;
< }
< if (essver) snprintf(buf, sizeof buf, fmt, sb->bd_id & 0x000f);
< else snprintf(buf, sizeof buf, fmt, sb->bd_id >> 8, sb->bd_id & 0xff);
< device_set_desc_copy(dev, buf);
< return sb_reset_dsp(sb);
---
> }
496,582d459
< sb_init(device_t dev, struct sb_info *sb)
< {
< int x, irq;
<
< sb->bd_flags &= ~BD_F_MIX_MASK;
< /* do various initializations depending on board id. */
< switch (sb->bd_id >> 8) {
< case 1: /* old sound blaster has nothing... */
< break;
<
< case 2:
< sb->bd_flags |= BD_F_DUP_MIDI;
< if (sb->bd_id > 0x200) sb->bd_flags |= BD_F_MIX_CT1335;
< break;
<
< case 3:
< sb->bd_flags |= BD_F_DUP_MIDI | BD_F_MIX_CT1345;
< break;
<
< case 4:
< sb->bd_flags |= BD_F_SB16 | BD_F_MIX_CT1745;
< if (sb->dma16 != sb->dma8) sb->bd_flags |= BD_F_DUPLEX;
<
< /* soft irq/dma configuration */
< x = -1;
< irq = rman_get_start(sb->irq);
< if (irq == 5) x = 2;
< else if (irq == 7) x = 4;
< else if (irq == 9) x = 1;
< else if (irq == 10) x = 8;
< if (x == -1) device_printf(dev,
< "bad irq %d (5/7/9/10 valid)\n",
< irq);
< else sb_setmixer(sb, IRQ_NR, x);
< sb_setmixer(sb, DMA_NR, (1 << sb->dma16) | (1 << sb->dma8));
< break;
< }
< return 0;
< }
<
< static int
< sb_probe(device_t dev)
< {
< snddev_info *d = device_get_softc(dev);
< struct sb_info *sb;
< int allocated, i;
< int error;
<
< if (isa_get_vendorid(dev)) return ENXIO; /* not yet */
<
< device_set_desc(dev, "SoundBlaster");
< bzero(d, sizeof *d);
< sb = (struct sb_info *)malloc(sizeof *sb, M_DEVBUF, M_NOWAIT);
< if (!sb) return ENXIO;
< bzero(sb, sizeof *sb);
<
< allocated = 0;
< sb->io_rid = 0;
< sb->io_base = bus_alloc_resource(dev, SYS_RES_IOPORT, &sb->io_rid,
< 0, ~0, 16, RF_ACTIVE);
< if (!sb->io_base) {
< BVDDB(printf("sb_probe: no addr, trying (0x220, 0x240)\n"));
< allocated = 1;
< sb->io_rid = 0;
< sb->io_base = bus_alloc_resource(dev, SYS_RES_IOPORT,
< &sb->io_rid, 0x220, 0x22f,
< 16, RF_ACTIVE);
< if (!sb->io_base) {
< sb->io_base = bus_alloc_resource(dev, SYS_RES_IOPORT,
< &sb->io_rid, 0x240,
< 0x24f, 16, RF_ACTIVE);
< }
< }
< if (!sb->io_base) return ENXIO;
<
< error = sb_reset_dsp(sb);
< if (error) goto no;
< error = sb_identify_board(dev, sb);
< if (error) goto no;
< no:
< i = sb->io_rid;
< sb_release_resources(sb, dev);
< if (allocated) bus_delete_resource(dev, SYS_RES_IOPORT, i);
< return error;
< }
<
< static int
587d463
< int error;
590,592d465
< sb->irq_rid = 0;
< sb->drq1_rid = 0;
< sb->drq2_rid = 1;
594,599c467
< error = sb_reset_dsp(sb);
< if (error) goto no;
< error = sb_identify_board(dev, sb);
< if (error) goto no;
<
< sb_init(dev, sb);
---
> if (sb_reset_dsp(sb)) goto no;
600a469
>
605,608c474,476
<
< if (sb->bd_flags & BD_F_SB16)
< pcm_setflags(dev, pcm_getflags(dev) | SD_F_EVILSB16);
< if (sb->dma16 == sb->dma8)
---
> if ((sb->bd_flags & BD_F_SB16) && !(sb->bd_flags & BD_F_SB16X))
> pcm_setswap(dev, sb16_swap);
> if (!sb->drq2)
609a478
>
621c490
< snprintf(status, SND_STATUSLEN, "at io 0x%lx irq %ld drq %d",
---
> snprintf(status, SND_STATUSLEN, "at io 0x%lx irq %ld drq %ld",
623,625c492,494
< sb->dma8);
< if (sb->dma16 != sb->dma8) snprintf(status + strlen(status),
< SND_STATUSLEN - strlen(status), ":%d", sb->dma16);
---
> rman_get_start(sb->drq1));
> if (sb->drq2) snprintf(status + strlen(status), SND_STATUSLEN - strlen(status),
> ":%ld", rman_get_start(sb->drq2));
644,694d512
< static int
< sb_attach(device_t dev)
< {
< struct sb_info *sb;
< int flags = device_get_flags(dev);
<
< if (flags & DV_F_DUAL_DMA) {
< bus_set_resource(dev, SYS_RES_DRQ, 1,
< flags & DV_F_DRQ_MASK, 1);
< }
< sb = (struct sb_info *)malloc(sizeof *sb, M_DEVBUF, M_NOWAIT);
< if (!sb) return ENXIO;
< bzero(sb, sizeof *sb);
<
< /* XXX in probe should set io resource to right val instead of this */
< sb->io_rid = 0;
< sb->io_base = bus_alloc_resource(dev, SYS_RES_IOPORT, &sb->io_rid,
< 0, ~0, 16, RF_ACTIVE);
< if (!sb->io_base) {
< BVDDB(printf("sb_probe: no addr, trying (0x220, 0x240)\n"));
< sb->io_rid = 0;
< sb->io_base = bus_alloc_resource(dev, SYS_RES_IOPORT,
< &sb->io_rid, 0x220, 0x22f,
< 16, RF_ACTIVE);
< if (!sb->io_base) {
< sb->io_base = bus_alloc_resource(dev, SYS_RES_IOPORT,
< &sb->io_rid, 0x240,
< 0x24f, 16, RF_ACTIVE);
< }
< }
< if (!sb->io_base) return ENXIO;
<
< return sb_doattach(dev, sb);
< }
<
< static device_method_t sb_methods[] = {
< /* Device interface */
< DEVMETHOD(device_probe, sb_probe),
< DEVMETHOD(device_attach, sb_attach),
<
< { 0, 0 }
< };
<
< static driver_t sb_driver = {
< "pcm",
< sb_methods,
< sizeof(snddev_info),
< };
<
< DRIVER_MODULE(sb, isa, sb_driver, pcm_devclass, 0, 0);
<
831a650
> int dh = ch->buffer->chan > 3;
840c659
< i1 |= (b16 && (sb->bd_flags & BD_F_DUPLEX))? DSP_DMA16 : DSP_DMA8;
---
> i1 |= (b16 || dh)? DSP_DMA16 : DSP_DMA8;
1002c821,822
< ch->buffer->chan = (dir == PCMDIR_PLAY)? sb->dma16 : sb->dma8;
---
> ch->buffer->chan = (dir == PCMDIR_PLAY)? rman_get_start(sb->drq2)
> : rman_get_start(sb->drq1);
1056c876
< if (ch->parent->bd_id <= 0x200)
---
> if (ch->parent->bd_id < 0x300)
1058,1060c878
< else if (ch->parent->bd_id >= 0x400)
< return p? &sb16_playcaps : &sb16_reccaps;
< else
---
> else if (ch->parent->bd_id < 0x400)
1061a880,883
> else if (ch->parent->bd_flags & BD_F_SB16X)
> return &sb16x_caps;
> else
> return (ch->buffer->chan >= 4)? &sb16_hcaps : &sb16_lcaps;
1256,1336d1077
< sbpnp_probe(device_t dev)
< {
< char *s = NULL;
< u_int32_t logical_id = isa_get_logicalid(dev);
<
< switch(logical_id) {
< case 0x01000000: /* @@@0001 */
< s = "Avance Asound 100";
< break;
<
< case 0x01100000: /* @@@1001 */
< s = "Avance Asound 110";
< break;
<
< case 0x01200000: /* @@@2001 */
< s = "Avance Logic ALS120";
< break;
<
< case 0x68187316: /* ESS1868 */
< s = "ESS1868";
< break;
<
< case 0x69187316: /* ESS1869 */
< case 0xacb0110e: /* Compaq's Presario 1621 ESS1869 */
< s = "ESS1869";
< break;
<
< case 0x79187316: /* ESS1879 */
< s = "ESS1879";
< break;
<
< case 0x88187316: /* ESS1888 */
< s = "ESS1888";
< break;
< }
< if (s) {
< device_set_desc(dev, s);
< return (0);
< }
< return ENXIO;
< }
<
< static int
< sbpnp_attach(device_t dev)
< {
< struct sb_info *sb;
< u_int32_t vend_id = isa_get_vendorid(dev);
<
< sb = (struct sb_info *)malloc(sizeof *sb, M_DEVBUF, M_NOWAIT);
< if (!sb) return ENXIO;
< bzero(sb, sizeof *sb);
<
< switch(vend_id) {
< case 0xf0008c0e:
< case 0x10019305:
< case 0x20019305:
< /* XXX add here the vend_id for other vibra16X cards... */
< sb->bd_flags = BD_F_SB16X;
< }
< return sb_doattach(dev, sb);
< }
<
< static device_method_t sbpnp_methods[] = {
< /* Device interface */
< DEVMETHOD(device_probe, sbpnp_probe),
< DEVMETHOD(device_attach, sbpnp_attach),
<
< { 0, 0 }
< };
<
< static driver_t sbpnp_driver = {
< "pcm",
< sbpnp_methods,
< sizeof(snddev_info),
< };
<
< DRIVER_MODULE(sbpnp, isa, sbpnp_driver, pcm_devclass, 0, 0);
<
< #if NSBC > 0
< #define DESCSTR " PCM Audio"
< static int
1339,1340c1080,1081
< char *s = NULL;
< struct sndcard_func *func;
---
> char buf[64];
> u_int32_t func, ver, r;
1343,1345c1084,1085
<
< func = device_get_ivars(dev);
< if (func == NULL || func->func != SCF_PCM)
---
> r = BUS_READ_IVAR(device_get_parent(dev), dev, 0, &func);
> if (func != SCF_PCM)
1348c1088,1091
< s = "SB PCM Audio";
---
> r = BUS_READ_IVAR(device_get_parent(dev), dev, 1, &ver);
> ver &= 0x0000ffff;
> snprintf(buf, sizeof buf, "SB DSP %d.%02d", ver >> 8, ver & 0xff);
> device_set_desc_copy(dev, buf);
1350d1092
< device_set_desc(dev, s);
1358,1359c1100
< u_int32_t vend_id;
< device_t sbc;
---
> u_int32_t ver;
1361,1362d1101
< sbc = device_get_parent(dev);
< vend_id = isa_get_vendorid(sbc);
1367,1373c1106,1109
< switch(vend_id) {
< case 0xf0008c0e:
< case 0x10019305:
< case 0x20019305:
< /* XXX add here the vend_id for other vibra16X cards... */
< sb->bd_flags = BD_F_SB16X;
< }
---
> BUS_READ_IVAR(device_get_parent(dev), dev, 1, &ver);
> sb->bd_id = ver & 0x0000ffff;
> sb->bd_flags = (ver & 0xffff0000) >> 16;
>
1393c1129,1130
< #endif /* NSBC > 0 */
---
>
>